directus
192 строки · 4.5 Кб
1import { ErrorCode, isDirectusError } from '@directus/errors';
2import type { PrimaryKey } from '@directus/types';
3import express from 'express';
4import { respond } from '../middleware/respond.js';
5import useCollection from '../middleware/use-collection.js';
6import { validateBatch } from '../middleware/validate-batch.js';
7import { MetaService } from '../services/meta.js';
8import { RolesService } from '../services/roles.js';
9import asyncHandler from '../utils/async-handler.js';
10import { sanitizeQuery } from '../utils/sanitize-query.js';
11
12const router = express.Router();
13
14router.use(useCollection('directus_roles'));
15
16router.post(
17'/',
18asyncHandler(async (req, res, next) => {
19const service = new RolesService({
20accountability: req.accountability,
21schema: req.schema,
22});
23
24const savedKeys: PrimaryKey[] = [];
25
26if (Array.isArray(req.body)) {
27const keys = await service.createMany(req.body);
28savedKeys.push(...keys);
29} else {
30const key = await service.createOne(req.body);
31savedKeys.push(key);
32}
33
34try {
35if (Array.isArray(req.body)) {
36const items = await service.readMany(savedKeys, req.sanitizedQuery);
37res.locals['payload'] = { data: items };
38} else {
39const item = await service.readOne(savedKeys[0]!, req.sanitizedQuery);
40res.locals['payload'] = { data: item };
41}
42} catch (error: any) {
43if (isDirectusError(error, ErrorCode.Forbidden)) {
44return next();
45}
46
47throw error;
48}
49
50return next();
51}),
52respond,
53);
54
55const readHandler = asyncHandler(async (req, res, next) => {
56const service = new RolesService({
57accountability: req.accountability,
58schema: req.schema,
59});
60
61const metaService = new MetaService({
62accountability: req.accountability,
63schema: req.schema,
64});
65
66const records = await service.readByQuery(req.sanitizedQuery);
67const meta = await metaService.getMetaForQuery('directus_roles', req.sanitizedQuery);
68
69res.locals['payload'] = { data: records || null, meta };
70return next();
71});
72
73router.get('/', validateBatch('read'), readHandler, respond);
74router.search('/', validateBatch('read'), readHandler, respond);
75
76router.get(
77'/:pk',
78asyncHandler(async (req, res, next) => {
79const service = new RolesService({
80accountability: req.accountability,
81schema: req.schema,
82});
83
84const record = await service.readOne(req.params['pk']!, req.sanitizedQuery);
85
86res.locals['payload'] = { data: record || null };
87return next();
88}),
89respond,
90);
91
92router.patch(
93'/',
94validateBatch('update'),
95asyncHandler(async (req, res, next) => {
96const service = new RolesService({
97accountability: req.accountability,
98schema: req.schema,
99});
100
101let keys: PrimaryKey[] = [];
102
103if (Array.isArray(req.body)) {
104keys = await service.updateBatch(req.body);
105} else if (req.body.keys) {
106keys = await service.updateMany(req.body.keys, req.body.data);
107} else {
108const sanitizedQuery = sanitizeQuery(req.body.query, req.accountability);
109keys = await service.updateByQuery(sanitizedQuery, req.body.data);
110}
111
112try {
113const result = await service.readMany(keys, req.sanitizedQuery);
114res.locals['payload'] = { data: result };
115} catch (error: any) {
116if (isDirectusError(error, ErrorCode.Forbidden)) {
117return next();
118}
119
120throw error;
121}
122
123return next();
124}),
125respond,
126);
127
128router.patch(
129'/:pk',
130asyncHandler(async (req, res, next) => {
131const service = new RolesService({
132accountability: req.accountability,
133schema: req.schema,
134});
135
136const primaryKey = await service.updateOne(req.params['pk']!, req.body);
137
138try {
139const item = await service.readOne(primaryKey, req.sanitizedQuery);
140res.locals['payload'] = { data: item || null };
141} catch (error: any) {
142if (isDirectusError(error, ErrorCode.Forbidden)) {
143return next();
144}
145
146throw error;
147}
148
149return next();
150}),
151respond,
152);
153
154router.delete(
155'/',
156validateBatch('delete'),
157asyncHandler(async (req, _res, next) => {
158const service = new RolesService({
159accountability: req.accountability,
160schema: req.schema,
161});
162
163if (Array.isArray(req.body)) {
164await service.deleteMany(req.body);
165} else if (req.body.keys) {
166await service.deleteMany(req.body.keys);
167} else {
168const sanitizedQuery = sanitizeQuery(req.body.query, req.accountability);
169await service.deleteByQuery(sanitizedQuery);
170}
171
172return next();
173}),
174respond,
175);
176
177router.delete(
178'/:pk',
179asyncHandler(async (req, _res, next) => {
180const service = new RolesService({
181accountability: req.accountability,
182schema: req.schema,
183});
184
185await service.deleteOne(req.params['pk']!);
186
187return next();
188}),
189respond,
190);
191
192export default router;
193