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…
	
	Add table
		Add a link
		
	
		Reference in a new issue