import { Body, Controller, Delete, Get, HttpCode, NotFoundException, Param, Post, Req, } from '@nestjs/common'; import { createFeedTokenInputSchema, type CreateFeedTokenInput, type FeedTokenCreatedView, type FeedTokenView, } from '@dorfteich/shared'; import { AuthedRequest } from '../auth/auth.guard'; import { ZodValidationPipe } from '../common/zod-validation.pipe'; import { AuthenticatedOnly } from '../permissions/permission.decorators'; import { InstanceSettingsService } from '../settings/instance-settings.service'; import { FeedTokensService } from './feed-tokens.service'; /** * Feed-token lifecycle for the settings UI (issue #149) — * session-authenticated and owner-scoped, like the API-token controller. */ @Controller('users/me/feed-tokens') @AuthenticatedOnly() export class FeedTokensController { constructor( private readonly tokens: FeedTokensService, private readonly settings: InstanceSettingsService, ) {} /** Feed master switch (issue #191): disabled ⇒ the surface answers 404. */ private async assertFeedsEnabled(): Promise { if (!(await this.settings.get('feeds.enabled'))) throw new NotFoundException(); } @Get() async list(@Req() request: AuthedRequest): Promise { await this.assertFeedsEnabled(); return this.tokens.list(request.user!); } @Post() async create( @Body(new ZodValidationPipe(createFeedTokenInputSchema)) input: CreateFeedTokenInput, @Req() request: AuthedRequest, ): Promise { await this.assertFeedsEnabled(); return this.tokens.create(request.user!, input); } @Delete(':id') @HttpCode(204) async remove(@Param('id') id: string, @Req() request: AuthedRequest): Promise { await this.assertFeedsEnabled(); await this.tokens.remove(request.user!, id); } }