Commit Graph

78 Commits

Author SHA1 Message Date
e46b21c8ca test(backend): add OpenAPI spec assertions + regenerate frontend API client
- Add acceptance criteria assertions to OpenApiGeneratorTest:
  - Verify /api/community/admin/memberships path exists
  - Verify /api/admin/users path exists
  - Verify getAllUsers operation exists
- Regenerate frontend API client from OpenAPI spec
- Fix frontend type error: remove unnecessary userId parameter
  from deleteUserTariff call (backend uses @CurrentUserId from JWT)
2026-07-24 07:30:26 +02:00
3e336ca3c9 feat(iam): add @PrePersist callback to auto-populate User.createdAt
Add onCreate() method with @PrePersist annotation that sets createdAt
to LocalDateTime.now() on first persist, consistent with other entities
(UserTariff, CommunityTariff, etc.). Guard prevents overwriting existing
values. Two new tests verify auto-population and idempotency.
2026-07-24 07:11:52 +02:00
f1cf152091 chore: update OpenAPI spec, Angular config, and dev application settings 2026-07-23 15:03:17 +02:00
ffa501e89f feat(frontend): add producer and consumer invite pages with navigation 2026-07-23 15:03:05 +02:00
4fdc2d5f7a feat(frontend): add metering data chart to dashboard overview with ECharts 2026-07-23 15:02:51 +02:00
a8686718db chore(iam): enhance dev data initialization with test metering points and communities 2026-07-23 15:02:35 +02:00
765cbb0ec7 feat(dashboard): add metering data overview endpoint for user dashboard 2026-07-23 15:02:23 +02:00
5ff22e53bd feat(community): improve metering data upload with batch processing and deduplication 2026-07-23 15:02:02 +02:00
85d8bc0011 docs: add final compose report for admin overview extensions 2026-07-23 14:59:49 +02:00
ef933ed0ea feat(frontend): add tab navigation and table view to AdminMembershipsComponent
- Add three tabs: Ausstehende Anträge / Aktive Mitgliedschaften / Alle
- Card view for pending tab (existing approve/reject behavior preserved)
- Table view for active and all tabs (Name, Email, Community, Zählpunkt, Priorität, Status)
- getStatusLabel() for German status display (Ausstehend/Aktiv/Inaktiv)
- getStatusBadgeClass() for color-coded status badges
- Client-side filtering for instant tab switching
- Add comprehensive tests (19 test cases)
- Add getAllUsers() to AdminIAMService (fixes compilation for admin-user-approval)
- Fix deleteUserTariff missing userId argument in user-tariff component
2026-07-23 14:46:27 +02:00
dbd39643aa Merge branch 'mimocode/curious-nebula' 2026-07-23 14:33:24 +02:00
2bf1d49af1 feat(frontend): add tab navigation and all-users table to AdminUserApprovalComponent
- Add activeTab signal ('pending' | 'all') with tab navigation UI
- Add allUsers signal with loadAllUsers() using generated AdminIAMService.getAllUsers()
- Add getStatusLabel() helper for German status labels (Ausstehend/Aktiv/Freigeschaltet/Inaktiv/Abgelehnt)
- Add getStatusBadgeClass() for color-coded status badges (yellow/green/red)
- Fix duplicate 'Status' column header bug in pending users table
- All-users tab shows Name, Email, Status badge, Rolle columns (no action buttons)
- Add 22 passing tests covering signals, helpers, tab switching, approve/reject, and template
2026-07-23 14:32:02 +02:00
344587486a feat(community): add getAllMemberships() to frontend MembershipService
Add method to fetch all admin memberships via GET /api/community/admin/memberships
with corresponding unit tests using Angular HttpClientTestingModule.
2026-07-23 14:22:35 +02:00
cab55c4abb Merge branch 'mimocode/cosmic-comet' of C:\Users\postm\.local\share\mimocode\worktree\f2606916-b9e4-4ea6-bb06-b44029fd350f\cosmic-comet 2026-07-23 14:17:46 +02:00
2261ffbbd3 feat-common-regenerate-openapi-spec 2026-07-23 14:16:35 +02:00
fe4ca2ccbd test(iam,community): add tests for getAllMemberships and getAllUsers
- Add getAllMemberships_returnsAllStatuses: verifies PENDING, ACTIVE, INACTIVE
- Add getAllMemberships_collectsDistinctUserIds: verifies distinct user ID collection
- Add getAllUsers_returnsSortedByCreatedAtDesc: verifies sorting order
- Add getAllUsers_returnsEmptyList: edge case for empty user list
- Add getAllUsers_includesAllRegistrationStatuses: verifies all statuses present
- All 172 backend tests pass
2026-07-23 14:13:14 +02:00
cf59de80bc feat(iam): add GET /api/admin/users endpoint for all-users overview 2026-07-23 14:07:13 +02:00
41e489a2dd Merge branch 'mimocode/clever-garden' 2026-07-23 14:03:14 +02:00
b7d7e22570 feat(iam): add AdminIamService.getAllUsers() 2026-07-23 14:02:23 +02:00
3fbf717bd5 feat(community): add GET /admin/memberships endpoint with tests 2026-07-23 13:59:53 +02:00
0092301ef4 Merge branch 'mimocode/misty-squid' 2026-07-23 13:55:55 +02:00
727105a92d Merge branch 'mimocode/proud-moon' 2026-07-23 13:55:47 +02:00
b80b22ea46 feat(iam): add UserRepository.findAllByOrderByCreatedAtDesc()
Add method to retrieve all users ordered by creation date descending.
This supports the admin user management overview feature.

