docs: add final compose report for admin overview extensions
This commit is contained in:
parent
ef933ed0ea
commit
85d8bc0011
@ -0,0 +1,150 @@
|
|||||||
|
# Report: Admin-Übersichten erweitern — Alle Mitgliedschaften & Alle Benutzer
|
||||||
|
|
||||||
|
## Status
|
||||||
|
|
||||||
|
| Metric | Value |
|
||||||
|
|--------|-------|
|
||||||
|
| Backend Tests | 193/193 passed |
|
||||||
|
| Frontend Tests | 68/68 passed |
|
||||||
|
| Frontend Build | OK (budget warning: 954.92 kB > 500 kB limit, pre-existing) |
|
||||||
|
| Typecheck | OK |
|
||||||
|
| Review | Ready to merge |
|
||||||
|
| Files Changed | 39 files (+2399 / -129) |
|
||||||
|
|
||||||
|
## What Was Built
|
||||||
|
|
||||||
|
Two admin overview pages that previously showed only pending items now support full-status views:
|
||||||
|
|
||||||
|
**Admin-Mitgliedschaften** (`/dashboard/admin-memberships`):
|
||||||
|
- Tab "Ausstehende Anträge" — existing card view with approve/reject buttons (PENDING only)
|
||||||
|
- Tab "Aktive Mitgliedschaften" — table of ACTIVE memberships
|
||||||
|
- Tab "Alle" — table of all memberships across all statuses
|
||||||
|
- User-friendly status labels: PENDING → "Ausstehend", ACTIVE → "Aktiv", INACTIVE → "Inaktiv"
|
||||||
|
|
||||||
|
**Admin-Benutzerverwaltung** (`/dashboard/approvals`):
|
||||||
|
- Tab "Ausstehende Anträge" — existing table with approve/reject (PENDING only)
|
||||||
|
- Tab "Alle Benutzer" — table of all users with status badges (no action buttons)
|
||||||
|
- User-friendly status labels: PENDING → "Ausstehend", APPROVED → "Freigeschaltet", REJECTED → "Abgelehnt"
|
||||||
|
|
||||||
|
**Backend APIs added:**
|
||||||
|
- `GET /api/community/admin/memberships` — returns all memberships with details (admin-only)
|
||||||
|
- `GET /api/admin/users` — returns all users sorted by creation date (admin-only)
|
||||||
|
|
||||||
|
## Architecture
|
||||||
|
|
||||||
|
```
|
||||||
|
┌─────────────────────────────────────────────────┐
|
||||||
|
│ Angular Frontend │
|
||||||
|
│ AdminMembershipsComponent AdminUserApproval │
|
||||||
|
│ │ │ │
|
||||||
|
│ MembershipService adminIAM.service.ts │
|
||||||
|
│ (getAllMemberships) (getAllUsers) │
|
||||||
|
│ │ │ │
|
||||||
|
│ HTTP GET HTTP GET │
|
||||||
|
└───────┼────────────────────────────┼─────────────┘
|
||||||
|
│ │
|
||||||
|
┌───────┼────────────────────────────┼─────────────┐
|
||||||
|
│ ▼ Spring Boot ▼ │
|
||||||
|
│ MembershipController AdminIamController │
|
||||||
|
│ │ │ │
|
||||||
|
│ MembershipService AdminIamService │
|
||||||
|
│ │ │ │
|
||||||
|
│ MembershipRepository UserRepository │
|
||||||
|
│ findAllWithDetails() findAllByOrderBy...() │
|
||||||
|
│ │ │ │
|
||||||
|
│ └────────── PostgreSQL ───────┘ │
|
||||||
|
└──────────────────────────────────────────────────┘
|
||||||
|
```
|
||||||
|
|
||||||
|
Pattern follows existing architecture: repository → service → controller, with `@PreAuthorize("hasRole('ADMIN')")` on all new endpoints.
|
||||||
|
|
||||||
|
## Design Decisions
|
||||||
|
|
||||||
|
1. **Reused `PendingMembershipResponse` for all-memberships view.** The existing DTO already contained all needed fields (user name/email, community, metering point, priority, status). Added `validFrom`/`validTo` fields to complete it rather than creating a new DTO.
|
||||||
|
|
||||||
|
2. **`createdAt` field on User entity.** The plan called for `findAllByOrderByCreatedAtDesc()` — this requires a sortable timestamp. Added `createdAt` with automatic `@PrePersist` initialization in `AuthService.register()`, and backfilled for existing users via `AdminDataInitializer`.
|
||||||
|
|
||||||
|
3. **Tab-based navigation pattern.** Both components use Angular signals (`activeTab`) to switch between views within the same page, keeping the existing "pending" workflow intact while adding "all" views. No new routes needed.
|
||||||
|
|
||||||
|
4. **Lazy loading for all-data tabs.** Tab content is fetched on first activation (not on page load), avoiding unnecessary API calls when the admin only needs pending items.
|
||||||
|
|
||||||
|
5. **Out-of-scope fix in `user-tariff.ts`.** An unrelated bug fix (AuthService injection + `getCurrentUserId()` replacing `tariff.sourceMeteringPointId!`) was bundled in. Should ideally be split to a separate commit per Conventional Commits scope rules.
|
||||||
|
|
||||||
|
## Usage
|
||||||
|
|
||||||
|
### Backend API
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# All memberships (admin only)
|
||||||
|
curl -H "Authorization: Bearer <admin-jwt>" \
|
||||||
|
http://localhost:8080/api/community/admin/memberships
|
||||||
|
|
||||||
|
# All users (admin only)
|
||||||
|
curl -H "Authorization: Bearer <admin-jwt>" \
|
||||||
|
http://localhost:8080/api/admin/users
|
||||||
|
```
|
||||||
|
|
||||||
|
### Frontend
|
||||||
|
|
||||||
|
1. Start backend: `.\mvnw spring-boot:run -pl eeg_backend -Dspring-boot.run.arguments=--spring.profiles.active=dev`
|
||||||
|
2. Start frontend: `cd eeg_frontend && ng serve`
|
||||||
|
3. Log in as admin → navigate to Dashboard
|
||||||
|
4. Click "Mitgliedschaften" → see tabs: Ausstehende | Aktive | Alle
|
||||||
|
5. Click "Benutzerverwaltung" → see tabs: Ausstehende | Alle
|
||||||
|
|
||||||
|
## Verification
|
||||||
|
|
||||||
|
| Check | Result |
|
||||||
|
|-------|--------|
|
||||||
|
| Backend unit tests | 193/193 passed (BUILD SUCCESS) |
|
||||||
|
| Frontend unit tests | 68/68 passed across 17 test files |
|
||||||
|
| Frontend build | OK (budget warning only, pre-existing) |
|
||||||
|
| Typecheck | No errors |
|
||||||
|
| Integration tests | All existing REST API tests pass |
|
||||||
|
| Manual UI check | Tab navigation renders correctly, tables display data |
|
||||||
|
|
||||||
|
Non-fatal: Two unhandled HTTP errors in `dashboard-layout.spec.ts` (notification API calls to `localhost:8080` failing without running backend — expected behavior, not a regression).
|
||||||
|
|
||||||
|
## Journey Log
|
||||||
|
|
||||||
|
| # | Date | Event | Outcome |
|
||||||
|
|---|------|-------|---------|
|
||||||
|
| 1 | 2026-07-23 | Implementation — 15 tasks across 6 parallel worktrees | All tasks completed. Backend: createdAt field, repository queries, services, controllers, DTOs, tests. Frontend: OpenAPI spec, API client, tab components, tests. |
|
||||||
|
| 2 | 2026-07-23 | Integration — 8 merge batches into master | Zero merge conflicts. All branches cleanly integrated via `git merge --no-ff`. |
|
||||||
|
| 3 | 2026-07-23 | Verification — typecheck + full test suite | 193 backend + 68 frontend tests pass. Build succeeds. No regressions. |
|
||||||
|
| 4 | 2026-07-23 | Review — automated code review | Ready to merge. Two important findings: out-of-scope fix in user-tariff.ts, inconsistent Swagger annotation style in MembershipController. No blockers. |
|
||||||
|
| 5 | 2026-07-23 | Final consolidation — this report | Canonical final state written. |
|
||||||
|
|
||||||
|
## Source Materials
|
||||||
|
|
||||||
|
| Material | Location |
|
||||||
|
|----------|----------|
|
||||||
|
| Implementation plan | `.mimocode/plans/1784785656280-hidden-tiger.md` |
|
||||||
|
| Commit history | 15 commits (feat/test/chore) on master |
|
||||||
|
| Test results | Run history: 261 total tests (193 BE + 68 FE), 0 failures |
|
||||||
|
| Review output | Compose review: 0 critical, 2 important, 3 minor |
|
||||||
|
| Changed files | 39 files across `eeg_backend/` and `eeg_frontend/` |
|
||||||
|
|
||||||
|
## Commits (chronological)
|
||||||
|
|
||||||
|
```
|
||||||
|
feat(iam): add createdAt field to User entity
|
||||||
|
test(iam): verify createdAt is set during registration
|
||||||
|
feat(community): add findAllWithDetails query to MembershipRepository
|
||||||
|
feat(community): extend PendingMembershipResponse with validFrom/validTo fields
|
||||||
|
feat(community): add getAllMemberships() to MembershipService
|
||||||
|
feat(iam): add UserRepository.findAllByOrderByCreatedAtDesc()
|
||||||
|
feat(community): add GET /admin/memberships endpoint with tests
|
||||||
|
feat(iam): add AdminIamService.getAllUsers()
|
||||||
|
feat(iam): add GET /api/admin/users endpoint for all-users overview
|
||||||
|
test(iam,community): add tests for getAllMemberships and getAllUsers
|
||||||
|
chore(common): regenerate OpenAPI spec and frontend API client
|
||||||
|
feat(community): add getAllMemberships() to frontend MembershipService
|
||||||
|
feat(frontend): add tab navigation and all-users table to AdminUserApprovalComponent
|
||||||
|
feat(frontend): add tab navigation and table view to AdminMembershipsComponent
|
||||||
|
```
|
||||||
|
|
||||||
|
## Review Notes (pre-existing, not introduced by this change)
|
||||||
|
|
||||||
|
- Frontend budget warning (954.92 kB > 500 kB limit) — pre-existing
|
||||||
|
- `AdminIamService.getPendingUsers()` lacks `@Transactional(readOnly = true)` — pre-existing
|
||||||
Loading…
Reference in New Issue
Block a user