public async Task <SignUpResponse> CreateOrganizationWithAdmin(SignUpRequest request) { var response = new SignUpResponse(); var user = await _userRepository.Select(x => x.Email == request.Email); if (user.IsExist()) { response.ErrorMessages.Add("email_already_exist"); response.Status = ResponseStatus.Invalid; return(response); } var organization = await _organizationRepository.Select(x => x.Name == request.OrganizationName); if (organization.IsExist()) { response.ErrorMessages.Add("organization_name_already_exist"); response.Status = ResponseStatus.Invalid; return(response); } organization = _organizationFactory.CreateEntityFromRequest(request, _cryptoHelper.GetKeyAsString(), _cryptoHelper.GetIVAsString()); var salt = _cryptoHelper.GetSaltAsString(); var passwordHash = _cryptoHelper.Hash(request.Password, salt); user = _userFactory.CreateEntityFromRequest(request, organization, salt, passwordHash); var english = await _languageRepository.Select(x => x.IsoCode2Char == "en"); user.LanguageId = english.Id; user.LanguageUid = english.Uid; user.LanguageName = english.Name; user.LanguageIconUrl = english.IconUrl; var loginLog = _userLoginLogFactory.CreateEntityFromRequest(request, user); var integration = _integrationFactory.CreateDefault(organization); var integrationClient = _integrationClientFactory.CreateEntity(integration); var project = _projectFactory.CreateDefault(organization); var(uowResult, insertedOrganization, insertedUser) = await _signUpUnitOfWork.DoWork(organization, user, loginLog, integration, integrationClient, project); if (uowResult) { // todo:send welcome email // todo:send email log _cacheManager.UpsertUserCache(insertedUser, _userFactory.MapCurrentUser(insertedUser)); _cacheManager.UpsertOrganizationCache(insertedOrganization, _organizationFactory.MapCurrentOrganization(insertedOrganization)); response.Status = ResponseStatus.Success; return(response); } response.SetFailed(); return(response); }