mirror of
https://github.com/directus/directus.git
synced 2026-01-26 02:18:15 -05:00
Add extensions service and routes
This commit is contained in:
@@ -6,3 +6,5 @@ DB_PORT=5432
|
||||
DB_NAME="directus"
|
||||
DB_USER="postgres"
|
||||
DB_PASSWORD="psql1234"
|
||||
|
||||
EXTENSIONS_PATH="./extensions"
|
||||
|
||||
@@ -13,6 +13,7 @@ import relationsRouter from './routes/relations';
|
||||
import revisionsRouter from './routes/revisions';
|
||||
import rolesRouter from './routes/roles';
|
||||
import usersRouter from './routes/users';
|
||||
import extensionsRouter from './routes/extensions';
|
||||
import notFoundHandler from './routes/not-found';
|
||||
|
||||
const app = express()
|
||||
@@ -27,6 +28,7 @@ const app = express()
|
||||
.use('/revisions', revisionsRouter)
|
||||
.use('/roles', rolesRouter)
|
||||
.use('/users', usersRouter)
|
||||
.use('/extensions', extensionsRouter)
|
||||
.use(notFoundHandler)
|
||||
.use(errorHandler);
|
||||
|
||||
|
||||
@@ -5,12 +5,16 @@ export enum ErrorCode {
|
||||
NOT_FOUND = 'NOT_FOUND',
|
||||
FIELD_NOT_FOUND = 'FIELD_NOT_FOUND',
|
||||
INTERNAL_SERVER_ERROR = 'INTERNAL_SERVER_ERROR',
|
||||
ENOENT = 'ENOENT',
|
||||
EXTENSION_ILLEGAL_TYPE = 'EXTENSION_ILLEGAL_TYPE',
|
||||
}
|
||||
|
||||
enum HTTPStatus {
|
||||
NOT_FOUND = 404,
|
||||
FIELD_NOT_FOUND = 400,
|
||||
INTERNAL_SERVER_ERROR = 500,
|
||||
ENOENT = 501,
|
||||
EXTENSION_ILLEGAL_TYPE = 400,
|
||||
}
|
||||
|
||||
export const errorHandler: ErrorRequestHandler = (error: APIError | Error, req, res, next) => {
|
||||
@@ -38,12 +42,12 @@ export const errorHandler: ErrorRequestHandler = (error: APIError | Error, req,
|
||||
},
|
||||
};
|
||||
|
||||
if ((process.env.NODE_ENV = 'development')) {
|
||||
if (process.env.NODE_ENV === 'development') {
|
||||
response.error.message = error.message;
|
||||
}
|
||||
}
|
||||
|
||||
if ((process.env.NODE_ENV = 'development')) {
|
||||
if (process.env.NODE_ENV === 'development') {
|
||||
response.error.stack = error.stack;
|
||||
}
|
||||
|
||||
|
||||
28
src/routes/extensions.ts
Normal file
28
src/routes/extensions.ts
Normal file
@@ -0,0 +1,28 @@
|
||||
import { Router } from 'express';
|
||||
import asyncHandler from 'express-async-handler';
|
||||
import * as ExtensionsService from '../services/extensions';
|
||||
import APIError, { ErrorCode } from '../error';
|
||||
|
||||
const router = Router();
|
||||
|
||||
router.get(
|
||||
'/:type',
|
||||
asyncHandler(async (req, res) => {
|
||||
const typeAllowList = ['interfaces', 'layouts', 'displays', 'modules'];
|
||||
|
||||
if (typeAllowList.includes(req.params.type) === false) {
|
||||
throw new APIError(
|
||||
ErrorCode.EXTENSION_ILLEGAL_TYPE,
|
||||
`${req.params.type} is not an extension type.`
|
||||
);
|
||||
}
|
||||
|
||||
const interfaces = await ExtensionsService.listExtensions(req.params.type);
|
||||
|
||||
return res.json({
|
||||
data: interfaces,
|
||||
});
|
||||
})
|
||||
);
|
||||
|
||||
export default router;
|
||||
18
src/services/extensions.ts
Normal file
18
src/services/extensions.ts
Normal file
@@ -0,0 +1,18 @@
|
||||
import listFolders from '../utils/list-folders';
|
||||
import path from 'path';
|
||||
import APIError, { ErrorCode } from '../error';
|
||||
|
||||
export async function listExtensions(type: string) {
|
||||
const extensionsPath = process.env.EXTENSIONS_PATH;
|
||||
const location = path.join(extensionsPath, type);
|
||||
|
||||
try {
|
||||
return await listFolders(location);
|
||||
} catch (err) {
|
||||
if (err.code === 'ENOENT') {
|
||||
throw new APIError(ErrorCode.ENOENT, `The ${type} folder doesn't exist.`);
|
||||
}
|
||||
|
||||
throw err;
|
||||
}
|
||||
}
|
||||
25
src/utils/list-folders.ts
Normal file
25
src/utils/list-folders.ts
Normal file
@@ -0,0 +1,25 @@
|
||||
import fs from 'fs';
|
||||
import path from 'path';
|
||||
import { promisify } from 'util';
|
||||
import APIError, { ErrorCode } from '../error';
|
||||
|
||||
const readdir = promisify(fs.readdir);
|
||||
const stat = promisify(fs.stat);
|
||||
|
||||
export default async function listFolders(location: string) {
|
||||
const fullPath = path.join(process.cwd(), location);
|
||||
const files = await readdir(fullPath);
|
||||
|
||||
const directories: string[] = [];
|
||||
|
||||
for (const file of files) {
|
||||
const filePath = path.join(fullPath, file);
|
||||
const stats = await stat(filePath);
|
||||
|
||||
if (stats.isDirectory()) {
|
||||
directories.push(file);
|
||||
}
|
||||
}
|
||||
|
||||
return directories;
|
||||
}
|
||||
Reference in New Issue
Block a user