Initial commit after migration to gitea

This commit is contained in:
2026-01-18 11:27:43 +03:30
parent a21039410c
commit ea4b8eb543
196 changed files with 45567 additions and 9 deletions

View File

@@ -0,0 +1,10 @@
import { forwardRef, Module } from "@nestjs/common";
import { RequestManagementModule } from "src/request-management/request-management.module";
import { AutoCloseRequestService } from "./cron.service";
@Module({
imports: [forwardRef(() => RequestManagementModule)],
providers: [AutoCloseRequestService],
exports: [AutoCloseRequestService],
})
export class CronModule {}

View File

@@ -0,0 +1,95 @@
import { Injectable, Logger } from "@nestjs/common";
import { Cron, CronExpression } from "@nestjs/schedule";
import { RequestManagementDbService } from "src/request-management/entities/db-service/request-management.db.service";
import { SubmitReply } from "src/request-management/entities/schema/request-management.schema";
import { ReqBlameStatus } from "src/Types&Enums/blame-request-management/status.enum";
@Injectable()
export class AutoCloseRequestService {
private readonly logger = new Logger(AutoCloseRequestService.name);
constructor(private readonly requestDb: RequestManagementDbService) {}
async scheduleAutoClose(params: { requestId: string; runAt: Date }) {
await this.requestDb.findAndUpdate(
{ _id: params.requestId },
{ $set: { autoCloseTriggerTime: params.runAt } },
);
this.logger.log(
`Scheduled auto-close for ${params.requestId} at ${params.runAt.toISOString()}`,
);
}
// Runs every hour
@Cron(CronExpression.EVERY_HOUR)
async handleAutoClose() {
const now = new Date();
const threshold = new Date(now.getTime() - 24 * 60 * 60 * 1000);
const requestsToClose = await this.requestDb.findAll({
blameStatus: { $ne: ReqBlameStatus.CloseRequest },
$or: [
{ "expertSubmitReply.firstPartyComment.isAccept": true },
{ "expertSubmitReply.secondPartyComment.isAccept": true },
{ "expertSubmitReplyFinal.firstPartyComment.isAccept": true },
{ "expertSubmitReplyFinal.secondPartyComment.isAccept": true },
],
autoCloseTriggerTime: { $lte: threshold },
});
for (const request of requestsToClose) {
const reply = request.expertSubmitReplyFinal || request.expertSubmitReply;
const isSubmitReply = (reply: any): reply is SubmitReply =>
reply &&
typeof reply === "object" &&
("firstPartyComment" in reply || "secondPartyComment" in reply);
if (isSubmitReply(reply)) {
const firstAccepted = reply.firstPartyComment?.isAccept;
const secondAccepted = reply.secondPartyComment?.isAccept;
if (!firstAccepted || !secondAccepted) {
await this.requestDb.findByIdAndUpdate(request._id.toString(), {
blameStatus: ReqBlameStatus.CloseRequest,
});
this.logger.log(`Auto-closed request ${request._id}`);
}
}
}
}
@Cron(CronExpression.EVERY_DAY_AT_2AM)
async handleBlameFileCleanup() {
this.logger.log("Running scheduled blame file cleanup job...");
const sevenDaysAgo = new Date();
sevenDaysAgo.setDate(sevenDaysAgo.getDate() - 7);
const staleStatuses = [
ReqBlameStatus.PendingForFirstParty,
ReqBlameStatus.PendingForSecondParty,
];
const query = {
createdAt: { $lt: sevenDaysAgo },
blameStatus: { $in: staleStatuses },
};
try {
const result = await this.requestDb.updateMany(query, {
$set: { blameStatus: ReqBlameStatus.CloseRequest },
});
if (result.modifiedCount > 0) {
this.logger.log(
`Successfully closed ${result.modifiedCount} stale blame files.`,
);
} else {
this.logger.log("No stale blame files found to close.");
}
} catch (error) {
this.logger.error("Error during scheduled blame file cleanup:", error);
}
}
}