Tests:
- UserRepositoryTest: verify method exists and returns List<User>
2026-07-23 13:54:51 +02:00
a426a91cfa feat(community): add getAllMemberships() to MembershipService
Add @Transactional(readOnly = true) method that uses findAllWithDetails()
and batch-fetches users with the same lookup pattern as getPendingMemberships().
Returns List<PendingMembershipResponse> with all memberships (pending, active,
inactive) for the admin overview tab.

Tests: 3 new tests covering normal case, empty list, and missing user.
2026-07-23 13:53:04 +02:00
f7375dd9aa test(iam): verify createdAt is set during registration 2026-07-23 13:52:08 +02:00
72c29cfcc1 Merge branch 'mimocode/stellar-lagoon' into master 2026-07-23 13:47:19 +02:00
93c0151113 Merge branch 'mimocode/jolly-planet' into master 2026-07-23 13:47:06 +02:00
0dec90db47 Merge branch 'mimocode/nimble-circuit' into master 2026-07-23 13:46:56 +02:00
3f55d44fab feat(iam): add createdAt field to User entity
- Add createdAt LocalDateTime field with @Column(updatable = false)
- No @GeneratedValue - set manually during user creation
- Set createdAt in AuthService.register() and AdminDataInitializer
- Ignore createdAt in UserMapper (mapped manually, not from DTO)
- Add UserTest with 3 tests verifying field, annotation, and default
2026-07-23 13:45:55 +02:00
a96575d499 feat(community): extend PendingMembershipResponse with validFrom/validTo fields 2026-07-23 13:42:54 +02:00
c5ae6032c9 feat(community): add findAllWithDetails query to MembershipRepository
Add @Query with JOIN FETCH on meteringPoint and energyCommunity, no WHERE clause
to return all memberships regardless of status. Includes reflection-based unit test
verifying method existence and annotation correctness.
2026-07-23 13:41:43 +02:00
a651ec946c feat(community): add metering data upload UI with preview and validation
- Add frontend upload page with file selection, drag-and-drop, and preview
- Add preview endpoint (POST /api/community/metering-data/preview/xlsx)
- Validate FEED_IN only for PRODUCER, CONSUMPTION only for CONSUMER metering points
- Optimize deduplication with bulk query (fix N+1 problem)
- Eliminate duplicate DB query in validateRecords
- Add 4 new tests for data type validation
- Add navigation entry for admin users
2026-07-23 07:07:52 +02:00
4b7b26231f feat(community): add member consumption dashboard with coverage preview
Backend:
- ConsumptionDashboardService: aggregates consumption and community
  feed-in data with daily/hourly granularity based on date range
- Coverage calculation: min(consumption, communityFeedIn) per interval
- Ownership check on dashboard endpoint
- 6 new aggregate queries in MeteringDataRepository
- findActiveMeteringPointIdsByCommunityId in MembershipRepository
- 6 unit tests for ConsumptionDashboardService

