mirror of https://github.com/ghostfolio/ghostfolio
				
				
			
							committed by
							
								 GitHub
								GitHub
							
						
					
				
				 22 changed files with 172 additions and 545 deletions
			
			
		| @ -1,87 +1,48 @@ | |||||
|  | import { HasPermission } from '@ghostfolio/api/decorators/has-permission.decorator'; | ||||
|  | import { HasPermissionGuard } from '@ghostfolio/api/guards/has-permission.guard'; | ||||
| import { AdminJobs } from '@ghostfolio/common/interfaces'; | import { AdminJobs } from '@ghostfolio/common/interfaces'; | ||||
| import { hasPermission, permissions } from '@ghostfolio/common/permissions'; | import { permissions } from '@ghostfolio/common/permissions'; | ||||
| import type { RequestWithUser } from '@ghostfolio/common/types'; |  | ||||
| import { | import { | ||||
|   Controller, |   Controller, | ||||
|   Delete, |   Delete, | ||||
|   Get, |   Get, | ||||
|   HttpException, |  | ||||
|   Inject, |  | ||||
|   Param, |   Param, | ||||
|   Query, |   Query, | ||||
|   UseGuards |   UseGuards | ||||
| } from '@nestjs/common'; | } from '@nestjs/common'; | ||||
| import { REQUEST } from '@nestjs/core'; |  | ||||
| import { AuthGuard } from '@nestjs/passport'; | import { AuthGuard } from '@nestjs/passport'; | ||||
| import { JobStatus } from 'bull'; | import { JobStatus } from 'bull'; | ||||
| import { StatusCodes, getReasonPhrase } from 'http-status-codes'; |  | ||||
| 
 | 
 | ||||
| import { QueueService } from './queue.service'; | import { QueueService } from './queue.service'; | ||||
| 
 | 
 | ||||
