import { caseFactory, Cases } from "../lib/case-utils"; import { log } from "../lib/log"; import { dialectStrategyFactory } from "../lib/strategy-factory"; import { AuthorizationLevel, DbDialectStrategy, ShadrizConfig, ShadrizProcessor, } from "../lib/types"; import { insertTextAfterIfNotExists, renderTemplate } from "../lib/utils"; interface JoinOpts { leftTable: string; joinTable: string; rightTable: string; authorizationLevel: AuthorizationLevel; } export class JoinProcessor implements ShadrizProcessor { opts: ShadrizConfig; dependencies: string[] = []; devDependencies: string[] = []; shadcnComponents: string[] = []; dbDialectStrategy: DbDialectStrategy; joinOpts: JoinOpts; leftCaseVariants: Cases; joinCaseVariants: Cases; rightCaseVariants: Cases; constructor(opts: ShadrizConfig, joinOpts: JoinOpts) { this.dbDialectStrategy = dialectStrategyFactory(opts.dbDialect); this.opts = opts; this.joinOpts = joinOpts; this.leftCaseVariants = caseFactory(joinOpts.leftTable); this.joinCaseVariants = caseFactory(joinOpts.joinTable); this.rightCaseVariants = caseFactory(joinOpts.rightTable); } async init() { await this.render(); } async render() { // add link to table insertTextAfterIfNotExists( `components/${this.joinOpts.authorizationLevel}/${this.leftCaseVariants.pluralKebabCase}/${this.leftCaseVariants.singularKebabCase}-table.tsx`, "{/* [CODE_MARK table-actions] */}", `\n ` ); // create the management page renderTemplate({ inputPath: "join-processor/app/table/[id]/join/page.tsx.hbs", outputPath: `app/${this.authorizationRouteGroup()}${ this.leftCaseVariants.pluralKebabCase }/[id]/${this.joinCaseVariants.pluralKebabCase}/page.tsx`, data: { leftCaseVariants: this.leftCaseVariants, joinCaseVariants: this.joinCaseVariants, rightCaseVariants: this.rightCaseVariants, }, }); // create the update action renderTemplate({ inputPath: "join-processor/actions/update-joins.ts.hbs", outputPath: `actions/${this.joinOpts.authorizationLevel}/${this.leftCaseVariants.pluralKebabCase}/update-${this.joinCaseVariants.pluralKebabCase}.ts`, data: { leftCaseVariants: this.leftCaseVariants, joinCaseVariants: this.joinCaseVariants, rightCaseVariants: this.rightCaseVariants, }, }); // create the update form renderTemplate({ inputPath: "join-processor/components/table/update-joins-form.tsx.hbs", outputPath: `components/${this.joinOpts.authorizationLevel}/${this.leftCaseVariants.pluralKebabCase}/${this.joinCaseVariants.pluralKebabCase}-update-form.tsx`, data: { leftCaseVariants: this.leftCaseVariants, joinCaseVariants: this.joinCaseVariants, rightCaseVariants: this.rightCaseVariants, }, }); } authorizationRouteGroup() { switch (this.joinOpts.authorizationLevel) { case "admin": return "(admin)/admin/"; case "private": return "(private)/"; case "public": return "(public)/"; default: throw new Error( "invalid authorization level " + this.joinOpts.authorizationLevel ); } } printCompletionMessage() { log.success("join scaffold success"); } }