mirror of
https://github.com/bigcapitalhq/bigcapital.git
synced 2026-02-16 12:50:38 +00:00
Merge branch 'develop' into print-resources
This commit is contained in:
@@ -207,7 +207,6 @@ export default class AccountsController extends BaseController {
|
||||
tenantId,
|
||||
accountDTO
|
||||
);
|
||||
|
||||
return res.status(200).send({
|
||||
id: account.id,
|
||||
message: 'The account has been created successfully.',
|
||||
|
||||
@@ -0,0 +1,259 @@
|
||||
import mime from 'mime-types';
|
||||
import { Service, Inject } from 'typedi';
|
||||
import { Router, Response, NextFunction, Request } from 'express';
|
||||
import { body, param } from 'express-validator';
|
||||
import BaseController from '@/api/controllers/BaseController';
|
||||
import { AttachmentsApplication } from '@/services/Attachments/AttachmentsApplication';
|
||||
|
||||
@Service()
|
||||
export class AttachmentsController extends BaseController {
|
||||
@Inject()
|
||||
private attachmentsApplication: AttachmentsApplication;
|
||||
|
||||
/**
|
||||
* Router constructor.
|
||||
*/
|
||||
public router() {
|
||||
const router = Router();
|
||||
|
||||
router.post(
|
||||
'/',
|
||||
this.attachmentsApplication.uploadPipeline.single('file'),
|
||||
this.validateUploadedFileExistance,
|
||||
this.uploadAttachment.bind(this)
|
||||
);
|
||||
router.delete(
|
||||
'/:id',
|
||||
[param('id').exists()],
|
||||
this.validationResult,
|
||||
this.deleteAttachment.bind(this)
|
||||
);
|
||||
router.get(
|
||||
'/:id',
|
||||
[param('id').exists()],
|
||||
this.validationResult,
|
||||
this.getAttachment.bind(this)
|
||||
);
|
||||
router.post(
|
||||
'/:id/link',
|
||||
[body('modelRef').exists(), body('modelId').exists()],
|
||||
this.validationResult
|
||||
);
|
||||
router.post(
|
||||
'/:id/link',
|
||||
[body('modelRef').exists(), body('modelId').exists()],
|
||||
this.validationResult,
|
||||
this.linkDocument.bind(this)
|
||||
);
|
||||
router.post(
|
||||
'/:id/unlink',
|
||||
[body('modelRef').exists(), body('modelId').exists()],
|
||||
this.validationResult,
|
||||
this.unlinkDocument.bind(this)
|
||||
);
|
||||
router.get(
|
||||
'/:id/presigned-url',
|
||||
[param('id').exists()],
|
||||
this.validationResult,
|
||||
this.getAttachmentPresignedUrl.bind(this)
|
||||
);
|
||||
return router;
|
||||
}
|
||||
|
||||
/**
|
||||
* Validates the upload file existance.
|
||||
* @param {Request} req
|
||||
* @param {Response} res
|
||||
* @param {NextFunction} next
|
||||
* @returns {Response|void}
|
||||
*/
|
||||
private validateUploadedFileExistance(
|
||||
req: Request,
|
||||
res: Response,
|
||||
next: NextFunction
|
||||
) {
|
||||
if (!req.file) {
|
||||
return res.boom.badRequest(null, {
|
||||
errorType: 'FILE_UPLOAD_FAILED',
|
||||
message: 'Now file uploaded.',
|
||||
});
|
||||
}
|
||||
next();
|
||||
}
|
||||
|
||||
/**
|
||||
* Uploads the attachments to S3 and store the file metadata to DB.
|
||||
* @param {Request} req
|
||||
* @param {Response} res
|
||||
* @param {NextFunction} next
|
||||
* @returns {Response|void}
|
||||
*/
|
||||
private async uploadAttachment(
|
||||
req: Request,
|
||||
res: Response,
|
||||
next: NextFunction
|
||||
): Promise<Response | void> {
|
||||
const { tenantId } = req;
|
||||
const file = req.file;
|
||||
|
||||
try {
|
||||
const data = await this.attachmentsApplication.upload(tenantId, file);
|
||||
|
||||
return res.status(200).send({
|
||||
status: 200,
|
||||
message: 'The document has uploaded successfully.',
|
||||
data,
|
||||
});
|
||||
} catch (error) {
|
||||
next(error);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Retrieves the given attachment key.
|
||||
* @param {Request} req
|
||||
* @param {Response} res
|
||||
* @param {NextFunction} next
|
||||
* @returns {Promise<Response|void>}
|
||||
*/
|
||||
private async getAttachment(
|
||||
req: Request,
|
||||
res: Response,
|
||||
next: NextFunction
|
||||
): Promise<Response | void> {
|
||||
const { tenantId } = req;
|
||||
const { id } = req.params;
|
||||
|
||||
try {
|
||||
const data = await this.attachmentsApplication.get(tenantId, id);
|
||||
|
||||
const byte = await data.Body.transformToByteArray();
|
||||
const extension = mime.extension(data.ContentType);
|
||||
const buffer = Buffer.from(byte);
|
||||
|
||||
res.set(
|
||||
'Content-Disposition',
|
||||
`filename="${req.params.id}.${extension}"`
|
||||
);
|
||||
res.set('Content-Type', data.ContentType);
|
||||
res.send(buffer);
|
||||
} catch (error) {
|
||||
next(error);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Deletes the given document key.
|
||||
* @param {Request} req
|
||||
* @param {Response} res
|
||||
* @param {NextFunction} next
|
||||
* @returns {Promise<Response|void>}
|
||||
*/
|
||||
private async deleteAttachment(
|
||||
req: Request,
|
||||
res: Response,
|
||||
next: NextFunction
|
||||
): Promise<Response | void> {
|
||||
const { tenantId } = req;
|
||||
const { id: documentId } = req.params;
|
||||
|
||||
try {
|
||||
await this.attachmentsApplication.delete(tenantId, documentId);
|
||||
|
||||
return res.status(200).send({
|
||||
status: 200,
|
||||
message: 'The document has been delete successfully.',
|
||||
});
|
||||
} catch (error) {
|
||||
next(error);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Links the given document key.
|
||||
* @param {Request} req
|
||||
* @param {Response} res
|
||||
* @param {NextFunction} next
|
||||
* @returns {Promise<Response|void>}
|
||||
*/
|
||||
private async linkDocument(
|
||||
req: Request,
|
||||
res: Response,
|
||||
next: Function
|
||||
): Promise<Response | void> {
|
||||
const { tenantId } = req;
|
||||
const { id: documentId } = req.params;
|
||||
const { modelRef, modelId } = this.matchedBodyData(req);
|
||||
|
||||
try {
|
||||
await this.attachmentsApplication.link(
|
||||
tenantId,
|
||||
documentId,
|
||||
modelRef,
|
||||
modelId
|
||||
);
|
||||
return res.status(200).send({
|
||||
status: 200,
|
||||
message: 'The document has been linked successfully.',
|
||||
});
|
||||
} catch (error) {
|
||||
next(error);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Links the given document key.
|
||||
* @param {Request} req
|
||||
* @param {Response} res
|
||||
* @param {NextFunction} next
|
||||
* @returns {Promise<Response|void>}
|
||||
*/
|
||||
private async unlinkDocument(
|
||||
req: Request,
|
||||
res: Response,
|
||||
next: NextFunction
|
||||
): Promise<Response | void> {
|
||||
const { tenantId } = req;
|
||||
const { id: documentId } = req.params;
|
||||
const { modelRef, modelId } = this.matchedBodyData(req);
|
||||
|
||||
try {
|
||||
await this.attachmentsApplication.link(
|
||||
tenantId,
|
||||
documentId,
|
||||
modelRef,
|
||||
modelId
|
||||
);
|
||||
return res.status(200).send({
|
||||
status: 200,
|
||||
message: 'The document has been linked successfully.',
|
||||
});
|
||||
} catch (error) {
|
||||
next(error);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Retreives the presigned url of the given attachment key.
|
||||
* @param {Request} req
|
||||
* @param {Response} res
|
||||
* @param {NextFunction} next
|
||||
* @returns {Promise<Response|void>}
|
||||
*/
|
||||
private async getAttachmentPresignedUrl(
|
||||
req: Request,
|
||||
res: Response,
|
||||
next: NextFunction
|
||||
): Promise<Response | void> {
|
||||
const { id: documentKey } = req.params;
|
||||
|
||||
try {
|
||||
const presignedUrl = await this.attachmentsApplication.getPresignedUrl(
|
||||
documentKey
|
||||
);
|
||||
return res.status(200).send({ presignedUrl });
|
||||
} catch (error) {
|
||||
next(error);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -84,7 +84,7 @@ export class ExpensesController extends BaseController {
|
||||
/**
|
||||
* Expense DTO schema.
|
||||
*/
|
||||
get expenseDTOSchema() {
|
||||
private get expenseDTOSchema() {
|
||||
return [
|
||||
check('reference_no')
|
||||
.optional({ nullable: true })
|
||||
@@ -130,6 +130,9 @@ export class ExpensesController extends BaseController {
|
||||
.optional({ nullable: true })
|
||||
.isInt({ max: DATATYPES_LENGTH.INT_10 })
|
||||
.toInt(),
|
||||
|
||||
check('attachments').isArray().optional(),
|
||||
check('attachments.*.key').exists().isString(),
|
||||
];
|
||||
}
|
||||
|
||||
@@ -183,6 +186,9 @@ export class ExpensesController extends BaseController {
|
||||
.optional({ nullable: true })
|
||||
.isInt({ max: DATATYPES_LENGTH.INT_10 })
|
||||
.toInt(),
|
||||
|
||||
check('attachments').isArray().optional(),
|
||||
check('attachments.*.key').exists().isString(),
|
||||
];
|
||||
}
|
||||
|
||||
@@ -269,7 +275,7 @@ export class ExpensesController extends BaseController {
|
||||
* @param {Response} res
|
||||
* @param {NextFunction} next
|
||||
*/
|
||||
async deleteExpense(req: Request, res: Response, next: NextFunction) {
|
||||
private async deleteExpense(req: Request, res: Response, next: NextFunction) {
|
||||
const { tenantId, user } = req;
|
||||
const { id: expenseId } = req.params;
|
||||
|
||||
@@ -291,7 +297,11 @@ export class ExpensesController extends BaseController {
|
||||
* @param {Response} res
|
||||
* @param {NextFunction} next
|
||||
*/
|
||||
async publishExpense(req: Request, res: Response, next: NextFunction) {
|
||||
private async publishExpense(
|
||||
req: Request,
|
||||
res: Response,
|
||||
next: NextFunction
|
||||
) {
|
||||
const { tenantId, user } = req;
|
||||
const { id: expenseId } = req.params;
|
||||
|
||||
@@ -313,7 +323,11 @@ export class ExpensesController extends BaseController {
|
||||
* @param {Response} res
|
||||
* @param {NextFunction} next
|
||||
*/
|
||||
async getExpensesList(req: Request, res: Response, next: NextFunction) {
|
||||
private async getExpensesList(
|
||||
req: Request,
|
||||
res: Response,
|
||||
next: NextFunction
|
||||
) {
|
||||
const { tenantId } = req;
|
||||
const filter = {
|
||||
sortOrder: 'desc',
|
||||
@@ -343,7 +357,7 @@ export class ExpensesController extends BaseController {
|
||||
* @param {Response} res
|
||||
* @param {NextFunction} next
|
||||
*/
|
||||
async getExpense(req: Request, res: Response, next: NextFunction) {
|
||||
private async getExpense(req: Request, res: Response, next: NextFunction) {
|
||||
const { tenantId } = req;
|
||||
const { id: expenseId } = req.params;
|
||||
|
||||
|
||||
@@ -15,7 +15,7 @@ export class ExportController extends BaseController {
|
||||
/**
|
||||
* Router constructor method.
|
||||
*/
|
||||
router() {
|
||||
public router() {
|
||||
const router = Router();
|
||||
|
||||
router.get(
|
||||
@@ -56,6 +56,7 @@ export class ExportController extends BaseController {
|
||||
query.resource,
|
||||
applicationFormat
|
||||
);
|
||||
// Retrieves the csv format.
|
||||
if (ACCEPT_TYPE.APPLICATION_CSV === acceptType) {
|
||||
res.setHeader('Content-Disposition', 'attachment; filename=output.csv');
|
||||
res.setHeader('Content-Type', 'text/csv');
|
||||
|
||||
@@ -16,7 +16,7 @@ export class ImportController extends BaseController {
|
||||
/**
|
||||
* Router constructor method.
|
||||
*/
|
||||
router() {
|
||||
public router() {
|
||||
const router = Router();
|
||||
|
||||
router.post(
|
||||
@@ -240,11 +240,7 @@ export class ImportController extends BaseController {
|
||||
errors: [{ type: 'IMPORTED_FILE_EXTENSION_INVALID' }],
|
||||
});
|
||||
}
|
||||
return res.status(400).send({
|
||||
errors: [{ type: error.errorType }],
|
||||
});
|
||||
}
|
||||
|
||||
next(error);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -77,14 +77,14 @@ export default class ManualJournalsController extends BaseController {
|
||||
/**
|
||||
* Specific manual journal id param validation schema.
|
||||
*/
|
||||
get manualJournalParamSchema() {
|
||||
private get manualJournalParamSchema() {
|
||||
return [param('id').exists().isNumeric().toInt()];
|
||||
}
|
||||
|
||||
/**
|
||||
* Manual journal DTO schema.
|
||||
*/
|
||||
get manualJournalValidationSchema() {
|
||||
private get manualJournalValidationSchema() {
|
||||
return [
|
||||
check('date').exists().isISO8601(),
|
||||
check('currency_code').optional(),
|
||||
@@ -148,13 +148,16 @@ export default class ManualJournalsController extends BaseController {
|
||||
.optional({ nullable: true })
|
||||
.isNumeric()
|
||||
.toInt(),
|
||||
|
||||
check('attachments').isArray().optional(),
|
||||
check('attachments.*.key').exists().isString(),
|
||||
];
|
||||
}
|
||||
|
||||
/**
|
||||
* Manual journals list validation schema.
|
||||
*/
|
||||
get manualJournalsListSchema() {
|
||||
private get manualJournalsListSchema() {
|
||||
return [
|
||||
query('page').optional().isNumeric().toInt(),
|
||||
query('page_size').optional().isNumeric().toInt(),
|
||||
@@ -320,7 +323,7 @@ export default class ManualJournalsController extends BaseController {
|
||||
* @param {Response} res
|
||||
* @param {NextFunction} next
|
||||
*/
|
||||
getManualJournalsList = async (
|
||||
private getManualJournalsList = async (
|
||||
req: Request,
|
||||
res: Response,
|
||||
next: NextFunction
|
||||
|
||||
@@ -33,17 +33,17 @@ export default class OrganizationDashboardController extends BaseController {
|
||||
}
|
||||
|
||||
/**
|
||||
*
|
||||
* @param req
|
||||
* @param res
|
||||
* @param next
|
||||
* @returns
|
||||
* Detarmines whether the current authed organization to able to change its currency/.
|
||||
* @param {Request} req
|
||||
* @param {Response} res
|
||||
* @param {NextFunction} next
|
||||
* @returns {Response|void}
|
||||
*/
|
||||
private async baseCurrencyMutateAbility(
|
||||
req: Request,
|
||||
res: Response,
|
||||
next: Function
|
||||
) {
|
||||
): Promise<Response|void> {
|
||||
const { tenantId } = req;
|
||||
|
||||
try {
|
||||
|
||||
@@ -29,8 +29,7 @@ export class ProjectsController extends BaseController {
|
||||
check('cost_estimate').exists().isDecimal(),
|
||||
],
|
||||
this.validationResult,
|
||||
asyncMiddleware(this.createProject.bind(this)),
|
||||
this.catchServiceErrors
|
||||
asyncMiddleware(this.createProject.bind(this))
|
||||
);
|
||||
router.post(
|
||||
'/:id',
|
||||
@@ -43,8 +42,7 @@ export class ProjectsController extends BaseController {
|
||||
check('cost_estimate').exists().isDecimal(),
|
||||
],
|
||||
this.validationResult,
|
||||
asyncMiddleware(this.editProject.bind(this)),
|
||||
this.catchServiceErrors
|
||||
asyncMiddleware(this.editProject.bind(this))
|
||||
);
|
||||
router.patch(
|
||||
'/:projectId/status',
|
||||
@@ -56,16 +54,14 @@ export class ProjectsController extends BaseController {
|
||||
.isIn([IProjectStatus.InProgress, IProjectStatus.Closed]),
|
||||
],
|
||||
this.validationResult,
|
||||
asyncMiddleware(this.editProject.bind(this)),
|
||||
this.catchServiceErrors
|
||||
asyncMiddleware(this.editProject.bind(this))
|
||||
);
|
||||
router.get(
|
||||
'/:id',
|
||||
CheckPolicies(ProjectAction.VIEW, AbilitySubject.Project),
|
||||
[param('id').exists().isInt().toInt()],
|
||||
this.validationResult,
|
||||
asyncMiddleware(this.getProject.bind(this)),
|
||||
this.catchServiceErrors
|
||||
asyncMiddleware(this.getProject.bind(this))
|
||||
);
|
||||
router.get(
|
||||
'/:projectId/billable/entries',
|
||||
@@ -76,24 +72,21 @@ export class ProjectsController extends BaseController {
|
||||
query('to_date').optional().isISO8601(),
|
||||
],
|
||||
this.validationResult,
|
||||
asyncMiddleware(this.projectBillableEntries.bind(this)),
|
||||
this.catchServiceErrors
|
||||
asyncMiddleware(this.projectBillableEntries.bind(this))
|
||||
);
|
||||
router.get(
|
||||
'/',
|
||||
CheckPolicies(ProjectAction.VIEW, AbilitySubject.Project),
|
||||
[],
|
||||
this.validationResult,
|
||||
asyncMiddleware(this.getProjects.bind(this)),
|
||||
this.catchServiceErrors
|
||||
asyncMiddleware(this.getProjects.bind(this))
|
||||
);
|
||||
router.delete(
|
||||
'/:id',
|
||||
CheckPolicies(ProjectAction.DELETE, AbilitySubject.Project),
|
||||
[param('id').exists().isInt().toInt()],
|
||||
this.validationResult,
|
||||
asyncMiddleware(this.deleteProject.bind(this)),
|
||||
this.catchServiceErrors
|
||||
asyncMiddleware(this.deleteProject.bind(this))
|
||||
);
|
||||
return router;
|
||||
}
|
||||
@@ -252,22 +245,4 @@ export class ProjectsController extends BaseController {
|
||||
next(error);
|
||||
}
|
||||
};
|
||||
|
||||
/**
|
||||
* Transforms service errors to response.
|
||||
* @param {Error}
|
||||
* @param {Request} req
|
||||
* @param {Response} res
|
||||
* @param {ServiceError} error
|
||||
*/
|
||||
private catchServiceErrors(
|
||||
error,
|
||||
req: Request,
|
||||
res: Response,
|
||||
next: NextFunction
|
||||
) {
|
||||
if (error instanceof ServiceError) {
|
||||
}
|
||||
next(error);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -118,7 +118,6 @@ export default class BillsController extends BaseController {
|
||||
check('is_inclusive_tax').default(false).isBoolean().toBoolean(),
|
||||
|
||||
check('entries').isArray({ min: 1 }),
|
||||
|
||||
check('entries.*.index').exists().isNumeric().toInt(),
|
||||
check('entries.*.item_id').exists().isNumeric().toInt(),
|
||||
check('entries.*.rate').exists().isNumeric().toFloat(),
|
||||
@@ -148,6 +147,9 @@ export default class BillsController extends BaseController {
|
||||
.optional({ nullable: true })
|
||||
.isNumeric()
|
||||
.toInt(),
|
||||
|
||||
check('attachments').isArray().optional(),
|
||||
check('attachments.*.key').exists().isString(),
|
||||
];
|
||||
}
|
||||
|
||||
@@ -190,6 +192,9 @@ export default class BillsController extends BaseController {
|
||||
.optional({ nullable: true })
|
||||
.isBoolean()
|
||||
.toBoolean(),
|
||||
|
||||
check('attachments').isArray().optional(),
|
||||
check('attachments.*.key').exists().isString(),
|
||||
];
|
||||
}
|
||||
|
||||
|
||||
@@ -122,6 +122,9 @@ export default class BillsPayments extends BaseController {
|
||||
check('entries.*.index').optional().isNumeric().toInt(),
|
||||
check('entries.*.bill_id').exists().isNumeric().toInt(),
|
||||
check('entries.*.payment_amount').exists().isNumeric().toFloat(),
|
||||
|
||||
check('attachments').isArray().optional(),
|
||||
check('attachments.*.key').exists().isString(),
|
||||
];
|
||||
}
|
||||
|
||||
|
||||
@@ -186,6 +186,9 @@ export default class VendorCreditController extends BaseController {
|
||||
.optional({ nullable: true })
|
||||
.isNumeric()
|
||||
.toInt(),
|
||||
|
||||
check('attachments').isArray().optional(),
|
||||
check('attachments.*.key').exists().isString(),
|
||||
];
|
||||
}
|
||||
|
||||
@@ -228,6 +231,9 @@ export default class VendorCreditController extends BaseController {
|
||||
.optional({ nullable: true })
|
||||
.isNumeric()
|
||||
.toInt(),
|
||||
|
||||
check('attachments').isArray().optional(),
|
||||
check('attachments.*.key').exists().isString(),
|
||||
];
|
||||
}
|
||||
|
||||
|
||||
@@ -236,6 +236,9 @@ export default class PaymentReceivesController extends BaseController {
|
||||
.optional({ nullable: true })
|
||||
.isNumeric()
|
||||
.toInt(),
|
||||
|
||||
check('attachments').isArray().optional(),
|
||||
check('attachments.*.key').exists().isString(),
|
||||
];
|
||||
}
|
||||
|
||||
|
||||
@@ -164,6 +164,9 @@ export default class PaymentReceivesController extends BaseController {
|
||||
check('entries.*.index').optional().isNumeric().toInt(),
|
||||
check('entries.*.invoice_id').exists().isNumeric().toInt(),
|
||||
check('entries.*.payment_amount').exists().isNumeric().toFloat(),
|
||||
|
||||
check('attachments').isArray().optional(),
|
||||
check('attachments.*.key').exists().isString(),
|
||||
];
|
||||
}
|
||||
|
||||
|
||||
@@ -184,6 +184,9 @@ export default class SalesEstimatesController extends BaseController {
|
||||
check('note').optional().trim().escape(),
|
||||
check('terms_conditions').optional().trim().escape(),
|
||||
check('send_to_email').optional().trim().escape(),
|
||||
|
||||
check('attachments').isArray().optional(),
|
||||
check('attachments.*.key').exists().isString(),
|
||||
];
|
||||
}
|
||||
|
||||
|
||||
@@ -36,6 +36,8 @@ export default class SaleInvoicesController extends BaseController {
|
||||
[
|
||||
...this.saleInvoiceValidationSchema,
|
||||
check('from_estimate_id').optional().isNumeric().toInt(),
|
||||
check('attachments').isArray().optional(),
|
||||
check('attachments.*.key').exists().isString(),
|
||||
],
|
||||
this.validationResult,
|
||||
asyncMiddleware(this.newSaleInvoice.bind(this)),
|
||||
@@ -98,6 +100,8 @@ export default class SaleInvoicesController extends BaseController {
|
||||
[
|
||||
...this.saleInvoiceValidationSchema,
|
||||
...this.specificSaleInvoiceValidation,
|
||||
check('attachments').isArray().optional(),
|
||||
check('attachments.*.key').exists().isString(),
|
||||
],
|
||||
this.validationResult,
|
||||
asyncMiddleware(this.editSaleInvoice.bind(this)),
|
||||
|
||||
@@ -158,6 +158,8 @@ export default class SalesReceiptsController extends BaseController {
|
||||
.toInt(),
|
||||
check('receipt_message').optional().trim().escape(),
|
||||
check('statement').optional().trim().escape(),
|
||||
check('attachments').isArray().optional(),
|
||||
check('attachments.*.key').exists().isString(),
|
||||
];
|
||||
}
|
||||
|
||||
|
||||
@@ -155,6 +155,7 @@ export default class UsersController extends BaseController {
|
||||
|
||||
try {
|
||||
const user = await this.usersService.getUser(tenantId, userId);
|
||||
|
||||
return res.status(200).send({ user });
|
||||
} catch (error) {
|
||||
next(error);
|
||||
@@ -229,7 +230,7 @@ export default class UsersController extends BaseController {
|
||||
* @param {Response} res
|
||||
* @param {NextFunction} next
|
||||
*/
|
||||
catchServiceErrors(
|
||||
private catchServiceErrors(
|
||||
error: Error,
|
||||
req: Request,
|
||||
res: Response,
|
||||
|
||||
@@ -17,7 +17,7 @@ export class WarehousesController extends BaseController {
|
||||
*
|
||||
* @returns
|
||||
*/
|
||||
router() {
|
||||
public router() {
|
||||
const router = Router();
|
||||
|
||||
router.post(
|
||||
|
||||
@@ -34,14 +34,21 @@ export class Webhooks extends BaseController {
|
||||
* @param {Response} res
|
||||
* @returns {Response}
|
||||
*/
|
||||
public async lemonWebhooks(req: Request, res: Response) {
|
||||
public async lemonWebhooks(req: Request, res: Response, next: any) {
|
||||
const data = req.body;
|
||||
const signature = req.headers['x-signature'] ?? '';
|
||||
const rawBody = req.rawBody;
|
||||
|
||||
await this.lemonWebhooksService.handlePostWebhook(rawBody, data, signature);
|
||||
|
||||
return res.status(200).send();
|
||||
try {
|
||||
await this.lemonWebhooksService.handlePostWebhook(
|
||||
rawBody,
|
||||
data,
|
||||
signature
|
||||
);
|
||||
return res.status(200).send();
|
||||
} catch (error) {
|
||||
next(error);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
|
||||
Reference in New Issue
Block a user