import { Controller, Get, Query, UseGuards } from '@nestjs/common'; import { ApiBearerAuth, ApiOAuth2, ApiTags } from '@nestjs/swagger'; import { Privileges } from 'src/decorators/privileges.decorator'; import { Scopes } from 'src/decorators/scopes.decorator'; import { OAuth2Guard } from 'src/guards/oauth2.guard'; import { PrivilegesGuard } from 'src/guards/privileges.guard'; import { ScopesGuard } from 'src/guards/scopes.guard'; import { AuditAction } from 'src/modules/objects/audit/audit.enum'; import { AuditSearchClause } from 'src/modules/objects/audit/audit.interfaces'; import { AuditService } from 'src/modules/objects/audit/audit.service'; import { FormUtilityService } from 'src/modules/utility/services/form-utility.service'; import { PaginationService } from 'src/modules/utility/services/paginate.service'; import { PageOptions } from 'src/types/pagination.interfaces'; @ApiBearerAuth() @ApiTags('admin') @ApiOAuth2(['management']) @Controller('/api/admin/audit') @UseGuards(OAuth2Guard, PrivilegesGuard, ScopesGuard) export class AuditAdminController { constructor( private _paginate: PaginationService, private _form: FormUtilityService, private _audit: AuditService, ) {} /** * Get a list of all audit logs or search for a specific log * @param search Search and pagination options * @returns Paginated audit list */ @Get('') @Scopes('management') @Privileges('admin', 'admin:audit') async userList(@Query() search: AuditSearchClause & PageOptions) { const resultCount = await this._audit.searchForAuditCount(search); const pagination = this._paginate.paginate(search, resultCount); const [list] = await this._audit.searchForAudit( pagination.pageSize, pagination.offset, search, ); return { pagination, list: this._form.stripObjectArray(list, ['password']), }; } @Get('filter') @Scopes('management') @Privileges('admin', 'admin:audit') async filterList() { return Object.values(AuditAction); } }