8.0 KiB
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
-
Reused
PendingMembershipResponsefor all-memberships view. The existing DTO already contained all needed fields (user name/email, community, metering point, priority, status). AddedvalidFrom/validTofields to complete it rather than creating a new DTO. -
createdAtfield on User entity. The plan called forfindAllByOrderByCreatedAtDesc()— this requires a sortable timestamp. AddedcreatedAtwith automatic@PrePersistinitialization inAuthService.register(), and backfilled for existing users viaAdminDataInitializer. -
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. -
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.
-
Out-of-scope fix in
user-tariff.ts. An unrelated bug fix (AuthService injection +getCurrentUserId()replacingtariff.sourceMeteringPointId!) was bundled in. Should ideally be split to a separate commit per Conventional Commits scope rules.
Usage
Backend API
# 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
- Start backend:
.\mvnw spring-boot:run -pl eeg_backend -Dspring-boot.run.arguments=--spring.profiles.active=dev - Start frontend:
cd eeg_frontend && ng serve - Log in as admin → navigate to Dashboard
- Click "Mitgliedschaften" → see tabs: Ausstehende | Aktive | Alle
- 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