public async Task <IActionResult> CreateCompany([FromBody] DtoCreateCompanyRequest request) { if (ModelState.ValidationState != ModelValidationState.Valid) { return(BadRequest()); } return(await companies.CreateCompany(new Company { CompanyName = request.CompanyName, CompanyAddress = request.CompanyAddress, CompanyPostcode = request.CompanyPostcode, CompanyContact = request.CompanyContact, CompanyPhone = request.CompanyPhone, CompanyEmail = request.CompanyEmail }) .Ensure(companyId => companyId.HasValue, "Company created") .OnSuccess(companyId => companies.FetchCompany(companyId.Value)) .Ensure(company => company.HasValue, "Company exists") .OnSuccess(company => RegisterBillingAccount(company.Value, request)) .OnBoth(result => result.IsFailure ? StatusCode(500) : StatusCode(201)) .ConfigureAwait(false)); }
private async Task <Result <Company> > RegisterBillingAccount(Company company, DtoCreateCompanyRequest request) { string accountId; try { accountId = await billingManager.RegisterBillingAccount(company, new BillingAccountDetails { IsBusinessAccount = request.BankAccountIsBusiness, AccountNumber = request.AccountNumber, SortCode = request.SortCode, NameOnAccount = request.NameOnAccount }).ConfigureAwait(false); } catch (Exception ex) { return(Result.Fail <Company>($"Error occurred creating account: {ex}")); } company.ExternalAccountId = accountId; return(await companies.UpdateCompany(new CompanyPatch { ResourceId = company.CompanyId, ExternalAccountId = new PatchOperation <string> { Operation = OperationKind.Update, Value = accountId } }) .OnSuccess(() => company) .ConfigureAwait(false)); }