summaryrefslogtreecommitdiff
path: root/src/server/api/endpoints/notes
diff options
context:
space:
mode:
authorsyuilo <syuilotan@yahoo.co.jp>2018-09-05 23:55:51 +0900
committersyuilo <syuilotan@yahoo.co.jp>2018-09-05 23:55:51 +0900
commitb5ff2abdb9ee0c086c8970c738cce5d61761f8f5 (patch)
treec23a8e7e5bec3ea21167795fd008942127823d41 /src/server/api/endpoints/notes
parent[WIP] Update welcome page (diff)
downloadsharkey-b5ff2abdb9ee0c086c8970c738cce5d61761f8f5.tar.gz
sharkey-b5ff2abdb9ee0c086c8970c738cce5d61761f8f5.tar.bz2
sharkey-b5ff2abdb9ee0c086c8970c738cce5d61761f8f5.zip
互換性のためのコードを追加 & #2623
Diffstat (limited to 'src/server/api/endpoints/notes')
-rw-r--r--src/server/api/endpoints/notes/global-timeline.ts77
-rw-r--r--src/server/api/endpoints/notes/hybrid-timeline.ts12
-rw-r--r--src/server/api/endpoints/notes/local-timeline.ts77
-rw-r--r--src/server/api/endpoints/notes/search_by_tag.ts185
-rw-r--r--src/server/api/endpoints/notes/timeline.ts12
-rw-r--r--src/server/api/endpoints/notes/user-list-timeline.ts12
6 files changed, 226 insertions, 149 deletions
diff --git a/src/server/api/endpoints/notes/global-timeline.ts b/src/server/api/endpoints/notes/global-timeline.ts
index 554245a0f4..e70fc5d76f 100644
--- a/src/server/api/endpoints/notes/global-timeline.ts
+++ b/src/server/api/endpoints/notes/global-timeline.ts
@@ -3,40 +3,49 @@ import Note from '../../../../models/note';
import Mute from '../../../../models/mute';
import { pack } from '../../../../models/note';
import { ILocalUser } from '../../../../models/user';
+import getParams from '../../get-params';
-/**
- * Get timeline of global
- */
-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';
+export const meta = {
+ desc: {
+ 'ja-JP': 'グローバルタイムラインを取得します。'
+ },
+
+ params: {
+ withFiles: $.bool.optional.note({
+ desc: {
+ 'ja-JP': 'ファイルが添付された投稿に限定するか否か'
+ }
+ }),
+
+ mediaOnly: $.bool.optional.note({
+ desc: {
+ 'ja-JP': 'ファイルが添付された投稿に限定するか否か (このパラメータは廃止予定です。代わりに withFiles を使ってください。)'
+ }
+ }),
+
+ limit: $.num.optional.range(1, 100).note({
+ default: 10
+ }),
+
+ sinceId: $.type(ID).optional.note({}),
- // Get 'sinceId' parameter
- const [sinceId, sinceIdErr] = $.type(ID).optional.get(params.sinceId);
- if (sinceIdErr) throw 'invalid sinceId param';
+ untilId: $.type(ID).optional.note({}),
- // Get 'untilId' parameter
- const [untilId, untilIdErr] = $.type(ID).optional.get(params.untilId);
- if (untilIdErr) throw 'invalid untilId param';
+ sinceDate: $.num.optional.note({}),
- // Get 'sinceDate' parameter
- const [sinceDate, sinceDateErr] = $.num.optional.get(params.sinceDate);
- if (sinceDateErr) throw 'invalid sinceDate param';
+ untilDate: $.num.optional.note({}),
+ }
+};
- // Get 'untilDate' parameter
- const [untilDate, untilDateErr] = $.num.optional.get(params.untilDate);
- if (untilDateErr) throw 'invalid untilDate param';
+export default async (params: any, user: ILocalUser) => {
+ const [ps, psErr] = getParams(meta, params);
+ if (psErr) throw psErr;
// Check if only one of sinceId, untilId, sinceDate, untilDate specified
- if ([sinceId, untilId, sinceDate, untilDate].filter(x => x != null).length > 1) {
+ if ([ps.sinceId, ps.untilId, ps.sinceDate, ps.untilDate].filter(x => x != null).length > 1) {
throw 'only one of sinceId, untilId, sinceDate, untilDate can be specified';
}
- // Get 'withFiles' parameter
- const [withFiles, withFilesErr] = $.bool.optional.get(params.withFiles);
- if (withFilesErr) throw 'invalid withFiles param';
-
// ミュートしているユーザーを取得
const mutedUserIds = user ? (await Mute.find({
muterId: user._id
@@ -68,27 +77,29 @@ export default async (params: any, user: ILocalUser) => {
};
}
+ const withFiles = ps.withFiles != null ? ps.withFiles : ps.mediaOnly;
+
if (withFiles) {
query.fileIds = { $exists: true, $ne: [] };
}
- 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
};
- } else if (sinceDate) {
+ } else if (ps.sinceDate) {
sort._id = 1;
query.createdAt = {
- $gt: new Date(sinceDate)
+ $gt: new Date(ps.sinceDate)
};
- } else if (untilDate) {
+ } else if (ps.untilDate) {
query.createdAt = {
- $lt: new Date(untilDate)
+ $lt: new Date(ps.untilDate)
};
}
//#endregion
@@ -96,7 +107,7 @@ export default async (params: any, user: ILocalUser) => {
// Issue query
const timeline = await Note
.find(query, {
- limit: limit,
+ limit: ps.limit,
sort: sort
});
diff --git a/src/server/api/endpoints/notes/hybrid-timeline.ts b/src/server/api/endpoints/notes/hybrid-timeline.ts
index 1060792683..16cec86797 100644
--- a/src/server/api/endpoints/notes/hybrid-timeline.ts
+++ b/src/server/api/endpoints/notes/hybrid-timeline.ts
@@ -7,8 +7,6 @@ import { ILocalUser } from '../../../../models/user';
import getParams from '../../get-params';
export const meta = {
- name: 'notes/hybrid-timeline',
-
desc: {
'ja-JP': 'ハイブリッドタイムラインを取得します。'
},
@@ -68,7 +66,13 @@ export const meta = {
withFiles: $.bool.optional.note({
desc: {
- 'ja-JP': 'true にすると、メディアが添付された投稿だけ取得します'
+ 'ja-JP': 'true にすると、ファイルが添付された投稿だけ取得します'
+ }
+ }),
+
+ mediaOnly: $.bool.optional.note({
+ desc: {
+ 'ja-JP': 'true にすると、ファイルが添付された投稿だけ取得します (このパラメータは廃止予定です。代わりに withFiles を使ってください。)'
}
}),
}
@@ -203,7 +207,7 @@ export default async (params: any, user: ILocalUser) => {
});
}
- if (ps.withFiles) {
+ if (ps.withFiles || ps.mediaOnly) {
query.$and.push({
fileIds: { $exists: true, $ne: [] }
});
diff --git a/src/server/api/endpoints/notes/local-timeline.ts b/src/server/api/endpoints/notes/local-timeline.ts
index 018e636ab5..2458a70556 100644
--- a/src/server/api/endpoints/notes/local-timeline.ts
+++ b/src/server/api/endpoints/notes/local-timeline.ts
@@ -3,40 +3,49 @@ import Note from '../../../../models/note';
import Mute from '../../../../models/mute';
import { pack } from '../../../../models/note';
import { ILocalUser } from '../../../../models/user';
+import getParams from '../../get-params';
-/**
- * Get timeline of local
- */
-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';
+export const meta = {
+ desc: {
+ 'ja-JP': 'ローカルタイムラインを取得します。'
+ },
+
+ params: {
+ withFiles: $.bool.optional.note({
+ desc: {
+ 'ja-JP': 'ファイルが添付された投稿に限定するか否か'
+ }
+ }),
+
+ mediaOnly: $.bool.optional.note({
+ desc: {
+ 'ja-JP': 'ファイルが添付された投稿に限定するか否か (このパラメータは廃止予定です。代わりに withFiles を使ってください。)'
+ }
+ }),
+
+ limit: $.num.optional.range(1, 100).note({
+ default: 10
+ }),
+
+ sinceId: $.type(ID).optional.note({}),
- // Get 'sinceId' parameter
- const [sinceId, sinceIdErr] = $.type(ID).optional.get(params.sinceId);
- if (sinceIdErr) throw 'invalid sinceId param';
+ untilId: $.type(ID).optional.note({}),
- // Get 'untilId' parameter
- const [untilId, untilIdErr] = $.type(ID).optional.get(params.untilId);
- if (untilIdErr) throw 'invalid untilId param';
+ sinceDate: $.num.optional.note({}),
- // Get 'sinceDate' parameter
- const [sinceDate, sinceDateErr] = $.num.optional.get(params.sinceDate);
- if (sinceDateErr) throw 'invalid sinceDate param';
+ untilDate: $.num.optional.note({}),
+ }
+};
- // Get 'untilDate' parameter
- const [untilDate, untilDateErr] = $.num.optional.get(params.untilDate);
- if (untilDateErr) throw 'invalid untilDate param';
+export default async (params: any, user: ILocalUser) => {
+ const [ps, psErr] = getParams(meta, params);
+ if (psErr) throw psErr;
// Check if only one of sinceId, untilId, sinceDate, untilDate specified
- if ([sinceId, untilId, sinceDate, untilDate].filter(x => x != null).length > 1) {
+ if ([ps.sinceId, ps.untilId, ps.sinceDate, ps.untilDate].filter(x => x != null).length > 1) {
throw 'only one of sinceId, untilId, sinceDate, untilDate can be specified';
}
- // Get 'withFiles' parameter
- const [withFiles, withFilesErr] = $.bool.optional.get(params.withFiles);
- if (withFilesErr) throw 'invalid withFiles param';
-
// ミュートしているユーザーを取得
const mutedUserIds = user ? (await Mute.find({
muterId: user._id
@@ -69,27 +78,29 @@ export default async (params: any, user: ILocalUser) => {
};
}
+ const withFiles = ps.withFiles != null ? ps.withFiles : ps.mediaOnly;
+
if (withFiles) {
query.fileIds = { $exists: true, $ne: [] };
}
- 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
};
- } else if (sinceDate) {
+ } else if (ps.sinceDate) {
sort._id = 1;
query.createdAt = {
- $gt: new Date(sinceDate)
+ $gt: new Date(ps.sinceDate)
};
- } else if (untilDate) {
+ } else if (ps.untilDate) {
query.createdAt = {
- $lt: new Date(untilDate)
+ $lt: new Date(ps.untilDate)
};
}
//#endregion
@@ -97,7 +108,7 @@ export default async (params: any, user: ILocalUser) => {
// Issue query
const timeline = await Note
.find(query, {
- limit: limit,
+ limit: ps.limit,
sort: sort
});
diff --git a/src/server/api/endpoints/notes/search_by_tag.ts b/src/server/api/endpoints/notes/search_by_tag.ts
index f982dc01e9..82f11a9775 100644
--- a/src/server/api/endpoints/notes/search_by_tag.ts
+++ b/src/server/api/endpoints/notes/search_by_tag.ts
@@ -4,119 +4,152 @@ import User, { ILocalUser } from '../../../../models/user';
import Mute from '../../../../models/mute';
import { getFriendIds } from '../../common/get-friends';
import { pack } from '../../../../models/note';
+import getParams from '../../get-params';
-/**
- * Search notes by tag
- */
-export default (params: any, me: ILocalUser) => new Promise(async (res, rej) => {
- // Get 'tag' parameter
- const [tag, tagError] = $.str.get(params.tag);
- if (tagError) return rej('invalid tag param');
+export const meta = {
+ desc: {
+ 'ja-JP': '指定されたタグが付けられた投稿を取得します。'
+ },
+
+ params: {
+ tag: $.str.note({
+ desc: {
+ 'ja-JP': 'タグ'
+ }
+ }),
+
+ includeUserIds: $.arr($.type(ID)).optional.note({
+ default: []
+ }),
+
+ excludeUserIds: $.arr($.type(ID)).optional.note({
+ default: []
+ }),
+
+ includeUserUsernames: $.arr($.str).optional.note({
+ default: []
+ }),
+
+ excludeUserUsernames: $.arr($.str).optional.note({
+ default: []
+ }),
+
+ following: $.bool.optional.nullable.note({
+ default: null
+ }),
+
+ mute: $.str.optional.note({
+ default: 'mute_all'
+ }),
- // Get 'includeUserIds' parameter
- const [includeUserIds = [], includeUserIdsErr] = $.arr($.type(ID)).optional.get(params.includeUserIds);
- if (includeUserIdsErr) return rej('invalid includeUserIds param');
+ reply: $.bool.optional.nullable.note({
+ default: null,
- // Get 'excludeUserIds' parameter
- const [excludeUserIds = [], excludeUserIdsErr] = $.arr($.type(ID)).optional.get(params.excludeUserIds);
- if (excludeUserIdsErr) return rej('invalid excludeUserIds param');
+ desc: {
+ 'ja-JP': '返信に限定するか否か'
+ }
+ }),
- // Get 'includeUserUsernames' parameter
- const [includeUserUsernames = [], includeUserUsernamesErr] = $.arr($.str).optional.get(params.includeUserUsernames);
- if (includeUserUsernamesErr) return rej('invalid includeUserUsernames param');
+ renote: $.bool.optional.nullable.note({
+ default: null,
- // Get 'excludeUserUsernames' parameter
- const [excludeUserUsernames = [], excludeUserUsernamesErr] = $.arr($.str).optional.get(params.excludeUserUsernames);
- if (excludeUserUsernamesErr) return rej('invalid excludeUserUsernames param');
+ desc: {
+ 'ja-JP': 'Renoteに限定するか否か'
+ }
+ }),
- // Get 'following' parameter
- const [following = null, followingErr] = $.bool.optional.nullable.get(params.following);
- if (followingErr) return rej('invalid following param');
+ withFiles: $.bool.optional.nullable.note({
+ default: null,
- // Get 'mute' parameter
- const [mute = 'mute_all', muteErr] = $.str.optional.get(params.mute);
- if (muteErr) return rej('invalid mute param');
+ desc: {
+ 'ja-JP': 'ファイルが添付された投稿に限定するか否か'
+ }
+ }),
- // Get 'reply' parameter
- const [reply = null, replyErr] = $.bool.optional.nullable.get(params.reply);
- if (replyErr) return rej('invalid reply param');
+ media: $.bool.optional.nullable.note({
+ default: null,
- // Get 'renote' parameter
- const [renote = null, renoteErr] = $.bool.optional.nullable.get(params.renote);
- if (renoteErr) return rej('invalid renote param');
+ desc: {
+ 'ja-JP': 'ファイルが添付された投稿に限定するか否か (このパラメータは廃止予定です。代わりに withFiles を使ってください。)'
+ }
+ }),
- // Get 'withFiles' parameter
- const [withFiles = null, withFilesErr] = $.bool.optional.nullable.get(params.withFiles);
- if (withFilesErr) return rej('invalid withFiles param');
+ poll: $.bool.optional.nullable.note({
+ default: null,
- // Get 'poll' parameter
- const [poll = null, pollErr] = $.bool.optional.nullable.get(params.poll);
- if (pollErr) return rej('invalid poll param');
+ desc: {
+ 'ja-JP': 'アンケートが添付された投稿に限定するか否か'
+ }
+ }),
- // Get 'sinceDate' parameter
- const [sinceDate, sinceDateErr] = $.num.optional.get(params.sinceDate);
- if (sinceDateErr) throw 'invalid sinceDate param';
+ sinceDate: $.num.optional.note({
+ }),
- // Get 'untilDate' parameter
- const [untilDate, untilDateErr] = $.num.optional.get(params.untilDate);
- if (untilDateErr) throw 'invalid untilDate param';
+ untilDate: $.num.optional.note({
+ }),
- // Get 'offset' parameter
- const [offset = 0, offsetErr] = $.num.optional.min(0).get(params.offset);
- if (offsetErr) return rej('invalid offset param');
+ offset: $.num.optional.min(0).note({
+ default: 0
+ }),
- // Get 'limit' parameter
- const [limit = 10, limitErr] = $.num.optional.range(1, 30).get(params.limit);
- if (limitErr) return rej('invalid limit param');
+ limit: $.num.optional.range(1, 30).note({
+ default: 10
+ }),
+ }
+};
+
+export default (params: any, me: ILocalUser) => new Promise(async (res, rej) => {
+ const [ps, psErr] = getParams(meta, params);
+ if (psErr) throw psErr;
- if (includeUserUsernames != null) {
- const ids = (await Promise.all(includeUserUsernames.map(async (username) => {
+ if (ps.includeUserUsernames != null) {
+ const ids = (await Promise.all(ps.includeUserUsernames.map(async (username) => {
const _user = await User.findOne({
usernameLower: username.toLowerCase()
});
return _user ? _user._id : null;
}))).filter(id => id != null);
- ids.forEach(id => includeUserIds.push(id));
+ ids.forEach(id => ps.includeUserIds.push(id));
}
- if (excludeUserUsernames != null) {
- const ids = (await Promise.all(excludeUserUsernames.map(async (username) => {
+ if (ps.excludeUserUsernames != null) {
+ const ids = (await Promise.all(ps.excludeUserUsernames.map(async (username) => {
const _user = await User.findOne({
usernameLower: username.toLowerCase()
});
return _user ? _user._id : null;
}))).filter(id => id != null);
- ids.forEach(id => excludeUserIds.push(id));
+ ids.forEach(id => ps.excludeUserIds.push(id));
}
let q: any = {
$and: [{
- tagsLower: tag.toLowerCase()
+ tagsLower: ps.tag.toLowerCase()
}]
};
const push = (x: any) => q.$and.push(x);
- if (includeUserIds && includeUserIds.length != 0) {
+ if (ps.includeUserIds && ps.includeUserIds.length != 0) {
push({
userId: {
- $in: includeUserIds
+ $in: ps.includeUserIds
}
});
- } else if (excludeUserIds && excludeUserIds.length != 0) {
+ } else if (ps.excludeUserIds && ps.excludeUserIds.length != 0) {
push({
userId: {
- $nin: excludeUserIds
+ $nin: ps.excludeUserIds
}
});
}
- if (following != null && me != null) {
+ if (ps.following != null && me != null) {
const ids = await getFriendIds(me._id, false);
push({
- userId: following ? {
+ userId: ps.following ? {
$in: ids
} : {
$nin: ids.concat(me._id)
@@ -131,7 +164,7 @@ export default (params: any, me: ILocalUser) => new Promise(async (res, rej) =>
});
const mutedUserIds = mutes.map(m => m.muteeId);
- switch (mute) {
+ switch (ps.mute) {
case 'mute_all':
push({
userId: {
@@ -202,8 +235,8 @@ export default (params: any, me: ILocalUser) => new Promise(async (res, rej) =>
}
}
- if (reply != null) {
- if (reply) {
+ if (ps.reply != null) {
+ if (ps.reply) {
push({
replyId: {
$exists: true,
@@ -223,8 +256,8 @@ export default (params: any, me: ILocalUser) => new Promise(async (res, rej) =>
}
}
- if (renote != null) {
- if (renote) {
+ if (ps.renote != null) {
+ if (ps.renote) {
push({
renoteId: {
$exists: true,
@@ -244,6 +277,8 @@ export default (params: any, me: ILocalUser) => new Promise(async (res, rej) =>
}
}
+ const withFiles = ps.withFiles != null ? ps.withFiles : ps.media;
+
if (withFiles != null) {
if (withFiles) {
push({
@@ -265,8 +300,8 @@ export default (params: any, me: ILocalUser) => new Promise(async (res, rej) =>
}
}
- if (poll != null) {
- if (poll) {
+ if (ps.poll != null) {
+ if (ps.poll) {
push({
poll: {
$exists: true,
@@ -286,18 +321,18 @@ export default (params: any, me: ILocalUser) => new Promise(async (res, rej) =>
}
}
- if (sinceDate) {
+ if (ps.sinceDate) {
push({
createdAt: {
- $gt: new Date(sinceDate)
+ $gt: new Date(ps.sinceDate)
}
});
}
- if (untilDate) {
+ if (ps.untilDate) {
push({
createdAt: {
- $lt: new Date(untilDate)
+ $lt: new Date(ps.untilDate)
}
});
}
@@ -312,8 +347,8 @@ export default (params: any, me: ILocalUser) => new Promise(async (res, rej) =>
sort: {
_id: -1
},
- limit: limit,
- skip: offset
+ limit: ps.limit,
+ skip: ps.offset
});
// Serialize
diff --git a/src/server/api/endpoints/notes/timeline.ts b/src/server/api/endpoints/notes/timeline.ts
index 145f648c56..089e7a182a 100644
--- a/src/server/api/endpoints/notes/timeline.ts
+++ b/src/server/api/endpoints/notes/timeline.ts
@@ -69,7 +69,13 @@ export const meta = {
withFiles: $.bool.optional.note({
desc: {
- 'ja-JP': 'true にすると、メディアが添付された投稿だけ取得します'
+ 'ja-JP': 'true にすると、ファイルが添付された投稿だけ取得します'
+ }
+ }),
+
+ mediaOnly: $.bool.optional.note({
+ desc: {
+ 'ja-JP': 'true にすると、ファイルが添付された投稿だけ取得します (このパラメータは廃止予定です。代わりに withFiles を使ってください。)'
}
}),
}
@@ -193,7 +199,9 @@ export default async (params: any, user: ILocalUser) => {
});
}
- if (ps.withFiles) {
+ const withFiles = ps.withFiles != null ? ps.withFiles : ps.mediaOnly;
+
+ if (withFiles) {
query.$and.push({
fileIds: { $exists: true, $ne: [] }
});
diff --git a/src/server/api/endpoints/notes/user-list-timeline.ts b/src/server/api/endpoints/notes/user-list-timeline.ts
index e00a7de371..61192d7d3e 100644
--- a/src/server/api/endpoints/notes/user-list-timeline.ts
+++ b/src/server/api/endpoints/notes/user-list-timeline.ts
@@ -75,7 +75,13 @@ export const meta = {
withFiles: $.bool.optional.note({
desc: {
- 'ja-JP': 'true にすると、メディアが添付された投稿だけ取得します'
+ 'ja-JP': 'true にすると、ファイルが添付された投稿だけ取得します'
+ }
+ }),
+
+ mediaOnly: $.bool.optional.note({
+ desc: {
+ 'ja-JP': 'true にすると、ファイルが添付された投稿だけ取得します (このパラメータは廃止予定です。代わりに withFiles を使ってください。)'
}
}),
}
@@ -199,7 +205,9 @@ export default async (params: any, user: ILocalUser) => {
});
}
- if (ps.withFiles) {
+ const withFiles = ps.withFiles != null ? ps.withFiles : ps.mediaOnly;
+
+ if (withFiles) {
query.$and.push({
fileIds: { $exists: true, $ne: [] }
});