nxtgauge-backend-rust/wir.md
Ashwin Kumar 3716f60806 docs: add work implementation roadmap (wir.md)
Full plan for completing all pending features across backend, frontend,
and admin. Includes Beeceptor mock payment endpoints, Wave 1-5 breakdown,
file-level implementation details, and parallelization strategy.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-04-06 22:26:45 +02:00

265 lines
10 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# Nxtgauge — Work Implementation Roadmap (wir.md)
## Beeceptor Mock Payment Gateway
- **Base URL:** `https://nxtgauge.free.beeceptor.com`
- `POST /payments/create-order` → 200
- `POST /payments/verify` → 200
- `GET /payments/:id/status` → 200
---
## Wave 1 — Foundation Fixes (Must do first)
### W1-A: Fix AppState type alias in all profession services
Every `admin.rs` uses `crate::AppState` but `main.rs` never defines it. Add after `use contracts::ProfessionState;`:
```rust
type AppState = ProfessionState;
```
Files to modify:
- `apps/photographers/src/main.rs`
- `apps/makeup_artists/src/main.rs`
- `apps/tutors/src/main.rs`
- `apps/developers/src/main.rs`
- `apps/video_editors/src/main.rs`
- `apps/graphic_designers/src/main.rs`
- `apps/social_media_managers/src/main.rs`
- `apps/fitness_trainers/src/main.rs`
- `apps/catering_services/src/main.rs`
### W1-B: Fix employee create endpoint mismatch
Admin UI POSTs to `/api/admin/employees/provision` but backend registers `POST /`.
- File: `apps/employees/src/handlers/employees.rs`
- Add: `.route("/provision", post(create_employee))` alias
### W1-C: Gateway routing for missing admin namespaces
File: `apps/gateway/src/main.rs` — add to `resolve_upstream`:
1. Add `|| path.starts_with("/api/admin/ugc-content-creators")` to UGC branch
2. Route `admin/tax`, `admin/ledger`, `admin/orders` → payments service
---
## Wave 2 — Backend Features (parallel after Wave 1)
### W2-A: Suspend/activate for all 9 professions + UGC
Add `PATCH /{id}/status` to each profession `admin.rs`:
```rust
.route("/{id}/status", patch(set_status))
async fn set_status(
State(state): State<AppState>,
Path(id): Path<Uuid>,
Json(body): Json<StatusPayload>,
) -> impl IntoResponse {
// 1. Query user_id from profession table WHERE id = $1
// 2. UPDATE users SET status = $1 WHERE id = $2
// 3. Return 200 or error
}
#[derive(Deserialize)]
struct StatusPayload { status: String } // "ACTIVE" | "INACTIVE" | "SUSPENDED"
```
Uses existing `UserRepository::update_status`.
### W2-B: UGC full admin module (currently zero admin routes)
- Create: `apps/ugc_content_creators/src/admin.rs` (copy photographers pattern, adapt table name)
- Modify: `apps/ugc_content_creators/src/main.rs` — add `mod admin;` and `.nest("/api/admin/ugc-content-creators", admin::router())`
- Use `Router<ProfessionState>` directly (no `crate::AppState` alias needed)
### W2-C: Backend endpoints for tax, ledger, orders
Add to `apps/payments/src/main.rs` (or new `apps/payments/src/admin.rs`):
- `GET /api/admin/tax`, `POST /api/admin/tax`, `DELETE /api/admin/tax/{id}` — CRUD against `taxes` table
- `GET /api/admin/ledger` — query `tracecoin_ledger` JOIN users, paginated
- `GET /api/admin/orders` — query payments/orders table
Also add `GET /api/admin/credits/reconcile-report` and `POST /api/admin/credits/reconcile/{order_id}` for W4-F.
---
## Wave 3 — Frontend Dashboard Pages (parallel after Wave 1, biggest work)
### Architecture
- Add all new page names to `REAL_PAGES` in `dashboard.tsx`
- Add `<Match>` cases in the `<Switch>` block
- Pass `rolePrefix` from `ROLE_PREFIXES[role()]`
- Add `'Accepted Leads'` and `'Services'` to `ROLE_BASED_SIDEBAR` for all 10 professional roles
- Update `ICON_MAP` in `DashboardShell.tsx`
### W3-A: Professional pages (shared by all 10 professions via `rolePrefix` prop)
**File:** `src/components/dashboard/LeadsMarketplacePage.tsx`
- `GET /api/{rolePrefix}/marketplace?page=N&limit=20`
- Paginated requirement cards: title, budget, location, deadline, profession category
- "Send Request" → `POST /api/{rolePrefix}/leads/request` with `{ requirement_id }`
**File:** `src/components/dashboard/MyRequestsPage.tsx`
- `GET /api/{rolePrefix}/leads/requests/me`
- Status badges: PENDING, ACCEPTED, REJECTED, CANCELLED
- 24h countdown from `created_at` for PENDING requests
- Cancel → `DELETE /api/{rolePrefix}/leads/requests/{id}`
**File:** `src/components/dashboard/AcceptedLeadsPage.tsx`
- `GET /api/{rolePrefix}/leads/accepted/me`
- Customer contact info revealed (phone, email)
- Detail → `GET /api/{rolePrefix}/leads/accepted/{id}`
**File:** `src/components/dashboard/CreditsWalletPage.tsx`
- `GET /api/{rolePrefix}/wallet/me` → balance summary (total, reserved, available)
- `GET /api/{rolePrefix}/wallet/me/ledger?page=1&limit=20` → transaction history
- Buy TraceCoins flow (Beeceptor):
1. Show package selection
2. `POST https://nxtgauge.free.beeceptor.com/payments/create-order`
3. `POST https://nxtgauge.free.beeceptor.com/payments/verify`
4. Refresh wallet balance on success
**File:** `src/components/dashboard/ServicesPage.tsx`
- `GET /api/{rolePrefix}/services/me` — list services
- Add: `POST /api/{rolePrefix}/services/me`
- Edit: `PATCH /api/{rolePrefix}/services/me/{id}` (add to `api.ts`)
- Delete: `DELETE /api/{rolePrefix}/services/me/{id}`
**Shared:** `src/components/dashboard/BuyTracecoinsModal.tsx`
- Reusable modal used by CreditsWalletPage and CustomerRequirementsPage
- Calls Beeceptor: create-order → verify
- Props: `{ rolePrefix: string; onSuccess: () => void; onClose: () => void }`
### W3-B: Company pages
**File:** `src/components/dashboard/CompanyJobsPage.tsx`
- `GET /api/companies/jobs` — list with status badges (DRAFT, PENDING, APPROVED, CLOSED)
- Create form → `POST /api/companies/jobs`
- Submit for approval → `POST /api/companies/jobs/{id}/submit`
**File:** `src/components/dashboard/CompanyApplicationsPage.tsx`
- Job selector dropdown
- `GET /api/companies/jobs/{id}/applications`
- Status update → `PATCH /api/companies/applications/{id}/status`
### W3-C: Job Seeker pages
**File:** `src/components/dashboard/JobSeekerJobsPage.tsx`
- `GET /api/jobseeker/jobs?page=N&limit=20` with filters
- Apply modal → `POST /api/jobseeker/jobs/{id}/apply`
**File:** `src/components/dashboard/JobSeekerApplicationsPage.tsx`
- `GET /api/jobseeker/applications`
- Status badges, withdraw → `DELETE /api/jobseeker/applications/{id}/withdraw` (add to `api.ts`)
### W3-D: Customer pages
**File:** `src/components/dashboard/CustomerRequirementsPage.tsx`
- `GET /api/customers/requirements` — list with expiry countdown
- Create form → `POST /api/customers/requirements`
- Submit → `POST /api/customers/requirements/{id}/submit`
**File:** `src/components/dashboard/ReceivedResponsesPage.tsx`
- Requirement selector at top
- `GET /api/customers/requirements/{id}/requests`
- Accept → `POST /api/customers/requirements/{id}/requests/{lead_id}/approve`
- Reject → `POST /api/customers/requirements/{id}/requests/{lead_id}/reject`
### W3-E: Explore Nxtgauge + Switch Services
**File:** `src/components/dashboard/ExploreNxtgaugePage.tsx`
- Extract from DashboardDesignPreview (lines ~59205990)
- Props: `{ roleKey: string; rolePrefix: string; exploreRoles: Array<{key: string; name: string}> }`
- Switch Services → same component or redirect to Explore Nxtgauge
---
## Wave 4 — Admin Completions (parallel with Wave 3)
### W4-A: Verification action wiring
File: `src/routes/admin/verification.tsx`
Wire existing stub handlers:
- Approve: `POST /api/gateway/api/admin/verifications/{id}/approve`
- Reject: `POST /api/gateway/api/admin/verifications/{id}/reject` + `{ reason: string }`
- Request Docs: `POST /api/gateway/api/admin/verifications/{id}/request-documents` + `{ message, documents[] }`
- Refresh list after each action
### W4-B: Employee create — resolve by email
File: `src/routes/admin/employees/create.tsx`
Two-step flow:
1. Email lookup → `GET /api/admin/users?email={email}`
2. If found: pre-fill name, show confirmation
3. If not: allow new user creation
4. Submit with `user_id` from resolved user (or use `POST /api/admin/employees/provision`)
### W4-C: Admin Ledger
File: `src/routes/admin/ledger.tsx`
- Needs W2-C backend first
- Add: user filter, date range filter, entry type filter, pagination
### W4-D: Tax management
File: `src/routes/admin/tax.tsx` — UI already complete
- Just needs W1-C (gateway routing) + W2-C (backend endpoint)
### W4-E: Order management
File: `src/routes/admin/order.tsx` — UI already complete
- Just needs W1-C + W2-C
### W4-F: Credit reconciliation
File: `src/routes/admin/financial/reconcile.tsx` — currently a redirect stub
- Needs W2-C backend endpoint
- Build reconciliation view: orders vs. coins credited discrepancies
- "Reconcile" action → `POST /api/admin/credits/reconcile/{order_id}`
---
## Wave 5 — Token Security (independent, any time)
### W5-A: Move access token to in-memory
File: `src/lib/auth.tsx`
```typescript
let _token: string | null = null;
export const setToken = (t: string | null) => { _token = t; };
export const getToken = (): string | null =>
_token || sessionStorage.getItem('nxtgauge_access_token') || localStorage.getItem('nxtgauge_access_token') || null;
```
File: `src/lib/api.ts`
- Update `getAuthHeaders()` to use `getToken()` from auth.tsx
---
## New Files to Create
### Backend
- `apps/ugc_content_creators/src/admin.rs`
### Frontend
- `src/components/dashboard/LeadsMarketplacePage.tsx`
- `src/components/dashboard/MyRequestsPage.tsx`
- `src/components/dashboard/AcceptedLeadsPage.tsx`
- `src/components/dashboard/CreditsWalletPage.tsx`
- `src/components/dashboard/ServicesPage.tsx`
- `src/components/dashboard/BuyTracecoinsModal.tsx`
- `src/components/dashboard/CompanyJobsPage.tsx`
- `src/components/dashboard/CompanyApplicationsPage.tsx`
- `src/components/dashboard/JobSeekerJobsPage.tsx`
- `src/components/dashboard/JobSeekerApplicationsPage.tsx`
- `src/components/dashboard/CustomerRequirementsPage.tsx`
- `src/components/dashboard/ReceivedResponsesPage.tsx`
- `src/components/dashboard/ExploreNxtgaugePage.tsx`
---
## Files to Modify
### Backend
- `apps/gateway/src/main.rs` — W1-C
- `apps/employees/src/handlers/employees.rs` — W1-B
- `apps/photographers/src/main.rs` + all 8 other profession main.rs — W1-A
- `apps/ugc_content_creators/src/main.rs` — W2-B
- All 9 profession `admin.rs` files — W2-A
- `apps/payments/src/main.rs` (or new `payments/src/admin.rs`) — W2-C
### Frontend
- `src/routes/dashboard.tsx` — expand REAL_PAGES + add Match cases + update ROLE_BASED_SIDEBAR
- `src/components/DashboardShell.tsx` — update ICON_MAP
- `src/lib/auth.tsx` — W5-A
- `src/lib/api.ts` — add updateService, withdrawApplication helpers + W5-A
### Admin
- `src/routes/admin/verification.tsx` — W4-A
- `src/routes/admin/employees/create.tsx` — W4-B
- `src/routes/admin/ledger.tsx` — W4-C
- `src/routes/admin/financial/reconcile.tsx` — W4-F