स्मार्ट फ़िटनेस ऐप्लिकेशन: डेटा स्ट्रक्चर, डेटाबेस स्कीमा, और सर्वर डिज़ाइन की खास जानकारी
आर्टिफ़ैक्टयह आर्टफ़ैक्ट, दूसरे एपिसोड में इस्तेमाल किया गया है: अपने ऐप्लिकेशन के सिस्टम की खास जानकारी की योजना बनाएं (कोड की ज़रूरत नहीं है). इस स्पेसिफ़िकेशन का इस्तेमाल, Cloud Firestore कलेक्शन, सर्वर एंडपॉइंट, और एजेंट की तीन-टियर मेमोरी को स्ट्रक्चर करने के लिए रेफ़रंस के तौर पर किया जा सकता है.
इस आर्टफ़ैक्ट को ऐक्सेस करने के लिए साइन इन करें
Build It! सीरीज़ में इस्तेमाल किए गए पूरे आर्टफ़ैक्ट को देखने और कॉपी करने के लिए, अपनी Google डेवलपर प्रोफ़ाइल से साइन इन करें.
डेवलपर प्रोफ़ाइल ज़रूरी है
आपके लिए डेवलपर प्रोफ़ाइल बनाने की सुविधा उपलब्ध नहीं है. अपने Workspace एडमिन को इस सुविधा को चालू करने के लिए कहें.
डेवलपर प्रोफ़ाइल बनाएं
Build It! के सभी प्रॉम्प्ट और आर्टफ़ैक्ट अनलॉक करने के लिए, बिना किसी शुल्क के Google डेवलपर प्रोफ़ाइल बनाएं.
अनलॉक करने के लिए Builder Central में शामिल हों
एक क्लिक में बिल्डर मेंबर का बैज मुफ़्त में पाएं. इससे आपको Build It! के सभी प्रॉम्प्ट और आर्टफ़ैक्ट का ऐक्सेस मिलेगा.
स्थिति: जारी है (प्लानिंग कंपैनियन की मदद से ड्राफ़्ट किया जा रहा है)
टारगेट डेटाबेस: Google Cloud Firestore
आर्किटेक्चर का लक्ष्य: AI Studio के स्मार्ट फ़िटनेस प्रोटोटाइप को फिर से बनाना, ताकि वह साफ़-सुथरा, मैनेज करने लायक, और प्रोडक्शन के लिए तैयार हो.
0. मुख्य तकनीकी स्टैक और सिस्टम आर्किटेक्चर से जुड़े फ़ैसले
प्रोडक्शन की स्थिरता, परफ़ॉर्मेंस, और साफ़ तौर पर तय की गई सीमाओं को पक्का करने के लिए, सभी लागू करने के लिए नीचे दी गई आर्किटेक्चरल बेसलाइन को लॉक किया गया है:
- फ़्रंटएंड फ़्रेमवर्क: Next.js (ऐप्लिकेशन राऊटर, React 19). इसमें प्रोग्रेसिव वेब ऐप्लिकेशन (पीडब्ल्यूए) की ऑफ़लाइन ऐसेट कैश मेमोरी (Serwist /
@ducanh2912/next-pwaका इस्तेमाल करके) शामिल है. - स्टाइलिंग और यूज़र इंटरफ़ेस (यूआई) कॉम्पोनेंट: Tailwind CSS v4 + Tailwind वैरिएंट (वैरिएंट मैनेज करने के लिए) + Lucide React (आइकॉन).
- क्लाइंट स्टेट आर्किटेक्चर:
- Zustand (
persistमिडलवेयर के साथ): यह लोकल, टैक्टाइल, और कुछ समय के लिए क्लाइंट स्टेट को मैनेज करता है. जैसे, स्टॉपवॉच टाइमर, ऐक्टिव सेट बफ़र, स्टेप ग्राफ़, और सेव नहीं किए गए जिम-फ़्लोर इनपुट. - TanStack Query (React Query): यह सभी एसिंक्रोनस सर्वर स्टेट, Firestore दस्तावेज़ की कैश मेमोरी, बैकग्राउंड में फिर से पुष्टि करने, अनुरोध की डुप्लीकेट कॉपी हटाने, और ऑप्टिमिस्टिक म्यूटेशन को मैनेज करता है.
- Zustand (
- बैकएंड रनटाइम और एपीआई होस्टिंग: Next.js रूट हैंडलर (
app/api/...) को Google Cloud Run पर होस्ट किया गया है. यह उसी क्षेत्र में है जहां Firestore और Gemini कॉन्टेक्स्ट कैशिंग मौजूद है. इससे 15 मिलीसेकंड से कम समय में इंटरनल लेटेंसी मिलती है. - पुष्टि करना: Firebase से पुष्टि करना (Google साइन-इन, ईमेल/पासवर्ड, और पहचान ज़ाहिर किए बिना शामिल होने की सुविधा). क्लाइंट, सभी एपीआई अनुरोधों में
Authorization: Bearer <Firebase_ID_Token>अटैच करता है; सर्वर,firebase-admin.auth().verifyIdToken(token)का इस्तेमाल करके पहचान की पुष्टि करता है. - प्राइमरी डेटाबेस: Google Cloud Firestore.
1. सिस्टम की खास जानकारी और उपयोगकर्ता की मुख्य गतिविधि
1.1 दायरा और आर्किटेक्चर के सिद्धांत
इस दस्तावेज़ में, स्मार्ट फ़िटनेस ऐप्लिकेशन के लिए डेटा मॉडल, Cloud Firestore स्कीमा, सर्वर एंडपॉइंट कॉन्ट्रैक्ट, और एआई एजेंट की मेमोरी स्ट्रक्चर के बारे में बताया गया है. यह कसरत के सभी प्लान, सेशन के पुराने लॉग, और अलग-अलग लेवल पर कोचिंग देने की सुविधा के लिए, एकमात्र भरोसेमंद सोर्स उपलब्ध कराता है. यह फ़्रंटएंड प्रज़ेंटेशन फ़्रेमवर्क से पूरी तरह से अलग होता है. इसके बारे में यूआई/यूएक्स डिज़ाइन की खास जानकारी में बताया गया है.
1.2 डेटा से जुड़े मुख्य सिद्धांत
- सेपरेशन ऑफ़ कंसर्न: डेटा कॉन्ट्रैक्ट (बैकएंड/डेटाबेस) और क्लाइंट यूआई डिज़ाइन के बीच साफ़ तौर पर अंतर होता है.
- हाइब्रिड लाइब्रेरी आर्किटेक्चर: स्टैटिक, न बदलने वाली एक्सरसाइज़ एन्साइक्लोपीडिया (
exercises) के साथ-साथ, हर हफ़्ते के शेड्यूल की डाइनैमिक एआई कंपोज़िशन (weekly_plans). - निगरानी में काम करने वाले एआई मॉडल की स्टेजिंग में किए गए बदलाव: एआई की मदद से वर्कआउट में किए गए बदलाव, स्टेजिंग के प्रस्तावों के तौर पर दिखाए जाते हैं. डेटाबेस में बदलाव सिर्फ़ तब होते हैं, जब उपयोगकर्ता साफ़ तौर पर उन्हें स्वीकार करता है.
- तीन लेवल वाली लगातार काम करने वाली मेमोरी: एआई, उपयोगकर्ता से जुड़े तथ्यों को अपने-आप कैप्चर करता है, अपडेट करता है, और मिटाता है. इसमें हमेशा के लिए सेव की गई जानकारी, कुछ समय के लिए सेव की गई जानकारी (टीटीएल के साथ), और कुछ समय के लिए सेव की गई स्थिति से जुड़ी जानकारी शामिल है.
- एक दस्तावेज़ को बारीकी से पढ़ना: डेटा को ऑप्टिमाइज़ किए गए दस्तावेज़ों (जैसे, हफ़्ते के प्लान वाली स्पाइरल नोटबुक और हफ़्ते के चैट बकेट) में व्यवस्थित किया जाता है, ताकि डेटा को पढ़ने में लगने वाले समय को कम किया जा सके और ग़ैर-ज़रूरी क्वेरी को हटाया जा सके.
2. सर्वर एंडपॉइंट और एपीआई कॉन्ट्रैक्ट
हर एंडपॉइंट के लिए, जवाब का सोर्स (
AGENT,DATABASEयाHYBRID) बताना ज़रूरी है. इससे, लागू करने के दौरान एजेंट की मदद से काम करने वाले एंडपॉइंट को सही तरीके से कॉन्फ़िगर किया जा सकता है.
POST /api/coach/chat
- मकसद: एआई निजी ट्रेनर के साथ बातचीत करना, कोचिंग से जुड़े सवालों के जवाब देना, प्रेरणा देना, और कसरत में बदलाव करने के सुझाव देना. इसमें रोज़ाना किए जाने वाले बदलाव और हफ़्ते के हिसाब से किए जाने वाले बदलाव, दोनों शामिल हैं.
- ट्रिगर: उपयोगकर्ता, कोच टैब में कोई मैसेज सबमिट करता है या इनलाइन कॉन्टेक्स्ट के हिसाब से बदलाव करने के सुझाव वाली चिप पर टैप करता है. जैसे, "आर्नल्ड प्रेस को डीबी शोल्डर प्रेस से बदलें".
- जवाब का सोर्स:
AGENT— यह Gemini का इस्तेमाल करता है. इसमें स्ट्रक्चर्ड टूल/फ़ंक्शन कॉलिंग और स्ट्रीमिंग की सुविधाएं शामिल हैं. यह डेटाबेस में सीधे तौर पर बदलाव नहीं करता. यह निगरानी में काम करने वाले एआई मॉडल की समीक्षा के लिए, स्टेज किया गया प्रस्ताव दिखाता है. - हेडर:
Authorization: Bearer <Firebase_ID_Token>,Content-Type: application/json
अनुरोध का पेलोड:
{
"message": "string (user input or selected prompt chip text)",
"context": {
"active_tab": "string (enum: today | week | coach)",
"week_start_date": "string (ISO date YYYY-MM-DD)",
"selected_day": "string (e.g. monday, optional)"
}
}Response Payload:
{
"message": "string (conversational coaching response displayed in chat bubble)",
"proposal": {
"id": "string (unique proposal ID, nullable)",
"type": "string (enum: NONE | UPDATE_DAY | UPDATE_WEEK)",
"target_day": "string (e.g. monday, nullable)",
"summary_diff": "string (concise summary of changes, e.g. 'Swapped Arnold Press ➔ DB Shoulder Press', nullable)",
"data": "map (full proposed workout day object or weekly plan object, nullable)"
},
"memory_mutations": [
{
"operation": "string (enum: CREATE | UPDATE | DELETE)",
"target_tier": "string (enum: tier_1_staples | tier_2_physiological | tier_3_situational)",
"memory_id": "string (required for UPDATE and DELETE)",
"entry": "map (memory payload with fact, category, expires_at, etc., required for CREATE and UPDATE)",
"reason": "string (concise rationale for why memory was mutated)"
}
]
}weekly_chatsमें ड्यूअल-राइट: हर टर्न पर, सर्वरFieldValue.arrayUnion()का इस्तेमाल करके, उपयोगकर्ता के आने वाले मैसेज (text) और कोच के जवाब (text) को/users/{userId}/weekly_chats/{week_start_date}में सेव करता है.- स्टेज्ड म्यूटेशन पैटर्न: यह
/weekly_plansमें तब तक बदलाव किए बिना, सुझाव का पेलोड दिखाता है, जब तक उपयोगकर्ता [प्लान स्वीकार करें] पर टैप नहीं करता. - लगातार अपने-आप मेमोरी मैनेज करना: उपयोगकर्ता की तीन-टियर वाली प्रोफ़ाइल में आइटम बनाने, अपडेट करने या मिटाने के लिए,
memory_mutationsको एमिट करता है.
POST /api/workouts/log
- मकसद: यह टूल, उपयोगकर्ता के पूरे किए गए वर्कआउट सेशन को उसके स्थायी ट्रेनिंग संग्रह में सेव करता है. साथ ही, कुल वॉल्यूम/रेप की गिनती करता है, निजी रिकॉर्ड (पीआर) की जांच करता है, और शेड्यूल किए गए दिन को 'पूरा हो गया' के तौर पर मार्क करता है.
- ट्रिगर: उपयोगकर्ता, कसरत ट्रैक करने वाली स्क्रीन पर "कसरत पूरी करें" पर टैप करता है.
- Response Source:
DATABASE— Cloud Firestore में सीधे डेटाबेस ट्रांज़ैक्शन/राइट.
अनुरोध का पेलोड:
{
"plan_reference": {
"week_start_date": "string (ISO date YYYY-MM-DD)",
"day_of_week": "string (e.g. monday)"
},
"title": "string (e.g. Upper Body Hypertrophy)",
"started_at": "string (ISO timestamp)",
"completed_at": "string (ISO timestamp)",
"duration_seconds": "number (e.g. 3120)",
"exercises_logged": [
{
"exercise_id": "string (canonical slug, e.g. incline-db-bench-press)",
"exercise_name": "string (e.g. Incline DB Bench Press)",
"sets": [
{
"set_number": "number (e.g. 1)",
"weight_lbs": "number (e.g. 60)",
"reps_completed": "number (e.g. 12)",
"completed": "boolean"
}
]
}
],
"user_notes": "string (optional subjective feedback)",
"perceived_exertion": "number (optional 1-10 RPE rating)"
}Response Payload:
{
"success": "boolean",
"log_id": "string (newly created workout log document ID)",
"summary": {
"total_volume_lbs": "number",
"total_sets_completed": "number",
"total_reps_completed": "number"
},
"new_prs": [
{
"exercise_id": "string (canonical slug, e.g. incline-db-bench-press)",
"metric": "string (e.g. '10 Rep Max' or 'Estimated 1RM')",
"value": "string (e.g. '65 lbs' or '105 lbs')"
}
]
}3. Cloud Firestore डेटाबेस आर्किटेक्चर
कलेक्शन: exercises
हायरारकी: रूट कलेक्शन (/exercises/{exercise_id}) • मकसद: कसरत से जुड़ी जानकारी देने वाला स्टैटिक एनसाइक्लोपीडिया. इसमें मल्टीमीडिया, फ़ॉर्म के संकेत, ज़रूरी उपकरण, और निर्देश शामिल हैं.
{
"id": "string (canonical slug matching document ID, e.g. incline-db-bench-press)",
"name": "string (e.g. Incline DB Bench Press)",
"category": "string (e.g. Strength, Hypertrophy, Cardio, Mobility)",
"target_muscles": {
"primary": ["string (e.g. Upper Chest)"],
"secondary": ["string (e.g. Front Deltoids, Triceps)"]
},
"media": {
"video_url": "string (URL to demonstration video)",
"poster_url": "string (URL to video poster / thumbnail image)"
},
"instructions": ["string (step-by-step execution guidance)"],
"form_tips": ["string (critical cues and common pitfalls)"],
"equipment_required": ["string (e.g. Dumbbells, Incline Bench)"]
}कलेक्शन: weekly_plans
हायरारकी: /users/{userId}/weekly_plans/{week_start_date} • मकसद: "स्पाइरल नोटबुक" में, हर हफ़्ते की ट्रेनिंग का पूरा शेड्यूल, खास मेट्रिक, और हर दिन की कसरत की जानकारी होती है.
{
"week_start_date": "string (ISO date YYYY-MM-DD, e.g. 2026-09-07)",
"theme": "string (e.g. Hypertrophy Focus & Upper Body Overload)",
"summary": {
"total_time_minutes": "number (raw minutes, e.g. 180)",
"total_volume_lbs": "number (raw tonnage in lbs, e.g. 38400)",
"frequency": "number (active workout days, e.g. 4)"
},
"suggested_edits": ["string (pre-generated AI prompt suggestion)"],
"days": {
"monday": {
"date": "string (ISO date YYYY-MM-DD)",
"day_of_week": "string (e.g. Monday)",
"is_rest_day": "boolean",
"status": "string (enum: scheduled | completed | skipped)",
"completed_log_id": "string (nullable)",
"completed_at": "string (ISO timestamp, nullable)",
"title": "string (e.g. Upper Body Hypertrophy)",
"focus_tag": "string (e.g. Push & Chest Dominant)",
"duration_minutes": "number",
"estimated_volume_lbs": "number",
"coach_note": "string",
"muscle_focus": [{ "muscle": "string", "intensity": "number (0-100)" }],
"suggested_edits": ["string"],
"blocks": [
{
"label": "string (e.g. Main Compound Block)",
"exercises": [
{
"exercise_id": "string",
"name": "string",
"target_sets": "number",
"target_reps": "string or number",
"rest_seconds": "number"
}
]
}
]
}
}
}कलेक्शन: weekly_chats
क्रम: /users/{userId}/weekly_chats/{week_start_date} • मकसद: "Weekly Chat Bucket" में, ट्रेनिंग के किसी हफ़्ते की पूरी बातचीत का इतिहास होता है. इसे एक ही दस्तावेज़ में पढ़ा जा सकता है.
{
"week_start_date": "string (ISO date YYYY-MM-DD, e.g. 2026-09-07)",
"messages": [
{
"id": "string (unique message ID)",
"sender": "string (enum: user | coach)",
"text": "string (conversational message body)",
"created_at": "timestamp (server timestamp)",
"proposal": {
"id": "string (proposal UID, nullable)",
"type": "string (enum: UPDATE_DAY | UPDATE_WEEK, nullable)",
"target_day": "string (e.g. monday, nullable)",
"summary_diff": "string (nullable)",
"status": "string (enum: pending | accepted | dismissed)",
"data": "map (workout or week snapshot payload, nullable)"
}
}
]
}कलेक्शन: workout_logs
हायरारकी: /users/{userId}/workout_logs/{log_id} • मकसद: पूरे हो चुके वर्कआउट सेशन का स्थायी और न बदलने वाला पुराना संग्रह.
{
"id": "string (document ID)",
"plan_reference": {
"week_start_date": "string (ISO date YYYY-MM-DD)",
"day_of_week": "string (e.g. monday)"
},
"title": "string (e.g. Upper Body Hypertrophy)",
"started_at": "timestamp",
"completed_at": "timestamp",
"duration_seconds": "number",
"summary": {
"total_volume_lbs": "number",
"total_sets_completed": "number",
"total_reps_completed": "number"
},
"exercises_logged": [
{
"exercise_id": "string",
"exercise_name": "string",
"sets": [
{
"set_number": "number",
"weight_lbs": "number",
"reps_completed": "number",
"completed": "boolean"
}
]
}
],
"user_notes": "string (nullable)",
"perceived_exertion": "number (1-10 RPE, nullable)"
}कलेक्शन: user_profiles
हायरारकी: /users/{userId}/profile/main • मकसद: "लिविंग क्लाइंट चार्ट", उपयोगकर्ता की तीन-टियर वाली मेमोरी प्रोफ़ाइल को सेव करता है.
{
"user_id": "string (document owner UID)",
"display_name": "string (e.g. Alex)",
"email": "string (e.g. alex@example.com)",
"preferences": {
"units": "string (enum: lbs | kg)",
"haptics": "boolean",
"sound": "boolean"
},
"equipment_ids": ["string (e.g. 'dumbbells', 'bench_adjustable', 'pull_up_bar')"],
"onboarding_status": "string (enum: not_started | in_progress | completed)",
"created_at": "timestamp",
"tier_1_staples": [
{
"id": "string (e.g. mem_01)",
"category": "string (enum: equipment | preference | goal | chronic_condition)",
"fact": "string (e.g. Home gym with dumbbells up to 50 lbs and adjustable bench)",
"source": "string (e.g. conversational_onboarding | manual_entry)"
}
],
"tier_2_physiological": [
{
"id": "string (e.g. mem_02)",
"body_part": "string (e.g. hamstrings, shoulder)",
"condition": "string (e.g. soreness, acute_fatigue, minor_strain)",
"fact": "string (e.g. Hamstrings are moderately sore from hill sprints)",
"effective_date": "string (ISO date YYYY-MM-DD)",
"expires_at": "timestamp"
}
],
"tier_3_situational": [
{
"id": "string (e.g. mem_03)",
"event": "string (e.g. golf_competition, travel)",
"fact": "string (e.g. Major golf tournament on Saturday; avoid excessive arm/lat fatigue on Friday)",
"week_start_date": "string (ISO date YYYY-MM-DD)",
"expires_at": "timestamp"
}
]
}कलेक्शन: prs
हायरारकी: /users/{userId}/prs/{exercise_slug} • मकसद: इसमें हमेशा के लिए निजी रिकॉर्ड, अनुमानित 1-रेप मैक्स बेंचमार्क, और रेप-स्पेसिफ़िक रिकॉर्ड सेव किए जाते हैं.
{
"exercise_id": "string (canonical slug, e.g. incline-db-bench-press)",
"exercise_name": "string (e.g. Incline DB Bench Press)",
"estimated_1rm": "number (calculated using Brzycki formula, e.g. 105)",
"max_weight_set": {
"weight_lbs": "number (e.g. 80)",
"reps": "number (e.g. 10)",
"achieved_at": "timestamp"
},
"rep_records": {
"10": 80,
"8": 85,
"5": 95
},
"last_updated": "timestamp"
}4. डेटा लाइफ़साइकल और एजेंट पाइपलाइन
4.1 पाइपलाइन 1: कोचिंग, कसरत जनरेट करना, और चरणबद्ध तरीके से बदलाव करना
- उपयोगकर्ता की कार्रवाई: फ़्रीफ़ॉर्म इनपुट सबमिट करना या पहले से जनरेट की गई, कॉन्टेक्स्ट के हिसाब से बदलाव करने वाली चिप पर टैप करना.
- कॉन्टेक्स्ट असेंबली: सर्वर, तीन-टियर वाली ऐक्टिव मेमोरी प्रोफ़ाइल और मौजूदा हफ़्ते के प्लान को वापस लाता है. साथ ही, मेमोरी में मौजूद उन आइटम को हटा देता है जिनकी समयसीमा खत्म हो चुकी है.
- एजेंट का अनुमान: Gemini, स्ट्रक्चर्ड टूल/फ़ंक्शन कॉलिंग का इस्तेमाल करके, प्रॉम्प्ट और कॉन्टेक्स्ट को प्रोसेस करता है.
- ऑटोनॉमस मेमोरी म्यूटेशन: उपयोगकर्ता से जुड़े तथ्यों को
/user_profiles/{userId}पर लागू किया जाता है औरequipment_idsके साथ सिंक किया जाता है. - Staged Proposal Staging: कसरत में सुझाए गए बदलाव,
/weekly_chats/{week_start_date}मेंproposal.status = "pending"के साथ दिखाए जाते हैं. - उपयोगकर्ता का रिज़ॉल्यूशन और पर्सिस्टेंस: [Accept Plan] पर टैप करने से, सुझाया गया डेटा
/weekly_plansमें सेव हो जाता है. साथ ही, सुझाव को"accepted"के तौर पर मार्क कर दिया जाता है.
4.2 पाइपलाइन 2: कसरत करना और उसे संग्रहित करना (ज़मीनी हकीकत)
- लाइव सेशन की रिकॉर्डिंग: क्लाइंट, स्थानीय यूज़र इंटरफ़ेस (यूआई) की स्थिति में, उठाए गए असल वज़न, पूरे किए गए दोहरावों, और पूरा होने के फ़्लैग को ट्रैक करता है.
- सेशन सबमिट करना: क्लाइंट, "कसरत पूरी करें" पर
POST /api/workouts/logको कॉल करता है. - कुल वॉल्यूम का हिसाब लगाना और पुष्टि करना: सर्वर, कुल सेशन वॉल्यूम का हिसाब लगाता है और Brzycki फ़ॉर्मूले का इस्तेमाल करके पीआर की जांच करता है.
- Immutable Persistence: यह
/workout_logsमें एक ऐसा रिकॉर्ड लिखता है जिसमें बदलाव नहीं किया जा सकता. साथ ही,/weekly_plansमें"completed"को मार्क करता है और/prsमें नए पीआर को अपसर्ट करता है.
4.3 पाइपलाइन 3: मेमोरी में अपने-आप डेटा डालने और उसे अमान्य करने की सुविधा
- डेटा इकट्ठा करना: बातचीत के दौरान होने वाले सभी इंटरैक्शन से लगातार तथ्यों को इकट्ठा किया जाता है.
- कैटगरी: टियर 1 (मुख्य, कभी खत्म नहीं होने वाला), टियर 2 (शारीरिक स्थिति, तीन से चार दिन का टीटीएल), टियर 3 (स्थिति के हिसाब से, इवेंट पर आधारित टीटीएल).
- प्रूनिंग और इनवैलिडेशन: समयसीमा खत्म हो चुके आइटम (
current_timestamp > expires_at) को प्रॉम्प्ट के कॉन्टेक्स्ट से फ़िल्टर कर दिया जाता है और बाद में हटा दिया जाता है.
5. Firestore के सुरक्षा नियम और कंपोज़िट इंडेक्स की खास बातें
5.1 सुरक्षा से जुड़े नियम (firestore.rules)
rules_version = '2';
service cloud.firestore {
match /databases/{database}/documents {
match /users/{userId} {
allow read, write: if request.auth != null && request.auth.uid == userId;
match /profile/{document=**} { allow read, write: if request.auth != null && request.auth.uid == userId; }
match /weekly_plans/{planId} { allow read, write: if request.auth != null && request.auth.uid == userId; }
match /weekly_chats/{chatId} { allow read, write: if request.auth != null && request.auth.uid == userId; }
match /prs/{exerciseSlug} { allow read, write: if request.auth != null && request.auth.uid == userId; }
match /workout_logs/{logId} {
allow read, create: if request.auth != null && request.auth.uid == userId;
allow update, delete: if false;
}
}
match /exercises/{exerciseId} {
allow read: if request.auth != null;
allow write: if false;
}
}
}5.2 कंपोज़िट क्वेरी इंडेक्स (firestore.indexes.json)
{
"indexes": [
{
"collectionGroup": "workout_logs",
"queryScope": "COLLECTION",
"fields": [{ "fieldPath": "completed_at", "order": "DESCENDING" }]
},
{
"collectionGroup": "weekly_plans",
"queryScope": "COLLECTION",
"fields": [{ "fieldPath": "week_start_date", "order": "DESCENDING" }]
},
{
"collectionGroup": "prs",
"queryScope": "COLLECTION",
"fields": [{ "fieldPath": "last_updated", "order": "DESCENDING" }]
}
]
}6. बदलावों का लॉग और लॉक किए गए फ़ैसले
| तारीख | कॉम्पोनेंट / फ़ैसला | टाइप | इन्होंने लॉक किया |
|---|---|---|---|
| शुरुआती सेटअप | खाली स्पेसिफ़िकेशन स्कैफ़ोल्ड को शुरू किया गया | सिस्टम सेटअप | टीम |
| 2026-09-04 | Firestore कलेक्शन जोड़े गए: exercises और weekly_plans | स्कीमा | टीम |
| 2026-09-04 | POST /api/coach/chat एंडपॉइंट और chat_messages कलेक्शन जोड़ा गया | एंडपॉइंट और स्कीमा | टीम |
| 2026-09-04 | चैट स्टोरेज को weekly_chats बकेट स्कीमा में फिर से व्यवस्थित किया गया | स्कीमा | टीम |
| 2026-09-04 | POST /api/workouts/log एंडपॉइंट और workout_logs कलेक्शन जोड़ा गया | एंडपॉइंट और स्कीमा | टीम |
| 2026-09-04 | user_profiles के लिए तीन-टियर वाला मेमोरी स्कीमा जोड़ा गया और POST /api/coach/chat को memory_mutations के साथ अपडेट किया गया | एंडपॉइंट और स्कीमा | टीम |
| 2026-09-04 | सेक्शन 1 (सिस्टम का दायरा और सिद्धांत) और सेक्शन 4 (डेटा लाइफ़साइकल और पाइपलाइन) पूरा किया | पूरी जानकारी देना | टीम |
| 2026-09-22 | एक जैसे स्पेसिफ़िकेशन: Next.js + Tailwind + Zustand स्टैक, Bearer auth, पीआर सब-कलेक्शन, Firestore के नियम, और कैननिकल एक्सरसाइज़ स्लग | खास जानकारी के मुताबिक रंगों का संतुलन | आर्किटेक्चर की समीक्षा |