|
| 1 | +import { createLogger } from '@sim/logger' |
| 2 | +import { getErrorMessage } from '@sim/utils/errors' |
| 3 | +import { |
| 4 | + adminDashboardCreateEnterpriseOwnerClaimContract, |
| 5 | + adminDashboardListEnterpriseOwnerClaimsContract, |
| 6 | +} from '@/lib/api/contracts/v1/admin/dashboard' |
| 7 | +import { parseRequest } from '@/lib/api/server' |
| 8 | +import { dollarsToCredits } from '@/lib/billing/credits/conversion' |
| 9 | +import { |
| 10 | + createEnterpriseOwnerClaim, |
| 11 | + getPendingEnterpriseOwnerClaimsPage, |
| 12 | +} from '@/lib/billing/enterprise-owner-claim' |
| 13 | +import { EnterpriseProvisioningError } from '@/lib/billing/enterprise-provisioning' |
| 14 | +import { withRouteHandler } from '@/lib/core/utils/with-route-handler' |
| 15 | +import { getAdminAuditActor } from '@/app/api/v1/admin/dashboard/actor' |
| 16 | +import { withAdminAuth } from '@/app/api/v1/admin/middleware' |
| 17 | +import { |
| 18 | + adminInvalidJsonResponse, |
| 19 | + adminValidationErrorResponse, |
| 20 | + badRequestResponse, |
| 21 | + internalErrorResponse, |
| 22 | + listResponse, |
| 23 | + singleResponse, |
| 24 | +} from '@/app/api/v1/admin/responses' |
| 25 | + |
| 26 | +const logger = createLogger('AdminEnterpriseOwnerClaimsAPI') |
| 27 | + |
| 28 | +export const GET = withRouteHandler( |
| 29 | + withAdminAuth(async (request) => { |
| 30 | + const parsed = await parseRequest( |
| 31 | + adminDashboardListEnterpriseOwnerClaimsContract, |
| 32 | + request, |
| 33 | + {}, |
| 34 | + { validationErrorResponse: adminValidationErrorResponse } |
| 35 | + ) |
| 36 | + if (!parsed.success) return parsed.response |
| 37 | + try { |
| 38 | + const { limit, offset } = parsed.data.query |
| 39 | + const result = await getPendingEnterpriseOwnerClaimsPage({ limit, offset }) |
| 40 | + return listResponse(result.data, { |
| 41 | + total: result.total, |
| 42 | + limit, |
| 43 | + offset, |
| 44 | + hasMore: offset + result.data.length < result.total, |
| 45 | + }) |
| 46 | + } catch (error) { |
| 47 | + logger.error('Failed to list Enterprise owner claims', { error }) |
| 48 | + return internalErrorResponse(getErrorMessage(error, 'Failed to list owner invitations')) |
| 49 | + } |
| 50 | + }) |
| 51 | +) |
| 52 | + |
| 53 | +export const POST = withRouteHandler( |
| 54 | + withAdminAuth(async (request) => { |
| 55 | + const parsed = await parseRequest( |
| 56 | + adminDashboardCreateEnterpriseOwnerClaimContract, |
| 57 | + request, |
| 58 | + {}, |
| 59 | + { |
| 60 | + validationErrorResponse: adminValidationErrorResponse, |
| 61 | + invalidJsonResponse: adminInvalidJsonResponse, |
| 62 | + } |
| 63 | + ) |
| 64 | + if (!parsed.success) return parsed.response |
| 65 | + try { |
| 66 | + const actor = await getAdminAuditActor(request) |
| 67 | + const { usageLimitDollars, ...body } = parsed.data.body |
| 68 | + return singleResponse( |
| 69 | + await createEnterpriseOwnerClaim({ |
| 70 | + ...body, |
| 71 | + usageLimitCredits: |
| 72 | + usageLimitDollars === undefined ? undefined : dollarsToCredits(usageLimitDollars), |
| 73 | + requestedByEmail: actor.email ?? 'admin-api', |
| 74 | + requestedByUserId: actor.id, |
| 75 | + requestedByName: actor.name, |
| 76 | + }) |
| 77 | + ) |
| 78 | + } catch (error) { |
| 79 | + if (error instanceof EnterpriseProvisioningError) return badRequestResponse(error.message) |
| 80 | + logger.error('Failed to create Enterprise owner claim', { error }) |
| 81 | + return internalErrorResponse(getErrorMessage(error, 'Failed to invite the Enterprise owner')) |
| 82 | + } |
| 83 | + }) |
| 84 | +) |
0 commit comments