Files

97 lines
3.4 KiB
TypeScript
Executable File

/*
|--------------------------------------------------------------------------
| 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:
* <dir>/<Module>/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:
* <dir>/<Module>/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.
})