nxtgauge-backend-rust/wir.md

266 lines
10 KiB
Markdown
Raw Normal View History

# 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