Frontend:
- Apache ECharts via ngx-echarts for chart visualization
- ConsumptionDashboardComponent with metering point selector,
  date range picker, quick-range buttons (7/30/90 days)
- Chart: blue bars (consumption), green bars (covered), orange
  line (community feed-in), tooltip with coverage percentage
- Summary cards: total consumption, coverage %, feed-in, covered kWh
- Warning when user has no community membership
- Route /dashboard/consumption (MEMBER only)

Tests: 143/143 passing
2026-07-22 13:23:58 +02:00
975f76dbd3 feat(community): add metering data upload and query with XLSX support
Implement complete metering data management for energy communities:

- MeteringData entity with unique constraint (metering_point_id, interval_start, data_type)
- Bulk upload via JSON or XLSX (multipart) with validation
- XLSX parser using Apache POI with comma-decimal support
- Ownership check on GET endpoints (userId must match metering point owner)
- Deduplication: existing records overwritten on re-upload
- DataSource tracking (EMAIL_XLSX, API, MANUAL)
- Query endpoints: by metering point, by type, by upload batch

Additional fixes:
- MapStruct annotation processor: add to execution-level annotationProcessorPaths
  (Spring Boot parent POM was overriding plugin-level config)
- EnergyCommunityMapper + MeteringDataMapper: componentModel=spring
- UserMapper: ignore passwordResetToken/Expiry (unmapped target policy ERROR)
- TariffService: add TariffInviteRepository dependency + invitation check
- TariffServiceTest: add missing @Mock for TariffInviteRepository
- SecurityConfig: permit /actuator/health and /actuator/info
- pom.xml: add poi-ooxml, postgresql, spring-boot-starter-actuator
- .gitignore: add *.log, survey/, backend.log

Tests: 137/137 passing
2026-07-22 12:42:27 +02:00
949e1e6c34 feat(dashboard): add pending memberships card to admin overview
- Add pendingMemberships field to AdminStats DTO
- Add 4th card 'Offene Mitgliedsanträge' to admin dashboard
- Rename 'Offene Freigaben' to 'Ausstehende Freischaltungen'
- Update DashboardService to count pending memberships
- Update tests to match new AdminStats structure
2026-07-22 10:59:01 +02:00
5949359216 fix(tariff): fix critical security and correctness issues from code review
- Fix UserTariffController: use @CurrentUserId instead of broken extractUserId()
- Fix UserTariffController: use @PathVariable instead of @RequestParam for userId in delete
- Add @PreAuthorize annotations to all tariff endpoints (ADMIN for community, MEMBER for user)
- Add duplicate tariff prevention for (source, target) pairs
- Optimize membership check: replace N+1 query with efficient isActiveMemberOfCommunity()
- Update tests to match new membership check API
2026-07-22 10:11:12 +02:00
0dfaa2d507 feat(tariff): implement complete tariff module with admin and user tariffs
Backend:
- Add CommunityTariff entity (admin-managed max price + surcharge per community)
- Add UserTariff entity (user-agreed tariffs between metering points)
- Add TariffController (admin endpoints) and UserTariffController (user endpoints)
- Add TariffService with full validation (price <= max, ACTIVE state, membership)
- Add CommunityTariffChangedEvent and UserTariffChangedEvent
- Update NotificationListener to notify members on tariff changes
- Add 27 comprehensive tests for TariffService

Frontend:
- Add AdminTariffComponent (/dashboard/tariffs) for managing community tariffs
- Add UserTariffComponent (/dashboard/my-tariffs) for managing user tariffs
- Add routing and navigation entries
- Regenerate OpenAPI spec and frontend API client

