From ed50dc25f31d0c731ec15662aa27373f8372c313 Mon Sep 17 00:00:00 2001 From: rykuno Date: Sat, 31 Aug 2024 12:54:31 -0500 Subject: [PATCH] refactored controller and jobs --- render.yaml | 4 +- .../api/common/classes/controller.class.ts | 11 +++++ .../common/inferfaces/controller.interface.ts | 7 ++- .../server/api/controllers/iam.controller.ts | 13 +++--- src/lib/server/api/index.ts | 37 ++++++++-------- src/lib/server/api/jobs/auth-cleanup.job.ts | 44 +++++++++++++++++++ src/lib/server/api/packages/lucia.ts | 1 - src/lib/server/api/services/jobs.service.ts | 3 +- 8 files changed, 87 insertions(+), 33 deletions(-) create mode 100644 src/lib/server/api/common/classes/controller.class.ts create mode 100644 src/lib/server/api/jobs/auth-cleanup.job.ts diff --git a/render.yaml b/render.yaml index fbd27a8..fea7eb4 100644 --- a/render.yaml +++ b/render.yaml @@ -11,7 +11,7 @@ services: envVars: - key: DATABASE_URL fromDatabase: - name: tarostack + name: tofustack property: connectionString - key: REDIS_URL fromService: @@ -29,5 +29,5 @@ services: databases: - name: db - databaseName: tarostack + databaseName: tofustack ipAllowList: [] diff --git a/src/lib/server/api/common/classes/controller.class.ts b/src/lib/server/api/common/classes/controller.class.ts new file mode 100644 index 0000000..f6dfc5f --- /dev/null +++ b/src/lib/server/api/common/classes/controller.class.ts @@ -0,0 +1,11 @@ +import { Hono } from "hono"; +import type { HonoTypes } from "../types/hono.type"; +import type { BlankSchema, Env, Schema } from "hono/types"; + +export abstract class Controler { + protected readonly controller: Hono; + constructor() { + this.controller = new Hono(); + } + abstract routes(): Hono; +} \ No newline at end of file diff --git a/src/lib/server/api/common/inferfaces/controller.interface.ts b/src/lib/server/api/common/inferfaces/controller.interface.ts index 6b57bf8..1352a8f 100644 --- a/src/lib/server/api/common/inferfaces/controller.interface.ts +++ b/src/lib/server/api/common/inferfaces/controller.interface.ts @@ -2,7 +2,6 @@ import { Hono } from 'hono'; import type { BlankSchema } from 'hono/types'; import type { HonoTypes } from '../types/hono.type'; -export interface Controller { - // controller: Hono; - routes(): Hono; -} +// export interface Controller { +// routes() +// } diff --git a/src/lib/server/api/controllers/iam.controller.ts b/src/lib/server/api/controllers/iam.controller.ts index 0940ebe..5df1b94 100644 --- a/src/lib/server/api/controllers/iam.controller.ts +++ b/src/lib/server/api/controllers/iam.controller.ts @@ -1,4 +1,4 @@ -import { Hono } from 'hono'; +import { Hono, type Schema } from 'hono'; import { setCookie } from 'hono/cookie'; import { inject, injectable } from 'tsyringe'; import { zValidator } from '@hono/zod-validator'; @@ -8,19 +8,18 @@ import { signInEmailDto } from '../../../dtos/signin-email.dto'; import { updateEmailDto } from '../../../dtos/update-email.dto'; import { verifyEmailDto } from '../../../dtos/verify-email.dto'; import { registerEmailDto } from '../../../dtos/register-email.dto'; -import type { HonoTypes } from '../common/types/hono.type'; -import type { Controller } from '../common/inferfaces/controller.interface'; import { limiter } from '../middlewares/rate-limiter.middlware'; import { requireAuth } from '../middlewares/auth.middleware'; +import { Controler } from '../common/classes/controller.class'; @injectable() -export class IamController implements Controller { - private controller = new Hono(); - +export class IamController extends Controler { constructor( @inject(IamService) private iamService: IamService, @inject(LuciaProvider) private lucia: LuciaProvider, - ) { } + ) { + super(); + } routes() { return this.controller diff --git a/src/lib/server/api/index.ts b/src/lib/server/api/index.ts index 2d38489..c36ac4a 100644 --- a/src/lib/server/api/index.ts +++ b/src/lib/server/api/index.ts @@ -5,36 +5,37 @@ import { container } from 'tsyringe'; import { IamController } from './controllers/iam.controller'; import { env } from './configs/envs.config'; import { validateAuthSession, verifyOrigin } from './middlewares/auth.middleware'; -// import { TestJob } from './jobs/test.job'; -import { glob, globSync } from 'glob'; -import path from 'path'; +import { AuthCleanupJobs } from './jobs/auth-cleanup.job'; -console.log('API SERVER STARTED'); -/* ----------------------------------- Api ---------------------------------- */ -const app = new Hono().basePath('/api'); +/* -------------------------------------------------------------------------- */ +/* App */ +/* -------------------------------------------------------------------------- */ +export const app = new Hono().basePath('/api'); -/* --------------------------- Global Middlewares --------------------------- */ +/* -------------------------------------------------------------------------- */ +/* Global Middlewares */ +/* -------------------------------------------------------------------------- */ app.use(verifyOrigin).use(validateAuthSession); -/* --------------------------------- Routes --------------------------------- */ +/* -------------------------------------------------------------------------- */ +/* Routes */ +/* -------------------------------------------------------------------------- */ const routes = app .route('/iam', container.resolve(IamController).routes()) +/* -------------------------------------------------------------------------- */ +/* Cron Jobs */ +/* -------------------------------------------------------------------------- */ +container.resolve(AuthCleanupJobs).deleteStaleEmailVerificationRequests(); +container.resolve(AuthCleanupJobs).deleteStaleLoginRequests(); + /* -------------------------------------------------------------------------- */ /* Exports */ /* -------------------------------------------------------------------------- */ -export const rpc = hc(env.ORIGIN); +const rpc = hc(env.ORIGIN); export type ApiClient = typeof rpc; export type ApiRoutes = typeof routes; -export { app }; -async function resolveJobs() { - const jobFiles = globSync('**/*.job.*'); - for (const file of jobFiles) { - const module = await import(path.resolve(file)); - container.resolve(module.default) - } -} -resolveJobs(); + diff --git a/src/lib/server/api/jobs/auth-cleanup.job.ts b/src/lib/server/api/jobs/auth-cleanup.job.ts new file mode 100644 index 0000000..629cfee --- /dev/null +++ b/src/lib/server/api/jobs/auth-cleanup.job.ts @@ -0,0 +1,44 @@ +import { inject, injectable } from "tsyringe"; +import { JobsService } from "../services/jobs.service"; + +@injectable() +export class AuthCleanupJobs { + private queue; + + constructor( + @inject(JobsService) private jobsService: JobsService, + ) { + /* ------------------------------ Create Queue ------------------------------ */ + this.queue = this.jobsService.createQueue('test') + + /* ---------------------------- Register Workers ---------------------------- */ + this.worker(); + } + + async deleteStaleEmailVerificationRequests() { + this.queue.add('delete_stale_email_verifiactions', null, { + repeat: { + pattern: '0 0 * * 0' // Runs once a week at midnight on Sunday + } + }) + } + + async deleteStaleLoginRequests() { + this.queue.add('delete_stale_login_requests', null, { + repeat: { + pattern: '0 0 * * 0' // Runs once a week at midnight on Sunday + } + }) + } + + private async worker() { + return this.jobsService.createWorker(this.queue.name, async (job) => { + if (job.name === "delete_stale_email_verifiactions") { + // delete stale email verifications + } + if (job.name === "delete_stale_login_requests") { + // delete stale email verifications + } + }) + } +} \ No newline at end of file diff --git a/src/lib/server/api/packages/lucia.ts b/src/lib/server/api/packages/lucia.ts index 9082a8d..8386e2f 100644 --- a/src/lib/server/api/packages/lucia.ts +++ b/src/lib/server/api/packages/lucia.ts @@ -1,4 +1,3 @@ -import { container } from 'tsyringe'; import { Lucia } from 'lucia'; import { DrizzlePostgreSQLAdapter } from '@lucia-auth/adapter-drizzle'; import { sessionsTable, usersTable } from '../databases/tables'; diff --git a/src/lib/server/api/services/jobs.service.ts b/src/lib/server/api/services/jobs.service.ts index 3bd5f55..15aeaec 100644 --- a/src/lib/server/api/services/jobs.service.ts +++ b/src/lib/server/api/services/jobs.service.ts @@ -4,7 +4,8 @@ import { RedisProvider } from "../providers/redis.provider"; @injectable() export class JobsService { - constructor(@inject(RedisProvider) private readonly redis: RedisProvider) { } + constructor(@inject(RedisProvider) private readonly redis: RedisProvider) { + } createQueue(name: string) { return new Queue(name, { connection: this.redis })