templating api
This commit is contained in:
@@ -0,0 +1,38 @@
|
||||
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
|
||||
Reference in New Issue
Block a user