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
+6 -3
View File
@@ -1927,6 +1927,9 @@ export const registerRoutes = async (
identityDAL identityDAL
}); });
const approvalRequestDAL = approvalRequestDALFactory(db);
const approvalRequestGrantsDAL = approvalRequestGrantsDALFactory(db);
// DAILY // DAILY
const dailyResourceCleanUp = dailyResourceCleanUpQueueServiceFactory({ const dailyResourceCleanUp = dailyResourceCleanUpQueueServiceFactory({
scimService, scimService,
@@ -1942,7 +1945,9 @@ export const registerRoutes = async (
serviceTokenService, serviceTokenService,
orgService, orgService,
userNotificationDAL, userNotificationDAL,
keyValueStoreDAL keyValueStoreDAL,
approvalRequestDAL,
approvalRequestGrantsDAL
}); });
const healthAlert = healthAlertServiceFactory({ const healthAlert = healthAlertServiceFactory({
@@ -2423,7 +2428,6 @@ export const registerRoutes = async (
gatewayV2Service gatewayV2Service
}); });
const approvalRequestGrantsDAL = approvalRequestGrantsDALFactory(db);
const approvalPolicyDAL = approvalPolicyDALFactory(db); const approvalPolicyDAL = approvalPolicyDALFactory(db);
const pamAccountService = pamAccountServiceFactory({ const pamAccountService = pamAccountServiceFactory({
@@ -2469,7 +2473,6 @@ export const registerRoutes = async (
const approvalPolicyStepsDAL = approvalPolicyStepsDALFactory(db); const approvalPolicyStepsDAL = approvalPolicyStepsDALFactory(db);
const approvalPolicyStepApproversDAL = approvalPolicyStepApproversDALFactory(db); const approvalPolicyStepApproversDAL = approvalPolicyStepApproversDALFactory(db);
const approvalRequestDAL = approvalRequestDALFactory(db);
const approvalRequestStepsDAL = approvalRequestStepsDALFactory(db); const approvalRequestStepsDAL = approvalRequestStepsDALFactory(db);
const approvalRequestStepEligibleApproversDAL = approvalRequestStepEligibleApproversDALFactory(db); const approvalRequestStepEligibleApproversDAL = approvalRequestStepEligibleApproversDALFactory(db);
const approvalRequestApprovalsDAL = approvalRequestApprovalsDALFactory(db); const approvalRequestApprovalsDAL = approvalRequestApprovalsDALFactory(db);
@@ -3,7 +3,12 @@ import { TableName, TApprovalRequestApprovals } from "@app/db/schemas";
import { DatabaseError } from "@app/lib/errors"; import { DatabaseError } from "@app/lib/errors";
import { ormify } from "@app/lib/knex"; 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"; import { ApprovalPolicyStep } from "./approval-policy-types";
// Approval Policy // 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 // Approval Request Steps
@@ -297,7 +316,22 @@ export const approvalRequestStepEligibleApproversDALFactory = (db: TDbClient) =>
export type TApprovalRequestGrantsDALFactory = ReturnType<typeof approvalRequestGrantsDALFactory>; export type TApprovalRequestGrantsDALFactory = ReturnType<typeof approvalRequestGrantsDALFactory>;
export const approvalRequestGrantsDALFactory = (db: TDbClient) => { export const approvalRequestGrantsDALFactory = (db: TDbClient) => {
const orm = ormify(db, TableName.ApprovalRequestGrants); 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 // Approval Request Approvals
@@ -7,6 +7,7 @@ import { logger } from "@app/lib/logger";
import { QueueJobs, QueueName, TQueueServiceFactory } from "@app/queue"; import { QueueJobs, QueueName, TQueueServiceFactory } from "@app/queue";
import { TUserNotificationDALFactory } from "@app/services/notification/user-notification-dal"; 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 { TIdentityAccessTokenDALFactory } from "../identity-access-token/identity-access-token-dal";
import { TIdentityUaClientSecretDALFactory } from "../identity-ua/identity-ua-client-secret-dal"; import { TIdentityUaClientSecretDALFactory } from "../identity-ua/identity-ua-client-secret-dal";
import { TOrgServiceFactory } from "../org/org-service"; import { TOrgServiceFactory } from "../org/org-service";
@@ -31,6 +32,8 @@ type TDailyResourceCleanUpQueueServiceFactoryDep = {
userNotificationDAL: Pick<TUserNotificationDALFactory, "pruneNotifications">; userNotificationDAL: Pick<TUserNotificationDALFactory, "pruneNotifications">;
keyValueStoreDAL: Pick<TKeyValueStoreDALFactory, "pruneExpiredKeys">; keyValueStoreDAL: Pick<TKeyValueStoreDALFactory, "pruneExpiredKeys">;
scimService: Pick<TScimServiceFactory, "notifyExpiringTokens">; scimService: Pick<TScimServiceFactory, "notifyExpiringTokens">;
approvalRequestDAL: Pick<TApprovalRequestDALFactory, "markExpiredRequests">;
approvalRequestGrantsDAL: Pick<TApprovalRequestGrantsDALFactory, "markExpiredGrants">;
}; };
export type TDailyResourceCleanUpQueueServiceFactory = ReturnType<typeof dailyResourceCleanUpQueueServiceFactory>; export type TDailyResourceCleanUpQueueServiceFactory = ReturnType<typeof dailyResourceCleanUpQueueServiceFactory>;
@@ -49,7 +52,9 @@ export const dailyResourceCleanUpQueueServiceFactory = ({
scimService, scimService,
orgService, orgService,
userNotificationDAL, userNotificationDAL,
keyValueStoreDAL keyValueStoreDAL,
approvalRequestDAL,
approvalRequestGrantsDAL
}: TDailyResourceCleanUpQueueServiceFactoryDep) => { }: TDailyResourceCleanUpQueueServiceFactoryDep) => {
const appCfg = getConfig(); const appCfg = getConfig();
@@ -94,6 +99,8 @@ export const dailyResourceCleanUpQueueServiceFactory = ({
await auditLogDAL.pruneAuditLog(); await auditLogDAL.pruneAuditLog();
await userNotificationDAL.pruneNotifications(); await userNotificationDAL.pruneNotifications();
await keyValueStoreDAL.pruneExpiredKeys(); await keyValueStoreDAL.pruneExpiredKeys();
await approvalRequestDAL.markExpiredRequests();
await approvalRequestGrantsDAL.markExpiredGrants();
logger.info(`${QueueName.DailyResourceCleanUp}: queue task completed`); logger.info(`${QueueName.DailyResourceCleanUp}: queue task completed`);
} catch (error) { } catch (error) {
logger.error(error, `${QueueName.DailyResourceCleanUp}: resource cleanup failed`); logger.error(error, `${QueueName.DailyResourceCleanUp}: resource cleanup failed`);