chore: add new access log module

This commit is contained in:
mahyargdz
2025-09-02 16:14:36 +03:30
parent 60deb8937d
commit 672fe9b783
36 changed files with 2066 additions and 41 deletions
+6 -6
View File
@@ -23,22 +23,22 @@ export class InvoicesController {
@ApiOperation({ summary: "create an invoice ==> admin route" })
@PermissionsDec(PermissionEnum.INVOICES)
@Post()
createInvoice(@Body() createDto: CreateInvoiceDto) {
return this.invoiceService.createInvoiceAdmin(createDto);
createInvoice(@Body() createDto: CreateInvoiceDto, @UserDec("id") userId: string) {
return this.invoiceService.createInvoiceAdmin(createDto, userId);
}
@ApiOperation({ summary: "update an invoice ==> admin route" })
@PermissionsDec(PermissionEnum.INVOICES)
@Patch(":id")
updateInvoice(@Param() paramDto: ParamDto, @Body() updateDto: UpdateInvoiceDto) {
return this.invoiceService.updateInvoiceAdmin(paramDto.id, updateDto);
updateInvoice(@Param() paramDto: ParamDto, @Body() updateDto: UpdateInvoiceDto, @UserDec("id") userId: string) {
return this.invoiceService.updateInvoiceAdmin(paramDto.id, updateDto, userId);
}
@ApiOperation({ summary: "delete an invoice ==> admin route" })
@PermissionsDec(PermissionEnum.INVOICES)
@Delete(":id")
deleteInvoice(@Param() paramDto: ParamDto) {
return this.invoiceService.deleteInvoiceAdmin(paramDto.id);
deleteInvoice(@Param() paramDto: ParamDto, @UserDec("id") userId: string) {
return this.invoiceService.deleteInvoiceAdmin(paramDto.id, userId);
}
@ApiOperation({ summary: "get all invoices ==> admin route" })
+2
View File
@@ -10,6 +10,7 @@ import { InvoicesService } from "./providers/invoices.service";
import { InvoiceProcessor } from "./queue/invoice.processor";
import { InvoiceItemsRepository } from "./repositories/invoice-items.repository";
import { InvoicesRepository } from "./repositories/invoices.repository";
import { AccessLogsModule } from "../access-logs/access-logs.module";
import { Discount } from "../discounts/entities/discount.entity";
import { UsageDiscount } from "../discounts/entities/usage-discount.entity";
import { DiscountRepository } from "../discounts/repositories/discounts.repository";
@@ -44,6 +45,7 @@ import { WalletsModule } from "../wallets/wallets.module";
UtilsModule,
NotificationModule,
PaymentsModule,
AccessLogsModule,
],
providers: [InvoicesService, InvoicesRepository, InvoiceItemsRepository, DiscountRepository, UsageDiscountRepository, InvoiceProcessor],
controllers: [InvoicesController],
@@ -6,6 +6,9 @@ import Decimal from "decimal.js";
import { Between, DataSource, In, QueryRunner } from "typeorm";
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";
import { AccessLogService } from "../../access-logs/providers/access-log.service";
import { VerifyOtpWithUserId } from "../../auth/DTO/verify-otp.dto";
import { Discount } from "../../discounts/entities/discount.entity";
import { DiscountType } from "../../discounts/enums/discount-type.enum";
@@ -48,11 +51,12 @@ export class InvoicesService {
private readonly otpService: OTPService,
private readonly smsService: SmsService,
private readonly dataSource: DataSource,
private readonly accessLogService: AccessLogService,
) {}
///********************************** */
async createInvoiceAdmin(createDto: CreateInvoiceDto) {
async createInvoiceAdmin(createDto: CreateInvoiceDto, userId: string) {
const queryRunner = this.dataSource.createQueryRunner();
try {
@@ -79,7 +83,7 @@ export class InvoicesService {
const dueDate = dayjs().add(INVOICE.DUEDATE, "day").toDate();
const invoice = queryRunner.manager.create(this.invoiceRepository.target, {
user: { id: createDto.userId },
user: { id: userId },
totalPrice: totalPrice.add(tax).toNumber(),
originalPrice: totalPrice.add(tax).toNumber(),
items: invoiceItems,
@@ -108,6 +112,15 @@ export class InvoicesService {
});
await this.scheduleInvoiceJobs(invoice, createDto);
await this.accessLogService.logCreate("Invoice", invoice.id, createDto, {
user: { id: userId },
userType: UserType.ADMIN,
actionDescription: `Admin created invoice: ${invoice.numericId}`,
metadata: {
items: invoiceItems.map((item) => item.name).join(", "),
},
});
await queryRunner.commitTransaction();
return {
@@ -128,7 +141,7 @@ export class InvoicesService {
//********************************** */
async updateInvoiceAdmin(invoiceId: string, updateDto: UpdateInvoiceDto) {
async updateInvoiceAdmin(invoiceId: string, updateDto: UpdateInvoiceDto, userId: string) {
const queryRunner = this.dataSource.createQueryRunner();
try {
@@ -191,6 +204,12 @@ export class InvoicesService {
await queryRunner.commitTransaction();
await this.accessLogService.logUpdate("Invoice", invoice.id, updateDto, {
user: { id: userId },
userType: UserType.ADMIN,
actionDescription: `Admin updated invoice: ${invoice.numericId}`,
});
return {
message: InvoiceMessage.INVOICE_UPDATED,
invoice,
@@ -205,7 +224,7 @@ export class InvoicesService {
//********************************** */
async deleteInvoiceAdmin(invoiceId: string) {
async deleteInvoiceAdmin(invoiceId: string, userId: string) {
const queryRunner = this.dataSource.createQueryRunner();
try {
@@ -226,6 +245,12 @@ 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,
actionDescription: `Admin deleted invoice: ${invoice.numericId}`,
});
await queryRunner.commitTransaction();
return {
@@ -239,9 +264,7 @@ export class InvoicesService {
}
}
/**
* Clean up all queue jobs related to a specific invoice
*/
//################################################
private async cleanupInvoiceQueueJobs(invoiceId: string): Promise<void> {
try {
this.logger.log(`Starting cleanup of queue jobs for invoice: ${invoiceId}`);
@@ -334,6 +357,17 @@ export class InvoicesService {
items,
);
await this.accessLogService.logUserAction(
OperationType.APPROVE,
"Invoice",
invoiceId,
`user approved invoice request: ${invoice.numericId}`,
{
user: { id: userId },
userType: UserType.USER,
},
);
await queryRunner.commitTransaction();
return {
@@ -380,6 +414,17 @@ export class InvoicesService {
await this.otpService.delOtpFormCache(user.phone, "INVOICE_VERIFY");
await this.accessLogService.logUserAction(
OperationType.APPROVE,
"Invoice",
invoiceId,
`user approved invoice by user: ${invoice.numericId}`,
{
user: { id: userId },
userType: UserType.USER,
},
);
await queryRunner.commitTransaction();
return {
@@ -739,6 +784,11 @@ 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 (transactionStarted) await queryRunner.commitTransaction();
return {