2026-03-16 22:23:58 +01:00
|
|
|
[workspace]
|
|
|
|
|
resolver = "2"
|
|
|
|
|
members = [
|
|
|
|
|
"apps/gateway",
|
|
|
|
|
"apps/users",
|
2026-03-17 20:42:51 +01:00
|
|
|
"apps/photographers",
|
|
|
|
|
"apps/tutors",
|
2026-03-16 22:23:58 +01:00
|
|
|
"apps/companies",
|
2026-03-17 20:42:51 +01:00
|
|
|
"apps/job_seekers",
|
2026-03-16 22:23:58 +01:00
|
|
|
"apps/customers",
|
2026-03-17 20:42:51 +01:00
|
|
|
"apps/makeup_artists",
|
|
|
|
|
"apps/developers",
|
|
|
|
|
"apps/video_editors",
|
|
|
|
|
"apps/graphic_designers",
|
|
|
|
|
"apps/social_media_managers",
|
|
|
|
|
"apps/fitness_trainers",
|
|
|
|
|
"apps/catering_services",
|
2026-03-16 22:23:58 +01:00
|
|
|
"crates/contracts",
|
|
|
|
|
"crates/db",
|
|
|
|
|
"crates/auth",
|
feat: add Redis for OTP, auth tokens, rate limiting, lead dedup and marketplace cache
- Add crates/cache with client, otp, rate_limit, token, lead, jobs modules
- OTP tokens stored in Redis (15-min TTL, single-use GETDEL on verify)
- Refresh tokens stored in Redis (30-day TTL) — removed DB storage
- Password reset tokens stored in Redis (1-hour TTL, single-use)
- Rate limiting: register (10/hr), login (10/15min), OTP resend (3/hr), lead (5/hr), job post (20/hr)
- Lead request deduplication: 24-hour Redis lock per professional+requirement pair
- Marketplace listings cached in Redis (5-min TTL per profession+page+limit)
- Add ProfessionState{pool, redis} to contracts crate, replacing bare PgPool in all 9 profession apps
- All profession handlers and main.rs updated to use ProfessionState
- REDIS_URL env var (default: redis://127.0.0.1:6379) used across all services
- Fix profession model struct name mangling in 6 handlers (MakeupArtistRepository etc.)
- Add custom_data JSONB migration for all 9 profession profile tables
- Add onboarding_state model and repository (save_progress, complete, is_complete)
- Add onboarding handler accepting roleKey:String (not role_id:UUID) for frontend compat
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-03-18 22:58:42 +01:00
|
|
|
"crates/storage",
|
|
|
|
|
"crates/cache",
|
2026-03-16 22:23:58 +01:00
|
|
|
]
|
|
|
|
|
|
|
|
|
|
[workspace.package]
|
|
|
|
|
edition = "2021"
|
|
|
|
|
license = "Proprietary"
|
|
|
|
|
authors = ["NXTGAUGE Team"]
|
|
|
|
|
|
|
|
|
|
[workspace.dependencies]
|
|
|
|
|
anyhow = "1"
|
|
|
|
|
axum = "0.8"
|
|
|
|
|
serde = { version = "1", features = ["derive"] }
|
|
|
|
|
serde_json = "1"
|
|
|
|
|
thiserror = "2"
|
|
|
|
|
tokio = { version = "1", features = ["full"] }
|
|
|
|
|
tracing = "0.1"
|
|
|
|
|
tracing-subscriber = { version = "0.3", features = ["env-filter", "fmt"] }
|
|
|
|
|
tonic = "0.12"
|
|
|
|
|
prost = "0.13"
|
|
|
|
|
sqlx = { version = "0.8", features = ["runtime-tokio-rustls", "postgres", "uuid", "chrono", "json"] }
|
|
|
|
|
uuid = { version = "1", features = ["serde", "v4"] }
|
|
|
|
|
chrono = { version = "0.4", features = ["serde"] }
|
2026-03-22 15:55:29 +01:00
|
|
|
lettre = { version = "0.11", default-features = false, features = ["tokio1-rustls-tls", "smtp-transport", "builder", "serde"] }
|
|
|
|
|
redis = { version = "0.27", features = ["tokio-comp", "connection-manager"] }
|
|
|
|
|
async-trait = "0.1"
|