import { Body, Controller, Delete, Get, Param, Patch, Post, Query, Req, UseGuards, } from '@nestjs/common'; import { ApiBearerAuth, ApiOperation, ApiTags } from '@nestjs/swagger'; import { JwtAuthGuard } from '../auth/guards/jwt-auth.guard'; import { AcceptOrganizationInviteDto } from './dto/accept-organization-invite.dto'; import { CreateLinkRequestDto } from './dto/create-link-request.dto'; import { InviteOrganizationDto } from './dto/invite-organization.dto'; import { PreviewOrganizationInviteDto } from './dto/preview-organization-invite.dto'; import { RespondLinkRequestDto } from './dto/respond-link-request.dto'; import { OrganizationService } from './organization.service'; @ApiTags('organizations') @ApiBearerAuth('JWT-auth') @Controller('organizations') export class OrganizationController { constructor(private readonly organizationService: OrganizationService) {} @Get('invitations/preview') @ApiOperation({ summary: 'Preview organization invite by token (public)' }) previewInvite(@Query() query: PreviewOrganizationInviteDto) { return this.organizationService.previewInvite(query.token); } @Get('invitations') @UseGuards(JwtAuthGuard) @ApiOperation({ summary: 'List invitation history for current organization' }) listInvitations(@Req() req: { user: { id: string; organizationId?: string } }) { const organizationId = this.organizationService.getOrganizationIdFromUser(req.user); return this.organizationService.listInvitationHistory(req.user.id, organizationId); } @Post('invitations/accept') @ApiOperation({ summary: 'Accept organization invite and create/link counterpart org (public)' }) acceptInvite(@Body() dto: AcceptOrganizationInviteDto) { return this.organizationService.acceptInvite(dto); } @Get('search') @UseGuards(JwtAuthGuard) @ApiOperation({ summary: 'Search counterpart organizations (active subscription only)', }) search( @Req() req: { user: { id: string; organizationId?: string } }, @Query('q') q = '', ) { const organizationId = this.organizationService.getOrganizationIdFromUser(req.user); return this.organizationService.searchCounterpartOrganizations(req.user.id, organizationId, q); } @Get('links') @UseGuards(JwtAuthGuard) @ApiOperation({ summary: 'List counterpart links and invitations for current org' }) list(@Req() req: { user: { id: string; organizationId?: string } }) { const organizationId = this.organizationService.getOrganizationIdFromUser(req.user); return this.organizationService.list(req.user.id, organizationId); } @Post('links') @UseGuards(JwtAuthGuard) @ApiOperation({ summary: 'Create pending link request to an existing subscribed counterpart org' }) createLinkRequest( @Req() req: { user: { id: string; organizationId?: string } }, @Body() dto: CreateLinkRequestDto, ) { const organizationId = this.organizationService.getOrganizationIdFromUser(req.user); return this.organizationService.createLinkRequest(req.user.id, organizationId, dto); } @Patch('links/:linkId/respond') @UseGuards(JwtAuthGuard) @ApiOperation({ summary: 'Accept or reject a pending link request for current organization' }) respondToLinkRequest( @Req() req: { user: { id: string; organizationId?: string } }, @Param('linkId') linkId: string, @Body() dto: RespondLinkRequestDto, ) { const organizationId = this.organizationService.getOrganizationIdFromUser(req.user); return this.organizationService.respondToLinkRequest(req.user.id, organizationId, linkId, dto); } @Delete('links/:linkId') @UseGuards(JwtAuthGuard) @ApiOperation({ summary: 'Delete linked organization record' }) deleteLink( @Req() req: { user: { id: string; organizationId?: string } }, @Param('linkId') linkId: string, ) { const organizationId = this.organizationService.getOrganizationIdFromUser(req.user); return this.organizationService.deleteLink(req.user.id, organizationId, linkId); } @Post('invitations/:invitationId/link') @UseGuards(JwtAuthGuard) @ApiOperation({ summary: 'Get a shareable invite link for a pending invitation' }) getInvitationLink( @Req() req: { user: { id: string; organizationId?: string } }, @Param('invitationId') invitationId: string, ) { const organizationId = this.organizationService.getOrganizationIdFromUser(req.user); return this.organizationService.getInvitationLink(req.user.id, organizationId, invitationId); } @Post('invite') @UseGuards(JwtAuthGuard) @ApiOperation({ summary: 'Create invite link for owner of not-yet-subscribed counterpart org' }) inviteOrganization( @Req() req: { user: { id: string; organizationId?: string } }, @Body() dto: InviteOrganizationDto, ) { const organizationId = this.organizationService.getOrganizationIdFromUser(req.user); return this.organizationService.inviteOrganization(req.user.id, organizationId, dto); } }