summaryrefslogtreecommitdiff
path: root/src/server/api/endpoints/drive
diff options
context:
space:
mode:
authorsyuilo <syuilotan@yahoo.co.jp>2018-11-02 03:32:24 +0900
committersyuilo <syuilotan@yahoo.co.jp>2018-11-02 03:32:24 +0900
commit931bdc6aace5e7aa71ffdfb470e208ead78a2a53 (patch)
treeeee6d7bf5f5480b883bb601517b4d9db03f31e9f /src/server/api/endpoints/drive
parentRefactoring (diff)
downloadsharkey-931bdc6aace5e7aa71ffdfb470e208ead78a2a53.tar.gz
sharkey-931bdc6aace5e7aa71ffdfb470e208ead78a2a53.tar.bz2
sharkey-931bdc6aace5e7aa71ffdfb470e208ead78a2a53.zip
Refactoring, Clean up and bug fixes
Diffstat (limited to 'src/server/api/endpoints/drive')
-rw-r--r--src/server/api/endpoints/drive/files.ts74
-rw-r--r--src/server/api/endpoints/drive/files/attached_notes.ts8
-rw-r--r--src/server/api/endpoints/drive/files/check_existence.ts5
-rw-r--r--src/server/api/endpoints/drive/files/create.ts20
-rw-r--r--src/server/api/endpoints/drive/files/delete.ts8
-rw-r--r--src/server/api/endpoints/drive/files/find.ts36
-rw-r--r--src/server/api/endpoints/drive/files/show.ts8
-rw-r--r--src/server/api/endpoints/drive/files/update.ts30
-rw-r--r--src/server/api/endpoints/drive/files/upload_from_url.ts33
-rw-r--r--src/server/api/endpoints/drive/folders.ts65
-rw-r--r--src/server/api/endpoints/drive/folders/create.ts13
-rw-r--r--src/server/api/endpoints/drive/folders/delete.ts8
-rw-r--r--src/server/api/endpoints/drive/folders/find.ts33
-rw-r--r--src/server/api/endpoints/drive/folders/show.ts8
-rw-r--r--src/server/api/endpoints/drive/folders/update.ts19
-rw-r--r--src/server/api/endpoints/drive/stream.ts62
16 files changed, 251 insertions, 179 deletions
diff --git a/src/server/api/endpoints/drive/files.ts b/src/server/api/endpoints/drive/files.ts
index de0bde086b..ae4e2249ff 100644
--- a/src/server/api/endpoints/drive/files.ts
+++ b/src/server/api/endpoints/drive/files.ts
@@ -1,6 +1,7 @@
-import $ from 'cafy'; import ID from '../../../../misc/cafy-id';
+import $ from 'cafy'; import ID, { transform } from '../../../../misc/cafy-id';
import DriveFile, { packMany } from '../../../../models/drive-file';
import { ILocalUser } from '../../../../models/user';
+import getParams from '../../get-params';
export const meta = {
desc: {
@@ -10,68 +11,75 @@ export const meta = {
requireCredential: true,
- kind: 'drive-read'
-};
+ kind: 'drive-read',
-export default async (params: any, user: ILocalUser) => {
- // Get 'limit' parameter
- const [limit = 10, limitErr] = $.num.optional.range(1, 100).get(params.limit);
- if (limitErr) throw 'invalid limit param';
+ params: {
+ limit: {
+ validator: $.num.optional.range(1, 100),
+ default: 10
+ },
- // Get 'sinceId' parameter
- const [sinceId, sinceIdErr] = $.type(ID).optional.get(params.sinceId);
- if (sinceIdErr) throw 'invalid sinceId param';
+ sinceId: {
+ validator: $.type(ID).optional,
+ transform: transform,
+ },
- // Get 'untilId' parameter
- const [untilId, untilIdErr] = $.type(ID).optional.get(params.untilId);
- if (untilIdErr) throw 'invalid untilId param';
+ untilId: {
+ validator: $.type(ID).optional,
+ transform: transform,
+ },
- // Check if both of sinceId and untilId is specified
- if (sinceId && untilId) {
- throw 'cannot set sinceId and untilId';
+ folderId: {
+ validator: $.type(ID).optional.nullable,
+ default: null as any,
+ transform: transform,
+ },
+
+ type: {
+ validator: $.str.optional.match(/^[a-zA-Z\/\-\*]+$/)
+ }
}
+};
- // Get 'folderId' parameter
- const [folderId = null, folderIdErr] = $.type(ID).optional.nullable.get(params.folderId);
- if (folderIdErr) throw 'invalid folderId param';
+export default async (params: any, user: ILocalUser) => {
+ const [ps, psErr] = getParams(meta, params);
+ if (psErr) throw psErr;
- // Get 'type' parameter
- const [type, typeErr] = $.str.optional.match(/^[a-zA-Z\/\-\*]+$/).get(params.type);
- if (typeErr) throw 'invalid type param';
+ // Check if both of sinceId and untilId is specified
+ if (ps.sinceId && ps.untilId) {
+ throw 'cannot set sinceId and untilId';
+ }
- // Construct query
const sort = {
_id: -1
};
const query = {
'metadata.userId': user._id,
- 'metadata.folderId': folderId,
+ 'metadata.folderId': ps.folderId,
'metadata.deletedAt': { $exists: false }
} as any;
- if (sinceId) {
+ if (ps.sinceId) {
sort._id = 1;
query._id = {
- $gt: sinceId
+ $gt: ps.sinceId
};
- } else if (untilId) {
+ } else if (ps.untilId) {
query._id = {
- $lt: untilId
+ $lt: ps.untilId
};
}
- if (type) {
- query.contentType = new RegExp(`^${type.replace(/\*/g, '.+?')}$`);
+ if (ps.type) {
+ query.contentType = new RegExp(`^${ps.type.replace(/\*/g, '.+?')}$`);
}
- // Issue query
const files = await DriveFile
.find(query, {
- limit: limit,
+ limit: ps.limit,
sort: sort
});
- // Serialize
return await packMany(files);
};
diff --git a/src/server/api/endpoints/drive/files/attached_notes.ts b/src/server/api/endpoints/drive/files/attached_notes.ts
index 1187169c64..ad9a2370b1 100644
--- a/src/server/api/endpoints/drive/files/attached_notes.ts
+++ b/src/server/api/endpoints/drive/files/attached_notes.ts
@@ -1,4 +1,4 @@
-import $ from 'cafy'; import ID from '../../../../../misc/cafy-id';
+import $ from 'cafy'; import ID, { transform } from '../../../../../misc/cafy-id';
import DriveFile from '../../../../../models/drive-file';
import { ILocalUser } from '../../../../../models/user';
import getParams from '../../../get-params';
@@ -17,12 +17,14 @@ export const meta = {
kind: 'drive-read',
params: {
- fileId: $.type(ID).note({
+ fileId: {
+ validator: $.type(ID),
+ transform: transform,
desc: {
'ja-JP': '対象のファイルID',
'en-US': 'Target file ID'
}
- })
+ }
}
};
diff --git a/src/server/api/endpoints/drive/files/check_existence.ts b/src/server/api/endpoints/drive/files/check_existence.ts
index a024701655..407c7d5530 100644
--- a/src/server/api/endpoints/drive/files/check_existence.ts
+++ b/src/server/api/endpoints/drive/files/check_existence.ts
@@ -13,11 +13,12 @@ export const meta = {
kind: 'drive-read',
params: {
- md5: $.str.note({
+ md5: {
+ validator: $.str,
desc: {
'ja-JP': 'ファイルのMD5ハッシュ'
}
- })
+ }
}
};
diff --git a/src/server/api/endpoints/drive/files/create.ts b/src/server/api/endpoints/drive/files/create.ts
index 2fa4c65846..2653eba655 100644
--- a/src/server/api/endpoints/drive/files/create.ts
+++ b/src/server/api/endpoints/drive/files/create.ts
@@ -1,6 +1,6 @@
import * as fs from 'fs';
const ms = require('ms');
-import $ from 'cafy'; import ID from '../../../../../misc/cafy-id';
+import $ from 'cafy'; import ID, { transform } from '../../../../../misc/cafy-id';
import { validateFileName, pack } from '../../../../../models/drive-file';
import create from '../../../../../services/drive/add-file';
import { ILocalUser } from '../../../../../models/user';
@@ -24,27 +24,31 @@ export const meta = {
kind: 'drive-write',
params: {
- folderId: $.type(ID).optional.nullable.note({
- default: null,
+ folderId: {
+ validator: $.type(ID).optional.nullable,
+ transform: transform,
+ default: null as any,
desc: {
'ja-JP': 'フォルダID'
}
- }),
+ },
- isSensitive: $.bool.optional.note({
+ isSensitive: {
+ validator: $.bool.optional,
default: false,
desc: {
'ja-JP': 'このメディアが「閲覧注意」(NSFW)かどうか',
'en-US': 'Whether this media is NSFW'
}
- }),
+ },
- force: $.bool.optional.note({
+ force: {
+ validator: $.bool.optional,
default: false,
desc: {
'ja-JP': 'true にすると、同じハッシュを持つファイルが既にアップロードされていても強制的にファイルを作成します。',
}
- })
+ }
}
};
diff --git a/src/server/api/endpoints/drive/files/delete.ts b/src/server/api/endpoints/drive/files/delete.ts
index fc6849e57e..af7e192655 100644
--- a/src/server/api/endpoints/drive/files/delete.ts
+++ b/src/server/api/endpoints/drive/files/delete.ts
@@ -1,4 +1,4 @@
-import $ from 'cafy'; import ID from '../../../../../misc/cafy-id';
+import $ from 'cafy'; import ID, { transform } from '../../../../../misc/cafy-id';
import DriveFile from '../../../../../models/drive-file';
import del from '../../../../../services/drive/delete-file';
import { publishDriveStream } from '../../../../../stream';
@@ -18,12 +18,14 @@ export const meta = {
kind: 'drive-write',
params: {
- fileId: $.type(ID).note({
+ fileId: {
+ validator: $.type(ID),
+ transform: transform,
desc: {
'ja-JP': '対象のファイルID',
'en-US': 'Target file ID'
}
- })
+ }
}
};
diff --git a/src/server/api/endpoints/drive/files/find.ts b/src/server/api/endpoints/drive/files/find.ts
index aa44ee688e..0ac110c110 100644
--- a/src/server/api/endpoints/drive/files/find.ts
+++ b/src/server/api/endpoints/drive/files/find.ts
@@ -1,31 +1,39 @@
-import $ from 'cafy'; import ID from '../../../../../misc/cafy-id';
+import $ from 'cafy'; import ID, { transform } from '../../../../../misc/cafy-id';
import DriveFile, { pack } from '../../../../../models/drive-file';
import { ILocalUser } from '../../../../../models/user';
+import getParams from '../../../get-params';
export const meta = {
requireCredential: true,
- kind: 'drive-read'
+ kind: 'drive-read',
+
+ params: {
+ name: {
+ validator: $.str
+ },
+
+ folderId: {
+ validator: $.type(ID).optional.nullable,
+ transform: transform,
+ default: null as any,
+ desc: {
+ 'ja-JP': 'フォルダID'
+ }
+ },
+ }
};
export default (params: any, user: ILocalUser) => new Promise(async (res, rej) => {
- // Get 'name' parameter
- const [name, nameErr] = $.str.get(params.name);
- if (nameErr) return rej('invalid name param');
-
- // Get 'folderId' parameter
- const [folderId = null, folderIdErr] = $.type(ID).optional.nullable.get(params.folderId);
- if (folderIdErr) return rej('invalid folderId param');
+ const [ps, psErr] = getParams(meta, params);
+ if (psErr) return rej(psErr);
- // Issue query
const files = await DriveFile
.find({
filename: name,
'metadata.userId': user._id,
- 'metadata.folderId': folderId
+ 'metadata.folderId': ps.folderId
});
- // Serialize
- res(await Promise.all(files.map(async file =>
- await pack(file))));
+ res(await Promise.all(files.map(file => pack(file))));
});
diff --git a/src/server/api/endpoints/drive/files/show.ts b/src/server/api/endpoints/drive/files/show.ts
index 49d6027add..ce0812c508 100644
--- a/src/server/api/endpoints/drive/files/show.ts
+++ b/src/server/api/endpoints/drive/files/show.ts
@@ -1,4 +1,4 @@
-import $ from 'cafy'; import ID from '../../../../../misc/cafy-id';
+import $ from 'cafy'; import ID, { transform } from '../../../../../misc/cafy-id';
import DriveFile, { pack } from '../../../../../models/drive-file';
import { ILocalUser } from '../../../../../models/user';
import getParams from '../../../get-params';
@@ -16,12 +16,14 @@ export const meta = {
kind: 'drive-read',
params: {
- fileId: $.type(ID).note({
+ fileId: {
+ validator: $.type(ID),
+ transform: transform,
desc: {
'ja-JP': '対象のファイルID',
'en-US': 'Target file ID'
}
- })
+ }
}
};
diff --git a/src/server/api/endpoints/drive/files/update.ts b/src/server/api/endpoints/drive/files/update.ts
index 915cf4ceb2..7c335e5bc6 100644
--- a/src/server/api/endpoints/drive/files/update.ts
+++ b/src/server/api/endpoints/drive/files/update.ts
@@ -1,4 +1,4 @@
-import $ from 'cafy'; import ID from '../../../../../misc/cafy-id';
+import $ from 'cafy'; import ID, { transform } from '../../../../../misc/cafy-id';
import DriveFolder from '../../../../../models/drive-folder';
import DriveFile, { validateFileName, pack } from '../../../../../models/drive-file';
import { publishDriveStream } from '../../../../../stream';
@@ -17,34 +17,40 @@ export const meta = {
kind: 'drive-write',
params: {
- fileId: $.type(ID).note({
+ fileId: {
+ validator: $.type(ID),
+ transform: transform,
desc: {
'ja-JP': '対象のファイルID'
}
- }),
+ },
- folderId: $.type(ID).optional.nullable.note({
- default: undefined,
+ folderId: {
+ validator: $.type(ID).optional.nullable,
+ transform: transform,
+ default: undefined as any,
desc: {
'ja-JP': 'フォルダID'
}
- }),
+ },
- name: $.str.optional.pipe(validateFileName).note({
- default: undefined,
+ name: {
+ validator: $.str.optional.pipe(validateFileName),
+ default: undefined as any,
desc: {
'ja-JP': 'ファイル名',
'en-US': 'Name of the file'
}
- }),
+ },
- isSensitive: $.bool.optional.note({
- default: undefined,
+ isSensitive: {
+ validator: $.bool.optional,
+ default: undefined as any,
desc: {
'ja-JP': 'このメディアが「閲覧注意」(NSFW)かどうか',
'en-US': 'Whether this media is NSFW'
}
- })
+ }
}
};
diff --git a/src/server/api/endpoints/drive/files/upload_from_url.ts b/src/server/api/endpoints/drive/files/upload_from_url.ts
index 783646feb3..3d19725275 100644
--- a/src/server/api/endpoints/drive/files/upload_from_url.ts
+++ b/src/server/api/endpoints/drive/files/upload_from_url.ts
@@ -1,8 +1,9 @@
-import $ from 'cafy'; import ID from '../../../../../misc/cafy-id';
+import $ from 'cafy'; import ID, { transform } from '../../../../../misc/cafy-id';
const ms = require('ms');
import { pack } from '../../../../../models/drive-file';
import uploadFromUrl from '../../../../../services/drive/upload-from-url';
import { ILocalUser } from '../../../../../models/user';
+import getParams from '../../../get-params';
export const meta = {
desc: {
@@ -16,21 +17,25 @@ export const meta = {
requireCredential: true,
- kind: 'drive-write'
+ kind: 'drive-write',
+
+ params: {
+ url: {
+ // TODO: Validate this url
+ validator: $.str,
+ },
+
+ folderId: {
+ validator: $.type(ID).optional.nullable,
+ default: null as any as any,
+ transform: transform
+ },
+ }
};
-/**
- * Create a file from a URL
- */
export default async (params: any, user: ILocalUser): Promise<any> => {
- // Get 'url' parameter
- // TODO: Validate this url
- const [url, urlErr] = $.str.get(params.url);
- if (urlErr) throw 'invalid url param';
-
- // Get 'folderId' parameter
- const [folderId = null, folderIdErr] = $.type(ID).optional.nullable.get(params.folderId);
- if (folderIdErr) throw 'invalid folderId param';
+ const [ps, psErr] = getParams(meta, params);
+ if (psErr) throw psErr;
- return pack(await uploadFromUrl(url, user, folderId));
+ return pack(await uploadFromUrl(ps.url, user, ps.folderId));
};
diff --git a/src/server/api/endpoints/drive/folders.ts b/src/server/api/endpoints/drive/folders.ts
index 19c2ef7aca..95700ee26c 100644
--- a/src/server/api/endpoints/drive/folders.ts
+++ b/src/server/api/endpoints/drive/folders.ts
@@ -1,6 +1,7 @@
-import $ from 'cafy'; import ID from '../../../../misc/cafy-id';
+import $ from 'cafy'; import ID, { transform } from '../../../../misc/cafy-id';
import DriveFolder, { pack } from '../../../../models/drive-folder';
import { ILocalUser } from '../../../../models/user';
+import getParams from '../../get-params';
export const meta = {
desc: {
@@ -10,58 +11,64 @@ export const meta = {
requireCredential: true,
- kind: 'drive-read'
-};
+ kind: 'drive-read',
-export default (params: any, user: ILocalUser) => new Promise(async (res, rej) => {
- // Get 'limit' parameter
- const [limit = 10, limitErr] = $.num.optional.range(1, 100).get(params.limit);
- if (limitErr) return rej('invalid limit param');
+ params: {
+ limit: {
+ validator: $.num.optional.range(1, 100),
+ default: 10
+ },
+
+ sinceId: {
+ validator: $.type(ID).optional,
+ transform: transform,
+ },
+
+ untilId: {
+ validator: $.type(ID).optional,
+ transform: transform,
+ },
- // Get 'sinceId' parameter
- const [sinceId, sinceIdErr] = $.type(ID).optional.get(params.sinceId);
- if (sinceIdErr) return rej('invalid sinceId param');
+ folderId: {
+ validator: $.type(ID).optional.nullable,
+ default: null as any,
+ transform: transform,
+ }
+ }
+};
- // Get 'untilId' parameter
- const [untilId, untilIdErr] = $.type(ID).optional.get(params.untilId);
- if (untilIdErr) return rej('invalid untilId param');
+export default (params: any, user: ILocalUser) => new Promise(async (res, rej) => {
+ const [ps, psErr] = getParams(meta, params);
+ if (psErr) return rej(psErr);
// Check if both of sinceId and untilId is specified
- if (sinceId && untilId) {
+ if (ps.sinceId && ps.untilId) {
return rej('cannot set sinceId and untilId');
}
- // Get 'folderId' parameter
- const [folderId = null, folderIdErr] = $.type(ID).optional.nullable.get(params.folderId);
- if (folderIdErr) return rej('invalid folderId param');
-
- // Construct query
const sort = {
_id: -1
};
const query = {
userId: user._id,
- parentId: folderId
+ parentId: ps.folderId
} as any;
- if (sinceId) {
+ if (ps.sinceId) {
sort._id = 1;
query._id = {
- $gt: sinceId
+ $gt: ps.sinceId
};
- } else if (untilId) {
+ } else if (ps.untilId) {
query._id = {
- $lt: untilId
+ $lt: ps.untilId
};
}
- // Issue query
const folders = await DriveFolder
.find(query, {
- limit: limit,
+ limit: ps.limit,
sort: sort
});
- // Serialize
- res(await Promise.all(folders.map(async folder =>
- await pack(folder))));
+ res(await Promise.all(folders.map(folder => pack(folder))));
});
diff --git a/src/server/api/endpoints/drive/folders/create.ts b/src/server/api/endpoints/drive/folders/create.ts
index cca25b0596..b51fb0264e 100644
--- a/src/server/api/endpoints/drive/folders/create.ts
+++ b/src/server/api/endpoints/drive/folders/create.ts
@@ -1,4 +1,4 @@
-import $ from 'cafy'; import ID from '../../../../../misc/cafy-id';
+import $ from 'cafy'; import ID, { transform } from '../../../../../misc/cafy-id';
import DriveFolder, { isValidFolderName, pack } from '../../../../../models/drive-folder';
import { publishDriveStream } from '../../../../../stream';
import { ILocalUser } from '../../../../../models/user';
@@ -17,20 +17,23 @@ export const meta = {
kind: 'drive-write',
params: {
- name: $.str.optional.pipe(isValidFolderName).note({
+ name: {
+ validator: $.str.optional.pipe(isValidFolderName),
default: 'Untitled',
desc: {
'ja-JP': 'フォルダ名',
'en-US': 'Folder name'
}
- }),
+ },
- parentId: $.type(ID).optional.nullable.note({
+ parentId: {
+ validator: $.type(ID).optional.nullable,
+ transform: transform,
desc: {
'ja-JP': '親フォルダID',
'en-US': 'Parent folder ID'
}
- })
+ }
}
};
diff --git a/src/server/api/endpoints/drive/folders/delete.ts b/src/server/api/endpoints/drive/folders/delete.ts
index 41f9108788..304666bdc9 100644
--- a/src/server/api/endpoints/drive/folders/delete.ts
+++ b/src/server/api/endpoints/drive/folders/delete.ts
@@ -1,4 +1,4 @@
-import $ from 'cafy'; import ID from '../../../../../misc/cafy-id';
+import $ from 'cafy'; import ID, { transform } from '../../../../../misc/cafy-id';
import DriveFolder from '../../../../../models/drive-folder';
import { ILocalUser } from '../../../../../models/user';
import getParams from '../../../get-params';
@@ -18,12 +18,14 @@ export const meta = {
kind: 'drive-write',
params: {
- folderId: $.type(ID).note({
+ folderId: {
+ validator: $.type(ID),
+ transform: transform,
desc: {
'ja-JP': '対象のフォルダID',
'en-US': 'Target folder ID'
}
- })
+ }
}
};
diff --git a/src/server/api/endpoints/drive/folders/find.ts b/src/server/api/endpoints/drive/folders/find.ts
index ec3c1d2e36..3d24d18685 100644
--- a/src/server/api/endpoints/drive/folders/find.ts
+++ b/src/server/api/endpoints/drive/folders/find.ts
@@ -1,30 +1,39 @@
-import $ from 'cafy'; import ID from '../../../../../misc/cafy-id';
+import $ from 'cafy'; import ID, { transform } from '../../../../../misc/cafy-id';
import DriveFolder, { pack } from '../../../../../models/drive-folder';
import { ILocalUser } from '../../../../../models/user';
+import getParams from '../../../get-params';
export const meta = {
requireCredential: true,
- kind: 'drive-read'
+ kind: 'drive-read',
+
+ params: {
+ name: {
+ validator: $.str
+ },
+
+ parentId: {
+ validator: $.type(ID).optional.nullable,
+ transform: transform,
+ default: null as any,
+ desc: {
+ 'ja-JP': 'フォルダID'
+ }
+ },
+ }
};
export default (params: any, user: ILocalUser) => new Promise(async (res, rej) => {
- // Get 'name' parameter
- const [name, nameErr] = $.str.get(params.name);
- if (nameErr) return rej('invalid name param');
-
- // Get 'parentId' parameter
- const [parentId = null, parentIdErr] = $.type(ID).optional.nullable.get(params.parentId);
- if (parentIdErr) return rej('invalid parentId param');
+ const [ps, psErr] = getParams(meta, params);
+ if (psErr) return rej(psErr);
- // Issue query
const folders = await DriveFolder
.find({
name: name,
userId: user._id,
- parentId: parentId
+ parentId: ps.parentId
});
- // Serialize
res(await Promise.all(folders.map(folder => pack(folder))));
});
diff --git a/src/server/api/endpoints/drive/folders/show.ts b/src/server/api/endpoints/drive/folders/show.ts
index f01c75d957..b7d8f0a29b 100644
--- a/src/server/api/endpoints/drive/folders/show.ts
+++ b/src/server/api/endpoints/drive/folders/show.ts
@@ -1,4 +1,4 @@
-import $ from 'cafy'; import ID from '../../../../../misc/cafy-id';
+import $ from 'cafy'; import ID, { transform } from '../../../../../misc/cafy-id';
import DriveFolder, { pack } from '../../../../../models/drive-folder';
import { ILocalUser } from '../../../../../models/user';
import getParams from '../../../get-params';
@@ -16,12 +16,14 @@ export const meta = {
kind: 'drive-read',
params: {
- folderId: $.type(ID).note({
+ folderId: {
+ validator: $.type(ID),
+ transform: transform,
desc: {
'ja-JP': '対象のフォルダID',
'en-US': 'Target folder ID'
}
- })
+ }
}
};
diff --git a/src/server/api/endpoints/drive/folders/update.ts b/src/server/api/endpoints/drive/folders/update.ts
index b041a15920..53bb14bfe7 100644
--- a/src/server/api/endpoints/drive/folders/update.ts
+++ b/src/server/api/endpoints/drive/folders/update.ts
@@ -1,4 +1,4 @@
-import $ from 'cafy'; import ID from '../../../../../misc/cafy-id';
+import $ from 'cafy'; import ID, { transform } from '../../../../../misc/cafy-id';
import DriveFolder, { isValidFolderName, pack } from '../../../../../models/drive-folder';
import { publishDriveStream } from '../../../../../stream';
import { ILocalUser } from '../../../../../models/user';
@@ -17,26 +17,31 @@ export const meta = {
kind: 'drive-write',
params: {
- folderId: $.type(ID).note({
+ folderId: {
+ validator: $.type(ID),
+ transform: transform,
desc: {
'ja-JP': '対象のフォルダID',
'en-US': 'Target folder ID'
}
- }),
+ },
- name: $.str.optional.pipe(isValidFolderName).note({
+ name: {
+ validator: $.str.optional.pipe(isValidFolderName),
desc: {
'ja-JP': 'フォルダ名',
'en-US': 'Folder name'
}
- }),
+ },
- parentId: $.type(ID).optional.nullable.note({
+ parentId: {
+ validator: $.type(ID).optional.nullable,
+ transform: transform,
desc: {
'ja-JP': '親フォルダID',
'en-US': 'Parent folder ID'
}
- })
+ }
}
};
diff --git a/src/server/api/endpoints/drive/stream.ts b/src/server/api/endpoints/drive/stream.ts
index 3ac7dd0234..ecf405fe64 100644
--- a/src/server/api/endpoints/drive/stream.ts
+++ b/src/server/api/endpoints/drive/stream.ts
@@ -1,36 +1,44 @@
-import $ from 'cafy'; import ID from '../../../../misc/cafy-id';
+import $ from 'cafy'; import ID, { transform } from '../../../../misc/cafy-id';
import DriveFile, { packMany } from '../../../../models/drive-file';
import { ILocalUser } from '../../../../models/user';
+import getParams from '../../get-params';
export const meta = {
requireCredential: true,
- kind: 'drive-read'
-};
+ kind: 'drive-read',
-export default (params: any, user: ILocalUser) => new Promise(async (res, rej) => {
- // Get 'limit' parameter
- const [limit = 10, limitErr] = $.num.optional.range(1, 100).get(params.limit);
- if (limitErr) return rej('invalid limit param');
+ params: {
+ limit: {
+ validator: $.num.optional.range(1, 100),
+ default: 10
+ },
+
+ sinceId: {
+ validator: $.type(ID).optional,
+ transform: transform,
+ },
+
+ untilId: {
+ validator: $.type(ID).optional,
+ transform: transform,
+ },
- // Get 'sinceId' parameter
- const [sinceId, sinceIdErr] = $.type(ID).optional.get(params.sinceId);
- if (sinceIdErr) return rej('invalid sinceId param');
+ type: {
+ validator: $.str.optional.match(/^[a-zA-Z\/\-\*]+$/)
+ }
+ }
+};
- // Get 'untilId' parameter
- const [untilId, untilIdErr] = $.type(ID).optional.get(params.untilId);
- if (untilIdErr) return rej('invalid untilId param');
+export default (params: any, user: ILocalUser) => new Promise(async (res, rej) => {
+ const [ps, psErr] = getParams(meta, params);
+ if (psErr) return rej(psErr);
// Check if both of sinceId and untilId is specified
- if (sinceId && untilId) {
+ if (ps.sinceId && ps.untilId) {
return rej('cannot set sinceId and untilId');
}
- // Get 'type' parameter
- const [type, typeErr] = $.str.optional.match(/^[a-zA-Z\/\-\*]+$/).get(params.type);
- if (typeErr) return rej('invalid type param');
-
- // Construct query
const sort = {
_id: -1
};
@@ -40,28 +48,26 @@ export default (params: any, user: ILocalUser) => new Promise(async (res, rej) =
'metadata.deletedAt': { $exists: false }
} as any;
- if (sinceId) {
+ if (ps.sinceId) {
sort._id = 1;
query._id = {
- $gt: sinceId
+ $gt: ps.sinceId
};
- } else if (untilId) {
+ } else if (ps.untilId) {
query._id = {
- $lt: untilId
+ $lt: ps.untilId
};
}
- if (type) {
- query.contentType = new RegExp(`^${type.replace(/\*/g, '.+?')}$`);
+ if (ps.type) {
+ query.contentType = new RegExp(`^${ps.type.replace(/\*/g, '.+?')}$`);
}
- // Issue query
const files = await DriveFile
.find(query, {
- limit: limit,
+ limit: ps.limit,
sort: sort
});
- // Serialize
res(await packMany(files));
});