request & grant cleanup job

This commit is contained in:
x032205
2025-12-08 00:25:51 -05:00
parent 4f41673c38
commit 1d7ab2af69
3 changed files with 51 additions and 7 deletions

View File

@@ -1927,6 +1927,9 @@ export const registerRoutes = async (
identityDAL
});
const approvalRequestDAL = approvalRequestDALFactory(db);
const approvalRequestGrantsDAL = approvalRequestGrantsDALFactory(db);
// DAILY
const dailyResourceCleanUp = dailyResourceCleanUpQueueServiceFactory({
scimService,
@@ -1942,7 +1945,9 @@ export const registerRoutes = async (
serviceTokenService,
orgService,
userNotificationDAL,
keyValueStoreDAL
keyValueStoreDAL,
approvalRequestDAL,
approvalRequestGrantsDAL
});
const healthAlert = healthAlertServiceFactory({
@@ -2423,7 +2428,6 @@ export const registerRoutes = async (
gatewayV2Service
});
const approvalRequestGrantsDAL = approvalRequestGrantsDALFactory(db);
const approvalPolicyDAL = approvalPolicyDALFactory(db);
const pamAccountService = pamAccountServiceFactory({
@@ -2469,7 +2473,6 @@ export const registerRoutes = async (
const approvalPolicyStepsDAL = approvalPolicyStepsDALFactory(db);
const approvalPolicyStepApproversDAL = approvalPolicyStepApproversDALFactory(db);
const approvalRequestDAL = approvalRequestDALFactory(db);
const approvalRequestStepsDAL = approvalRequestStepsDALFactory(db);
const approvalRequestStepEligibleApproversDAL = approvalRequestStepEligibleApproversDALFactory(db);
const approvalRequestApprovalsDAL = approvalRequestApprovalsDALFactory(db);

View File

@@ -3,7 +3,12 @@ import { TableName, TApprovalRequestApprovals } from "@app/db/schemas";
import { DatabaseError } from "@app/lib/errors";
import { ormify } from "@app/lib/knex";
import { ApprovalPolicyType, ApproverType } from "./approval-policy-enums";
import {
ApprovalPolicyType,
ApprovalRequestGrantStatus,
ApprovalRequestStatus,
ApproverType
} from "./approval-policy-enums";
import { ApprovalPolicyStep } from "./approval-policy-types";
// Approval Policy
@@ -274,7 +279,21 @@ export const approvalRequestDALFactory = (db: TDbClient) => {
}
};
return { ...orm, findStepsByRequestId, findByProjectId };
const markExpiredRequests = async () => {
try {
const result = await db(TableName.ApprovalRequests)
.where("status", ApprovalRequestStatus.Pending)
.whereNotNull("expiresAt")
.where("expiresAt", "<", new Date())
.update({ status: ApprovalRequestStatus.Expired });
return result;
} catch (error) {
throw new DatabaseError({ error, name: "Mark expired approval requests" });
}
};
return { ...orm, findStepsByRequestId, findByProjectId, markExpiredRequests };
};
// Approval Request Steps
@@ -297,7 +316,22 @@ export const approvalRequestStepEligibleApproversDALFactory = (db: TDbClient) =>
export type TApprovalRequestGrantsDALFactory = ReturnType<typeof approvalRequestGrantsDALFactory>;
export const approvalRequestGrantsDALFactory = (db: TDbClient) => {
const orm = ormify(db, TableName.ApprovalRequestGrants);
return orm;
const markExpiredGrants = async () => {
try {
const result = await db(TableName.ApprovalRequestGrants)
.where("status", ApprovalRequestGrantStatus.Active)
.whereNotNull("expiresAt")
.where("expiresAt", "<", new Date())
.update({ status: ApprovalRequestGrantStatus.Expired });
return result;
} catch (error) {
throw new DatabaseError({ error, name: "Mark expired approval grants" });
}
};
return { ...orm, markExpiredGrants };
};
// Approval Request Approvals

View File

@@ -7,6 +7,7 @@ import { logger } from "@app/lib/logger";
import { QueueJobs, QueueName, TQueueServiceFactory } from "@app/queue";
import { TUserNotificationDALFactory } from "@app/services/notification/user-notification-dal";
import { TApprovalRequestDALFactory, TApprovalRequestGrantsDALFactory } from "../approval-policy/approval-policy-dal";
import { TIdentityAccessTokenDALFactory } from "../identity-access-token/identity-access-token-dal";
import { TIdentityUaClientSecretDALFactory } from "../identity-ua/identity-ua-client-secret-dal";
import { TOrgServiceFactory } from "../org/org-service";
@@ -31,6 +32,8 @@ type TDailyResourceCleanUpQueueServiceFactoryDep = {
userNotificationDAL: Pick<TUserNotificationDALFactory, "pruneNotifications">;
keyValueStoreDAL: Pick<TKeyValueStoreDALFactory, "pruneExpiredKeys">;
scimService: Pick<TScimServiceFactory, "notifyExpiringTokens">;
approvalRequestDAL: Pick<TApprovalRequestDALFactory, "markExpiredRequests">;
approvalRequestGrantsDAL: Pick<TApprovalRequestGrantsDALFactory, "markExpiredGrants">;
};
export type TDailyResourceCleanUpQueueServiceFactory = ReturnType<typeof dailyResourceCleanUpQueueServiceFactory>;
@@ -49,7 +52,9 @@ export const dailyResourceCleanUpQueueServiceFactory = ({
scimService,
orgService,
userNotificationDAL,
keyValueStoreDAL
keyValueStoreDAL,
approvalRequestDAL,
approvalRequestGrantsDAL
}: TDailyResourceCleanUpQueueServiceFactoryDep) => {
const appCfg = getConfig();
@@ -94,6 +99,8 @@ export const dailyResourceCleanUpQueueServiceFactory = ({
await auditLogDAL.pruneAuditLog();
await userNotificationDAL.pruneNotifications();
await keyValueStoreDAL.pruneExpiredKeys();
await approvalRequestDAL.markExpiredRequests();
await approvalRequestGrantsDAL.markExpiredGrants();
logger.info(`${QueueName.DailyResourceCleanUp}: queue task completed`);
} catch (error) {
logger.error(error, `${QueueName.DailyResourceCleanUp}: resource cleanup failed`);