Exemplo n.º 1
0
        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);
        }