import { BadRequestException, Body, Controller, ForbiddenException, HttpCode, HttpStatus, Post, UseGuards, } from '@nestjs/common'; import { SearchService } from './search.service'; import { SearchDTO, SearchShareDTO, SearchSuggestionDTO, } from './dto/search.dto'; import { AuthWorkspace } from '../../common/decorators/auth-workspace.decorator'; import { JwtAuthGuard } from '../../common/guards/jwt-auth.guard'; import { User, Workspace } from '@docmost/db/types/entity.types'; import SpaceAbilityFactory from '../casl/abilities/space-ability.factory'; import { SpaceCaslAction, SpaceCaslSubject, } from '../casl/interfaces/space-ability.type'; import { AuthUser } from '../../common/decorators/auth-user.decorator'; import { Public } from 'src/common/decorators/public.decorator'; @UseGuards(JwtAuthGuard) @Controller('search') export class SearchController { constructor( private readonly searchService: SearchService, private readonly spaceAbility: SpaceAbilityFactory, ) {} @HttpCode(HttpStatus.OK) @Post() async pageSearch( @Body() searchDto: SearchDTO, @AuthUser() user: User, @AuthWorkspace() workspace: Workspace, ) { delete searchDto.shareId; if (searchDto.spaceId) { const ability = await this.spaceAbility.createForUser( user, searchDto.spaceId, ); if (ability.cannot(SpaceCaslAction.Read, SpaceCaslSubject.Page)) { throw new ForbiddenException(); } } return this.searchService.searchPage(searchDto.query, searchDto, { userId: user.id, workspaceId: workspace.id, }); } @HttpCode(HttpStatus.OK) @Post('suggest') async searchSuggestions( @Body() dto: SearchSuggestionDTO, @AuthUser() user: User, @AuthWorkspace() workspace: Workspace, ) { return this.searchService.searchSuggestions(dto, user.id, workspace.id); } @Public() @HttpCode(HttpStatus.OK) @Post('share-search') async searchShare( @Body() searchDto: SearchShareDTO, @AuthWorkspace() workspace: Workspace, ) { delete searchDto.spaceId; if (!searchDto.shareId) { throw new BadRequestException('shareId is required'); } return this.searchService.searchPage(searchDto.query, searchDto, { workspaceId: workspace.id, }); } }