/* |-------------------------------------------------------------------------- | Routes file |-------------------------------------------------------------------------- | | The routes file is used for defining the HTTP routes. | */ import { existsSync, readdirSync } from 'node:fs' import { join } from 'node:path' import { pathToFileURL } from 'node:url' import router from '@adonisjs/core/services/router' import AutoSwagger from 'adonis-autoswagger' import swagger from '#config/swagger' import { middleware } from './kernel.js' async function importIfExists(filePath: string) { if (!existsSync(filePath)) return const fileUrl = pathToFileURL(filePath) await import(fileUrl.href) } /** * Load module routes from: * //routes.(ts|js) */ async function loadModuleRoutesFrom(dir: string) { if (!existsSync(dir)) return const entries = readdirSync(dir, { withFileTypes: true }).filter((d) => d.isDirectory()) for (const entry of entries) { const moduleRoot = join(dir, entry.name) const tsRoutes = join(moduleRoot, 'routes.ts') const jsRoutes = join(moduleRoot, 'routes.js') await importIfExists(tsRoutes) await importIfExists(jsRoutes) } } /** * Load API routes from: * //api/routes.(ts|js) * */ async function loadApiRoutesFrom(dir: string) { if (!existsSync(dir)) return const entries = readdirSync(dir, { withFileTypes: true }).filter((d) => d.isDirectory()) for (const entry of entries) { const apiRoot = join(dir, entry.name, 'api') const tsRoutes = join(apiRoot, 'routes.ts') const jsRoutes = join(apiRoot, 'routes.js') await importIfExists(tsRoutes) await importIfExists(jsRoutes) } } // -------------------------------------------------------------------------- // Load base_modules routes // -------------------------------------------------------------------------- await loadModuleRoutesFrom(join(process.cwd(), 'app', 'base_modules')) // -------------------------------------------------------------------------- // Load modules routes + modules api routes // -------------------------------------------------------------------------- const modulesRoot = join(process.cwd(), 'modules') await loadModuleRoutesFrom(modulesRoot) await loadApiRoutesFrom(modulesRoot) // -------------------------------------------------------------------------- // Module generator endpoints // -------------------------------------------------------------------------- const ModuleController = () => import('#controllers/module_controller') router.get('/makeModule/tables', [ModuleController, 'tables']).use([middleware.auth()]) router.get('/makeModule/columns/:table', [ModuleController, 'columns']).use([middleware.auth()]) router.post('/makeModule/generate', [ModuleController, 'generate']).use([middleware.auth()]) // -------------------------------------------------------------------------- // Swagger / Docs // -------------------------------------------------------------------------- // returns swagger in YAML router.get('/swagger', async () => { return AutoSwagger.default.docs(router.toJSON(), swagger) }) // Renders Swagger-UI and passes YAML-output of /swagger router.get('/docs', async () => { return AutoSwagger.default.ui('/swagger', swagger) // return AutoSwagger.default.scalar("/swagger"); to use Scalar instead. // return AutoSwagger.default.rapidoc("/swagger", "view"); to use RapiDoc instead. })