feat(quick-261008-w5w): Modul-Changelog Durchstich mit Nextcloud-Status

- Typen, Register, Route GET /modules/changelog/:slug, Waechter-Test
- Seed liest die Version per latestVersion aus dem Changelog
- Marktplatz-Detailseite zeigt den Abschnitt Aenderungen

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
This commit is contained in:
2026-10-08 23:25:02 +02:00
parent 1d339903e0
commit 79210d7966
12 changed files with 674 additions and 2 deletions
@@ -13,6 +13,7 @@ import { Roles } from '../auth/decorators/roles.decorator';
import { RolesGuard } from '../auth/guards/roles.guard';
import { ModuleCategoriesService } from '../module-categories/module-categories.service';
import { ModuleAccessService } from './module-access.service';
import { getModuleChangelog } from './module-changelog.registry';
import { ModuleRegistryService } from './module-registry.service';
/**
@@ -22,6 +23,10 @@ import { ModuleRegistryService } from './module-registry.service';
* - GET /modules/active — list modules accessible to the requesting user
* (Aktivierung UND Grant/Rolle, via ModuleAccessService — D-01: dieselbe
* Auflösung wie ModuleGuard)
* - GET /modules/changelog/:slug — Modul-Changelog aus dem Code (neueste Version
* zuerst; unbekannte Kennung → leere Liste). Das statische Segment `changelog`
* steht vorn, weil die Modul-Controller unter `modules/<slug>` eigene
* `:id`-Routen haben und `/modules/:slug/changelog` sonst verschattet würde.
* - POST /modules/:moduleId/activate — activate a module (ADMIN/SUPER_ADMIN)
* - POST /modules/:moduleId/deactivate — deactivate a module (ADMIN/SUPER_ADMIN)
*
@@ -106,6 +111,17 @@ export class ModuleRegistryController {
}));
}
/**
* GET /modules/changelog/:slug
* Liefert den Changelog eines eingebauten Moduls (quick-261008-w5w). Statische
* Produkttexte, daher wie der Katalog ohne @Roles für jeden angemeldeten
* Benutzer (T-03-03). Unbekannte und eigene Module → leere Liste.
*/
@Get('changelog/:slug')
getChangelog(@Param('slug') slug: string) {
return getModuleChangelog(slug);
}
/**
* POST /modules/:moduleId/activate
* Activates a module for the current tenant.