| 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980 |
- using Application.Abstractions.Messaging;
- using Application.Abstractions.Data;
- using SharedKernel.Results;
- using Domain.Entities.Members;
- using MemberEntity = Domain.Entities.Members.Member;
- using ChannelEntity = Domain.Entities.Members.Channel;
- using Microsoft.EntityFrameworkCore;
- namespace Application.Features.Admin.Member.List.Create;
- public sealed class Handler(IAppDbContext db) : ICommandHandler<Command, Result>
- {
- public async Task<Result> Handle(Command request, CancellationToken ct)
- {
- // 이메일 중복 체크
- if (await db.Member.AnyAsync(x => x.Email == request.Email, ct))
- {
- return Result.Failure(Error.Conflict("Member.DuplicateEmail", "이미 등록된 이메일입니다."));
- }
- // 별명 중복 체크
- if (request.Name is not null && await db.Member.AnyAsync(x => x.Name == request.Name, ct))
- {
- return Result.Failure(Error.Conflict("Member.DuplicateName", "이미 등록된 별명입니다."));
- }
- // 회원 생성
- var member = MemberEntity.Create(request.Email);
- await db.Member.AddAsync(member, ct);
- await db.SaveChangesAsync(ct);
- // 비밀번호 해싱 (PBKDF2). 평문은 절대 저장하지 않는다. 미입력 시 null.
- string? passwordHash = string.IsNullOrWhiteSpace(request.Password) ? null : MemberEntity.HashPassword(request.Password);
- // 기본 정보 업데이트
- await db.Member.Where(x => x.ID == member.ID).ExecuteUpdateAsync(s => s
- .SetProperty(x => x.MemberGradeID, request.MemberGradeID)
- .SetProperty(x => x.Name, request.Name)
- .SetProperty(x => x.PasswordHash, passwordHash)
- .SetProperty(x => x.PasswordUpdatedAt, DateTime.UtcNow)
- .SetProperty(x => x.FirstName, request.FirstName)
- .SetProperty(x => x.LastName, request.LastName)
- .SetProperty(x => x.Intro, request.Intro)
- .SetProperty(x => x.Summary, request.Summary)
- .SetProperty(x => x.Phone, request.Phone)
- .SetProperty(x => x.Birthday, request.Birthday)
- .SetProperty(x => x.Gender, request.Gender)
- .SetProperty(x => x.Thumb, request.ThumbUrl)
- .SetProperty(x => x.Icon, request.IconUrl)
- .SetProperty(x => x.IsEmailVerified, request.IsEmailVerified)
- .SetProperty(x => x.IsAuthCertified, request.IsAuthCertified)
- .SetProperty(x => x.IsDenied, request.IsDenied)
- .SetProperty(x => x.IsAdmin, request.IsAdmin)
- .SetProperty(x => x.IsWithdraw, request.IsWithdraw),
- ct);
- // MemberApprove 생성
- await db.MemberApprove.AddAsync(
- MemberApprove.Create(member.ID)
- , ct);
- // YouTube 채널 정보가 있는 경우
- if (!string.IsNullOrWhiteSpace(request.YouTubeSID) &&
- !string.IsNullOrWhiteSpace(request.YouTubeName) &&
- !string.IsNullOrWhiteSpace(request.YouTubeUrl))
- {
- await db.Channel.AddAsync(ChannelEntity.Create(
- member.ID,
- request.YouTubeSID,
- request.YouTubeName,
- request.YouTubeUrl
- ), ct);
- }
- await db.SaveChangesAsync(ct);
- return Result.Success();
- }
- }
|