diff --git a/backend/src/app.module.ts b/backend/src/app.module.ts index 09548a3..cf329b7 100644 --- a/backend/src/app.module.ts +++ b/backend/src/app.module.ts @@ -8,6 +8,7 @@ import { ImageModule } from './modules/image/image.module'; import { AppInitService } from './modules/initialization/app.init.service'; import { PostModule } from './modules/post/post.module'; import { ProxyModule } from './modules/proxy/proxy.module'; +import { SettingsModule } from './modules/settings/settings.module'; import { UserModule } from './modules/user/user.module'; @Module({ @@ -18,6 +19,7 @@ import { UserModule } from './modules/user/user.module'; UserModule, ImageModule, ProxyModule, + SettingsModule, TypeOrmModule.forRoot(config.database), ], controllers: [AppController], diff --git a/backend/src/modules/initialization/app.init.service.ts b/backend/src/modules/initialization/app.init.service.ts index 9361f3e..d03df83 100644 --- a/backend/src/modules/initialization/app.init.service.ts +++ b/backend/src/modules/initialization/app.init.service.ts @@ -3,6 +3,7 @@ import { InjectRepository } from '@nestjs/typeorm'; import { Admin } from 'libs/database/admin.entity'; import { Image } from 'libs/database/image.entity'; import { Post } from 'libs/database/post.entity'; +import { BotSettings } from 'libs/database/settings.entity'; import { User } from 'libs/database/user.entity'; import { Repository } from 'typeorm'; @@ -13,6 +14,7 @@ export class AppInitService implements OnModuleInit { @InjectRepository(Admin) private adminRepository: Repository, @InjectRepository(Post) private postRepository: Repository, @InjectRepository(Image) private ImageRepository: Repository, + @InjectRepository(BotSettings) private BotSettingsRepository: Repository, ) {} async onModuleInit() {} diff --git a/backend/src/modules/settings/settings.controller.ts b/backend/src/modules/settings/settings.controller.ts new file mode 100644 index 0000000..de025dc --- /dev/null +++ b/backend/src/modules/settings/settings.controller.ts @@ -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); + } +} diff --git a/backend/src/modules/settings/settings.dto.ts b/backend/src/modules/settings/settings.dto.ts new file mode 100644 index 0000000..6bb6429 --- /dev/null +++ b/backend/src/modules/settings/settings.dto.ts @@ -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; +} diff --git a/backend/src/modules/settings/settings.module.ts b/backend/src/modules/settings/settings.module.ts new file mode 100644 index 0000000..bfac8c5 --- /dev/null +++ b/backend/src/modules/settings/settings.module.ts @@ -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 {} diff --git a/backend/src/modules/settings/settings.service.ts b/backend/src/modules/settings/settings.service.ts new file mode 100644 index 0000000..4353356 --- /dev/null +++ b/backend/src/modules/settings/settings.service.ts @@ -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) {} + 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); + } +}