import { Body, Controller, Get, Param, Post, Req } from '@nestjs/common'; import { CreateVersionInput, PageVersionContentView, PageVersionView, createVersionInputSchema, } from '@dorfteich/shared'; import { AuthedRequest } from '../auth/auth.guard'; import { ZodValidationPipe } from '../common/zod-validation.pipe'; import { RequiresPagePermission } from '../permissions/permission.decorators'; import { VersionsService } from './versions.service'; /** * Page version history (issue #41/#42, ADR 0013). Every route requires write * access to the page — viewing history is gated like editing (permissions.md). */ @Controller() export class VersionsController { constructor(private readonly versions: VersionsService) {} /** List the page's versions, newest first. */ @Get('pages/:id/versions') @RequiresPagePermission('write', { idParam: 'id' }) // history = write (ADR 0013) async list(@Param('id') id: string, @Req() request: AuthedRequest): Promise { return this.versions.list(request.user!, id); } /** A single version rendered read-only, with Markdown for diffing. */ @Get('pages/:id/versions/:versionId') @RequiresPagePermission('write', { idParam: 'id' }) async getContent( @Param('id') id: string, @Param('versionId') versionId: string, @Req() request: AuthedRequest, ): Promise { return this.versions.getContent(request.user!, id, versionId); } /** Create a named version of the page. */ @Post('pages/:id/versions') @RequiresPagePermission('write', { idParam: 'id' }) async createNamed( @Param('id') id: string, @Body(new ZodValidationPipe(createVersionInputSchema)) input: CreateVersionInput, @Req() request: AuthedRequest, ): Promise { return this.versions.createNamed(request.user!, id, input); } /** Restore the page to an earlier version (creates a pre-restore snapshot). */ @Post('pages/:id/versions/:versionId/restore') @RequiresPagePermission('write', { idParam: 'id' }) async restore( @Param('id') id: string, @Param('versionId') versionId: string, @Req() request: AuthedRequest, ): Promise { return this.versions.restore(request.user!, id, versionId); } }