sunrise-cms/database/cleanupDatabase.ts

424 lines
12 KiB
TypeScript

import { daysToMillis } from '@cityssm/to-millis'
import { getConfigProperty } from '../helpers/config.helpers.js'
import { acquireConnection } from './pool.js'
export default async function cleanupDatabase(
user: User
): Promise<{ inactivatedRecordCount: number; purgedRecordCount: number }> {
const database = await acquireConnection()
const rightNowMillis = Date.now()
const recordDeleteTimeMillisMin =
rightNowMillis -
daysToMillis(getConfigProperty('settings.adminCleanup.recordDeleteAgeDays'))
let inactivatedRecordCount = 0
let purgedRecordCount = 0
/*
* Work Order Comments
*/
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
/*
* Work Order Contracts
*/
inactivatedRecordCount += database
.prepare(
`update WorkOrderContracts
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 WorkOrderContracts where recordDelete_timeMillis <= ?'
)
.run(recordDeleteTimeMillisMin).changes
/*
* Work Order Burial Sites
*/
inactivatedRecordCount += database
.prepare(
`update WorkOrderBurialSites
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 WorkOrderBurialSites where recordDelete_timeMillis <= ?'
)
.run(recordDeleteTimeMillisMin).changes
/*
* Work Order Milestones
*/
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
/*
* Work Orders
*/
purgedRecordCount += database
.prepare(
`delete from WorkOrders
where recordDelete_timeMillis <= ?
and workOrderId not in (select workOrderId from WorkOrderComments)
and workOrderId not in (select workOrderId from WorkOrderContracts)
and workOrderId not in (select workOrderId from WorkOrderBurialSites)
and workOrderId not in (select workOrderId from WorkOrderMilestones)`
)
.run(recordDeleteTimeMillisMin).changes
/*
* Work Order Milestone Types
*/
purgedRecordCount += database
.prepare(
`delete from WorkOrderMilestoneTypes
where recordDelete_timeMillis <= ?
and workOrderMilestoneTypeId not in (
select workOrderMilestoneTypeId from WorkOrderMilestones)`
)
.run(recordDeleteTimeMillisMin).changes
/*
* Work Order Types
*/
purgedRecordCount += database
.prepare(
`delete from WorkOrderTypes
where recordDelete_timeMillis <= ?
and workOrderTypeId not in (select workOrderTypeId from WorkOrders)`
)
.run(recordDeleteTimeMillisMin).changes
/*
* Burial Site Contract Comments
*/
inactivatedRecordCount += database
.prepare(
`update ContractComments
set recordDelete_userName = ?,
recordDelete_timeMillis = ?
where recordDelete_timeMillis is null
and contractId in (
select contractId from Contracts where recordDelete_timeMillis is not null)`
)
.run(user.userName, rightNowMillis).changes
purgedRecordCount += database
.prepare(
'delete from ContractComments where recordDelete_timeMillis <= ?'
)
.run(recordDeleteTimeMillisMin).changes
/*
* Burial Site Contract Fields
*/
inactivatedRecordCount += database
.prepare(
`update ContractFields
set recordDelete_userName = ?,
recordDelete_timeMillis = ?
where recordDelete_timeMillis is null
and contractId in (select contractId from Contracts where recordDelete_timeMillis is not null)`
)
.run(user.userName, rightNowMillis).changes
purgedRecordCount += database
.prepare(
'delete from ContractFields where recordDelete_timeMillis <= ?'
)
.run(recordDeleteTimeMillisMin).changes
/*
* Burial Site Contract Fees/Transactions
* - Maintain financials, do not delete related.
*/
purgedRecordCount += database
.prepare(
'delete from ContractFees where recordDelete_timeMillis <= ?'
)
.run(recordDeleteTimeMillisMin).changes
purgedRecordCount += database
.prepare(
'delete from ContractTransactions where recordDelete_timeMillis <= ?'
)
.run(recordDeleteTimeMillisMin).changes
/*
* Burial Site Contracts
*/
purgedRecordCount += database
.prepare(
`delete from Contracts
where recordDelete_timeMillis <= ?
and contractId not in (select contractId from ContractComments)
and contractId not in (select contractId from ContractFees)
and contractId not in (select contractId from ContractFields)
and contractId not in (select contractId from ContractInterments)
and contractId not in (select contractId from ContractTransactions)
and contractId not in (select contractId from WorkOrderContracts)`
)
.run(recordDeleteTimeMillisMin).changes
/*
* Fees
*/
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 ContractFees)`
)
.run(recordDeleteTimeMillisMin).changes
/*
* Fee Categories
*/
purgedRecordCount += database
.prepare(
`delete from FeeCategories
where recordDelete_timeMillis <= ?
and feeCategoryId not in (select feeCategoryId from Fees)`
)
.run(recordDeleteTimeMillisMin).changes
/*
* Contract Type Fields
*/
inactivatedRecordCount += database
.prepare(
`update ContractTypeFields
set recordDelete_userName = ?,
recordDelete_timeMillis = ?
where recordDelete_timeMillis is null
and contractTypeId in (select contractTypeId from ContractTypes where recordDelete_timeMillis is not null)`
)
.run(user.userName, rightNowMillis).changes
purgedRecordCount += database
.prepare(
`delete from ContractTypeFields
where recordDelete_timeMillis <= ?
and contractTypeFieldId not in (select contractTypeFieldId from ContractFields)`
)
.run(recordDeleteTimeMillisMin).changes
/*
* Contract Type Prints
*/
inactivatedRecordCount += database
.prepare(
`update ContractTypePrints
set recordDelete_userName = ?,
recordDelete_timeMillis = ?
where recordDelete_timeMillis is null
and contractTypeId in (select contractTypeId from ContractTypes where recordDelete_timeMillis is not null)`
)
.run(user.userName, rightNowMillis).changes
purgedRecordCount += database
.prepare(
'delete from ContractTypePrints where recordDelete_timeMillis <= ?'
)
.run(recordDeleteTimeMillisMin).changes
/*
* Contract Types
*/
purgedRecordCount += database
.prepare(
`delete from ContractTypes
where recordDelete_timeMillis <= ?
and contractTypeId not in (select contractTypeId from ContractTypeFields)
and contractTypeId not in (select contractTypeId from ContractTypePrints)
and contractTypeId not in (select contractTypeId from Contracts)
and contractTypeId not in (select contractTypeId from Fees)`
)
.run(recordDeleteTimeMillisMin).changes
/*
* Burial Site Comments
*/
inactivatedRecordCount += database
.prepare(
`update BurialSiteComments
set recordDelete_userName = ?,
recordDelete_timeMillis = ?
where recordDelete_timeMillis is null
and burialSiteId in (select burialSiteId from BurialSites where recordDelete_timeMillis is not null)`
)
.run(user.userName, rightNowMillis).changes
purgedRecordCount += database
.prepare(
'delete from BurialSiteComments where recordDelete_timeMillis <= ?'
)
.run(recordDeleteTimeMillisMin).changes
/*
* Burial Site Fields
*/
inactivatedRecordCount += database
.prepare(
`update BurialSiteFields
set recordDelete_userName = ?,
recordDelete_timeMillis = ?
where recordDelete_timeMillis is null
and burialSiteId in (select burialSiteId from BurialSites where recordDelete_timeMillis is not null)`
)
.run(user.userName, rightNowMillis).changes
purgedRecordCount += database
.prepare('delete from BurialSiteFields where recordDelete_timeMillis <= ?')
.run(recordDeleteTimeMillisMin).changes
/*
* Burial Sites
*/
inactivatedRecordCount += database
.prepare(
`update BurialSites
set recordDelete_userName = ?,
recordDelete_timeMillis = ?
where recordDelete_timeMillis is null
and cemeteryId in (select cemeteryId from Cemeteries where recordDelete_timeMillis is not null)`
)
.run(user.userName, rightNowMillis).changes
purgedRecordCount += database
.prepare(
`delete from BurialSites
where recordDelete_timeMillis <= ?
and burialSiteId not in (select burialSiteId from BurialSiteComments)
and burialSiteId not in (select burialSiteId from BurialSiteFields)
and burialSiteId not in (select burialSiteId from Contracts)
and burialSiteId not in (select burialSiteId from WorkOrderBurialSites)`
)
.run(recordDeleteTimeMillisMin).changes
/*
* Burial Site Statuses
*/
purgedRecordCount += database
.prepare(
`delete from BurialSiteStatuses
where recordDelete_timeMillis <= ?
and burialSiteStatusId not in (select burialSiteStatusId from BurialSites)`
)
.run(recordDeleteTimeMillisMin).changes
/*
* Burial Site Type Fields
*/
inactivatedRecordCount += database
.prepare(
`update BurialSiteTypeFields
set recordDelete_userName = ?,
recordDelete_timeMillis = ?
where recordDelete_timeMillis is null
and burialSiteTypeId in (select burialSiteTypeId from BurialSiteTypes where recordDelete_timeMillis is not null)`
)
.run(user.userName, rightNowMillis).changes
purgedRecordCount += database
.prepare(
`delete from BurialSiteTypeFields
where recordDelete_timeMillis <= ?
and burialSiteTypeFieldId not in (select burialSiteTypeFieldId from BurialSiteFields)`
)
.run(recordDeleteTimeMillisMin).changes
/*
* Burial Site Types
*/
purgedRecordCount += database
.prepare(
`delete from BurialSiteTypes
where recordDelete_timeMillis <= ?
and burialSiteTypeId not in (select burialSiteTypeId from BurialSites)`
)
.run(recordDeleteTimeMillisMin).changes
database.release()
return {
inactivatedRecordCount,
purgedRecordCount
}
}