museria 0.2.49 → 0.3.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.eslintrc +10 -2
- package/.github/workflows/build.yml +3 -3
- package/.github/workflows/publish.yml +3 -3
- package/README.md +55 -59
- package/bin/actions.js +28 -28
- package/bin/index.js +4 -4
- package/bin/runner.js +1 -1
- package/bin/utils.js +6 -2
- package/dist/client/museria.client.js +7 -7
- package/dist/face/45a265d0f07b31cde85f.ttf +0 -0
- package/dist/face/6205fd00fb1b573e9f0f.ttf +0 -0
- package/dist/face/8d3cabfc66809162fb4d.woff2 +0 -0
- package/dist/face/fb8184add5a3101ad0a3.woff2 +0 -0
- package/dist/face/museria.face.js +33 -13
- package/dist/face/style.css +13 -11
- package/package.json +41 -40
- package/src/browser/client/index.js +2 -1
- package/src/browser/face/client.js +2 -1
- package/src/browser/face/controllers/app/app.html +77 -69
- package/src/browser/face/controllers/app/app.js +14 -7
- package/src/browser/face/controllers/app/app.scss +2 -22
- package/src/browser/face/index.js +3 -3
- package/src/browser/face/styles/main.scss +91 -11
- package/src/browser/face/styles/vars.scss +0 -1
- package/src/client.js +73 -74
- package/src/collection/transports/music/index.js +20 -18
- package/src/db/transports/database/index.js +7 -5
- package/src/db/transports/loki/index.js +30 -25
- package/src/errors.js +2 -1
- package/src/index.js +8 -6
- package/src/node.js +312 -323
- package/src/schema.js +27 -29
- package/src/server/transports/express/api/butler/controllers.js +7 -10
- package/src/server/transports/express/api/butler/routes.js +5 -5
- package/src/server/transports/express/api/master/controllers.js +7 -10
- package/src/server/transports/express/api/master/routes.js +5 -5
- package/src/server/transports/express/api/node/controllers.js +52 -61
- package/src/server/transports/express/api/node/routes.js +10 -10
- package/src/server/transports/express/api/routes.js +1 -1
- package/src/server/transports/express/api/slave/controllers.js +7 -10
- package/src/server/transports/express/api/slave/routes.js +6 -6
- package/src/server/transports/express/client/controllers.js +40 -61
- package/src/server/transports/express/client/routes.js +33 -39
- package/src/server/transports/express/controllers.js +10 -21
- package/src/server/transports/express/index.js +23 -20
- package/src/server/transports/express/midds.js +67 -67
- package/src/server/transports/express/routes.js +12 -12
- package/src/utils.js +175 -184
- package/test/client.js +311 -305
- package/test/db/database.js +32 -28
- package/test/db/loki.js +78 -74
- package/test/group.js +161 -156
- package/test/index.js +20 -10
- package/test/node.js +461 -460
- package/test/routes.js +404 -399
- package/test/server/express.js +35 -31
- package/test/services.js +25 -18
- package/test/tools.js +8 -6
- package/test/utils.js +236 -234
- package/webpack.client.js +9 -7
- package/webpack.face.js +8 -6
- package/dist/face/fa-brands-400.eot +0 -0
- package/dist/face/fa-brands-400.svg +0 -3717
- package/dist/face/fa-brands-400.ttf +0 -0
- package/dist/face/fa-brands-400.woff +0 -0
- package/dist/face/fa-brands-400.woff2 +0 -0
- package/dist/face/fa-solid-900.eot +0 -0
- package/dist/face/fa-solid-900.svg +0 -5034
- package/dist/face/fa-solid-900.ttf +0 -0
- package/dist/face/fa-solid-900.woff +0 -0
- package/dist/face/fa-solid-900.woff2 +0 -0
- /package/dist/face/{open-sans.ttf → 17e98b9e5586529b13cc.ttf} +0 -0
- /package/dist/face/{proxima-nova.ttf → 326601dfabd91e3f016c.ttf} +0 -0
- /package/dist/face/{logo.svg → ee9c6af64aa224827cec.svg} +0 -0
package/src/schema.js
CHANGED
@@ -1,11 +1,12 @@
|
|
1
|
-
|
2
|
-
|
3
|
-
|
4
|
-
|
1
|
+
import merge from "lodash-es/merge.js";
|
2
|
+
import mtSchema from "metastocle/src/schema.js";
|
3
|
+
import stSchema from "storacle/src/schema.js";
|
4
|
+
import utils from "./utils.js";
|
5
|
+
|
5
6
|
const schema = Object.assign({}, mtSchema, stSchema);
|
6
7
|
|
7
8
|
schema.getStatusResponse = function () {
|
8
|
-
return
|
9
|
+
return merge(mtSchema.getStatusResponse(), stSchema.getStatusResponse(), {
|
9
10
|
props: {
|
10
11
|
collectionLimit: 'number',
|
11
12
|
}
|
@@ -17,10 +18,10 @@ schema.getSongPriority = function () {
|
|
17
18
|
type: 'number',
|
18
19
|
value: utils.isValidSongPriority.bind(utils)
|
19
20
|
};
|
20
|
-
}
|
21
|
+
};
|
21
22
|
|
22
23
|
schema.getStatusPrettyResponse = function () {
|
23
|
-
return
|
24
|
+
return merge(this.getStatusResponse(), mtSchema.getStatusPrettyResponse(), stSchema.getStatusPrettyResponse());
|
24
25
|
};
|
25
26
|
|
26
27
|
schema.getMusicCollectionGetting = function (options = {}) {
|
@@ -28,7 +29,6 @@ schema.getMusicCollectionGetting = function (options = {}) {
|
|
28
29
|
type: 'object',
|
29
30
|
value: null
|
30
31
|
};
|
31
|
-
|
32
32
|
const musicType = {
|
33
33
|
type: 'object',
|
34
34
|
strict: true,
|
@@ -38,56 +38,54 @@ schema.getMusicCollectionGetting = function (options = {}) {
|
|
38
38
|
beautify: 'boolean'
|
39
39
|
}
|
40
40
|
};
|
41
|
-
|
42
41
|
const titleType = [
|
43
42
|
{
|
44
43
|
type: 'object',
|
45
|
-
strict: true,
|
46
|
-
props: {
|
44
|
+
strict: true,
|
45
|
+
props: {
|
47
46
|
$mus: musicType
|
48
47
|
}
|
49
48
|
},
|
50
49
|
{
|
51
50
|
type: 'object',
|
52
|
-
strict: true,
|
51
|
+
strict: true,
|
53
52
|
props: {
|
54
53
|
$art: 'string'
|
55
54
|
}
|
56
55
|
},
|
57
56
|
{
|
58
57
|
type: 'object',
|
59
|
-
strict: true,
|
60
|
-
props: {
|
58
|
+
strict: true,
|
59
|
+
props: {
|
61
60
|
$or: {
|
62
61
|
type: 'array',
|
63
62
|
items: [
|
64
|
-
{
|
63
|
+
{
|
65
64
|
type: 'object',
|
66
65
|
strict: true,
|
67
66
|
props: {
|
68
67
|
$mus: musicType
|
69
68
|
}
|
70
69
|
},
|
71
|
-
{
|
70
|
+
{
|
72
71
|
type: 'object',
|
73
72
|
strict: true,
|
74
73
|
props: {
|
75
74
|
$milk: {
|
76
75
|
type: 'string',
|
77
76
|
value: val => (!options.findingStringMinLength || val.length >= options.findingStringMinLength)
|
78
|
-
}
|
77
|
+
}
|
79
78
|
}
|
80
79
|
}
|
81
80
|
]
|
82
|
-
}
|
81
|
+
}
|
83
82
|
}
|
84
83
|
}
|
85
84
|
];
|
86
|
-
|
87
85
|
return {
|
88
86
|
type: 'object',
|
89
87
|
strict: true,
|
90
|
-
props: {
|
88
|
+
props: {
|
91
89
|
offset: {
|
92
90
|
type: 'number',
|
93
91
|
value: 0
|
@@ -113,11 +111,11 @@ schema.getMusicCollectionGetting = function (options = {}) {
|
|
113
111
|
type: 'object',
|
114
112
|
strict: true,
|
115
113
|
props: {
|
116
|
-
compTitle: titleType
|
114
|
+
compTitle: titleType
|
117
115
|
}
|
118
116
|
}
|
119
117
|
}
|
120
|
-
}
|
118
|
+
};
|
121
119
|
};
|
122
120
|
|
123
121
|
schema.getSongAudioLink = function () {
|
@@ -137,13 +135,13 @@ schema.getSongCoverLink = function () {
|
|
137
135
|
schema.getSongInfo = function () {
|
138
136
|
return {
|
139
137
|
type: 'object',
|
140
|
-
props: {
|
138
|
+
props: {
|
141
139
|
address: this.getAddress(),
|
142
140
|
title: 'string',
|
143
141
|
fileHash: 'string',
|
144
|
-
tags: 'object',
|
142
|
+
tags: 'object',
|
145
143
|
audioLink: this.getSongAudioLink(),
|
146
|
-
coverLink: this.getSongCoverLink(),
|
144
|
+
coverLink: this.getSongCoverLink(),
|
147
145
|
priority: this.getSongPriority()
|
148
146
|
},
|
149
147
|
strict: true
|
@@ -156,7 +154,7 @@ schema.getSongAdditionResponse = function () {
|
|
156
154
|
|
157
155
|
schema.getSongInfoMasterResponse = function () {
|
158
156
|
return this.getSongInfoButlerResponse();
|
159
|
-
}
|
157
|
+
};
|
160
158
|
|
161
159
|
schema.getSongInfoButlerResponse = function () {
|
162
160
|
return {
|
@@ -169,7 +167,7 @@ schema.getSongInfoButlerResponse = function () {
|
|
169
167
|
}
|
170
168
|
},
|
171
169
|
strict: true
|
172
|
-
}
|
170
|
+
};
|
173
171
|
};
|
174
172
|
|
175
173
|
schema.getSongInfoSlaveResponse = function () {
|
@@ -178,7 +176,7 @@ schema.getSongInfoSlaveResponse = function () {
|
|
178
176
|
|
179
177
|
schema.getSongRemovalMasterResponse = function () {
|
180
178
|
return this.getSongRemovalButlerResponse();
|
181
|
-
}
|
179
|
+
};
|
182
180
|
|
183
181
|
schema.getSongRemovalButlerResponse = function () {
|
184
182
|
return this.getFileRemovalMasterResponse();
|
@@ -195,4 +193,4 @@ schema.getMusicCollection = function () {
|
|
195
193
|
return songInfo;
|
196
194
|
};
|
197
195
|
|
198
|
-
|
196
|
+
export default schema;
|
@@ -1,11 +1,8 @@
|
|
1
|
-
|
1
|
+
import schema from "../../../../../schema.js";
|
2
2
|
|
3
|
-
|
4
|
-
* Remove the song
|
5
|
-
*/
|
6
|
-
module.exports.removeSong = node => {
|
3
|
+
export const removeSong = node => {
|
7
4
|
return async (req, res, next) => {
|
8
|
-
try {
|
5
|
+
try {
|
9
6
|
const title = req.body.title;
|
10
7
|
node.songTitleTest(title);
|
11
8
|
const options = node.createRequestNetworkOptions(req.body, {
|
@@ -15,8 +12,8 @@ module.exports.removeSong = node => {
|
|
15
12
|
const removed = results.reduce((p, c) => p + c.removed, 0);
|
16
13
|
return res.send({ removed });
|
17
14
|
}
|
18
|
-
catch(err) {
|
15
|
+
catch (err) {
|
19
16
|
next(err);
|
20
|
-
}
|
21
|
-
}
|
22
|
-
};
|
17
|
+
}
|
18
|
+
};
|
19
|
+
};
|
@@ -1,15 +1,15 @@
|
|
1
|
-
|
1
|
+
import * as controllers from "./controllers.js";
|
2
2
|
|
3
|
-
|
3
|
+
export default [
|
4
4
|
/**
|
5
5
|
* Remove the song
|
6
|
-
*
|
6
|
+
*
|
7
7
|
* @api {post} /api/butler/remove-song
|
8
8
|
* @apiParam {string} title - song title
|
9
9
|
*/
|
10
|
-
{
|
10
|
+
{
|
11
11
|
name: 'removeSong',
|
12
|
-
method: 'post',
|
12
|
+
method: 'post',
|
13
13
|
url: '/remove-song',
|
14
14
|
fn: controllers.removeSong
|
15
15
|
}
|
@@ -1,11 +1,8 @@
|
|
1
|
-
|
1
|
+
import schema from "../../../../../schema.js";
|
2
2
|
|
3
|
-
|
4
|
-
* Remove the song
|
5
|
-
*/
|
6
|
-
module.exports.removeSong = node => {
|
3
|
+
export const removeSong = node => {
|
7
4
|
return async (req, res, next) => {
|
8
|
-
try {
|
5
|
+
try {
|
9
6
|
const title = req.body.title;
|
10
7
|
node.songTitleTest(title);
|
11
8
|
const options = node.createRequestNetworkOptions(req.body, {
|
@@ -15,8 +12,8 @@ module.exports.removeSong = node => {
|
|
15
12
|
const removed = results.reduce((p, c) => p + c.removed, 0);
|
16
13
|
return res.send({ removed });
|
17
14
|
}
|
18
|
-
catch(err) {
|
15
|
+
catch (err) {
|
19
16
|
next(err);
|
20
|
-
}
|
21
|
-
}
|
22
|
-
};
|
17
|
+
}
|
18
|
+
};
|
19
|
+
};
|
@@ -1,15 +1,15 @@
|
|
1
|
-
|
1
|
+
import * as controllers from "./controllers.js";
|
2
2
|
|
3
|
-
|
3
|
+
export default [
|
4
4
|
/**
|
5
5
|
* Remove the song
|
6
|
-
*
|
6
|
+
*
|
7
7
|
* @api {post} /api/master/remove-song
|
8
8
|
* @apiParam {string} title - song title
|
9
9
|
*/
|
10
|
-
{
|
10
|
+
{
|
11
11
|
name: 'removeSong',
|
12
|
-
method: 'post',
|
12
|
+
method: 'post',
|
13
13
|
url: '/remove-song',
|
14
14
|
fn: controllers.removeSong
|
15
15
|
}
|
@@ -1,61 +1,53 @@
|
|
1
|
-
|
2
|
-
|
3
|
-
|
4
|
-
|
5
|
-
|
6
|
-
const _ = require('lodash');
|
1
|
+
import utils from "../../../../../utils.js";
|
2
|
+
import fse from "fs-extra";
|
3
|
+
import path from "path";
|
4
|
+
import crypto from "crypto";
|
5
|
+
import omit from "lodash-es/omit.js";
|
7
6
|
|
8
|
-
|
9
|
-
* Add the song
|
10
|
-
*/
|
11
|
-
module.exports.addSong = node => {
|
7
|
+
export const addSong = node => {
|
12
8
|
return async (req, res, next) => {
|
13
9
|
let file;
|
14
10
|
let dupFile;
|
15
11
|
let dupFileInfo;
|
16
12
|
let filePath = '';
|
17
|
-
|
18
13
|
const cleanUp = async () => {
|
19
14
|
utils.isFileReadStream(file) && file.destroy();
|
20
|
-
|
21
|
-
if(!filePath) {
|
15
|
+
if (!filePath) {
|
22
16
|
return;
|
23
17
|
}
|
24
18
|
|
25
19
|
try {
|
26
20
|
await fse.remove(filePath);
|
27
21
|
}
|
28
|
-
catch(err) {
|
29
|
-
if(err.code != 'ENOENT') {
|
22
|
+
catch (err) {
|
23
|
+
if (err.code != 'ENOENT') {
|
30
24
|
throw err;
|
31
25
|
}
|
32
26
|
}
|
33
27
|
};
|
34
|
-
|
35
28
|
const cleanUpDuplicate = async () => {
|
36
|
-
if(!dupFile) {
|
29
|
+
if (!dupFile) {
|
37
30
|
return;
|
38
31
|
}
|
39
32
|
|
40
|
-
dupFile.destroy();
|
33
|
+
dupFile.destroy();
|
41
34
|
|
42
35
|
try {
|
43
36
|
await fse.remove(dupFile.path);
|
44
37
|
}
|
45
|
-
catch(err) {
|
46
|
-
if(err.code != 'ENOENT') {
|
38
|
+
catch (err) {
|
39
|
+
if (err.code != 'ENOENT') {
|
47
40
|
throw err;
|
48
41
|
}
|
49
42
|
}
|
50
43
|
|
51
44
|
dupFile = null;
|
52
45
|
};
|
53
|
-
|
54
46
|
const prepareApprovalInfo = () => {
|
55
47
|
try {
|
56
48
|
return JSON.parse(req.body.approvalInfo);
|
57
49
|
}
|
58
|
-
catch(err) {
|
50
|
+
catch (err) {
|
59
51
|
return null;
|
60
52
|
}
|
61
53
|
};
|
@@ -70,7 +62,7 @@ module.exports.addSong = node => {
|
|
70
62
|
const priority = parseInt(req.body.priority || 0);
|
71
63
|
node.songPriorityTest({ priority, controlled, exported });
|
72
64
|
let tags = await utils.getSongTags(file);
|
73
|
-
node.songTitleTest(tags.fullTitle);
|
65
|
+
node.songTitleTest(tags.fullTitle);
|
74
66
|
let fileInfo = await utils.getFileInfo(file);
|
75
67
|
dupFileInfo = fileInfo;
|
76
68
|
await node.fileAvailabilityTest(fileInfo);
|
@@ -78,9 +70,9 @@ module.exports.addSong = node => {
|
|
78
70
|
let fileHashToRemove = '';
|
79
71
|
let addFile = true;
|
80
72
|
let document;
|
81
|
-
|
82
|
-
HANDLE_MUSIC_DOCUMENT: if(existent) {
|
83
|
-
if(typeof existent.fileHash != 'string' || !await node.hasFile(existent.fileHash)) {
|
73
|
+
|
74
|
+
HANDLE_MUSIC_DOCUMENT: if (existent) {
|
75
|
+
if (typeof existent.fileHash != 'string' || !await node.hasFile(existent.fileHash)) {
|
84
76
|
await node.db.deleteDocument(existent);
|
85
77
|
existent = null;
|
86
78
|
break HANDLE_MUSIC_DOCUMENT;
|
@@ -91,11 +83,9 @@ module.exports.addSong = node => {
|
|
91
83
|
const newFilePath = file.path;
|
92
84
|
const currentPriority = existent.priority || 0;
|
93
85
|
|
94
|
-
if(
|
95
|
-
(controlled && !exported) ||
|
86
|
+
if ((controlled && !exported) ||
|
96
87
|
priority > currentPriority ||
|
97
|
-
(priority == currentPriority && !await node.checkSongRelevance(currentFilePath, newFilePath))
|
98
|
-
) {
|
88
|
+
(priority == currentPriority && !await node.checkSongRelevance(currentFilePath, newFilePath))) {
|
99
89
|
filePath = newFilePath;
|
100
90
|
tags = utils.mergeSongTags(await utils.getSongTags(currentFilePath), tags);
|
101
91
|
existent.priority = priority;
|
@@ -109,23 +99,23 @@ module.exports.addSong = node => {
|
|
109
99
|
filePath = await utils.setSongTags(filePath, tags);
|
110
100
|
fileInfo = await utils.getFileInfo(filePath);
|
111
101
|
await node.fileAvailabilityTest(fileInfo);
|
112
|
-
existent.title = tags.fullTitle;
|
113
|
-
|
114
|
-
if(existent.fileHash != fileInfo.hash) {
|
102
|
+
existent.title = tags.fullTitle;
|
103
|
+
|
104
|
+
if (existent.fileHash != fileInfo.hash) {
|
115
105
|
fileHashToRemove = existent.fileHash;
|
116
106
|
existent.fileHash = fileInfo.hash;
|
117
|
-
}
|
107
|
+
}
|
118
108
|
else {
|
119
109
|
addFile = false;
|
120
110
|
}
|
121
111
|
}
|
122
|
-
|
112
|
+
|
123
113
|
await node.withAddingFile(fileInfo.hash, async () => {
|
124
|
-
if(addFile) {
|
114
|
+
if (addFile) {
|
125
115
|
await node.addFileToStorage(filePath, fileInfo.hash, { copy: true });
|
126
116
|
}
|
127
|
-
|
128
|
-
if(!existent) {
|
117
|
+
|
118
|
+
if (!existent) {
|
129
119
|
document = await node.db.addMusicDocument({
|
130
120
|
title: tags.fullTitle,
|
131
121
|
fileHash: fileInfo.hash,
|
@@ -135,42 +125,43 @@ module.exports.addSong = node => {
|
|
135
125
|
else {
|
136
126
|
document = await node.db.updateMusicDocument(existent);
|
137
127
|
}
|
138
|
-
|
139
|
-
if(fileHashToRemove) {
|
128
|
+
|
129
|
+
if (fileHashToRemove) {
|
140
130
|
await node.removeFileFromStorage(fileHashToRemove);
|
141
131
|
}
|
142
|
-
});
|
132
|
+
});
|
133
|
+
|
143
134
|
const audioLink = await node.createSongAudioLink(document);
|
144
135
|
const coverLink = await node.createSongCoverLink(document);
|
145
|
-
|
146
|
-
if(duplicates.length) {
|
136
|
+
|
137
|
+
if (duplicates.length) {
|
147
138
|
const dupPath = path.join(node.tempPath, crypto.randomBytes(21).toString('hex'));
|
148
139
|
await fse.copy(file.path, dupPath);
|
149
|
-
dupFile = await
|
140
|
+
dupFile = await fse.createReadStream(dupPath);
|
150
141
|
node.duplicateSong(duplicates, dupFile, dupFileInfo, { controlled, priority, approvalInfo })
|
151
|
-
|
152
|
-
|
153
|
-
|
154
|
-
|
155
|
-
|
156
|
-
|
157
|
-
|
158
|
-
|
142
|
+
.then(cleanUpDuplicate)
|
143
|
+
.catch(err => {
|
144
|
+
node.logger.error(err.stack);
|
145
|
+
return cleanUpDuplicate();
|
146
|
+
})
|
147
|
+
.catch(err => {
|
148
|
+
node.logger.error(err.stack);
|
149
|
+
});
|
159
150
|
}
|
160
151
|
|
161
152
|
await cleanUp();
|
162
|
-
res.send({
|
153
|
+
res.send({
|
163
154
|
fileHash: document.fileHash,
|
164
|
-
audioLink,
|
165
|
-
coverLink,
|
155
|
+
audioLink,
|
156
|
+
coverLink,
|
166
157
|
title: tags.fullTitle,
|
167
|
-
tags:
|
158
|
+
tags: omit(tags, 'APIC'),
|
168
159
|
priority: document.priority || 0
|
169
|
-
});
|
160
|
+
});
|
170
161
|
}
|
171
|
-
catch(err) {
|
162
|
+
catch (err) {
|
172
163
|
await cleanUp();
|
173
164
|
next(err);
|
174
|
-
}
|
175
|
-
}
|
176
|
-
};
|
165
|
+
}
|
166
|
+
};
|
167
|
+
};
|
@@ -1,23 +1,23 @@
|
|
1
|
-
|
2
|
-
|
1
|
+
import * as controllers from "./controllers.js";
|
2
|
+
import midds from "../../midds.js";
|
3
3
|
|
4
|
-
|
4
|
+
export default [
|
5
5
|
/**
|
6
6
|
* Add the song
|
7
|
-
*
|
7
|
+
*
|
8
8
|
* @api {post} /api/node/add-song/
|
9
|
-
* @apiParam {
|
9
|
+
* @apiParam {fse.ReadStream|string} file
|
10
10
|
*/
|
11
|
-
{
|
11
|
+
{
|
12
12
|
name: 'addSong',
|
13
|
-
method: 'post',
|
13
|
+
method: 'post',
|
14
14
|
url: '/add-song',
|
15
15
|
fn: [
|
16
|
-
midds.requestQueueSong,
|
17
|
-
midds.filesFormData,
|
16
|
+
midds.requestQueueSong,
|
17
|
+
midds.filesFormData,
|
18
18
|
midds.songAdditionControl,
|
19
19
|
midds.prepareFileToStore,
|
20
20
|
controllers.addSong
|
21
21
|
]
|
22
22
|
}
|
23
|
-
];
|
23
|
+
];
|
@@ -1 +1 @@
|
|
1
|
-
|
1
|
+
export default [];
|
@@ -1,20 +1,17 @@
|
|
1
|
-
|
2
|
-
* Remove the song
|
3
|
-
*/
|
4
|
-
module.exports.removeSong = node => {
|
1
|
+
export const removeSong = node => {
|
5
2
|
return async (req, res, next) => {
|
6
3
|
try {
|
7
4
|
let removed = false;
|
8
5
|
|
9
|
-
if(req.document && req.document.fileHash && await node.hasFile(req.document.fileHash)) {
|
6
|
+
if (req.document && req.document.fileHash && await node.hasFile(req.document.fileHash)) {
|
10
7
|
await node.removeFileFromStorage(req.document.fileHash);
|
11
8
|
removed = true;
|
12
9
|
}
|
13
|
-
|
10
|
+
|
14
11
|
res.send({ removed: +removed });
|
15
12
|
}
|
16
|
-
catch(err) {
|
13
|
+
catch (err) {
|
17
14
|
next(err);
|
18
|
-
}
|
19
|
-
}
|
20
|
-
};
|
15
|
+
}
|
16
|
+
};
|
17
|
+
};
|
@@ -1,16 +1,16 @@
|
|
1
|
-
|
2
|
-
|
1
|
+
import * as controllers from "./controllers.js";
|
2
|
+
import midds from "../../midds.js";
|
3
3
|
|
4
|
-
|
4
|
+
export default [
|
5
5
|
/**
|
6
6
|
* Remove the song
|
7
|
-
*
|
7
|
+
*
|
8
8
|
* @api {post} /api/slave/remove-song
|
9
9
|
* @apiParam {string} title - song title
|
10
10
|
*/
|
11
|
-
{
|
11
|
+
{
|
12
12
|
name: 'removeSong',
|
13
|
-
method: 'post',
|
13
|
+
method: 'post',
|
14
14
|
url: '/remove-song',
|
15
15
|
fn: [
|
16
16
|
midds.requestQueueSong,
|