Note: Old Tariff.java entity replaced by CommunityTariff + UserTariff
2026-07-22 09:52:22 +02:00
a90b7ecc7e fix(frontend): replace alert() with ToastService, remove console.*, fix UI bugs
- Replace alert() with ToastService in admin-user-approval and admin-energy-community
- Remove all console.error/console.warn statements from components and guards
- Fix admin-energy-community modal title (now shows 'Bearbeiten' in edit mode)
- Fix admin-user-approval table header ('Zählpunkt' -> 'Status')
- Remove broken header nav links (#so-gehts, #faq) that pointed to non-existent sections
2026-07-22 09:25:50 +02:00
fea8332976 refactor(mako,common): configurable topology delay, ThreadPool executor, event listener tests
- SimulatedEdaTopologyService: topology delay configurable via eda.simulation.topology-delay-ms
- Add AsyncConfig with ThreadPoolTaskExecutor (4 core, 8 max threads)
- Remove @EnableAsync from EegPortalApplication (now in AsyncConfig)
- Add topology-delay-ms and consent-delay-ms to application-dev.yml
- Add MakoConsentListenerTest (4 tests)
- Add MeteringPointEventListenerTest (5 tests)
- Add NotificationListenerTest (8 tests)
2026-07-22 09:21:25 +02:00
7baa1c72af refactor(common,community,mako): fix typos and remove dead code
- Rename MakoConsens* -> MakoConsent* (3 event classes + listener)
- Rename EdaCommuncationEventListener -> EdaCommunicationEventListener
- Rename PointType.PROSUME -> PROSUMER
- Remove dead SecurityConfig admin path matchers (actual security via @PreAuthorize)
- Regenerate OpenAPI spec and frontend API client
2026-07-22 09:15:27 +02:00
6770be9bef fix(security): externalize CORS origins, secure JWT secret default, fix RouterLink import
- Externalize CORS origins via app.cors-origins property (configurable per environment)
- Remove hardcoded JWT secret fallback; use env-var-only with safe test default
- Disable show-sql by default (enable only in dev profile)
- Create application-dev.yml with safe development defaults
- Add missing RouterLink import in MyMembershipsComponent (fixes runtime error)
2026-07-22 09:09:36 +02:00
0bfa0d98d5 test(dashboard,frontend): add DashboardControllerTest, fix broken spec files and add login tests
- Add DashboardControllerTest with 4 tests for admin and user dashboard endpoints
- Fix incorrect class name imports in header, admin-user-approval, metering-points, verify-email specs
- Add missing ActivatedRoute/Router/AuthService providers in all spec files
- Replace stub login spec with 10 comprehensive tests (form validation, role redirect, error handling)
- Remove stale 'should render title' test from app.spec.ts
2026-07-22 08:39:58 +02:00
c180d6fd32 fix(frontend): replace HttpClient with generated AuthenticationService in verify-email 2026-07-22 08:39:37 +02:00
ef4eefa4cd fix(dashboard): fix NullPointerException in getUserDashboard
- @CurrentUserId resolves to String (JWT userId claim), not User entity
- Change parameter type from User to String, parse to UUID
2026-07-22 08:06:45 +02:00
56f8636f90 docs(common): add conventional commits guideline and environment config to AGENTS.md
- Add dedicated Conventional Commits section with types and examples
- Document environment.ts as API URL configuration source
- Add to important files table
2026-07-22 07:56:52 +02:00
d87f6fe95b fix(frontend): activate landing page buttons and add forgot-password link
- Landing page: 'Jetzt Ersparnis berechnen' links to /register
- Landing page: 'Mehr erfahren' links to /dashboard
- Landing page: remove empty li element
- Login page: add 'Passwort vergessen?' link to /forgot-password
2026-07-22 07:50:49 +02:00
20787395ab refactor(frontend): replace hardcoded localhost URLs with environment config
- Create environment.ts with apiUrl constant
- Update all 6 services to use environment.apiUrl
- Update forgot-password and reset-password pages
- Update app.config.ts BASE_PATH provider
2026-07-22 07:50:38 +02:00
93aa9fdff3 fix(security): externalize JWT secret via environment variable
- jwt.secret now reads from JWT_SECRET env var
- Falls back to dev default if not set
2026-07-22 07:50:27 +02:00
9c147adadd docs: update AGENTS.md with testing, API generation, and architecture details
- Add test commands and patterns (JUnit 5, Mockito, Vitest)
- Document OpenAPI generation workflow (OpenApiGeneratorTest)
- Add EDA simulation details (magic values, @Profile behavior)
- Correct admin endpoint paths
- Add important files table including OpenApiGeneratorTest
2026-07-22 07:42:56 +02:00
8546dcc508 test(iam,community): add unit tests for AuthService, AdminIamService, EnergyCommunityService
- AuthServiceTest: register, login, verifyEmail (7 tests)
- AdminIamServiceTest: approve, reject, getPendingUsers (7 tests)
- EnergyCommunityServiceTest: CRUD, member counts, delete guards (9 tests)
2026-07-22 07:42:47 +02:00