docs(api): consolidate v2 frontend backend guides
This commit is contained in:
@@ -1,5 +1,9 @@
|
||||
# KROW Workforce API Contracts
|
||||
|
||||
Legacy note:
|
||||
Use `/Users/wiel/Development/krow-workforce/docs/BACKEND/API_GUIDES/V2/README.md` for the current v2 frontend/backend integration surface.
|
||||
This document reflects the earlier Data Connect-oriented contract mapping and should not be the source of truth for new v2 client work.
|
||||
|
||||
This document captures all API contracts used by the Staff and Client mobile applications. The application backend is powered by **Firebase Data Connect (GraphQL)**, so traditional REST endpoints do not exist natively. For clarity and ease of reading for all engineering team members, the tables below formulate these GraphQL Data Connect queries and mutations into their **Conceptual REST Endpoints** alongside the actual **Data Connect Operation Name**.
|
||||
|
||||
---
|
||||
|
||||
14
docs/BACKEND/API_GUIDES/README.md
Normal file
14
docs/BACKEND/API_GUIDES/README.md
Normal file
@@ -0,0 +1,14 @@
|
||||
# Backend API Guides
|
||||
|
||||
## Use this for current frontend work
|
||||
|
||||
- [V2 Backend API Guide](./V2/README.md)
|
||||
- [V2 Core API](./V2/core-api.md)
|
||||
- [V2 Command API](./V2/command-api.md)
|
||||
- [V2 Query API](./V2/query-api.md)
|
||||
|
||||
## Legacy reference
|
||||
|
||||
- [Initial API contracts](./00-initial-api-contracts.md)
|
||||
|
||||
The legacy contract doc reflects the older Data Connect-oriented application shape. Do not use it as the source of truth for new v2 frontend work.
|
||||
120
docs/BACKEND/API_GUIDES/V2/README.md
Normal file
120
docs/BACKEND/API_GUIDES/V2/README.md
Normal file
@@ -0,0 +1,120 @@
|
||||
# V2 Backend API Guide
|
||||
|
||||
This is the frontend-facing source of truth for the v2 backend.
|
||||
|
||||
If you are building against the new backend, start here.
|
||||
|
||||
## 1) Which service to use
|
||||
|
||||
| Use case | Service |
|
||||
| --- | --- |
|
||||
| File upload, signed URLs, model calls, rapid order helpers, verification flows | `core-api-v2` |
|
||||
| Business writes and workflow actions | `command-api-v2` |
|
||||
| Screen reads for the implemented v2 views | `query-api-v2` |
|
||||
|
||||
## 2) Live dev base URLs
|
||||
|
||||
- Core API: `https://krow-core-api-v2-e3g6witsvq-uc.a.run.app`
|
||||
- Command API: `https://krow-command-api-v2-e3g6witsvq-uc.a.run.app`
|
||||
- Query API: `https://krow-query-api-v2-e3g6witsvq-uc.a.run.app`
|
||||
|
||||
## 3) Auth and headers
|
||||
|
||||
All protected routes require:
|
||||
|
||||
```http
|
||||
Authorization: Bearer <firebase-id-token>
|
||||
```
|
||||
|
||||
All command routes also require:
|
||||
|
||||
```http
|
||||
Idempotency-Key: <unique-per-user-action>
|
||||
```
|
||||
|
||||
All services return the same error envelope:
|
||||
|
||||
```json
|
||||
{
|
||||
"code": "STRING_CODE",
|
||||
"message": "Human readable message",
|
||||
"details": {},
|
||||
"requestId": "uuid"
|
||||
}
|
||||
```
|
||||
|
||||
## 4) What frontend can use now
|
||||
|
||||
### Ready now
|
||||
|
||||
- `core-api-v2`
|
||||
- upload file
|
||||
- create signed URL
|
||||
- invoke model
|
||||
- rapid order transcribe
|
||||
- rapid order parse
|
||||
- create verification
|
||||
- get verification
|
||||
- review verification
|
||||
- retry verification
|
||||
- `command-api-v2`
|
||||
- create order
|
||||
- update order
|
||||
- cancel order
|
||||
- assign staff to shift
|
||||
- accept shift
|
||||
- change shift status
|
||||
- clock in
|
||||
- clock out
|
||||
- favorite and unfavorite staff
|
||||
- create staff review
|
||||
- `query-api-v2`
|
||||
- order list
|
||||
- order detail
|
||||
- favorite staff list
|
||||
- staff review summary
|
||||
- assignment attendance detail
|
||||
|
||||
### Do not move yet
|
||||
|
||||
- reports
|
||||
- payments and finance screens
|
||||
- undocumented dashboard reads
|
||||
- undocumented scheduling reads and writes
|
||||
- any flow that assumes verification history is durable in SQL
|
||||
|
||||
## 5) Important caveat
|
||||
|
||||
`core-api-v2` is usable now, but verification job state is not yet persisted to `krow-sql-v2`.
|
||||
|
||||
What is durable today:
|
||||
- uploaded files in Google Cloud Storage
|
||||
- generated signed URLs
|
||||
- model invocation itself
|
||||
|
||||
What is not yet durable:
|
||||
- verification job history
|
||||
- verification review history
|
||||
- verification event history
|
||||
|
||||
That means frontend can integrate with verification routes now, but should not treat them as mission-critical durable state yet.
|
||||
|
||||
## 6) Recommended frontend environment variables
|
||||
|
||||
```env
|
||||
CORE_API_V2_BASE_URL=https://krow-core-api-v2-e3g6witsvq-uc.a.run.app
|
||||
COMMAND_API_V2_BASE_URL=https://krow-command-api-v2-e3g6witsvq-uc.a.run.app
|
||||
QUERY_API_V2_BASE_URL=https://krow-query-api-v2-e3g6witsvq-uc.a.run.app
|
||||
```
|
||||
|
||||
## 7) Service docs
|
||||
|
||||
- [Core API](./core-api.md)
|
||||
- [Command API](./command-api.md)
|
||||
- [Query API](./query-api.md)
|
||||
|
||||
## 8) Frontend integration rule
|
||||
|
||||
Do not point screens directly at database access just because a route does not exist yet.
|
||||
|
||||
If a screen is missing from the docs, the next step is to define the route contract and add it to `query-api-v2` or `command-api-v2`.
|
||||
229
docs/BACKEND/API_GUIDES/V2/command-api.md
Normal file
229
docs/BACKEND/API_GUIDES/V2/command-api.md
Normal file
@@ -0,0 +1,229 @@
|
||||
# V2 Command API
|
||||
|
||||
Use `command-api-v2` for write actions that change business state.
|
||||
|
||||
Base URL:
|
||||
|
||||
```text
|
||||
https://krow-command-api-v2-e3g6witsvq-uc.a.run.app
|
||||
```
|
||||
|
||||
## 1) Required headers
|
||||
|
||||
```http
|
||||
Authorization: Bearer <firebase-id-token>
|
||||
Idempotency-Key: <unique-per-user-action>
|
||||
Content-Type: application/json
|
||||
```
|
||||
|
||||
## 2) Route summary
|
||||
|
||||
| Method | Route | Purpose |
|
||||
| --- | --- | --- |
|
||||
| `POST` | `/commands/orders/create` | Create order with shifts and roles |
|
||||
| `POST` | `/commands/orders/:orderId/update` | Update mutable order fields |
|
||||
| `POST` | `/commands/orders/:orderId/cancel` | Cancel order and related eligible records |
|
||||
| `POST` | `/commands/shifts/:shiftId/assign-staff` | Assign workforce to shift role |
|
||||
| `POST` | `/commands/shifts/:shiftId/accept` | Accept an assigned shift |
|
||||
| `POST` | `/commands/shifts/:shiftId/change-status` | Move shift to a new valid status |
|
||||
| `POST` | `/commands/attendance/clock-in` | Record clock-in event |
|
||||
| `POST` | `/commands/attendance/clock-out` | Record clock-out event |
|
||||
| `POST` | `/commands/businesses/:businessId/favorite-staff` | Add favorite staff |
|
||||
| `DELETE` | `/commands/businesses/:businessId/favorite-staff/:staffId` | Remove favorite staff |
|
||||
| `POST` | `/commands/assignments/:assignmentId/reviews` | Create or update staff review |
|
||||
| `GET` | `/readyz` | Ready check |
|
||||
|
||||
## 3) Order create
|
||||
|
||||
```text
|
||||
POST /commands/orders/create
|
||||
```
|
||||
|
||||
Request body:
|
||||
|
||||
```json
|
||||
{
|
||||
"tenantId": "uuid",
|
||||
"businessId": "uuid",
|
||||
"vendorId": "uuid",
|
||||
"orderNumber": "ORD-1001",
|
||||
"title": "Cafe Event Staffing",
|
||||
"serviceType": "EVENT",
|
||||
"shifts": [
|
||||
{
|
||||
"shiftCode": "SHIFT-1",
|
||||
"title": "Morning Shift",
|
||||
"startsAt": "2026-03-12T08:00:00.000Z",
|
||||
"endsAt": "2026-03-12T16:00:00.000Z",
|
||||
"requiredWorkers": 2,
|
||||
"roles": [
|
||||
{
|
||||
"roleCode": "BARISTA",
|
||||
"roleName": "Barista",
|
||||
"workersNeeded": 2
|
||||
}
|
||||
]
|
||||
}
|
||||
]
|
||||
}
|
||||
```
|
||||
|
||||
## 4) Order update
|
||||
|
||||
```text
|
||||
POST /commands/orders/:orderId/update
|
||||
```
|
||||
|
||||
Required body fields:
|
||||
- `tenantId`
|
||||
- at least one mutable field such as `title`, `description`, `vendorId`, `serviceType`, `startsAt`, `endsAt`, `locationName`, `locationAddress`, `latitude`, `longitude`, `notes`, `metadata`
|
||||
|
||||
You can also send `null` to clear nullable fields.
|
||||
|
||||
## 5) Order cancel
|
||||
|
||||
```text
|
||||
POST /commands/orders/:orderId/cancel
|
||||
```
|
||||
|
||||
Example request:
|
||||
|
||||
```json
|
||||
{
|
||||
"tenantId": "uuid",
|
||||
"reason": "Client cancelled"
|
||||
}
|
||||
```
|
||||
|
||||
## 6) Shift assign staff
|
||||
|
||||
```text
|
||||
POST /commands/shifts/:shiftId/assign-staff
|
||||
```
|
||||
|
||||
Example request:
|
||||
|
||||
```json
|
||||
{
|
||||
"tenantId": "uuid",
|
||||
"shiftRoleId": "uuid",
|
||||
"workforceId": "uuid",
|
||||
"applicationId": "uuid"
|
||||
}
|
||||
```
|
||||
|
||||
## 7) Shift accept
|
||||
|
||||
```text
|
||||
POST /commands/shifts/:shiftId/accept
|
||||
```
|
||||
|
||||
Example request:
|
||||
|
||||
```json
|
||||
{
|
||||
"shiftRoleId": "uuid",
|
||||
"workforceId": "uuid"
|
||||
}
|
||||
```
|
||||
|
||||
## 8) Shift status change
|
||||
|
||||
```text
|
||||
POST /commands/shifts/:shiftId/change-status
|
||||
```
|
||||
|
||||
Example request:
|
||||
|
||||
```json
|
||||
{
|
||||
"tenantId": "uuid",
|
||||
"status": "PENDING_CONFIRMATION",
|
||||
"reason": "Waiting for worker confirmation"
|
||||
}
|
||||
```
|
||||
|
||||
Allowed status values:
|
||||
- `DRAFT`
|
||||
- `OPEN`
|
||||
- `PENDING_CONFIRMATION`
|
||||
- `ASSIGNED`
|
||||
- `ACTIVE`
|
||||
- `COMPLETED`
|
||||
- `CANCELLED`
|
||||
|
||||
## 9) Attendance
|
||||
|
||||
### Clock in
|
||||
|
||||
```text
|
||||
POST /commands/attendance/clock-in
|
||||
```
|
||||
|
||||
### Clock out
|
||||
|
||||
```text
|
||||
POST /commands/attendance/clock-out
|
||||
```
|
||||
|
||||
Example request body for both:
|
||||
|
||||
```json
|
||||
{
|
||||
"assignmentId": "uuid",
|
||||
"sourceType": "NFC",
|
||||
"sourceReference": "iphone-15-pro-max",
|
||||
"nfcTagUid": "NFC-DEMO-ANA-001",
|
||||
"deviceId": "device-123",
|
||||
"latitude": 37.422,
|
||||
"longitude": -122.084,
|
||||
"accuracyMeters": 8,
|
||||
"capturedAt": "2026-03-11T17:15:00.000Z"
|
||||
}
|
||||
```
|
||||
|
||||
## 10) Favorite staff
|
||||
|
||||
### Add favorite
|
||||
|
||||
```text
|
||||
POST /commands/businesses/:businessId/favorite-staff
|
||||
```
|
||||
|
||||
### Remove favorite
|
||||
|
||||
```text
|
||||
DELETE /commands/businesses/:businessId/favorite-staff/:staffId
|
||||
```
|
||||
|
||||
Request body when adding:
|
||||
|
||||
```json
|
||||
{
|
||||
"tenantId": "uuid",
|
||||
"staffId": "uuid"
|
||||
}
|
||||
```
|
||||
|
||||
## 11) Staff review
|
||||
|
||||
```text
|
||||
POST /commands/assignments/:assignmentId/reviews
|
||||
```
|
||||
|
||||
Example request:
|
||||
|
||||
```json
|
||||
{
|
||||
"tenantId": "uuid",
|
||||
"businessId": "uuid",
|
||||
"staffId": "uuid",
|
||||
"rating": 5,
|
||||
"reviewText": "Strong shift performance",
|
||||
"tags": ["punctual", "professional"]
|
||||
}
|
||||
```
|
||||
|
||||
## 12) Live status
|
||||
|
||||
These routes were live-tested on `2026-03-11` against the deployed dev service and `krow-sql-v2`.
|
||||
203
docs/BACKEND/API_GUIDES/V2/core-api.md
Normal file
203
docs/BACKEND/API_GUIDES/V2/core-api.md
Normal file
@@ -0,0 +1,203 @@
|
||||
# V2 Core API
|
||||
|
||||
Use `core-api-v2` for backend capabilities that should not live in the client.
|
||||
|
||||
Base URL:
|
||||
|
||||
```text
|
||||
https://krow-core-api-v2-e3g6witsvq-uc.a.run.app
|
||||
```
|
||||
|
||||
## 1) Route summary
|
||||
|
||||
| Method | Route | Purpose |
|
||||
| --- | --- | --- |
|
||||
| `POST` | `/core/upload-file` | Upload file to Google Cloud Storage |
|
||||
| `POST` | `/core/create-signed-url` | Generate a read URL for an uploaded file |
|
||||
| `POST` | `/core/invoke-llm` | Run a model call |
|
||||
| `POST` | `/core/rapid-orders/transcribe` | Turn uploaded audio into text |
|
||||
| `POST` | `/core/rapid-orders/parse` | Turn order text into structured order data |
|
||||
| `POST` | `/core/verifications` | Create a verification job |
|
||||
| `GET` | `/core/verifications/:verificationId` | Fetch verification status |
|
||||
| `POST` | `/core/verifications/:verificationId/review` | Apply manual review decision |
|
||||
| `POST` | `/core/verifications/:verificationId/retry` | Retry a verification job |
|
||||
| `GET` | `/health` | Health check |
|
||||
|
||||
## 2) Upload file
|
||||
|
||||
Route:
|
||||
|
||||
```text
|
||||
POST /core/upload-file
|
||||
```
|
||||
|
||||
Send multipart form data:
|
||||
- `file`: required
|
||||
- `category`: optional string
|
||||
- `visibility`: `public` or `private`
|
||||
|
||||
Example response:
|
||||
|
||||
```json
|
||||
{
|
||||
"fileUri": "gs://krow-workforce-dev-private/uploads/<uid>/file.pdf",
|
||||
"contentType": "application/pdf",
|
||||
"size": 12345,
|
||||
"bucket": "krow-workforce-dev-private",
|
||||
"path": "uploads/<uid>/file.pdf",
|
||||
"requestId": "uuid"
|
||||
}
|
||||
```
|
||||
|
||||
## 3) Create signed URL
|
||||
|
||||
Route:
|
||||
|
||||
```text
|
||||
POST /core/create-signed-url
|
||||
```
|
||||
|
||||
Example request:
|
||||
|
||||
```json
|
||||
{
|
||||
"fileUri": "gs://krow-workforce-dev-private/uploads/<uid>/file.pdf",
|
||||
"expiresInSeconds": 300
|
||||
}
|
||||
```
|
||||
|
||||
Example response:
|
||||
|
||||
```json
|
||||
{
|
||||
"signedUrl": "https://...",
|
||||
"expiresAt": "2026-03-11T18:30:00.000Z",
|
||||
"requestId": "uuid"
|
||||
}
|
||||
```
|
||||
|
||||
## 4) Invoke model
|
||||
|
||||
Route:
|
||||
|
||||
```text
|
||||
POST /core/invoke-llm
|
||||
```
|
||||
|
||||
Example request:
|
||||
|
||||
```json
|
||||
{
|
||||
"prompt": "Summarize this staffing request",
|
||||
"fileUrls": ["gs://krow-workforce-dev-private/uploads/<uid>/notes.pdf"],
|
||||
"responseJsonSchema": {
|
||||
"type": "object",
|
||||
"properties": {
|
||||
"summary": { "type": "string" }
|
||||
},
|
||||
"required": ["summary"]
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
Example response:
|
||||
|
||||
```json
|
||||
{
|
||||
"result": {
|
||||
"summary": "..."
|
||||
},
|
||||
"model": "vertex model name",
|
||||
"latencyMs": 1200,
|
||||
"requestId": "uuid"
|
||||
}
|
||||
```
|
||||
|
||||
## 5) Rapid order helpers
|
||||
|
||||
### Transcribe
|
||||
|
||||
```text
|
||||
POST /core/rapid-orders/transcribe
|
||||
```
|
||||
|
||||
Example request:
|
||||
|
||||
```json
|
||||
{
|
||||
"audioFileUri": "gs://krow-workforce-dev-private/uploads/<uid>/note.m4a",
|
||||
"locale": "en-US",
|
||||
"promptHints": ["staffing order", "shift details"]
|
||||
}
|
||||
```
|
||||
|
||||
### Parse
|
||||
|
||||
```text
|
||||
POST /core/rapid-orders/parse
|
||||
```
|
||||
|
||||
Example request:
|
||||
|
||||
```json
|
||||
{
|
||||
"text": "Need two baristas tomorrow from 8am to 4pm at Google Mountain View Cafe",
|
||||
"locale": "en-US",
|
||||
"timezone": "America/Los_Angeles"
|
||||
}
|
||||
```
|
||||
|
||||
## 6) Verification routes
|
||||
|
||||
### Create verification
|
||||
|
||||
```text
|
||||
POST /core/verifications
|
||||
```
|
||||
|
||||
Example request:
|
||||
|
||||
```json
|
||||
{
|
||||
"type": "attire",
|
||||
"subjectType": "staff",
|
||||
"subjectId": "staff-uuid",
|
||||
"fileUri": "gs://krow-workforce-dev-private/uploads/<uid>/attire.jpg",
|
||||
"rules": {
|
||||
"label": "black shoes"
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
### Get verification
|
||||
|
||||
```text
|
||||
GET /core/verifications/:verificationId
|
||||
```
|
||||
|
||||
### Manual review
|
||||
|
||||
```text
|
||||
POST /core/verifications/:verificationId/review
|
||||
```
|
||||
|
||||
Example request:
|
||||
|
||||
```json
|
||||
{
|
||||
"decision": "APPROVED",
|
||||
"note": "Manual review passed"
|
||||
}
|
||||
```
|
||||
|
||||
### Retry
|
||||
|
||||
```text
|
||||
POST /core/verifications/:verificationId/retry
|
||||
```
|
||||
|
||||
## 7) Caveat
|
||||
|
||||
Verification state is not yet stored in `krow-sql-v2`.
|
||||
|
||||
Use these routes now for frontend integration, but do not depend on verification history being durable until the persistence work lands.
|
||||
151
docs/BACKEND/API_GUIDES/V2/query-api.md
Normal file
151
docs/BACKEND/API_GUIDES/V2/query-api.md
Normal file
@@ -0,0 +1,151 @@
|
||||
# V2 Query API
|
||||
|
||||
Use `query-api-v2` for implemented read screens in the v2 clients.
|
||||
|
||||
Base URL:
|
||||
|
||||
```text
|
||||
https://krow-query-api-v2-e3g6witsvq-uc.a.run.app
|
||||
```
|
||||
|
||||
## 1) Required header
|
||||
|
||||
```http
|
||||
Authorization: Bearer <firebase-id-token>
|
||||
```
|
||||
|
||||
## 2) Route summary
|
||||
|
||||
| Method | Route | Purpose |
|
||||
| --- | --- | --- |
|
||||
| `GET` | `/query/tenants/:tenantId/orders` | Order list |
|
||||
| `GET` | `/query/tenants/:tenantId/orders/:orderId` | Order detail with shifts and roles |
|
||||
| `GET` | `/query/tenants/:tenantId/businesses/:businessId/favorite-staff` | Favorite staff list |
|
||||
| `GET` | `/query/tenants/:tenantId/staff/:staffId/review-summary` | Staff rating summary and recent reviews |
|
||||
| `GET` | `/query/tenants/:tenantId/assignments/:assignmentId/attendance` | Attendance session and event detail |
|
||||
| `GET` | `/readyz` | Ready check |
|
||||
|
||||
## 3) Order list
|
||||
|
||||
```text
|
||||
GET /query/tenants/:tenantId/orders
|
||||
```
|
||||
|
||||
Optional query params:
|
||||
- `businessId`
|
||||
- `status`
|
||||
- `limit`
|
||||
- `offset`
|
||||
|
||||
Response shape:
|
||||
|
||||
```json
|
||||
{
|
||||
"items": [
|
||||
{
|
||||
"id": "uuid",
|
||||
"orderNumber": "ORD-1001",
|
||||
"title": "Cafe Event Staffing",
|
||||
"status": "OPEN",
|
||||
"serviceType": "EVENT",
|
||||
"startsAt": "2026-03-12T08:00:00.000Z",
|
||||
"endsAt": "2026-03-12T16:00:00.000Z",
|
||||
"businessId": "uuid",
|
||||
"businessName": "Google Mountain View Cafes",
|
||||
"vendorId": "uuid",
|
||||
"vendorName": "Legendary Staffing Pool A",
|
||||
"shiftCount": 1,
|
||||
"requiredWorkers": 2,
|
||||
"assignedWorkers": 1
|
||||
}
|
||||
],
|
||||
"requestId": "uuid"
|
||||
}
|
||||
```
|
||||
|
||||
## 4) Order detail
|
||||
|
||||
```text
|
||||
GET /query/tenants/:tenantId/orders/:orderId
|
||||
```
|
||||
|
||||
Response shape:
|
||||
|
||||
```json
|
||||
{
|
||||
"id": "uuid",
|
||||
"orderNumber": "ORD-1001",
|
||||
"title": "Cafe Event Staffing",
|
||||
"status": "OPEN",
|
||||
"businessId": "uuid",
|
||||
"businessName": "Google Mountain View Cafes",
|
||||
"vendorId": "uuid",
|
||||
"vendorName": "Legendary Staffing Pool A",
|
||||
"shifts": [
|
||||
{
|
||||
"id": "uuid",
|
||||
"shiftCode": "SHIFT-1",
|
||||
"title": "Morning Shift",
|
||||
"status": "OPEN",
|
||||
"startsAt": "2026-03-12T08:00:00.000Z",
|
||||
"endsAt": "2026-03-12T16:00:00.000Z",
|
||||
"requiredWorkers": 2,
|
||||
"assignedWorkers": 1,
|
||||
"roles": [
|
||||
{
|
||||
"id": "uuid",
|
||||
"roleCode": "BARISTA",
|
||||
"roleName": "Barista",
|
||||
"workersNeeded": 2,
|
||||
"assignedCount": 1
|
||||
}
|
||||
]
|
||||
}
|
||||
],
|
||||
"requestId": "uuid"
|
||||
}
|
||||
```
|
||||
|
||||
## 5) Favorite staff list
|
||||
|
||||
```text
|
||||
GET /query/tenants/:tenantId/businesses/:businessId/favorite-staff
|
||||
```
|
||||
|
||||
Optional query params:
|
||||
- `limit`
|
||||
- `offset`
|
||||
|
||||
## 6) Staff review summary
|
||||
|
||||
```text
|
||||
GET /query/tenants/:tenantId/staff/:staffId/review-summary
|
||||
```
|
||||
|
||||
Optional query params:
|
||||
- `limit`
|
||||
|
||||
Response includes:
|
||||
- staff identity
|
||||
- average rating
|
||||
- rating count
|
||||
- recent reviews
|
||||
|
||||
## 7) Assignment attendance detail
|
||||
|
||||
```text
|
||||
GET /query/tenants/:tenantId/assignments/:assignmentId/attendance
|
||||
```
|
||||
|
||||
Response includes:
|
||||
- assignment status
|
||||
- shift info
|
||||
- attendance session
|
||||
- ordered attendance events
|
||||
- NFC and geofence validation fields
|
||||
|
||||
## 8) Current boundary
|
||||
|
||||
Frontend should use only these documented reads on `query-api-v2`.
|
||||
|
||||
Do not point dashboard, reports, finance, or other undocumented list/detail views here yet.
|
||||
Reference in New Issue
Block a user