Skip to content

Feature Inventory

Status legend: ✅ fully wired · ⚠️ partially wired · ❌ not wired

Source of truth: backend controllers in apps/backend/src/, mobile screens in apps/mobile/src/screens/, admin pages in apps/admin/src/pages/. Endpoints below are relative to /api/v1.

Auth

FeatureEndpoint(s)ClientStatus
Register (email + password + name)POST /auth/registerauthApi.register (mobile) → RegisterScreen
LoginPOST /auth/loginauthApi.login (mobile) → LoginScreen; POST /admin/auth/login (admin) → LoginPage
Refresh tokenPOST /auth/refresh, POST /admin/auth/refreshauthApi.refresh (mobile), admin api.ts interceptor
LogoutPOST /auth/logoutauthApi.logout (mobile, via AuthContext)
Fetch current userGET /auth/meauthApi.getMe (mobile, via AuthContext)
Verify email (token from email)POST /auth/verify-emailauthApi.verifyEmail — no dedicated screen yet⚠️ (client wrapped, no UI)
Resend verification emailPOST /auth/resend-verificationauthApi.resendVerification — no dedicated UI⚠️
Forgot passwordPOST /auth/forgot-passwordauthApi.forgotPassword — no dedicated screen yet⚠️
Reset password (token from email)POST /auth/reset-passwordauthApi.resetPassword — no dedicated screen yet⚠️

Tasks

FeatureEndpoint(s)ClientStatus
Create taskPOST /taskstasksApi.createCreateTaskScreen
Browse tasks nearby (geo filter)GET /tasks?longitude&latitude&radiusKmtasksApi.listMapScreen
View task detailGET /tasks/:idtasksApi.getById — used by inbox/chat flows⚠️ (no standalone detail screen)
Edit taskPUT /tasks/:idtasksApi.update — no UI screen yet⚠️
Delete taskDELETE /tasks/:idtasksApi.remove — no UI action yet⚠️
Accept task (helper applies)POST /tasks/:id/accepttasksApi.accept — used by interaction flow⚠️
Mark task complete (helper)POST /tasks/:id/completetasksApi.complete — no dedicated UI trigger⚠️
Confirm completion (creator)PUT /tasks/:id/confirmtasksApi.confirm — no dedicated UI trigger⚠️
List my posted tasksGET /users/me/tasksusersApi.getMyTasksProfileScreen
List tasks I helped withGET /users/me/helpedusersApi.getMyHelpedProfileScreen

Interactions (messaging + time proposals)

Every task with an accepted helper opens a TaskInteraction container that owns messages and time-proposal negotiation.

FeatureEndpoint(s)ClientStatus
Inbox (all my interactions)GET /users/:userId/interactionsinteractionsApi.listUserInteractionsInteractionsInboxScreen
Task interaction threadGET /tasks/:taskId/interactionsinteractionsApi.listTaskInteractionsChatScreen
Send messagePOST /tasks/:taskId/messagesinteractionsApi.createMessageChatScreen
List messages (paginated)GET /tasks/:taskId/messagesinteractionsApi.listMessagesChatScreen
Mark message as readPATCH /tasks/:taskId/messages/:messageId/readinteractionsApi.markMessageAsReadChatScreen
Create time proposalPOST /tasks/:taskId/time-proposalsinteractionsApi.createTimeProposalTimeProposalScreen
List time proposalsGET /tasks/:taskId/time-proposalsinteractionsApi.listTimeProposalsTimeProposalScreen
Accept proposalPOST /tasks/:taskId/time-proposals/:proposalId/acceptinteractionsApi.acceptTimeProposalTimeProposalScreen
Reject proposalPOST /tasks/:taskId/time-proposals/:proposalId/rejectinteractionsApi.rejectTimeProposalTimeProposalScreen
Counter proposalPOST /tasks/:taskId/time-proposals/:proposalId/counterinteractionsApi.counterTimeProposalTimeProposalScreen

Points

FeatureEndpoint(s)ClientStatus
Get balanceGET /users/:userId/pointspointsApi.getBalanceProfileScreen, RewardsScreen
Transaction historyGET /users/:userId/points/historypointsApi.getHistory — no dedicated screen yet⚠️ (client wrapped, no UI)
Earn on task completion(server-side, no direct endpoint)Emitted by TasksService.confirm

Partners & Rewards

FeatureEndpoint(s)ClientStatus
Browse partners + offersGET /partners, GET /partners/:idpartnersApi.list, partnersApi.getByIdRewardsScreen
Redeem offer with pointsPOST /partners/:id/redeempartnersApi.redeemRewardsScreen
List my redemptionsnot implemented❌ (deferred)

Profiles

FeatureEndpoint(s)ClientStatus
View own profileGET /auth/meauthApi.getMeProfileScreen
View public profileGET /users/:idusersApi.getByIdPublicProfileScreen
Edit profile (name, bio, avatar)PUT /users/meusersApi.updateMeEditProfileScreen
Predefined avatar pickerGET /users/avatarsusersApi.getAvatarsEditProfileScreen

Admin panel (apps/admin)

FeatureEndpoint(s)ClientStatus
Admin login / refreshPOST /admin/auth/login, POST /admin/auth/refreshadmin api.loginLoginPage
Dashboard statsGET /admin/statsapi.getStatsDashboard
List users (search / filter)GET /admin/usersapi.getUsersUsersPage
Verify user (approve/reject inline)PATCH /admin/users/:id/verifyapi — used by admin flow
Suspend / unsuspend userPATCH /admin/users/:id/suspend (body { suspended, reason })api.suspendUser, api.unsuspendUserUsersPage (see Spec 003)
User activities logGET /admin/users/:id/activitiesapi — used in user detail
Verification queueGET /admin/verifications, POST /admin/verifications/:id/approve, POST /admin/verifications/:id/rejectapi.getVerificationRequests, api.approveVerification, api.rejectVerificationVerificationsPage
Points adjustmentPOST /admin/points/adjustapi.adjustPointsPointsPage
Points transactions listGET /admin/points/transactionsapi.getPointsTransactionsPointsPage
Audit logsGET /admin/audit-logsapi.getAuditLogsAuditLogsPage
Partner CRUDGET/POST/PUT/DELETE /admin/partners, POST/PUT /admin/partners/:id/offersadmin api — CRUD helpers⚠️ (backend ready, admin page pending)

Static / drawer screens (no backend calls)

AboutScreen, FaqScreen, ContactScreen, FeedbackScreen — informational drawer entries. Contact/Feedback have no submission endpoint yet.

Gaps traced to Specs 001–003

Specs 001, 002, and 003 identified the mobile/admin wiring gaps below. All three specs shipped and are marked COMPLETE, so the gaps listed here are closed. They remain in this doc as a reference for anyone auditing older PRs.

SpecOriginal gapResolution
001Only a handful of the 30+ backend endpoints had a mobile client wrapperapps/mobile/src/services/api.ts now exposes authApi, tasksApi, usersApi, pointsApi, partnersApi, interactionsApi — every endpoint listed above has a typed method
002MapScreen, ProfileScreen, RewardsScreen, EditProfileScreen made no API callsAll four now fetch/mutate through the client with loading + error states
003Admin called POST /admin/users/:id/unsuspend, which never existedBoth suspend and unsuspend now PATCH /admin/users/:id/suspend with { suspended, reason }

Remaining ⚠️ entries above are UI-side follow-ups (screens not yet built) — not API gaps.

Good Deeds - Nachbarschaftshilfe-App