@cityssm/worktech-api
Version:
Integrations with the WorkTech (Pearl) work order management system.
77 lines (64 loc) • 2.32 kB
text/typescript
import { NodeCache } from '@cacheable/node-cache'
import { type mssql, connect } from '@cityssm/mssql-multi-pool'
import { cacheTimeToLiveSeconds } from '../../apiConfig.js'
import type { ResourceItem } from './types.js'
const sql = `SELECT [ITMSysID] as itemSystemId,
[] as itemId,
coalesce([DESC], '') as itemDescription,
coalesce([ItemClass], '') as itemClass,
coalesce([Type], '') as itemType,
coalesce([Brand], '') as itemBrand,
coalesce([Model], '') as itemModel,
[] as itemModelYear,
coalesce([Serial], '') as serialNumber,
coalesce([Status], '') as itemStatus,
coalesce([Location], '') as location,
coalesce([Dept], '') as department,
coalesce([Division], '') as division,
coalesce([Company], '') as company,
coalesce([FlType], '') as fuelType,
coalesce([ExJob_ID], '') as expenseJobId,
coalesce([ExActv_ID], '') as expenseActivityId,
coalesce([ExObjCode], '') as expenseObjectCode,
coalesce([RevJob_ID], '') as revenueJobId,
coalesce([RevActv_ID], '') as revenueActivityId,
coalesce([RevObjCode], '') as revenueObjectCode,
[] as stock,
coalesce([Units], '') as unit,
[] as unitCost,
[] as quantityOnHand,
coalesce([ExtItem_ID], '') as externalItemId,
coalesce([Comments], '') as comments
FROM [WMITM] WITH (NOLOCK)
where [Type] not in ('Employee', 'Equipment')`
const cache = new NodeCache<ResourceItem>({
stdTTL: cacheTimeToLiveSeconds
})
/**
* Retrieves an item.
* @param mssqlConfig - SQL Server configuration.
* @param itemId - The item id.
* @param bypassCache - Whether to bypass the cache
* @returns - The item, if available.
*/
export async function getItemByItemId(
mssqlConfig: mssql.config,
itemId: string,
bypassCache = false
): Promise<ResourceItem | undefined> {
let item = bypassCache ? undefined : cache.get(itemId)
if (item !== undefined) {
return item
}
const pool = await connect(mssqlConfig)
const itemResult = (await pool
.request()
.input('itemId', itemId)
.query(`${sql} and Item_ID = @itemId`)) as mssql.IResult<ResourceItem>
if (itemResult.recordset.length === 0) {
return undefined
}
item = itemResult.recordset[0]
cache.set(itemId, item)
return item
}