import * as configFunctions from '../functions.config.js'; import { acquireConnection } from './pool.js'; export async function cleanupDatabase(user) { const database = await acquireConnection(); const rightNowMillis = Date.now(); const recordDeleteTimeMillisMin = rightNowMillis - configFunctions.getProperty('settings.adminCleanup.recordDeleteAgeDays') * 86400 * 1000; let inactivatedRecordCount = 0; let purgedRecordCount = 0; inactivatedRecordCount += database .prepare(`update WorkOrderComments set recordDelete_userName = ?, recordDelete_timeMillis = ? where recordDelete_timeMillis is null and workOrderId in ( select workOrderId from WorkOrders where recordDelete_timeMillis is not null)`) .run(user.userName, rightNowMillis).changes; purgedRecordCount += database .prepare('delete from WorkOrderComments where recordDelete_timeMillis <= ?') .run(recordDeleteTimeMillisMin).changes; inactivatedRecordCount += database .prepare(`update WorkOrderLotOccupancies set recordDelete_userName = ?, recordDelete_timeMillis = ? where recordDelete_timeMillis is null and workOrderId in ( select workOrderId from WorkOrders where recordDelete_timeMillis is not null)`) .run(user.userName, rightNowMillis).changes; purgedRecordCount += database .prepare('delete from WorkOrderLotOccupancies where recordDelete_timeMillis <= ?') .run(recordDeleteTimeMillisMin).changes; inactivatedRecordCount += database .prepare(`update WorkOrderLots set recordDelete_userName = ?, recordDelete_timeMillis = ? where recordDelete_timeMillis is null and workOrderId in ( select workOrderId from WorkOrders where recordDelete_timeMillis is not null)`) .run(user.userName, rightNowMillis).changes; purgedRecordCount += database .prepare('delete from WorkOrderLots where recordDelete_timeMillis <= ?') .run(recordDeleteTimeMillisMin).changes; inactivatedRecordCount += database .prepare(`update WorkOrderMilestones set recordDelete_userName = ?, recordDelete_timeMillis = ? where recordDelete_timeMillis is null and workOrderId in ( select workOrderId from WorkOrders where recordDelete_timeMillis is not null)`) .run(user.userName, rightNowMillis).changes; purgedRecordCount += database .prepare('delete from WorkOrderMilestones where recordDelete_timeMillis <= ?') .run(recordDeleteTimeMillisMin).changes; purgedRecordCount += database .prepare(`delete from WorkOrders where recordDelete_timeMillis <= ? and workOrderId not in (select workOrderId from WorkOrderComments) and workOrderId not in (select workOrderId from WorkOrderLotOccupancies) and workOrderId not in (select workOrderId from WorkOrderLots) and workOrderId not in (select workOrderId from WorkOrderMilestones)`) .run(recordDeleteTimeMillisMin).changes; purgedRecordCount += database .prepare(`delete from WorkOrderMilestoneTypes where recordDelete_timeMillis <= ? and workOrderMilestoneTypeId not in ( select workOrderMilestoneTypeId from WorkOrderMilestones)`) .run(recordDeleteTimeMillisMin).changes; purgedRecordCount += database .prepare(`delete from WorkOrderTypes where recordDelete_timeMillis <= ? and workOrderTypeId not in (select workOrderTypeId from WorkOrders)`) .run(recordDeleteTimeMillisMin).changes; inactivatedRecordCount += database .prepare(`update LotOccupancyComments set recordDelete_userName = ?, recordDelete_timeMillis = ? where recordDelete_timeMillis is null and lotOccupancyId in ( select lotOccupancyId from LotOccupancies where recordDelete_timeMillis is not null)`) .run(user.userName, rightNowMillis).changes; purgedRecordCount += database .prepare('delete from LotOccupancyComments where recordDelete_timeMillis <= ?') .run(recordDeleteTimeMillisMin).changes; inactivatedRecordCount += database .prepare(`update LotOccupancyFields set recordDelete_userName = ?, recordDelete_timeMillis = ? where recordDelete_timeMillis is null and lotOccupancyId in (select lotOccupancyId from LotOccupancies where recordDelete_timeMillis is not null)`) .run(user.userName, rightNowMillis).changes; purgedRecordCount += database .prepare('delete from LotOccupancyFields where recordDelete_timeMillis <= ?') .run(recordDeleteTimeMillisMin).changes; inactivatedRecordCount += database .prepare(`update LotOccupancyOccupants set recordDelete_userName = ?, recordDelete_timeMillis = ? where recordDelete_timeMillis is null and lotOccupancyId in (select lotOccupancyId from LotOccupancies where recordDelete_timeMillis is not null)`) .run(user.userName, rightNowMillis).changes; purgedRecordCount += database .prepare('delete from LotOccupancyOccupants where recordDelete_timeMillis <= ?') .run(recordDeleteTimeMillisMin).changes; purgedRecordCount += database .prepare('delete from LotOccupancyFees where recordDelete_timeMillis <= ?') .run(recordDeleteTimeMillisMin).changes; purgedRecordCount += database .prepare('delete from LotOccupancyTransactions where recordDelete_timeMillis <= ?') .run(recordDeleteTimeMillisMin).changes; purgedRecordCount += database .prepare(`delete from LotOccupancies where recordDelete_timeMillis <= ? and lotOccupancyId not in (select lotOccupancyId from LotOccupancyComments) and lotOccupancyId not in (select lotOccupancyId from LotOccupancyFees) and lotOccupancyId not in (select lotOccupancyId from LotOccupancyFields) and lotOccupancyId not in (select lotOccupancyId from LotOccupancyOccupants) and lotOccupancyId not in (select lotOccupancyId from LotOccupancyTransactions) and lotOccupancyId not in (select lotOccupancyId from WorkOrderLotOccupancies)`) .run(recordDeleteTimeMillisMin).changes; inactivatedRecordCount += database .prepare(`update Fees set recordDelete_userName = ?, recordDelete_timeMillis = ? where recordDelete_timeMillis is null and feeCategoryId in (select feeCategoryId from FeeCategories where recordDelete_timeMillis is not null)`) .run(user.userName, rightNowMillis).changes; purgedRecordCount += database .prepare(`delete from Fees where recordDelete_timeMillis <= ? and feeId not in (select feeId from LotOccupancyFees)`) .run(recordDeleteTimeMillisMin).changes; purgedRecordCount += database .prepare(`delete from FeeCategories where recordDelete_timeMillis <= ? and feeCategoryId not in (select feeCategoryId from Fees)`) .run(recordDeleteTimeMillisMin).changes; inactivatedRecordCount += database .prepare(`update OccupancyTypeFields set recordDelete_userName = ?, recordDelete_timeMillis = ? where recordDelete_timeMillis is null and occupancyTypeId in (select occupancyTypeId from OccupancyTypes where recordDelete_timeMillis is not null)`) .run(user.userName, rightNowMillis).changes; purgedRecordCount += database .prepare(`delete from OccupancyTypeFields where recordDelete_timeMillis <= ? and occupancyTypeFieldId not in (select occupancyTypeFieldId from LotOccupancyFields)`) .run(recordDeleteTimeMillisMin).changes; inactivatedRecordCount += database .prepare(`update OccupancyTypePrints set recordDelete_userName = ?, recordDelete_timeMillis = ? where recordDelete_timeMillis is null and occupancyTypeId in (select occupancyTypeId from OccupancyTypes where recordDelete_timeMillis is not null)`) .run(user.userName, rightNowMillis).changes; purgedRecordCount += database .prepare('delete from OccupancyTypePrints where recordDelete_timeMillis <= ?') .run(recordDeleteTimeMillisMin).changes; purgedRecordCount += database .prepare(`delete from OccupancyTypes where recordDelete_timeMillis <= ? and occupancyTypeId not in (select occupancyTypeId from OccupancyTypeFields) and occupancyTypeId not in (select occupancyTypeId from OccupancyTypePrints) and occupancyTypeId not in (select occupancyTypeId from LotOccupancies) and occupancyTypeId not in (select occupancyTypeId from Fees)`) .run(recordDeleteTimeMillisMin).changes; purgedRecordCount += database .prepare(`delete from LotOccupantTypes where recordDelete_timeMillis <= ? and lotOccupantTypeId not in (select lotOccupantTypeId from LotOccupancyOccupants)`) .run(recordDeleteTimeMillisMin).changes; inactivatedRecordCount += database .prepare(`update LotComments set recordDelete_userName = ?, recordDelete_timeMillis = ? where recordDelete_timeMillis is null and lotId in (select lotId from Lots where recordDelete_timeMillis is not null)`) .run(user.userName, rightNowMillis).changes; purgedRecordCount += database .prepare('delete from LotComments where recordDelete_timeMillis <= ?') .run(recordDeleteTimeMillisMin).changes; inactivatedRecordCount += database .prepare(`update LotFields set recordDelete_userName = ?, recordDelete_timeMillis = ? where recordDelete_timeMillis is null and lotId in (select lotId from Lots where recordDelete_timeMillis is not null)`) .run(user.userName, rightNowMillis).changes; purgedRecordCount += database .prepare('delete from LotFields where recordDelete_timeMillis <= ?') .run(recordDeleteTimeMillisMin).changes; inactivatedRecordCount += database .prepare(`update Lots set recordDelete_userName = ?, recordDelete_timeMillis = ? where recordDelete_timeMillis is null and mapId in (select mapId from Maps where recordDelete_timeMillis is not null)`) .run(user.userName, rightNowMillis).changes; purgedRecordCount += database .prepare(`delete from Lots where recordDelete_timeMillis <= ? and lotId not in (select lotId from LotComments) and lotId not in (select lotId from LotFields) and lotId not in (select lotId from LotOccupancies) and lotId not in (select lotId from WorkOrderLots)`) .run(recordDeleteTimeMillisMin).changes; purgedRecordCount += database .prepare(`delete from LotStatuses where recordDelete_timeMillis <= ? and lotStatusId not in (select lotStatusId from Lots)`) .run(recordDeleteTimeMillisMin).changes; inactivatedRecordCount += database .prepare(`update LotTypeFields set recordDelete_userName = ?, recordDelete_timeMillis = ? where recordDelete_timeMillis is null and lotTypeId in (select lotTypeId from LotTypes where recordDelete_timeMillis is not null)`) .run(user.userName, rightNowMillis).changes; purgedRecordCount += database .prepare(`delete from LotTypeFields where recordDelete_timeMillis <= ? and lotTypeFieldId not in (select lotTypeFieldId from LotFields)`) .run(recordDeleteTimeMillisMin).changes; purgedRecordCount += database .prepare(`delete from LotTypes where recordDelete_timeMillis <= ? and lotTypeId not in (select lotTypeId from Lots)`) .run(recordDeleteTimeMillisMin).changes; database.release(); return { inactivatedRecordCount, purgedRecordCount }; } export default cleanupDatabase;