154 lines
4.8 KiB
TypeScript
154 lines
4.8 KiB
TypeScript
import { HttpException, HttpStatus, Injectable } from '@nestjs/common';
|
|
import { CreateSystemDto } from './dto/create-system.dto';
|
|
import { UpdateSystemDto } from './dto/update-system.dto';
|
|
import { KeySystemRepository, UserRepository } from 'src/model/repositories';
|
|
import { User } from 'src/model/entitites';
|
|
import { MailService } from '../mail/mail.service';
|
|
import { ConfigService } from '@nestjs/config';
|
|
import { ActivityHelperService } from 'src/shared/service/activity.logger.service';
|
|
import { IsNull, Not } from 'typeorm';
|
|
|
|
@Injectable()
|
|
export class SystemService {
|
|
constructor(
|
|
private systemRepo: KeySystemRepository,
|
|
private userRepo: UserRepository,
|
|
private mailService: MailService,
|
|
private readonly configService: ConfigService,
|
|
private readonly activityService: ActivityHelperService
|
|
) {}
|
|
|
|
get isDevelopMode(): boolean {
|
|
return (this.configService.get('DEVELOP_MODE') || '').toLowerCase() == 'true';
|
|
}
|
|
|
|
async create(user: User, createSystemDto: CreateSystemDto) {
|
|
const sys = this.systemRepo.create(createSystemDto);
|
|
sys.managers = [user];
|
|
try {
|
|
const res = await this.systemRepo.save(sys);
|
|
return res;
|
|
} catch (e) {
|
|
throw new HttpException(e.code, HttpStatus.UNPROCESSABLE_ENTITY);
|
|
}
|
|
}
|
|
|
|
async findAll(user: User) {
|
|
let systems = await this.systemRepo.find({
|
|
where: { managers: { id: user.id } },
|
|
order: { name: { direction: 'ASC' } },
|
|
relations: ['cylinders']
|
|
});
|
|
|
|
if (this.isDevelopMode) {
|
|
systems = systems.filter(s => s.name.toLocaleLowerCase().includes('develop'));
|
|
}
|
|
|
|
return systems;
|
|
}
|
|
|
|
async findDeleted(user: User) {
|
|
let systems = await this.systemRepo.find({
|
|
where: { managers: { id: user.id }, deletedAt: Not(IsNull()) },
|
|
order: { name: { direction: 'ASC' } },
|
|
withDeleted: true,
|
|
});
|
|
|
|
if (this.isDevelopMode) {
|
|
systems = systems.filter(s => s.name.toLocaleLowerCase().includes('develop'));
|
|
}
|
|
|
|
return systems;
|
|
}
|
|
|
|
findOne(id: string) {
|
|
return this.systemRepo.findOne({ where: { id: id } });
|
|
}
|
|
|
|
async update(user: User, updateSystemDto: UpdateSystemDto) {
|
|
if (!user || !user.id || !updateSystemDto.id) { throw new HttpException('forbidden', HttpStatus.FORBIDDEN); }
|
|
const system = await this.systemRepo.findOne({ where: { id: updateSystemDto.id, managers: { id: user.id } }, withDeleted: true });
|
|
|
|
if (!system) { throw new HttpException('forbidden', HttpStatus.FORBIDDEN); }
|
|
|
|
|
|
if (system.name !== updateSystemDto.name) {
|
|
await this.activityService.logSystemRenamed({ system, newName: updateSystemDto.name, user })
|
|
system.name = updateSystemDto.name;
|
|
|
|
}
|
|
|
|
return true;
|
|
}
|
|
|
|
async remove(id: string) {
|
|
const system = await this.systemRepo.findOne({ where: { id } });
|
|
return this.systemRepo.softRemove(system);
|
|
}
|
|
|
|
async getManagers(id: string) {
|
|
const system = await this.systemRepo.findOne({
|
|
where: { id: id },
|
|
relations: ['managers']
|
|
});
|
|
|
|
return system.managers;
|
|
}
|
|
|
|
async manageManagers(systemID: string, manageObject: { email: string, action: 'add' | 'remove'}) {
|
|
const sys = await this.systemRepo.findOne({
|
|
where: { id: systemID },
|
|
relations: ['managers']
|
|
});
|
|
|
|
if (!sys) {
|
|
throw new HttpException('Das System wurde nicht im System gefunden', HttpStatus.NOT_FOUND);
|
|
}
|
|
|
|
if (manageObject.action == 'remove') {
|
|
sys.managers = sys.managers.filter( m => m.username != manageObject.email);
|
|
|
|
await this.systemRepo.save(sys);
|
|
const user = await this.userRepo.findOne({
|
|
where: { username: manageObject.email.trim() },
|
|
relations: ['settings']
|
|
});
|
|
if (user.settings.sendSystemAccessMails) {
|
|
this.mailService.sendAccessRemovedMail({to: user, system: sys})
|
|
}
|
|
return sys.managers;
|
|
}
|
|
|
|
if (sys.managers.some(m => m.username == manageObject.email)) {
|
|
return sys.managers;
|
|
}
|
|
|
|
const user = await this.userRepo.findOne({
|
|
where: { username: manageObject.email.trim() },
|
|
relations: ['settings']
|
|
});
|
|
if (!user) {
|
|
throw new HttpException('Es wurde kein User mit dieser Emailadresse gefunden. Bitte prüfe die Emailadresse und versuche es erneut.', HttpStatus.NOT_FOUND);
|
|
}
|
|
|
|
sys.managers.push(user);
|
|
await this.systemRepo.save(sys);
|
|
if (user.settings.sendSystemAccessMails) {
|
|
this.mailService.sendAccessGrantedMail({to: user, system: sys})
|
|
}
|
|
return sys.managers;
|
|
|
|
}
|
|
|
|
async restore(user: User, id: string) {
|
|
const key = await this.systemRepo.findOneOrFail({
|
|
where: { id: id, managers: { id: user.id } },
|
|
withDeleted: true,
|
|
});
|
|
key.deletedAt = null;
|
|
// await this.activityService.logKeyRestored(user, key);
|
|
// await this.helper.deleteKeyArchiveCache();
|
|
return this.systemRepo.save(key);
|
|
}
|
|
}
|