39 lines
1.1 KiB
TypeScript
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
|