directus

Форк
0
/
operations.ts 
191 строка · 4.5 Кб
1
import { ErrorCode, isDirectusError } from '@directus/errors';
2
import type { PrimaryKey } from '@directus/types';
3
import express from 'express';
4
import { respond } from '../middleware/respond.js';
5
import useCollection from '../middleware/use-collection.js';
6
import { validateBatch } from '../middleware/validate-batch.js';
7
import { MetaService } from '../services/meta.js';
8
import { OperationsService } from '../services/operations.js';
9
import asyncHandler from '../utils/async-handler.js';
10
import { sanitizeQuery } from '../utils/sanitize-query.js';
11

12
const router = express.Router();
13

14
router.use(useCollection('directus_operations'));
15

16
router.post(
17
	'/',
18
	asyncHandler(async (req, res, next) => {
19
		const service = new OperationsService({
20
			accountability: req.accountability,
21
			schema: req.schema,
22
		});
23

24
		const savedKeys: PrimaryKey[] = [];
25

26
		if (Array.isArray(req.body)) {
27
			const keys = await service.createMany(req.body);
28
			savedKeys.push(...keys);
29
		} else {
30
			const key = await service.createOne(req.body);
31
			savedKeys.push(key);
32
		}
33

34
		try {
35
			if (Array.isArray(req.body)) {
36
				const items = await service.readMany(savedKeys, req.sanitizedQuery);
37
				res.locals['payload'] = { data: items };
38
			} else {
39
				const item = await service.readOne(savedKeys[0]!, req.sanitizedQuery);
40
				res.locals['payload'] = { data: item };
41
			}
42
		} catch (error: any) {
43
			if (isDirectusError(error, ErrorCode.Forbidden)) {
44
				return next();
45
			}
46

47
			throw error;
48
		}
49

50
		return next();
51
	}),
52
	respond,
53
);
54

55
const readHandler = asyncHandler(async (req, res, next) => {
56
	const service = new OperationsService({
57
		accountability: req.accountability,
58
		schema: req.schema,
59
	});
60

61
	const metaService = new MetaService({
62
		accountability: req.accountability,
63
		schema: req.schema,
64
	});
65

66
	const records = await service.readByQuery(req.sanitizedQuery);
67
	const meta = await metaService.getMetaForQuery(req.collection, req.sanitizedQuery);
68

69
	res.locals['payload'] = { data: records || null, meta };
70
	return next();
71
});
72

73
router.get('/', validateBatch('read'), readHandler, respond);
74
router.search('/', validateBatch('read'), readHandler, respond);
75

76
router.get(
77
	'/:pk',
78
	asyncHandler(async (req, res, next) => {
79
		const service = new OperationsService({
80
			accountability: req.accountability,
81
			schema: req.schema,
82
		});
83

84
		const record = await service.readOne(req.params['pk']!, req.sanitizedQuery);
85

86
		res.locals['payload'] = { data: record || null };
87
		return next();
88
	}),
89
	respond,
90
);
91

92
router.patch(
93
	'/',
94
	validateBatch('update'),
95
	asyncHandler(async (req, res, next) => {
96
		const service = new OperationsService({
97
			accountability: req.accountability,
98
			schema: req.schema,
99
		});
100

101
		let keys: PrimaryKey[] = [];
102

103
		if (Array.isArray(req.body)) {
104
			keys = await service.updateBatch(req.body);
105
		} else if (req.body.keys) {
106
			keys = await service.updateMany(req.body.keys, req.body.data);
107
		} else {
108
			const sanitizedQuery = sanitizeQuery(req.body.query, req.accountability);
109
			keys = await service.updateByQuery(sanitizedQuery, req.body.data);
110
		}
111

112
		try {
113
			const result = await service.readMany(keys, req.sanitizedQuery);
114
			res.locals['payload'] = { data: result };
115
		} catch (error: any) {
116
			if (isDirectusError(error, ErrorCode.Forbidden)) {
117
				return next();
118
			}
119

120
			throw error;
121
		}
122

123
		return next();
124
	}),
125
	respond,
126
);
127

128
router.patch(
129
	'/:pk',
130
	asyncHandler(async (req, res, next) => {
131
		const service = new OperationsService({
132
			accountability: req.accountability,
133
			schema: req.schema,
134
		});
135

136
		const primaryKey = await service.updateOne(req.params['pk']!, req.body);
137

138
		try {
139
			const item = await service.readOne(primaryKey, req.sanitizedQuery);
140
			res.locals['payload'] = { data: item || null };
141
		} catch (error: any) {
142
			if (isDirectusError(error, ErrorCode.Forbidden)) {
143
				return next();
144
			}
145

146
			throw error;
147
		}
148

149
		return next();
150
	}),
151
	respond,
152
);
153

154
router.delete(
155
	'/',
156
	asyncHandler(async (req, _res, next) => {
157
		const service = new OperationsService({
158
			accountability: req.accountability,
159
			schema: req.schema,
160
		});
161

162
		if (Array.isArray(req.body)) {
163
			await service.deleteMany(req.body);
164
		} else if (req.body.keys) {
165
			await service.deleteMany(req.body.keys);
166
		} else {
167
			const sanitizedQuery = sanitizeQuery(req.body.query, req.accountability);
168
			await service.deleteByQuery(sanitizedQuery);
169
		}
170

171
		return next();
172
	}),
173
	respond,
174
);
175

176
router.delete(
177
	'/:pk',
178
	asyncHandler(async (req, _res, next) => {
179
		const service = new OperationsService({
180
			accountability: req.accountability,
181
			schema: req.schema,
182
		});
183

184
		await service.deleteOne(req.params['pk']!);
185

186
		return next();
187
	}),
188
	respond,
189
);
190

191
export default router;
192

Использование cookies

Мы используем файлы cookie в соответствии с Политикой конфиденциальности и Политикой использования cookies.

Нажимая кнопку «Принимаю», Вы даете АО «СберТех» согласие на обработку Ваших персональных данных в целях совершенствования нашего веб-сайта и Сервиса GitVerse, а также повышения удобства их использования.

Запретить использование cookies Вы можете самостоятельно в настройках Вашего браузера.