summaryrefslogtreecommitdiff
path: root/packages/backend/src/core/FlashService.ts
diff options
context:
space:
mode:
authorsyuilo <4439005+syuilo@users.noreply.github.com>2025-07-04 10:20:00 +0900
committersyuilo <4439005+syuilo@users.noreply.github.com>2025-07-04 10:20:00 +0900
commitdd87d26bdc14d9639b626e3967ca0e3107cdceba (patch)
tree14f10c56f40d60cb7d4c1aa736cf594ae05a8f66 /packages/backend/src/core/FlashService.ts
parentfix(frontend): プラグインのアンインストール時にローカル... (diff)
downloadmisskey-dd87d26bdc14d9639b626e3967ca0e3107cdceba.tar.gz
misskey-dd87d26bdc14d9639b626e3967ca0e3107cdceba.tar.bz2
misskey-dd87d26bdc14d9639b626e3967ca0e3107cdceba.zip
feat: Playを検索できるように
#13115
Diffstat (limited to 'packages/backend/src/core/FlashService.ts')
-rw-r--r--packages/backend/src/core/FlashService.ts49
1 files changed, 48 insertions, 1 deletions
diff --git a/packages/backend/src/core/FlashService.ts b/packages/backend/src/core/FlashService.ts
index 2a98225382..8caffe9e45 100644
--- a/packages/backend/src/core/FlashService.ts
+++ b/packages/backend/src/core/FlashService.ts
@@ -4,8 +4,11 @@
*/
import { Inject, Injectable } from '@nestjs/common';
+import { Brackets } from 'typeorm';
import { DI } from '@/di-symbols.js';
-import { type FlashsRepository } from '@/models/_.js';
+import { type FlashLikesRepository, MiUser, type FlashsRepository } from '@/models/_.js';
+import { QueryService } from '@/core/QueryService.js';
+import { sqlLikeEscape } from '@/misc/sql-like-escape.js';
/**
* MisskeyPlay関係のService
@@ -15,6 +18,11 @@ export class FlashService {
constructor(
@Inject(DI.flashsRepository)
private flashRepository: FlashsRepository,
+
+ @Inject(DI.flashLikesRepository)
+ private flashLikesRepository: FlashLikesRepository,
+
+ private queryService: QueryService,
) {
}
@@ -37,4 +45,43 @@ export class FlashService {
return await builder.getMany();
}
+
+ public async myLikes(meId: MiUser['id'], opts: { sinceId?: string, untilId?: string, sinceDate?: number, untilDate?: number, limit?: number, search?: string | null }) {
+ const query = this.queryService.makePaginationQuery(this.flashLikesRepository.createQueryBuilder('like'), opts.sinceId, opts.untilId, opts.sinceDate, opts.untilDate)
+ .andWhere('like.userId = :meId', { meId })
+ .leftJoinAndSelect('like.flash', 'flash');
+
+ if (opts.search != null) {
+ for (const word of opts.search.trim().split(' ')) {
+ query.andWhere(new Brackets(qb => {
+ qb.orWhere('flash.title ILIKE :search', { search: `%${sqlLikeEscape(word)}%` });
+ qb.orWhere('flash.summary ILIKE :search', { search: `%${sqlLikeEscape(word)}%` });
+ }));
+ }
+ }
+
+ const likes = await query
+ .limit(opts.limit)
+ .getMany();
+
+ return likes;
+ }
+
+ public async search(searchQuery: string, opts: { sinceId?: string, untilId?: string, sinceDate?: number, untilDate?: number, limit?: number }) {
+ const query = this.queryService.makePaginationQuery(this.flashRepository.createQueryBuilder('flash'), opts.sinceId, opts.untilId, opts.sinceDate, opts.untilDate)
+ .andWhere('flash.visibility = \'public\'');
+
+ for (const word of searchQuery.trim().split(' ')) {
+ query.andWhere(new Brackets(qb => {
+ qb.orWhere('flash.title ILIKE :search', { search: `%${sqlLikeEscape(word)}%` });
+ qb.orWhere('flash.summary ILIKE :search', { search: `%${sqlLikeEscape(word)}%` });
+ }));
+ }
+
+ const result = await query
+ .limit(opts.limit)
+ .getMany();
+
+ return result;
+ }
}