fengling-member-service/src/Fengling.Member.Infrastructure/Repositories/MemberRepository.cs
Sam 96503a593d feat(member): change MemberId to Guid strongly typed id
- Convert MemberId from long to Guid strongly typed ID
- Update all Member commands to use record pattern with MemberId
- Update all Member endpoints to use record pattern with MemberId
- Update entity configurations to use GuidVersion7ValueGenerator
- Add implicit conversion operators for MemberId

Migration: ChangeMemberIdToGuid
2026-02-10 00:41:35 +08:00

70 lines
3.2 KiB
C#

using Fengling.Member.Domain.Aggregates.Users;
namespace Fengling.Member.Infrastructure.Repositories;
public interface IMemberRepository : IRepository<Fengling.Member.Domain.Aggregates.Users.MemberEntity, MemberId>
{
Task<Fengling.Member.Domain.Aggregates.Users.MemberEntity?> GetByPhoneNumberAsync(long tenantId, string phoneNumber,
CancellationToken cancellationToken = default);
Task<Fengling.Member.Domain.Aggregates.Users.MemberEntity?> GetByOpenIdAsync(string openId,
CancellationToken cancellationToken = default);
Task<Fengling.Member.Domain.Aggregates.Users.MemberEntity?> GetByUnionIdAsync(string unionId,
CancellationToken cancellationToken = default);
Task<IEnumerable<Fengling.Member.Domain.Aggregates.Users.MemberEntity>> GetByTenantIdAsync(long tenantId,
int page = 1, int pageSize = 20, CancellationToken cancellationToken = default);
Task<bool> ExistsByPhoneNumberAsync(long tenantId, string phoneNumber,
CancellationToken cancellationToken = default);
Task<bool> ExistsByOpenIdAsync(string openId, CancellationToken cancellationToken = default);
}
public class MemberRepository(ApplicationDbContext context)
: RepositoryBase<Fengling.Member.Domain.Aggregates.Users.MemberEntity, MemberId, ApplicationDbContext>(context),
IMemberRepository
{
public async Task<Fengling.Member.Domain.Aggregates.Users.MemberEntity?> GetByPhoneNumberAsync(long tenantId,
string phoneNumber, CancellationToken cancellationToken = default)
{
return await DbContext.Members.FirstOrDefaultAsync(m => m.TenantId == tenantId && m.PhoneNumber == phoneNumber,
cancellationToken);
}
public async Task<Fengling.Member.Domain.Aggregates.Users.MemberEntity?> GetByOpenIdAsync(string openId,
CancellationToken cancellationToken = default)
{
return await DbContext.Members.FirstOrDefaultAsync(m => m.OpenId == openId, cancellationToken);
}
public async Task<Fengling.Member.Domain.Aggregates.Users.MemberEntity?> GetByUnionIdAsync(string unionId,
CancellationToken cancellationToken = default)
{
return await DbContext.Members.FirstOrDefaultAsync(m => m.UnionId == unionId, cancellationToken);
}
public async Task<IEnumerable<Fengling.Member.Domain.Aggregates.Users.MemberEntity>> GetByTenantIdAsync(
long tenantId, int page = 1, int pageSize = 20, CancellationToken cancellationToken = default)
{
return await DbContext.Members
.Where(m => m.TenantId == tenantId)
.OrderByDescending(m => m.CreatedAt)
.Skip((page - 1) * pageSize)
.Take(pageSize)
.ToListAsync(cancellationToken);
}
public async Task<bool> ExistsByPhoneNumberAsync(long tenantId, string phoneNumber,
CancellationToken cancellationToken = default)
{
return await DbContext.Members.AnyAsync(m => m.TenantId == tenantId && m.PhoneNumber == phoneNumber,
cancellationToken);
}
public async Task<bool> ExistsByOpenIdAsync(string openId, CancellationToken cancellationToken = default)
{
return await DbContext.Members.AnyAsync(m => m.OpenId == openId, cancellationToken);
}
}