fix: Resolve 500/404 cascade — JWT tenant context, wipe routes, changelog stub
All checks were successful
Test Asgard Runner / test (push) Successful in 3s

Root cause: super_admin JWT returned early with no license_id, causing
@CurrentTenant() to pass undefined to every tenant-scoped service query.

- jwt.strategy: Move license lookup before super_admin early return so
  admins who own licenses get their license_id in the JWT payload
- CurrentTenant decorator: Throw 401 with clear message when license_id
  is undefined instead of letting undefined cascade into TypeORM queries
- Wipe store: Fix 6 wrong routes (/profiles → /wipes/profiles, etc.)
  and remove redundant manual license_id guards
- Changelog module: Add stub controller/service returning empty array
  to eliminate 404 on /api/changelog
- ChangelogView: Handle both array and {entries} response shapes
- AGENTS.md: Streamlined 3-tier roster (Opus/Sonnet/Haiku)

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
This commit is contained in:
Vantz Stockwell
2026-02-15 22:11:41 -05:00
parent 05315cc88a
commit 3cb714a792
9 changed files with 139 additions and 189 deletions

View File

@@ -0,0 +1,24 @@
import { Controller, Get, Query } from '@nestjs/common';
import { ApiTags, ApiOperation, ApiQuery } from '@nestjs/swagger';
import { ChangelogService } from './changelog.service';
import { Public } from '../../common/decorators/public.decorator';
@ApiTags('changelog')
@Controller('changelog')
export class ChangelogController {
constructor(private readonly changelogService: ChangelogService) {}
@Get()
@Public()
@ApiOperation({ summary: 'Get changelog entries' })
@ApiQuery({ name: 'page', required: false, type: Number })
@ApiQuery({ name: 'limit', required: false, type: Number })
async getEntries(
@Query('page') page?: string,
@Query('limit') limit?: string,
) {
const p = parseInt(page || '1', 10);
const l = parseInt(limit || '20', 10);
return this.changelogService.getEntries(p, l);
}
}

View File

@@ -0,0 +1,9 @@
import { Module } from '@nestjs/common';
import { ChangelogController } from './changelog.controller';
import { ChangelogService } from './changelog.service';
@Module({
controllers: [ChangelogController],
providers: [ChangelogService],
})
export class ChangelogModule {}

View File

@@ -0,0 +1,21 @@
import { Injectable } from '@nestjs/common';
export interface ChangelogEntry {
id: string;
version: string;
title: string;
description: string;
type: 'feature' | 'fix' | 'improvement' | 'breaking';
created_at: string;
}
@Injectable()
export class ChangelogService {
async getEntries(
page: number,
limit: number,
): Promise<{ entries: ChangelogEntry[]; total: number }> {
// Stub — returns empty until changelog entries are seeded or managed
return { entries: [], total: 0 };
}
}