| @Controller('admin/queue') | @Controller('admin/queue') | ||||
| export class QueueController { | export class QueueController { | ||||
|   public constructor( |   public constructor(private readonly queueService: QueueService) {} | ||||
|     private readonly queueService: QueueService, |  | ||||
|     @Inject(REQUEST) private readonly request: RequestWithUser |  | ||||
|   ) {} |  | ||||
| 
 | 
 | ||||
|   @Delete('job') |   @Delete('job') | ||||
|   @UseGuards(AuthGuard('jwt')) |   @HasPermission(permissions.accessAdminControl) | ||||
|  |   @UseGuards(AuthGuard('jwt'), HasPermissionGuard) | ||||
|   public async deleteJobs( |   public async deleteJobs( | ||||
|     @Query('status') filterByStatus?: string |     @Query('status') filterByStatus?: string | ||||
|   ): Promise<void> { |   ): Promise<void> { | ||||
|     if ( |  | ||||
|       !hasPermission( |  | ||||
|         this.request.user.permissions, |  | ||||
|         permissions.accessAdminControl |  | ||||
|       ) |  | ||||
|     ) { |  | ||||
|       throw new HttpException( |  | ||||
|         getReasonPhrase(StatusCodes.FORBIDDEN), |  | ||||
|         StatusCodes.FORBIDDEN |  | ||||
|       ); |  | ||||
|     } |  | ||||
| 
 |  | ||||
|     const status = <JobStatus[]>filterByStatus?.split(',') ?? undefined; |     const status = <JobStatus[]>filterByStatus?.split(',') ?? undefined; | ||||
|     return this.queueService.deleteJobs({ status }); |     return this.queueService.deleteJobs({ status }); | ||||
|   } |   } | ||||
| 
 | 
 | ||||
|   @Get('job') |   @Get('job') | ||||
|   @UseGuards(AuthGuard('jwt')) |   @HasPermission(permissions.accessAdminControl) | ||||
|  |   @UseGuards(AuthGuard('jwt'), HasPermissionGuard) | ||||
|   public async getJobs( |   public async getJobs( | ||||
|     @Query('status') filterByStatus?: string |     @Query('status') filterByStatus?: string | ||||
|   ): Promise<AdminJobs> { |   ): Promise<AdminJobs> { | ||||
|     if ( |  | ||||
|       !hasPermission( |  | ||||
|         this.request.user.permissions, |  | ||||
|         permissions.accessAdminControl |  | ||||
|       ) |  | ||||
|     ) { |  | ||||
|       throw new HttpException( |  | ||||
|         getReasonPhrase(StatusCodes.FORBIDDEN), |  | ||||
|         StatusCodes.FORBIDDEN |  | ||||
|       ); |  | ||||
|     } |  | ||||
| 
 |  | ||||
|     const status = <JobStatus[]>filterByStatus?.split(',') ?? undefined; |     const status = <JobStatus[]>filterByStatus?.split(',') ?? undefined; | ||||
|     return this.queueService.getJobs({ status }); |     return this.queueService.getJobs({ status }); | ||||
|   } |   } | ||||
| 
 | 
 | ||||
|   @Delete('job/:id') |   @Delete('job/:id') | ||||
|   @UseGuards(AuthGuard('jwt')) |   @HasPermission(permissions.accessAdminControl) | ||||
|  |   @UseGuards(AuthGuard('jwt'), HasPermissionGuard) | ||||
|   public async deleteJob(@Param('id') id: string): Promise<void> { |   public async deleteJob(@Param('id') id: string): Promise<void> { | ||||
|     if ( |  | ||||
|       !hasPermission( |  | ||||
|         this.request.user.permissions, |  | ||||
|         permissions.accessAdminControl |  | ||||
|       ) |  | ||||
|     ) { |  | ||||
|       throw new HttpException( |  | ||||
|         getReasonPhrase(StatusCodes.FORBIDDEN), |  | ||||
|         StatusCodes.FORBIDDEN |  | ||||
|       ); |  | ||||
|     } |  | ||||
| 
 |  | ||||
|     return this.queueService.deleteJob(id); |     return this.queueService.deleteJob(id); | ||||
|   } |   } | ||||
| } | } | ||||
|  | |||||
| @ -1,40 +1,18 @@ | |||||
| import { AuthDeviceService } from '@ghostfolio/api/app/auth-device/auth-device.service'; | import { AuthDeviceService } from '@ghostfolio/api/app/auth-device/auth-device.service'; | ||||
| import { hasPermission, permissions } from '@ghostfolio/common/permissions'; | import { HasPermission } from '@ghostfolio/api/decorators/has-permission.decorator'; | ||||
| import type { RequestWithUser } from '@ghostfolio/common/types'; | import { HasPermissionGuard } from '@ghostfolio/api/guards/has-permission.guard'; | ||||
| import { | import { permissions } from '@ghostfolio/common/permissions'; | ||||
|   Controller, | import { Controller, Delete, Param, UseGuards } from '@nestjs/common'; | ||||
|   Delete, |  | ||||
|   HttpException, |  | ||||
|   Inject, |  | ||||
|   Param, |  | ||||
|   UseGuards |  | ||||
| } from '@nestjs/common'; |  | ||||
| import { REQUEST } from '@nestjs/core'; |  | ||||
| import { AuthGuard } from '@nestjs/passport'; | import { AuthGuard } from '@nestjs/passport'; | ||||
| import { StatusCodes, getReasonPhrase } from 'http-status-codes'; |  | ||||
| 
 | 
 | ||||
