69 lines
2.1 KiB
C#
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
|
|
};
|
|
}
|
|
}
|