Implement #2980
This commit is contained in:
		
							parent
							
								
									e9a8090d7e
								
							
						
					
					
						commit
						3bebf82501
					
				
					 3 changed files with 87 additions and 0 deletions
				
			
		
							
								
								
									
										41
									
								
								src/server/api/endpoints/charts/user/reactions.ts
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										41
									
								
								src/server/api/endpoints/charts/user/reactions.ts
									
										
									
									
									
										Normal file
									
								
							| 
						 | 
				
			
			@ -0,0 +1,41 @@
 | 
			
		|||
import $ from 'cafy';
 | 
			
		||||
import getParams from '../../../get-params';
 | 
			
		||||
import { perUserReactionsStats } from '../../../../../services/stats';
 | 
			
		||||
import ID from '../../../../../misc/cafy-id';
 | 
			
		||||
 | 
			
		||||
export const meta = {
 | 
			
		||||
	desc: {
 | 
			
		||||
		'ja-JP': 'ユーザーごとの被リアクション数の統計を取得します。'
 | 
			
		||||
	},
 | 
			
		||||
 | 
			
		||||
	params: {
 | 
			
		||||
		span: $.str.or(['day', 'hour']).note({
 | 
			
		||||
			desc: {
 | 
			
		||||
				'ja-JP': '集計のスパン (day または hour)'
 | 
			
		||||
			}
 | 
			
		||||
		}),
 | 
			
		||||
 | 
			
		||||
		limit: $.num.optional.range(1, 100).note({
 | 
			
		||||
			default: 30,
 | 
			
		||||
			desc: {
 | 
			
		||||
				'ja-JP': '最大数。例えば 30 を指定したとすると、スパンが"day"の場合は30日分のデータが、スパンが"hour"の場合は30時間分のデータが返ります。'
 | 
			
		||||
			}
 | 
			
		||||
		}),
 | 
			
		||||
 | 
			
		||||
		userId: $.type(ID).note({
 | 
			
		||||
			desc: {
 | 
			
		||||
				'ja-JP': '対象のユーザーのID',
 | 
			
		||||
				'en-US': 'Target user ID'
 | 
			
		||||
			}
 | 
			
		||||
		})
 | 
			
		||||
	}
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
export default (params: any) => new Promise(async (res, rej) => {
 | 
			
		||||
	const [ps, psErr] = getParams(meta, params);
 | 
			
		||||
	if (psErr) throw psErr;
 | 
			
		||||
 | 
			
		||||
	const stats = await perUserReactionsStats.getChart(ps.span as any, ps.limit, ps.userId);
 | 
			
		||||
 | 
			
		||||
	res(stats);
 | 
			
		||||
});
 | 
			
		||||
| 
						 | 
				
			
			@ -8,6 +8,7 @@ import watch from '../watch';
 | 
			
		|||
import renderLike from '../../../remote/activitypub/renderer/like';
 | 
			
		||||
import { deliver } from '../../../queue';
 | 
			
		||||
import pack from '../../../remote/activitypub/renderer';
 | 
			
		||||
import { perUserReactionsStats } from '../../stats';
 | 
			
		||||
 | 
			
		||||
export default async (user: IUser, note: INote, reaction: string) => new Promise(async (res, rej) => {
 | 
			
		||||
	// Myself
 | 
			
		||||
| 
						 | 
				
			
			@ -43,6 +44,8 @@ export default async (user: IUser, note: INote, reaction: string) => new Promise
 | 
			
		|||
		$inc: inc
 | 
			
		||||
	});
 | 
			
		||||
 | 
			
		||||
	perUserReactionsStats.update(user, note);
 | 
			
		||||
 | 
			
		||||
	publishNoteStream(note._id, 'reacted', {
 | 
			
		||||
		reaction: reaction,
 | 
			
		||||
		userId: user._id
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -912,6 +912,49 @@ class PerUserNotesStats extends Stats<PerUserNotesLog> {
 | 
			
		|||
export const perUserNotesStats = new PerUserNotesStats();
 | 
			
		||||
//#endregion
 | 
			
		||||
 | 
			
		||||
//#region Per user reactions stats
 | 
			
		||||
/**
 | 
			
		||||
 * ユーザーごとのリアクションに関する統計
 | 
			
		||||
 */
 | 
			
		||||
type PerUserReactionsLog = {
 | 
			
		||||
	local: {
 | 
			
		||||
		/**
 | 
			
		||||
		 * リアクションされた数
 | 
			
		||||
		 */
 | 
			
		||||
		count: number;
 | 
			
		||||
	};
 | 
			
		||||
 | 
			
		||||
	remote: PerUserReactionsLog['local'];
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
class PerUserReactionsStats extends Stats<PerUserReactionsLog> {
 | 
			
		||||
	constructor() {
 | 
			
		||||
		super('perUserReaction', true);
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	@autobind
 | 
			
		||||
	protected async getTemplate(init: boolean, latest?: PerUserReactionsLog, group?: any): Promise<PerUserReactionsLog> {
 | 
			
		||||
		return {
 | 
			
		||||
			local: {
 | 
			
		||||
				count: 0
 | 
			
		||||
			},
 | 
			
		||||
			remote: {
 | 
			
		||||
				count: 0
 | 
			
		||||
			}
 | 
			
		||||
		};
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	@autobind
 | 
			
		||||
	public async update(user: IUser, note: INote) {
 | 
			
		||||
		this.inc({
 | 
			
		||||
			[isLocalUser(user) ? 'local' : 'remote']: { count: 1 }
 | 
			
		||||
		}, note.userId);
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
export const perUserReactionsStats = new PerUserReactionsStats();
 | 
			
		||||
//#endregion
 | 
			
		||||
 | 
			
		||||
//#region Per user drive stats
 | 
			
		||||
/**
 | 
			
		||||
 * ユーザーごとのドライブに関する統計
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue