sunrise-cms/helpers/lotOccupancyDB/moveRecord.ts

187 lines
4.1 KiB
TypeScript

import type sqlite from 'better-sqlite3'
import { acquireConnection } from './pool.js'
import { clearCacheByTableName } from '../functions.cache.js'
import { updateRecordOrderNumber } from './updateRecordOrderNumber.js'
type RecordTable =
| 'FeeCategories'
| 'LotOccupantTypes'
| 'LotStatuses'
| 'LotTypes'
| 'OccupancyTypes'
| 'WorkOrderMilestoneTypes'
| 'WorkOrderTypes'
const recordIdColumns = new Map<RecordTable, string>()
recordIdColumns.set('FeeCategories', 'feeCategoryId')
recordIdColumns.set('LotOccupantTypes', 'lotOccupantTypeId')
recordIdColumns.set('LotStatuses', 'lotStatusId')
recordIdColumns.set('LotTypes', 'lotTypeId')
recordIdColumns.set('OccupancyTypes', 'occupancyTypeId')
recordIdColumns.set('WorkOrderMilestoneTypes', 'workOrderMilestoneTypeId')
recordIdColumns.set('WorkOrderTypes', 'workOrderTypeId')
function getCurrentOrderNumber(
recordTable: RecordTable,
recordId: number | string,
database: sqlite.Database
): number {
const currentOrderNumber: number = database
.prepare(
`select orderNumber
from ${recordTable}
where ${recordIdColumns.get(recordTable)!} = ?`
)
.get(recordId).orderNumber
return currentOrderNumber
}
export async function moveRecordDown(
recordTable: RecordTable,
recordId: number
): Promise<boolean> {
const database = await acquireConnection()
const currentOrderNumber = getCurrentOrderNumber(
recordTable,
recordId,
database
)
database
.prepare(
`update ${recordTable}
set orderNumber = orderNumber - 1
where recordDelete_timeMillis is null
and orderNumber = ? + 1`
)
.run(currentOrderNumber)
const success = updateRecordOrderNumber(
recordTable,
recordId,
currentOrderNumber + 1,
database
)
database.release()
clearCacheByTableName(recordTable)
return success
}
export async function moveRecordDownToBottom(
recordTable: RecordTable,
recordId: number
): Promise<boolean> {
const database = await acquireConnection()
const currentOrderNumber = getCurrentOrderNumber(
recordTable,
recordId,
database
)
const maxOrderNumber: number = database
.prepare(
`select max(orderNumber) as maxOrderNumber
from ${recordTable}
where recordDelete_timeMillis is null`
)
.get().maxOrderNumber
if (currentOrderNumber !== maxOrderNumber) {
updateRecordOrderNumber(recordTable, recordId, maxOrderNumber + 1, database)
database
.prepare(
`update ${recordTable}
set orderNumber = orderNumber - 1
where recordDelete_timeMillis is null
and orderNumber > ?`
)
.run(currentOrderNumber)
}
database.release()
clearCacheByTableName(recordTable)
return true
}
export async function moveRecordUp(
recordTable: RecordTable,
recordId: number
): Promise<boolean> {
const database = await acquireConnection()
const currentOrderNumber = getCurrentOrderNumber(
recordTable,
recordId,
database
)
if (currentOrderNumber <= 0) {
database.release()
return true
}
database
.prepare(
`update ${recordTable}
set orderNumber = orderNumber + 1
where recordDelete_timeMillis is null
and orderNumber = ? - 1`
)
.run(currentOrderNumber)
const success = updateRecordOrderNumber(
recordTable,
recordId,
currentOrderNumber - 1,
database
)
database.release()
clearCacheByTableName(recordTable)
return success
}
export async function moveRecordUpToTop(
recordTable: RecordTable,
recordId: number
): Promise<boolean> {
const database = await acquireConnection()
const currentOrderNumber = getCurrentOrderNumber(
recordTable,
recordId,
database
)
if (currentOrderNumber > 0) {
updateRecordOrderNumber(recordTable, recordId, -1, database)
database
.prepare(
`update ${recordTable}
set orderNumber = orderNumber + 1
where recordDelete_timeMillis is null
and orderNumber < ?`
)
.run(currentOrderNumber)
}
database.release()
clearCacheByTableName(recordTable)
return true
}