diff --git a/.planning/REQUIREMENTS.md b/.planning/REQUIREMENTS.md index fe5c0e1..42993c6 100644 --- a/.planning/REQUIREMENTS.md +++ b/.planning/REQUIREMENTS.md @@ -66,9 +66,9 @@ - [ ] **PERM-01**: Admin verwaltet Gruppen pro Mandant (anlegen, umbenennen, löschen) und weist Benutzer manuell zu oder entfernt sie. Beim Löschen einer belegten Gruppe warnt ein Dialog mit Mitglieder- und Freigabenanzahl, bevor Mitgliedschaften und Freigaben mitgelöscht werden. - [ ] **PERM-02**: Eine Gruppe kann optional an einen AD-Gruppen-DN gebunden werden, ausgewählt aus der bestehenden LDAP-Gruppensuche. Der Benutzer-Sync liest `memberOf` mit und pflegt daraus die Mitgliedschaften; verlässt ein Benutzer die AD-Gruppe, fällt nur seine LDAP-Mitgliedschaft weg — manuell gesetzte bleiben bestehen. - [ ] **PERM-03**: Admin gibt ein mandantenweit aktives Modul gezielt für Gruppen und für einzelne Benutzer frei und entzieht Freigaben wieder. Gruppenfreigaben werden in einer Matrix Module × Gruppen gepflegt, Einzelfreigaben im Benutzer-Detail samt Anzeige der über Gruppen geerbten Rechte. -- [ ] **PERM-04**: Ohne Freigabe hat ein USER keinen Zugriff: das Modul fehlt in der Sidebar, die Modulseite antwortet mit einer 403-Seite samt Hinweis, und die Modul-API antwortet mit 403. Sidebar, Modulseite und API nutzen dieselbe Zugriffsauflösung. -- [ ] **PERM-05**: ADMIN und SUPER_ADMIN sehen und nutzen innerhalb ihres Mandanten alle aktiven Module ohne Freigabe. -- [ ] **PERM-06**: Die Migration überführt den Bestand ohne Zugriffsverlust: pro Mandant entsteht eine als Standardgruppe markierte Gruppe mit allen bestehenden Benutzern und Freigaben für alle zum Migrationszeitpunkt aktiven Module. Neue Benutzer — manuell angelegt wie per LDAP importiert — treten der markierten Standardgruppe automatisch bei. +- [x] **PERM-04**: Ohne Freigabe hat ein USER keinen Zugriff: das Modul fehlt in der Sidebar, die Modulseite antwortet mit einer 403-Seite samt Hinweis, und die Modul-API antwortet mit 403. Sidebar, Modulseite und API nutzen dieselbe Zugriffsauflösung. +- [x] **PERM-05**: ADMIN und SUPER_ADMIN sehen und nutzen innerhalb ihres Mandanten alle aktiven Module ohne Freigabe. +- [x] **PERM-06**: Die Migration überführt den Bestand ohne Zugriffsverlust: pro Mandant entsteht eine als Standardgruppe markierte Gruppe mit allen bestehenden Benutzern und Freigaben für alle zum Migrationszeitpunkt aktiven Module. Neue Benutzer — manuell angelegt wie per LDAP importiert — treten der markierten Standardgruppe automatisch bei. - [ ] **PERM-07**: Ein Dashboard-Widget, dessen Modul dem Benutzer nicht freigegeben ist, erscheint nicht auf seinem Dashboard. ## Future Requirements (deferred) diff --git a/.planning/ROADMAP.md b/.planning/ROADMAP.md index 68f7048..7c2de32 100644 --- a/.planning/ROADMAP.md +++ b/.planning/ROADMAP.md @@ -511,12 +511,12 @@ Plans: **Neue Modelle**: `Group` (tenantId, name, ldapDn?), `GroupMembership` (userId, groupId, source MANUAL|LDAP), `ModuleGrant` (tenantId, moduleId, groupId? | userId?) -**Plans**: 8 plans +**Plans**: 1/8 plans executed Plans: **Wave 1** -- [ ] 15-01-PLAN.md — Schema, Migration mit Bestandsübernahme und Zugriffsauflösung (Tracer) +- [x] 15-01-PLAN.md — Schema, Migration mit Bestandsübernahme und Zugriffsauflösung (Tracer) **Wave 2** *(blocked on Wave 1 completion)* @@ -559,4 +559,4 @@ Phases execute in numeric order: 1 -> 2 -> 3 -> 4 -> 5 -> 6 -> 7 -> 8 -> 9 -> 10 | 12. Tender Notifications | 4/4 | In Progress| | | 13. Scraping Adapters & Cross-Source Deduplication | 6/6 | In Progress| | | 14. RSS, Email-Alert Ingestion & Module Rollout | 5/5 | In Progress| | -| 15. Modul-Berechtigungen: Gruppen & User-Grants | 0/8 | Planned | | +| 15. Modul-Berechtigungen: Gruppen & User-Grants | 1/8 | In Progress| | diff --git a/.planning/STATE.md b/.planning/STATE.md index 5bcbeca..ba9f6c3 100644 --- a/.planning/STATE.md +++ b/.planning/STATE.md @@ -2,18 +2,18 @@ gsd_state_version: 1.0 milestone: v1.1 milestone_name: Ausschreibungs-Radar -current_phase: 14 -current_phase_name: rss-email-alert-ingestion-module-rollout +current_phase: 15 +current_phase_name: modul-berechtigungen-gruppen-user-grants status: executing -stopped_at: Phase 15 UI-SPEC approved -last_updated: "2026-08-04T12:44:05.062Z" -last_activity: 2026-07-23 -last_activity_desc: Completed 14-02-PLAN.md (RSS ingestion slice) +stopped_at: Completed 15-01-PLAN.md +last_updated: "2026-08-04T13:14:07.699Z" +last_activity: 2026-08-04 +last_activity_desc: Phase 15 execution started progress: total_phases: 15 completed_phases: 13 total_plans: 75 - completed_plans: 66 + completed_plans: 67 --- # Project State @@ -23,16 +23,16 @@ progress: See: .planning/PROJECT.md (updated 2026-07-17) **Core value:** Eine zentrale Plattform, in der beliebige Workflow-Tools als Module lizenziert, aktiviert und genutzt werden koennen -- ohne zwischen verschiedenen Anwendungen wechseln zu muessen. -**Current focus:** Phase 14 — rss-email-alert-ingestion-module-rollout +**Current focus:** Phase 15 — modul-berechtigungen-gruppen-user-grants ## Current Position -Phase: 14 (rss-email-alert-ingestion-module-rollout) — EXECUTING -Plan: 5 of 5 -Status: Plan 14-02 complete -Last activity: 2026-07-23 — Completed 14-02-PLAN.md (RSS ingestion slice) +Phase: 15 (modul-berechtigungen-gruppen-user-grants) — EXECUTING +Plan: 2 of 8 +Status: Ready to execute +Last activity: 2026-08-04 — Phase 15 execution started -Progress: [██████████] 99% +Progress: [█████████░] 89% ## Performance Metrics @@ -100,6 +100,7 @@ Progress: [██████████] 99% | Phase 14 P02 | 30min | 3 tasks | 21 files | | Phase 14 P04 | 25min | 2 tasks | 6 files | | Phase 14 P05 | 50min | 3 tasks | 19 files | +| Phase 15 P01 | 24min | 3 tasks | 10 files | ## Accumulated Context @@ -229,6 +230,8 @@ Recent decisions affecting current work: - [Phase ?]: 14-05: tenderRadar i18n namespace added; Bundesland/CPV filter option values stay canonical German for backend compatibility, only labels translated; portal display slugs left untranslated as proper nouns - [Phase ?]: [260728-lih]: DELIBERATE back-compat break — empty groupFilterDns now means 'sync nothing' (was 'import everyone under baseDn'); early-return guard in syncUsersForTenant runs before search/deactivation so an empty selection never mass-deactivates existing LDAP users - [Phase ?]: [260729-d3k]: syncUsersForTenant no-op guard re-keyed from empty groupFilterDns to empty parsed base-DN list — Base-DN(s) are now the sync scope, groupFilterDns is an optional extra restriction (ou= = extra bases, group DN = memberOf constraint) +- [Phase ?]: [15-01]: D-01/D-05/D-06/D-02 wie in 15-CONTEXT.md gesperrt umgesetzt (Nutzer-Checkpoint mit 'proceed' bestaetigt) +- [Phase ?]: [15-01]: RLS fuer Group/GroupMembership/ModuleGrant aktiviert (T-15-11) statt sie wie Tender* RLS-frei zu lassen ### Pending Todos @@ -270,7 +273,7 @@ Items acknowledged and carried forward from previous milestone close: ## Session Continuity -Last session: 2026-08-04T11:58:33.872Z -Stopped at: Phase 15 UI-SPEC approved -Resume file: .planning/phases/15-modul-berechtigungen-gruppen-user-grants/15-UI-SPEC.md +Last session: 2026-08-04T13:14:07.663Z +Stopped at: Completed 15-01-PLAN.md +Resume file: None Last activity: 2026-07-14 - Built LDAP per-user exclude/denylist filter (9d1323f), migration applied on live DB, verified via Playwright: sync deactivated 4 excluded service accounts (administrator/krbtgt/guest/dns-ldap), 2 real LDAP users stay active, 0 wrongly created