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); /// /// 创建或更新小程序用户信息。 /// /// 微信 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; } }