fengling-member-service/src/Fengling.Member.Application/Commands/Member/BindWechatCommand.cs

69 lines
2.1 KiB
C#

using MediatR;
using FluentValidation;
using Fengling.Member.Domain.Aggregates.Users;
using Fengling.Member.Infrastructure.Repositories;
namespace Fengling.Member.Application.Commands.Member;
public class BindWechatCommand : IRequest<BindWechatResponse>
{
public long MemberId { get; set; }
public string OpenId { get; set; } = string.Empty;
public string? UnionId { get; set; }
}
public class BindWechatResponse
{
public long MemberId { get; set; }
public string OpenId { get; set; } = string.Empty;
public string? UnionId { get; set; }
public DateTime BoundAt { get; set; }
}
public class BindWechatCommandValidator : AbstractValidator<BindWechatCommand>
{
public BindWechatCommandValidator()
{
RuleFor(x => x.MemberId).GreaterThan(0);
RuleFor(x => x.OpenId).NotEmpty().MaximumLength(64);
RuleFor(x => x.UnionId).MaximumLength(64);
}
}
public class BindWechatCommandHandler : IRequestHandler<BindWechatCommand, BindWechatResponse>
{
private readonly IMemberRepository _memberRepository;
private readonly ILogger<BindWechatCommandHandler> _logger;
public BindWechatCommandHandler(
IMemberRepository memberRepository,
ILogger<BindWechatCommandHandler> logger)
{
_memberRepository = memberRepository;
_logger = logger;
}
public async Task<BindWechatResponse> Handle(BindWechatCommand request, CancellationToken cancellationToken)
{
_logger.LogInformation("Binding wechat for member {MemberId}", request.MemberId);
var member = await _memberRepository.GetAsync(request.MemberId, cancellationToken);
if (member == null)
{
throw new KeyNotFoundException($"会员不存在: {request.MemberId}");
}
member.BindWechat(request.OpenId, request.UnionId);
_logger.LogInformation("Wechat bound successfully for member {MemberId}", request.MemberId);
return new BindWechatResponse
{
MemberId = member.Id,
OpenId = request.OpenId,
UnionId = request.UnionId,
BoundAt = DateTime.UtcNow
};
}
}