update: remove the blog from the response of the update or create blog
This commit is contained in:
@@ -10,7 +10,7 @@ import { ApiKeyGuards } from "../../common/decorators/api-key-guard.decorator";
|
||||
import { AuthGuards } from "../../common/decorators/auth-guard.decorator";
|
||||
import { PermissionsDec } from "../../common/decorators/permission.decorator";
|
||||
import { SkipAuth } from "../../common/decorators/skip-auth.decorator";
|
||||
import { UserDec } from "../../common/decorators/user.decorator";
|
||||
import { IUserIpAndHeaders, UserDec, UserIpAndHeaders } from "../../common/decorators/user.decorator";
|
||||
import { ParamDto } from "../../common/DTO/param.dto";
|
||||
import { VerifyOtpWithUserId } from "../auth/DTO/verify-otp.dto";
|
||||
import { PermissionEnum } from "../users/enums/permission.enum";
|
||||
@@ -23,22 +23,22 @@ export class InvoicesController {
|
||||
@ApiOperation({ summary: "create an invoice ==> admin route" })
|
||||
@PermissionsDec(PermissionEnum.INVOICES)
|
||||
@Post()
|
||||
createInvoice(@Body() createDto: CreateInvoiceDto, @UserDec("id") userId: string) {
|
||||
return this.invoiceService.createInvoiceAdmin(createDto, userId);
|
||||
createInvoice(@Body() createDto: CreateInvoiceDto, @UserIpAndHeaders() userIpAndHeaders: IUserIpAndHeaders) {
|
||||
return this.invoiceService.createInvoiceAdmin(createDto, userIpAndHeaders);
|
||||
}
|
||||
|
||||
@ApiOperation({ summary: "update an invoice ==> admin route" })
|
||||
@PermissionsDec(PermissionEnum.INVOICES)
|
||||
@Patch(":id")
|
||||
updateInvoice(@Param() paramDto: ParamDto, @Body() updateDto: UpdateInvoiceDto, @UserDec("id") userId: string) {
|
||||
return this.invoiceService.updateInvoiceAdmin(paramDto.id, updateDto, userId);
|
||||
updateInvoice(@Param() paramDto: ParamDto, @Body() updateDto: UpdateInvoiceDto, @UserIpAndHeaders() userIpAndHeaders: IUserIpAndHeaders) {
|
||||
return this.invoiceService.updateInvoiceAdmin(paramDto.id, updateDto, userIpAndHeaders);
|
||||
}
|
||||
|
||||
@ApiOperation({ summary: "delete an invoice ==> admin route" })
|
||||
@PermissionsDec(PermissionEnum.INVOICES)
|
||||
@Delete(":id")
|
||||
deleteInvoice(@Param() paramDto: ParamDto, @UserDec("id") userId: string) {
|
||||
return this.invoiceService.deleteInvoiceAdmin(paramDto.id, userId);
|
||||
deleteInvoice(@Param() paramDto: ParamDto, @UserIpAndHeaders() userIpAndHeaders: IUserIpAndHeaders) {
|
||||
return this.invoiceService.deleteInvoiceAdmin(paramDto.id, userIpAndHeaders);
|
||||
}
|
||||
|
||||
@ApiOperation({ summary: "get all invoices ==> admin route" })
|
||||
@@ -62,20 +62,24 @@ export class InvoicesController {
|
||||
|
||||
@ApiOperation({ summary: "approve request invoice by user" })
|
||||
@Post(":id/approve/request")
|
||||
approveRequestInvoiceByUser(@Param() paramDto: ParamDto, @UserDec("id") userId: string) {
|
||||
return this.invoiceService.approveInvoiceRequest(paramDto.id, userId);
|
||||
approveRequestInvoiceByUser(@Param() paramDto: ParamDto, @UserIpAndHeaders() userIpAndHeaders: IUserIpAndHeaders) {
|
||||
return this.invoiceService.approveInvoiceRequest(paramDto.id, userIpAndHeaders);
|
||||
}
|
||||
|
||||
@ApiOperation({ summary: "approve invoice by user" })
|
||||
@Patch(":id/approve")
|
||||
approveInvoiceByUser(@Param() paramDto: ParamDto, @UserDec("id") userId: string, @Body() verifyOtpDto: VerifyOtpWithUserId) {
|
||||
return this.invoiceService.approveInvoiceByUser(paramDto.id, userId, verifyOtpDto);
|
||||
approveInvoiceByUser(
|
||||
@Param() paramDto: ParamDto,
|
||||
@UserIpAndHeaders() userIpAndHeaders: IUserIpAndHeaders,
|
||||
@Body() verifyOtpDto: VerifyOtpWithUserId,
|
||||
) {
|
||||
return this.invoiceService.approveInvoiceByUser(paramDto.id, userIpAndHeaders, verifyOtpDto);
|
||||
}
|
||||
|
||||
@ApiOperation({ summary: "pay invoice by user" })
|
||||
@Post(":id/pay")
|
||||
async payInvoice(@Param() paramDto: ParamDto, @UserDec("id") userId: string) {
|
||||
return this.invoiceService.payInvoice(paramDto.id, userId);
|
||||
async payInvoice(@Param() paramDto: ParamDto, @UserIpAndHeaders() userIpAndHeaders: IUserIpAndHeaders) {
|
||||
return this.invoiceService.payInvoice(paramDto.id, userIpAndHeaders.userId, userIpAndHeaders);
|
||||
}
|
||||
|
||||
@ApiOperation({ summary: "apply discount on invoice by user" })
|
||||
|
||||
@@ -5,6 +5,7 @@ import dayjs from "dayjs";
|
||||
import Decimal from "decimal.js";
|
||||
import { Between, DataSource, In, QueryRunner } from "typeorm";
|
||||
|
||||
import { IUserIpAndHeaders } from "../../../common/decorators/user.decorator";
|
||||
import { AuthMessage, InvoiceMessage, WalletMessage } from "../../../common/enums/message.enum";
|
||||
import { OperationType } from "../../access-logs/enums/operation-type.enum";
|
||||
import { UserType } from "../../access-logs/enums/user-type.enum";
|
||||
@@ -56,7 +57,7 @@ export class InvoicesService {
|
||||
|
||||
///********************************** */
|
||||
|
||||
async createInvoiceAdmin(createDto: CreateInvoiceDto, userId: string) {
|
||||
async createInvoiceAdmin(createDto: CreateInvoiceDto, userIpAndHeaders: IUserIpAndHeaders) {
|
||||
const queryRunner = this.dataSource.createQueryRunner();
|
||||
|
||||
try {
|
||||
@@ -83,7 +84,7 @@ export class InvoicesService {
|
||||
const dueDate = dayjs().add(INVOICE.DUEDATE, "day").toDate();
|
||||
|
||||
const invoice = queryRunner.manager.create(this.invoiceRepository.target, {
|
||||
user: { id: userId },
|
||||
user: { id: createDto.userId },
|
||||
totalPrice: totalPrice.add(tax).toNumber(),
|
||||
originalPrice: totalPrice.add(tax).toNumber(),
|
||||
items: invoiceItems,
|
||||
@@ -113,9 +114,12 @@ export class InvoicesService {
|
||||
|
||||
await this.scheduleInvoiceJobs(invoice, createDto);
|
||||
|
||||
await this.accessLogService.logCreate("Invoice", invoice.id, createDto, {
|
||||
user: { id: userId },
|
||||
userType: UserType.ADMIN,
|
||||
await this.accessLogService.logCreate("Invoice", UserType.ADMIN, {
|
||||
user: { id: userIpAndHeaders.userId },
|
||||
endpoint: "/invoices",
|
||||
requestId: userIpAndHeaders.headers["x-request-id"],
|
||||
ipAddress: userIpAndHeaders.ip,
|
||||
userAgent: userIpAndHeaders.headers["user-agent"],
|
||||
actionDescription: `Admin created invoice: ${invoice.numericId}`,
|
||||
metadata: {
|
||||
items: invoiceItems.map((item) => item.name).join(", "),
|
||||
@@ -141,7 +145,7 @@ export class InvoicesService {
|
||||
|
||||
//********************************** */
|
||||
|
||||
async updateInvoiceAdmin(invoiceId: string, updateDto: UpdateInvoiceDto, userId: string) {
|
||||
async updateInvoiceAdmin(invoiceId: string, updateDto: UpdateInvoiceDto, userIpAndHeaders: IUserIpAndHeaders) {
|
||||
const queryRunner = this.dataSource.createQueryRunner();
|
||||
|
||||
try {
|
||||
@@ -204,10 +208,15 @@ export class InvoicesService {
|
||||
|
||||
await queryRunner.commitTransaction();
|
||||
|
||||
await this.accessLogService.logUpdate("Invoice", invoice.id, updateDto, {
|
||||
user: { id: userId },
|
||||
userType: UserType.ADMIN,
|
||||
await this.accessLogService.logUpdate("Invoice", invoice.id, UserType.ADMIN, {
|
||||
user: { id: userIpAndHeaders.userId },
|
||||
endpoint: "/invoices",
|
||||
requestId: userIpAndHeaders.headers["x-request-id"],
|
||||
ipAddress: userIpAndHeaders.ip,
|
||||
userAgent: userIpAndHeaders.headers["user-agent"],
|
||||
actionDescription: `Admin updated invoice: ${invoice.numericId}`,
|
||||
oldValues: JSON.stringify({ ...invoice }),
|
||||
newValues: JSON.stringify({ ...updateDto }),
|
||||
});
|
||||
|
||||
return {
|
||||
@@ -224,7 +233,7 @@ export class InvoicesService {
|
||||
|
||||
//********************************** */
|
||||
|
||||
async deleteInvoiceAdmin(invoiceId: string, userId: string) {
|
||||
async deleteInvoiceAdmin(invoiceId: string, userIpAndHeaders: IUserIpAndHeaders) {
|
||||
const queryRunner = this.dataSource.createQueryRunner();
|
||||
|
||||
try {
|
||||
@@ -245,10 +254,16 @@ export class InvoicesService {
|
||||
|
||||
await queryRunner.manager.remove(this.invoiceRepository.target, invoice);
|
||||
|
||||
await this.accessLogService.logDelete("Invoice", invoice.id, invoice, {
|
||||
user: { id: userId },
|
||||
userType: UserType.ADMIN,
|
||||
await this.accessLogService.logDelete("Invoice", invoice.id, UserType.ADMIN, {
|
||||
user: { id: userIpAndHeaders.userId },
|
||||
endpoint: "/invoices",
|
||||
requestId: userIpAndHeaders.headers["x-request-id"],
|
||||
ipAddress: userIpAndHeaders.ip,
|
||||
userAgent: userIpAndHeaders.headers["user-agent"],
|
||||
actionDescription: `Admin deleted invoice: ${invoice.numericId}`,
|
||||
metadata: {
|
||||
items: invoice.items.map((item) => item.name).join(", "),
|
||||
},
|
||||
});
|
||||
|
||||
await queryRunner.commitTransaction();
|
||||
@@ -326,16 +341,16 @@ export class InvoicesService {
|
||||
|
||||
//********************************** */
|
||||
|
||||
async approveInvoiceRequest(invoiceId: string, userId: string) {
|
||||
async approveInvoiceRequest(invoiceId: string, userIpAndHeaders: IUserIpAndHeaders) {
|
||||
const queryRunner = this.dataSource.createQueryRunner();
|
||||
|
||||
try {
|
||||
await queryRunner.connect();
|
||||
await queryRunner.startTransaction();
|
||||
|
||||
const user = await this.usersService.findOneByIdWithQueryRunner(userId, queryRunner);
|
||||
const user = await this.usersService.findOneByIdWithQueryRunner(userIpAndHeaders.userId, queryRunner);
|
||||
|
||||
const invoice = await this.validateInvoiceForApproval(invoiceId, userId, queryRunner);
|
||||
const invoice = await this.validateInvoiceForApproval(invoiceId, userIpAndHeaders.userId, queryRunner);
|
||||
|
||||
const existCode = await this.otpService.checkExistOtp(user.phone, "INVOICE_VERIFY");
|
||||
if (existCode) {
|
||||
@@ -363,8 +378,11 @@ export class InvoicesService {
|
||||
invoiceId,
|
||||
`user approved invoice request: ${invoice.numericId}`,
|
||||
{
|
||||
user: { id: userId },
|
||||
user: { id: userIpAndHeaders.userId },
|
||||
userType: UserType.USER,
|
||||
ipAddress: userIpAndHeaders.ip,
|
||||
userAgent: userIpAndHeaders.headers["user-agent"],
|
||||
requestId: userIpAndHeaders.headers["x-request-id"],
|
||||
},
|
||||
);
|
||||
|
||||
@@ -384,7 +402,7 @@ export class InvoicesService {
|
||||
|
||||
//********************************** */
|
||||
|
||||
async approveInvoiceByUser(invoiceId: string, userId: string, verifyOtpDto: VerifyOtpWithUserId) {
|
||||
async approveInvoiceByUser(invoiceId: string, userIpAndHeaders: IUserIpAndHeaders, verifyOtpDto: VerifyOtpWithUserId) {
|
||||
const queryRunner = this.dataSource.createQueryRunner();
|
||||
|
||||
try {
|
||||
@@ -392,17 +410,17 @@ export class InvoicesService {
|
||||
await queryRunner.startTransaction();
|
||||
const { code } = verifyOtpDto;
|
||||
|
||||
const user = await this.usersService.findOneByIdWithQueryRunner(userId, queryRunner);
|
||||
const user = await this.usersService.findOneByIdWithQueryRunner(userIpAndHeaders.userId, queryRunner);
|
||||
|
||||
const isValid = await this.otpService.verifyOtp(user.phone, code, "INVOICE_VERIFY");
|
||||
if (!isValid) throw new BadRequestException(AuthMessage.INVALID_OTP);
|
||||
|
||||
const invoice = await this.validateInvoiceForApproval(invoiceId, userId, queryRunner);
|
||||
const invoice = await this.validateInvoiceForApproval(invoiceId, userIpAndHeaders.userId, queryRunner);
|
||||
|
||||
invoice.status = InvoiceStatus.WAIT_PAYMENT;
|
||||
await queryRunner.manager.save(Invoice, invoice);
|
||||
|
||||
await this.notificationQueue.addApprovedInvoiceNotification(userId, {
|
||||
await this.notificationQueue.addApprovedInvoiceNotification(userIpAndHeaders.userId, {
|
||||
invoiceId: invoice.numericId.toString(),
|
||||
dueDate: invoice.dueDate,
|
||||
createDate: invoice.createdAt,
|
||||
@@ -420,7 +438,10 @@ export class InvoicesService {
|
||||
invoiceId,
|
||||
`user approved invoice by user: ${invoice.numericId}`,
|
||||
{
|
||||
user: { id: userId },
|
||||
user: { id: userIpAndHeaders.userId },
|
||||
ipAddress: userIpAndHeaders.ip,
|
||||
userAgent: userIpAndHeaders.headers["user-agent"],
|
||||
requestId: userIpAndHeaders.headers["x-request-id"],
|
||||
userType: UserType.USER,
|
||||
},
|
||||
);
|
||||
@@ -681,7 +702,12 @@ export class InvoicesService {
|
||||
|
||||
//*********************************** */
|
||||
|
||||
async payInvoice(invoiceId: string, userId: string, queryRunner = this.dataSource.createQueryRunner()) {
|
||||
async payInvoice(
|
||||
invoiceId: string,
|
||||
userId: string,
|
||||
userIpAndHeaders?: IUserIpAndHeaders,
|
||||
queryRunner = this.dataSource.createQueryRunner(),
|
||||
) {
|
||||
let transactionStarted = false;
|
||||
|
||||
try {
|
||||
@@ -784,10 +810,15 @@ export class InvoicesService {
|
||||
paidAt: invoice.paidAt,
|
||||
});
|
||||
|
||||
await this.accessLogService.logUserAction(OperationType.UPDATE, "Invoice", invoiceId, `user paid invoice: ${invoice.numericId}`, {
|
||||
user: { id: userId },
|
||||
userType: UserType.USER,
|
||||
});
|
||||
if (userIpAndHeaders) {
|
||||
await this.accessLogService.logUserAction(OperationType.UPDATE, "Invoice", invoiceId, `user paid invoice: ${invoice.numericId}`, {
|
||||
user: { id: userIpAndHeaders.userId },
|
||||
ipAddress: userIpAndHeaders.ip,
|
||||
userAgent: userIpAndHeaders.headers["user-agent"],
|
||||
requestId: userIpAndHeaders.headers["x-request-id"],
|
||||
userType: UserType.USER,
|
||||
});
|
||||
}
|
||||
|
||||
if (transactionStarted) await queryRunner.commitTransaction();
|
||||
|
||||
|
||||
@@ -480,6 +480,6 @@ export class InvoiceProcessor extends WorkerProcessor {
|
||||
|
||||
userSupportPlan.status = UserSupportPlanStatus.ACTIVE;
|
||||
await queryRunner.manager.save(UserSupportPlan, userSupportPlan);
|
||||
await this.invoicesService.payInvoice(newInvoice.id, invoice.user.id, queryRunner);
|
||||
await this.invoicesService.payInvoice(newInvoice.id, invoice.user.id, undefined, queryRunner);
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user