mirror of
https://git.joinsharkey.org/Sharkey/Sharkey.git
synced 2024-11-25 16:43:09 +02:00
94 lines
3.1 KiB
TypeScript
94 lines
3.1 KiB
TypeScript
|
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/index.js';
|
||
|
import { DI } from '@/di-symbols.js';
|
||
|
import { bindThis } from '@/decorators.js';
|
||
|
import { QueueLoggerService } from '../QueueLoggerService.js';
|
||
|
import { DBAntennaImportJobData } from '../types.js';
|
||
|
import type Bull from 'bull';
|
||
|
|
||
|
@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<DBAntennaImportJobData>, done: () => void): Promise<void> {
|
||
|
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)) {
|
||
|
this.logger.warn('Validation Failed');
|
||
|
continue;
|
||
|
}
|
||
|
const result = await this.antennasRepository.insert({
|
||
|
id: this.idService.genId(),
|
||
|
createdAt: now,
|
||
|
lastUsedAt: now,
|
||
|
userId: job.data.user.id,
|
||
|
name: antenna.name,
|
||
|
src: antenna.src === 'list' && antenna.userListAcct ? 'users' : antenna.src,
|
||
|
userListId: null,
|
||
|
keywords: antenna.keywords,
|
||
|
excludeKeywords: antenna.excludeKeywords,
|
||
|
users: (antenna.src === 'list' && antenna.userListAcct !== null ? antenna.userListAcct : antenna.users).filter(Boolean),
|
||
|
caseSensitive: antenna.caseSensitive,
|
||
|
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);
|
||
|
} finally {
|
||
|
done();
|
||
|
}
|
||
|
}
|
||
|
}
|