summaryrefslogtreecommitdiff
path: root/src/server/api
diff options
context:
space:
mode:
authorsyuilo <syuilotan@yahoo.co.jp>2018-09-07 19:23:39 +0900
committersyuilo <syuilotan@yahoo.co.jp>2018-09-07 19:23:39 +0900
commite0deaec695650d22c92512cc2672ba3aade96eed (patch)
treec308a697478746dd6ed932ea579b52534bc89aa0 /src/server/api
parent統計で無視するハッシュタグを設定できるように (diff)
downloadsharkey-e0deaec695650d22c92512cc2672ba3aade96eed.tar.gz
sharkey-e0deaec695650d22c92512cc2672ba3aade96eed.tar.bz2
sharkey-e0deaec695650d22c92512cc2672ba3aade96eed.zip
Implement new endpoint
Diffstat (limited to 'src/server/api')
-rw-r--r--src/server/api/endpoints/aggregation/hashtags.ts64
1 files changed, 64 insertions, 0 deletions
diff --git a/src/server/api/endpoints/aggregation/hashtags.ts b/src/server/api/endpoints/aggregation/hashtags.ts
new file mode 100644
index 0000000000..0daf42427b
--- /dev/null
+++ b/src/server/api/endpoints/aggregation/hashtags.ts
@@ -0,0 +1,64 @@
+import Note from '../../../../models/note';
+import Meta from '../../../../models/meta';
+
+export default () => new Promise(async (res, rej) => {
+ const meta = await Meta.findOne({});
+ const hidedTags = (meta.hidedTags || []).map(t => t.toLowerCase());
+
+ const span = 1000 * 60 * 60 * 24 * 7; // 1週間
+
+ //#region 1. 指定期間の内に投稿されたハッシュタグ(とユーザーのペア)を集計
+ const data = await Note.aggregate([{
+ $match: {
+ createdAt: {
+ $gt: new Date(Date.now() - span)
+ },
+ tagsLower: {
+ $exists: true,
+ $ne: []
+ }
+ }
+ }, {
+ $unwind: '$tagsLower'
+ }, {
+ $group: {
+ _id: { tag: '$tagsLower', userId: '$userId' }
+ }
+ }]) as Array<{
+ _id: {
+ tag: string;
+ userId: any;
+ }
+ }>;
+ //#endregion
+
+ if (data.length == 0) {
+ return res([]);
+ }
+
+ let tags: Array<{
+ name: string;
+ count: number;
+ }> = [];
+
+ // カウント
+ data.map(x => x._id).forEach(x => {
+ // ブラックリストに登録されているタグなら弾く
+ if (hidedTags.includes(x.tag)) return;
+
+ const i = tags.findIndex(tag => tag.name == x.tag);
+ if (i != -1) {
+ tags[i].count++;
+ } else {
+ tags.push({
+ name: x.tag,
+ count: 1
+ });
+ }
+ });
+
+ // タグを人気順に並べ替え
+ tags = tags.sort((a, b) => b.count - a.count);
+
+ res(tags);
+});