未実装のTLのRenoteクエリを実装 (#5343)
* users/notes includeMyRenotes * other renotes * fix target user in users/notes * users/notesからv10から未実装でありえないオプションを削除 * users/notesのincludeMyRenotesの説明を修正 * remove needless anonymous checks
This commit is contained in:
		| @@ -130,59 +130,35 @@ export default define(meta, async (ps, user) => { | ||||
| 	generateVisibilityQuery(query, user); | ||||
| 	generateMuteQuery(query, user); | ||||
|  | ||||
| 	/* TODO | ||||
| 	// MongoDBではトップレベルで否定ができないため、De Morganの法則を利用してクエリします。 | ||||
| 	// つまり、「『自分の投稿かつRenote』ではない」を「『自分の投稿ではない』または『Renoteではない』」と表現します。 | ||||
| 	// for details: https://en.wikipedia.org/wiki/De_Morgan%27s_laws | ||||
|  | ||||
| 	if (ps.includeMyRenotes === false) { | ||||
| 		query.$and.push({ | ||||
| 			$or: [{ | ||||
| 				userId: { $ne: user.id } | ||||
| 			}, { | ||||
| 				renoteId: null | ||||
| 			}, { | ||||
| 				text: { $ne: null } | ||||
| 			}, { | ||||
| 				fileIds: { $ne: [] } | ||||
| 			}, { | ||||
| 				poll: { $ne: null } | ||||
| 			}] | ||||
| 		}); | ||||
| 		query.andWhere(new Brackets(qb => { | ||||
| 			qb.orWhere('note.userId != :meId', { meId: user.id }); | ||||
| 			qb.orWhere('note.renoteId IS NULL'); | ||||
| 			qb.orWhere('note.text IS NOT NULL'); | ||||
| 			qb.orWhere('note.fileIds != \'{}\''); | ||||
| 			qb.orWhere('0 < (SELECT COUNT(*) FROM poll WHERE poll."noteId" = note.id)'); | ||||
| 		})); | ||||
| 	} | ||||
|  | ||||
| 	if (ps.includeRenotedMyNotes === false) { | ||||
| 		query.$and.push({ | ||||
| 			$or: [{ | ||||
| 				'_renote.userId': { $ne: user.id } | ||||
| 			}, { | ||||
| 				renoteId: null | ||||
| 			}, { | ||||
| 				text: { $ne: null } | ||||
| 			}, { | ||||
| 				fileIds: { $ne: [] } | ||||
| 			}, { | ||||
| 				poll: { $ne: null } | ||||
| 			}] | ||||
| 		}); | ||||
| 		query.andWhere(new Brackets(qb => { | ||||
| 			qb.orWhere('note.renoteUserId != :meId', { meId: user.id }); | ||||
| 			qb.orWhere('note.renoteId IS NULL'); | ||||
| 			qb.orWhere('note.text IS NOT NULL'); | ||||
| 			qb.orWhere('note.fileIds != \'{}\''); | ||||
| 			qb.orWhere('0 < (SELECT COUNT(*) FROM poll WHERE poll."noteId" = note.id)'); | ||||
| 		})); | ||||
| 	} | ||||
|  | ||||
| 	if (ps.includeLocalRenotes === false) { | ||||
| 		query.$and.push({ | ||||
| 			$or: [{ | ||||
| 				'_renote.user.host': { $ne: null } | ||||
| 			}, { | ||||
| 				renoteId: null | ||||
| 			}, { | ||||
| 				text: { $ne: null } | ||||
| 			}, { | ||||
| 				fileIds: { $ne: [] } | ||||
| 			}, { | ||||
| 				poll: { $ne: null } | ||||
| 			}] | ||||
| 		}); | ||||
| 		query.andWhere(new Brackets(qb => { | ||||
| 			qb.orWhere('note.renoteUserHost IS NOT NULL'); | ||||
| 			qb.orWhere('note.renoteId IS NULL'); | ||||
| 			qb.orWhere('note.text IS NOT NULL'); | ||||
| 			qb.orWhere('note.fileIds != \'{}\''); | ||||
| 			qb.orWhere('0 < (SELECT COUNT(*) FROM poll WHERE poll."noteId" = note.id)'); | ||||
| 		})); | ||||
| 	} | ||||
| 	*/ | ||||
|  | ||||
| 	if (ps.withFiles) { | ||||
| 		query.andWhere('note.fileIds != \'{}\''); | ||||
|   | ||||
| @@ -116,58 +116,35 @@ export default define(meta, async (ps, user) => { | ||||
| 	generateVisibilityQuery(query, user); | ||||
| 	generateMuteQuery(query, user); | ||||
|  | ||||
| 	/* v11 TODO | ||||
| 	// MongoDBではトップレベルで否定ができないため、De Morganの法則を利用してクエリします。 | ||||
| 	// つまり、「『自分の投稿かつRenote』ではない」を「『自分の投稿ではない』または『Renoteではない』」と表現します。 | ||||
| 	// for details: https://en.wikipedia.org/wiki/De_Morgan%27s_laws | ||||
|  | ||||
| 	if (ps.includeMyRenotes === false) { | ||||
| 		query.$and.push({ | ||||
| 			$or: [{ | ||||
| 				userId: { $ne: user.id } | ||||
| 			}, { | ||||
| 				renoteId: null | ||||
| 			}, { | ||||
| 				text: { $ne: null } | ||||
| 			}, { | ||||
| 				fileIds: { $ne: [] } | ||||
| 			}, { | ||||
| 				poll: { $ne: null } | ||||
| 			}] | ||||
| 		}); | ||||
| 		query.andWhere(new Brackets(qb => { | ||||
| 			qb.orWhere('note.userId != :meId', { meId: user.id }); | ||||
| 			qb.orWhere('note.renoteId IS NULL'); | ||||
| 			qb.orWhere('note.text IS NOT NULL'); | ||||
| 			qb.orWhere('note.fileIds != \'{}\''); | ||||
| 			qb.orWhere('0 < (SELECT COUNT(*) FROM poll WHERE poll."noteId" = note.id)'); | ||||
| 		})); | ||||
| 	} | ||||
|  | ||||
| 	if (ps.includeRenotedMyNotes === false) { | ||||
| 		query.$and.push({ | ||||
| 			$or: [{ | ||||
| 				'_renote.userId': { $ne: user.id } | ||||
| 			}, { | ||||
| 				renoteId: null | ||||
| 			}, { | ||||
| 				text: { $ne: null } | ||||
| 			}, { | ||||
| 				fileIds: { $ne: [] } | ||||
| 			}, { | ||||
| 				poll: { $ne: null } | ||||
| 			}] | ||||
| 		}); | ||||
| 		query.andWhere(new Brackets(qb => { | ||||
| 			qb.orWhere('note.renoteUserId != :meId', { meId: user.id }); | ||||
| 			qb.orWhere('note.renoteId IS NULL'); | ||||
| 			qb.orWhere('note.text IS NOT NULL'); | ||||
| 			qb.orWhere('note.fileIds != \'{}\''); | ||||
| 			qb.orWhere('0 < (SELECT COUNT(*) FROM poll WHERE poll."noteId" = note.id)'); | ||||
| 		})); | ||||
| 	} | ||||
|  | ||||
| 	if (ps.includeLocalRenotes === false) { | ||||
| 		query.$and.push({ | ||||
| 			$or: [{ | ||||
| 				'_renote.user.host': { $ne: null } | ||||
| 			}, { | ||||
| 				renoteId: null | ||||
| 			}, { | ||||
| 				text: { $ne: null } | ||||
| 			}, { | ||||
| 				fileIds: { $ne: [] } | ||||
| 			}, { | ||||
| 				poll: { $ne: null } | ||||
| 			}] | ||||
| 		}); | ||||
| 	}*/ | ||||
| 		query.andWhere(new Brackets(qb => { | ||||
| 			qb.orWhere('note.renoteUserHost IS NOT NULL'); | ||||
| 			qb.orWhere('note.renoteId IS NULL'); | ||||
| 			qb.orWhere('note.text IS NOT NULL'); | ||||
| 			qb.orWhere('note.fileIds != \'{}\''); | ||||
| 			qb.orWhere('0 < (SELECT COUNT(*) FROM poll WHERE poll."noteId" = note.id)'); | ||||
| 		})); | ||||
| 	} | ||||
|  | ||||
| 	if (ps.withFiles) { | ||||
| 		query.andWhere('note.fileIds != \'{}\''); | ||||
|   | ||||
| @@ -6,6 +6,7 @@ import { UserLists, UserListJoinings, Notes } from '../../../../models'; | ||||
| import { makePaginationQuery } from '../../common/make-pagination-query'; | ||||
| import { generateVisibilityQuery } from '../../common/generate-visibility-query'; | ||||
| import { activeUsersChart } from '../../../../services/chart'; | ||||
| import { Brackets } from 'typeorm'; | ||||
|  | ||||
| export const meta = { | ||||
| 	desc: { | ||||
| @@ -134,58 +135,35 @@ export default define(meta, async (ps, user) => { | ||||
|  | ||||
| 	generateVisibilityQuery(query, user); | ||||
|  | ||||
| 	/* TODO | ||||
| 	// MongoDBではトップレベルで否定ができないため、De Morganの法則を利用してクエリします。 | ||||
| 	// つまり、「『自分の投稿かつRenote』ではない」を「『自分の投稿ではない』または『Renoteではない』」と表現します。 | ||||
| 	// for details: https://en.wikipedia.org/wiki/De_Morgan%27s_laws | ||||
|  | ||||
| 	if (ps.includeMyRenotes === false) { | ||||
| 		query.$and.push({ | ||||
| 			$or: [{ | ||||
| 				userId: { $ne: user.id } | ||||
| 			}, { | ||||
| 				renoteId: null | ||||
| 			}, { | ||||
| 				text: { $ne: null } | ||||
| 			}, { | ||||
| 				fileIds: { $ne: [] } | ||||
| 			}, { | ||||
| 				poll: { $ne: null } | ||||
| 			}] | ||||
| 		}); | ||||
| 		query.andWhere(new Brackets(qb => { | ||||
| 			qb.orWhere('note.userId != :meId', { meId: user.id }); | ||||
| 			qb.orWhere('note.renoteId IS NULL'); | ||||
| 			qb.orWhere('note.text IS NOT NULL'); | ||||
| 			qb.orWhere('note.fileIds != \'{}\''); | ||||
| 			qb.orWhere('0 < (SELECT COUNT(*) FROM poll WHERE poll."noteId" = note.id)'); | ||||
| 		})); | ||||
| 	} | ||||
|  | ||||
| 	if (ps.includeRenotedMyNotes === false) { | ||||
| 		query.$and.push({ | ||||
| 			$or: [{ | ||||
| 				'_renote.userId': { $ne: user.id } | ||||
| 			}, { | ||||
| 				renoteId: null | ||||
| 			}, { | ||||
| 				text: { $ne: null } | ||||
| 			}, { | ||||
| 				fileIds: { $ne: [] } | ||||
| 			}, { | ||||
| 				poll: { $ne: null } | ||||
| 			}] | ||||
| 		}); | ||||
| 		query.andWhere(new Brackets(qb => { | ||||
| 			qb.orWhere('note.renoteUserId != :meId', { meId: user.id }); | ||||
| 			qb.orWhere('note.renoteId IS NULL'); | ||||
| 			qb.orWhere('note.text IS NOT NULL'); | ||||
| 			qb.orWhere('note.fileIds != \'{}\''); | ||||
| 			qb.orWhere('0 < (SELECT COUNT(*) FROM poll WHERE poll."noteId" = note.id)'); | ||||
| 		})); | ||||
| 	} | ||||
|  | ||||
| 	if (ps.includeLocalRenotes === false) { | ||||
| 		query.$and.push({ | ||||
| 			$or: [{ | ||||
| 				'_renote.user.host': { $ne: null } | ||||
| 			}, { | ||||
| 				renoteId: null | ||||
| 			}, { | ||||
| 				text: { $ne: null } | ||||
| 			}, { | ||||
| 				fileIds: { $ne: [] } | ||||
| 			}, { | ||||
| 				poll: { $ne: null } | ||||
| 			}] | ||||
| 		}); | ||||
| 	}*/ | ||||
| 		query.andWhere(new Brackets(qb => { | ||||
| 			qb.orWhere('note.renoteUserHost IS NOT NULL'); | ||||
| 			qb.orWhere('note.renoteId IS NULL'); | ||||
| 			qb.orWhere('note.text IS NOT NULL'); | ||||
| 			qb.orWhere('note.fileIds != \'{}\''); | ||||
| 			qb.orWhere('0 < (SELECT COUNT(*) FROM poll WHERE poll."noteId" = note.id)'); | ||||
| 		})); | ||||
| 	} | ||||
|  | ||||
| 	if (ps.withFiles) { | ||||
| 		query.andWhere('note.fileIds != \'{}\''); | ||||
|   | ||||
| @@ -74,23 +74,7 @@ export const meta = { | ||||
| 			validator: $.optional.bool, | ||||
| 			default: true, | ||||
| 			desc: { | ||||
| 				'ja-JP': '自分の行ったRenoteを含めるかどうか' | ||||
| 			} | ||||
| 		}, | ||||
|  | ||||
| 		includeRenotedMyNotes: { | ||||
| 			validator: $.optional.bool, | ||||
| 			default: true, | ||||
| 			desc: { | ||||
| 				'ja-JP': 'Renoteされた自分の投稿を含めるかどうか' | ||||
| 			} | ||||
| 		}, | ||||
|  | ||||
| 		includeLocalRenotes: { | ||||
| 			validator: $.optional.bool, | ||||
| 			default: true, | ||||
| 			desc: { | ||||
| 				'ja-JP': 'Renoteされたローカルの投稿を含めるかどうか' | ||||
| 				'ja-JP': 'Renoteを含めるかどうか' | ||||
| 			} | ||||
| 		}, | ||||
|  | ||||
| @@ -177,23 +161,15 @@ export default define(meta, async (ps, me) => { | ||||
| 		query.andWhere('note.replyId IS NULL'); | ||||
| 	} | ||||
|  | ||||
| 	/* TODO | ||||
| 	if (ps.includeMyRenotes === false) { | ||||
| 		query.$and.push({ | ||||
| 			$or: [{ | ||||
| 				userId: { $ne: user.id } | ||||
| 			}, { | ||||
| 				renoteId: null | ||||
| 			}, { | ||||
| 				text: { $ne: null } | ||||
| 			}, { | ||||
| 				fileIds: { $ne: [] } | ||||
| 			}, { | ||||
| 				poll: { $ne: null } | ||||
| 			}] | ||||
| 		}); | ||||
| 		query.andWhere(new Brackets(qb => { | ||||
| 			qb.orWhere('note.userId != :userId', { userId: user.id }); | ||||
| 			qb.orWhere('note.renoteId IS NULL'); | ||||
| 			qb.orWhere('note.text IS NOT NULL'); | ||||
| 			qb.orWhere('note.fileIds != \'{}\''); | ||||
| 			qb.orWhere('0 < (SELECT COUNT(*) FROM poll WHERE poll."noteId" = note.id)'); | ||||
| 		})); | ||||
| 	} | ||||
| 	*/ | ||||
|  | ||||
| 	//#endregion | ||||
|  | ||||
|   | ||||
		Reference in New Issue
	
	Block a user
	 MeiMei
					MeiMei