directus
191 строка · 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 { OperationsService } from '../services/operations.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_operations'));15
16router.post(17'/',18asyncHandler(async (req, res, next) => {19const service = new OperationsService({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 OperationsService({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(req.collection, 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 OperationsService({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 OperationsService({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 OperationsService({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'/',156asyncHandler(async (req, _res, next) => {157const service = new OperationsService({158accountability: req.accountability,159schema: req.schema,160});161
162if (Array.isArray(req.body)) {163await service.deleteMany(req.body);164} else if (req.body.keys) {165await service.deleteMany(req.body.keys);166} else {167const sanitizedQuery = sanitizeQuery(req.body.query, req.accountability);168await service.deleteByQuery(sanitizedQuery);169}170
171return next();172}),173respond,174);175
176router.delete(177'/:pk',178asyncHandler(async (req, _res, next) => {179const service = new OperationsService({180accountability: req.accountability,181schema: req.schema,182});183
184await service.deleteOne(req.params['pk']!);185
186return next();187}),188respond,189);190
191export default router;192