Skip to content

Commit 60ae99b

Browse files
committed
Enable saving file in the storage folder ✨
1 parent 88f4228 commit 60ae99b

File tree

6 files changed

+31
-24
lines changed

6 files changed

+31
-24
lines changed

client/api/asset.js

Lines changed: 7 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,16 +1,17 @@
11
import request from './request';
22

33
const urls = {
4-
base: repositoryId => `/repositories/${repositoryId}/assets`
4+
base: 'assets'
55
};
66

7-
function getUrl(repositoryId, key) {
8-
const params = { key };
9-
return request.get(urls.base(repositoryId), { params }).then(res => res.data.url);
7+
function getUrl(folder, key) {
8+
const params = { key: `${folder}/${key}` };
9+
return request.get(urls.base, { params }).then(res => res.data.url);
1010
}
1111

12-
function upload(repositoryId, data) {
13-
return request.post(urls.base(repositoryId), data).then(res => res.data);
12+
function upload(folder, data) {
13+
if (folder) data.append('folder', folder);
14+
return request.post(urls.base, data).then(res => res.data);
1415
}
1516

1617
export default {

client/components/common/mixins/upload.js

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,8 @@ export default {
1818
},
1919
upload: loader(function (e) {
2020
this.createFileForm(e);
21-
return this.$storageService.upload(this.repositoryId, this.form)
21+
const folder = `repository/${this.repositoryId}`;
22+
return this.$storageService.upload(folder, this.form)
2223
.then(data => {
2324
const { name } = this.form.get('file');
2425
this.$emit('upload', { ...data, name });

server/repository/index.js

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,6 @@ const activity = require('../activity');
1919
const comment = require('../comment');
2020
const revision = require('../revision');
2121
const contentElement = require('../content-element');
22-
const storageRouter = require('../shared/storage/storage.router');
2322
/* eslint-enable */
2423

2524
// NOTE: disk storage engine expects an object to be passed as the first argument
@@ -59,7 +58,6 @@ mount(router, '/:repositoryId', activity);
5958
mount(router, '/:repositoryId', revision);
6059
mount(router, '/:repositoryId', contentElement);
6160
mount(router, '/:repositoryId', comment);
62-
mount(router, '/:repositoryId', storageRouter);
6361

6462
function mount(router, mountPath, subrouter) {
6563
return router.use(path.join(mountPath, subrouter.path), subrouter.router);

server/router.js

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ const { authenticate } = require('./shared/auth');
55
const express = require('express');
66
const { extractAuthData } = require('./shared/auth/mw');
77
const repository = require('./repository');
8+
const storage = require('./shared/storage/storage.router');
89
const tag = require('./tag');
910
const user = require('./user');
1011

@@ -24,6 +25,7 @@ authConfig.oidc.enabled && (() => {
2425
// Protected routes:
2526
router.use(authenticate('jwt'));
2627
router.use(repository.path, repository.router);
28+
router.use(storage.path, storage.router);
2729
router.use(tag.path, tag.router);
2830

2931
module.exports = router;

server/shared/storage/helpers.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@ const { elementRegistry } = require('../content-plugins');
44
const get = require('lodash/get');
55
const config = require('../../../config/server').storage;
66
const Promise = require('bluebird');
7-
const proxy = require('../../repository/proxy');
7+
const proxy = require('../storage/proxy');
88
const set = require('lodash/set');
99
const toPairs = require('lodash/toPairs');
1010
const values = require('lodash/values');

server/shared/storage/storage.controller.js

Lines changed: 19 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,5 @@
11
'use strict';
22

3-
const { getFileUrl, getPath, saveFile } = require('../../repository/storage');
43
const { readFile, sha256 } = require('./util');
54
const config = require('../../../config/server').storage;
65
const fecha = require('fecha');
@@ -9,49 +8,55 @@ const JSZip = require('jszip');
98
const mime = require('mime-types');
109
const path = require('path');
1110
const pickBy = require('lodash/pickBy');
11+
const Storage = require('./');
1212

1313
const getStorageUrl = key => `${config.protocol}${key}`;
14+
const storage = new Storage(config);
1415

1516
function getUrl(req, res) {
1617
const { query: { key } } = req;
17-
return getFileUrl(key).then(url => res.json({ url }));
18+
return storage.getFileUrl(key).then(url => res.json({ url }));
1819
}
1920

20-
async function upload({ file, body, user, repository }, res) {
21+
async function upload({ file, body, user }, res) {
22+
const { folder, unpack } = body;
2123
const { name } = path.parse(file.originalname);
22-
const { id: repositoryId } = repository;
23-
if (body.unpack) {
24+
if (unpack) {
2425
const timestamp = fecha.format(new Date(), 'YYYY-MM-DDTHH:mm:ss');
2526
const root = `${timestamp}__${user.id}__${name}`;
26-
const assets = await uploadArchiveContent(repositoryId, file, root);
27+
const assets = await uploadArchiveContent(folder, file, root);
2728
return res.json({ root, assets });
2829
}
29-
const asset = await uploadFile(repositoryId, file, name);
30+
const asset = await uploadFile(folder, file, name);
3031
return res.json(asset);
3132
}
3233

3334
module.exports = { getUrl, upload };
3435

35-
async function uploadFile(repositoryId, file, name) {
36+
async function uploadFile(folder, file, name) {
3637
const buffer = await readFile(file);
3738
const hash = sha256(file.originalname, buffer);
3839
const extension = path.extname(file.originalname);
3940
const fileName = `${hash}___${name}${extension}`;
40-
const key = path.join(getPath(repositoryId), fileName);
41-
await saveFile(key, buffer, { ContentType: file.mimetype });
42-
const publicUrl = await getFileUrl(key);
41+
const keyComponents = [folder, fileName].filter(Boolean);
42+
const key = path.join(...keyComponents);
43+
await storage.saveFile(key, buffer, { ContentType: file.mimetype });
44+
const publicUrl = await storage.getFileUrl(key);
4345
return { key, publicUrl, url: getStorageUrl(key) };
4446
}
4547

46-
async function uploadArchiveContent(repositoryId, archive, name) {
48+
async function uploadArchiveContent(folder, archive, name) {
4749
const buffer = await readFile(archive);
4850
const content = await JSZip.loadAsync(buffer);
4951
const files = pickBy(content.files, it => !it.dir);
5052
const keys = await Promise.all(Object.keys(files).map(async src => {
51-
const key = path.join(getPath(repositoryId), name, src);
53+
const keyComponents = [folder, name, src].filter(Boolean);
54+
const key = path.join(...keyComponents);
5255
const file = await content.file(src).async('uint8array');
5356
const mimeType = mime.lookup(src);
54-
await saveFile(key, Buffer.from(file), { ContentType: mimeType });
57+
await storage.saveFile(key, Buffer.from(file), {
58+
ContentType: mimeType
59+
});
5560
return [key, getStorageUrl(key)];
5661
}));
5762
return fromPairs(keys);

0 commit comments

Comments
 (0)