Update src/server/api/endpoints/aggregation/hashtags.ts
This commit is contained in:
parent
d62a6bab41
commit
cd9696f25e
1 changed files with 71 additions and 0 deletions
71
src/server/api/endpoints/aggregation/hashtags.ts
Normal file
71
src/server/api/endpoints/aggregation/hashtags.ts
Normal file
|
@ -0,0 +1,71 @@
|
||||||
|
import Note from '../../../../models/note';
|
||||||
|
import Meta from '../../../../models/meta';
|
||||||
|
import define from '../../define';
|
||||||
|
|
||||||
|
export const meta = {
|
||||||
|
requireCredential: false,
|
||||||
|
};
|
||||||
|
|
||||||
|
export default define(meta, (ps) => new Promise(async (res, rej) => {
|
||||||
|
const meta = await Meta.findOne({});
|
||||||
|
const hidedTags = meta ? (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);
|
||||||
|
|
||||||
|
tags = tags.slice(0, 30);
|
||||||
|
|
||||||
|
res(tags);
|
||||||
|
});
|
Loading…
Reference in a new issue