Saleor Store
우리 컬렉션을 쇼핑하세요
아직 감지된 업데이트가 없습니다. GitHub 릴리스가 나오면 여기에 보입니다.
개인 계정의 공개 저장소 소유자는 GitHub로 로그인해 운영자를 확인하고 소개를 직접 관리할 수 있습니다. 관리자 승인은 필요하지 않습니다.
로그인한 뒤 확인 파일을 만들어 이 저장소의 기본 브랜치에 30분 안에 커밋해 주세요. 다른 브랜치나 포크의 파일은 인정하지 않습니다. 파일을 올린 뒤 아래에서 확인하면 관리자 승인 없이 관리할 수 있습니다. 자격을 유지하려면 파일을 남겨 두세요.
로그인이 필요하면 로그인 화면으로 이동합니다. 로그인 후 이곳으로 돌아와 원하는 확인 버튼을 다시 눌러 주세요.
프로젝트 폴더에서 /nomorevibe verify를 실행하면 소유권을 확인하고 소개를 직접 관리할 수 있습니다.
1분 만에 확인하기README 전체를 불러오는 중입니다. 아래는 저장된 발췌입니다.
FCM push notification support is included. See docs/fcm-push-notifications.md for server and client setup.
Content management and customer discovery completion update.
New bookings use this authoritative service flow:README 전문 보기 ↗FCM push notification support is included. See docs/fcm-push-notifications.md for server and client setup.
Content management and customer discovery completion update.
New bookings use this authoritative service flow:
Tasker starts navigation -> marks arrival
-> uploads Latache-managed front-door image
-> POST /api/bookings/:bookingId/work/proofs/front-door
-> Customer POST /api/bookings/:bookingId/work/start-code
-> Tasker POST /api/bookings/:bookingId/work/start with the six-digit OTP
-> timer starts; pause/resume/extension remain persisted
-> when work is done, Tasker uploads the completed-work image
-> POST /api/bookings/:bookingId/work/proofs/completion freezes the billable timer
-> Customer POST /api/bookings/:bookingId/work/completion-code
-> Tasker POST /api/bookings/:bookingId/work/finish with the OTP
-> booking completes -> final Stripe/wallet/cash orchestration follows the existing authoritative finance flow
The authenticated Customer may call the existing POST /api/bookings/:bookingId/complete as the exceptional fallback after the completed-work proof exists. For verification-required bookings, final payment is blocked until front-door/start verification and either completion OTP verification or Customer fallback completion is recorded. Online Tasker earnings are still pending for the configured clearance period after real settlement; physical cash never becomes platform-held wallet money.
Work images are uploaded first through the existing managed Cloudinary upload API using booking-attachments; the proof endpoints persist only provider-verified Latache assets. Persisted work-proof images are immutable and cannot be independently deleted.
Optional settings:
BOOKING_WORK_OTP_TTL_MINUTES=15
BOOKING_WORK_OTP_MAX_ATTEMPTS=5
Customer Management list filters additionally accept phone, location, from, and to. GET /api/payments/wallet now includes the Customer's real saved Stripe cards/default card plus attachCardEndpoint: /api/payments/setup-intent.
The backend always accepts browser requests from https://latache-web.vercel.app, https://latache-be-production.up.railway.app, and http://localhost:3000. Values supplied through CORS_ORIGINS are added to that set. Swagger uses the current browser host as its default OpenAPI server, so production Try it out requests stay on the Railway HTTPS domain even when APP_BASE_URL is stale or absent.
Latache backend implemented with NestJS 11, strict TypeScript, Prisma/PostgreSQL, Nodemailer SMTP, Cloudinary uploads, and database-backed RBAC.
SERVICE_MODE=worker. This avoids intermittent Gmail SMTP ENETUNREACH failures caused by an unreachable IPv6 result on hosts without working outbound IPv6.APP_BASE_URL is optional when a public domain exists: the backend automatically uses https://${RAILWAY_PUBLIC_DOMAIN}. An explicit APP_BASE_URL still overrides the Railway-derived value.SMTP_VERIFY_ON_BOOTSTRAP=true no longer makes a transient SMTP outage fatal by default. Set SMTP_VERIFY_ON_BOOTSTRAP_FATAL=true only when deployment should fail if SMTP verification fails. Actual email sends remain fail-closed and return the existing controlled service-unavailable behavior when SMTP is unreachable.AUTH_MAX_FAILED_LOGIN_ATTEMPTS=5, AUTH_LOGIN_LOCK_MINUTES=15.JWT_SECRET_ADMIN; marketplace access tokens use JWT_SECRET. Temporary Admin passwords are enforced by the Admin guard until PATCH /api/auth/change-password succeeds.POST /api/auth/set-password. Provider unlinking cannot remove the last usable sign-in method and now revokes existing sessions after a provider is disconnected.azp), expiry, issue time, not-before time, and an expected nonce when supplied. Expired JWKS cache entries are not accepted when provider key refresh fails.20260820150000_authentication_hardening.POST /api/auth/roles/tasker onboarding as the next action.GOOGLE_AUTH_CLIENT_IDS and APPLE_AUTH_CLIENT_IDS are comma-separated accepted OAuth/OIDC audiences. Optional SOCIAL_AUTH_JWKS_CACHE_SECONDS and SOCIAL_AUTH_CLOCK_SKEW_SECONDS tune verification caching/skew.20260820143000_google_apple_social_auth. No provider access/refresh tokens or client secrets are stored by this login-only integration.User remains the canonical email/password identity while marketplace access is represented by roles[] plus separate CustomerProfile and TaskerProfile records.20260819130000_multi_role_identity_profiles.referral section of PUT /api/admin/platform-settings; the policy remains snapshotted on each new attribution.GET /api/admin/elite-taskers/program/perk-catalog returns the supported perk catalog; PUT /api/admin/elite-taskers/program/tiers/:tierCode/benefits assigns the supported perks to a tier.publicId under the locked dispute and do not consume evidence caps or fulfill requests unless genuinely new evidence is persisted.4.5 / 20 tasks / 90% / 0 active disputes, Platinum 4.7 / 75 / 94% / 0, Diamond 4.85 / 200 / 97% / 0. Admin-managed requirements remain authoritative.POST /api/services now requires minimumHourlyRate and maximumHourlyRate. Tasker onboarding and profile skill rates must stay inside those limits. Existing services migrate conservatively to USD 1–10,000 bounds until Admin adjusts them.PUT /api/admin/platform-settings using currency.primaryMarket: us, morocco, pakistan, france, or spain. Static presets are USD $ ×1, MAD MAD ×9, PKR Rs ×280, and EUR € ×0.86 per USD. France and Spain both use EUR. These are application presets, not live FX.ELITE_WORKER_POLL_MS=21600000 (6 hours) and ELITE_WORKER_BATCH_SIZE=200.Example currency update (Super Admin only):
{
"currency": {
"primaryMarket": "morocco"
}
}
charge.dispute.* webhooks are tracked separately and block Tasker finance while active/lost.See Dispute lifecycle hardening.
items model.APP_BASE_URL as the OpenAPI server origin, keeping imported Postman requests portable across local, staging, and production environments.postman/.See Postman setup.
finance.manage and are audit-logged.en/ar/ary notifications, transactional referral:updated events, and BullMQ expiry/release maintenance are included.See Production referral reward system.
clientMessageId writes, total unread counts, bounded read receipts, and last-message activity ordering.See Production chat system and Realtime contract.
awaiting_customer_approval; it does not charge the customer or create an earning.<center> markup. The app-download section has been removed from every email.See Booking completion approval and Production readiness.
Authorized administrators now have explicit irreversible Customer/Tasker/Admin deletion controls. Protected booking, provider, ledger, payout, dispute, review and shared conversation history returns a detailed 409 ACCOUNT_PURGE_BLOCKED instead of being silently destroyed. Eligible database rows are hard-deleted and Latache-managed Cloudinary assets use a durable PostgreSQL deletion outbox with BullMQ retries. See Permanent deletion.
The shared email shield now uses email-client-safe centering, and the hosted dunes image is the direct footer background behind social/copyright content with no solid footer fill.
The shared email design now references the supplied Cloudinary header, shield, and footer assets instead of attaching roughly 4.6 MB of source PNGs to every SMTP message. Registration no longer spends tens of seconds uploading decorative artwork. Nodemailer results are checked to ensure the requested recipient was actually accepted, and a safe smtp_delivery_accepted log records only the recipient domain, message ID, and response code. Configurable SMTP timeouts bound provider/network stalls.
The production TypeScript build is rooted at src, so Nest emits the canonical dist/main.js expected by the existing package/Docker start commands. npm run build first removes only the generated dist directory so stale dist/src output cannot survive an upgrade. Version 3.17.2 subsequently removed the filesystem mail-asset dependency entirely by using hosted artwork. CORS origins are normalized, the APP_BASE_URL origin is allowed for Swagger, and the seeded Super Admin example is documented as literal JSON without Markdown escaping.
https://latache-web.vercel.app/images/logo-full.svg.ary; ary-MA resolves to it. User preference, Accept-Language, Admin translation management, notifications, and email all support it.See docs/email-design-and-darija.md and docs/multilingual-architecture.md.
SERVICE_MODE=worker BullMQ process runs retry-safe earning release, stale-call cleanup, and bounded dispatched-outbox retention jobs./api/health now includes PostgreSQL, Redis, queues/workers, outbox backlog, cache counters, and baseline metrics.See docs/performance-architecture.md for Railway API/worker topology and environment configuration.
Accept-Language, then English.PATCH /api/auth/me persists preferredLanguage; existing Admin/RBAC management routes own translation changes.See docs/multilingual-architecture.md.
PENDING Tasker earning and increments only pending wallet balance.Upgrade without reseeding or resetting the database:
npm install
npm run prisma:generate
npm run prisma:validate
npm run prisma:migrate:deploy
npm run build
npm run start:dev
See docs/tasker-earnings-clearance-cash-accounting.md.
folder=conversation-attachments.GET /api/conversations/capabilities, GET /api/conversations/:bookingId/calls, and GET /api/conversations/:bookingId/calls/:callId.See docs/chat-attachments-calls.md and docs/realtime.md.
folder=conversation-attachments.POST /api/conversations/:bookingId/messages.GET /api/conversations/capabilities.GET /api/conversations/:bookingId/calls and GET /api/conversations/:bookingId/calls/:callId./realtime for call:initiate, call:accept, call:reject, call:cancel, call:end, call:offer, call:answer, call:ice_candidate, and call:media_state.docs/conversation-attachments-calls.md and docs/realtime.md.Upgrade from v3.12 without reseeding:
npm install
npm run prisma:generate
npm run prisma:validate
npm run prisma:migrate:deploy
npm run build
npm run start:dev
GET/POST /api/services, GET /api/services/:serviceId, nested service options managed with services.manage.GET /api/disputes, GET /api/disputes/:disputeId, POST /api/bookings/:bookingId/disputes, POST /api/disputes/:disputeId/evidence.GET /api/realtime/session; Socket.IO namespace /realtime.GET /api/admin/reviews, PATCH /api/admin/reviews/:reviewId/moderation.See docs/api-consistency-audit.md and docs/realtime.md.
This release adds persisted Customer/Tasker Support tickets/live chat plus a permission-aware Admin Support Center, and consolidates Service Management around the existing Service/ServiceOption/UserService domain. Pricing remains owned by Platform Settings/Elite Program; Support Center never fabricates refunds or payouts. See docs/admin-services-support.md.
Key read APIs:
GET /api/admin/services?view=catalog|pricingGET /api/admin/services/:serviceIdGET /api/admin/support?view=support_tickets|customer_issues|tasker_issues|escalated|live_chat|reportsGET /api/support/tickets (Customer/Tasker role-aware)npm install
cp .env.example .env
npm run prisma:generate
npm run prisma:migrate:deploy
npm run prisma:seed
npm run start:dev
Windows PowerShell:
Copy-Item .env.example .env
npm install
npm run prisma:generate
npm run prisma:migrate:deploy
npm run prisma:seed
npm run start:dev
Endpoints:
http://localhost:8080/apihttp://localhost:8080/api/docshttp://localhost:8080/api/docs-jsonGET http://localhost:8080/api/healthSwagger is enabled when SWAGGER_ENABLED=true.
Swagger requests use the API origin declared by APP_BASE_URL, which the server permits automatically. Add only separate browser frontend origins to CORS_ORIGINS (comma-separated). Login JSON must contain raw values; Markdown mailto: notation and backslash escapes copied from formatted chat text are not credentials.
DATABASE_URL=postgresql://latache:latache@localhost:5432/latache?schema=public
JWT_SECRET=<random-secret-at-least-32-characters>
JWT_SECRET_ADMIN=<different-random-secret-at-least-32-characters>
CORS_ORIGINS=http://localhost:3000,http://localhost:3001
SEO_PUBLIC_BASE_URL=http://localhost:3000
SUPPORTED_LOCALES=en,ar,ary,fr,es
DEFAULT_LOCALE=en
REALTIME_ENABLED=true
REALTIME_OUTBOX_POLL_MS=500
REALTIME_OUTBOX_BATCH_SIZE=100
REALTIME_SESSION_SWEEP_MS=30000
SMTP_HOST=localhost
SMTP_PORT=1025
SMTP_SECURE=false
SMTP_USER=
SMTP_PASSWORD=
SMTP_FROM=Latache <[email protected]>
SMTP_CONNECTION_TIMEOUT_MS=10000
SMTP_GREETING_TIMEOUT_MS=10000
SMTP_SOCKET_TIMEOUT_MS=30000
OTP_EXPIRES_IN_MINUTES=5
PASSWORD_RESET_OTP_EXPIRES_IN_MINUTES=15
CHAT_ATTACHMENT_MAX_FILES=5
CHAT_ATTACHMENT_MAX_FILE_SIZE_BYTES=10485760
CHAT_ATTACHMENT_MAX_TOTAL_SIZE_BYTES=26214400
CHAT_CALLS_ENABLED=true
CHAT_CALL_RING_TIMEOUT_SECONDS=45
CHAT_CALL_MAX_DURATION_SECONDS=14400
CHAT_CALL_ALLOWED_BOOKING_STATUSES=confirmed,en_route,arrived,in_progress
WEBRTC_STUN_URLS=
WEBRTC_TURN_URLS=
WEBRTC_TURN_SHARED_SECRET=
WEBRTC_TURN_USERNAME=
WEBRTC_TURN_CREDENTIAL=
Use SMTP_SECURE=true for implicit TLS on port 465. Use SMTP_SECURE=false for port 587 so Nodemailer can negotiate STARTTLS.
Keep Neon credentials only in .env or the deployment secret manager:
DATABASE_URL=postgresql://neondb_owner:YOUR_PASSWORD@YOUR_NEON_HOST/neondb?sslmode=verify-full
For a pooled runtime connection, set the direct migration connection separately:
DATABASE_URL=postgresql://USER:PASSWORD@YOUR_POOLER_HOST/neondb?sslmode=verify-full
DIRECT_URL=postgresql://USER:PASSWORD@YOUR_DIRECT_HOST/neondb?sslmode=verify-full
prisma.config.ts prefers DIRECT_URL for CLI migrations and otherwise uses DATABASE_URL.
Email verification can use Resend instead of Gmail/SMTP. This backend uses Resend's HTTPS API directly, so no new npm package is required.
Set:
MAIL_PROVIDER=resend
RESEND_API_KEY=re_xxxxxxxxxxxxxxxxx
RESEND_FROM=Latache <[email protected]>
For production, create a Resend account, add and verify the domain you will send from, then create an API key with permission to send email. Configure the domain's SPF/DKIM records exactly as Resend provides. Using a verified custom domain is important for deliverability; Resend reduces SMTP/Gmail-specific delivery problems but cannot guarantee that a recipient's provider will never place a message in spam.
If RESEND_FROM is omitted, the existing SMTP_FROM value is used as the sender address. RESEND_API_KEY takes precedence over Brevo/SMTP for all application email. If no Resend key is configured, Brevo (if configured) or SMTP is used instead.
An alternative to Resend, also reachable via its HTTPS API directly (no new npm package required). Useful to A/B test deliverability against Resend on the same domain.
Set:
MAIL_PROVIDER=brevo
BREVO_API_KEY=xkeysib-xxxxxxxxxxxxxxxxx
BREVO_FROM=Latache <[email protected]>
For production, create a Brevo account, add and verify the domain you will send from (Senders, Domains & Dedicated IPs → Domains), and add the SPF/DKIM records exactly as Brevo provides. Create an API key under SMTP & API → API Keys with transactional-email send permission.
If BREVO_FROM is omitted, the existing SMTP_FROM value is used as the sender address. Provider precedence is Resend, then Brevo, then SMTP — only one is ever active at a time based on MAIL_PROVIDER.
SMTP_HOST=smtp.gmail.com
SMTP_PORT=465
SMTP_SECURE=true
SMTP_CONNECTION_TIMEOUT_MS=10000
SMTP_GREETING_TIMEOUT_MS=10000
SMTP_SOCKET_TIMEOUT_MS=30000
[email protected]
SMTP_PASSWORD=your-google-app-password
SMTP_FROM=Latache <[email protected]>
SMTP_VERIFY_ON_BOOTSTRAP=true
Use a Google App Password rather than the normal Gmail password.
If v3.9 is already deployed, apply the additive migration and restart. No reseed is required.
npm run prisma:generate
npm run prisma:validate
npm run prisma:migrate:deploy
npm run build
npm run start:dev
New admin surfaces:
GET /api/admin/finance?view=overview|transactions|refunds|payouts|revenuePOST /api/admin/finance/payouts/:id/actionsGET /api/admin/platform-settingsPUT /api/admin/platform-settingsSee docs/admin-finance-platform-settings.md for the policy/runtime boundaries.
If v3.8 is already deployed, apply the additive dispute-management migration and restart. No reseed is required.
npm install
npm run prisma:generate
npm run prisma:validate
npm run prisma:migrate:deploy
npm run build
npm run start:dev
The release adds unified admin booking/dispute APIs, normalized evidence requests, persistent resolution history, real Stripe/customer-wallet refunds, conditional finance.manage authorization for refunds, and participant evidence submission through the existing Cloudinary upload flow. It does not seed complaints, evidence, refunds, warnings or resolution history.
See docs/admin-bookings-disputes.md.
If v3.7 is already deployed, apply the additive Elite Program migration and restart. No reseed is required.
npm install
npm run prisma:generate
npm run prisma:validate
npm run prisma:migrate:deploy
npm run build
npm run start:dev
The migration creates the tier/request/transition/benefit/badge program tables, adds the Elite tier relation to Taskers, and extends existing RBAC roles with elite.read / elite.manage. It does not seed fake members, requests, scores, benefits, badges, earnings or history.
See docs/elite-tasker-program.md for the consolidated API design.
If v3.6.1 is already deployed, apply the additive admin-dashboard migration and restart. No reseed is required.
npm install
npm run prisma:generate
npm run prisma:validate
npm run prisma:migrate:deploy
npm run build
npm run start:dev
The new migration creates only AdminAuditLogs; it does not rewrite Customer, Tasker, booking, payment, wallet, Auth, or RBAC data.
If your database already has the v3.5 Tasker dashboard migration, this release needs only the new additive Customer/Stripe migration. Do not reseed merely for v3.6.
npm install
npm run prisma:generate
npm run prisma:validate
npm run prisma:migrate:deploy
npm run build
npm run start:dev
Configure Stripe first if customer card/payment endpoints should be active. Keeping STRIPE_ENABLED=false leaves those provider-backed endpoints unavailable rather than simulating payment success.
Never run prisma migrate reset on an existing database. Take a verified backup first.
When the old schema already exists but the Prisma baseline has not been recorded:
npm run prisma:generate
npx prisma migrate resolve --applied 20260805000000_baseline
npm run prisma:migrate:status
npm run prisma:migrate:deploy
npm run prisma:seed
npm run start:dev
The additive 20260805002000_revamp_auth_module migration adds auth governance, OTP-attempt, consent, session metadata and administrator fields. 20260805003000_add_rbac_model creates persistent RBAC roles, adds the user-role relation and permission inheritance flag, and backfills existing administrators. Neither migration recreates existing domain tables. The additive 20260807010000_add_tasker_dashboard migration adds Tasker dashboard state, work sessions, location, messaging, notifications, reviews, wallet ledger, payout methods and withdrawal records without seeding fake dashboard or financial rows. The additive 20260807020000_add_customer_dashboard_and_stripe migration adds customer favorites, customer wallet/payment state, Stripe references, service sub-options and customer booking billing fields. The additive 20260808090000_add_admin_dashboard_foundation migration adds only the administrative audit trail used by moderation and activity feeds. The additive 20260810070000_add_elite_tasker_program migration adds tiered Elite membership, request/transition history, configurable benefits/badges and Elite RBAC permissions while conservatively mapping pre-tier isElite Taskers to Gold. The additive 20260810130000_add_booking_dispute_management migration extends real complaint records with admin workflow state and adds normalized evidence, evidence-request and resolution history. The additive 20260810173000_add_finance_platform_settings migration adds platform-policy persistence, booking tax/commission audit fields, and payout-review metadata. None of these migrations seeds fake financial or dashboard activity.
Only the following auth routes are exposed:
| Method | Route | Access |
|---|---|---|
| POST | /api/auth/customers/register | Public |
| POST | /api/auth/taskers/register | Public |
| POST | /api/auth/admins/register | admins.create or super admin; delegated creation is non-escalating |
| POST | /api/auth/login | Public |
| POST | /api/auth/refresh | Public with refresh token |
| POST | /api/auth/verify-email | Registration bearer session |
| POST | /api/auth/resend-verification-email | Public |
| POST | /api/auth/forgot-password | Public |
| POST | /api/auth/verify-reset-otp | Public |
| POST | /api/auth/reset-password | Public |
| PATCH | /api/auth/change-password | Verified bearer session |
| GET | /api/auth/me | Verified bearer session |
| PATCH | /api/auth/me | Verified bearer session |
| GET | /api/auth/sessions | Verified bearer session |
| DELETE | /api/auth/sessions/:id | Verified bearer session |
| POST | /api/auth/logout | Verified bearer session |
| POST | /api/auth/sessions/logout-all | Verified bearer session |
Old aliases such as sign-up, refresh-token, verify-otp, resend-otp, verify-pass-token, verify-forgot-password, get-loggedin-user, verify-token, and logout-all are intentionally not registered.
super_admin: seeded canonical platform owner with immutable full access.admin: linked to a persistent RBAC role; creation requires admins.create and delegated creation cannot exceed the caller's own permissions.customer: standard booking account.tasker: seven-step application account; email verification moves it to pending approval.Administrators normally inherit the complete permission set of their RBAC role. Authorized administrators may assign a validated least-privilege subset only within their own effective access; the super admin may assign any non-super-admin access. Role additions do not expand an explicit override automatically, while role removals are enforced so the override can never exceed its parent role.
| Method | Route | Access |
|---|---|---|
| GET | /api/rbac/me | Admin or super admin |
| GET | /api/rbac/permissions | roles.read or super admin |
| GET | /api/rbac/roles | roles.read or super admin |
| GET | /api/rbac/roles/:id | roles.read or super admin |
| POST | /api/rbac/roles | Super admin |
| PATCH | /api/rbac/roles/:id | Super admin |
| PUT | /api/rbac/roles/:id/permissions | Super admin |
| DELETE | /api/rbac/roles/:id | Super admin |
| GET | /api/rbac/admins | admins.read or super admin |
| GET | /api/rbac/admins/:id | admins.read or super admin |
| PATCH | /api/rbac/admins/:id | admins.update or super admin |
| PATCH | /api/rbac/admins/:id/access | admins.update or super admin; no privilege escalation |
| PATCH | /api/rbac/admins/:id/status | admins.suspend/admins.delete or super admin |
| DELETE | /api/rbac/admins/:id | admins.delete or super admin |
The administrator registration endpoint accepts an active role code from GET /api/rbac/roles. Omit permissions to inherit the role; provide a subset to create an explicit least-privilege override.
See docs/auth-module.md for auth flows and docs/rbac.md for the RBAC data model, API rules, examples, and migration behavior.
Version 3.7 introduces permission-aware admin-side views without duplicating the underlying Customer, Tasker, booking, payment, wallet, Auth, or RBAC resources.
/api/admin/dashboard/* provides platform/revenue/user/Tasker/booking analytics and persisted activity./api/admin/customers/* provides customer operations, booking/payment history, reports, and moderation./api/admin/taskers/* provides Tasker verification, moderation, performance, and earnings monitoring./api/rbac/* and /api/auth/admins/register remain the only Admin Management/role/permission APIs.null until real providers are integrated.See docs/admin-dashboard.md for the complete first-slice route map and data definitions.
Version 3.8 adds a dedicated but consolidated Elite Tasker domain:
GET /api/admin/elite-taskers/overview powers the program dashboard.GET /api/admin/elite-taskers endpoint powers member tiers plus application/upgrade/downgrade queues via query parameters.GET /api/admin/elite-taskers/program returns tier, benefit and badge settings together.elite-badge-assets.See docs/elite-tasker-program.md for the exact routes and workflow.
Version 3.6 intentionally unifies resources that represent the same domain object for both roles:
GET /api/dashboard/overview is role-aware./api/bookings/* is the canonical task/booking lifecycle for Customer and Tasker./api/conversations/*, /api/notifications/* and /api/reviews/* are shared and scoped to the authenticated user./api/auth/me remains the shared personal-profile contract./api/favorites/taskers/* is Customer-specific./api/payments/* is Customer payment/card/wallet state./api/tasker-dashboard/profile/* remains Tasker-specific business/skills state./api/tasker-dashboard/wallet/* remains the Tasker earnings/payout ledger because it has different financial semantics from the Customer spending wallet.Customer booking flow uses persistent service options, real Tasker availability, transactional slot claiming, Cloudinary attachment metadata, Stripe saved cards/SetupIntents, customer wallet funding and a provider/ledger-backed final settlement after completion. Route ETA remains explicitly unavailable until a real routing provider is configured. Tax remains disabled by default, but v3.10 can apply a configured global tax policy without inventing jurisdiction data.
See docs/customer-dashboard.md, docs/shared-role-api.md, docs/payments-stripe.md, and docs/tasker-dashboard.md.
Customer Stripe configuration:
STRIPE_ENABLED=false
STRIPE_SECRET_KEY=
STRIPE_WEBHOOK_SECRET=
PAYMENTS_CURRENCY=USD
PAYMENTS_PLATFORM_FEE_PERCENT=0
BOOKING_MINIMUM_BILLABLE_MINUTES=120
CUSTOMER_WALLET_MIN_TOPUP=5
Tasker payout configuration remains:
TASKER_WALLET_CURRENCY=USD
TASKER_PAYOUT_EXECUTION_MODE=disabled
TASKER_MIN_WITHDRAWAL_AMOUNT=1
PAYOUT_DATA_ENCRYPTION_KEY=
Tasker earning-clearance worker bootstrap defaults:
TASKER_EARNINGS_WORKER_ENABLED=true
TASKER_EARNINGS_WORKER_POLL_MS=60000
TASKER_EARNINGS_WORKER_BATCH_SIZE=100
TASKER_EARNINGS_CLEARANCE_DAYS=14
TASKER_CASH_DISPUTE_CLEARANCE_DAYS=14
The Admin Platform Settings taskerFinance section is the persisted business-policy source. Environment values initialize defaults only; the optional cash-debt ceiling is disabled until Finance supplies a positive threshold and explicitly enables blocking.
In development, npm run prisma:seed upserts the canonical account using:
Email: [email protected]
Password: Admin@12345
Staging/production require client-owned SUPERADMIN_EMAIL and SUPERADMIN_PASSWORD; the development values are rejected and the initial password must contain at least 12 characters. A new production Super Admin is flagged to change it. Existing production passwords are preserved on later seed runs unless SUPERADMIN_ROTATE_PASSWORD_ON_SEED=true is deliberately enabled for a one-time rotation.
docker compose --env-file .env up --build
Services:
localhost:5432localhost:1025http://localhost:8025http://localhost:8080/apinpm run verify:static
npm run prisma:validate
npm run build
npm run lint
npm test -- --runInBand
npm run test:e2e -- --runInBand
The generated Prisma client, node_modules, .env, dist, and coverage output are intentionally excluded from release archives.
SEO is managed through the RBAC-controlled /api/admin/seo/* APIs. Configure SEO_PUBLIC_BASE_URL to the public website origin when it differs from the API origin. The backend exposes /api/seo/meta, /api/seo/robots.txt, and /api/seo/sitemap.xml; the frontend should consume route metadata and apply the resolved canonical, robots, Open Graph, Twitter, alternate-language, and JSON-LD values to rendered pages.