/* * SPDX-FileCopyrightText: syuilo and misskey-project * SPDX-License-Identifier: AGPL-3.0-only */ import { Injectable, Inject } from '@nestjs/common'; import _Ajv from 'ajv'; import { IdService } from '@/core/IdService.js'; import { GlobalEventService } from '@/core/GlobalEventService.js'; import Logger from '@/logger.js'; import type { AntennasRepository } from '@/models/_.js'; import { DI } from '@/di-symbols.js'; import { bindThis } from '@/decorators.js'; import { QueueLoggerService } from '../QueueLoggerService.js'; import { DBAntennaImportJobData } from '../types.js'; import type * as Bull from 'bullmq'; const Ajv = _Ajv.default; 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' }, localOnly: { 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, ) { this.logger = this.queueLoggerService.logger.createSubLogger('import-antennas'); } @bindThis public async process(job: Bull.Job): Promise { const now = new Date(); try { for (const antenna of job.data.antenna) { if (antenna.keywords.length === 0 || antenna.keywords[0].every(x => x === '')) continue; if (!validate(antenna)) { this.logger.warn('Validation Failed'); continue; } const result = await this.antennasRepository.insert({ id: this.idService.gen(now.getTime()), lastUsedAt: now, userId: job.data.user.id, name: antenna.name, src: antenna.src === 'list' && antenna.userListAccts ? 'users' : antenna.src, userListId: null, keywords: antenna.keywords, excludeKeywords: antenna.excludeKeywords, users: (antenna.src === 'list' && antenna.userListAccts !== null ? antenna.userListAccts : antenna.users).filter(Boolean), caseSensitive: antenna.caseSensitive, localOnly: antenna.localOnly, withReplies: antenna.withReplies, withFile: antenna.withFile, notify: antenna.notify, }).then(x => this.antennasRepository.findOneByOrFail(x.identifiers[0])); this.logger.succ('Antenna created: ' + result.id); this.globalEventService.publishInternalEvent('antennaCreated', result); } } catch (err: any) { this.logger.error(err); } } }