diff --git a/packages/backend/src/queue/processors/ExportAntennasProcessorService.ts b/packages/backend/src/queue/processors/ExportAntennasProcessorService.ts index dba764dc35..894903e79b 100644 --- a/packages/backend/src/queue/processors/ExportAntennasProcessorService.ts +++ b/packages/backend/src/queue/processors/ExportAntennasProcessorService.ts @@ -9,10 +9,10 @@ import Logger from '@/logger.js'; import { DriveService } from '@/core/DriveService.js'; import { bindThis } from '@/decorators.js'; import { createTemp } from '@/misc/create-temp.js'; +import { UtilityService } from '@/core/UtilityService.js'; import { QueueLoggerService } from '../QueueLoggerService.js'; import type { DBExportAntennasData } from '../types.js'; import type Bull from 'bull'; -import { UtilityService } from '@/core/UtilityService.js'; @Injectable() export class ExportAntennasProcessorService { @@ -21,12 +21,16 @@ export class ExportAntennasProcessorService { constructor ( @Inject(DI.config) private config: Config, + @Inject(DI.usersRepository) private usersRepository: UsersRepository, + @Inject(DI.antennasRepository) private antennsRepository: AntennasRepository, + @Inject(DI.userListJoiningsRepository) private userListJoiningsRepository: UserListJoiningsRepository, + private driveService: DriveService, private utilityService: UtilityService, private queueLoggerService: QueueLoggerService, @@ -72,7 +76,7 @@ export class ExportAntennasProcessorService { keywords: antenna.keywords, excludeKeywords: antenna.excludeKeywords, users: antenna.users, - userListAcct: typeof users !== 'undefined' ? users.map((u) => { + userListAccts: typeof users !== 'undefined' ? users.map((u) => { return this.utilityService.getFullApAccount(u.username, u.host); // acct }) : null, caseSensitive: antenna.caseSensitive, diff --git a/packages/backend/src/queue/processors/ImportAntennasProcessorService.ts b/packages/backend/src/queue/processors/ImportAntennasProcessorService.ts index 67d255bdd3..d06131b8c8 100644 --- a/packages/backend/src/queue/processors/ImportAntennasProcessorService.ts +++ b/packages/backend/src/queue/processors/ImportAntennasProcessorService.ts @@ -10,12 +10,47 @@ import { QueueLoggerService } from '../QueueLoggerService.js'; import { DBAntennaImportJobData } from '../types.js'; import type Bull from 'bull'; +const validate = new Ajv().compile({ + type: 'object', + properties: { + name: { type: 'string', minLength: 1, maxLength: 100 }, + src: { type: 'string', enum: ['home', 'all', 'users', 'list'] }, + userListAccts: { + type: 'array', + items: { + type: 'string', + }, + nullable: true, + }, + keywords: { type: 'array', items: { + type: 'array', items: { + type: 'string', + }, + } }, + excludeKeywords: { type: 'array', items: { + type: 'array', items: { + type: 'string', + }, + } }, + users: { type: 'array', items: { + type: 'string', + } }, + caseSensitive: { type: 'boolean' }, + withReplies: { type: 'boolean' }, + withFile: { type: 'boolean' }, + notify: { type: 'boolean' }, + }, + required: ['name', 'src', 'keywords', 'excludeKeywords', 'users', 'caseSensitive', 'withReplies', 'withFile', 'notify'], +}); + @Injectable() export class ImportAntennasProcessorService { private logger: Logger; + constructor ( @Inject(DI.antennasRepository) private antennasRepository: AntennasRepository, + private queueLoggerService: QueueLoggerService, private idService: IdService, private globalEventService: GlobalEventService, @@ -27,38 +62,6 @@ export class ImportAntennasProcessorService { public async process(job: Bull.Job, done: () => void): Promise { const now = new Date(); try { - const validate = new Ajv().compile({ - type: 'object', - properties: { - name: { type: 'string', minLength: 1, maxLength: 100 }, - src: { type: 'string', enum: ['home', 'all', 'users', 'list'] }, - userListAcct: { - type: 'array', - items: { - type: 'string', - }, - nullable: true, - }, - keywords: { type: 'array', items: { - type: 'array', items: { - type: 'string', - }, - } }, - excludeKeywords: { type: 'array', items: { - type: 'array', items: { - type: 'string', - }, - } }, - users: { type: 'array', items: { - type: 'string', - } }, - caseSensitive: { type: 'boolean' }, - withReplies: { type: 'boolean' }, - withFile: { type: 'boolean' }, - notify: { type: 'boolean' }, - }, - required: ['name', 'src', 'keywords', 'excludeKeywords', 'users', 'caseSensitive', 'withReplies', 'withFile', 'notify'], - }); for (const antenna of job.data.antenna) { if (antenna.keywords.length === 0 || antenna.keywords[0].every(x => x === '')) continue; if (!validate(antenna)) { @@ -71,11 +74,11 @@ export class ImportAntennasProcessorService { lastUsedAt: now, userId: job.data.user.id, name: antenna.name, - src: antenna.src === 'list' && antenna.userListAcct ? 'users' : antenna.src, + src: antenna.src === 'list' && antenna.userListAccts ? 'users' : antenna.src, userListId: null, keywords: antenna.keywords, excludeKeywords: antenna.excludeKeywords, - users: (antenna.src === 'list' && antenna.userListAcct !== null ? antenna.userListAcct : antenna.users).filter(Boolean), + users: (antenna.src === 'list' && antenna.userListAccts !== null ? antenna.userListAccts : antenna.users).filter(Boolean), caseSensitive: antenna.caseSensitive, withReplies: antenna.withReplies, withFile: antenna.withFile, diff --git a/packages/backend/src/server/api/endpoints/i/import-antennas.ts b/packages/backend/src/server/api/endpoints/i/import-antennas.ts index 676648bde8..efb5ce4223 100644 --- a/packages/backend/src/server/api/endpoints/i/import-antennas.ts +++ b/packages/backend/src/server/api/endpoints/i/import-antennas.ts @@ -4,9 +4,9 @@ import { Endpoint } from '@/server/api/endpoint-base.js'; import { QueueService } from '@/core/QueueService.js'; import type { AntennasRepository, DriveFilesRepository, UsersRepository, Antenna as _Antenna } from '@/models/index.js'; import { DI } from '@/di-symbols.js'; -import { ApiError } from '../../error.js'; import { RoleService } from '@/core/RoleService.js'; import { DownloadService } from '@/core/DownloadService.js'; +import { ApiError } from '../../error.js'; export const meta = { secure: true, @@ -54,13 +54,16 @@ export default class extends Endpoint { constructor ( @Inject(DI.driveFilesRepository) private driveFilesRepository: DriveFilesRepository, + @Inject(DI.antennasRepository) private antennasRepository: AntennasRepository, + @Inject(DI.usersRepository) private usersRepository: UsersRepository, + private roleService: RoleService, private queueService: QueueService, - private downloadService: DownloadService + private downloadService: DownloadService, ) { super(meta, paramDef, async (ps, me) => { const users = await this.usersRepository.findOneBy({ id: me.id }); @@ -68,7 +71,7 @@ export default class extends Endpoint { const file = await this.driveFilesRepository.findOneBy({ id: ps.fileId }); if (file === null) throw new ApiError(meta.errors.noSuchFile); if (file.size === 0) throw new ApiError(meta.errors.emptyFile); - const antennas: (_Antenna & { userListAcct: string[] | null })[] = JSON.parse(await this.downloadService.downloadTextFile(file.url)); + const antennas: (_Antenna & { userListAccts: string[] | null })[] = JSON.parse(await this.downloadService.downloadTextFile(file.url)); const currentAntennasCount = await this.antennasRepository.countBy({ userId: me.id }); if (currentAntennasCount + antennas.length > (await this.roleService.getUserPolicies(me.id)).antennaLimit) { throw new ApiError(meta.errors.tooManyAntennas); @@ -78,4 +81,4 @@ export default class extends Endpoint { } } -export type Antenna = (_Antenna & { userListAcct: string[] | null })[]; +export type Antenna = (_Antenna & { userListAccts: string[] | null })[];