public async Task <UserResponse> UpdateUserAsync(UserRequest request) { var user = await _userBus.GetByIdAsync(request.Id ?? 0).ConfigureAwait(false); if (user == null) { var spec = new CreateUserSpec(); spec.AddMessage(BusinessSpecStatus.ResourceNotFound, UserServiceMessages.UsuarioNaoEncontrado); AddSpec(spec); return(null); } var token = await _userBus.GetTokenAsync().ConfigureAwait(false); if (token?.IdUser != user.Id) { var spec = new CreateUserSpec(); spec.AddMessage(BusinessSpecStatus.Forbidden, UserServiceMessages.EditarProprioUsuario); AddSpec(spec); return(null); } if (await _userBus.ExistsEmailAsync(request.Email, request.Id).ConfigureAwait(false)) { var spec = new CreateUserSpec(); spec.AddMessage(BusinessSpecStatus.Conflict, UserServiceMessages.EmailJaCadastrado); AddSpec(spec); return(null); } Address address = null; if (request.Address != null) { address = await _addressBus .GetByInfoAsync(request.Address.Street, request.Address.Number, request.Address.Complement, request.Address.District, request.Address.City, request.Address.State, request.Address.PostalCode) .ConfigureAwait(false); if (address == null) { address = new Address(request.Address.Street, request.Address.Number, request.Address.Complement, request.Address.District, request.Address.City, request.Address.State, request.Address.PostalCode); AddSpec(new AddressSpec(address)); user.ChangeAddress(address); } } else { user.RemoveAddress(); } IList <Phone> phones = new List <Phone>(); if (request.Phones.Any()) { phones = await _phoneBus .GetByNumbersAsync ( request.Phones .Select(phone => new Tuple <string, string>(phone.LocalCode, phone.Number)) .ToList() ) .ConfigureAwait(false); request.Phones .Where(phone => !phones.Any(p => p.LocalCode == phone.LocalCode && p.Number == p.Number)) .ToList() .ForEach(p => { var newPhone = new Phone(p.LocalCode, p.Number); AddSpec(new PhoneSpecs(newPhone)); phones.Add(newPhone); }); user.ChangePhones(phones); } else { user.RemovePhones(); } user.Update(request.FirstName, request.MiddleName, request.LastName, request.Email, request.Cpf); AddSpec(new UserSpec(user)); if (!IsSatisfied()) { return(null); } await _userBus.UpdateUserAsync(user).ConfigureAwait(false); return(new UserResponse { Id = user.Id }); }
public async Task <UserResponse> CreateUserAsync(UserRequest request) { if (await _userBus.ExistsEmailAsync(request.Email).ConfigureAwait(false)) { var spec = new CreateUserSpec(); spec.AddMessage(BusinessSpecStatus.Conflict, UserServiceMessages.EmailJaCadastrado); AddSpec(spec); return(null); } Address address = null; if (request.Address != null) { address = await _addressBus .GetByInfoAsync(request.Address.Street, request.Address.Number, request.Address.Complement, request.Address.District, request.Address.City, request.Address.State, request.Address.PostalCode) .ConfigureAwait(false); if (address == null) { address = new Address(request.Address.Street, request.Address.Number, request.Address.Complement, request.Address.District, request.Address.City, request.Address.State, request.Address.PostalCode); AddSpec(new AddressSpec(address)); } } IList <Phone> phones = new List <Phone>(); if (request.Phones.Any()) { phones = await _phoneBus .GetByNumbersAsync ( request.Phones .Select(phone => new Tuple <string, string>(phone.LocalCode, phone.Number)) .ToList() ) .ConfigureAwait(false); request.Phones .Where(phone => !phones.Any(p => p.LocalCode == phone.LocalCode && p.Number == p.Number)) .ToList() .ForEach(p => { var newPhone = new Phone(p.LocalCode, p.Number); AddSpec(new PhoneSpecs(newPhone)); phones.Add(newPhone); }); } var user = new User(new Name(request.FirstName, request.MiddleName, request.LastName), request.Email, request.Cpf, address, phones); AddSpec(new UserSpec(user)); if (!IsSatisfied()) { return(null); } user = await _userBus.CreateUserAsync(user).ConfigureAwait(false); return(user.ToResponse()); }