Added settings module

This commit is contained in:
2023-12-20 12:09:03 +03:00
parent 5a340a2065
commit 206baad511
6 changed files with 130 additions and 0 deletions

View File

@@ -8,6 +8,7 @@ import { ImageModule } from './modules/image/image.module';
import { AppInitService } from './modules/initialization/app.init.service'; import { AppInitService } from './modules/initialization/app.init.service';
import { PostModule } from './modules/post/post.module'; import { PostModule } from './modules/post/post.module';
import { ProxyModule } from './modules/proxy/proxy.module'; import { ProxyModule } from './modules/proxy/proxy.module';
import { SettingsModule } from './modules/settings/settings.module';
import { UserModule } from './modules/user/user.module'; import { UserModule } from './modules/user/user.module';
@Module({ @Module({
@@ -18,6 +19,7 @@ import { UserModule } from './modules/user/user.module';
UserModule, UserModule,
ImageModule, ImageModule,
ProxyModule, ProxyModule,
SettingsModule,
TypeOrmModule.forRoot(<TypeOrmModuleOptions>config.database), TypeOrmModule.forRoot(<TypeOrmModuleOptions>config.database),
], ],
controllers: [AppController], controllers: [AppController],

View File

@@ -3,6 +3,7 @@ import { InjectRepository } from '@nestjs/typeorm';
import { Admin } from 'libs/database/admin.entity'; import { Admin } from 'libs/database/admin.entity';
import { Image } from 'libs/database/image.entity'; import { Image } from 'libs/database/image.entity';
import { Post } from 'libs/database/post.entity'; import { Post } from 'libs/database/post.entity';
import { BotSettings } from 'libs/database/settings.entity';
import { User } from 'libs/database/user.entity'; import { User } from 'libs/database/user.entity';
import { Repository } from 'typeorm'; import { Repository } from 'typeorm';
@@ -13,6 +14,7 @@ export class AppInitService implements OnModuleInit {
@InjectRepository(Admin) private adminRepository: Repository<Admin>, @InjectRepository(Admin) private adminRepository: Repository<Admin>,
@InjectRepository(Post) private postRepository: Repository<Post>, @InjectRepository(Post) private postRepository: Repository<Post>,
@InjectRepository(Image) private ImageRepository: Repository<Image>, @InjectRepository(Image) private ImageRepository: Repository<Image>,
@InjectRepository(BotSettings) private BotSettingsRepository: Repository<BotSettings>,
) {} ) {}
async onModuleInit() {} async onModuleInit() {}

View File

@@ -0,0 +1,40 @@
import { Body, Controller, Delete, Get, Param, Post } from '@nestjs/common';
import { ApiOperation, ApiTags } from '@nestjs/swagger';
import { ICreateBotSettingsProfile, IEditBotSettingsProfile } from './settings.dto';
import { SettingsService } from './settings.service';
@ApiTags('Settings')
@Controller('settings')
export class SettingsController {
constructor(private settingsService: SettingsService) {}
@ApiOperation({ description: 'Get settings for bot' })
@Get()
async getSettings() {
return await this.settingsService.getSettings();
}
@ApiOperation({ description: 'Get all bot settings profiles' })
@Get('profile')
async getProfiles() {
return await this.settingsService.getProfiles();
}
@ApiOperation({ description: 'Create new settings profile' })
@Post('profile/new')
async newProfile(@Body() data: ICreateBotSettingsProfile) {
return await this.settingsService.newProfile(data);
}
@ApiOperation({ description: 'Edit settings profile' })
@Post('profile/edit')
async editProfile(@Body() data: IEditBotSettingsProfile) {
return await this.settingsService.editProfile(data);
}
@ApiOperation({ description: 'Delete settings profile' })
@Delete('profile/delete/:uuid')
async deleteProfile(@Param('uuid') uuid: string) {
return await this.settingsService.deleteProfile(uuid);
}
}

View File

@@ -0,0 +1,13 @@
import { ApiProperty } from '@nestjs/swagger';
export class ICreateBotSettingsProfile {
@ApiProperty({ description: 'Channel', example: '@neurowoman_test' }) readonly channel: string;
@ApiProperty({ description: 'Post times', example: ['12:00', '14:00'] }) readonly postTimes: string[];
}
export class IEditBotSettingsProfile {
@ApiProperty({ description: 'Channel', example: '@neurowoman_test' }) readonly channel: string | undefined;
@ApiProperty({ description: 'Profile uuid', example: '96e7d1b3-20ca-46e8-ac68-e406f79b7eb9' }) readonly uuid: string;
@ApiProperty({ description: 'Post times', example: ['12:00', '14:00'] }) readonly postTimes: string[] | undefined;
@ApiProperty({ description: 'Is active?', example: false }) readonly isActive: boolean | undefined;
}

View File

@@ -0,0 +1,11 @@
import { Module } from '@nestjs/common';
import { LibsModule } from 'libs/libs.module';
import { SettingsController } from './settings.controller';
import { SettingsService } from './settings.service';
@Module({
imports: [LibsModule],
controllers: [SettingsController],
providers: [SettingsService],
})
export class SettingsModule {}

View File

@@ -0,0 +1,62 @@
import { HttpException, Injectable, Logger } from '@nestjs/common';
import { InjectRepository } from '@nestjs/typeorm';
import { BotSettings } from 'libs/database/settings.entity';
import { Repository } from 'typeorm';
import { ICreateBotSettingsProfile, IEditBotSettingsProfile } from './settings.dto';
@Injectable()
export class SettingsService {
constructor(@InjectRepository(BotSettings) private botSettingsRepository: Repository<BotSettings>) {}
private readonly logger: Logger = new Logger(SettingsService.name);
async getSettings() {
this.logger.log('[settings.getSettings]');
const settings = await this.botSettingsRepository.findOneBy({ isActive: true });
if (settings) return settings;
this.logger.debug(`[settings.getSettings] No active settings found`);
throw new HttpException('No settings found', 404);
}
async newProfile(data: ICreateBotSettingsProfile) {
this.logger.log(`[settings.newProfile] data: ${JSON.stringify(data)}`);
return await this.botSettingsRepository.save({ channel: data.channel, messageTimes: data.postTimes });
}
async getProfiles() {
this.logger.log(`[settings.getProfiles]`);
return await this.botSettingsRepository.find();
}
async editProfile(data: IEditBotSettingsProfile) {
this.logger.log(`[settings.editProfile] data: ${JSON.stringify(data)}`);
const editProfile = await this.botSettingsRepository.findOneBy({ uuid: data.uuid });
if (!editProfile) {
this.logger.debug(`[settings.editProfile] No profile found`);
throw new HttpException('No profile found', 404);
}
data.channel ? (editProfile.channel = data.channel) : '';
data.postTimes ? (editProfile.messageTimes = data.postTimes) : '';
if (data.isActive !== undefined) {
editProfile.isActive = data.isActive;
if (data.isActive) {
const nowActive = await this.botSettingsRepository.findOneBy({ isActive: true });
nowActive.isActive = false;
await this.botSettingsRepository.save(nowActive);
}
}
return await this.botSettingsRepository.save(editProfile);
}
async deleteProfile(profile_uuid: string) {
this.logger.log(`[settings.deleteProfile] uuid: ${profile_uuid}`);
const deleteProfile = await this.botSettingsRepository.findOneBy({ uuid: profile_uuid });
if (!deleteProfile) {
this.logger.debug(`[settings.deleteProfile] No profile found`);
throw new HttpException('No profile found', 404);
}
if (deleteProfile.isActive) {
this.logger.debug(`[settings.deleteProfile] Can't delete active profile`);
throw new HttpException("Can't delete active profile", 400);
}
return await this.botSettingsRepository.delete(deleteProfile.uuid);
}
}