@sourceloop/ctrl-plane-subscription-service
Version:
Subscription management microservice for SaaS control plane.
157 lines (150 loc) • 4.33 kB
text/typescript
import {BillingComponentBindings, IService} from 'loopback4-billing';
import {inject} from '@loopback/core';
import {del, get, param, patch, post, requestBody} from '@loopback/rest';
import {
OPERATION_SECURITY_SPEC,
STATUS_CODE,
getModelSchemaRefSF,
} from '@sourceloop/core';
import {authenticate, STRATEGY} from 'loopback4-authentication';
import {authorize} from 'loopback4-authorization';
import {InvoiceDto} from '../models/dto/invoice-dto.model';
import {TransactionDto} from '../models/dto/transaction-dto.model';
import {PermissionKey} from '../permissions';
import {BillingInvoiceService} from '../services/billing-invoice.service';
const basePath = '/billing-invoice';
export class BillingInvoiceController {
constructor(
(BillingComponentBindings.BillingProvider)
private readonly billingProvider: IService,
('services.BillingInvoiceService')
private readonly billingInvoiceService: BillingInvoiceService,
) {}
({
permissions: [PermissionKey.CreateBillingInvoice],
})
(STRATEGY.BEARER, {
passReqToCallback: true,
})
(basePath, {
security: OPERATION_SECURITY_SPEC,
responses: {
[STATUS_CODE.OK]: {
description: 'invoice model instance',
content: {
'application/json': {schema: getModelSchemaRefSF(InvoiceDto)},
},
},
},
})
async create(
({
content: {
'application/json': {
schema: getModelSchemaRefSF(InvoiceDto, {
title: 'newInvoice',
exclude: ['id', 'status'],
}),
},
},
})
invoiceDto: Omit<InvoiceDto, 'id' | 'status'>,
): Promise<InvoiceDto> {
return this.billingInvoiceService.createInvoice(invoiceDto);
}
({
permissions: [PermissionKey.GetBillingInvoice],
})
(STRATEGY.BEARER, {
passReqToCallback: true,
})
(`${basePath}/{invoiceId}`, {
security: OPERATION_SECURITY_SPEC,
responses: {
[STATUS_CODE.OK]: {
description: 'get invoice',
content: {
'application/json': {schema: getModelSchemaRefSF(InvoiceDto)},
},
},
},
})
async getInvoice(
.path.string('invoiceId') invoiceId: string,
): Promise<InvoiceDto> {
return this.billingInvoiceService.getInvoice(invoiceId);
}
({
permissions: [PermissionKey.UpdateBillingInvoice],
})
(STRATEGY.BEARER, {
passReqToCallback: true,
})
(`${basePath}/{invoiceId}`, {
security: OPERATION_SECURITY_SPEC,
responses: {
[STATUS_CODE.NO_CONTENT]: {
description: 'Billing Invoice PATCH success',
},
},
})
async updateById(
.path.string('invoiceId') invoiceId: string,
({
content: {
'application/json': {
schema: getModelSchemaRefSF(InvoiceDto, {partial: true}),
},
},
})
invoiceDto: Partial<InvoiceDto>,
): Promise<void> {
await this.billingProvider.updateInvoice(invoiceId, invoiceDto);
}
({
permissions: [PermissionKey.CreateBillingInvoice],
})
(STRATEGY.BEARER, {
passReqToCallback: true,
})
(`${basePath}/{invoiceId}/payments`, {
security: OPERATION_SECURITY_SPEC,
responses: {
[STATUS_CODE.OK]: {
description: 'invoice model instance',
},
},
})
async applyPaymentForInvoice(
.path.string('invoiceId') invoiceId: string,
({
content: {
'application/json': {
schema: getModelSchemaRefSF(TransactionDto, {partial: true}),
},
},
})
transactionDto: TransactionDto,
): Promise<void> {
return this.billingInvoiceService.applyPayment(invoiceId, transactionDto);
}
({
permissions: [PermissionKey.DeleteBillingPaymentSource],
})
(STRATEGY.BEARER, {
passReqToCallback: true,
})
(`${basePath}/{invoiceId}`, {
security: OPERATION_SECURITY_SPEC,
responses: {
[STATUS_CODE.NO_CONTENT]: {
description: 'Billing Invoice DELETE success',
},
},
})
async deleteById(
.path.string('invoiceId') invoiceId: string,
): Promise<void> {
return this.billingInvoiceService.deleteInvoice(invoiceId);
}
}