Files
alphane.ca/api/src/jobs/base-job.ts
T
2026-06-19 22:20:43 -07:00

39 lines
1.1 KiB
TypeScript

import logger from "@/utils/logger"
// eslint-disable-next-line @typescript-eslint/no-explicit-any
type HasNoArgsConstructor<T> = T extends { new (): any } ? true : false
type CleanConstructorParameters<T extends typeof BaseJob> =
HasNoArgsConstructor<T> extends true ? [] : ConstructorParameters<T>
export class BaseJob {
protected filename: string
// eslint-disable-next-line @typescript-eslint/no-explicit-any
constructor(...args: any[]) {
this.filename = args[0] || __filename
}
static perform<T extends typeof BaseJob>(
this: T,
...args: CleanConstructorParameters<T>
): ReturnType<InstanceType<T>["perform"]> {
try {
const instance = new this(...args)
const { filename } = instance
logger.debug(`## Performing Job: ${filename}`)
return instance.perform()
} catch (error) {
logger.error(`Failed to perform job: ${error}`, { error })
throw new Error(`Failed to perform job: ${error}`)
}
}
// eslint-disable-next-line @typescript-eslint/no-explicit-any
perform(): any {
throw new Error("Not Implemented")
}
}
export default BaseJob