maaz519
5801cbf85b
feat: member portal Sprint 10 — Knowledge Base
...
- KnowledgeBoard + KnowledgeItem models + migration (DRAFT/PUBLISHED/ARCHIVED status, slug per tenant)
- KnowledgeModule: admin CRUD for boards + items (auto-slug, status workflow)
- Member endpoint GET /my/knowledge?q= — published items grouped by board, optional text search over question/answer
- /my/knowledge page: search box + collapsible boards with accordion FAQ items
- KnowledgeItem accordion + KnowledgeSearch (debounced URL-driven) client components
- Knowledge nav item; register KnowledgeModule
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com >
2026-06-17 17:06:26 +05:30
maaz519
f61c070428
feat: member portal Sprint 9 — Ask AI (RAG over message archive)
...
- AskAIQuery model + migration (logs question/answer/citations per member)
- AskAIService: RAG pipeline — retrieve via tenant-isolated SearchService (Meili),
ground LLM in top-8 snippets with inline [n] citations, degrade gracefully when
OPENROUTER_API_KEY absent or no context (snippet fallback)
- Shared api/common/llm-client.ts (mirrors worker's OpenRouter client)
- SearchModule now exports SearchService
- Member endpoints: GET/POST /my/ask (history + ask)
- /my/ask page + AskChat client component: question box, answer cards with sources
- Ask AI nav item (top of member nav)
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com >
2026-06-17 17:03:01 +05:30
maaz519
6d89d8a609
feat: member portal Sprint 8 — Member Directory
...
- GET /my/directory in MyService/MyController with q + interest filters
- Respects directoryVisible; excludes self; never exposes jid/phone
- q searches displayName/hometown/currentLocation (case-insensitive);
interest filter via array `has`; aggregates top-20 interest filter chips
- BFF route forwards query string
- /my/directory page: server-rendered cards (avatar initials, location, interest tags)
- DirectorySearch client component: debounced search box + toggleable interest chips that drive URL params
- Directory nav item
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com >
2026-06-17 16:55:30 +05:30
maaz519
57fe9d9bf1
feat: member portal Sprint 7 — Circles (interest/affinity sub-groups)
...
- Circle + CircleMembership models + migration (CircleRole: MEMBER/LEAD, public/invite-only)
- CirclesModule: admin CRUD + member list; unique circle name per tenant
- Member endpoints in MyController: GET /my/circles, POST /my/circles/:id/join|leave
- listForMember returns public circles + private ones the member belongs to, with isMember/myRole/memberCount
- join() enforces invite-only; leave() removes membership
- /my/circles page: "My circles" + "Discover" split, join/leave button, LEAD + Private badges
- Member + admin BFF routes; Circles nav item
- Register CirclesModule; add CIRCLE_CREATED/DELETED audit actions
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com >
2026-06-17 16:52:04 +05:30
maaz519
cd1eef0098
feat: member portal Sprint 6 — Seva + multi-signal gamification
...
- SevaOpportunity + SevaEntry + GamificationEvent models + migration
- GamificationService: multi-signal point table (helpful answer +10, seva +20,
event +5, FAQ +15, welcome +3, profile +5, business +5), idempotent award via
unique(userId,type,refId), lifetime + time-decayed "recent" score, leaderboard
- SevaModule: admin CRUD + mark-entry-complete (awards SEVA_COMPLETED points)
- Member endpoints in MyController: GET /my/seva, POST /my/seva/:id/signup|cancel
- PROFILE_COMPLETED auto-awarded on profile update (name+hometown+interest)
- /my/seva page: points hero with per-type breakdown, open opportunities w/ signup,
leaderboard (respects directoryVisible), my seva history
- Member + admin BFF routes; Seva & Points nav item
- Register GamificationModule + SevaModule; add SEVA_* audit actions
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com >
2026-06-17 16:44:43 +05:30
maaz519
0ffdc362b5
feat: member portal Sprint 4 — Events + RSVP
...
- Event + EventRsvp models + migration (RsvpStatus enum: GOING/MAYBE/NOT_GOING)
- EventsModule: admin CRUD (create/update/delete/publish) + RSVP list
- GET /my/events + POST /my/events/:id/rsvp in MyController/MyService
- Admin BFF routes: GET/POST /api/admin/events, PATCH/DELETE /api/admin/events/[id]
- Member BFF routes: GET /api/my/events, POST /api/my/events/[id]/rsvp
- /my/events page: upcoming/past split, RSVP button (client component, optimistic)
- Register DigestModule, OrgModule, ThreadsModule, EventsModule in AppModule
- Add EVENT_CREATED/DELETED/UPDATED and DIGEST_SENT to AuditAction
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com >
2026-06-17 16:20:11 +05:30
maaz519
bc9fe7c145
feat: member portal Sprint 2 — digest history page and restore Digest/DigestConfig schema models
...
- Restore Digest + DigestConfig models to schema.prisma (wiped by prior git reset)
- Add Tenant.digestConfig / Tenant.digests relations
- GET /my/digest API endpoint (last 20 digests, truncated summary)
- BFF route /api/my/digest
- /my/digest page: digest cards with date, message count, summary preview
- Add Digest nav item to MemberShell sidebar
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com >
2026-06-17 16:04:31 +05:30
maaz519
566690bd04
feat: member portal Sprint 1 — dashboard with MemberShell layout and TowerUser profile fields
...
- Add avatar, hometown, currentLocation, interests, language, digestPreference, directoryVisible fields to TowerUser
- Migration: 20260617200000_add_tower_user_profile_fields
- GET /my/dashboard API endpoint with stats (groups, messages, consents)
- BFF route /api/my/dashboard
- MemberShell 3-column layout (220px nav + flex-1 main + 280px rail)
- Dashboard page: hero card, stat cards, group list, interests chips
- Sidebar returns null for /my paths (MemberShell owns the nav)
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com >
2026-06-17 15:44:58 +05:30