directus
201 строка · 4.7 Кб
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 { PresetsService } from '../services/presets.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_presets'));
15
16router.post(
17'/',
18asyncHandler(async (req, res, next) => {
19const service = new PresetsService({
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 records = await service.readMany(savedKeys, req.sanitizedQuery);
37res.locals['payload'] = { data: records };
38} else {
39const record = await service.readOne(savedKeys[0]!, req.sanitizedQuery);
40res.locals['payload'] = { data: record };
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 PresetsService({
57accountability: req.accountability,
58schema: req.schema,
59});
60
61const metaService = new MetaService({
62accountability: req.accountability,
63schema: req.schema,
64});
65
66let result;
67
68if (req.singleton) {
69result = await service.readSingleton(req.sanitizedQuery);
70} else if (req.body.keys) {
71result = await service.readMany(req.body.keys, req.sanitizedQuery);
72} else {
73result = await service.readByQuery(req.sanitizedQuery);
74}
75
76const meta = await metaService.getMetaForQuery('directus_presets', req.sanitizedQuery);
77
78res.locals['payload'] = { data: result, meta };
79return next();
80});
81
82router.get('/', validateBatch('read'), readHandler, respond);
83router.search('/', validateBatch('read'), readHandler, respond);
84
85router.get(
86'/:pk',
87asyncHandler(async (req, res, next) => {
88const service = new PresetsService({
89accountability: req.accountability,
90schema: req.schema,
91});
92
93const record = await service.readOne(req.params['pk']!, req.sanitizedQuery);
94
95res.locals['payload'] = { data: record || null };
96return next();
97}),
98respond,
99);
100
101router.patch(
102'/',
103validateBatch('update'),
104asyncHandler(async (req, res, next) => {
105const service = new PresetsService({
106accountability: req.accountability,
107schema: req.schema,
108});
109
110let keys: PrimaryKey[] = [];
111
112if (Array.isArray(req.body)) {
113keys = await service.updateBatch(req.body);
114} else if (req.body.keys) {
115keys = await service.updateMany(req.body.keys, req.body.data);
116} else {
117const sanitizedQuery = sanitizeQuery(req.body.query, req.accountability);
118keys = await service.updateByQuery(sanitizedQuery, req.body.data);
119}
120
121try {
122const result = await service.readMany(keys, req.sanitizedQuery);
123res.locals['payload'] = { data: result };
124} catch (error: any) {
125if (isDirectusError(error, ErrorCode.Forbidden)) {
126return next();
127}
128
129throw error;
130}
131
132return next();
133}),
134respond,
135);
136
137router.patch(
138'/:pk',
139asyncHandler(async (req, res, next) => {
140const service = new PresetsService({
141accountability: req.accountability,
142schema: req.schema,
143});
144
145const primaryKey = await service.updateOne(req.params['pk']!, req.body);
146
147try {
148const record = await service.readOne(primaryKey, req.sanitizedQuery);
149res.locals['payload'] = { data: record };
150} catch (error: any) {
151if (isDirectusError(error, ErrorCode.Forbidden)) {
152return next();
153}
154
155throw error;
156}
157
158return next();
159}),
160respond,
161);
162
163router.delete(
164'/',
165validateBatch('delete'),
166asyncHandler(async (req, _res, next) => {
167const service = new PresetsService({
168accountability: req.accountability,
169schema: req.schema,
170});
171
172if (Array.isArray(req.body)) {
173await service.deleteMany(req.body);
174} else if (req.body.keys) {
175await service.deleteMany(req.body.keys);
176} else {
177const sanitizedQuery = sanitizeQuery(req.body.query, req.accountability);
178await service.deleteByQuery(sanitizedQuery);
179}
180
181return next();
182}),
183respond,
184);
185
186router.delete(
187'/:pk',
188asyncHandler(async (req, _res, next) => {
189const service = new PresetsService({
190accountability: req.accountability,
191schema: req.schema,
192});
193
194await service.deleteOne(req.params['pk']!);
195
196return next();
197}),
198respond,
199);
200
201export default router;
202