mirror of
				https://codeberg.org/yeentown/barkey.git
				synced 2025-11-03 23:14:13 +00:00 
			
		
		
		
	Implemet per user notes stats
This commit is contained in:
		
							parent
							
								
									59266b3190
								
							
						
					
					
						commit
						b8c56c4dda
					
				
					 3 changed files with 96 additions and 2 deletions
				
			
		| 
						 | 
				
			
			@ -23,7 +23,7 @@ import registerHashtag from '../register-hashtag';
 | 
			
		|||
import isQuote from '../../misc/is-quote';
 | 
			
		||||
import { TextElementMention } from '../../mfm/parse/elements/mention';
 | 
			
		||||
import { TextElementHashtag } from '../../mfm/parse/elements/hashtag';
 | 
			
		||||
import { notesStats } from '../stats';
 | 
			
		||||
import { notesStats, perUserNotesStats } from '../stats';
 | 
			
		||||
import { erase, unique } from '../../prelude/array';
 | 
			
		||||
import insertNoteUnread from './unread';
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -166,6 +166,7 @@ export default async (user: IUser, data: Option, silent = false) => new Promise<
 | 
			
		|||
 | 
			
		||||
	// 統計を更新
 | 
			
		||||
	notesStats.update(note, true);
 | 
			
		||||
	perUserNotesStats.update(user, note, true);
 | 
			
		||||
 | 
			
		||||
	// ハッシュタグ登録
 | 
			
		||||
	tags.map(tag => registerHashtag(user, tag));
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -6,7 +6,7 @@ import pack from '../../remote/activitypub/renderer';
 | 
			
		|||
import { deliver } from '../../queue';
 | 
			
		||||
import Following from '../../models/following';
 | 
			
		||||
import renderTombstone from '../../remote/activitypub/renderer/tombstone';
 | 
			
		||||
import { notesStats } from '../stats';
 | 
			
		||||
import { notesStats, perUserNotesStats } from '../stats';
 | 
			
		||||
import config from '../../config';
 | 
			
		||||
import NoteUnread from '../../models/note-unread';
 | 
			
		||||
import read from './read';
 | 
			
		||||
| 
						 | 
				
			
			@ -64,4 +64,5 @@ export default async function(user: IUser, note: INote) {
 | 
			
		|||
 | 
			
		||||
	// 統計を更新
 | 
			
		||||
	notesStats.update(note, false);
 | 
			
		||||
	perUserNotesStats.update(user, note, false);
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -819,3 +819,95 @@ class FollowingStats extends Stats<FollowingLog> {
 | 
			
		|||
 | 
			
		||||
export const followingStats = new FollowingStats();
 | 
			
		||||
//#endregion
 | 
			
		||||
 | 
			
		||||
//#region Per user notes stats
 | 
			
		||||
/**
 | 
			
		||||
 * ユーザーごとの投稿に関する統計
 | 
			
		||||
 */
 | 
			
		||||
type PerUserNotesLog = {
 | 
			
		||||
	/**
 | 
			
		||||
	 * 集計期間時点での、全投稿数
 | 
			
		||||
	 */
 | 
			
		||||
	total: number;
 | 
			
		||||
 | 
			
		||||
	/**
 | 
			
		||||
	 * 増加した投稿数
 | 
			
		||||
	 */
 | 
			
		||||
	inc: number;
 | 
			
		||||
 | 
			
		||||
	/**
 | 
			
		||||
	 * 減少した投稿数
 | 
			
		||||
	 */
 | 
			
		||||
	dec: number;
 | 
			
		||||
 | 
			
		||||
	diffs: {
 | 
			
		||||
		/**
 | 
			
		||||
		 * 通常の投稿数の差分
 | 
			
		||||
		 */
 | 
			
		||||
		normal: number;
 | 
			
		||||
 | 
			
		||||
		/**
 | 
			
		||||
		 * リプライの投稿数の差分
 | 
			
		||||
		 */
 | 
			
		||||
		reply: number;
 | 
			
		||||
 | 
			
		||||
		/**
 | 
			
		||||
		 * Renoteの投稿数の差分
 | 
			
		||||
		 */
 | 
			
		||||
		renote: number;
 | 
			
		||||
	};
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
class PerUserNotesStats extends Stats<PerUserNotesLog> {
 | 
			
		||||
	constructor() {
 | 
			
		||||
		super('notes');
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	@autobind
 | 
			
		||||
	protected async getTemplate(init: boolean, latest?: PerUserNotesLog, group?: any): Promise<PerUserNotesLog> {
 | 
			
		||||
		const [count] = init ? await Promise.all([
 | 
			
		||||
			Note.count({ userId: group, deletedAt: null }),
 | 
			
		||||
		]) : [
 | 
			
		||||
			latest ? latest.total : 0
 | 
			
		||||
		];
 | 
			
		||||
 | 
			
		||||
		return {
 | 
			
		||||
			total: count,
 | 
			
		||||
			inc: 0,
 | 
			
		||||
			dec: 0,
 | 
			
		||||
			diffs: {
 | 
			
		||||
				normal: 0,
 | 
			
		||||
				reply: 0,
 | 
			
		||||
				renote: 0
 | 
			
		||||
			}
 | 
			
		||||
		};
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	@autobind
 | 
			
		||||
	public async update(user: IUser, note: INote, isAdditional: boolean) {
 | 
			
		||||
		const update: Obj = {
 | 
			
		||||
			diffs: {}
 | 
			
		||||
		};
 | 
			
		||||
 | 
			
		||||
		update.total = isAdditional ? 1 : -1;
 | 
			
		||||
 | 
			
		||||
		if (isAdditional) {
 | 
			
		||||
			update.inc = 1;
 | 
			
		||||
		} else {
 | 
			
		||||
			update.dec = 1;
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		if (note.replyId != null) {
 | 
			
		||||
			update.diffs.reply = isAdditional ? 1 : -1;
 | 
			
		||||
		} else if (note.renoteId != null) {
 | 
			
		||||
			update.diffs.renote = isAdditional ? 1 : -1;
 | 
			
		||||
		} else {
 | 
			
		||||
			update.diffs.normal = isAdditional ? 1 : -1;
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		await this.inc(update, user._id);
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
export const perUserNotesStats = new PerUserNotesStats();
 | 
			
		||||
//#endregion
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
	Add table
		
		Reference in a new issue