mirror of
https://github.com/directus/directus.git
synced 2026-04-25 03:00:53 -04:00
Add revisions to files
This commit is contained in:
32
package.json
32
package.json
@@ -31,12 +31,12 @@
|
||||
"@types/atob": "^2.1.2",
|
||||
"@types/busboy": "^0.2.3",
|
||||
"@types/cookie-parser": "^1.4.2",
|
||||
"@types/express": "^4.17.6",
|
||||
"@types/express": "^4.17.7",
|
||||
"@types/express-pino-logger": "^4.0.2",
|
||||
"@types/express-session": "^1.17.0",
|
||||
"@types/hapi__joi": "^17.1.2",
|
||||
"@types/hapi__joi": "^17.1.3",
|
||||
"@types/jsonwebtoken": "^8.5.0",
|
||||
"@types/lodash": "^4.14.156",
|
||||
"@types/lodash": "^4.14.157",
|
||||
"@types/ms": "^0.7.31",
|
||||
"@types/nodemailer": "^6.4.0",
|
||||
"@types/pino": "^6.3.0",
|
||||
@@ -44,16 +44,16 @@
|
||||
"@types/uuid": "^8.0.0",
|
||||
"@types/uuid-validate": "0.0.1",
|
||||
"copyfiles": "^2.3.0",
|
||||
"eslint": "^7.3.1",
|
||||
"eslint": "^7.4.0",
|
||||
"eslint-plugin-prettier": "^3.1.4",
|
||||
"husky": "^4.2.5",
|
||||
"lint-staged": "^10.2.10",
|
||||
"pino-colada": "^1.6.1",
|
||||
"lint-staged": "^10.2.11",
|
||||
"pino-colada": "^2.0.1",
|
||||
"prettier": "^2.0.5",
|
||||
"rimraf": "^3.0.2",
|
||||
"ts-node": "^8.10.2",
|
||||
"tslint": "^6.1.2",
|
||||
"typescript": "^3.9.5"
|
||||
"typescript": "^3.9.6"
|
||||
},
|
||||
"husky": {
|
||||
"hooks": {
|
||||
@@ -67,9 +67,9 @@
|
||||
},
|
||||
"dependencies": {
|
||||
"@hapi/joi": "^17.1.1",
|
||||
"@slynova/flydrive": "^1.0.1",
|
||||
"@slynova/flydrive-gcs": "^1.0.1",
|
||||
"@slynova/flydrive-s3": "^1.0.1",
|
||||
"@slynova/flydrive": "^1.0.2",
|
||||
"@slynova/flydrive-gcs": "^1.0.2",
|
||||
"@slynova/flydrive-s3": "^1.0.2",
|
||||
"argon2": "^0.26.2",
|
||||
"atob": "^2.1.2",
|
||||
"body-parser": "^1.19.0",
|
||||
@@ -87,19 +87,19 @@
|
||||
"icc": "^2.0.0",
|
||||
"jsonwebtoken": "^8.5.1",
|
||||
"knex": "^0.21.1",
|
||||
"liquidjs": "^9.12.0",
|
||||
"lodash": "^4.17.15",
|
||||
"liquidjs": "^9.14.1",
|
||||
"lodash": "^4.17.19",
|
||||
"ms": "^2.1.2",
|
||||
"mssql": "^6.2.0",
|
||||
"mysql": "^2.18.1",
|
||||
"nanoid": "^3.1.10",
|
||||
"nodemailer": "^6.4.10",
|
||||
"oracledb": "^4.2.0",
|
||||
"pg": "^8.2.1",
|
||||
"oracledb": "^5.0.0",
|
||||
"pg": "^8.3.0",
|
||||
"pino": "^6.3.2",
|
||||
"sharp": "^0.25.4",
|
||||
"sqlite3": "^4.2.0",
|
||||
"ts-node-dev": "^1.0.0-pre.49",
|
||||
"sqlite3": "^5.0.0",
|
||||
"ts-node-dev": "^1.0.0-pre.51",
|
||||
"uuid": "^8.2.0",
|
||||
"uuid-validate": "0.0.3"
|
||||
}
|
||||
|
||||
@@ -55,20 +55,24 @@ const multipartHandler = (operation: 'create' | 'update') =>
|
||||
|
||||
try {
|
||||
if (operation === 'create') {
|
||||
const file = await FilesService.createFile(payload, fileStream);
|
||||
|
||||
ActivityService.createActivity({
|
||||
action: ActivityService.Action.UPLOAD,
|
||||
collection: 'directus_files',
|
||||
item: file.id,
|
||||
const file = await FilesService.createFile(payload, fileStream, {
|
||||
ip: req.ip,
|
||||
user_agent: req.get('user-agent'),
|
||||
action_by: req.user,
|
||||
userAgent: req.get('user-agent'),
|
||||
user: req.user,
|
||||
});
|
||||
|
||||
savedFiles.push(file);
|
||||
} else {
|
||||
const file = await FilesService.updateFile(req.params.pk, payload, fileStream);
|
||||
const file = await FilesService.updateFile(
|
||||
req.params.pk,
|
||||
payload,
|
||||
{
|
||||
ip: req.ip,
|
||||
userAgent: req.get('user-agent'),
|
||||
user: req.user,
|
||||
},
|
||||
fileStream
|
||||
);
|
||||
|
||||
ActivityService.createActivity({
|
||||
action: ActivityService.Action.UPDATE,
|
||||
@@ -130,15 +134,10 @@ router.patch(
|
||||
if (req.is('multipart/form-data')) {
|
||||
file = await multipartHandler('update')(req, res, next);
|
||||
} else {
|
||||
file = await FilesService.updateFile(req.params.pk, req.body);
|
||||
|
||||
ActivityService.createActivity({
|
||||
action: ActivityService.Action.UPDATE,
|
||||
collection: 'directus_files',
|
||||
item: file.id,
|
||||
file = await FilesService.updateFile(req.params.pk, req.body, {
|
||||
ip: req.ip,
|
||||
user_agent: req.get('user-agent'),
|
||||
action_by: req.user,
|
||||
userAgent: req.get('user-agent'),
|
||||
user: req.user,
|
||||
});
|
||||
}
|
||||
|
||||
@@ -150,7 +149,11 @@ router.delete(
|
||||
'/:pk',
|
||||
useCollection('directus_files'),
|
||||
asyncHandler(async (req, res) => {
|
||||
await FilesService.deleteFile(req.params.pk);
|
||||
await FilesService.deleteFile(req.params.pk, {
|
||||
ip: req.ip,
|
||||
userAgent: req.get('user-agent'),
|
||||
user: req.user,
|
||||
});
|
||||
return res.status(200).end();
|
||||
})
|
||||
);
|
||||
|
||||
@@ -9,11 +9,13 @@ import parseEXIF from 'exif-reader';
|
||||
import parseIPTC from '../utils/parse-iptc';
|
||||
import path from 'path';
|
||||
import { v4 as uuidv4 } from 'uuid';
|
||||
import { Accountability } from '../types';
|
||||
import { Readable } from 'stream';
|
||||
|
||||
export const createFile = async (
|
||||
data: Record<string, any>,
|
||||
stream: NodeJS.ReadableStream,
|
||||
query?: Query
|
||||
accountability: Accountability
|
||||
) => {
|
||||
const id = uuidv4();
|
||||
|
||||
@@ -51,8 +53,7 @@ export const createFile = async (
|
||||
}
|
||||
|
||||
await storage.disk(data.storage).put(payload.filename_disk, stream.pipe(pipeline));
|
||||
const primaryKey = await ItemsService.createItem('directus_files', payload);
|
||||
return await ItemsService.readItem('directus_files', primaryKey, query);
|
||||
return await ItemsService.createItem('directus_files', payload, accountability);
|
||||
};
|
||||
|
||||
export const readFiles = async (query: Query) => {
|
||||
@@ -63,12 +64,11 @@ export const readFile = async (pk: string | number, query: Query) => {
|
||||
return await ItemsService.readItem('directus_files', pk, query);
|
||||
};
|
||||
|
||||
// @todo Add query support
|
||||
export const updateFile = async (
|
||||
pk: string | number,
|
||||
data: Record<string, any>,
|
||||
stream?: NodeJS.ReadableStream,
|
||||
query?: Query
|
||||
accountability: Accountability,
|
||||
stream?: NodeJS.ReadableStream
|
||||
) => {
|
||||
/**
|
||||
* @TODO
|
||||
@@ -87,15 +87,13 @@ export const updateFile = async (
|
||||
.where({ id: pk })
|
||||
.first();
|
||||
|
||||
// @todo type of stream in flydrive is wrong: https://github.com/Slynova-Org/flydrive/issues/145
|
||||
await storage.disk(file.storage).put(file.filename_disk, stream as any);
|
||||
await storage.disk(file.storage).put(file.filename_disk, stream as Readable);
|
||||
}
|
||||
|
||||
const primaryKey = await ItemsService.updateItem('directus_files', pk, data);
|
||||
return await ItemsService.readItem('directus_files', primaryKey, query);
|
||||
return await ItemsService.updateItem('directus_files', pk, data, accountability);
|
||||
};
|
||||
|
||||
export const deleteFile = async (pk: string | number) => {
|
||||
export const deleteFile = async (pk: string, accountability: Accountability) => {
|
||||
const file = await database
|
||||
.select('storage', 'filename_disk')
|
||||
.from('directus_files')
|
||||
|
||||
Reference in New Issue
Block a user