2024-04-16 13:55:00 -04:00
using Bit.Api.Billing.Models.Requests ;
using Bit.Core.AdminConsole.Repositories ;
using Bit.Core.AdminConsole.Services ;
2024-05-23 10:17:00 -04:00
using Bit.Core.Billing.Services ;
2024-04-16 13:55:00 -04:00
using Bit.Core.Context ;
using Bit.Core.Enums ;
using Bit.Core.Models.Business ;
using Bit.Core.Repositories ;
using Bit.Core.Services ;
using Microsoft.AspNetCore.Mvc ;
namespace Bit.Api.Billing.Controllers ;
[Route("providers/{providerId:guid}/clients")]
public class ProviderClientsController (
ICurrentContext currentContext ,
IFeatureService featureService ,
ILogger < ProviderClientsController > logger ,
IOrganizationRepository organizationRepository ,
2024-05-23 10:17:00 -04:00
IProviderBillingService providerBillingService ,
2024-04-16 13:55:00 -04:00
IProviderOrganizationRepository providerOrganizationRepository ,
IProviderRepository providerRepository ,
IProviderService providerService ,
2024-06-24 11:15:47 -04:00
IUserService userService ) : BaseProviderController ( currentContext , featureService , providerRepository )
2024-04-16 13:55:00 -04:00
{
[HttpPost]
public async Task < IResult > CreateAsync (
[FromRoute] Guid providerId ,
[FromBody] CreateClientOrganizationRequestBody requestBody )
{
2024-06-24 11:15:47 -04:00
var ( provider , result ) = await TryGetBillableProviderForAdminOperation ( providerId ) ;
if ( provider = = null )
2024-04-16 13:55:00 -04:00
{
2024-06-24 11:15:47 -04:00
return result ;
2024-04-16 13:55:00 -04:00
}
var user = await userService . GetUserByPrincipalAsync ( User ) ;
if ( user = = null )
{
return TypedResults . Unauthorized ( ) ;
}
var organizationSignup = new OrganizationSignup
{
Name = requestBody . Name ,
Plan = requestBody . PlanType ,
AdditionalSeats = requestBody . Seats ,
Owner = user ,
BillingEmail = provider . BillingEmail ,
OwnerKey = requestBody . Key ,
PublicKey = requestBody . KeyPair . PublicKey ,
PrivateKey = requestBody . KeyPair . EncryptedPrivateKey ,
CollectionName = requestBody . CollectionName
} ;
var providerOrganization = await providerService . CreateOrganizationAsync (
providerId ,
organizationSignup ,
requestBody . OwnerEmail ,
user ) ;
var clientOrganization = await organizationRepository . GetByIdAsync ( providerOrganization . OrganizationId ) ;
if ( clientOrganization = = null )
{
logger . LogError ( "Newly created client organization ({ID}) could not be found" , providerOrganization . OrganizationId ) ;
return TypedResults . Problem ( ) ;
}
2024-05-23 10:17:00 -04:00
await providerBillingService . ScaleSeats (
2024-04-16 13:55:00 -04:00
provider ,
requestBody . PlanType ,
requestBody . Seats ) ;
2024-05-23 10:17:00 -04:00
await providerBillingService . CreateCustomerForClientOrganization (
2024-04-16 13:55:00 -04:00
provider ,
clientOrganization ) ;
clientOrganization . Status = OrganizationStatusType . Managed ;
await organizationRepository . ReplaceAsync ( clientOrganization ) ;
return TypedResults . Ok ( ) ;
}
[HttpPut("{providerOrganizationId:guid}")]
public async Task < IResult > UpdateAsync (
[FromRoute] Guid providerId ,
[FromRoute] Guid providerOrganizationId ,
[FromBody] UpdateClientOrganizationRequestBody requestBody )
{
2024-06-24 11:15:47 -04:00
var ( provider , result ) = await TryGetBillableProviderForServiceUserOperation ( providerId ) ;
2024-04-16 13:55:00 -04:00
2024-06-24 11:15:47 -04:00
if ( provider = = null )
2024-04-16 13:55:00 -04:00
{
2024-06-24 11:15:47 -04:00
return result ;
2024-04-16 13:55:00 -04:00
}
var providerOrganization = await providerOrganizationRepository . GetByIdAsync ( providerOrganizationId ) ;
2024-06-24 11:15:47 -04:00
if ( providerOrganization = = null )
2024-04-16 13:55:00 -04:00
{
return TypedResults . NotFound ( ) ;
}
var clientOrganization = await organizationRepository . GetByIdAsync ( providerOrganization . OrganizationId ) ;
if ( clientOrganization = = null )
{
logger . LogError ( "The client organization ({OrganizationID}) represented by provider organization ({ProviderOrganizationID}) could not be found." , providerOrganization . OrganizationId , providerOrganization . Id ) ;
return TypedResults . Problem ( ) ;
}
2024-05-14 11:26:08 -04:00
if ( clientOrganization . Seats ! = requestBody . AssignedSeats )
{
2024-05-23 10:17:00 -04:00
await providerBillingService . AssignSeatsToClientOrganization (
2024-05-14 11:26:08 -04:00
provider ,
clientOrganization ,
requestBody . AssignedSeats ) ;
}
clientOrganization . Name = requestBody . Name ;
await organizationRepository . ReplaceAsync ( clientOrganization ) ;
2024-04-16 13:55:00 -04:00
return TypedResults . Ok ( ) ;
}
}