<commit_before>import { Match } from 'powerful';
import {Notification} from '../../models';
import {IUser, INotification} from '../../interfaces';
import serializeNotification from '../../core/serialize-notification';

/**
 * 通知を取得します
 * @param user API利用ユーザー
 * @param limit 取得する通知の最大数
 * @param sinceCursor 取得する通知を、設定されたカーソルよりも大きなカーソルを持つもののみに制限します
 * @param maxCursor 取得する通知を、設定されたカーソルよりも小さなカーソルを持つもののみに制限します
 */
export default function timeline(
	user: IUser,
	limit: number = 10,
	sinceCursor: number = null,
	maxCursor: number = null)
		: Promise<Object[]> {
	'use strict';

	return new Promise<Object[]>((resolve, reject) => {
		// タイムライン取得用のクエリを生成
		const query = new Match<void, any>(null)
			.when(() => sinceCursor !== null, () => {
				return {$and: [
					{user: user.id},
					{cursor: {$gt: sinceCursor}}
				]};
			})
			.when(() => maxCursor !== null, () => {
				return {$and: [
					{user: user.id},
					{cursor: {$lt: maxCursor}}
				]};
			})
			.getValue({user: user.id});

		// クエリを発行してタイムラインを取得
		Notification
			.find(query)
			.sort('-createdAt')
			.limit(limit)
			.exec((err: any, notifications: INotification[]) => {
			if (err !== null) {
				return reject(err);
			}

			Promise.all(notifications.map(notification => serializeNotification(notification.toObject(), user)))
			.then(resolve);

			// 全て既読にする
			notifications.forEach(notification => {
				notification.isRead = true;
				notification.save();
			});
		});
	});
}<commit_msg>Fix bug, Improve readability<commit_after>import { Match } from 'powerful';
import {Notification} from '../../models';
import {IUser, INotification} from '../../interfaces';
import serializeNotification from '../../core/serialize-notification';

/**
 * 通知を取得します
 * @param user API利用ユーザー
 * @param limit 取得する通知の最大数
 * @param sinceCursor 取得する通知を、設定されたカーソルよりも大きなカーソルを持つもののみに制限します
 * @param maxCursor 取得する通知を、設定されたカーソルよりも小さなカーソルを持つもののみに制限します
 */
export default function timeline(
	user: IUser,
	limit: number = 10,
	sinceCursor: number = null,
	maxCursor: number = null)
		: Promise<Object[]> {
	'use strict';

	return new Promise<Object[]>((resolve, reject) => {
		// タイムライン取得用のクエリを生成
		const query = new Match<void, any>(null)
			.when(() => sinceCursor !== null, () => {
				return {
					user: user.id,
					cursor: {$gt: sinceCursor}
				};
			})
			.when(() => maxCursor !== null, () => {
				return {
					user: user.id,
					cursor: {$lt: maxCursor}
				};
			})
			.getValue({user: user.id});

		// クエリを発行してタイムラインを取得
		Notification
		.find(query)
		.sort('-createdAt')
		.limit(limit)
		.exec((err: any, notifications: INotification[]) => {
			if (err !== null) {
				return reject(err);
			} else if (notifications.length === 0) {
				return resolve([]);
			}

			Promise.all(notifications.map(notification => serializeNotification(notification.toObject(), user)))
			.then(resolve);

			// 全て既読にする
			notifications.forEach(notification => {
				notification.isRead = true;
				notification.save();
			});
		});
	});
}
{'fraction_non_alphanumeric': 0.17039759438690277, 'fraction_numerical': 0.001670564650851988, 'mean_word_length': 3.529500756429652, 'pattern_counts': {'":': 0, '<': 9, '<?xml version=': 0, '>': 25, 'https://': 0, 'lorem ipsum': 0, 'www.': 0, 'xml': 0}, 'pii_count': 0, 'substrings_counts': 0, 'word_list_counts': {'cursed_substrings.json': 0, 'profanity_word_list.json': 0, 'sexual_word_list.json': 0, 'zh_pornsignals.json': 0}}
{'dir': 'git-commits-cleaned', 'id': '237169', 'n_tokens_mistral': 1307, 'n_tokens_neox': 1128, 'n_words': 213}