Example #1
0
        public async Task <Guid> CreateAsync(Partner partner)
        {
            partner.Id = Guid.NewGuid();

            partner.Locations = await _locationService.CreateLocationsContactPersonForPartnerAsync(partner);

            if (partner.UseGlobalCurrencyRate)
            {
                partner.AmountInTokens   = null;
                partner.AmountInCurrency = null;
            }

            CredentialsCreateResponse credential;

            try
            {
                credential = await _credentialsClient.Partners.CreateAsync(new PartnerCredentialsCreateRequest
                {
                    PartnerId    = partner.Id.ToString(),
                    ClientId     = partner.ClientId,
                    ClientSecret = partner.ClientSecret
                });
            }
            catch (ClientApiException e)
            {
                if (e.HttpStatusCode == HttpStatusCode.BadRequest)
                {
                    throw new PartnerRegistrationFailedException(e.ErrorResponse.ErrorMessage);
                }

                throw;
            }

            if (credential.Error == CredentialsError.LoginAlreadyExists)
            {
                var exception = new ClientAlreadyExistException($"Client with id '{partner.ClientId}' already exist.");
                _log.Warning(exception.Message, context: partner);
                throw exception;
            }

            if (credential.Error != CredentialsError.None)
            {
                var exception = new PartnerRegistrationFailedException("Register user failed.");
                _log.Warning(exception.Message, context: partner);
                throw exception;
            }

            var createdPartner = await _partnerRepository.CreateAsync(partner);

            await _partnerCreatedPublisher.PublishAsync(new PartnerCreatedEvent
            {
                CreatedBy = createdPartner.CreatedBy, PartnerId = createdPartner.Id, Timestamp = DateTime.UtcNow
            });

            return(createdPartner.Id);
        }
Example #2
0
        public async Task <string> GenerateClientId()
        {
            var clientId = await _credentialsClient.Api.GenerateClientIdAsync(new GenerateClientIdRequest { Length = _usernameLength });

            var clientSecret = await _credentialsClient.Api.GenerateClientSecretAsync(new GenerateClientSecretRequest { Length = _passwordLength });

            var retries = 0;

            while (true)
            {
                var result = await _credentialsClient.Partners.ValidateAsync(new PartnerCredentialsValidationRequest
                {
                    ClientId     = clientId,
                    ClientSecret = clientSecret
                });

                if (result.Error == CredentialsError.LoginAlreadyExists)
                {
                    // Generating existing user 20 times is highly unlikely so we throw exception
                    if (retries >= 20)
                    {
                        var exception = new PartnerRegistrationFailedException("Register user failed.");
                        _log.Error(exception);
                        throw exception;
                    }

                    clientId = await _credentialsClient.Api.GenerateClientIdAsync(new GenerateClientIdRequest { Length = _usernameLength });

                    retries++;
                    continue;
                }

                break;
            }

            return(clientId);
        }