using Microsoft.EntityFrameworkCore;
using TakeoutSaaS.Domain.Identity.Entities;
using TakeoutSaaS.Domain.Identity.Repositories;
namespace TakeoutSaaS.Infrastructure.Identity.Persistence;
///
/// EF Core 小程序用户仓储实现。
///
public sealed class EfMiniUserRepository(IdentityDbContext dbContext) : IMiniUserRepository
{
///
/// 根据 OpenId 获取小程序用户。
///
/// 微信 OpenId。
/// 取消标记。
/// 匹配的小程序用户或 null。
public Task FindByOpenIdAsync(string openId, CancellationToken cancellationToken = default)
=> dbContext.MiniUsers.AsNoTracking().FirstOrDefaultAsync(x => x.OpenId == openId, cancellationToken);
///
/// 根据用户 ID 获取小程序用户。
///
/// 用户 ID。
/// 取消标记。
/// 匹配的小程序用户或 null。
public Task FindByIdAsync(long id, CancellationToken cancellationToken = default)
=> dbContext.MiniUsers.AsNoTracking().FirstOrDefaultAsync(x => x.Id == id, cancellationToken);
///
public async Task> GetByIdsAsync(
IReadOnlyCollection ids,
long tenantId,
CancellationToken cancellationToken = default)
{
if (ids.Count == 0)
{
return [];
}
return await dbContext.MiniUsers
.AsNoTracking()
.Where(x => x.TenantId == tenantId && ids.Contains(x.Id))
.ToListAsync(cancellationToken);
}
///
/// 创建或更新小程序用户信息。
///
/// 微信 OpenId。
/// 微信 UnionId。
/// 昵称。
/// 头像地址。
/// 租户 ID。
/// 取消标记。
/// 创建或更新后的小程序用户。
public async Task CreateOrUpdateAsync(string openId, string? unionId, string? nickname, string? avatar, long tenantId, CancellationToken cancellationToken = default)
{
// 1. 查询现有用户
var user = await dbContext.MiniUsers.FirstOrDefaultAsync(x => x.OpenId == openId, cancellationToken);
if (user == null)
{
// 2. 未找到则创建
user = new MiniUser
{
Id = 0,
OpenId = openId,
UnionId = unionId,
Nickname = nickname ?? "小程序用户",
Avatar = avatar,
TenantId = tenantId
};
dbContext.MiniUsers.Add(user);
}
else
{
// 3. 已存在则更新可变字段
user.UnionId = unionId ?? user.UnionId;
user.Nickname = nickname ?? user.Nickname;
user.Avatar = avatar ?? user.Avatar;
}
// 4. 保存更改
await dbContext.SaveChangesAsync(cancellationToken);
return user;
}
}