97 lines
3.4 KiB
TypeScript
Executable File
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.
|
|
})
|