@sourceloop/ctrl-plane-tenant-management-service
Version:
Tenant Management microservice for SaaS control plane
285 lines (273 loc) • 7.14 kB
text/typescript
import {
Count,
CountSchema,
Filter,
repository,
Where,
} from '@loopback/repository';
import {
del,
get,
getModelSchemaRef,
param,
patch,
post,
put,
requestBody,
} from '@loopback/rest';
import {
CONTENT_TYPE,
OPERATION_SECURITY_SPEC,
STATUS_CODE,
} from '@sourceloop/core';
import {authenticate, STRATEGY} from 'loopback4-authentication';
import {authorize} from 'loopback4-authorization';
import {InvoiceRepository} from '../repositories';
import {Invoice} from '../models';
import {PermissionKey} from '../permissions';
import {service} from '@loopback/core';
import {InvoicePDFGenerator} from '../services';
const basePath = '/invoices';
export class InvoiceController {
constructor(
public invoiceRepository: InvoiceRepository,
private invoicePDFGenerator: InvoicePDFGenerator,
) {}
async create(
invoice: Omit<Invoice, 'id'>,
): Promise<Invoice> {
const createdInvoice = await this.invoiceRepository.create(invoice);
return createdInvoice;
}
async downloadInvoice(.path.number('id') id: string): Promise<void> {
const invoice = await this.invoiceRepository.findById(id);
if (!invoice) {
throw new Error('Invoice with given id does not exist');
}
// Generate PDF invoice
try {
const pdfFilePath = await this.invoicePDFGenerator.generatePDF(invoice);
invoice.invoiceFile = pdfFilePath; // Assuming invoiceFile property stores the path to the generated PDF
// Update invoice record in the database to store the PDF file path
await this.invoiceRepository.updateById(invoice.id, invoice);
} catch (error) {
//sonarignore:start
console.error('Error generating PDF:', error);
//sonarignore:end
// Handle error appropriately
}
}
async count(.where(Invoice) where?: Where<Invoice>): Promise<Count> {
return this.invoiceRepository.count(where);
}
async find(
.filter(Invoice) filter?: Filter<Invoice>,
): Promise<Invoice[]> {
return this.invoiceRepository.find(filter);
}
async updateAll(
invoice: Invoice,
.where(Invoice) where?: Where<Invoice>,
): Promise<Count> {
return this.invoiceRepository.updateAll(invoice, where);
}
async findById(
.path.string('id') id: string,
.filter(Invoice, {exclude: 'where'})
filter?: Filter<Invoice>,
): Promise<Invoice> {
return this.invoiceRepository.findById(id, filter);
}
async updateById(
.path.string('id') id: string,
invoice: Invoice,
): Promise<void> {
await this.invoiceRepository.updateById(id, invoice);
}
async replaceById(
.path.string('id') id: string,
invoice: Invoice,
): Promise<void> {
await this.invoiceRepository.replaceById(id, invoice);
}
async deleteById(.path.string('id') id: string): Promise<void> {
await this.invoiceRepository.deleteById(id);
}
}