fengling-member-service/src/Fengling.Member.Application/Commands/Member/BindOAuthCommand.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

42 lines
1.7 KiB
C#

using MediatR;
using FluentValidation;
using Fengling.Member.Domain.Aggregates.Users;
using Fengling.Member.Infrastructure.Repositories;
namespace Fengling.Member.Application.Commands.Member;
public record BindOAuthCommand(OAuthProvider Provider, MemberId MemberId, string OpenId, string? UnionId)
: IRequest<BindOAuthResponse>;
public record BindOAuthResponse(MemberId MemberId, OAuthProvider Provider, string OpenId, string? UnionId, DateTime BoundAt);
public class BindOAuthCommandValidator : AbstractValidator<BindOAuthCommand>
{
public BindOAuthCommandValidator()
{
RuleFor(x => x.Provider).IsInEnum();
RuleFor(x => x.OpenId).NotEmpty().MaximumLength(128);
RuleFor(x => x.UnionId).MaximumLength(128);
}
}
public class BindOAuthCommandHandler(IMemberRepository memberRepository, ILogger<BindOAuthCommandHandler> logger)
: IRequestHandler<BindOAuthCommand, BindOAuthResponse>
{
public async Task<BindOAuthResponse> Handle(BindOAuthCommand request, CancellationToken cancellationToken)
{
logger.LogInformation("Binding {Provider} for member {MemberId}",
request.Provider.GetProviderName(), request.MemberId);
var member = await memberRepository.GetAsync(request.MemberId, cancellationToken)
?? throw new KeyNotFoundException($"会员不存在: {request.MemberId}");
member.BindOAuth(request.Provider, request.OpenId, request.UnionId);
logger.LogInformation("{Provider} bound successfully for member {MemberId}",
request.Provider.GetProviderName(), request.MemberId);
return new BindOAuthResponse(member.Id, request.Provider, request.OpenId, request.UnionId, DateTime.UtcNow);
}
}