| @Controller('auth-device') | @Controller('auth-device') | ||||
| export class AuthDeviceController { | export class AuthDeviceController { | ||||
|   public constructor( |   public constructor(private readonly authDeviceService: AuthDeviceService) {} | ||||
|     private readonly authDeviceService: AuthDeviceService, |  | ||||
|     @Inject(REQUEST) private readonly request: RequestWithUser |  | ||||
|   ) {} |  | ||||
| 
 | 
 | ||||
|   @Delete(':id') |   @Delete(':id') | ||||
|   @UseGuards(AuthGuard('jwt')) |   @HasPermission(permissions.deleteAuthDevice) | ||||
|  |   @UseGuards(AuthGuard('jwt'), HasPermissionGuard) | ||||
|   public async deleteAuthDevice(@Param('id') id: string): Promise<void> { |   public async deleteAuthDevice(@Param('id') id: string): Promise<void> { | ||||
|     if ( |  | ||||
|       !hasPermission( |  | ||||
|         this.request.user.permissions, |  | ||||
|         permissions.deleteAuthDevice |  | ||||
|       ) |  | ||||
|     ) { |  | ||||
|       throw new HttpException( |  | ||||
|         getReasonPhrase(StatusCodes.FORBIDDEN), |  | ||||
|         StatusCodes.FORBIDDEN |  | ||||
|       ); |  | ||||
|     } |  | ||||
| 
 |  | ||||
|     await this.authDeviceService.deleteAuthDevice({ id }); |     await this.authDeviceService.deleteAuthDevice({ id }); | ||||
|   } |   } | ||||
| } | } | ||||
|  | |||||
| @ -1,39 +1,18 @@ | |||||
| import { RedisCacheService } from '@ghostfolio/api/app/redis-cache/redis-cache.service'; | import { RedisCacheService } from '@ghostfolio/api/app/redis-cache/redis-cache.service'; | ||||
| import { hasPermission, permissions } from '@ghostfolio/common/permissions'; | import { HasPermission } from '@ghostfolio/api/decorators/has-permission.decorator'; | ||||
| import type { RequestWithUser } from '@ghostfolio/common/types'; | import { HasPermissionGuard } from '@ghostfolio/api/guards/has-permission.guard'; | ||||
| import { | import { permissions } from '@ghostfolio/common/permissions'; | ||||
|   Controller, | import { Controller, Post, UseGuards } from '@nestjs/common'; | ||||
|   HttpException, |  | ||||
|   Inject, |  | ||||
|   Post, |  | ||||
|   UseGuards |  | ||||
| } from '@nestjs/common'; |  | ||||
| import { REQUEST } from '@nestjs/core'; |  | ||||
| import { AuthGuard } from '@nestjs/passport'; | import { AuthGuard } from '@nestjs/passport'; | ||||
| import { StatusCodes, getReasonPhrase } from 'http-status-codes'; |  | ||||
| 
 | 
 | ||||
| @Controller('cache') | @Controller('cache') | ||||
| export class CacheController { | export class CacheController { | ||||
|   public constructor( |   public constructor(private readonly redisCacheService: RedisCacheService) {} | ||||
|     private readonly redisCacheService: RedisCacheService, |  | ||||
|     @Inject(REQUEST) private readonly request: RequestWithUser |  | ||||
|   ) {} |  | ||||
| 
 | 
 | ||||
|  |   @HasPermission(permissions.accessAdminControl) | ||||
|   @Post('flush') |   @Post('flush') | ||||
|   @UseGuards(AuthGuard('jwt')) |   @UseGuards(AuthGuard('jwt'), HasPermissionGuard) | ||||
|   public async flushCache(): Promise<void> { |   public async flushCache(): Promise<void> { | ||||
|     if ( |  | ||||
|       !hasPermission( |  | ||||
|         this.request.user.permissions, |  | ||||
|         permissions.accessAdminControl |  | ||||
|       ) |  | ||||
|     ) { |  | ||||
|       throw new HttpException( |  | ||||
|         getReasonPhrase(StatusCodes.FORBIDDEN), |  | ||||
|         StatusCodes.FORBIDDEN |  | ||||
|       ); |  | ||||
|     } |  | ||||
| 
 |  | ||||
|     return this.redisCacheService.reset(); |     return this.redisCacheService.reset(); | ||||
|   } |   } | ||||
| } | } | ||||
|  | |||||
					Loading…
					
					
				
		Reference in new issue