From 28d8e61fb34c0b0ce1dc8540811a019fe810ce78 Mon Sep 17 00:00:00 2001 From: sina_sajjadi Date: Wed, 1 Jul 2026 19:18:57 +0330 Subject: [PATCH] feat: implement marriage onboarding progress tracking with new types, helpers, and UI components --- public/openapi.json | 2 +- src/app/questions-list/page.tsx | 57 ++++++++---- src/components/questions/progress-helper.ts | 89 +++++++++++++++++++ .../questions/question-answer-storage.tsx | 4 +- .../questions/required-steps-card.tsx | 15 ++-- src/data/section-slug-map.ts | 8 +- src/hooks/marriage/types.ts | 1 + src/i18n/locales/en/questions.json | 6 +- src/i18n/locales/fa/questions.json | 6 +- 9 files changed, 154 insertions(+), 34 deletions(-) create mode 100644 src/components/questions/progress-helper.ts diff --git a/public/openapi.json b/public/openapi.json index 54e3064..92c6935 100644 --- a/public/openapi.json +++ b/public/openapi.json @@ -1 +1 @@ -{"swagger": "2.0", "info": {"title": "Snippets API", "description": "Project API Documentation", "termsOfService": "https://www.google.com/policies/terms/", "contact": {"email": "nwhco.com"}, "license": {"name": "BSD License"}, "version": "v1"}, "host": "habibapp.com", "schemes": ["https"], "basePath": "/", "consumes": ["application/json"], "produces": ["application/json"], "securityDefinitions": {"Basic": {"type": "basic"}}, "security": [{"Basic": []}], "paths": {"/about-service/": {"get": {"operationId": "about-service_list", "description": "-- params: service", "parameters": [{"name": "limit", "in": "query", "description": "Number of results to return per page.", "required": false, "type": "integer"}, {"name": "offset", "in": "query", "description": "The initial index from which to return the results.", "required": false, "type": "integer"}, {"name": "service", "in": "query", "description": "Service type to filter by", "type": "string", "enum": ["main", "hussainiyah", "quran", "mafatih", "qiblah", "ahkam", "calendar", "talk", "meet", "library", "hadis", "account"]}], "responses": {"200": {"description": "", "schema": {"required": ["count", "results"], "type": "object", "properties": {"count": {"type": "integer"}, "next": {"type": "string", "format": "uri", "x-nullable": true}, "previous": {"type": "string", "format": "uri", "x-nullable": true}, "results": {"type": "array", "items": {"$ref": "#/definitions/AboutService"}}}}}}, "tags": ["about-service"]}, "parameters": []}, "/account/activity/create/": {"post": {"operationId": "account_activity_create_create", "description": "", "parameters": [{"name": "data", "in": "body", "required": true, "schema": {"$ref": "#/definitions/Activity"}}], "responses": {"201": {"description": "", "schema": {"$ref": "#/definitions/Activity"}}}, "tags": ["account"]}, "parameters": []}, "/account/auth/apple/": {"post": {"operationId": "account_auth_apple_create", "description": "", "parameters": [{"name": "data", "in": "body", "required": true, "schema": {"$ref": "#/definitions/AppleAuth"}}], "responses": {"201": {"description": "", "schema": {"$ref": "#/definitions/AppleAuth"}}}, "tags": ["account"]}, "parameters": []}, "/account/auth/google/": {"post": {"operationId": "account_auth_google_create", "description": "", "parameters": [{"name": "data", "in": "body", "required": true, "schema": {"$ref": "#/definitions/GoogleAuth"}}], "responses": {"201": {"description": "", "schema": {"$ref": "#/definitions/GoogleAuth"}}}, "tags": ["account"]}, "parameters": []}, "/account/auth/guest/": {"post": {"operationId": "account_auth_guest_create", "description": "\n### Guest Authentication API\n\nThis API is invoked during the app's intro phase to authenticate guest users. It collects device information\nand performs authentication based on the provided data. \n\n| **Field** | **Type** | **Required** | **Description** |\n|---------------------|------------|--------------|----------------------------------------|\n| `auth_method` | String | No | phone or third_party |\n| `country_code` | int | No | phone country code |\n\n#### Response:\n- **200 OK**: Returns `token`, `auth_method`, and `country_code`.\n- **400 Bad Request**: Input validation failed.\n- **500 Internal Server Error**: Unexpected error.\n\n#### Example Response:\n\n```json\n{\n \"token\": \"1e126d575f3e37d5f8f0fd5a893fae90a7511c25\",\n \"auth_method\": \"phone\",\n \"country_code\": 964\n},\n{\n \"token\": \"1e126d575f3e37d5f8f0fd5a893fae90a7511c25\",\n \"auth_method\": \"third_party\",\n \"country_code\": 964\n}\n```\n", "parameters": [{"name": "data", "in": "body", "required": true, "schema": {"$ref": "#/definitions/GuestUser"}}], "responses": {"201": {"description": "", "schema": {"$ref": "#/definitions/GuestUser"}}}, "tags": ["account"]}, "parameters": []}, "/account/auth/logout/": {"post": {"operationId": "account_auth_logout_create", "description": "\n### User Logout API\n\nThis API endpoint allows authenticated users to securely log out from the application. The logout process\nclears the user's FCM (Firebase Cloud Messaging) token to ensure they no longer receive push notifications\non the logged-out device.\n\n#### Key Features:\n- **Authentication Required**: Only authenticated users can access this endpoint\n- **FCM Token Clearing**: Automatically clears the user's FCM token to stop push notifications\n- **Secure Logout**: Provides a clean logout process following REST API best practices\n- **Error Handling**: Comprehensive error handling with appropriate HTTP status codes\n\n#### Business Logic:\n1. **Authentication Check**: Verifies that the user is properly authenticated via token\n2. **FCM Token Cleanup**: Sets the user's FCM token field to null/empty\n3. **Database Update**: Saves the user record with the cleared FCM token\n4. **Response Generation**: Returns appropriate success or error response\n\n#### Authentication:\n- **Required**: Yes\n- **Method**: Token-based authentication\n- **Header**: `Authorization: Token `\n\n#### HTTP Method:\n- **POST**: Used for logout action (following REST conventions for state-changing operations)\n\n#### Request Headers:\n| **Header** | **Type** | **Required** | **Description** |\n|-------------------|------------|--------------|-----------------------------------|\n| `Authorization` | String | Yes | Token |\n| `Content-Type` | String | Yes | application/json |\n\n#### Response Codes:\n- **200 OK**: Logout successful, FCM token cleared\n- **401 Unauthorized**: Authentication credentials not provided or invalid\n- **500 Internal Server Error**: Unexpected server error during logout\n\n#### Success Response Example:\n```json\n{\n \"status\": \"success\",\n \"message\": \"Logged out successfully\"\n}\n```\n\n#### Error Response Examples:\n\n**401 Unauthorized:**\n```json\n{\n \"detail\": \"Authentication credentials were not provided.\"\n}\n```\n\n**500 Internal Server Error:**\n```json\n{\n \"status\": \"error\",\n \"message\": \"An error occurred during logout\"\n}\n```\n\n#### Usage Example:\n```bash\ncurl -X POST https://api.example.com/auth/logout/ \\\n -H \"Authorization: Token 516e059d2a6b31d74b6a9e4c8f98fe4e8413efbc\" \\\n -H \"Content-Type: application/json\"\n```\n\n#### Security Considerations:\n- The FCM token is immediately cleared to prevent unauthorized push notifications\n- The authentication token remains valid until explicitly deleted or expired\n- Users should clear local storage/cache on the client side after successful logout\n- Consider implementing token blacklisting for enhanced security if needed\n\n#### Integration Notes:\n- After successful logout, clients should redirect users to the login screen\n- Clear any locally stored user data and authentication tokens\n- Stop any background services that depend on user authentication\n- Update UI state to reflect the logged-out status\n", "parameters": [], "responses": {"200": {"description": "Logout successful", "examples": {"application/json": {"status": "success", "message": "Logged out successfully"}}}, "401": {"description": "Authentication required", "examples": {"application/json": {"detail": "Authentication credentials were not provided."}}}, "500": {"description": "Internal server error", "examples": {"application/json": {"status": "error", "message": "An error occurred during logout"}}}}, "tags": ["account"]}, "parameters": []}, "/account/auth/phone/": {"post": {"operationId": "account_auth_phone_create", "description": "\n### Phone Authentication API\n\nThis API allows users to authenticate by providing a phone number. A one-time password (OTP) is sent to the\nuser via the specified method, and the response indicates whether the OTP was successfully sent.\n\n#### Response:\n- **200 OK**: Returns user ID, phone number, verification method, OTP send status, and time limit for resending the OTP.\n- **400 Bad Request**: Input validation failed.\n- **500 Internal Server Error**: Unexpected error occurred.\n\n#### Output Fields:\n\n| **Field** | **Type** | **Description** |\n|---------------------------|------------|----------------------------------------------------------|\n| `user_id` | String | Unique identifier of the authenticated user. |\n| `phone_number` | String | The phone number used for authentication. |\n| `verification_method` | String | Method used to send the OTP (e.g., \"SMS\" or \"WHATSAPP\").|\n| `verification_time_limit` | Integer | Time (in minutes) until the OTP can be resent. |\n| `is_send` | Boolean | Indicates whether the OTP was successfully sent. |\n\n#### Example Response:\n\n```json\n{\n \"user_id\": \"1a2b3c4d\",\n \"phone_number\": \"+1234567890\",\n \"verification_method\": \"WHATSAPP\",\n \"verification_time_limit\": 5,\n \"is_send\": true\n}\n```\n", "parameters": [{"name": "data", "in": "body", "required": true, "schema": {"$ref": "#/definitions/PhoneAuth"}}], "responses": {"201": {"description": "", "schema": {"$ref": "#/definitions/PhoneAuth"}}}, "tags": ["account"]}, "parameters": []}, "/account/auth/staff/login/": {"post": {"operationId": "account_auth_staff_login_create", "summary": "Email/password login for staff, admin and superuser accounts.", "description": "Returns a DRF auth token (the same token type used everywhere else in the\nproject, see ``TokenAuthentication2``) so the dashboard can authenticate\nsubsequent requests with ``Authorization: Token ``.\n\nOpen to anonymous callers (``AllowAny``) — the staff check happens inside\nthe serializer; only an account with ``is_staff``/``is_superuser`` and a\ncorrect password gets a token back.", "parameters": [{"name": "data", "in": "body", "required": true, "schema": {"required": ["email", "password"], "type": "object", "properties": {"email": {"type": "string", "format": "email"}, "password": {"type": "string", "format": "password"}}}}], "responses": {"200": {"description": "Authenticated", "schema": {"type": "object", "properties": {"token": {"type": "string"}, "user_id": {"type": "integer"}, "email": {"type": "string"}, "name": {"type": "string"}, "is_staff": {"type": "boolean"}, "is_superuser": {"type": "boolean"}}}}, "400": {"description": "Invalid credentials or not a staff account"}}, "tags": ["account"]}, "parameters": []}, "/account/auth/user/me/": {"get": {"operationId": "account_auth_user_me_list", "description": "این متد اطلاعات کاربر را برمی‌گرداند", "parameters": [], "responses": {"200": {"description": "اطلاعات کاربر", "examples": {"application/json": {"user_id": "ایدی کاربر", "name": "نام کاربر", "email": "ایمیل کاربر", "avatar": "آدرس آواتار", "country": "کشور", "city": "شهر", "phone_number": "شماره تلفن", "possible_phone_number": "شماره تماس احتمالی کاربر", "is_phone_number_verified": "شماره تماس تایید شده باشد", "date_joined": "تاریخ عضویت", "publisher_in": "اطلاعات ناشر", "settings": "تنظیمات کاربر", "provider": "اطلاعات ارائه‌دهنده", "coin_balance": "موجودی کوین ها", "balance_in_dollars": "مقدار دلار کاربر (اگر پرووایدر نباشد خالی است)", "notification_count": "تعداد نوتیفیکیشن‌ها", "bucket_services": "لیست سرویس باکت های کاربر"}}}}, "tags": ["account"]}, "parameters": []}, "/account/auth/user/merge/": {"post": {"operationId": "account_auth_user_merge_create", "description": "", "parameters": [{"name": "data", "in": "body", "required": true, "schema": {"$ref": "#/definitions/MergeAccount"}}], "responses": {"201": {"description": "", "schema": {"$ref": "#/definitions/MergeAccount"}}}, "tags": ["account"]}, "parameters": []}, "/account/auth/user/merge/phone/info/": {"get": {"operationId": "account_auth_user_merge_phone_info_list", "description": "", "parameters": [{"name": "limit", "in": "query", "description": "Number of results to return per page.", "required": false, "type": "integer"}, {"name": "offset", "in": "query", "description": "The initial index from which to return the results.", "required": false, "type": "integer"}], "responses": {"200": {"description": ""}}, "tags": ["account"]}, "parameters": []}, "/account/auth/user/merge/phone/verify/": {"post": {"operationId": "account_auth_user_merge_phone_verify_create", "description": "", "parameters": [{"name": "data", "in": "body", "required": true, "schema": {"$ref": "#/definitions/MergeVerify"}}], "responses": {"201": {"description": "", "schema": {"$ref": "#/definitions/MergeVerify"}}}, "tags": ["account"]}, "parameters": []}, "/account/auth/user/profile/update/": {"put": {"operationId": "account_auth_user_profile_update_update", "description": "", "parameters": [{"name": "data", "in": "body", "required": true, "schema": {"$ref": "#/definitions/UserProfile"}}], "responses": {"200": {"description": "", "schema": {"$ref": "#/definitions/UserProfile"}}}, "tags": ["account"]}, "patch": {"operationId": "account_auth_user_profile_update_partial_update", "description": "", "parameters": [{"name": "data", "in": "body", "required": true, "schema": {"$ref": "#/definitions/UserProfile"}}], "responses": {"200": {"description": "", "schema": {"$ref": "#/definitions/UserProfile"}}}, "tags": ["account"]}, "parameters": []}, "/account/auth/user/region/": {"get": {"operationId": "account_auth_user_region_list", "description": "", "parameters": [{"name": "limit", "in": "query", "description": "Number of results to return per page.", "required": false, "type": "integer"}, {"name": "offset", "in": "query", "description": "The initial index from which to return the results.", "required": false, "type": "integer"}], "responses": {"200": {"description": ""}}, "tags": ["account"]}, "parameters": []}, "/account/auth/verify/": {"post": {"operationId": "account_auth_verify_create", "description": "\n### Phone Verification Logic\n\nThe phone verification process ensures user authenticity through a one-time verification code. Below is the streamlined flow:\n\n1. **Input Validation **:\n - Accepts `user_id`, `phone_number`, and a 5-digit `code`.\n - Validates input and raises errors for missing or invalid data.\n\n2. **User Retrieval**:\n - Fetch the user using `user_id`.\n - Raise an error if the user does not exist.\n\n3. **Verification Data Fetch**:\n - Retrieve the verification data from Redis using `phone_number`.\n - Raise an error if data is missing or expired.\n\n4. **Code Comparison**:\n - Compare the provided `code` with the one in Redis.\n - Raise an error for mismatched codes.\n\n5. **User Update**:\n - On success, update the user's `phone_number` and mark them as verified.\n\n6. **Response Generation**:\n - Return an authentication token along with user profile details (e.g., name, email, location, settings).\n\n#### Failure Scenarios:\n- Errors are raised for invalid input, missing verification data, or incorrect codes.\n\nThis process ensures secure and efficient phone verification.\n", "parameters": [{"name": "data", "in": "body", "required": true, "schema": {"$ref": "#/definitions/PhoneVerify"}}], "responses": {"201": {"description": "", "schema": {"$ref": "#/definitions/PhoneVerify"}}}, "tags": ["account"]}, "parameters": []}, "/account/auth/{device_id}/update/": {"put": {"operationId": "account_auth_update_update", "description": "", "parameters": [{"name": "data", "in": "body", "required": true, "schema": {"$ref": "#/definitions/GuestUser"}}], "responses": {"200": {"description": "", "schema": {"$ref": "#/definitions/GuestUser"}}}, "tags": ["account"]}, "patch": {"operationId": "account_auth_update_partial_update", "description": "", "parameters": [{"name": "data", "in": "body", "required": true, "schema": {"$ref": "#/definitions/GuestUser"}}], "responses": {"200": {"description": "", "schema": {"$ref": "#/definitions/GuestUser"}}}, "tags": ["account"]}, "parameters": [{"name": "device_id", "in": "path", "required": true, "type": "string"}]}, "/account/bucket/update/": {"get": {"operationId": "account_bucket_update_list", "description": "Remove a service from user's bucket services", "parameters": [{"name": "limit", "in": "query", "description": "Number of results to return per page.", "required": false, "type": "integer"}, {"name": "offset", "in": "query", "description": "The initial index from which to return the results.", "required": false, "type": "integer"}, {"name": "service", "in": "query", "description": "Service name to remove from bucket services", "required": false, "type": "string"}], "responses": {"200": {"description": "Service removed successfully from bucket services", "examples": {"application/json": {"message": "Successfully updated"}}}, "400": {"description": "Bad request"}, "401": {"description": "Authentication credentials were not provided"}}, "tags": ["account"]}, "parameters": []}, "/account/delete-account/": {"post": {"operationId": "account_delete-account_create", "description": "", "parameters": [], "responses": {"201": {"description": ""}}, "tags": ["account"]}, "parameters": []}, "/account/geolocation/": {"get": {"operationId": "account_geolocation_list", "description": "Get geolocation information based on the client's IP address", "parameters": [], "responses": {"200": {"description": "Geolocation information", "schema": {"$ref": "#/definitions/IPGeolocation"}}, "404": {"description": "IP address not found in database or database not available"}, "500": {"description": "Internal server error"}}, "tags": ["account"]}, "parameters": []}, "/account/geolocation/coordinates/": {"get": {"operationId": "account_geolocation_coordinates_list", "description": "Get location information (city, country) based on geographic coordinates using reverse geocoding", "parameters": [{"name": "lat", "in": "query", "description": "Latitude coordinate (-90 to 90)", "required": true, "type": "number"}, {"name": "lon", "in": "query", "description": "Longitude coordinate (-180 to 180)", "required": true, "type": "number"}], "responses": {"200": {"description": "Location information", "schema": {"$ref": "#/definitions/ReverseGeolocationResponse"}}, "400": {"description": "Invalid or missing coordinates"}, "404": {"description": "No location found for the given coordinates"}, "500": {"description": "Internal server error"}}, "tags": ["account"]}, "parameters": []}, "/account/location-update/": {"post": {"operationId": "account_location-update_create", "description": "", "parameters": [{"name": "data", "in": "body", "required": true, "schema": {"$ref": "#/definitions/LocationHistory"}}], "responses": {"201": {"description": "", "schema": {"$ref": "#/definitions/LocationHistory"}}}, "tags": ["account"]}, "parameters": []}, "/account/notif-list/": {"get": {"operationId": "account_notif-list_list", "description": "### Example JSON Response:\n```json\n{\n \"count\": 36,\n \"next\": \"https://habibapp.com/account/notif-list/?limit=16&offset=16\",\n \"previous\": null,\n \"results\": [\n {\n \"id\": 126753,\n \"service\": \"mafatih\",\n \"title\": \"اللهم عجل لولیک الفرج\",\n \"message\": \"خواهر یا اخوان،\",\n \"data\": \"4450\",\n \"image\": null,\n \"is_read\": true,\n \"created_at\": \"2024-10-06T14:39:32.893330\"\n }\n ]\n}\n```", "parameters": [{"name": "limit", "in": "query", "description": "Number of results to return per page.", "required": false, "type": "integer"}, {"name": "offset", "in": "query", "description": "The initial index from which to return the results.", "required": false, "type": "integer"}, {"name": "service", "in": "query", "description": "Specify the service to filter messages (optional).", "required": false, "type": "string", "enum": ["hussainiya", "library", "talk", "meet", "mafatih", "hadis", "khatm", "quran", "tafsir", "ahkam", "coin", "global"]}], "responses": {"200": {"description": "", "schema": {"required": ["count", "results"], "type": "object", "properties": {"count": {"type": "integer"}, "next": {"type": "string", "format": "uri", "x-nullable": true}, "previous": {"type": "string", "format": "uri", "x-nullable": true}, "results": {"type": "array", "items": {"$ref": "#/definitions/UserNotification"}}}}}}, "tags": ["notification"]}, "parameters": []}, "/account/provider/requests/": {"get": {"operationId": "account_provider_requests_list", "description": "", "parameters": [{"name": "limit", "in": "query", "description": "Number of results to return per page.", "required": false, "type": "integer"}, {"name": "offset", "in": "query", "description": "The initial index from which to return the results.", "required": false, "type": "integer"}], "responses": {"200": {"description": "", "schema": {"required": ["count", "results"], "type": "object", "properties": {"count": {"type": "integer"}, "next": {"type": "string", "format": "uri", "x-nullable": true}, "previous": {"type": "string", "format": "uri", "x-nullable": true}, "results": {"type": "array", "items": {"$ref": "#/definitions/Provider"}}}}}}, "tags": ["account"]}, "post": {"operationId": "account_provider_requests_create", "description": "", "parameters": [{"name": "data", "in": "body", "required": true, "schema": {"$ref": "#/definitions/Provider"}}], "responses": {"201": {"description": "", "schema": {"$ref": "#/definitions/Provider"}}}, "tags": ["account"]}, "parameters": []}, "/account/read-all-notif/": {"get": {"operationId": "account_read-all-notif_list", "description": "", "parameters": [{"name": "service", "in": "query", "description": "Specify the service to filter messages (optional). If omitted, all messages for the user will be marked as read.", "required": false, "type": "string", "enum": ["hussainiya", "library", "talk", "meet", "mafatih", "hadis", "khatm", "quran", "tafsir", "ahkam", "coin", "global", "null"]}, {"name": "value_id", "in": "query", "description": "value_id optional parameter to mark a specific message as read.(value id notificaiton)", "required": false, "type": "string"}], "responses": {"200": {"description": "Messages marked as read"}, "400": {"description": "Service parameter is required"}}, "tags": ["notification"]}, "parameters": []}, "/account/send-notification/": {"post": {"operationId": "account_send-notification_create", "description": "", "parameters": [{"name": "data", "in": "body", "required": true, "schema": {"description": "Send notification to authenticated user with flexible payload options:\n\n 1. Regular notification: Provide title and message\n 2. Data-only notification: Omit title and message, provide data_notif\n 3. Custom payload: Set use_custom_payload=true to send data_notif keys directly in Firebase payload\n\n When use_custom_payload=true, you can test full FCM payload structure including Android-specific configurations.", "required": [], "type": "object", "properties": {"title": {"description": "Notification title (optional - if both title and message are omitted, sends data-only notification)", "type": "string"}, "message": {"description": "Notification message (optional - if both title and message are omitted, sends data-only notification)", "type": "string"}, "data_notif": {"description": "Additional data to send with notification (can be object or JSON string)", "type": "object"}, "use_custom_payload": {"description": "If true, all keys from data_notif will be placed directly in the Firebase payload message object", "type": "boolean", "default": false}}}}], "responses": {"200": {"description": "Notification sent successfully", "schema": {"type": "object", "properties": {"result": {"description": "FCM response result", "type": "array", "items": {"type": "object"}}}}}, "400": {"description": "Bad request - invalid data_notif format"}, "404": {"description": "User not found"}}, "tags": ["notification"]}, "parameters": []}, "/account/settings/": {"put": {"operationId": "account_settings_update", "description": "", "parameters": [{"name": "data", "in": "body", "required": true, "schema": {"$ref": "#/definitions/UserSettings"}}], "responses": {"200": {"description": "", "schema": {"$ref": "#/definitions/UserSettings"}}}, "tags": ["account"]}, "patch": {"operationId": "account_settings_partial_update", "description": "", "parameters": [{"name": "data", "in": "body", "required": true, "schema": {"$ref": "#/definitions/UserSettings"}}], "responses": {"200": {"description": "", "schema": {"$ref": "#/definitions/UserSettings"}}}, "tags": ["account"]}, "parameters": []}, "/api/chat-producer/": {"post": {"operationId": "api_chat-producer_create", "description": "API producer for chat application", "parameters": [], "responses": {"201": {"description": ""}}, "tags": ["Talk"]}, "parameters": []}, "/api/crm/reviews/": {"get": {"operationId": "api_crm_reviews_list", "description": "", "parameters": [{"name": "platform", "in": "query", "description": "", "required": false, "type": "string"}, {"name": "needs_human_intervention", "in": "query", "description": "", "required": false, "type": "string"}, {"name": "review_status", "in": "query", "description": "", "required": false, "type": "string"}, {"name": "ordering", "in": "query", "description": "Which field to use when ordering the results.", "required": false, "type": "string"}, {"name": "search", "in": "query", "description": "A search term.", "required": false, "type": "string"}, {"name": "limit", "in": "query", "description": "Number of results to return per page.", "required": false, "type": "integer"}, {"name": "offset", "in": "query", "description": "The initial index from which to return the results.", "required": false, "type": "integer"}], "responses": {"200": {"description": "", "schema": {"required": ["count", "results"], "type": "object", "properties": {"count": {"type": "integer"}, "next": {"type": "string", "format": "uri", "x-nullable": true}, "previous": {"type": "string", "format": "uri", "x-nullable": true}, "results": {"type": "array", "items": {"$ref": "#/definitions/ReviewList"}}}}}}, "tags": ["api"]}, "post": {"operationId": "api_crm_reviews_create", "description": "", "parameters": [{"name": "data", "in": "body", "required": true, "schema": {"$ref": "#/definitions/ReviewDetail"}}], "responses": {"201": {"description": "", "schema": {"$ref": "#/definitions/ReviewDetail"}}}, "tags": ["api"]}, "parameters": []}, "/api/crm/reviews/{id}/": {"get": {"operationId": "api_crm_reviews_read", "description": "", "parameters": [], "responses": {"200": {"description": "", "schema": {"$ref": "#/definitions/ReviewDetail"}}}, "tags": ["api"]}, "put": {"operationId": "api_crm_reviews_update", "description": "", "parameters": [{"name": "data", "in": "body", "required": true, "schema": {"$ref": "#/definitions/ReviewDetail"}}], "responses": {"200": {"description": "", "schema": {"$ref": "#/definitions/ReviewDetail"}}}, "tags": ["api"]}, "patch": {"operationId": "api_crm_reviews_partial_update", "description": "", "parameters": [{"name": "data", "in": "body", "required": true, "schema": {"$ref": "#/definitions/ReviewDetail"}}], "responses": {"200": {"description": "", "schema": {"$ref": "#/definitions/ReviewDetail"}}}, "tags": ["api"]}, "delete": {"operationId": "api_crm_reviews_delete", "description": "", "parameters": [], "responses": {"204": {"description": ""}}, "tags": ["api"]}, "parameters": [{"name": "id", "in": "path", "required": true, "type": "string"}]}, "/api/crm/reviews/{id}/edit_reply/": {"patch": {"operationId": "api_crm_reviews_edit_reply", "description": "", "parameters": [{"name": "data", "in": "body", "required": true, "schema": {"$ref": "#/definitions/ReviewDetail"}}], "responses": {"200": {"description": "", "schema": {"$ref": "#/definitions/ReviewDetail"}}}, "tags": ["api"]}, "parameters": [{"name": "id", "in": "path", "required": true, "type": "string"}]}, "/api/crm/reviews/{id}/reply/": {"post": {"operationId": "api_crm_reviews_reply", "description": "", "parameters": [{"name": "data", "in": "body", "required": true, "schema": {"$ref": "#/definitions/ReviewDetail"}}], "responses": {"201": {"description": "", "schema": {"$ref": "#/definitions/ReviewDetail"}}}, "tags": ["api"]}, "parameters": [{"name": "id", "in": "path", "required": true, "type": "string"}]}, "/api/marriage/cases/{case_id}/contact-info/": {"get": {"operationId": "api_marriage_cases_contact-info_list", "description": "\nدریافت اطلاعات تماس خانم پس از پرداخت\n\nپس از تأیید پرداخت (وضعیت payment_done)، آقا می‌تواند اطلاعات تماس\nمجاز خانم را دریافت کند.\n\nشرایط دسترسی:\n - کاربر (آقا یا خانم) باید عضو این کیس باشد\n - وضعیت کیس باید دقیقاً payment_done باشد\n\nاطلاعات تماس قابل‌نمایش توسط ادمین از طریق فیلد female_contact_keys در کیس\nبرای هر کیس به‌صورت اختصاصی تنظیم می‌شود.\nمثال کلیدهای رایج: phone_father, phone_self, address\n\nخروجی: لیستی از فیلدهای فرم با کلید، برچسب، نوع و مقدار واقعی\n", "parameters": [], "responses": {"200": {"description": "ادمین هنوز هیچ کلید تماسی برای این کیس تنظیم نکرده", "examples": {"application/json": {"contact_info": []}}}, "403": {"description": "دسترسی ندارید یا کیس هنوز payment_done نیست", "examples": {"application/json": {"detail": "اطلاعات تماس فقط پس از تأیید پرداخت در دسترس است."}}}, "401": {"description": "کاربر احراز هویت نشده است"}, "404": {"description": "کیس یافت نشد"}}, "tags": ["Marriage"]}, "parameters": [{"name": "case_id", "in": "path", "required": true, "type": "string"}]}, "/api/marriage/cases/{case_id}/contact-status/": {"post": {"operationId": "api_marriage_cases_contact-status_create", "description": "\nگزارش وضعیت تماس پس از دریافت اطلاعات — فقط توسط خانم\n\nخانم پس از دریافت اطلاعات تماس آقا (پس از payment_done) باید در مهلت ۴۸ ساعت\nوضعیت تماس را گزارش دهد. کنترل زمان ۴۸ ساعت در کلاینت انجام می‌شود.\n\nزمان اشتراک‌گذاری اطلاعات تماس از فیلد `contact_shared_at` در `active_case` قابل دسترسی است.\n\nپیش‌شرط:\n - فقط خانم می‌تواند این اندپوینت را فراخوانی کند\n - وضعیت کیس باید payment_done باشد\n\nمنطق:\n contacted →\n وضعیت کیس: payment_done → finalized\n هر دو پروفایل: in_case → matched\n reason_code و custom_note (اگر ارسال شده باشند) در CaseRejection ذخیره می‌شوند\n (کیس با موفقیت به نتیجه رسید)\n\n no_contact →\n جریمه time_suspend برای آقا ثبت می‌شود (۷ روز تعلیق)\n وضعیت کیس: payment_done → dismissed\n reason_code و custom_note در CaseRejection ذخیره می‌شوند\n پروفایل آقا: in_case → suspended (+ penalty_until تنظیم می‌شود)\n پروفایل خانم: in_case → waiting (آزاد برای کیس جدید)\n", "parameters": [{"name": "data", "in": "body", "required": true, "schema": {"required": ["action"], "type": "object", "properties": {"action": {"description": "contacted: آقا تماس گرفت | no_contact: آقا تماس نگرفت", "type": "string", "enum": ["contacted", "no_contact"]}, "reason_code": {"description": "کد دلیل (اختیاری) — مثال: no_call_received, wrong_number", "type": "string"}, "custom_note": {"description": "توضیح اضافه (اختیاری)", "type": "string"}}, "example": {"action": "no_contact", "reason_code": "no_call_received", "custom_note": "48 ساعت گذشته ولی تماسی نگرفت"}}}], "responses": {"200": {"description": "وضعیت تماس ثبت شد — حالت no_contact (جریمه اعمال شد، status در database dismissed است اما در response male_accepted نمایش داده می‌شود)", "examples": {"application/json": {"detail": "عدم تماس ثبت شد. جریمه اعمال گردید.", "case": {"id": 15, "status": "male_accepted", "introduced_at": "2026-04-20T08:30:00Z", "male_responded_at": "2026-04-20T10:15:00Z", "female_responded_at": "2026-04-21T09:00:00Z", "payment_done_at": "2026-04-21T09:00:00Z", "contact_shared_at": "2026-04-21T09:00:00Z"}}}}, "400": {"description": "وضعیت کیس برای این عملیات مناسب نیست", "examples": {"application/json": {"detail": "وضعیت کیس برای این عملیات مناسب نیست."}}}, "403": {"description": "فقط خانم می‌تواند این عملیات را انجام دهد", "examples": {"application/json": {"detail": "فقط خانم می‌تواند وضعیت تماس را گزارش دهد."}}}, "401": {"description": "کاربر احراز هویت نشده است"}, "404": {"description": "کیس یافت نشد"}}, "tags": ["Marriage"]}, "parameters": [{"name": "case_id", "in": "path", "required": true, "type": "string"}]}, "/api/marriage/cases/{case_id}/respond/": {"post": {"operationId": "api_marriage_cases_respond_create", "description": "\nپاسخ به کیس معرفی (تأیید یا رد)\n\nآقا یا خانم می‌توانند کیس پیشنهادی را تأیید یا رد کنند.\n\nمنطق انتقال وضعیت:\n\nآقا (وقتی کیس در introduced است):\n accept → male_accepted (اطلاعات عمومی خانم برای آقا قابل مشاهده می‌شود)\n reject → male_rejected (هر دو پروفایل به waiting برمی‌گردند)\n\nخانم (وقتی کیس در male_accepted است):\n accept →\n اگر آقا اشتراک معتبر دارد: payment_done (مستقیم — consume_usage فراخوانی می‌شود)\n اگر آقا اشتراک ندارد: payment_pending (نیاز به خرید اشتراک)\n **توجه:** در response، status به `male_accepted` تبدیل می‌شود و جزئیات پرداخت از `needs_subscription` مشخص می‌شود\n reject → female_rejected (هر دو پروفایل به waiting برمی‌گردند)\n\nreason_code: کدهای هاردکد‌شده در فرانت‌اند — مثال: not_matched_financially, changed_mind\ncustom_note: توضیح اضافه اختیاری\n", "parameters": [{"name": "data", "in": "body", "required": true, "schema": {"required": ["action"], "type": "object", "properties": {"action": {"description": "تأیید یا رد کیس", "type": "string", "enum": ["accept", "reject"]}, "reason_code": {"description": "کد دلیل رد (اختیاری) — مثال: not_matched_financially", "type": "string", "default": ""}, "custom_note": {"description": "توضیح اضافه (اختیاری)", "type": "string", "default": ""}}, "example": {"action": "reject", "reason_code": "not_matched_financially", "custom_note": "از نظر مالی تناسب نداشتیم"}}}], "responses": {"200": {"description": "آقا تأیید کرد و خانم هم تأیید کرد — در database به payment_done می‌رود اما در response male_accepted نمایش داده می‌شود", "examples": {"application/json": {"detail": "پاسخ شما با موفقیت ثبت شد.", "case": {"id": 15, "status": "male_accepted", "introduced_at": "2026-04-20T08:30:00Z", "male_responded_at": "2026-04-20T10:15:00Z", "female_responded_at": "2026-04-21T09:00:00Z", "payment_done_at": "2026-04-21T09:00:00Z", "contact_shared_at": "2026-04-21T09:00:00Z"}}}}, "400": {"description": "وضعیت کیس برای این عملیات مناسب نیست", "examples": {"application/json": {"detail": "وضعیت کیس برای این عملیات مناسب نیست."}}}, "403": {"description": "کاربر عضو این کیس نیست", "examples": {"application/json": {"detail": "شما به این کیس دسترسی ندارید."}}}, "401": {"description": "کاربر احراز هویت نشده است"}, "404": {"description": "کیس یافت نشد"}}, "tags": ["Marriage"]}, "parameters": [{"name": "case_id", "in": "path", "required": true, "type": "string"}]}, "/api/marriage/match/start/": {"post": {"operationId": "api_marriage_match_start_create", "description": "\nورود به صف مچینگ\n\nپس از تکمیل تمام محورهای اجباری، کاربر می‌تواند وارد صف انتظار شود\nتا سیستم برایش یک کیس مناسب پیدا کند.\n\nپیش‌شرط‌ها:\n ۱. وضعیت پروفایل باید pending_info باشد\n ۲. کاربر نباید معلق (suspended) باشد\n ۳. تمام محورهای is_required=True باید current_step >= total_steps داشته باشند\n\nپس از موفقیت:\n وضعیت پروفایل از pending_info به waiting تغییر می‌کند.\n ویرایش فرم‌ها قفل می‌شود (can_edit_profile = False).\n", "parameters": [], "responses": {"200": {"description": "با موفقیت وارد صف مچینگ شدید", "examples": {"application/json": {"detail": "با موفقیت وارد صف مچینگ شدید."}}}, "400": {"description": "خطا — پروفایل ناقص یا وضعیت نامناسب", "examples": {"application/json": {"detail": "لطفاً ابتدا تمام محورهای اجباری را تکمیل کنید."}}}, "403": {"description": "کاربر معلق است", "examples": {"application/json": {"detail": "حساب شما معلق است و امکان ورود به صف مچینگ را ندارید."}}}, "401": {"description": "کاربر احراز هویت نشده است"}}, "tags": ["Marriage"]}, "parameters": []}, "/api/marriage/profile/basic/": {"patch": {"operationId": "api_marriage_profile_basic_partial_update", "description": "\nثبت اطلاعات پایه پروفایل (آنبوردینگ)\n\nاولین قدم پس از ورود به سیستم مریج.\nجنسیت و نوع ثبت‌نام کاربر ثبت می‌شود.\n\nمنطق انتقال وضعیت:\n pending_onboarding → pending_info (وقتی هر دو فیلد پر شوند)\n\nis_registering_for_self:\n - True: کاربر برای خودش ثبت‌نام می‌کند\n - False: کاربر برای شخص دیگری (مثلاً خواهر) ثبت‌نام می‌کند\n این مقدار روی کدام محورهای فرم نمایش داده شوند تأثیر مستقیم دارد.\n\nخروجی: پروفایل آپدیت‌شده (همان فرمت GET /profile/main/)\n", "parameters": [{"name": "data", "in": "body", "required": true, "schema": {"required": ["gender", "is_registering_for_self"], "type": "object", "properties": {"gender": {"description": "جنسیت کاربر", "type": "string", "enum": ["male", "female"]}, "is_registering_for_self": {"description": "True = برای خودش | False = برای شخص دیگر", "type": "boolean"}}, "example": {"gender": "male", "is_registering_for_self": true}}}], "responses": {"200": {"description": "اطلاعات پایه با موفقیت ثبت شد", "examples": {"application/json": {"id": 42, "status": "pending_info", "gender": "male", "is_registering_for_self": true, "can_edit_profile": true, "can_message_expert": false, "active_subscription": null, "is_ready_for_match": false, "active_case": null, "needs_subscription": false, "match_summary": null}}}, "400": {"description": "خطا در اعتبارسنجی ورودی", "examples": {"application/json": {"gender": ["مقدار وارد شده معتبر نیست."], "is_registering_for_self": ["این فیلد الزامی است."]}}}, "401": {"description": "کاربر احراز هویت نشده است"}}, "tags": ["Marriage"]}, "parameters": []}, "/api/marriage/profile/main/": {"get": {"operationId": "api_marriage_profile_main_list", "description": "\n## دریافت وضعیت کامل پروفایل مریج\n\nاصلی‌ترین اندپوینت ماژول مریج. تمام اطلاعات لازم برای رندر صفحه اصلی را در یک درخواست برمی‌گرداند.\nاگر پروفایل وجود نداشته باشد، به‌صورت خودکار ساخته می‌شود.\n\n---\n\n### فیلدهای پاسخ\n\n| فیلد | نوع | توضیح |\n|------|-----|-------|\n| `id` | integer | شناسه پروفایل |\n| `status` | string | وضعیت فعلی پروفایل (جدول وضعیت‌ها را ببینید) |\n| `gender` | string\\|null | جنسیت: `male` \\| `female` \\| `null` |\n| `is_registering_for_self` | boolean\\|null | `true` = برای خودش \\| `false` = برای شخص دیگر |\n| `can_edit_profile` | boolean | فقط در `pending_onboarding` / `pending_info` مجاز است |\n| `can_message_expert` | boolean | `true` اگر `in_case` باشد یا آقا اشتراک معتبر داشته باشد |\n| `active_subscription` | object\\|null | اشتراک فعال و معتبر — `null` اگر نداشته باشد |\n| `is_ready_for_match` | boolean | تمام فرم‌های `is_required=true` تکمیل شده‌اند |\n| `active_case` | object\\|null | اطلاعات کیس فعال — `null` اگر در کیس نباشد. شامل `my_action` و `other_action` |\n| `needs_subscription` | boolean | `true` فقط برای آقا در `payment_pending` بدون اشتراک معتبر. **توجه:** status های `payment_pending` و `payment_done` در response به `male_accepted` تبدیل می‌شوند و جزئیات پرداخت از این فیلد مشخص می‌شود |\n| `recommended_plan` | object\\|null | پلن پیشنهادی برای خرید اشتراک — همیشه اولین پلن فعال (کمترین order/price) |\n| `match_summary` | object\\|null | خلاصه عمومی پروفایل طرف مقابل — فقط در وضعیت‌های کیس فعال |\n\n---\n\n### جدول وضعیت‌های پروفایل (`status`)\n\n| مقدار | معنا |\n|-------|------|\n| `pending_onboarding` | هنوز جنسیت ثبت نشده |\n| `pending_info` | در حال تکمیل فرم‌ها |\n| `waiting` | در صف انتظار مچینگ |\n| `in_case` | در کیس فعال — ویرایش فرم‌ها قفل است |\n| `suspended` | معلق به دلیل جریمه (عدم تماس) |\n| `matched` | کیس به نتیجه رسیده |\n\n---\n\n### فیلد `active_case`\n\n| فیلد | نوع | توضیح |\n|------|-----|-------|\n| `case_id` | integer | شناسه کیس |\n| `status` | string | وضعیت کیس. **توجه:** `payment_pending` و `payment_done` در response به `male_accepted` تبدیل می‌شوند. جزئیات پرداخت از `needs_subscription` و `payment_done_at` مشخص می‌شود |\n| `introduced_at` | datetime | تاریخ معرفی |\n| `contact_shared_at` | datetime\\|null | تاریخ اشتراک‌گذاری اطلاعات تماس به آقا |\n| `minutes_since_contact_shared` | float\\|null | تعداد دقیقه‌های سپری شده از اشتراک‌گذاری — محاسبه شده توسط سرور |\n| `can_report_no_contact` | boolean | `true` اگر ۴۸ ساعت (۲۸۸۰ دقیقه) گذشته باشد — برای فعال‌سازی دکمه |\n| `my_action` | string | اقدام مورد نیاز از کاربر فعلی |\n| `other_action` | string | اقدام مورد نیاز از طرف مقابل |\n\n#### مقادیر `my_action` / `other_action`\n\n| مقدار | معنا |\n|-------|------|\n| `pending` | نوبت این طرف است که تأیید یا رد کند |\n| `waiting` | منتظر اقدام طرف مقابل |\n| `rejected` | این طرف رد کرده |\n| `other_rejected` | طرف مقابل رد کرده |\n| `payment_required` | آقا باید پرداخت کند |\n| `completed` | پرداخت انجام شده |\n\n---\n\n### فیلد `recommended_plan`\n\nوقتی `needs_subscription = true`، این فیلد اولین پلن فعال را برمی‌گرداند.\nکلاینت باید `id` این پلن را مستقیماً برای پرداخت استفاده کند (اندپوینت جداگانه‌ای برای لیست پلن‌ها وجود ندارد).\n\n```json\n{\n \"id\": 2,\n \"title\": \"اشتراک ۳ معرفی\",\n \"price\": \"150000\"\n}\n```\n\n---\n\n
\n💳 جریان پرداخت اشتراک از طریق habcoin (کلیک کنید)\n\nپس از دریافت `recommended_plan.id`، کلاینت باید درخواست پرداخت را به اندپوینت habcoin بزند:\n\n```\nGET /api/habcoin/pay/\n ?token=\n &service=marriagesubscriptionplan\n &object_id=\n```\n\n**جریان عملیات پس از فراخوانی:**\n\n1. habcoin سکه‌ها را از موجودی کاربر کسر می‌کند (FIFO — نزدیک‌ترین انقضا اول)\n2. رکورد `UserCoinUsage` با `service=marriagesubscriptionplan` ثبت می‌شود\n3. سیگنال `activate_marriage_subscription` به‌صورت خودکار اجرا می‌شود:\n - `ActiveSubscription` برای پروفایل آقا ساخته می‌شود\n - `consume_usage()` فراخوانی می‌شود\n - وضعیت کیس: `payment_pending` → `payment_done`\n - `payment_done_at` و `contact_shared_at` پر می‌شوند\n4. کلاینت می‌تواند اطلاعات تماس را از `GET /cases//contact-info/` دریافت کند\n\n**خطاهای احتمالی از habcoin/pay:**\n\n| کد | پیام | دلیل |\n|----|------|-------|\n| 400 | `Not enough coins` | موجودی سکه کافی نیست |\n| 400 | `Invalid service type` | پارامتر `service` اشتباه است |\n| 403 | `Invalid security token` | توکن امنیتی نامعتبر است |\n| 404 | `Object not found` | `plan_id` یافت نشد یا غیرفعال است |\n\n
\n", "parameters": [], "responses": {"200": {"description": "پروفایل با موفقیت بازگردانده شد", "examples": {"application/json": {"id": 42, "status": "in_case", "gender": "male", "is_registering_for_self": true, "can_edit_profile": false, "can_message_expert": true, "active_subscription": {"id": 7, "plan": {"id": 2, "title": "اشتراک ۳ معرفی", "plan_type": "count_based", "duration_days": null, "usage_limit": 3, "price": "150000"}, "start_date": "2026-04-01T10:00:00Z", "end_date": null, "total_usages": 1, "is_active": true, "is_valid": true}, "is_ready_for_match": true, "active_case": {"case_id": 15, "status": "male_accepted", "introduced_at": "2026-04-20T08:30:00Z", "contact_shared_at": "2026-04-22T14:15:00Z", "minutes_since_contact_shared": 2760.5, "can_report_no_contact": false, "my_action": "completed", "other_action": "completed"}, "needs_subscription": false, "recommended_plan": {"id": 2, "title": "اشتراک ۳ معرفی", "price": "150000"}, "match_summary": {"id": 58, "gender": "female", "overall_completion_percent": 85.0, "public_info": [{"key": "birth_year", "label": "سال تولد", "type": "number", "value": 1998}, {"key": "city", "label": "شهر", "type": "text", "value": "تهران"}, {"key": "education", "label": "تحصیلات", "type": "text", "value": "کارشناسی"}, {"key": "job", "label": "شغل", "type": "text", "value": null}, {"key": "height", "label": "قد", "type": "number", "value": null}]}}}}, "401": {"description": "کاربر احراز هویت نشده است"}}, "tags": ["Marriage"]}, "parameters": []}, "/api/marriage/sections/": {"get": {"operationId": "api_marriage_sections_list", "description": "\nلیست محورهای اطلاعاتی فرم به همراه درصد پیشرفت\n\nمحورهایی که برای جنسیت و نوع ثبت‌نام کاربر فعال هستند را به همراه درصد پیشرفت هر کدام برمی‌گرداند.\nاین اندپوینت باید فقط زمانی که کاربر در صفحه «تکمیل پروفایل» است فراخوانی شود (وضعیت pending_info).\nاگر کاربر هنوز جنسیت یا نوع ثبت‌نام را وارد نکرده باشد، آرایه خالی برمی‌گرداند.\n", "parameters": [], "responses": {"200": {"description": "لیست محورها با موفقیت بازگردانده شد", "examples": {"application/json": [{"id": 1, "slug": "personal_info", "title": "اطلاعات شخصی", "is_required": true, "importance_weight": 1.0, "estimated_minutes": 10, "total_steps": 3, "order": 1, "current_step": 3, "completion_percent": 100.0}, {"id": 2, "slug": "financial_info", "title": "اطلاعات مالی", "is_required": true, "importance_weight": 1.5, "estimated_minutes": 8, "total_steps": 2, "order": 2, "current_step": 1, "completion_percent": 50.0}]}}, "401": {"description": "کاربر احراز هویت نشده است"}}, "tags": ["Marriage"]}, "parameters": []}, "/api/marriage/sections/{slug}/data/": {"get": {"operationId": "api_marriage_sections_data_list", "description": "\nدریافت دیتای ذخیره‌شده یک محور فرم\n\nدیتای پر‌شده توسط کاربر برای یک محور اطلاعاتی مشخص (با slug) را برمی‌گرداند.\nاگر کاربر هنوز این محور را شروع نکرده باشد، پاسخ با مقادیر پیش‌فرض برگردانده می‌شود.\n\nساختار فیلد data:\n آرایه‌ای از آبجکت‌ها، هر آبجکت شامل:\n - key: کلید یکتای فیلد (مثل \"birth_year\"، \"job\")\n - label: برچسب نمایشی (مثل \"سال تولد\")\n - type: نوع فیلد (text | number | media | select | ...)\n - value: مقدار وارد شده (برای media: URL فایل دائمی یا null)\n\ncompletion_percent = (current_step / total_steps) * 100\n", "parameters": [], "responses": {"200": {"description": "محور هنوز شروع نشده — مقادیر پیش‌فرض", "examples": {"application/json": {"slug": "financial_info", "data": [], "current_step": 0, "total_steps": 2, "completion_percent": 0.0, "updated_at": null}}}, "401": {"description": "کاربر احراز هویت نشده است"}, "404": {"description": "محور اطلاعاتی با این slug یافت نشد یا غیرفعال است"}}, "tags": ["Marriage"]}, "patch": {"operationId": "api_marriage_sections_data_partial_update", "description": "\nآپدیت جزئی دیتای یک محور فرم\n\nدیتای یک یا چند فیلد در محور مشخص‌شده را ذخیره یا آپدیت می‌کند.\nاین عملیات Merge است — فیلدهایی که ارسال نشده‌اند حذف نمی‌شوند.\n\nپیش‌شرط: وضعیت پروفایل باید pending_onboarding یا pending_info باشد.\nدر وضعیت waiting یا in_case، PATCH با خطای ۴۰۳ رد می‌شود.\n\nساختار ورودی:\n - current_step: مرحله فعلی کاربر در این فرم (برای محاسبه درصد پیشرفت)\n - total_steps: (اختیاری) تعداد کل مراحل این فرم. اگر ارسال شود و با مقدار فعلی section متفاوت باشد، بروزرسانی می‌شود\n - fields: آرایه‌ای از فیلدهای تکمیل‌شده\n\nپردازش فیلدهای media:\n ۱. فرانت‌اند فایل را از طریق اندپوینت آپلود موقت می‌فرستد و URL tmp دریافت می‌کند\n ۲. آن URL tmp را به عنوان value فیلد media ارسال می‌کند\n ۳. سرور فایل را از مسیر موقت خوانده، در مسیر دائمی ذخیره می‌کند\n ۴. URL دائمی در JSON فرم جایگزین URL tmp می‌شود\n\nاگر value فیلد media شامل \"tmp\" نباشد (فایل قبلاً دائمی شده)، بدون تغییر ذخیره می‌شود.\n", "parameters": [{"name": "data", "in": "body", "required": true, "schema": {"required": ["current_step", "fields"], "type": "object", "properties": {"current_step": {"description": "مرحله فعلی کاربر در این فرم (از صفر)", "type": "integer", "minimum": 0}, "total_steps": {"description": "تعداد کل مراحل این فرم (اختیاری). اگر با مقدار فعلی section متفاوت باشد، بروزرسانی می‌شود", "type": "integer", "minimum": 1}, "fields": {"description": "لیست فیلدهای تکمیل‌شده", "type": "array", "items": {"required": ["key", "label", "type", "value"], "type": "object", "properties": {"key": {"description": "کلید یکتای فیلد — مثال: birth_year", "type": "string"}, "label": {"description": "برچسب نمایشی فیلد — مثال: سال تولد", "type": "string"}, "type": {"description": "نوع فیلد: text | number | media | select | ...", "type": "string"}, "value": {"description": "مقدار فیلد — برای media: URL موقت یا دائمی (می‌تواند عدد، رشته، یا null باشد)", "type": "string", "x-nullable": true}}}}}, "example": {"current_step": 2, "total_steps": 3, "fields": [{"key": "birth_year", "label": "سال تولد", "type": "number", "value": 1995}, {"key": "city", "label": "شهر", "type": "text", "value": "تهران"}, {"key": "id_scan", "label": "کارت ملی", "type": "media", "value": "/media/tmp/upload_abc123.jpg"}]}}}], "responses": {"200": {"description": "دیتای محور با موفقیت آپدیت شد", "examples": {"application/json": {"id": 33, "slug": "personal_info", "data": [{"key": "birth_year", "label": "سال تولد", "type": "number", "value": 1995}, {"key": "city", "label": "شهر", "type": "text", "value": "تهران"}, {"key": "id_scan", "label": "کارت ملی", "type": "media", "value": "/media/marriage/media/2026/04/upload_abc123.jpg"}], "current_step": 2, "total_steps": 3, "completion_percent": 66.7, "updated_at": "2026-04-23T09:15:00Z"}}}, "400": {"description": "خطا در اعتبارسنجی یا فایل media یافت نشد", "examples": {"application/json": {"detail": "فایل رسانه‌ای یافت نشد. لطفاً دوباره آپلود کنید."}}}, "403": {"description": "ویرایش در وضعیت فعلی مجاز نیست", "examples": {"application/json": {"detail": "در وضعیت فعلی امکان ویرایش پروفایل وجود ندارد."}}}, "401": {"description": "کاربر احراز هویت نشده است"}, "404": {"description": "محور اطلاعاتی با این slug یافت نشد یا غیرفعال است"}}, "tags": ["Marriage"]}, "parameters": [{"name": "slug", "in": "path", "required": true, "type": "string"}]}, "/api/talk/guidelines/": {"get": {"operationId": "api_talk_guidelines_list", "description": "", "parameters": [{"name": "page", "in": "query", "description": "A page number within the paginated result set.", "required": false, "type": "integer"}], "responses": {"200": {"description": ""}}, "tags": ["Talk"]}, "parameters": []}, "/api/talk/provider/": {"post": {"operationId": "api_talk_provider_create", "description": "", "parameters": [{"name": "data", "in": "body", "required": true, "schema": {"$ref": "#/definitions/talk_provider_profile"}}], "responses": {"201": {"description": "", "schema": {"$ref": "#/definitions/talk_provider_profile"}}}, "tags": ["Talk"]}, "parameters": []}, "/appversions/": {"get": {"operationId": "appversions_list", "description": "", "parameters": [], "responses": {"200": {"description": ""}}, "tags": ["appversions"]}, "parameters": []}, "/appversions/v2/": {"get": {"operationId": "appversions_v2_list", "description": "", "parameters": [], "responses": {"200": {"description": ""}}, "tags": ["appversions"]}, "parameters": []}, "/bookmark/add/": {"post": {"operationId": "bookmark_add_create", "summary": "Add a new bookmark for a service.", "description": "Request should contain:\n- service: The service to be bookmarked.\n- content_id: The content ID of the service to be bookmarked.\n\nReturns the created bookmark.", "parameters": [{"name": "data", "in": "body", "required": true, "schema": {"$ref": "#/definitions/BookmarkSerializers"}}], "responses": {"201": {"description": "", "schema": {"$ref": "#/definitions/BookmarkSerializers"}}}, "tags": ["bookmark"]}, "parameters": []}, "/bookmark/bulk/modify/": {"post": {"operationId": "bookmark_bulk_modify_create", "description": "Bulk modify bookmarks by adding and removing them.", "parameters": [{"name": "data", "in": "body", "required": true, "schema": {"required": ["add", "remove"], "type": "object", "properties": {"add": {"description": "List of items to add to bookmarks", "type": "array", "items": {"type": "object", "properties": {"service": {"description": "The service to be bookmarked (e.g., quran, mafatih, etc.)", "type": "string"}, "content_id": {"description": "The content ID of the service", "type": "string"}, "text": {"description": "Optional text for the bookmark", "type": "string", "nullable": true}}}}, "remove": {"description": "List of items to remove from bookmarks", "type": "array", "items": {"type": "object", "properties": {"content_id": {"description": "The content ID of the service to be removed", "type": "string"}, "service": {"description": "The service to be bookmarked (e.g., quran, mafatih, etc.)", "type": "string"}}}}}, "example": {"add": [{"service": "quran", "content_id": "123", "text": "My favorite verse"}, {"service": "mafatih", "content_id": "456", "text": "Daily dua"}], "remove": [{"content_id": "789", "service": "quran"}]}}}], "responses": {"200": {"description": "Bulk modify completed."}}, "tags": ["bookmark"]}, "parameters": []}, "/bookmark/list/": {"get": {"operationId": "bookmark_list_list", "summary": "List all bookmarks for the authenticated user.", "description": "Can be filtered by service using the `service` query parameter.\n\nReturns a list of bookmarks.", "parameters": [{"name": "limit", "in": "query", "description": "Number of results to return per page.", "required": false, "type": "integer"}, {"name": "offset", "in": "query", "description": "The initial index from which to return the results.", "required": false, "type": "integer"}], "responses": {"200": {"description": "", "schema": {"required": ["count", "results"], "type": "object", "properties": {"count": {"type": "integer"}, "next": {"type": "string", "format": "uri", "x-nullable": true}, "previous": {"type": "string", "format": "uri", "x-nullable": true}, "results": {"type": "array", "items": {"$ref": "#/definitions/BookmarkSerializers"}}}}}}, "tags": ["bookmark"]}, "parameters": []}, "/bookmark/remove/{service}/{content_id}/": {"delete": {"operationId": "bookmark_remove_delete", "summary": "Deactivate a bookmark by setting its status to False using content_id and user.", "description": "The request should specify the content_id of the bookmark to be deactivated.\n\nReturns no content.", "parameters": [], "responses": {"204": {"description": ""}}, "tags": ["bookmark"]}, "parameters": [{"name": "service", "in": "path", "required": true, "type": "string"}, {"name": "content_id", "in": "path", "required": true, "type": "string"}]}, "/calendar/adjustemnts/": {"get": {"operationId": "calendar_adjustemnts_list", "description": "", "parameters": [], "responses": {"200": {"description": ""}}, "tags": ["calendar"]}, "parameters": []}, "/calendar/occasions/": {"get": {"operationId": "calendar_occasions_list", "description": "accept parameters:
\n-- **country** : str = Could be empty or ir, de, sp
\n-- **language_code** : str = en, fa
\n-- **last_updated** : datetime = 2021-06-20 08:36:53.153834
", "parameters": [], "responses": {"200": {"description": "", "schema": {"type": "array", "items": {"$ref": "#/definitions/Calendar"}}}}, "tags": ["calendar"]}, "parameters": []}, "/calendar/occasions/{occasion_id}/": {"get": {"operationId": "calendar_occasions_read", "description": "", "parameters": [], "responses": {"200": {"description": ""}}, "tags": ["calendar"]}, "parameters": [{"name": "occasion_id", "in": "path", "required": true, "type": "string"}]}, "/category-masaels/": {"get": {"operationId": "category-masaels_list", "description": "", "parameters": [], "responses": {"200": {"description": "", "schema": {"type": "array", "items": {"$ref": "#/definitions/MasaelCategories"}}}}, "tags": ["category-masaels"]}, "parameters": []}, "/checkup/list/": {"get": {"operationId": "checkup_list_list", "description": "\nدریافت لیست تمام چک‌آپ‌های فعال\n\nاین API لیست تمام چک‌آپ‌های موجود را با اطلاعات پایه نمایش می‌دهد.\nبرای هر چک‌آپ، اطلاعاتی شامل عنوان، تصویر، خلاصه، قیمت و فیلدهای زیر نمایش داده می‌شود:\n\nفیلدهای پاسخ:\n- questions_count: تعداد سوالات منحصر به فرد در چک‌آپ\n- answered_questions: تعداد سوالاتی که پاسخ داده شده است\n- has_access: آیا کاربر دسترسی دارد (رایگان یا خریده شده)\n- is_user_completed: آیا کاربر چک‌آپ را کامل کرده است\n", "parameters": [{"name": "limit", "in": "query", "description": "Number of results to return per page.", "required": false, "type": "integer"}, {"name": "offset", "in": "query", "description": "The initial index from which to return the results.", "required": false, "type": "integer"}], "responses": {"200": {"description": "لیست چک‌آپ‌ها با موفقیت بازگردانده شد", "examples": {"application/json": [{"id": 1, "title": "چک‌آپ رزق و روزی", "image": {"sm": "http://example.com/media/image_sm.jpg", "md": "http://example.com/media/image_md.jpg", "lg": "http://example.com/media/image_lg.jpg"}, "summary": "بررسی وضعیت رزق و روزی شما", "price": "10.00", "is_free": false, "questions_count": 15, "has_participated": 0, "answered_questions": null, "is_user_completed": false, "has_access": false}, {"id": 2, "title": "چک‌آپ سلامت روحی", "image": {"sm": "http://example.com/media/image2_sm.jpg", "md": "http://example.com/media/image2_md.jpg", "lg": "http://example.com/media/image2_lg.jpg"}, "summary": "ارزیابی سلامت روان", "price": "0.00", "is_free": true, "questions_count": 20, "has_participated": 2, "answered_questions": 15, "is_user_completed": false, "has_access": true}]}}, "401": {"description": "کاربر احراز هویت نشده است"}}, "tags": ["checkup"]}, "parameters": []}, "/checkup/parameter/{id}/detail/": {"get": {"operationId": "checkup_parameter_detail_read", "description": "\nدریافت جزئیات یک پارامتر چک‌آپ\n\nاین API جزئیات کامل یک پارامتر شامل عنوان و توضیحات (حدیث یا متن تکمیلی) را نمایش می‌دهد.\n\nاستفاده:\n- زمانی که در نتایج چک‌آپ، فیلد has_details = true باشد\n- برای نمایش اطلاعات بیشتر درباره یک توصیه یا نقطه قوت\n\nفیلدهای پاسخ:\n- id: شناسه پارامتر\n- title: عنوان پارامتر\n- description: متن کامل شامل حدیث عربی، ترجمه و منبع\n", "parameters": [], "responses": {"200": {"description": "جزئیات پارامتر با موفقیت بازگردانده شد", "examples": {"application/json": {"id": 76, "title": "دوری از دعای بد علیه والدین", "description": "«لا تَدْعُ عَلى والِدَیْکَ فَاِنَّهُ یُورِثُ الفَقْرَ»\n\nنفرین بر والدین باعث فقر می‌شود. والدین مجرای فیض وجود شما هستند...\n\n📚 منبع: کتاب الکافی، جلد 5، صفحه 554"}}}, "401": {"description": "کاربر احراز هویت نشده است"}, "404": {"description": "پارامتر یافت نشد"}}, "tags": ["checkup"]}, "parameters": [{"name": "id", "in": "path", "description": "A unique integer value identifying this Checkup Parameter.", "required": true, "type": "integer"}]}, "/checkup/parameter/{id}/detail/v2/": {"get": {"operationId": "checkup_parameter_detail_v2_read", "description": "V2 - دریافت جزئیات یک CheckupParameter با ساختار جدید", "parameters": [], "responses": {"200": {"description": "", "schema": {"$ref": "#/definitions/CheckupParameterDetailSerializerV2"}}}, "tags": ["checkup"]}, "parameters": [{"name": "id", "in": "path", "description": "A unique integer value identifying this Checkup Parameter.", "required": true, "type": "integer"}]}, "/checkup/user-checkups/": {"get": {"operationId": "checkup_user-checkups_list", "description": "\nدریافت لیست چک‌آپ‌های کاربر\n\nاین API لیست تمام چک‌آپ‌هایی را که کاربر در آنها شرکت کرده است نمایش می‌دهد.\nبرای هر چک‌آپ، اطلاعاتی شامل عنوان، تصویر، خلاصه، قیمت و فیلدهای زیر نمایش داده می‌شود:\n\nفیلدهای پاسخ:\n- questions_count: تعداد سوالات منحصر به فرد در چک‌آپ\n- answered_questions: تعداد سوالاتی که پاسخ داده شده است\n- has_access: آیا کاربر دسترسی دارد (رایگان یا خریده شده)\n- is_user_completed: آیا کاربر چک‌آپ را کامل کرده است\n", "parameters": [{"name": "limit", "in": "query", "description": "Number of results to return per page.", "required": false, "type": "integer"}, {"name": "offset", "in": "query", "description": "The initial index from which to return the results.", "required": false, "type": "integer"}], "responses": {"200": {"description": "لیست چک‌آپ‌های کاربر با موفقیت بازگردانده شد", "examples": {"application/json": [{"id": 1, "title": "چک‌آپ رزق و روزی", "image": {"sm": "http://example.com/media/image_sm.jpg", "md": "http://example.com/media/image_md.jpg", "lg": "http://example.com/media/image_lg.jpg"}, "summary": "بررسی وضعیت رزق و روزی شما", "price": "10.00", "is_free": false, "questions_count": 15, "has_participated": 2, "answered_questions": 20, "is_user_completed": true}, {"id": 2, "title": "چک‌آپ سلامت روحی", "image": {"sm": "http://example.com/media/image2_sm.jpg", "md": "http://example.com/media/image2_md.jpg", "lg": "http://example.com/media/image2_lg.jpg"}, "summary": "ارزیابی سلامت روان", "price": "0.00", "is_free": true, "questions_count": 20, "has_participated": 1, "answered_questions": 10, "is_user_completed": false}]}}, "401": {"description": "کاربر احراز هویت نشده است"}}, "tags": ["checkup"]}, "parameters": []}, "/checkup/{id}/": {"get": {"operationId": "checkup_read", "description": "\nدریافت جزئیات کامل یک چک‌آپ\n\nاین API اطلاعات کامل یک چک‌آپ شامل عنوان، تصویر، خلاصه، توضیحات کامل، قیمت و فیلدهای زیر را نمایش می‌دهد:\n\nفیلدهای پاسخ:\n- questions_count: تعداد سوالات منحصر به فرد در چک‌آپ\n- answered_questions: تعداد سوالاتی که پاسخ داده شده است\n- has_access: آیا کاربر دسترسی دارد (رایگان یا خریده شده)\n- is_user_completed: آیا کاربر چک‌آپ را کامل کرده است\n", "parameters": [], "responses": {"200": {"description": "جزئیات چک‌آپ با موفقیت بازگردانده شد", "examples": {"application/json": {"id": 1, "title": "چک‌آپ رزق و روزی", "image": {"sm": "http://example.com/media/image_sm.jpg", "md": "http://example.com/media/image_md.jpg", "lg": "http://example.com/media/image_lg.jpg"}, "summary": "بررسی وضعیت رزق و روزی شما", "description": "توضیحات کامل در مورد چک‌آپ رزق و روزی...", "price": "10.00", "is_free": false, "questions_count": 15, "has_participated": 2, "answered_questions": 5, "is_user_completed": false, "has_access": true}}}, "401": {"description": "کاربر احراز هویت نشده است"}, "404": {"description": "چک‌آپ یافت نشد"}}, "tags": ["checkup"]}, "parameters": [{"name": "id", "in": "path", "description": "A unique integer value identifying this Checkup.", "required": true, "type": "integer"}]}, "/checkup/{id}/basic-questions/": {"get": {"operationId": "checkup_basic-questions_list", "description": "\nدریافت لیست سوالات پایه یک چک‌آپ\n\nاین API سوالات پایه (مانند جنسیت، سن، وضعیت تأهل) یک چک‌آپ را به همراه \nگزینه‌های پاسخ آن نمایش می‌دهد.\nکاربر باید قبلاً در چک‌آپ شرکت کرده باشد (join).\n", "parameters": [{"name": "limit", "in": "query", "description": "Number of results to return per page.", "required": false, "type": "integer"}, {"name": "offset", "in": "query", "description": "The initial index from which to return the results.", "required": false, "type": "integer"}], "responses": {"200": {"description": "لیست سوالات پایه با موفقیت بازگردانده شد", "examples": {"application/json": {"answered_questions": 2, "result": [{"id": 1, "title": "جنسیت شما چیست؟", "question_help_text": "لطفاً جنسیت خود را انتخاب کنید", "question_type": "single", "question_widget_type": "radio", "answers": [{"id": 1, "title": "مرد", "image": {"sm": "http://example.com/media/male_sm.jpg", "md": "http://example.com/media/male_md.jpg", "lg": "http://example.com/media/male_lg.jpg"}}, {"id": 2, "title": "زن", "image": {"sm": "http://example.com/media/female_sm.jpg", "md": "http://example.com/media/female_md.jpg", "lg": "http://example.com/media/female_lg.jpg"}}]}]}}}, "400": {"description": "کاربر هنوز در چک‌آپ شرکت نکرده است"}, "401": {"description": "کاربر احراز هویت نشده است"}, "404": {"description": "چک‌آپ یافت نشد"}}, "tags": ["checkup"]}, "parameters": [{"name": "id", "in": "path", "required": true, "type": "string"}]}, "/checkup/{id}/basic-questions/submit/": {"post": {"operationId": "checkup_basic-questions_submit_create", "description": "\nثبت پاسخ‌های سوالات پایه\n\nاین API برای ثبت پاسخ‌های کاربر به سوالات پایه چک‌آپ استفاده می‌شود.\nبرای هر سوال، باید شناسه سوال (question_id) و شناسه پاسخ انتخابی (answer_id) ارسال شود.\nاگر UserCheckup وجود نداشته باشد، به صورت خودکار ایجاد می‌شود.\nاین عملیات در یک transaction انجام می‌شود.\n", "parameters": [{"name": "data", "in": "body", "required": true, "schema": {"required": ["answers"], "type": "object", "properties": {"answers": {"description": "لیست پاسخ‌های سوالات پایه", "type": "array", "items": {"type": "object", "properties": {"question_id": {"description": "شناسه سوال", "type": "integer"}, "answer_id": {"description": "شناسه پاسخ", "type": "integer"}}}}}, "example": {"answers": [{"question_id": 1, "answer_id": 2}, {"question_id": 2, "answer_id": 5}]}}}], "responses": {"201": {"description": "پاسخ‌ها با موفقیت ثبت شد", "examples": {"application/json": {"detail": "Basic answers submitted successfully."}}}, "400": {"description": "خطا در اعتبارسنجی", "examples": {"application/json": {"detail": "Each answer must contain 'question_id' and 'answer_id'."}}}, "401": {"description": "کاربر احراز هویت نشده است"}, "404": {"description": "چک‌آپ یافت نشد"}}, "tags": ["checkup"]}, "parameters": [{"name": "id", "in": "path", "required": true, "type": "string"}]}, "/checkup/{id}/history/": {"get": {"operationId": "checkup_history_list", "description": "لیست تمام دفعاتی که کاربر در یک چک‌آپ خاص شرکت کرده و تمام کرده.", "parameters": [{"name": "limit", "in": "query", "description": "Number of results to return per page.", "required": false, "type": "integer"}, {"name": "offset", "in": "query", "description": "The initial index from which to return the results.", "required": false, "type": "integer"}], "responses": {"200": {"description": ""}}, "tags": ["checkup"]}, "parameters": [{"name": "id", "in": "path", "required": true, "type": "string"}]}, "/checkup/{id}/join/": {"post": {"operationId": "checkup_join_create", "description": "\nشرکت در یک چک‌آپ\n\nاین API برای شرکت کاربر در یک چک‌آپ استفاده می‌شود.\nاگر چک‌آپ رایگان باشد، مستقیماً کاربر ثبت می‌شود.\nاگر چک‌آپ پولی باشد، کوین‌های کاربر کسر شده و سپس ثبت‌نام انجام می‌شود.\nکاربر می‌تواند چند بار در یک چک‌آپ شرکت کند.\n", "parameters": [], "responses": {"201": {"description": "شرکت در چک‌آپ با موفقیت انجام شد", "examples": {"application/json": {"detail": "Successfully joined the checkup."}}}, "400": {"description": "خطا در شرکت", "examples": {"application/json": {"detail": "Insufficient coins. You need 100 coins but have 50."}}}, "401": {"description": "کاربر احراز هویت نشده است"}, "404": {"description": "چک‌آپ یافت نشد"}}, "tags": ["checkup"]}, "parameters": [{"name": "id", "in": "path", "required": true, "type": "string"}]}, "/checkup/{id}/parameter-questions/": {"get": {"operationId": "checkup_parameter-questions_list", "description": "\nدریافت لیست سوالات پارامتر یک چک‌آپ\n\nاین API سوالات اصلی چک‌آپ (CheckupParameter Questions) را که از طریق BasicQuestion \nبه پارامترها متصل هستند، به همراه گزینه‌های پاسخ نمایش می‌دهد.\nاین سوالات امتیازدهی دارند و در محاسبه نتیجه نهایی استفاده می‌شوند.\nکاربر باید قبلاً در چک‌آپ شرکت کرده باشد (join).\n\nفیلدهای جدید:\n- is_weight_visible: آیا وزن پارامتر باید برای کاربر نمایش داده شود یا خیر\n", "parameters": [{"name": "limit", "in": "query", "description": "Number of results to return per page.", "required": false, "type": "integer"}, {"name": "offset", "in": "query", "description": "The initial index from which to return the results.", "required": false, "type": "integer"}], "responses": {"200": {"description": "لیست سوالات پارامتر با موفقیت بازگردانده شد", "examples": {"application/json": {"answered_questions": 3, "result": [{"id": 10, "title": "آیا در نماز صبح شرکت می‌کنید؟", "question": "توضیحاتی درباره سوال", "description": "توضیح کامل پارامتر", "order": 1, "parameter_type": "positive", "is_weight_visible": true, "parameter_answers": [{"id": 25, "title": "هیچ وقت", "answer_type": "text", "image": null, "weight": 0}, {"id": 26, "title": "گاهی اوقات", "answer_type": "text", "image": null, "weight": 25}, {"id": 27, "title": "بیشتر اوقات", "answer_type": "text", "image": null, "weight": 75}, {"id": 28, "title": "همیشه", "answer_type": "text", "image": null, "weight": 100}]}]}}}, "400": {"description": "کاربر هنوز در چک‌آپ شرکت نکرده است"}, "401": {"description": "کاربر احراز هویت نشده است"}, "404": {"description": "چک‌آپ یافت نشد"}}, "tags": ["checkup"]}, "parameters": [{"name": "id", "in": "path", "required": true, "type": "string"}]}, "/checkup/{id}/parameters/submit/": {"post": {"operationId": "checkup_parameters_submit_create", "description": "\nثبت پاسخ‌های سوالات اصلی و محاسبه نتیجه\n\nاین API برای ثبت پاسخ‌های کاربر به سوالات اصلی چک‌آپ (CheckupParameter) استفاده می‌شود.\nبرای هر سوال، باید شناسه سوال (question_id) و شناسه پاسخ (answer_id) ارسال شود.\n\nسیستم به صورت خودکار:\n1. از طریق BasicQuestion، پارامتر مرتبط را پیدا می‌کند\n2. بر اساس parameter_type (positive/negative) و weight، امتیاز محاسبه می‌شود\n3. درصد امکان بهبود (possibility_of_improvement) محاسبه می‌شود\n4. گزارش با سه وضعیت (emergency, improvement, positive) ایجاد می‌شود\n5. لیست توصیه‌ها بر اساس امتیازها تولید می‌شود\n\nاین عملیات در یک transaction انجام می‌شود و UserCheckup به حالت completed تغییر می‌کند.\n", "parameters": [{"name": "data", "in": "body", "required": true, "schema": {"required": ["answers"], "type": "object", "properties": {"answers": {"description": "لیست پاسخ‌های سوالات اصلی", "type": "array", "items": {"type": "object", "properties": {"question_id": {"description": "شناسه سوال", "type": "integer"}, "answer_id": {"description": "شناسه پاسخ", "type": "integer"}}}}}, "example": {"answers": [{"question_id": 10, "answer_id": 25}, {"question_id": 11, "answer_id": 30}, {"question_id": 12, "answer_id": 28}]}}}], "responses": {"201": {"description": "پاسخ‌ها با موفقیت ثبت و نتیجه محاسبه شد", "examples": {"application/json": {"possibility_of_improvement": 65.5, "people_medium": 58, "report": [{"status": "emergency", "count": 2, "items": [{"order": 1, "text": "نماز صبح"}, {"order": 3, "text": "روزه"}]}, {"status": "improvement", "count": 3, "items": [{"order": 2, "text": "صدقه"}, {"order": 5, "text": "دعا"}, {"order": 7, "text": "استغفار"}]}, {"status": "positive", "count": 4, "items": [{"order": 4, "text": "نماز جماعت"}, {"order": 6, "text": "قرآن"}, {"order": 8, "text": "زیارت"}, {"order": 9, "text": "حج"}]}], "recommendations_count": 9, "recommendations": [{"order": 1, "text": "نماز صبح"}, {"order": 2, "text": "صدقه"}, {"order": 3, "text": "روزه"}]}}}, "400": {"description": "خطا در اعتبارسنجی یا UserCheckup یافت نشد", "examples": {"application/json": {"detail": "UserCheckup not found. Please join the checkup first or complete basic questions."}}}, "401": {"description": "کاربر احراز هویت نشده است"}, "404": {"description": "چک‌آپ یافت نشد"}}, "tags": ["checkup"]}, "parameters": [{"name": "id", "in": "path", "required": true, "type": "string"}]}, "/checkup/{id}/previous-answers/": {"get": {"operationId": "checkup_previous-answers_read", "description": "\nGet user's previous answers for a completed checkup\n\nThis API returns the most recent completed UserCheckup for the authenticated user\nalong with all their basic question answers and parameter answers.\n\nUse this when user wants to review their previous checkup results or\nwhen they want to redo a checkup with their previous answers pre-filled.\n\nResponse includes:\n- user_checkup_id: ID of the UserCheckup record\n- checkup_id: ID of the checkup\n- completed_at: When the checkup was completed\n- is_completed: Whether the checkup is completed\n- total_score: Total score achieved\n- basic_question_answers: List of all basic question answers\n- parameter_answers: List of all parameter answers with weighted scores\n", "parameters": [], "responses": {"200": {"description": "Previous answers retrieved successfully", "examples": {"application/json": {"user_checkup_id": 123, "checkup_id": 5, "completed_at": "2025-12-20T10:00:00Z", "is_completed": true, "total_score": 85, "basic_question_answers": [{"question_id": 1, "question_title": "Gender", "answer_id": 10, "answer_title": "Male", "answered_at": "2025-12-20T09:30:00Z"}], "parameter_answers": [{"parameter_id": 50, "parameter_title": "Sleep Quality", "answer_id": 200, "answer_title": "Good", "weighted_score": 8.5, "answered_at": "2025-12-20T09:35:00Z"}]}}}, "401": {"description": "User not authenticated"}, "404": {"description": "No completed checkup found for this user"}}, "tags": ["checkup"]}, "parameters": [{"name": "id", "in": "path", "required": true, "type": "string"}]}, "/checkup/{id}/result/": {"get": {"operationId": "checkup_result_read", "description": "\nدریافت نتیجه نهایی چک‌آپ\n\nاین API نتیجه نهایی چک‌آپ را پس از پاسخ به تمام سوالات نمایش می‌دهد.\n\nفیلدهای پاسخ:\n- statistics: آمار متغیرها شامل name، code، value، type، display_mode، achieved_items و total_items\n- report: گزارش دسته‌بندی شده (emergency, improvement, positive)\n- recommendations: لیست توصیه‌های اولویت‌دار\n- total_score: امتیاز کل (میانگین)\n\nتوضیحات statistics:\n- name: نام نمایشی متغیر (ترجمه شده)\n- code: کد یکتای متغیر (برای استفاده در لاجیک)\n- display_mode: نحوه نمایش (gauge: نمودار دایره‌ای، progress_bar: کارت بزرگ، hidden: مخفی)\n- achieved_items: تعداد موارد موفق (برای positive: وزن>=75، برای negative: وزن<=25)\n- total_items: تعداد کل سوالات مرتبط با متغیر\n", "parameters": [], "responses": {"200": {"description": "نتیجه چک‌آپ با موفقیت محاسبه شد", "examples": {"application/json": {"statistics": [{"name": "عامل برکت روزی", "code": "blessing_factor", "value": 97.0, "type": "positive", "display_mode": "gauge", "achieved_items": 73, "total_items": 75}, {"name": "عامل موانع روزی", "code": "obstacle_factor", "value": 7.7, "type": "negative", "display_mode": "progress_bar", "achieved_items": 1, "total_items": 68}], "report": [{"status": "emergency", "count": 2, "items": [{"order": 1, "text": "نماز صبح"}, {"order": 3, "text": "روزه"}]}, {"status": "improvement", "count": 3, "items": [{"order": 2, "text": "صدقه"}, {"order": 5, "text": "دعا"}]}, {"status": "positive", "count": 4, "items": [{"order": 4, "text": "نماز جماعت"}, {"order": 6, "text": "قرآن"}]}], "recommendations_count": 9, "recommendations": [{"order": 1, "text": "نماز صبح"}, {"order": 2, "text": "صدقه"}], "total_score": 85.5}}}, "400": {"description": "چک‌آپ تکمیل نشده است"}, "401": {"description": "کاربر احراز هویت نشده است"}, "404": {"description": "چک‌آپ یافت نشد"}}, "tags": ["checkup"]}, "parameters": [{"name": "id", "in": "path", "required": true, "type": "string"}]}, "/checkup/{id}/result/v2/": {"get": {"operationId": "checkup_result_v2_read", "description": "\nدریافت نتیجه نهایی چک‌آپ - نسخه 2\n\nاین API نسخه بهبود یافته نتایج است که شامل گزارش با 4 وضعیت جدید می‌شود:\n- strengths: نقاط قوت (امتیاز بالا)\n- emergencies: موارد اضطراری (امتیاز بسیار پایین، نیاز فوری)\n- important: موارد مهم (امتیاز متوسط به پایین)\n- useful: موارد مفید (امتیاز متوسط)\n\nساختار پاسخ مشابه V1 است با این تفاوت که:\n- وضعیت‌های جدید به جای emergency, improvement, positive استفاده می‌شود\n- فیلدهای recommendations_count، recommendations و total_score حذف شده‌اند\n\nفیلدهای پاسخ:\n- statistics: آمار متغیرها شامل name، code، value، type، display_mode، achieved_items و total_items\n- report: آرایه‌ای از 4 وضعیت، هر کدام شامل status، count و items\n- هر آیتم شامل: parameter_id، order، title، text، score و has_details\n\nتوضیحات statistics:\n- name: نام نمایشی متغیر (ترجمه شده)\n- code: کد یکتای متغیر (برای استفاده در لاجیک)\n- display_mode: نحوه نمایش (gauge: نمودار دایره‌ای، progress_bar: کارت بزرگ، hidden: مخفی)\n- achieved_items: تعداد موارد موفق (برای positive: وزن>=75، برای negative: وزن<=25)\n- total_items: تعداد کل سوالات مرتبط با متغیر\n\nنکته مهم:\n- has_details: اگر true باشد، می‌توانید از API جزئیات پارامتر استفاده کنید\n- برای دریافت جزئیات: GET /checkup/parameter/{parameter_id}/detail/\n", "parameters": [], "responses": {"200": {"description": "نتیجه چک‌آپ نسخه 2 با موفقیت محاسبه شد", "examples": {"application/json": {"statistics": [{"name": "عامل برکت روزی", "code": "blessing_factor", "value": 97.0, "type": "positive", "display_mode": "gauge", "achieved_items": 73, "total_items": 75}, {"name": "عامل موانع روزی", "code": "obstacle_factor", "value": 7.7, "type": "negative", "display_mode": "progress_bar", "achieved_items": 1, "total_items": 68}], "report": [{"status": "strengths", "count": 2, "items": [{"parameter_id": 76, "order": 0, "title": "دوری از دعای بد علیه والدین", "text": "والدین، مجرایِ فیضِ وجودِ شما هستند؛ بستنِ این مجرا با نفرین، یعنی بستنِ شیرِ فلکه‌ی حیات...", "score": 300, "has_details": true}, {"parameter_id": 40, "order": 0, "title": "امانتداری", "text": "امانتداری، تنها یک فضیلت اخلاقی نیست، بلکه یک استراتژی اقتصادی قدرتمند است...", "score": 200, "has_details": true}]}, {"status": "emergencies", "count": 1, "items": [{"parameter_id": 15, "order": 0, "title": "نماز صبح", "text": "نماز صبح کلید برکت روز است...", "score": -300, "has_details": true}]}, {"status": "important", "count": 1, "items": [{"parameter_id": 25, "order": 0, "title": "صدقه", "text": "صدقه دادن درهای روزی را باز می‌کند...", "score": 150, "has_details": false}]}, {"status": "useful", "count": 1, "items": [{"parameter_id": 30, "order": 0, "title": "استغفار", "text": "استغفار باعث افزایش روزی می‌شود...", "score": 100, "has_details": false}]}]}}}, "400": {"description": "چک‌آپ تکمیل نشده است"}, "401": {"description": "کاربر احراز هویت نشده است"}, "404": {"description": "چک‌آپ یافت نشد"}}, "tags": ["checkup"]}, "parameters": [{"name": "id", "in": "path", "required": true, "type": "string"}]}, "/checkup/{participation_id}/result/v3/": {"get": {"operationId": "checkup_result_v3_read", "description": "\nدریافت نتیجه نهایی چک‌آپ - نسخه 2\n\nاین API نسخه بهبود یافته نتایج است که شامل گزارش با 4 وضعیت جدید می‌شود:\n- strengths: نقاط قوت (امتیاز بالا)\n- emergencies: موارد اضطراری (امتیاز بسیار پایین، نیاز فوری)\n- important: موارد مهم (امتیاز متوسط به پایین)\n- useful: موارد مفید (امتیاز متوسط)\n\nساختار پاسخ مشابه V1 است با این تفاوت که:\n- وضعیت‌های جدید به جای emergency, improvement, positive استفاده می‌شود\n- فیلدهای recommendations_count، recommendations و total_score حذف شده‌اند\n\nفیلدهای پاسخ:\n- statistics: آمار متغیرها شامل name، code، value، type، display_mode، achieved_items و total_items\n- report: آرایه‌ای از 4 وضعیت، هر کدام شامل status، count و items\n- هر آیتم شامل: parameter_id، order، title، text، score و has_details\n\nتوضیحات statistics:\n- name: نام نمایشی متغیر (ترجمه شده)\n- code: کد یکتای متغیر (برای استفاده در لاجیک)\n- display_mode: نحوه نمایش (gauge: نمودار دایره‌ای، progress_bar: کارت بزرگ، hidden: مخفی)\n- achieved_items: تعداد موارد موفق (برای positive: وزن>=75، برای negative: وزن<=25)\n- total_items: تعداد کل سوالات مرتبط با متغیر\n\nنکته مهم:\n- has_details: اگر true باشد، می‌توانید از API جزئیات پارامتر استفاده کنید\n- برای دریافت جزئیات: GET /checkup/parameter/{parameter_id}/detail/\n", "parameters": [], "responses": {"200": {"description": "نتیجه چک‌آپ نسخه 2 با موفقیت محاسبه شد", "examples": {"application/json": {"statistics": [{"name": "عامل برکت روزی", "code": "blessing_factor", "value": 97.0, "type": "positive", "display_mode": "gauge", "achieved_items": 73, "total_items": 75}, {"name": "عامل موانع روزی", "code": "obstacle_factor", "value": 7.7, "type": "negative", "display_mode": "progress_bar", "achieved_items": 1, "total_items": 68}], "report": [{"status": "strengths", "count": 2, "items": [{"parameter_id": 76, "order": 0, "title": "دوری از دعای بد علیه والدین", "text": "والدین، مجرایِ فیضِ وجودِ شما هستند؛ بستنِ این مجرا با نفرین، یعنی بستنِ شیرِ فلکه‌ی حیات...", "score": 300, "has_details": true}, {"parameter_id": 40, "order": 0, "title": "امانتداری", "text": "امانتداری، تنها یک فضیلت اخلاقی نیست، بلکه یک استراتژی اقتصادی قدرتمند است...", "score": 200, "has_details": true}]}, {"status": "emergencies", "count": 1, "items": [{"parameter_id": 15, "order": 0, "title": "نماز صبح", "text": "نماز صبح کلید برکت روز است...", "score": -300, "has_details": true}]}, {"status": "important", "count": 1, "items": [{"parameter_id": 25, "order": 0, "title": "صدقه", "text": "صدقه دادن درهای روزی را باز می‌کند...", "score": 150, "has_details": false}]}, {"status": "useful", "count": 1, "items": [{"parameter_id": 30, "order": 0, "title": "استغفار", "text": "استغفار باعث افزایش روزی می‌شود...", "score": 100, "has_details": false}]}]}}}, "400": {"description": "چک‌آپ تکمیل نشده است"}, "401": {"description": "کاربر احراز هویت نشده است"}, "404": {"description": "چک‌آپ یافت نشد"}}, "tags": ["checkup"]}, "parameters": [{"name": "participation_id", "in": "path", "required": true, "type": "string"}]}, "/command/": {"post": {"operationId": "command_create", "description": "Handles incoming API requests and routes them to the relevant handler.", "parameters": [], "responses": {"201": {"description": ""}}, "tags": ["command"]}, "parameters": []}, "/command/help/": {"get": {"operationId": "command_help_list", "description": "", "parameters": [], "responses": {"200": {"description": "", "schema": {"type": "array", "items": {"$ref": "#/definitions/CommandHelp"}}}}, "tags": ["command"]}, "parameters": []}, "/command/suggestion/": {"get": {"operationId": "command_suggestion_list", "description": "", "parameters": [], "responses": {"200": {"description": "", "schema": {"type": "array", "items": {"$ref": "#/definitions/CommandSuggestion"}}}}, "tags": ["command"]}, "parameters": []}, "/command/v2/": {"post": {"operationId": "command_v2_create", "description": "Handles incoming command requests and processes them through RAG system", "parameters": [{"name": "data", "in": "body", "required": true, "schema": {"required": ["command", "language_code"], "type": "object", "properties": {"command": {"description": "User command or query", "type": "string"}, "language_code": {"description": "Language code (e.g., \"en\", \"fa\")", "type": "string", "default": "en"}}}}], "responses": {"201": {"description": "", "schema": {"required": ["command", "language_code"], "type": "object", "properties": {"command": {"description": "User command or query", "type": "string"}, "language_code": {"description": "Language code (e.g., \"en\", \"fa\")", "type": "string", "default": "en"}}}}}, "tags": ["command"]}, "parameters": []}, "/donate/": {"post": {"operationId": "donate_create", "description": "", "parameters": [{"name": "data", "in": "body", "required": true, "schema": {"$ref": "#/definitions/DonateUser"}}], "responses": {"201": {"description": "", "schema": {"$ref": "#/definitions/DonateUser"}}}, "tags": ["donate"]}, "parameters": []}, "/donate/v2/": {"get": {"operationId": "donate_v2_list", "description": "", "parameters": [{"name": "limit", "in": "query", "description": "Number of results to return per page.", "required": false, "type": "integer"}, {"name": "offset", "in": "query", "description": "The initial index from which to return the results.", "required": false, "type": "integer"}], "responses": {"200": {"description": ""}}, "tags": ["donate"]}, "parameters": []}, "/donate/v2/create/": {"post": {"operationId": "donate_v2_create_create", "description": "\n**Donation Creation API**\n\nCreate a donation record and receive a payment link. This API is designed to never fail and always returns a working donation link without any errors.\n\n**Key Features:**\n- Error-free operation - never returns HTTP errors\n- All fields are completely optional with intelligent defaults\n- Automatic payment method selection based on user location\n- Support for multiple payment gateways\n- Backward compatibility with existing integrations\n\n**Smart Defaults:**\n- **donate_type**: Defaults to 'once' if not provided or invalid\n- **price**: Defaults to '10.00' if not provided or invalid\n- **id**: Auto-selected based on user location (CloudTips for Russian users, Stripe for others)\n- **phone_number**: Optional field, stored if provided, otherwise null\n\n**Payment Methods:**\n- **Stripe**: International payment gateway with predefined donation links\n- **CloudTips**: Russian payment gateway for Russian users\n\n**Localization Logic:**\n- Russian users (language_code=ru OR user.country=RU) default to CloudTips\n- All other users default to Stripe payment gateway\n- Fallback to default donation links for custom amounts\n\n**Business Logic:**\n- Creates donation record in database (optional, doesn't affect response)\n- Optionally stores donor's phone number for contact purposes\n- Maps donation amounts to predefined Stripe payment links\n- Uses fallback links for unmapped amounts\n- Always returns HTTP 200 with working payment link\n\n**Authentication**: Not required - Public API\n**Permissions**: None - Accessible to all users\n", "parameters": [{"name": "data", "in": "body", "required": true, "schema": {"required": [], "type": "object", "properties": {"donate_type": {"description": "Type of donation - either 'monthly' for recurring donations or 'once' for one-time donations. This field is completely optional and will default to 'once' if not provided or if an invalid value is sent.", "type": "string", "enum": ["monthly", "once"]}, "price": {"description": "Donation amount as a string (e.g., '5.00', '10.00', '20.00'). This field is completely optional and will default to '10.00' if not provided or if an invalid value is sent.", "type": "string"}, "id": {"description": "Payment gateway identifier. This field is completely optional. If not provided, the system will automatically choose 'stripe' for non-Russian users and 'cloudtips' for Russian users (detected by language_code=ru or user country=RU). If an invalid value is provided, it defaults to 'stripe'.", "type": "string", "enum": ["stripe", "cloudtips"]}, "phone_number": {"description": "Optional phone number for the donor. This field is completely optional and can be omitted. If provided, it will be stored with the donation record.", "type": "string"}}, "example": {"donate_type": "once", "price": "15.00", "id": "stripe", "phone_number": "+1234567890"}}}], "responses": {"200": {"description": "Donation link created successfully. This API is guaranteed to always return HTTP 200 status with a working donation link, regardless of the input provided. Even if no data is sent in the request body, the API will respond with appropriate defaults.", "examples": {"application/json": {"complete_request": {"summary": "Complete Request with Phone Number", "description": "Response when all fields including phone_number are provided", "value": {"donate_user": 1, "donate_link": "https://donate.stripe.com/bIYdSDgiK7Pwh0ccMN"}}, "request_with_phone": {"summary": "Request Example with Phone", "description": "Example showing phone_number parameter usage", "value": {"donate_user": 1, "donate_link": "https://donate.stripe.com/9AQ01N5E68TAbFS002"}}, "empty_request_default": {"summary": "Empty Request (Default)", "description": "Response when no fields are provided - uses intelligent defaults", "value": {"donate_user": 1, "donate_link": "https://donate.stripe.com/7sI3dZaYq7Pw9xKcMV"}}, "empty_request_russian_user": {"summary": "Empty Request (Russian User)", "description": "Response for Russian users when no fields are provided", "value": {"donate_user": 1, "donate_link": "https://pay.cloudtips.ru/p/d5881ddf"}}, "cloudtips_payment": {"summary": "CloudTips Payment", "description": "Response when CloudTips payment method is selected", "value": {"donate_user": 1, "donate_link": "https://pay.cloudtips.ru/p/d5881ddf"}}, "invalid_data_fallback": {"summary": "Invalid Data Fallback", "description": "Response when invalid data is provided - normalized to defaults", "value": {"donate_user": 1, "donate_link": "https://donate.stripe.com/7sI3dZaYq7Pw9xKcMV"}}}}}}, "tags": ["Donate"]}, "parameters": []}, "/donate/v3/": {"get": {"operationId": "donate_v3_list", "description": "\n**Donation Details API V3**\n\nRetrieve donation pricing information and available payment methods with intelligent localization support.\n\n**Key Features:**\n- Monthly and one-time donation options\n- Dynamic pricing based on user location\n- Multiple payment gateway support\n- Localized currency and payment methods\n- Russian language and payment gateway support\n\n**Donation Types:**\n- **Monthly**: Recurring donations with subscription pricing\n- **Once**: One-time donations with flexible amounts\n\n**Payment Methods:**\n- **Stripe**: International payment gateway (default)\n- **CloudTips**: Russian payment gateway for Russian users\n\n**Localization Logic:**\n- Detects user language from request headers or query parameters\n- Detects user country from authenticated user profile\n- Russian users see ruble pricing and CloudTips payment option\n- Non-Russian users see USD pricing with Stripe only\n\n**Business Logic:**\n- Monthly donations: Same pricing for all users ($5, $10, $20, $50)\n- Once donations: USD for international users, RUB for Russian users\n- Russian detection: language_code=ru OR user.country=RU\n- Payment buttons include icon, text, and payment method ID\n\n**Authentication**: Not required - Public API\n**Permissions**: None - Accessible to all users\n", "parameters": [{"name": "limit", "in": "query", "description": "Number of results to return per page.", "required": false, "type": "integer"}, {"name": "offset", "in": "query", "description": "The initial index from which to return the results.", "required": false, "type": "integer"}, {"name": "language_code", "in": "query", "description": "Language preference (e.g., 'ru' for Russian, 'en' for English)", "required": false, "type": "string"}], "responses": {"200": {"description": "Donation details retrieved successfully", "examples": {"application/json": {"international_user_response": {"summary": "International User Response", "description": "Default response for non-Russian users with USD pricing", "value": {"monthly": {"prices": [{"value": "$5", "price": "5.00"}, {"value": "$10", "price": "10.00"}, {"value": "$20", "price": "20.00"}, {"value": "$50", "price": "50.00"}], "buttons": [{"icon": "https://habibapp.com/static/payicon.jpg", "text": "Donate Now", "id": "stripe"}]}, "once": {"prices": [{"value": "$5", "price": "5.00"}, {"value": "$15", "price": "15.00"}, {"value": "$30", "price": "30.00"}, {"value": "$40", "price": "40.00"}], "buttons": [{"icon": "https://habibapp.com/static/payicon.jpg", "text": "Donate Now", "id": "stripe"}]}}}, "russian_user_response": {"summary": "Russian User Response", "description": "Localized response for Russian users with ruble pricing and CloudTips", "value": {"monthly": {"prices": [{"value": "$5", "price": "5.00"}, {"value": "$10", "price": "10.00"}, {"value": "$20", "price": "20.00"}, {"value": "$50", "price": "50.00"}], "buttons": [{"icon": "https://habibapp.com/static/payicon.jpg", "text": "Donate Now", "id": "stripe"}]}, "once": {"prices": [{"value": "₽500", "price": "5.00"}, {"value": "₽1500", "price": "15.00"}, {"value": "₽3000", "price": "30.00"}, {"value": "₽4000", "price": "40.00"}], "buttons": [{"icon": "https://habibapp.com/static/payicon.jpg", "text": "Donate Now", "id": "stripe"}, {"icon": "https://habibapp.com/static/cloudtips_icon.png", "text": "Пожертвовать через CloudTips", "id": "cloudtips"}]}}}}}}}, "tags": ["Donate"]}, "parameters": []}, "/dont-kill-help/": {"get": {"operationId": "dont-kill-help_read", "description": "", "parameters": [], "responses": {"200": {"description": "", "schema": {"$ref": "#/definitions/DontKillApp"}}}, "tags": ["dont-kill-help"]}, "parameters": []}, "/eightmag-categories/": {"get": {"operationId": "eightmag-categories_list", "description": "", "parameters": [], "responses": {"200": {"description": "", "schema": {"type": "array", "items": {"$ref": "#/definitions/EightmagCategories"}}}}, "tags": ["eightmag-categories"]}, "parameters": []}, "/eightmag-category-items/{slug}/": {"get": {"operationId": "eightmag-category-items_read", "description": "", "parameters": [{"name": "limit", "in": "query", "description": "Number of results to return per page.", "required": false, "type": "integer"}, {"name": "offset", "in": "query", "description": "The initial index from which to return the results.", "required": false, "type": "integer"}], "responses": {"200": {"description": "", "schema": {"required": ["count", "results"], "type": "object", "properties": {"count": {"type": "integer"}, "next": {"type": "string", "format": "uri", "x-nullable": true}, "previous": {"type": "string", "format": "uri", "x-nullable": true}, "results": {"type": "array", "items": {"$ref": "#/definitions/EightmagList"}}}}}}, "tags": ["eightmag-category-items"]}, "parameters": [{"name": "slug", "in": "path", "required": true, "type": "string"}]}, "/eightmag-details/{slug}/": {"get": {"operationId": "eightmag-details_read", "description": "", "parameters": [], "responses": {"200": {"description": "", "schema": {"$ref": "#/definitions/EightmagDetails"}}}, "tags": ["eightmag-details"]}, "parameters": [{"name": "slug", "in": "path", "required": true, "type": "string"}]}, "/eightmag-details/{slug}/like/": {"post": {"operationId": "eightmag-details_like_create", "description": "", "parameters": [], "responses": {"201": {"description": ""}}, "tags": ["eightmag-details"]}, "parameters": [{"name": "slug", "in": "path", "required": true, "type": "string"}]}, "/eightmag-list/": {"get": {"operationId": "eightmag-list_list", "description": "", "parameters": [{"name": "limit", "in": "query", "description": "Number of results to return per page.", "required": false, "type": "integer"}, {"name": "offset", "in": "query", "description": "The initial index from which to return the results.", "required": false, "type": "integer"}], "responses": {"200": {"description": "", "schema": {"required": ["count", "results"], "type": "object", "properties": {"count": {"type": "integer"}, "next": {"type": "string", "format": "uri", "x-nullable": true}, "previous": {"type": "string", "format": "uri", "x-nullable": true}, "results": {"type": "array", "items": {"$ref": "#/definitions/EightmagList"}}}}}}, "tags": ["eightmag-list"]}, "parameters": []}, "/elalhabib/": {"get": {"operationId": "elalhabib_list", "description": "", "parameters": [{"name": "limit", "in": "query", "description": "Number of results to return per page.", "required": false, "type": "integer"}, {"name": "offset", "in": "query", "description": "The initial index from which to return the results.", "required": false, "type": "integer"}], "responses": {"200": {"description": "", "schema": {"required": ["count", "results"], "type": "object", "properties": {"count": {"type": "integer"}, "next": {"type": "string", "format": "uri", "x-nullable": true}, "previous": {"type": "string", "format": "uri", "x-nullable": true}, "results": {"type": "array", "items": {"$ref": "#/definitions/ElalHabib"}}}}}}, "tags": ["elalhabib"]}, "parameters": []}, "/elalhabib/lectures/": {"get": {"operationId": "elalhabib_lectures_list", "description": "", "parameters": [{"name": "limit", "in": "query", "description": "Number of results to return per page.", "required": false, "type": "integer"}, {"name": "offset", "in": "query", "description": "The initial index from which to return the results.", "required": false, "type": "integer"}], "responses": {"200": {"description": "", "schema": {"required": ["count", "results"], "type": "object", "properties": {"count": {"type": "integer"}, "next": {"type": "string", "format": "uri", "x-nullable": true}, "previous": {"type": "string", "format": "uri", "x-nullable": true}, "results": {"type": "array", "items": {"$ref": "#/definitions/ElalHabibSingerInList"}}}}}}, "tags": ["elalhabib"]}, "parameters": []}, "/elalhabib/madah/": {"get": {"operationId": "elalhabib_madah_list", "description": "", "parameters": [{"name": "limit", "in": "query", "description": "Number of results to return per page.", "required": false, "type": "integer"}, {"name": "offset", "in": "query", "description": "The initial index from which to return the results.", "required": false, "type": "integer"}], "responses": {"200": {"description": "", "schema": {"required": ["count", "results"], "type": "object", "properties": {"count": {"type": "integer"}, "next": {"type": "string", "format": "uri", "x-nullable": true}, "previous": {"type": "string", "format": "uri", "x-nullable": true}, "results": {"type": "array", "items": {"$ref": "#/definitions/ElalHabibSingerInList"}}}}}}, "tags": ["elalhabib"]}, "parameters": []}, "/habcoin/buy-package/": {"post": {"operationId": "habcoin_buy-package_create", "description": "", "parameters": [], "responses": {"201": {"description": ""}}, "tags": ["habcoin"]}, "parameters": []}, "/habcoin/contact-info/": {"get": {"operationId": "habcoin_contact-info_list", "description": "", "parameters": [], "responses": {"200": {"description": ""}}, "tags": ["habcoin"]}, "parameters": []}, "/habcoin/discount-usage-history/": {"get": {"operationId": "habcoin_discount-usage-history_list", "description": "Get user's discount code usage history", "parameters": [], "responses": {"200": {"description": "List of user discount code usages", "schema": {"type": "array", "items": {"$ref": "#/definitions/DiscountCodeUsage"}}}, "401": {"description": "Unauthorized - Authentication required"}}, "tags": ["Discount Code"]}, "parameters": []}, "/habcoin/inventory/": {"get": {"operationId": "habcoin_inventory_list", "description": "", "parameters": [], "responses": {"200": {"description": ""}}, "tags": ["habcoin"]}, "parameters": []}, "/habcoin/packages/": {"get": {"operationId": "habcoin_packages_list", "description": "", "parameters": [], "responses": {"200": {"description": "", "schema": {"type": "array", "items": {"$ref": "#/definitions/Package"}}}}, "tags": ["habcoin"]}, "parameters": []}, "/habcoin/pay/": {"get": {"operationId": "habcoin_pay_list", "description": "", "parameters": [{"name": "token", "in": "query", "description": "Security token", "required": true, "type": "string"}, {"name": "service", "in": "query", "description": "Service type", "required": true, "type": "string"}, {"name": "object_id", "in": "query", "description": "Object ID related to the service", "required": true, "type": "integer"}, {"name": "amount", "in": "query", "description": "The number of coins to be deducted", "required": false, "type": "integer"}, {"name": "app_name", "in": "query", "description": "Optional app label for the model", "required": false, "type": "string"}, {"name": "discount_code", "in": "query", "description": "Optional discount code to apply discount on payment. The code will be validated and discount will be automatically applied if valid.", "required": false, "type": "string"}], "responses": {"200": {"description": "Coins deducted successfully", "examples": {"application/json": {"status": "Coins deducted successfully", "original_price": 10, "final_price": 8, "discount_applied": 2}}}, "400": {"description": "Not enough coins or invalid discount code"}, "403": {"description": "Invalid security token"}, "404": {"description": "User not found"}}, "tags": ["habcoin"]}, "parameters": []}, "/habcoin/support/": {"post": {"operationId": "habcoin_support_create", "description": "", "parameters": [{"name": "data", "in": "body", "required": true, "schema": {"$ref": "#/definitions/Support"}}], "responses": {"201": {"description": "", "schema": {"$ref": "#/definitions/Support"}}}, "tags": ["habcoin"]}, "parameters": []}, "/habcoin/transactions/": {"get": {"operationId": "habcoin_transactions_list", "description": "", "parameters": [{"name": "limit", "in": "query", "description": "Number of results to return per page.", "required": false, "type": "integer"}, {"name": "offset", "in": "query", "description": "The initial index from which to return the results.", "required": false, "type": "integer"}], "responses": {"200": {"description": "", "schema": {"required": ["count", "results"], "type": "object", "properties": {"count": {"type": "integer"}, "next": {"type": "string", "format": "uri", "x-nullable": true}, "previous": {"type": "string", "format": "uri", "x-nullable": true}, "results": {"type": "array", "items": {"$ref": "#/definitions/Transactions"}}}}}}, "tags": ["habcoin"]}, "parameters": []}, "/habcoin/user-coin-usages/": {"get": {"operationId": "habcoin_user-coin-usages_list", "description": "", "parameters": [], "responses": {"200": {"description": "", "schema": {"type": "array", "items": {"$ref": "#/definitions/UserCoinUsage"}}}}, "tags": ["habcoin"]}, "parameters": []}, "/habcoin/user-packages/": {"get": {"operationId": "habcoin_user-packages_list", "description": "", "parameters": [], "responses": {"200": {"description": "", "schema": {"type": "array", "items": {"$ref": "#/definitions/UserPackage"}}}}, "tags": ["habcoin"]}, "parameters": []}, "/habcoin/v2/pay/": {"get": {"operationId": "habcoin_v2_pay_list", "summary": "Escrow Payment API (V2)", "description": "Extends the original Pay view with support for escrow-style payments:\n- hold: Deduct coins from user but do NOT transfer to provider (escrow hold)\n- release: Transfer held coins to provider's wallet (after successful call)\n- refund: Return held coins to user's balance (on cancellation)\n- direct: Same as original Pay — deduct from user AND transfer to provider", "parameters": [{"name": "token", "in": "query", "description": "Security token", "required": true, "type": "string"}, {"name": "action", "in": "query", "description": "Payment action: hold, release, refund, direct", "required": true, "type": "string", "enum": ["hold", "release", "refund", "direct"]}, {"name": "username", "in": "query", "description": "User email (legacy fallback for hold, refund, direct)", "required": false, "type": "string"}, {"name": "habib_user_id", "in": "query", "description": "Unambiguous payer id; preferred over username when present", "required": false, "type": "integer"}, {"name": "amount", "in": "query", "description": "Number of coins", "required": true, "type": "integer"}, {"name": "object_id", "in": "query", "description": "Consultant ID", "required": false, "type": "integer"}, {"name": "call_id", "in": "query", "description": "Call ID for tracking", "required": false, "type": "integer"}, {"name": "service", "in": "query", "description": "Service type (e.g. calls_hold, calls_release)", "required": false, "type": "string"}, {"name": "app_name", "in": "query", "description": "App label for content type lookup", "required": false, "type": "string"}, {"name": "discount_code", "in": "query", "description": "Optional discount code (only used in hold/direct)", "required": false, "type": "string"}], "responses": {"200": {"description": "Success", "examples": {"application/json": {"status": "Coins deducted successfully"}}}, "400": {"description": "Bad request"}, "403": {"description": "Invalid security token"}, "404": {"description": "Not found"}}, "tags": ["habcoin"]}, "parameters": []}, "/habcoin/validate-discount/": {"post": {"operationId": "habcoin_validate-discount_create", "description": "Validate discount code and calculate final price", "parameters": [{"name": "data", "in": "body", "required": true, "schema": {"required": ["code", "service", "object_id"], "type": "object", "properties": {"code": {"description": "Discount code", "type": "string", "example": "SUMMER20"}, "service": {"description": "Service name (checkup, meet, etc.)", "type": "string", "example": "checkup"}, "object_id": {"description": "Object ID (Checkup or Meet ID)", "type": "integer", "example": 5}, "app_name": {"description": "App name (optional)", "type": "string", "example": "checkup"}}}}], "responses": {"200": {"description": "Discount code is valid", "examples": {"application/json": {"valid": true, "original_price": 10.0, "discounted_price": 8.0, "discount_amount": 2.0, "discount_percentage": 20.0, "message": "Discount code is valid and 20% discount will be applied"}}}, "400": {"description": "Invalid discount code", "examples": {"application/json": {"valid": false, "errors": {"code": ["Discount code has expired"]}}}}, "401": {"description": "Unauthorized - Authentication required"}}, "tags": ["Discount Code"]}, "parameters": []}, "/habibmeet/guidelines/": {"get": {"operationId": "habibmeet_guidelines_list", "description": "", "parameters": [{"name": "page", "in": "query", "description": "A page number within the paginated result set.", "required": false, "type": "integer"}], "responses": {"200": {"description": ""}}, "tags": ["habibmeet"]}, "parameters": []}, "/habibmeet/meets/": {"get": {"operationId": "habibmeet_meets_list", "description": "", "parameters": [{"name": "limit", "in": "query", "description": "Number of results to return per page.", "required": false, "type": "integer"}, {"name": "offset", "in": "query", "description": "The initial index from which to return the results.", "required": false, "type": "integer"}, {"name": "meet_type", "in": "query", "description": "Meet Type (e.g., is_free, is_suggested)", "type": "string"}, {"name": "language_code", "in": "query", "description": "Language Code (e.g., en, fa, es)", "type": "string"}, {"name": "search", "in": "query", "description": "Search term", "type": "string"}], "responses": {"200": {"description": "", "schema": {"required": ["count", "results"], "type": "object", "properties": {"count": {"type": "integer"}, "next": {"type": "string", "format": "uri", "x-nullable": true}, "previous": {"type": "string", "format": "uri", "x-nullable": true}, "results": {"type": "array", "items": {"$ref": "#/definitions/MeetSerializer"}}}}}}, "tags": ["habibmeet"]}, "parameters": []}, "/habibmeet/meets/archive/{session_id}/": {"delete": {"operationId": "habibmeet_meets_archive_delete", "description": "", "parameters": [], "responses": {"204": {"description": ""}}, "tags": ["habibmeet"]}, "parameters": [{"name": "session_id", "in": "path", "required": true, "type": "string"}]}, "/habibmeet/meets/create/": {"post": {"operationId": "habibmeet_meets_create_create", "description": "", "parameters": [{"name": "data", "in": "body", "required": true, "schema": {"$ref": "#/definitions/MeetCreate"}}], "responses": {"201": {"description": "", "schema": {"$ref": "#/definitions/MeetCreate"}}}, "tags": ["habibmeet"]}, "parameters": []}, "/habibmeet/meets/create/v2/": {"post": {"operationId": "habibmeet_meets_create_v2_create", "description": "Create a new meet with access control (public/private) and optional password.", "parameters": [{"name": "data", "in": "body", "required": true, "schema": {"$ref": "#/definitions/MeetCreateV2"}}], "responses": {"201": {"description": "", "schema": {"$ref": "#/definitions/MeetCreateV2"}}}, "tags": ["habibmeet"]}, "parameters": []}, "/habibmeet/meets/provider/profile/": {"post": {"operationId": "habibmeet_meets_provider_profile_create", "description": "", "parameters": [{"name": "data", "in": "body", "required": true, "schema": {"$ref": "#/definitions/MeetProviderProfile"}}], "responses": {"201": {"description": "", "schema": {"$ref": "#/definitions/MeetProviderProfile"}}}, "tags": ["habibmeet"]}, "parameters": []}, "/habibmeet/meets/providers/": {"get": {"operationId": "habibmeet_meets_providers_list", "description": "", "parameters": [{"name": "limit", "in": "query", "description": "Number of results to return per page.", "required": false, "type": "integer"}, {"name": "offset", "in": "query", "description": "The initial index from which to return the results.", "required": false, "type": "integer"}], "responses": {"200": {"description": "", "schema": {"required": ["count", "results"], "type": "object", "properties": {"count": {"type": "integer"}, "next": {"type": "string", "format": "uri", "x-nullable": true}, "previous": {"type": "string", "format": "uri", "x-nullable": true}, "results": {"type": "array", "items": {"$ref": "#/definitions/ProviderMeetSerializer"}}}}}}, "tags": ["habibmeet"]}, "parameters": []}, "/habibmeet/meets/providers/{id}/": {"get": {"operationId": "habibmeet_meets_providers_read", "description": "", "parameters": [], "responses": {"200": {"description": "", "schema": {"$ref": "#/definitions/ProviderDetailMeetSerializer"}}}, "tags": ["habibmeet"]}, "parameters": [{"name": "id", "in": "path", "description": "A unique integer value identifying this Meet Provider Profile.", "required": true, "type": "integer"}]}, "/habibmeet/meets/reminders/": {"get": {"operationId": "habibmeet_meets_reminders_list", "description": "", "parameters": [{"name": "limit", "in": "query", "description": "Number of results to return per page.", "required": false, "type": "integer"}, {"name": "offset", "in": "query", "description": "The initial index from which to return the results.", "required": false, "type": "integer"}], "responses": {"200": {"description": "", "schema": {"required": ["count", "results"], "type": "object", "properties": {"count": {"type": "integer"}, "next": {"type": "string", "format": "uri", "x-nullable": true}, "previous": {"type": "string", "format": "uri", "x-nullable": true}, "results": {"type": "array", "items": {"$ref": "#/definitions/MeetSerializer"}}}}}}, "tags": ["habibmeet"]}, "parameters": []}, "/habibmeet/meets/room/": {"get": {"operationId": "habibmeet_meets_room_list", "description": "", "parameters": [{"name": "limit", "in": "query", "description": "Number of results to return per page.", "required": false, "type": "integer"}, {"name": "offset", "in": "query", "description": "The initial index from which to return the results.", "required": false, "type": "integer"}], "responses": {"200": {"description": "", "schema": {"required": ["count", "results"], "type": "object", "properties": {"count": {"type": "integer"}, "next": {"type": "string", "format": "uri", "x-nullable": true}, "previous": {"type": "string", "format": "uri", "x-nullable": true}, "results": {"type": "array", "items": {"$ref": "#/definitions/MeetProviderRoom"}}}}}}, "tags": ["habibmeet"]}, "parameters": []}, "/habibmeet/meets/{meet_id}/": {"get": {"operationId": "habibmeet_meets_read", "description": "\nRetrieve detailed information about a specific meet including recordings.\n\nReturns complete meet details with all associated session recordings.\nEach recording includes session information, file details, and metadata.\n\n### Response Structure:\n```json\n{\n \"id\": 174,\n \"name\": \"تست-(Tester)\",\n \"description\": \"Meeting description\",\n \"next_session_subject\": \"Next session topic\",\n \"next_session_schedule\": \"2024-01-01T10:00:00Z\",\n \"is_suggested\": false,\n \"provider\": {\n \"id\": 1,\n \"username\": \"provider_name\",\n \"email\": \"provider@example.com\"\n },\n \"is_free\": true,\n \"price\": \"0.00\",\n \"is_live\": false,\n \"is_closed\": false,\n \"online_users_count\": 0,\n \"language\": \"fa\",\n \"categories\": [],\n \"organizer\": \"Provider Name\",\n \"is_provider\": true,\n \"live_session_id\": null,\n \"has_archive\": true,\n \"recordings\": [\n {\n \"id\": 1,\n \"title\": \"Session Recording\",\n \"file\": \"https://habibapp.com/media/recorded_sessions/recording.mp4\",\n \"file_time\": \"01:30:00\",\n \"recording_type\": \"video\",\n \"created_at\": \"2024-01-01T10:00:00Z\",\n \"session_id\": 548,\n \"session_subject\": \"تلت\"\n }\n ],\n \"access\": \"public\",\n \"password\": null,\n \"has_recording\": true\n}\n```\n\n### Features:\n- Complete meet information\n- All active session recordings included\n- Provider and organizer details\n- Live session status and ID\n- Access control information\n- Recording availability status\n", "parameters": [{"name": "meet_id", "in": "path", "description": "ID of the meet to retrieve details for", "required": true, "type": "integer"}], "responses": {"200": {"description": "Meet details retrieved successfully", "schema": {"type": "object", "properties": {"id": {"description": "Meet ID", "type": "integer"}, "name": {"description": "Meet name", "type": "string"}, "description": {"description": "Meet description", "type": "string"}, "next_session_subject": {"description": "Next session subject", "type": "string"}, "next_session_schedule": {"description": "Next session schedule", "type": "string", "format": "date-time"}, "is_suggested": {"description": "Whether meet is suggested", "type": "boolean"}, "provider": {"type": "object", "properties": {"id": {"description": "Provider ID", "type": "integer"}, "username": {"description": "Provider username", "type": "string"}, "email": {"description": "Provider email", "type": "string"}}}, "is_free": {"description": "Whether meet is free", "type": "boolean"}, "price": {"description": "Meet price", "type": "string"}, "is_live": {"description": "Whether meet is currently live", "type": "boolean"}, "is_closed": {"description": "Whether meet is closed", "type": "boolean"}, "online_users_count": {"description": "Number of online users", "type": "integer"}, "language": {"description": "Meet language code", "type": "string"}, "categories": {"description": "Meet categories", "type": "array", "items": {"type": "string"}}, "organizer": {"description": "Organizer name", "type": "string"}, "is_provider": {"description": "Whether current user is the provider", "type": "boolean"}, "live_session_id": {"description": "ID of current live session", "type": "integer", "nullable": true}, "has_archive": {"description": "Whether meet has archived sessions", "type": "boolean"}, "recordings": {"description": "List of all active recordings for this meet", "type": "array", "items": {"type": "object", "properties": {"id": {"description": "Recording ID", "type": "integer"}, "title": {"description": "Recording title", "type": "string"}, "file": {"description": "Recording file URL", "type": "string"}, "file_time": {"description": "Recording duration", "type": "string"}, "recording_type": {"description": "Recording type: voice or video", "type": "string"}, "created_at": {"description": "Recording creation timestamp", "type": "string", "format": "date-time"}, "session_id": {"description": "Associated session ID", "type": "integer"}, "session_subject": {"description": "Session subject/title", "type": "string"}}}}, "access": {"description": "Meet access level", "type": "string"}, "password": {"description": "Meet password if required", "type": "string", "nullable": true}, "has_recording": {"description": "Whether meet has any recordings", "type": "boolean"}}}}, "401": {"description": "Authentication required"}, "403": {"description": "Permission denied"}, "404": {"description": "Meet not found"}}, "tags": ["habibmeet"]}, "put": {"operationId": "habibmeet_meets_update", "description": "", "parameters": [{"name": "data", "in": "body", "required": true, "schema": {"$ref": "#/definitions/MeetDetailSerializer"}}], "responses": {"200": {"description": "", "schema": {"$ref": "#/definitions/MeetDetailSerializer"}}}, "tags": ["habibmeet"]}, "patch": {"operationId": "habibmeet_meets_partial_update", "description": "", "parameters": [{"name": "data", "in": "body", "required": true, "schema": {"$ref": "#/definitions/MeetDetailSerializer"}}], "responses": {"200": {"description": "", "schema": {"$ref": "#/definitions/MeetDetailSerializer"}}}, "tags": ["habibmeet"]}, "delete": {"operationId": "habibmeet_meets_delete", "description": "", "parameters": [], "responses": {"204": {"description": ""}}, "tags": ["habibmeet"]}, "parameters": [{"name": "meet_id", "in": "path", "required": true, "type": "string"}]}, "/habibmeet/meets/{meet_id}/archive/": {"get": {"operationId": "habibmeet_meets_archive_list", "description": "", "parameters": [{"name": "limit", "in": "query", "description": "Number of results to return per page.", "required": false, "type": "integer"}, {"name": "offset", "in": "query", "description": "The initial index from which to return the results.", "required": false, "type": "integer"}], "responses": {"200": {"description": "", "schema": {"required": ["count", "results"], "type": "object", "properties": {"count": {"type": "integer"}, "next": {"type": "string", "format": "uri", "x-nullable": true}, "previous": {"type": "string", "format": "uri", "x-nullable": true}, "results": {"type": "array", "items": {"$ref": "#/definitions/SessionArchiveSerializer"}}}}}}, "tags": ["habibmeet"]}, "parameters": [{"name": "meet_id", "in": "path", "description": "The meet this session belongs to", "required": true, "type": "string"}]}, "/habibmeet/meets/{meet_id}/close/": {"post": {"operationId": "habibmeet_meets_close_create", "description": "", "parameters": [], "responses": {"201": {"description": ""}}, "tags": ["habibmeet"]}, "parameters": [{"name": "meet_id", "in": "path", "required": true, "type": "string"}]}, "/habibmeet/meets/{meet_id}/reminder/update/": {"put": {"operationId": "habibmeet_meets_reminder_update_update", "description": "Update or create a reminder for a meet with specified active status", "parameters": [{"name": "data", "in": "body", "required": true, "schema": {"required": ["is_active"], "type": "object", "properties": {"is_active": {"description": "Whether the reminder is active or not", "type": "boolean"}}}}], "responses": {"200": {"description": "Reminder status updated successfully", "schema": {"type": "object", "properties": {"message": {"type": "string"}}}}, "201": {"description": "Reminder created with specified status", "schema": {"type": "object", "properties": {"message": {"type": "string"}}}}, "400": {"description": "Invalid request parameters", "schema": {"type": "object", "properties": {"detail": {"type": "string"}}}}}, "tags": ["habibmeet"]}, "parameters": [{"name": "meet_id", "in": "path", "required": true, "type": "string"}]}, "/habibmeet/meets/{meet_id}/report/": {"post": {"operationId": "habibmeet_meets_report_create", "description": "", "parameters": [{"name": "data", "in": "body", "required": true, "schema": {"$ref": "#/definitions/ReportSerializer"}}], "responses": {"201": {"description": "", "schema": {"$ref": "#/definitions/ReportSerializer"}}}, "tags": ["habibmeet"]}, "parameters": [{"name": "meet_id", "in": "path", "description": "Meet being reported on", "required": true, "type": "string"}]}, "/habibmeet/meets/{meet_id}/schedule/": {"delete": {"operationId": "habibmeet_meets_schedule_delete", "description": "Delete the next session subject and schedule if the meet is not live.\nIf the meet is live, an error is returned. If the next session subject and\nschedule are already empty, an error is returned.", "parameters": [], "responses": {"204": {"description": ""}}, "tags": ["habibmeet"]}, "parameters": [{"name": "meet_id", "in": "path", "required": true, "type": "string"}]}, "/habibmeet/meets/{meet_id}/session/": {"post": {"operationId": "habibmeet_meets_session_create", "description": "", "parameters": [{"name": "data", "in": "body", "required": true, "schema": {"$ref": "#/definitions/SessionCreate"}}], "responses": {"201": {"description": "", "schema": {"$ref": "#/definitions/SessionCreate"}}}, "tags": ["habibmeet"]}, "parameters": [{"name": "meet_id", "in": "path", "required": true, "type": "string"}]}, "/habibmeet/recordings/create/": {"post": {"operationId": "habibmeet_recordings_create_create", "summary": "API endpoint for creating new session recordings.", "description": "Allows authenticated users to create recordings for sessions.", "parameters": [{"name": "data", "in": "body", "required": true, "schema": {"$ref": "#/definitions/SessionRecordingCreateUpdateSerializer"}}], "responses": {"201": {"description": "", "schema": {"$ref": "#/definitions/SessionRecordingCreateUpdateSerializer"}}}, "tags": ["habibmeet"]}, "parameters": []}, "/habibmeet/recordings/{recording_id}/delete/": {"delete": {"operationId": "habibmeet_recordings_delete_delete", "description": "Handle DELETE request with proper error handling and status codes.", "parameters": [], "responses": {"204": {"description": ""}}, "tags": ["habibmeet"]}, "parameters": [{"name": "recording_id", "in": "path", "required": true, "type": "string"}]}, "/habibmeet/recordings/{recording_id}/update/": {"put": {"operationId": "habibmeet_recordings_update_update", "summary": "API endpoint for updating existing session recordings.", "description": "Allows authenticated users to update recordings they own.", "parameters": [{"name": "data", "in": "body", "required": true, "schema": {"$ref": "#/definitions/SessionRecordingCreateUpdateSerializer"}}], "responses": {"200": {"description": "", "schema": {"$ref": "#/definitions/SessionRecordingCreateUpdateSerializer"}}}, "tags": ["habibmeet"]}, "patch": {"operationId": "habibmeet_recordings_update_partial_update", "summary": "API endpoint for updating existing session recordings.", "description": "Allows authenticated users to update recordings they own.", "parameters": [{"name": "data", "in": "body", "required": true, "schema": {"$ref": "#/definitions/SessionRecordingCreateUpdateSerializer"}}], "responses": {"200": {"description": "", "schema": {"$ref": "#/definitions/SessionRecordingCreateUpdateSerializer"}}}, "tags": ["habibmeet"]}, "parameters": [{"name": "recording_id", "in": "path", "required": true, "type": "string"}]}, "/habibmeet/sessions/{id}/upload/": {"put": {"operationId": "habibmeet_sessions_upload_update", "description": "", "parameters": [{"name": "data", "in": "body", "required": true, "schema": {"$ref": "#/definitions/SessionFileUpload"}}], "responses": {"200": {"description": "", "schema": {"$ref": "#/definitions/SessionFileUpload"}}}, "tags": ["habibmeet"]}, "patch": {"operationId": "habibmeet_sessions_upload_partial_update", "description": "Upload a file for a specific session.", "parameters": [{"name": "data", "in": "body", "required": true, "schema": {"$ref": "#/definitions/SessionFileUpload"}}, {"name": "recorded_file", "in": "file", "description": "The file to upload for the session.", "required": true, "type": "file"}], "responses": {"200": {"description": "", "schema": {"$ref": "#/definitions/SessionFileUpload"}}}, "tags": ["habibmeet"]}, "parameters": [{"name": "id", "in": "path", "description": "A unique integer value identifying this session.", "required": true, "type": "integer"}]}, "/habibmeet/{id}/recordings/": {"get": {"operationId": "habibmeet_recordings_list", "description": "\nRetrieve a list of recorded meeting sessions for a specific meet.\n\nReturns all active session recordings for the specified meet ID with their\nassociated session details, file information, duration, and recording type (voice/video).\n\n### Response Structure:\n```json\n[\n {\n \"id\": 1,\n \"title\": \"Meeting Recording\",\n \"file\": \"https://habibapp.com/media/recorded_sessions/recording.mp4\",\n \"file_time\": \"01:30:00\",\n \"recording_type\": \"video\",\n \"created_at\": \"2024-01-01T10:00:00Z\",\n \"session_id\": 123,\n \"session_subject\": \"Weekly Team Meeting\"\n }\n]\n```\n\n### Features:\n- Only returns active recordings for the specified meet (is_active=True)\n- Includes session information for context\n- Supports filtering and pagination\n- Ordered by creation date (newest first)\n", "parameters": [{"name": "limit", "in": "query", "description": "Number of results to return per page.", "required": false, "type": "integer"}, {"name": "offset", "in": "query", "description": "The initial index from which to return the results.", "required": false, "type": "integer"}, {"name": "id", "in": "path", "description": "ID of the meet to retrieve recordings for", "required": true, "type": "integer"}], "responses": {"200": {"description": "List of session recordings for the specified meet retrieved successfully", "schema": {"type": "array", "items": {"type": "object", "properties": {"id": {"description": "Recording ID", "type": "integer"}, "title": {"description": "Recording title", "type": "string"}, "file": {"description": "File URL", "type": "string"}, "file_time": {"description": "Recording duration", "type": "string"}, "recording_type": {"description": "Type: voice or video", "type": "string"}, "created_at": {"description": "Creation timestamp", "type": "string", "format": "date-time"}, "session_id": {"description": "Associated session ID", "type": "integer"}, "session_subject": {"description": "Session subject/title", "type": "string"}}}}}, "401": {"description": "Authentication required"}, "403": {"description": "Permission denied"}, "404": {"description": "Meet not found"}}, "tags": ["habibmeet"]}, "parameters": [{"name": "id", "in": "path", "required": true, "type": "string"}]}, "/habibnet/centers/": {"get": {"operationId": "habibnet_centers_list", "description": "", "parameters": [{"name": "limit", "in": "query", "description": "Number of results to return per page.", "required": false, "type": "integer"}, {"name": "offset", "in": "query", "description": "The initial index from which to return the results.", "required": false, "type": "integer"}], "responses": {"200": {"description": "", "schema": {"required": ["count", "results"], "type": "object", "properties": {"count": {"type": "integer"}, "next": {"type": "string", "format": "uri", "x-nullable": true}, "previous": {"type": "string", "format": "uri", "x-nullable": true}, "results": {"type": "array", "items": {"$ref": "#/definitions/CenterList"}}}}}}, "tags": ["habibnet"]}, "parameters": []}, "/habibnet/centers/{id}/": {"get": {"operationId": "habibnet_centers_read", "description": "", "parameters": [], "responses": {"200": {"description": "", "schema": {"$ref": "#/definitions/CenterDetail"}}}, "tags": ["habibnet"]}, "parameters": [{"name": "id", "in": "path", "description": "A unique integer value identifying this center.", "required": true, "type": "integer"}]}, "/habibnet/centers/{id}/events/": {"get": {"operationId": "habibnet_centers_events_list", "description": "", "parameters": [{"name": "limit", "in": "query", "description": "Number of results to return per page.", "required": false, "type": "integer"}, {"name": "offset", "in": "query", "description": "The initial index from which to return the results.", "required": false, "type": "integer"}], "responses": {"200": {"description": "", "schema": {"required": ["count", "results"], "type": "object", "properties": {"count": {"type": "integer"}, "next": {"type": "string", "format": "uri", "x-nullable": true}, "previous": {"type": "string", "format": "uri", "x-nullable": true}, "results": {"type": "array", "items": {"$ref": "#/definitions/CenterEvent"}}}}}}, "tags": ["habibnet"]}, "parameters": [{"name": "id", "in": "path", "required": true, "type": "string"}]}, "/habibnet/provider/center/": {"get": {"operationId": "habibnet_provider_center_read", "description": "\nRetrieve the center owned by the authenticated provider.\n\n### Requirements:\n- User must be authenticated\n- User must have a verified provider profile\n- Provider must have created a center\n\n### Notes:\n- Each provider can only have one center\n- Returns the provider's center with all details including status\n\n### Response Structure:\nReturns the center details including status, images, and all other information.\n", "parameters": [], "responses": {"200": {"description": "Center retrieved successfully", "schema": {"type": "object", "properties": {"id": {"description": "Center ID", "type": "integer"}, "avatar": {"description": "Avatar URL", "type": "string"}, "name": {"description": "Center name", "type": "string"}, "slogan": {"description": "Center slogan", "type": "string"}, "center_type": {"description": "Center type", "type": "string"}, "about_center": {"description": "About center", "type": "string"}, "working_hours": {"description": "Working hours", "type": "object"}, "social_medias": {"description": "Social media links", "type": "array", "items": {"type": "object"}}, "address": {"description": "Address", "type": "string"}, "lat": {"description": "Latitude", "type": "number"}, "lon": {"description": "Longitude", "type": "number"}, "images": {"description": "Center images", "type": "array", "items": {"type": "object", "properties": {"id": {"type": "integer"}, "image": {"type": "string"}, "priority": {"type": "integer"}}}}, "status": {"description": "Approval status (pending, approved, rejected)", "type": "string"}, "created_at": {"type": "string", "format": "date-time"}, "updated_at": {"type": "string", "format": "date-time"}}}, "examples": {"application/json": {"id": 1, "avatar": "https://habibapp.com/media/habibnet/avatars/center_avatar.jpg", "name": "Islamic Center of New York", "slogan": "Serving the community since 1990", "center_type": "islamic_center", "about_center": "A comprehensive Islamic center...", "working_hours": {"monday": "9:00 AM - 9:00 PM", "friday": "9:00 AM - 11:00 PM"}, "social_medias": [{"platform": "facebook", "url": "https://facebook.com/center"}], "address": "123 Main Street, New York, NY 10001", "lat": 40.7128, "lon": -74.006, "images": [{"id": 1, "image": "https://habibapp.com/media/habibnet/image1.jpg", "priority": 1}], "status": "pending", "created_at": "2024-01-15T10:30:00Z", "updated_at": "2024-01-15T10:30:00Z"}}}, "401": {"description": "Authentication required"}, "404": {"description": "Provider profile or center not found", "examples": {"application/json": {"detail": "No verified provider profile found. Please submit a provider request first."}}}}, "tags": ["habibnet"]}, "parameters": []}, "/habibnet/provider/center/create/": {"post": {"operationId": "habibnet_provider_center_create_create", "description": "\nCreate a new center for the authenticated provider.\n\n### Requirements:\n- User must be authenticated\n- User must have a verified provider profile\n- Provider profile must be approved\n\n### Request Body:\nThe request should include center details and optionally images.\n\n**IMPORTANT**: Image fields (avatar, images) must be string URLs from the `/habibnet/upload-tmp-media/` endpoint, NOT binary file data.\n\n### Image Upload Workflow:\n1. First upload each image file to `/habibnet/upload-tmp-media/` endpoint\n2. Extract the `file` value from the response (e.g., \"/tmp/xyz-avatar.jpg\")\n3. Use this path string in the center creation request\n\n### Example Request:\n```json\n{\n \"avatar\": \"/tmp/xyz-avatar.jpg\",\n \"name\": \"Islamic Center of New York\",\n \"slogan\": \"Serving the community since 1990\",\n \"center_type\": \"islamic_center\",\n \"about_center\": \"A comprehensive Islamic center offering prayer facilities, educational programs, and community services.\",\n \"working_hours\": {\n \"monday\": \"9:00 AM - 9:00 PM\",\n \"tuesday\": \"9:00 AM - 9:00 PM\",\n \"wednesday\": \"9:00 AM - 9:00 PM\",\n \"thursday\": \"9:00 AM - 9:00 PM\",\n \"friday\": \"9:00 AM - 11:00 PM\",\n \"saturday\": \"9:00 AM - 11:00 PM\",\n \"sunday\": \"9:00 AM - 9:00 PM\"\n },\n \"social_medias\": [\n {\"platform\": \"facebook\", \"url\": \"https://facebook.com/islamiccenter\"},\n {\"platform\": \"instagram\", \"url\": \"https://instagram.com/islamiccenter\"}\n ],\n \"address\": \"123 Main Street, New York, NY 10001\",\n \"lat\": 40.7128,\n \"lon\": -74.0060,\n \"images\": [\n {\"image\": \"/tmp/xyz-image1.jpg\", \"priority\": 1},\n {\"image\": \"/tmp/xyz-image2.jpg\", \"priority\": 2}\n ]\n}\n```\n\n### Response Structure:\nReturns the created center with all details including generated ID and timestamps.\n", "parameters": [{"name": "data", "in": "body", "required": true, "schema": {"required": ["name", "slogan"], "type": "object", "properties": {"avatar": {"description": "Avatar image path (string) from temporary upload. First upload to /habibnet/upload-tmp-media/ and use the file value from response.", "type": "string", "example": "/tmp/xyz-avatar.jpg"}, "name": {"description": "Center name", "type": "string", "example": "Islamic Center of New York"}, "slogan": {"description": "Center slogan or tagline", "type": "string", "example": "Serving the community since 1990"}, "center_type": {"description": "Type of center", "type": "string", "enum": ["islamic_center", "library", "mosque", "shia_center"], "example": "islamic_center"}, "about_center": {"description": "Detailed description about the center", "type": "string", "example": "A comprehensive Islamic center offering prayer facilities..."}, "working_hours": {"description": "Working hours for each day of the week", "type": "object", "example": {"monday": "9:00 AM - 9:00 PM", "friday": "9:00 AM - 11:00 PM"}}, "social_medias": {"description": "List of social media links", "type": "array", "items": {"type": "object", "properties": {"platform": {"type": "string"}, "url": {"type": "string"}}}, "example": [{"platform": "facebook", "url": "https://facebook.com/center"}]}, "address": {"description": "Physical address of the center", "type": "string", "example": "123 Main Street, New York, NY 10001"}, "lat": {"description": "Latitude coordinate", "type": "number", "example": 40.7128}, "lon": {"description": "Longitude coordinate", "type": "number", "example": -74.006}, "images": {"description": "List of center images. Each image must be a string path from /habibnet/upload-tmp-media/", "type": "array", "items": {"type": "object", "properties": {"image": {"description": "Image path (string) from temporary upload", "type": "string", "example": "/tmp/xyz-image.jpg"}, "priority": {"description": "Display priority (higher = shown first)", "type": "integer", "default": 10}}}}}}}], "responses": {"201": {"description": "Center created successfully", "schema": {"type": "object", "properties": {"id": {"description": "Center ID", "type": "integer"}, "avatar": {"description": "Avatar URL", "type": "string"}, "name": {"description": "Center name", "type": "string"}, "slogan": {"description": "Center slogan", "type": "string"}, "center_type": {"description": "Center type", "type": "string"}, "about_center": {"description": "About center", "type": "string"}, "working_hours": {"description": "Working hours", "type": "object"}, "social_medias": {"description": "Social media links", "type": "array", "items": {"type": "object"}}, "address": {"description": "Address", "type": "string"}, "lat": {"description": "Latitude", "type": "number"}, "lon": {"description": "Longitude", "type": "number"}, "images": {"description": "Center images", "type": "array", "items": {"type": "object", "properties": {"id": {"type": "integer"}, "image": {"type": "string"}, "priority": {"type": "integer"}}}}, "status": {"description": "Approval status", "type": "string"}, "created_at": {"type": "string", "format": "date-time"}, "updated_at": {"type": "string", "format": "date-time"}}}, "examples": {"application/json": {"id": 1, "avatar": "https://habibapp.com/media/habibnet/avatars/center_avatar.jpg", "name": "Islamic Center of New York", "slogan": "Serving the community since 1990", "center_type": "islamic_center", "about_center": "A comprehensive Islamic center...", "working_hours": {"monday": "9:00 AM - 9:00 PM", "friday": "9:00 AM - 11:00 PM"}, "social_medias": [{"platform": "facebook", "url": "https://facebook.com/center"}], "address": "123 Main Street, New York, NY 10001", "lat": 40.7128, "lon": -74.006, "images": [{"id": 1, "image": "https://habibapp.com/media/habibnet/image1.jpg", "priority": 1}], "status": "pending", "created_at": "2024-01-15T10:30:00Z", "updated_at": "2024-01-15T10:30:00Z"}}}, "400": {"description": "Validation error", "examples": {"application/json": {"name": ["This field is required."], "center_type": ["Invalid center type. Must be one of: islamic_center, library, mosque, shia_center"]}}}, "401": {"description": "Authentication required"}, "403": {"description": "Permission denied - Provider not verified", "examples": {"application/json": {"detail": "You must have a verified provider profile to create centers."}}}}, "tags": ["habibnet"]}, "parameters": []}, "/habibnet/provider/center/{center_id}/events/": {"get": {"operationId": "habibnet_provider_center_events_list", "description": "\nList all events for a specific center owned by the provider.\n\n### Requirements:\n- User must be authenticated\n- User must be the owner of the center (via provider profile)\n\n### Response Structure:\nReturns a list of all events for the specified center.\n\n### Example Response:\n```json\n[\n {\n \"id\": 1,\n \"title\": \"Friday Prayer\",\n \"description\": \"Weekly Friday congregational prayer\",\n \"time\": \"1:00 PM\",\n \"start_time\": \"2024-01-19T13:00:00Z\",\n \"end_time\": \"2024-01-19T14:00:00Z\",\n \"date\": \"2024-01-19T13:00:00Z\",\n \"image\": \"https://habibapp.com/media/habibnet/event1.jpg\",\n \"center\": 1\n }\n]\n```\n", "parameters": [{"name": "limit", "in": "query", "description": "Number of results to return per page.", "required": false, "type": "integer"}, {"name": "offset", "in": "query", "description": "The initial index from which to return the results.", "required": false, "type": "integer"}, {"name": "center_id", "in": "path", "description": "ID of the center to list events for", "required": true, "type": "integer"}], "responses": {"200": {"description": "List of center events", "schema": {"type": "array", "items": {"type": "object", "properties": {"id": {"description": "Event ID", "type": "integer"}, "title": {"description": "Event title", "type": "string"}, "description": {"description": "Event description", "type": "string"}, "time": {"description": "Event time (text format)", "type": "string"}, "start_time": {"description": "Start time", "type": "string", "format": "date-time"}, "end_time": {"description": "End time", "type": "string", "format": "date-time"}, "date": {"description": "Event date", "type": "string", "format": "date-time"}, "image": {"description": "Event image URL", "type": "string"}, "center": {"description": "Center ID", "type": "integer"}}}}}, "401": {"description": "Authentication required"}, "403": {"description": "Permission denied - Not the owner", "examples": {"application/json": {"detail": "You do not have permission to view events for this center."}}}, "404": {"description": "Center not found"}}, "tags": ["habibnet"]}, "parameters": [{"name": "center_id", "in": "path", "required": true, "type": "string"}]}, "/habibnet/provider/center/{center_id}/events/create/": {"post": {"operationId": "habibnet_provider_center_events_create_create", "description": "\nCreate a new event for a center owned by the provider.\n\n### Requirements:\n- User must be authenticated\n- User must be the owner of the center (via provider profile)\n- Image must be uploaded via `/habibnet/upload-tmp-media/` endpoint first\n\n**IMPORTANT**: The image field must be a string URL (apath) from the upload endpoint, NOT binary file data.\n\n### Example Request:\n```json\n{\n \"title\": \"Friday Prayer\",\n \"description\": \"Weekly Friday congregational prayer. All community members are welcome.\",\n \"time\": \"1:00 PM\",\n \"start_time\": \"2024-01-19T13:00:00Z\",\n \"end_time\": \"2024-01-19T14:00:00Z\",\n \"date\": \"2024-01-19T13:00:00Z\",\n \"image\": \"/tmp/xyz-event-image.jpg\"\n}\n```\n\n### Response Structure:\nReturns the created event with all details including the full image URL.\n", "parameters": [{"name": "data", "in": "body", "required": true, "schema": {"required": ["title", "description", "time", "date", "image"], "type": "object", "properties": {"title": {"description": "Event title", "type": "string", "example": "Friday Prayer", "maxLength": 119}, "description": {"description": "Detailed event description", "type": "string", "example": "Weekly Friday congregational prayer. All community members are welcome."}, "time": {"description": "Event time in text format", "type": "string", "example": "1:00 PM", "maxLength": 255}, "start_time": {"description": "Event start time (optional)", "type": "string", "format": "date-time", "example": "2024-01-19T13:00:00Z"}, "end_time": {"description": "Event end time (optional)", "type": "string", "format": "date-time", "example": "2024-01-19T14:00:00Z"}, "date": {"description": "Event date", "type": "string", "format": "date-time", "example": "2024-01-19T13:00:00Z"}, "image": {"description": "Event image path from temporary upload", "type": "string", "example": "/static/tmp/xyz-event-image.jpg"}}}}, {"name": "center_id", "in": "path", "description": "ID of the center to create event for", "required": true, "type": "integer"}], "responses": {"201": {"description": "Event created successfully", "schema": {"type": "object", "properties": {"id": {"description": "Event ID", "type": "integer"}, "title": {"description": "Event title", "type": "string"}, "description": {"description": "Event description", "type": "string"}, "time": {"description": "Event time", "type": "string"}, "start_time": {"description": "Start time", "type": "string", "format": "date-time"}, "end_time": {"description": "End time", "type": "string", "format": "date-time"}, "date": {"description": "Event date", "type": "string", "format": "date-time"}, "image": {"description": "Event image URL", "type": "string"}, "center": {"description": "Center ID", "type": "integer"}}}, "examples": {"application/json": {"id": 1, "title": "Friday Prayer", "description": "Weekly Friday congregational prayer. All community members are welcome.", "time": "1:00 PM", "start_time": "2024-01-19T13:00:00Z", "end_time": "2024-01-19T14:00:00Z", "date": "2024-01-19T13:00:00Z", "image": "https://habibapp.com/media/habibnet/event_image.jpg", "center": 1}}}, "400": {"description": "Validation error", "examples": {"application/json": {"title": ["This field is required."], "image": ["This field is required."]}}}, "401": {"description": "Authentication required"}, "403": {"description": "Permission denied - Not the owner", "examples": {"application/json": {"detail": "You do not have permission to create events for this center."}}}, "404": {"description": "Center not found"}}, "tags": ["habibnet"]}, "parameters": [{"name": "center_id", "in": "path", "required": true, "type": "string"}]}, "/habibnet/provider/center/{center_id}/events/{event_id}/": {"patch": {"operationId": "habibnet_provider_center_events_partial_update", "description": "\nUpdate an existing event for a center owned by the provider (PATCH only - partial update).\n\n### Requirements:\n- User must be authenticated\n- User must be the owner of the center (via provider profile)\n- Event must belong to the specified center\n\n### Notes:\n- This endpoint supports partial updates (PATCH)\n- Only provided fields will be updated\n- Image can be updated by uploading via `/upload-tmp-media` endpoint first\n\n### Example Request:\n```json\n{\n \"title\": \"Updated Friday Prayer\",\n \"description\": \"Updated description for the weekly Friday prayer\",\n \"start_time\": \"2024-01-19T13:30:00Z\"\n}\n```\n\n### Response Structure:\nReturns the updated event with all current details.\n", "parameters": [{"name": "data", "in": "body", "required": true, "schema": {"type": "object", "properties": {"title": {"description": "Event title", "type": "string", "example": "Updated Friday Prayer", "maxLength": 119}, "description": {"description": "Event description", "type": "string", "example": "Updated description for the weekly Friday prayer"}, "time": {"description": "Event time in text format", "type": "string", "example": "1:30 PM", "maxLength": 255}, "start_time": {"description": "Event start time", "type": "string", "format": "date-time", "example": "2024-01-19T13:30:00Z"}, "end_time": {"description": "Event end time", "type": "string", "format": "date-time", "example": "2024-01-19T14:30:00Z"}, "date": {"description": "Event date", "type": "string", "format": "date-time", "example": "2024-01-19T13:30:00Z"}, "image": {"description": "New event image path from temporary upload", "type": "string", "example": "/static/tmp/xyz-new-event-image.jpg"}}}}, {"name": "center_id", "in": "path", "description": "ID of the center", "required": true, "type": "integer"}, {"name": "event_id", "in": "path", "description": "ID of the event to update", "required": true, "type": "integer"}], "responses": {"200": {"description": "Event updated successfully", "schema": {"type": "object", "properties": {"id": {"description": "Event ID", "type": "integer"}, "title": {"description": "Event title", "type": "string"}, "description": {"description": "Event description", "type": "string"}, "time": {"description": "Event time", "type": "string"}, "start_time": {"description": "Start time", "type": "string", "format": "date-time"}, "end_time": {"description": "End time", "type": "string", "format": "date-time"}, "date": {"description": "Event date", "type": "string", "format": "date-time"}, "image": {"description": "Event image URL", "type": "string"}, "center": {"description": "Center ID", "type": "integer"}}}, "examples": {"application/json": {"id": 1, "title": "Updated Friday Prayer", "description": "Updated description for the weekly Friday prayer", "time": "1:30 PM", "start_time": "2024-01-19T13:30:00Z", "end_time": "2024-01-19T14:30:00Z", "date": "2024-01-19T13:30:00Z", "image": "https://habibapp.com/media/habibnet/event_image.jpg", "center": 1}}}, "400": {"description": "Validation error", "examples": {"application/json": {"title": ["Ensure this field has no more than 119 characters."]}}}, "401": {"description": "Authentication required"}, "403": {"description": "Permission denied - Not the owner", "examples": {"application/json": {"detail": "You do not have permission to update events for this center."}}}, "404": {"description": "Event or center not found", "examples": {"application/json": {"detail": "Not found."}}}}, "tags": ["habibnet"]}, "parameters": [{"name": "center_id", "in": "path", "required": true, "type": "string"}, {"name": "event_id", "in": "path", "required": true, "type": "string"}]}, "/habibnet/provider/center/{center_id}/events/{event_id}/delete/": {"delete": {"operationId": "habibnet_provider_center_events_delete_delete", "description": "\nDelete an event for a center owned by the provider.\n\n### Requirements:\n- User must be authenticated\n- User must be the owner of the center (via provider profile)\n- Event must belong to the specified center\n\n### Notes:\n- This action is permanent and cannot be undone\n- The event will be completely removed from the system\n\n### Response:\nReturns 204 No Content on successful deletion.\n", "parameters": [{"name": "center_id", "in": "path", "description": "ID of the center", "required": true, "type": "integer"}, {"name": "event_id", "in": "path", "description": "ID of the event to delete", "required": true, "type": "integer"}], "responses": {"204": {"description": "Event deleted successfully (No Content)"}, "401": {"description": "Authentication required"}, "403": {"description": "Permission denied - Not the owner", "examples": {"application/json": {"detail": "You do not have permission to delete events for this center."}}}, "404": {"description": "Event or center not found", "examples": {"application/json": {"detail": "Not found."}}}}, "tags": ["habibnet"]}, "parameters": [{"name": "center_id", "in": "path", "required": true, "type": "string"}, {"name": "event_id", "in": "path", "required": true, "type": "string"}]}, "/habibnet/provider/center/{center_id}/images/{image_id}/": {"delete": {"operationId": "habibnet_provider_center_images_delete", "description": "\nDelete a specific image from a center's gallery.\n\n### Requirements:\n- User must be authenticated\n- User must be the owner of the center (via provider profile)\n- Image must belong to the specified center\n\n### URL Parameters:\n- `center_id`: ID of the center\n- `image_id`: ID of the image to delete\n\n### Example Response:\n```json\n{\n \"detail\": \"Image deleted successfully\"\n}\n```\n\n### Notes:\n- This permanently deletes the image from storage\n- Cannot be undone\n- The image file is removed from the server\n", "parameters": [{"name": "center_id", "in": "path", "description": "ID of the center", "required": true, "type": "integer"}, {"name": "image_id", "in": "path", "description": "ID of the image to delete", "required": true, "type": "integer"}], "responses": {"204": {"description": "Image deleted successfully"}, "401": {"description": "Authentication required"}, "403": {"description": "Permission denied - Not the owner", "examples": {"application/json": {"detail": "You do not have permission to delete this image."}}}, "404": {"description": "Image or center not found", "examples": {"application/json": {"detail": "Image not found or does not belong to this center."}}}}, "tags": ["habibnet"]}, "parameters": [{"name": "center_id", "in": "path", "required": true, "type": "string"}, {"name": "image_id", "in": "path", "required": true, "type": "string"}]}, "/habibnet/provider/center/{id}/": {"patch": {"operationId": "habibnet_provider_center_partial_update", "description": "\nUpdate an existing center (PATCH only - partial update).\n\n### Requirements:\n- User must be authenticated\n- User must be the owner of the center (via provider profile)\n- Only the provider who created the center can update it\n\n### Notes:\n- This endpoint supports partial updates (PATCH)\n- Only provided fields will be updated\n- Images can be added but not removed via this endpoint (use DELETE endpoint for image removal)\n\n### Example Request:\n```json\n{\n \"slogan\": \"Updated slogan for the center\",\n \"about_center\": \"Updated description with more details\",\n \"working_hours\": {\n \"monday\": \"8:00 AM - 10:00 PM\",\n \"friday\": \"8:00 AM - 11:00 PM\"\n }\n}\n```\n\n### Response Structure:\nReturns the updated center with all current details.\n", "parameters": [{"name": "data", "in": "body", "required": true, "schema": {"type": "object", "properties": {"avatar": {"description": "New avatar image path from temporary upload", "type": "string"}, "name": {"description": "Center name", "type": "string"}, "slogan": {"description": "Center slogan", "type": "string"}, "center_type": {"description": "Type of center", "type": "string", "enum": ["islamic_center", "library", "mosque", "shia_center"]}, "about_center": {"description": "About the center", "type": "string"}, "working_hours": {"description": "Working hours", "type": "object"}, "social_medias": {"description": "Social media links", "type": "array", "items": {"type": "object", "properties": {"platform": {"type": "string"}, "url": {"type": "string"}}}}, "address": {"description": "Physical address", "type": "string"}, "lat": {"description": "Latitude", "type": "number"}, "lon": {"description": "Longitude", "type": "number"}, "images": {"description": "New images to add", "type": "array", "items": {"type": "object", "properties": {"image": {"type": "string"}, "priority": {"type": "integer", "default": 10}}}}}}}], "responses": {"200": {"description": "Center updated successfully", "schema": {"type": "object", "properties": {"id": {"type": "integer"}, "avatar": {"type": "string"}, "name": {"type": "string"}, "slogan": {"type": "string"}, "center_type": {"type": "string"}, "about_center": {"type": "string"}, "working_hours": {"type": "object"}, "social_medias": {"type": "array", "items": {"type": "object"}}, "address": {"type": "string"}, "lat": {"type": "number"}, "lon": {"type": "number"}, "images": {"type": "array", "items": {"type": "object"}}, "status": {"type": "string"}, "created_at": {"type": "string", "format": "date-time"}, "updated_at": {"type": "string", "format": "date-time"}}}, "examples": {"application/json": {"id": 1, "avatar": "https://habibapp.com/media/habibnet/avatars/center_avatar.jpg", "name": "Islamic Center of New York", "slogan": "Updated slogan for the center", "center_type": "islamic_center", "about_center": "Updated description with more details", "working_hours": {"monday": "8:00 AM - 10:00 PM", "friday": "8:00 AM - 11:00 PM"}, "social_medias": [{"platform": "facebook", "url": "https://facebook.com/center"}], "address": "123 Main Street, New York, NY 10001", "lat": 40.7128, "lon": -74.006, "images": [], "status": "pending", "created_at": "2024-01-15T10:30:00Z", "updated_at": "2024-01-15T14:20:00Z"}}}, "400": {"description": "Validation error"}, "401": {"description": "Authentication required"}, "403": {"description": "Permission denied - Not the owner", "examples": {"application/json": {"detail": "You do not have permission to update this center."}}}, "404": {"description": "Center not found"}}, "tags": ["habibnet"]}, "parameters": [{"name": "id", "in": "path", "description": "A unique integer value identifying this center.", "required": true, "type": "integer"}]}, "/habibnet/provider/profile/": {"post": {"operationId": "habibnet_provider_profile_create", "summary": "API endpoint for creating center provider profiles.", "description": "This view handles provider requests for centers in Habibnet.\nUsers can request to become providers with two types:\n- management: Part of the center's management team\n- connected: Connected with the center's team", "parameters": [{"name": "data", "in": "body", "required": true, "schema": {"$ref": "#/definitions/CenterProviderProfile"}}], "responses": {"201": {"description": "", "schema": {"$ref": "#/definitions/CenterProviderProfile"}}}, "tags": ["habibnet"]}, "parameters": []}, "/habit/challenge/list/": {"get": {"operationId": "habit_challenge_list_list", "description": "", "parameters": [{"name": "limit", "in": "query", "description": "Number of results to return per page.", "required": false, "type": "integer"}, {"name": "offset", "in": "query", "description": "The initial index from which to return the results.", "required": false, "type": "integer"}], "responses": {"200": {"description": "", "schema": {"required": ["count", "results"], "type": "object", "properties": {"count": {"type": "integer"}, "next": {"type": "string", "format": "uri", "x-nullable": true}, "previous": {"type": "string", "format": "uri", "x-nullable": true}, "results": {"type": "array", "items": {"$ref": "#/definitions/ChallengeList"}}}}}}, "tags": ["habit"]}, "parameters": []}, "/habit/challenge/{id}/": {"get": {"operationId": "habit_challenge_read", "description": "", "parameters": [], "responses": {"200": {"description": "", "schema": {"$ref": "#/definitions/ChallengeDetail"}}}, "tags": ["habit"]}, "parameters": [{"name": "id", "in": "path", "description": "A unique integer value identifying this Challenge.", "required": true, "type": "integer"}]}, "/habit/challenge/{id}/join/": {"post": {"operationId": "habit_challenge_join_create", "description": "", "parameters": [], "responses": {"201": {"description": ""}}, "tags": ["habit"]}, "parameters": [{"name": "id", "in": "path", "required": true, "type": "string"}]}, "/habit/checklist/create/": {"post": {"operationId": "habit_checklist_create_create", "description": "", "parameters": [{"name": "data", "in": "body", "required": true, "schema": {"$ref": "#/definitions/UserChecklistItem"}}], "responses": {"201": {"description": "", "schema": {"$ref": "#/definitions/UserChecklistItem"}}}, "tags": ["habit"]}, "parameters": []}, "/habit/checklist/list/": {"get": {"operationId": "habit_checklist_list_list", "description": "category (prayer, quran, duas, worship, challenge, general, custom, all)", "parameters": [{"name": "category", "in": "query", "description": "", "required": false, "type": "string"}, {"name": "limit", "in": "query", "description": "Number of results to return per page.", "required": false, "type": "integer"}, {"name": "offset", "in": "query", "description": "The initial index from which to return the results.", "required": false, "type": "integer"}], "responses": {"200": {"description": "", "schema": {"required": ["count", "results"], "type": "object", "properties": {"count": {"type": "integer"}, "next": {"type": "string", "format": "uri", "x-nullable": true}, "previous": {"type": "string", "format": "uri", "x-nullable": true}, "results": {"type": "array", "items": {"$ref": "#/definitions/UserChecklistItem"}}}}}}, "tags": ["habit"]}, "parameters": []}, "/habit/checklist/mark-completed/": {"get": {"operationId": "habit_checklist_mark-completed_list", "description": "\n### ثبت وضعیت تکمیل چک لیست\nاین API وضعیت تکمیل یک چک لیست را برای تاریخ مشخص ثبت میکند. در صورت تکرار درخواست، وضعیت قبلی با تأیید جدید بهروغرسان میشود.\n\n| **فیلد** | **نوع** | **ضروری** | **توضیحات** |\n|----------|---------|-----------|-------------|\n| `checklist_id` | `integer` | بله | شناسه یکتای چک لیست |\n| `date` | `string` | نه | تاریخ در فرمت `YYYY-MM-DD` (پیشفرض: امروز) |\n| `day_of_week` | `string` | بله | روز هفته (مقدارهای مجاز: `monday`, `tuesday`, ..., `sunday`) |\n\n#### پاسخ:\n- **200 OK**: وضعیت تکمیل چک لیست\n- **400 Bad Request**: پارامترهای ورودی نامعتبر\n- **404 Not Found**: چک لیست موردنظر وجود ندارد\n- **500 Internal Server Error**: خطا در پردازش درخواست\n\n#### مثال پاسخ:\n```json\n{\n \"title\": \"تمرین ورزشی\",\n \"completed\": true\n}\n", "parameters": [{"name": "limit", "in": "query", "description": "Number of results to return per page.", "required": false, "type": "integer"}, {"name": "offset", "in": "query", "description": "The initial index from which to return the results.", "required": false, "type": "integer"}, {"name": "date", "in": "query", "description": "Date in YYYY-MM-DD format", "required": true, "type": "string", "default": "2026-06-28"}, {"name": "checklist_id", "in": "query", "description": "Checklist ID", "required": true, "type": "integer"}], "responses": {"200": {"description": "", "schema": {"$ref": "#/definitions/ChecklistEntryList"}}}, "tags": ["habit"]}, "parameters": []}, "/habit/checklist/report/": {"get": {"operationId": "habit_checklist_report_list", "description": "\n### آمار تکمیل چک لیست\nاین API آمار تکمیل چک لیست برای دوره های 7، 30 روز و یک سال گذشته را میگرداند. نتایج بر اساس روزهای فعال چک لیست محاسبه میشوند.\n\n| **فیلد** | **نوع** | **ضروری** | **توضیحات** |\n|----------|---------|-----------|-------------|\n| `checklist_id` | `integer` | بله | شناسه یکتای چک لیست |\n| `date` | `string` | نه | تاریخ در فرمت `YYYY-MM-DD` (پیشفرض: امروز) |\n| `day_of_week` | `string` | بله | روز هفته (مقدارهای مجاز: `monday`, `tuesday`, ..., `sunday`) |\n\n#### پاسخ:\n- **200 OK**: آمار تکمیل در فرمت زیر\n- **400 Bad Request**: پارامترهای ورودی نامعتبر\n- **404 Not Found**: چک لیست موردنظر وجود ندارد\n- **500 Internal Server Error**: خطا در پردازش درخواست\n\n#### مثال پاسخ:\n```json\n{\n \"7_days\": {\n \"total_days\": 5,\n \"completed_days\": 3,\n \"percentage\": 60.0\n },\n \"30_days\": {\n \"total_days\": 20,\n \"completed_days\": 15,\n \"percentage\": 75.0\n },\n \"year\": {\n \"total_days\": 365,\n \"completed_days\": 300,\n \"percentage\": 82.2\n }\n}\n", "parameters": [{"name": "limit", "in": "query", "description": "Number of results to return per page.", "required": false, "type": "integer"}, {"name": "offset", "in": "query", "description": "The initial index from which to return the results.", "required": false, "type": "integer"}, {"name": "checklist_id", "in": "query", "description": "Checklist ID", "required": true, "type": "integer"}], "responses": {"200": {"description": "", "schema": {"$ref": "#/definitions/ChecklistStats"}}}, "tags": ["habit"]}, "parameters": []}, "/habit/checklist/{id}/delete/": {"delete": {"operationId": "habit_checklist_delete_delete", "description": "", "parameters": [], "responses": {"204": {"description": ""}}, "tags": ["habit"]}, "parameters": [{"name": "id", "in": "path", "description": "A unique integer value identifying this User Checklist Item.", "required": true, "type": "integer"}]}, "/habit/checklist/{id}/detail/": {"get": {"operationId": "habit_checklist_detail_read", "description": "", "parameters": [], "responses": {"200": {"description": "", "schema": {"$ref": "#/definitions/ChecklistDetail"}}}, "tags": ["habit"]}, "parameters": [{"name": "id", "in": "path", "required": true, "type": "string"}]}, "/habit/checklist/{id}/update/": {"put": {"operationId": "habit_checklist_update_update", "description": "", "parameters": [{"name": "data", "in": "body", "required": true, "schema": {"$ref": "#/definitions/UserChecklistItem"}}], "responses": {"200": {"description": "", "schema": {"$ref": "#/definitions/UserChecklistItem"}}}, "tags": ["habit"]}, "patch": {"operationId": "habit_checklist_update_partial_update", "description": "", "parameters": [{"name": "data", "in": "body", "required": true, "schema": {"$ref": "#/definitions/UserChecklistItem"}}], "responses": {"200": {"description": "", "schema": {"$ref": "#/definitions/UserChecklistItem"}}}, "tags": ["habit"]}, "parameters": [{"name": "id", "in": "path", "description": "A unique integer value identifying this User Checklist Item.", "required": true, "type": "integer"}]}, "/habit/info/": {"get": {"operationId": "habit_info_list", "summary": "Main Page", "description": "\n### لیست چک لیست های فعال\nاین API لیست چک لیست های فعال کاربر را برای یک روز هفته و تاریخ خاص میگرداند. تنها چک لیست هایی که در بازه زمانی فعالیت و روزهای مجاز هستند نمایش داده میشوند.\n\n| **فیلد** | **نوع** | **ضروری** | **توضیحات** |\n|----------|---------|-----------|-------------|\n| `date` | `string` | نه | تاریخ در فرمت `YYYY-MM-DD` (پیشفرض: امروز) |\n| `day_of_week` | `string` | بله | روز هفته (مقدارهای مجاز: `monday`, `tuesday`, ..., `sunday`) |\n\n#### پاسخ:\n- **200 OK**: لیست چک لیست ها با وضعیت تکمیل\n- **400 Bad Request**: پارامترهای ورودی نامعتبر\n- **500 Internal Server Error**: خطا در پردازش درخواست\n\n", "parameters": [{"name": "limit", "in": "query", "description": "Number of results to return per page.", "required": false, "type": "integer"}, {"name": "offset", "in": "query", "description": "The initial index from which to return the results.", "required": false, "type": "integer"}, {"name": "date", "in": "query", "description": "Date in YYYY-MM-DD format", "required": true, "type": "string", "default": "2026-06-28"}], "responses": {"200": {"description": ""}}, "tags": ["habit"]}, "parameters": []}, "/habit/reminder/info/": {"get": {"operationId": "habit_reminder_info_list", "description": "\n### اطلاعات یادآوری چک لیست\nاین API وضعیت یادآوری چک لیست کاربر را بررسی میکند و در صورت وجود یادآوری فعال، اطلاعات کامل آن را برمیگرداند.\n\n#### منطق کسب و کار:\n- بررسی وجود یادآوری چک لیست برای کاربر جاری\n- اگر یادآوری وجود داشته باشد و وضعیت آن فعال باشد: `has_active_reminder: true` و اطلاعات کامل یادآوری\n- اگر یادآوری وجود نداشته باشد یا وضعیت آن غیرفعال باشد: `has_active_reminder: false` و `reminder: null`\n\n#### پاسخ:\n- **200 OK**: اطلاعات یادآوری با موفقیت دریافت شد\n\n#### مثال پاسخ (یادآوری فعال):\n```json\n{\n \"has_active_reminder\": true,\n \"reminder\": {\n \"id\": 123,\n \"service_name\": \"habit\",\n \"object_id\": \"\",\n \"text\": \"Daily Checklist Reminder\",\n \"created_at\": \"2024-01-15T10:30:00Z\",\n \"call_time\": \"2024-01-16T09:00:00Z\",\n \"is_sent\": false,\n \"is_read\": false,\n \"status\": true,\n \"notif_data\": null\n }\n}\n```\n\n#### مثال پاسخ (بدون یادآوری فعال):\n```json\n{\n \"has_active_reminder\": false,\n \"reminder\": null\n}\n```\n", "parameters": [{"name": "limit", "in": "query", "description": "Number of results to return per page.", "required": false, "type": "integer"}, {"name": "offset", "in": "query", "description": "The initial index from which to return the results.", "required": false, "type": "integer"}], "responses": {"200": {"description": "اطلاعات یادآوری با موفقیت دریافت شد", "schema": {"type": "object", "properties": {"has_active_reminder": {"description": "آیا یادآوری فعال وجود دارد", "type": "boolean"}, "reminder": {"description": "اطلاعات کامل یادآوری در صورت فعال بودن، در غیر این صورت null", "type": "object", "nullable": true}}}}}, "tags": ["habit"]}, "parameters": []}, "/habit/reminder/update/": {"put": {"operationId": "habit_reminder_update_update", "description": "API endpoint for updating habit reminder status.\nCreates reminder if it doesn't exist, updates if it exists.", "parameters": [], "responses": {"200": {"description": ""}}, "tags": ["habit"]}, "patch": {"operationId": "habit_reminder_update_partial_update", "description": "\nPartially update or create a habit reminder with specified status and optional call time.\n\n### Request Structure (PATCH):\n```json\n{\n \"status\": true, // Required: boolean - Whether reminder is active\n \"call_time\": \"09:30\" // Optional: string - Time in HH:MM format (24-hour)\n}\n```\n\n### Behavior:\n- If reminder doesn't exist: Creates new reminder with provided fields\n- If reminder exists: Updates only the provided fields (partial update)\n- call_time only updates when valid time format is provided (HH:MM)\n- Invalid, empty, or null call_time values are ignored (field remains unchanged)\n\n### Examples:\n- `{\"status\": true}` - Only update status, keep existing call_time\n- `{\"status\": false, \"call_time\": \"14:30\"}` - Update status and set call_time to 14:30\n- `{\"status\": false, \"call_time\": \"\"}` - Only update status, ignore empty call_time\n- `{\"status\": false, \"call_time\": null}` - Only update status, ignore null call_time\n- `{\"status\": true, \"call_time\": \"invalid\"}` - Only update status, ignore invalid time\n", "parameters": [{"name": "data", "in": "body", "required": true, "schema": {"required": ["status"], "type": "object", "properties": {"status": {"description": "Whether the habit reminder is active or not", "type": "boolean"}, "call_time": {"description": "Time when reminder should be triggered. Format: \"HH:MM\" (24-hour format). Optional - leave empty to clear.", "type": "string", "example": "09:30"}}}}], "responses": {"200": {"description": "Reminder status updated successfully", "schema": {"type": "object", "properties": {"message": {"type": "string"}, "status": {"type": "boolean"}}}}, "201": {"description": "Reminder created with specified status", "schema": {"type": "object", "properties": {"message": {"type": "string"}, "status": {"type": "boolean"}}}}, "400": {"description": "Invalid request parameters", "schema": {"type": "object", "properties": {"detail": {"type": "string"}}}}}, "tags": ["habit"]}, "parameters": []}, "/hadis/categories/": {"get": {"operationId": "hadis_categories_list", "description": "", "parameters": [{"name": "limit", "in": "query", "description": "Number of results to return per page.", "required": false, "type": "integer"}, {"name": "offset", "in": "query", "description": "The initial index from which to return the results.", "required": false, "type": "integer"}], "responses": {"200": {"description": "", "schema": {"required": ["count", "results"], "type": "object", "properties": {"count": {"type": "integer"}, "next": {"type": "string", "format": "uri", "x-nullable": true}, "previous": {"type": "string", "format": "uri", "x-nullable": true}, "results": {"type": "array", "items": {"$ref": "#/definitions/HadisCategory"}}}}}}, "tags": ["hadis"]}, "parameters": []}, "/hadis/categories/{category}/": {"get": {"operationId": "hadis_categories_read", "description": "", "parameters": [{"name": "limit", "in": "query", "description": "Number of results to return per page.", "required": false, "type": "integer"}, {"name": "offset", "in": "query", "description": "The initial index from which to return the results.", "required": false, "type": "integer"}], "responses": {"200": {"description": "", "schema": {"required": ["count", "results"], "type": "object", "properties": {"count": {"type": "integer"}, "next": {"type": "string", "format": "uri", "x-nullable": true}, "previous": {"type": "string", "format": "uri", "x-nullable": true}, "results": {"type": "array", "items": {"$ref": "#/definitions/Hadis"}}}}}}, "tags": ["hadis"]}, "parameters": [{"name": "category", "in": "path", "required": true, "type": "string"}]}, "/hadis/events/": {"get": {"operationId": "hadis_events_list", "description": "", "parameters": [], "responses": {"200": {"description": ""}}, "tags": ["hadis"]}, "parameters": []}, "/hadis/interests-items/": {"get": {"operationId": "hadis_interests-items_list", "description": "", "parameters": [], "responses": {"200": {"description": "", "schema": {"type": "array", "items": {"$ref": "#/definitions/Interest"}}}}, "tags": ["hadis"]}, "parameters": []}, "/hadis/narrators/": {"get": {"operationId": "hadis_narrators_list", "description": "", "parameters": [{"name": "limit", "in": "query", "description": "Number of results to return per page.", "required": false, "type": "integer"}, {"name": "offset", "in": "query", "description": "The initial index from which to return the results.", "required": false, "type": "integer"}], "responses": {"200": {"description": "", "schema": {"required": ["count", "results"], "type": "object", "properties": {"count": {"type": "integer"}, "next": {"type": "string", "format": "uri", "x-nullable": true}, "previous": {"type": "string", "format": "uri", "x-nullable": true}, "results": {"type": "array", "items": {"$ref": "#/definitions/Narrator"}}}}}}, "tags": ["hadis"]}, "parameters": []}, "/hadis/narrators/{id}/": {"get": {"operationId": "hadis_narrators_read", "description": "", "parameters": [{"name": "limit", "in": "query", "description": "Number of results to return per page.", "required": false, "type": "integer"}, {"name": "offset", "in": "query", "description": "The initial index from which to return the results.", "required": false, "type": "integer"}], "responses": {"200": {"description": "", "schema": {"required": ["count", "results"], "type": "object", "properties": {"count": {"type": "integer"}, "next": {"type": "string", "format": "uri", "x-nullable": true}, "previous": {"type": "string", "format": "uri", "x-nullable": true}, "results": {"type": "array", "items": {"$ref": "#/definitions/Hadis"}}}}}}, "tags": ["hadis"]}, "parameters": [{"name": "id", "in": "path", "required": true, "type": "string"}]}, "/hadis/resources/": {"get": {"operationId": "hadis_resources_list", "description": "", "parameters": [{"name": "page", "in": "query", "description": "A page number within the paginated result set.", "required": false, "type": "integer"}], "responses": {"200": {"description": "", "schema": {"required": ["count", "results"], "type": "object", "properties": {"count": {"type": "integer"}, "next": {"type": "string", "format": "uri", "x-nullable": true}, "previous": {"type": "string", "format": "uri", "x-nullable": true}, "results": {"type": "array", "items": {"$ref": "#/definitions/Resources"}}}}}}, "tags": ["hadis"]}, "parameters": []}, "/hadis/search/{query}/": {"get": {"operationId": "hadis_search_read", "description": "", "parameters": [{"name": "limit", "in": "query", "description": "Number of results to return per page.", "required": false, "type": "integer"}, {"name": "offset", "in": "query", "description": "The initial index from which to return the results.", "required": false, "type": "integer"}], "responses": {"200": {"description": "", "schema": {"required": ["count", "results"], "type": "object", "properties": {"count": {"type": "integer"}, "next": {"type": "string", "format": "uri", "x-nullable": true}, "previous": {"type": "string", "format": "uri", "x-nullable": true}, "results": {"type": "array", "items": {"$ref": "#/definitions/Hadis"}}}}}}, "tags": ["hadis"]}, "parameters": [{"name": "query", "in": "path", "required": true, "type": "string"}]}, "/hadis/stats/": {"get": {"operationId": "hadis_stats_list", "description": "", "parameters": [], "responses": {"200": {"description": ""}}, "tags": ["hadis"]}, "parameters": []}, "/hadis/trends/": {"get": {"operationId": "hadis_trends_list", "description": "", "parameters": [{"name": "search", "in": "query", "description": "A search term.", "required": false, "type": "string"}, {"name": "limit", "in": "query", "description": "Number of results to return per page.", "required": false, "type": "integer"}, {"name": "offset", "in": "query", "description": "The initial index from which to return the results.", "required": false, "type": "integer"}], "responses": {"200": {"description": "", "schema": {"required": ["count", "results"], "type": "object", "properties": {"count": {"type": "integer"}, "next": {"type": "string", "format": "uri", "x-nullable": true}, "previous": {"type": "string", "format": "uri", "x-nullable": true}, "results": {"type": "array", "items": {"$ref": "#/definitions/Trend"}}}}}}, "tags": ["hadis"]}, "parameters": []}, "/hadis/trends/{trend}/": {"get": {"operationId": "hadis_trends_read", "description": "", "parameters": [{"name": "limit", "in": "query", "description": "Number of results to return per page.", "required": false, "type": "integer"}, {"name": "offset", "in": "query", "description": "The initial index from which to return the results.", "required": false, "type": "integer"}], "responses": {"200": {"description": "", "schema": {"required": ["count", "results"], "type": "object", "properties": {"count": {"type": "integer"}, "next": {"type": "string", "format": "uri", "x-nullable": true}, "previous": {"type": "string", "format": "uri", "x-nullable": true}, "results": {"type": "array", "items": {"$ref": "#/definitions/Hadis"}}}}}}, "tags": ["hadis"]}, "parameters": [{"name": "trend", "in": "path", "required": true, "type": "string"}]}, "/hadis/user-hadises/": {"get": {"operationId": "hadis_user-hadises_list", "description": "", "parameters": [{"name": "limit", "in": "query", "description": "Number of results to return per page.", "required": false, "type": "integer"}, {"name": "offset", "in": "query", "description": "The initial index from which to return the results.", "required": false, "type": "integer"}], "responses": {"200": {"description": "", "schema": {"required": ["count", "results"], "type": "object", "properties": {"count": {"type": "integer"}, "next": {"type": "string", "format": "uri", "x-nullable": true}, "previous": {"type": "string", "format": "uri", "x-nullable": true}, "results": {"type": "array", "items": {"$ref": "#/definitions/Hadis"}}}}}}, "tags": ["hadis"]}, "parameters": []}, "/hadis/user-interests/": {"get": {"operationId": "hadis_user-interests_read", "description": "", "parameters": [], "responses": {"200": {"description": "", "schema": {"$ref": "#/definitions/UserInterest"}}}, "tags": ["hadis"]}, "put": {"operationId": "hadis_user-interests_update", "description": "", "parameters": [{"name": "data", "in": "body", "required": true, "schema": {"$ref": "#/definitions/UserInterest"}}], "responses": {"200": {"description": "", "schema": {"$ref": "#/definitions/UserInterest"}}}, "tags": ["hadis"]}, "patch": {"operationId": "hadis_user-interests_partial_update", "description": "", "parameters": [{"name": "data", "in": "body", "required": true, "schema": {"$ref": "#/definitions/UserInterest"}}], "responses": {"200": {"description": "", "schema": {"$ref": "#/definitions/UserInterest"}}}, "tags": ["hadis"]}, "parameters": []}, "/hadis/v2/categories/": {"get": {"operationId": "hadis_v2_categories_list", "description": "", "parameters": [], "responses": {"200": {"description": ""}}, "tags": ["hadis"]}, "parameters": []}, "/hadis/v2/hadis/": {"get": {"operationId": "hadis_v2_hadis_list", "description": "", "parameters": [{"name": "limit", "in": "query", "description": "Number of results to return per page.", "required": false, "type": "integer"}, {"name": "offset", "in": "query", "description": "The initial index from which to return the results.", "required": false, "type": "integer"}], "responses": {"200": {"description": "", "schema": {"required": ["count", "results"], "type": "object", "properties": {"count": {"type": "integer"}, "next": {"type": "string", "format": "uri", "x-nullable": true}, "previous": {"type": "string", "format": "uri", "x-nullable": true}, "results": {"type": "array", "items": {"$ref": "#/definitions/HadisSerializerV2"}}}}}}, "tags": ["hadis"]}, "parameters": []}, "/hadis/v2/narrators/": {"get": {"operationId": "hadis_v2_narrators_list", "description": "", "parameters": [], "responses": {"200": {"description": "", "schema": {"type": "array", "items": {"$ref": "#/definitions/NarratorSerializerV2"}}}}, "tags": ["hadis"]}, "parameters": []}, "/hadis/v2/user-daily/": {"get": {"operationId": "hadis_v2_user-daily_list", "description": "", "parameters": [], "responses": {"200": {"description": ""}}, "tags": ["hadis"]}, "parameters": []}, "/hadis/v2/user-hadises/": {"get": {"operationId": "hadis_v2_user-hadises_list", "description": "", "parameters": [{"name": "limit", "in": "query", "description": "Number of results to return per page.", "required": false, "type": "integer"}, {"name": "offset", "in": "query", "description": "The initial index from which to return the results.", "required": false, "type": "integer"}], "responses": {"200": {"description": ""}}, "tags": ["hadis"]}, "parameters": []}, "/hadis/{id}/": {"get": {"operationId": "hadis_read", "description": "", "parameters": [], "responses": {"200": {"description": "", "schema": {"$ref": "#/definitions/Hadis"}}}, "tags": ["hadis"]}, "parameters": [{"name": "id", "in": "path", "description": "A unique integer value identifying this hadis.", "required": true, "type": "integer"}]}, "/hussainya/albums-search/": {"get": {"operationId": "hussainya_albums-search_list", "description": "", "parameters": [{"name": "limit", "in": "query", "description": "Number of results to return per page.", "required": false, "type": "integer"}, {"name": "offset", "in": "query", "description": "The initial index from which to return the results.", "required": false, "type": "integer"}, {"name": "language_code", "in": "query", "description": "Language Code", "type": "string"}, {"name": "s", "in": "query", "description": "Search term", "type": "string"}], "responses": {"200": {"description": "", "schema": {"type": "array", "items": {"$ref": "#/definitions/AlbumList"}}}}, "tags": ["hussainya"]}, "parameters": []}, "/hussainya/albums/": {"get": {"operationId": "hussainya_albums_list", "description": "", "parameters": [{"name": "limit", "in": "query", "description": "Number of results to return per page.", "required": false, "type": "integer"}, {"name": "offset", "in": "query", "description": "The initial index from which to return the results.", "required": false, "type": "integer"}, {"name": "topic_id", "in": "query", "description": "Filter by Topic ID", "type": "integer"}, {"name": "singer_slug", "in": "query", "description": "Filter by singer slug", "type": "string"}, {"name": "language_code", "in": "query", "description": "Language Code (e.g., en, fa, es)", "type": "string"}, {"name": "search", "in": "query", "description": "Search term", "type": "string"}], "responses": {"200": {"description": "", "schema": {"required": ["count", "results"], "type": "object", "properties": {"count": {"type": "integer"}, "next": {"type": "string", "format": "uri", "x-nullable": true}, "previous": {"type": "string", "format": "uri", "x-nullable": true}, "results": {"type": "array", "items": {"$ref": "#/definitions/AlbumList"}}}}}}, "tags": ["hussainya"]}, "parameters": []}, "/hussainya/albums//": {"get": {"operationId": "hussainya_albums_list", "description": "", "parameters": [{"name": "limit", "in": "query", "description": "Number of results to return per page.", "required": false, "type": "integer"}, {"name": "offset", "in": "query", "description": "The initial index from which to return the results.", "required": false, "type": "integer"}, {"name": "topic_id", "in": "query", "description": "Filter by Topic ID", "type": "integer"}, {"name": "singer_slug", "in": "query", "description": "Filter by singer slug", "type": "string"}, {"name": "language_code", "in": "query", "description": "Language Code (e.g., en, fa, es)", "type": "string"}, {"name": "search", "in": "query", "description": "Search term", "type": "string"}], "responses": {"200": {"description": "", "schema": {"required": ["count", "results"], "type": "object", "properties": {"count": {"type": "integer"}, "next": {"type": "string", "format": "uri", "x-nullable": true}, "previous": {"type": "string", "format": "uri", "x-nullable": true}, "results": {"type": "array", "items": {"$ref": "#/definitions/AlbumList"}}}}}}, "tags": ["hussainya"]}, "parameters": []}, "/hussainya/albums//{id}/": {"get": {"operationId": "hussainya_albums__read", "description": "", "parameters": [{"name": "limit", "in": "query", "description": "Number of results to return per page.", "required": false, "type": "integer"}, {"name": "offset", "in": "query", "description": "The initial index from which to return the results.", "required": false, "type": "integer"}], "responses": {"200": {"description": "", "schema": {"required": ["count", "results"], "type": "object", "properties": {"count": {"type": "integer"}, "next": {"type": "string", "format": "uri", "x-nullable": true}, "previous": {"type": "string", "format": "uri", "x-nullable": true}, "results": {"type": "array", "items": {"$ref": "#/definitions/SongsList"}}}}}}, "tags": ["hussainya"]}, "parameters": [{"name": "id", "in": "path", "required": true, "type": "string"}]}, "/hussainya/albums/{id}/": {"get": {"operationId": "hussainya_albums_read", "description": "", "parameters": [{"name": "limit", "in": "query", "description": "Number of results to return per page.", "required": false, "type": "integer"}, {"name": "offset", "in": "query", "description": "The initial index from which to return the results.", "required": false, "type": "integer"}], "responses": {"200": {"description": "", "schema": {"required": ["count", "results"], "type": "object", "properties": {"count": {"type": "integer"}, "next": {"type": "string", "format": "uri", "x-nullable": true}, "previous": {"type": "string", "format": "uri", "x-nullable": true}, "results": {"type": "array", "items": {"$ref": "#/definitions/SongsList"}}}}}}, "tags": ["hussainya"]}, "parameters": [{"name": "id", "in": "path", "required": true, "type": "string"}]}, "/hussainya/albums/{id}/details/": {"get": {"operationId": "hussainya_albums_details_read", "description": "", "parameters": [], "responses": {"200": {"description": "", "schema": {"$ref": "#/definitions/AlbumList"}}}, "tags": ["hussainya"]}, "parameters": [{"name": "id", "in": "path", "required": true, "type": "string"}]}, "/hussainya/collections/": {"get": {"operationId": "hussainya_collections_list", "description": "", "parameters": [{"name": "limit", "in": "query", "description": "Number of results to return per page.", "required": false, "type": "integer"}, {"name": "offset", "in": "query", "description": "The initial index from which to return the results.", "required": false, "type": "integer"}, {"name": "language_code", "in": "query", "description": "Language Code", "type": "string"}], "responses": {"200": {"description": "", "schema": {"required": ["count", "results"], "type": "object", "properties": {"count": {"type": "integer"}, "next": {"type": "string", "format": "uri", "x-nullable": true}, "previous": {"type": "string", "format": "uri", "x-nullable": true}, "results": {"type": "array", "items": {"$ref": "#/definitions/CollectionList"}}}}}}, "tags": ["hussainya"]}, "parameters": []}, "/hussainya/collections//": {"get": {"operationId": "hussainya_collections_list", "description": "", "parameters": [{"name": "limit", "in": "query", "description": "Number of results to return per page.", "required": false, "type": "integer"}, {"name": "offset", "in": "query", "description": "The initial index from which to return the results.", "required": false, "type": "integer"}, {"name": "language_code", "in": "query", "description": "Language Code", "type": "string"}], "responses": {"200": {"description": "", "schema": {"required": ["count", "results"], "type": "object", "properties": {"count": {"type": "integer"}, "next": {"type": "string", "format": "uri", "x-nullable": true}, "previous": {"type": "string", "format": "uri", "x-nullable": true}, "results": {"type": "array", "items": {"$ref": "#/definitions/CollectionList"}}}}}}, "tags": ["hussainya"]}, "parameters": []}, "/hussainya/collections//{id}/": {"get": {"operationId": "hussainya_collections__read", "description": "", "parameters": [], "responses": {"200": {"description": "", "schema": {"$ref": "#/definitions/CollectionDetail"}}}, "tags": ["hussainya"]}, "parameters": [{"name": "id", "in": "path", "required": true, "type": "string"}]}, "/hussainya/collections/{id}/": {"get": {"operationId": "hussainya_collections_read", "description": "", "parameters": [], "responses": {"200": {"description": "", "schema": {"$ref": "#/definitions/CollectionDetail"}}}, "tags": ["hussainya"]}, "parameters": [{"name": "id", "in": "path", "required": true, "type": "string"}]}, "/hussainya/dashboard/albums/": {"get": {"operationId": "hussainya_dashboard_albums_list", "summary": "GET — لیست البوم‌ها با فیلترها\nPOST — ایجاد البوم جدید", "description": "Query params (GET):\n search جستجو در translations (icontains)\n status active | draft\n language_code کدهای زبان جداشده با کاما (fa,ar)\n order hijri → مرتب‌سازی بر اساس نزدیکیِ تاریخ قمری (get_albums_by_hijri_date)؛\n در غیر این صورت ترتیب پیش‌فرض (پین‌شده‌ها، سپس جدیدترین ساخت)\n page / page_size", "parameters": [{"name": "page", "in": "query", "description": "A page number within the paginated result set.", "required": false, "type": "integer"}, {"name": "page_size", "in": "query", "description": "Number of results to return per page.", "required": false, "type": "integer"}], "responses": {"200": {"description": "", "schema": {"required": ["count", "results"], "type": "object", "properties": {"count": {"type": "integer"}, "next": {"type": "string", "format": "uri", "x-nullable": true}, "previous": {"type": "string", "format": "uri", "x-nullable": true}, "results": {"type": "array", "items": {"$ref": "#/definitions/DashboardAlbumRow"}}}}}}, "tags": ["hussainya"]}, "post": {"operationId": "hussainya_dashboard_albums_create", "summary": "GET — لیست البوم‌ها با فیلترها\nPOST — ایجاد البوم جدید", "description": "Query params (GET):\n search جستجو در translations (icontains)\n status active | draft\n language_code کدهای زبان جداشده با کاما (fa,ar)\n order hijri → مرتب‌سازی بر اساس نزدیکیِ تاریخ قمری (get_albums_by_hijri_date)؛\n در غیر این صورت ترتیب پیش‌فرض (پین‌شده‌ها، سپس جدیدترین ساخت)\n page / page_size", "parameters": [{"name": "data", "in": "body", "required": true, "schema": {"$ref": "#/definitions/DashboardAlbumInput"}}], "responses": {"201": {"description": "", "schema": {"$ref": "#/definitions/DashboardAlbumInput"}}}, "tags": ["hussainya"]}, "parameters": []}, "/hussainya/dashboard/albums/{id}/": {"get": {"operationId": "hussainya_dashboard_albums_read", "description": "GET /hussainya/dashboard/albums//\nPATCH /hussainya/dashboard/albums//\nDELETE /hussainya/dashboard/albums//", "parameters": [], "responses": {"200": {"description": "", "schema": {"$ref": "#/definitions/DashboardAlbumRow"}}}, "tags": ["hussainya"]}, "patch": {"operationId": "hussainya_dashboard_albums_partial_update", "description": "GET /hussainya/dashboard/albums//\nPATCH /hussainya/dashboard/albums//\nDELETE /hussainya/dashboard/albums//", "parameters": [{"name": "data", "in": "body", "required": true, "schema": {"$ref": "#/definitions/DashboardAlbumInput"}}], "responses": {"200": {"description": "", "schema": {"$ref": "#/definitions/DashboardAlbumInput"}}}, "tags": ["hussainya"]}, "delete": {"operationId": "hussainya_dashboard_albums_delete", "description": "GET /hussainya/dashboard/albums//\nPATCH /hussainya/dashboard/albums//\nDELETE /hussainya/dashboard/albums//", "parameters": [], "responses": {"204": {"description": ""}}, "tags": ["hussainya"]}, "parameters": [{"name": "id", "in": "path", "required": true, "type": "string"}]}, "/hussainya/dashboard/autocomplete/albums/": {"get": {"operationId": "hussainya_dashboard_autocomplete_albums_list", "description": "GET /hussainya/dashboard/autocomplete/albums/", "parameters": [{"name": "page", "in": "query", "description": "A page number within the paginated result set.", "required": false, "type": "integer"}, {"name": "page_size", "in": "query", "description": "Number of results to return per page.", "required": false, "type": "integer"}], "responses": {"200": {"description": "", "schema": {"required": ["count", "results"], "type": "object", "properties": {"count": {"type": "integer"}, "next": {"type": "string", "format": "uri", "x-nullable": true}, "previous": {"type": "string", "format": "uri", "x-nullable": true}, "results": {"type": "array", "items": {"$ref": "#/definitions/_AlbumAutocomplete"}}}}}}, "tags": ["hussainya"]}, "parameters": []}, "/hussainya/dashboard/autocomplete/genres/": {"get": {"operationId": "hussainya_dashboard_autocomplete_genres_list", "description": "GET /hussainya/dashboard/autocomplete/genres/", "parameters": [{"name": "page", "in": "query", "description": "A page number within the paginated result set.", "required": false, "type": "integer"}, {"name": "page_size", "in": "query", "description": "Number of results to return per page.", "required": false, "type": "integer"}], "responses": {"200": {"description": "", "schema": {"required": ["count", "results"], "type": "object", "properties": {"count": {"type": "integer"}, "next": {"type": "string", "format": "uri", "x-nullable": true}, "previous": {"type": "string", "format": "uri", "x-nullable": true}, "results": {"type": "array", "items": {"$ref": "#/definitions/_GenreAutocomplete"}}}}}}, "tags": ["hussainya"]}, "parameters": []}, "/hussainya/dashboard/autocomplete/publishers/": {"get": {"operationId": "hussainya_dashboard_autocomplete_publishers_list", "description": "GET /hussainya/dashboard/autocomplete/publishers/", "parameters": [{"name": "page", "in": "query", "description": "A page number within the paginated result set.", "required": false, "type": "integer"}, {"name": "page_size", "in": "query", "description": "Number of results to return per page.", "required": false, "type": "integer"}], "responses": {"200": {"description": "", "schema": {"required": ["count", "results"], "type": "object", "properties": {"count": {"type": "integer"}, "next": {"type": "string", "format": "uri", "x-nullable": true}, "previous": {"type": "string", "format": "uri", "x-nullable": true}, "results": {"type": "array", "items": {"$ref": "#/definitions/_PublisherAutocomplete"}}}}}}, "tags": ["hussainya"]}, "parameters": []}, "/hussainya/dashboard/autocomplete/singers/": {"get": {"operationId": "hussainya_dashboard_autocomplete_singers_list", "summary": "GET /hussainya/dashboard/autocomplete/singers/", "description": "Query params اضافه:\n singer_type madah | lecturer (پیش‌فرض: همه)", "parameters": [{"name": "page", "in": "query", "description": "A page number within the paginated result set.", "required": false, "type": "integer"}, {"name": "page_size", "in": "query", "description": "Number of results to return per page.", "required": false, "type": "integer"}], "responses": {"200": {"description": "", "schema": {"required": ["count", "results"], "type": "object", "properties": {"count": {"type": "integer"}, "next": {"type": "string", "format": "uri", "x-nullable": true}, "previous": {"type": "string", "format": "uri", "x-nullable": true}, "results": {"type": "array", "items": {"$ref": "#/definitions/_SingerAutocomplete"}}}}}}, "tags": ["hussainya"]}, "parameters": []}, "/hussainya/dashboard/autocomplete/songs/": {"get": {"operationId": "hussainya_dashboard_autocomplete_songs_list", "summary": "GET /hussainya/dashboard/autocomplete/songs/", "description": "پیکرِ آهنگِ فرم «بفرمایید روضه» — جستجوی صفحه‌بندی‌شده در عنوان/اسلاگ.", "parameters": [{"name": "page", "in": "query", "description": "A page number within the paginated result set.", "required": false, "type": "integer"}, {"name": "page_size", "in": "query", "description": "Number of results to return per page.", "required": false, "type": "integer"}], "responses": {"200": {"description": "", "schema": {"required": ["count", "results"], "type": "object", "properties": {"count": {"type": "integer"}, "next": {"type": "string", "format": "uri", "x-nullable": true}, "previous": {"type": "string", "format": "uri", "x-nullable": true}, "results": {"type": "array", "items": {"$ref": "#/definitions/_SongAutocomplete"}}}}}}, "tags": ["hussainya"]}, "parameters": []}, "/hussainya/dashboard/autocomplete/tags/": {"get": {"operationId": "hussainya_dashboard_autocomplete_tags_list", "description": "GET /hussainya/dashboard/autocomplete/tags/", "parameters": [{"name": "page", "in": "query", "description": "A page number within the paginated result set.", "required": false, "type": "integer"}, {"name": "page_size", "in": "query", "description": "Number of results to return per page.", "required": false, "type": "integer"}], "responses": {"200": {"description": "", "schema": {"required": ["count", "results"], "type": "object", "properties": {"count": {"type": "integer"}, "next": {"type": "string", "format": "uri", "x-nullable": true}, "previous": {"type": "string", "format": "uri", "x-nullable": true}, "results": {"type": "array", "items": {"$ref": "#/definitions/_TagAutocomplete"}}}}}}, "tags": ["hussainya"]}, "parameters": []}, "/hussainya/dashboard/collections/": {"get": {"operationId": "hussainya_dashboard_collections_list", "summary": "GET — لیست مجموعه‌ها با فیلترها\nPOST — ایجاد مجموعهٔ جدید", "description": "Query params (GET):\n search جستجو در title (JSONField icontains)\n status active | draft\n pin_to_top pinned | unpinned\n page / page_size\n\nترتیب: pin_to_top اول، سپس بقیه بر اساس نزدیکیِ تاریخ قمری به امروز.\nget_collections_by_hijri_date یک list برمی‌گرداند؛ DashboardPageNumberPagination\nبا list هم کار می‌کند (عیناً مثل البوم‌ها).", "parameters": [{"name": "page", "in": "query", "description": "A page number within the paginated result set.", "required": false, "type": "integer"}, {"name": "page_size", "in": "query", "description": "Number of results to return per page.", "required": false, "type": "integer"}], "responses": {"200": {"description": "", "schema": {"required": ["count", "results"], "type": "object", "properties": {"count": {"type": "integer"}, "next": {"type": "string", "format": "uri", "x-nullable": true}, "previous": {"type": "string", "format": "uri", "x-nullable": true}, "results": {"type": "array", "items": {"$ref": "#/definitions/DashboardCollectionRow"}}}}}}, "tags": ["hussainya"]}, "post": {"operationId": "hussainya_dashboard_collections_create", "summary": "GET — لیست مجموعه‌ها با فیلترها\nPOST — ایجاد مجموعهٔ جدید", "description": "Query params (GET):\n search جستجو در title (JSONField icontains)\n status active | draft\n pin_to_top pinned | unpinned\n page / page_size\n\nترتیب: pin_to_top اول، سپس بقیه بر اساس نزدیکیِ تاریخ قمری به امروز.\nget_collections_by_hijri_date یک list برمی‌گرداند؛ DashboardPageNumberPagination\nبا list هم کار می‌کند (عیناً مثل البوم‌ها).", "parameters": [{"name": "data", "in": "body", "required": true, "schema": {"$ref": "#/definitions/DashboardCollectionInput"}}], "responses": {"201": {"description": "", "schema": {"$ref": "#/definitions/DashboardCollectionInput"}}}, "tags": ["hussainya"]}, "parameters": []}, "/hussainya/dashboard/collections/{id}/": {"get": {"operationId": "hussainya_dashboard_collections_read", "description": "GET /hussainya/dashboard/collections//\nPATCH /hussainya/dashboard/collections//\nDELETE /hussainya/dashboard/collections//", "parameters": [], "responses": {"200": {"description": "", "schema": {"$ref": "#/definitions/DashboardCollectionRow"}}}, "tags": ["hussainya"]}, "patch": {"operationId": "hussainya_dashboard_collections_partial_update", "description": "GET /hussainya/dashboard/collections//\nPATCH /hussainya/dashboard/collections//\nDELETE /hussainya/dashboard/collections//", "parameters": [{"name": "data", "in": "body", "required": true, "schema": {"$ref": "#/definitions/DashboardCollectionInput"}}], "responses": {"200": {"description": "", "schema": {"$ref": "#/definitions/DashboardCollectionInput"}}}, "tags": ["hussainya"]}, "delete": {"operationId": "hussainya_dashboard_collections_delete", "description": "GET /hussainya/dashboard/collections//\nPATCH /hussainya/dashboard/collections//\nDELETE /hussainya/dashboard/collections//", "parameters": [], "responses": {"204": {"description": ""}}, "tags": ["hussainya"]}, "parameters": [{"name": "id", "in": "path", "required": true, "type": "string"}]}, "/hussainya/dashboard/collections/{id}/songs/": {"get": {"operationId": "hussainya_dashboard_collections_songs_list", "summary": "GET /hussainya/dashboard/collections//songs/?page=&page_size=", "description": "آهنگ‌های متصل به یک مجموعه — به ترتیب ordering آهنگ و id نزولی.", "parameters": [{"name": "page", "in": "query", "description": "A page number within the paginated result set.", "required": false, "type": "integer"}, {"name": "page_size", "in": "query", "description": "Number of results to return per page.", "required": false, "type": "integer"}], "responses": {"200": {"description": "", "schema": {"required": ["count", "results"], "type": "object", "properties": {"count": {"type": "integer"}, "next": {"type": "string", "format": "uri", "x-nullable": true}, "previous": {"type": "string", "format": "uri", "x-nullable": true}, "results": {"type": "array", "items": {"$ref": "#/definitions/SongsList"}}}}}}, "tags": ["hussainya"]}, "parameters": [{"name": "id", "in": "path", "required": true, "type": "string"}]}, "/hussainya/dashboard/discover/": {"post": {"operationId": "hussainya_dashboard_discover_create", "description": "On-demand discovery of a YouTube channel/page into ImportItems.", "parameters": [], "responses": {"201": {"description": ""}}, "tags": ["hussainya"]}, "parameters": []}, "/hussainya/dashboard/genres/": {"get": {"operationId": "hussainya_dashboard_genres_list", "summary": "GET — لیست ژانرها با فیلترها\nPOST — ایجاد ژانر جدید", "description": "Query params (GET):\n search جستجو در title/slug (icontains)\n limit / offset", "parameters": [{"name": "page", "in": "query", "description": "A page number within the paginated result set.", "required": false, "type": "integer"}, {"name": "page_size", "in": "query", "description": "Number of results to return per page.", "required": false, "type": "integer"}], "responses": {"200": {"description": "", "schema": {"required": ["count", "results"], "type": "object", "properties": {"count": {"type": "integer"}, "next": {"type": "string", "format": "uri", "x-nullable": true}, "previous": {"type": "string", "format": "uri", "x-nullable": true}, "results": {"type": "array", "items": {"$ref": "#/definitions/DashboardGenreRow"}}}}}}, "tags": ["hussainya"]}, "post": {"operationId": "hussainya_dashboard_genres_create", "summary": "GET — لیست ژانرها با فیلترها\nPOST — ایجاد ژانر جدید", "description": "Query params (GET):\n search جستجو در title/slug (icontains)\n limit / offset", "parameters": [{"name": "data", "in": "body", "required": true, "schema": {"$ref": "#/definitions/DashboardGenreInput"}}], "responses": {"201": {"description": "", "schema": {"$ref": "#/definitions/DashboardGenreInput"}}}, "tags": ["hussainya"]}, "parameters": []}, "/hussainya/dashboard/genres/{id}/": {"get": {"operationId": "hussainya_dashboard_genres_read", "description": "GET /hussainya/dashboard/genres//\nPATCH /hussainya/dashboard/genres//\nDELETE /hussainya/dashboard/genres//", "parameters": [], "responses": {"200": {"description": "", "schema": {"$ref": "#/definitions/DashboardGenreRow"}}}, "tags": ["hussainya"]}, "patch": {"operationId": "hussainya_dashboard_genres_partial_update", "description": "GET /hussainya/dashboard/genres//\nPATCH /hussainya/dashboard/genres//\nDELETE /hussainya/dashboard/genres//", "parameters": [{"name": "data", "in": "body", "required": true, "schema": {"$ref": "#/definitions/DashboardGenreInput"}}], "responses": {"200": {"description": "", "schema": {"$ref": "#/definitions/DashboardGenreInput"}}}, "tags": ["hussainya"]}, "delete": {"operationId": "hussainya_dashboard_genres_delete", "description": "GET /hussainya/dashboard/genres//\nPATCH /hussainya/dashboard/genres//\nDELETE /hussainya/dashboard/genres//", "parameters": [], "responses": {"204": {"description": ""}}, "tags": ["hussainya"]}, "parameters": [{"name": "id", "in": "path", "required": true, "type": "string"}]}, "/hussainya/dashboard/home/albums/": {"get": {"operationId": "hussainya_dashboard_home_albums_list", "description": "GET /hussainya/dashboard/home/albums/?language_code=fa,ar", "parameters": [], "responses": {"200": {"description": ""}}, "tags": ["hussainya"]}, "parameters": []}, "/hussainya/dashboard/home/lives/": {"get": {"operationId": "hussainya_dashboard_home_lives_list", "description": "GET /hussainya/dashboard/home/lives/?language_code=fa,ar", "parameters": [], "responses": {"200": {"description": ""}}, "tags": ["hussainya"]}, "parameters": []}, "/hussainya/dashboard/home/maddahs/": {"get": {"operationId": "hussainya_dashboard_home_maddahs_list", "description": "GET /hussainya/dashboard/home/maddahs/?language_code=fa,ar&page=N&page_size=M", "parameters": [{"name": "page", "in": "query", "description": "A page number within the paginated result set.", "required": false, "type": "integer"}, {"name": "page_size", "in": "query", "description": "Number of results to return per page.", "required": false, "type": "integer"}], "responses": {"200": {"description": "", "schema": {"required": ["count", "results"], "type": "object", "properties": {"count": {"type": "integer"}, "next": {"type": "string", "format": "uri", "x-nullable": true}, "previous": {"type": "string", "format": "uri", "x-nullable": true}, "results": {"type": "array", "items": {"$ref": "#/definitions/SingersList"}}}}}}, "tags": ["hussainya"]}, "parameters": []}, "/hussainya/dashboard/home/popular/": {"get": {"operationId": "hussainya_dashboard_home_popular_list", "summary": "GET /hussainya/dashboard/home/popular/?language_code=fa,ar&page=N&page_size=M", "description": "محبوب‌ترین آهنگ‌ها برای گریدِ داشبورد، صفحه‌بندی‌شده (infinite scroll).\nAdmin-only؛ از ``language_code`` (تک‌زبانه یا کاما-سپریت) پشتیبانی می‌کند.", "parameters": [{"name": "page", "in": "query", "description": "A page number within the paginated result set.", "required": false, "type": "integer"}, {"name": "page_size", "in": "query", "description": "Number of results to return per page.", "required": false, "type": "integer"}], "responses": {"200": {"description": "", "schema": {"required": ["count", "results"], "type": "object", "properties": {"count": {"type": "integer"}, "next": {"type": "string", "format": "uri", "x-nullable": true}, "previous": {"type": "string", "format": "uri", "x-nullable": true}, "results": {"type": "array", "items": {"$ref": "#/definitions/SongsList"}}}}}}, "tags": ["hussainya"]}, "parameters": []}, "/hussainya/dashboard/home/speakers/": {"get": {"operationId": "hussainya_dashboard_home_speakers_list", "description": "GET /hussainya/dashboard/home/speakers/?language_code=fa,ar&page=N&page_size=M", "parameters": [{"name": "page", "in": "query", "description": "A page number within the paginated result set.", "required": false, "type": "integer"}, {"name": "page_size", "in": "query", "description": "Number of results to return per page.", "required": false, "type": "integer"}], "responses": {"200": {"description": "", "schema": {"required": ["count", "results"], "type": "object", "properties": {"count": {"type": "integer"}, "next": {"type": "string", "format": "uri", "x-nullable": true}, "previous": {"type": "string", "format": "uri", "x-nullable": true}, "results": {"type": "array", "items": {"$ref": "#/definitions/SingersList"}}}}}}, "tags": ["hussainya"]}, "parameters": []}, "/hussainya/dashboard/import-items/": {"get": {"operationId": "hussainya_dashboard_import-items_list", "description": "GET صف importها با فیلتر؛ POST ثبت لینک مستقیم و dispatch دریافت متادیتا.", "parameters": [{"name": "page", "in": "query", "description": "A page number within the paginated result set.", "required": false, "type": "integer"}, {"name": "page_size", "in": "query", "description": "Number of results to return per page.", "required": false, "type": "integer"}], "responses": {"200": {"description": "", "schema": {"required": ["count", "results"], "type": "object", "properties": {"count": {"type": "integer"}, "next": {"type": "string", "format": "uri", "x-nullable": true}, "previous": {"type": "string", "format": "uri", "x-nullable": true}, "results": {"type": "array", "items": {"$ref": "#/definitions/ImportItemRow"}}}}}}, "tags": ["hussainya"]}, "post": {"operationId": "hussainya_dashboard_import-items_create", "description": "GET صف importها با فیلتر؛ POST ثبت لینک مستقیم و dispatch دریافت متادیتا.", "parameters": [{"name": "data", "in": "body", "required": true, "schema": {"$ref": "#/definitions/ImportItemCreate"}}], "responses": {"201": {"description": "", "schema": {"$ref": "#/definitions/ImportItemCreate"}}}, "tags": ["hussainya"]}, "parameters": []}, "/hussainya/dashboard/import-items/{id}/": {"get": {"operationId": "hussainya_dashboard_import-items_read", "description": "GET جزئیات؛ PATCH اصلاح متادیتای AI؛ DELETE حذف.", "parameters": [], "responses": {"200": {"description": "", "schema": {"$ref": "#/definitions/ImportItemDetail"}}}, "tags": ["hussainya"]}, "patch": {"operationId": "hussainya_dashboard_import-items_partial_update", "description": "GET جزئیات؛ PATCH اصلاح متادیتای AI؛ DELETE حذف.", "parameters": [{"name": "data", "in": "body", "required": true, "schema": {"$ref": "#/definitions/ImportItemMetadata"}}], "responses": {"200": {"description": "", "schema": {"$ref": "#/definitions/ImportItemMetadata"}}}, "tags": ["hussainya"]}, "delete": {"operationId": "hussainya_dashboard_import-items_delete", "description": "GET جزئیات؛ PATCH اصلاح متادیتای AI؛ DELETE حذف.", "parameters": [], "responses": {"204": {"description": ""}}, "tags": ["hussainya"]}, "parameters": [{"name": "id", "in": "path", "description": "A unique integer value identifying this import item.", "required": true, "type": "integer"}]}, "/hussainya/dashboard/import-items/{id}/cancel/": {"post": {"operationId": "hussainya_dashboard_import-items_cancel_create", "description": "Cancel an item so it is excluded from the active queue.", "parameters": [], "responses": {"201": {"description": ""}}, "tags": ["hussainya"]}, "parameters": [{"name": "id", "in": "path", "required": true, "type": "string"}]}, "/hussainya/dashboard/import-items/{id}/publish/": {"post": {"operationId": "hussainya_dashboard_import-items_publish_create", "description": "Manual publish — used for channel/scheduled items after admin approval.", "parameters": [], "responses": {"201": {"description": ""}}, "tags": ["hussainya"]}, "parameters": [{"name": "id", "in": "path", "required": true, "type": "string"}]}, "/hussainya/dashboard/import-items/{id}/retry/": {"post": {"operationId": "hussainya_dashboard_import-items_retry_create", "description": "Re-dispatch metadata fetch for a failed/stuck item.", "parameters": [], "responses": {"201": {"description": ""}}, "tags": ["hussainya"]}, "parameters": [{"name": "id", "in": "path", "required": true, "type": "string"}]}, "/hussainya/dashboard/import-jobs/": {"post": {"operationId": "hussainya_dashboard_import-jobs_create", "summary": "Batch link submission from the dashboard ``Add links`` panel.", "description": "Direct links create one ImportItem each (carrying the admin's manual\nmetadata + locked fields) and dispatch metadata fetch; channel/page links\nkick off discovery. Detection falls back to the server when source/kind is\nnot supplied by the client.", "parameters": [], "responses": {"201": {"description": ""}}, "tags": ["hussainya"]}, "parameters": []}, "/hussainya/dashboard/please/": {"get": {"operationId": "hussainya_dashboard_please_list", "summary": "GET — لیست روضه‌ها با فیلترها\nPOST — ایجاد روضهٔ جدید", "description": "Query params (GET):\n search جستجو در translations/live_title (icontains)\n status active | draft\n pin_to_top pinned | unpinned\n page / page_size", "parameters": [{"name": "page", "in": "query", "description": "A page number within the paginated result set.", "required": false, "type": "integer"}, {"name": "page_size", "in": "query", "description": "Number of results to return per page.", "required": false, "type": "integer"}], "responses": {"200": {"description": "", "schema": {"required": ["count", "results"], "type": "object", "properties": {"count": {"type": "integer"}, "next": {"type": "string", "format": "uri", "x-nullable": true}, "previous": {"type": "string", "format": "uri", "x-nullable": true}, "results": {"type": "array", "items": {"$ref": "#/definitions/DashboardPleaseRow"}}}}}}, "tags": ["hussainya"]}, "post": {"operationId": "hussainya_dashboard_please_create", "summary": "GET — لیست روضه‌ها با فیلترها\nPOST — ایجاد روضهٔ جدید", "description": "Query params (GET):\n search جستجو در translations/live_title (icontains)\n status active | draft\n pin_to_top pinned | unpinned\n page / page_size", "parameters": [{"name": "data", "in": "body", "required": true, "schema": {"$ref": "#/definitions/DashboardPleaseInput"}}], "responses": {"201": {"description": "", "schema": {"$ref": "#/definitions/DashboardPleaseInput"}}}, "tags": ["hussainya"]}, "parameters": []}, "/hussainya/dashboard/please/{id}/": {"get": {"operationId": "hussainya_dashboard_please_read", "description": "GET /hussainya/dashboard/please//\nPATCH /hussainya/dashboard/please//\nDELETE /hussainya/dashboard/please//", "parameters": [], "responses": {"200": {"description": "", "schema": {"$ref": "#/definitions/DashboardPleaseRow"}}}, "tags": ["hussainya"]}, "patch": {"operationId": "hussainya_dashboard_please_partial_update", "description": "GET /hussainya/dashboard/please//\nPATCH /hussainya/dashboard/please//\nDELETE /hussainya/dashboard/please//", "parameters": [{"name": "data", "in": "body", "required": true, "schema": {"$ref": "#/definitions/DashboardPleaseInput"}}], "responses": {"200": {"description": "", "schema": {"$ref": "#/definitions/DashboardPleaseInput"}}}, "tags": ["hussainya"]}, "delete": {"operationId": "hussainya_dashboard_please_delete", "description": "GET /hussainya/dashboard/please//\nPATCH /hussainya/dashboard/please//\nDELETE /hussainya/dashboard/please//", "parameters": [], "responses": {"204": {"description": ""}}, "tags": ["hussainya"]}, "parameters": [{"name": "id", "in": "path", "required": true, "type": "string"}]}, "/hussainya/dashboard/please/{id}/songs/": {"get": {"operationId": "hussainya_dashboard_please_songs_list", "summary": "GET /hussainya/dashboard/please//songs/?page=&page_size=", "description": "آهنگ‌های متصل به یک روضه — به ترتیب priority و در شکل پخش‌پذیر\n(`SongsListSerializer`، همان شکل آهنگ‌های پنل آلبوم) برای پنل جزئیات.", "parameters": [{"name": "page", "in": "query", "description": "A page number within the paginated result set.", "required": false, "type": "integer"}, {"name": "page_size", "in": "query", "description": "Number of results to return per page.", "required": false, "type": "integer"}], "responses": {"200": {"description": "", "schema": {"required": ["count", "results"], "type": "object", "properties": {"count": {"type": "integer"}, "next": {"type": "string", "format": "uri", "x-nullable": true}, "previous": {"type": "string", "format": "uri", "x-nullable": true}, "results": {"type": "array", "items": {"$ref": "#/definitions/SongsList"}}}}}}, "tags": ["hussainya"]}, "parameters": [{"name": "id", "in": "path", "required": true, "type": "string"}]}, "/hussainya/dashboard/publishers/": {"get": {"operationId": "hussainya_dashboard_publishers_list", "summary": "GET — لیست ناشران با فیلترها\nPOST — ایجاد ناشر جدید", "description": "Query params (GET):\n search جستجو در name (icontains)\n type YT | IT | WS | TG | AP\n language_code کدهای زبان جداشده با کاما (fa,ar)\n page / page_size", "parameters": [{"name": "page", "in": "query", "description": "A page number within the paginated result set.", "required": false, "type": "integer"}, {"name": "page_size", "in": "query", "description": "Number of results to return per page.", "required": false, "type": "integer"}], "responses": {"200": {"description": "", "schema": {"required": ["count", "results"], "type": "object", "properties": {"count": {"type": "integer"}, "next": {"type": "string", "format": "uri", "x-nullable": true}, "previous": {"type": "string", "format": "uri", "x-nullable": true}, "results": {"type": "array", "items": {"$ref": "#/definitions/DashboardPublisherRow"}}}}}}, "tags": ["hussainya"]}, "post": {"operationId": "hussainya_dashboard_publishers_create", "summary": "GET — لیست ناشران با فیلترها\nPOST — ایجاد ناشر جدید", "description": "Query params (GET):\n search جستجو در name (icontains)\n type YT | IT | WS | TG | AP\n language_code کدهای زبان جداشده با کاما (fa,ar)\n page / page_size", "parameters": [{"name": "data", "in": "body", "required": true, "schema": {"$ref": "#/definitions/DashboardPublisherInput"}}], "responses": {"201": {"description": "", "schema": {"$ref": "#/definitions/DashboardPublisherInput"}}}, "tags": ["hussainya"]}, "parameters": []}, "/hussainya/dashboard/publishers/{id}/": {"get": {"operationId": "hussainya_dashboard_publishers_read", "description": "GET /hussainya/dashboard/publishers//\nPATCH /hussainya/dashboard/publishers//\nDELETE /hussainya/dashboard/publishers//", "parameters": [], "responses": {"200": {"description": "", "schema": {"$ref": "#/definitions/DashboardPublisherRow"}}}, "tags": ["hussainya"]}, "patch": {"operationId": "hussainya_dashboard_publishers_partial_update", "description": "GET /hussainya/dashboard/publishers//\nPATCH /hussainya/dashboard/publishers//\nDELETE /hussainya/dashboard/publishers//", "parameters": [{"name": "data", "in": "body", "required": true, "schema": {"$ref": "#/definitions/DashboardPublisherInput"}}], "responses": {"200": {"description": "", "schema": {"$ref": "#/definitions/DashboardPublisherInput"}}}, "tags": ["hussainya"]}, "delete": {"operationId": "hussainya_dashboard_publishers_delete", "description": "GET /hussainya/dashboard/publishers//\nPATCH /hussainya/dashboard/publishers//\nDELETE /hussainya/dashboard/publishers//", "parameters": [], "responses": {"204": {"description": ""}}, "tags": ["hussainya"]}, "parameters": [{"name": "id", "in": "path", "required": true, "type": "string"}]}, "/hussainya/dashboard/runs/": {"get": {"operationId": "hussainya_dashboard_runs_list", "description": "History of discovery runs.", "parameters": [{"name": "page", "in": "query", "description": "A page number within the paginated result set.", "required": false, "type": "integer"}, {"name": "page_size", "in": "query", "description": "Number of results to return per page.", "required": false, "type": "integer"}], "responses": {"200": {"description": "", "schema": {"required": ["count", "results"], "type": "object", "properties": {"count": {"type": "integer"}, "next": {"type": "string", "format": "uri", "x-nullable": true}, "previous": {"type": "string", "format": "uri", "x-nullable": true}, "results": {"type": "array", "items": {"$ref": "#/definitions/ImportRunRow"}}}}}}, "tags": ["hussainya"]}, "parameters": []}, "/hussainya/dashboard/search/": {"get": {"operationId": "hussainya_dashboard_search_list", "description": "GET /hussainya/dashboard/search/?q=&types=&limit=", "parameters": [], "responses": {"200": {"description": ""}}, "tags": ["hussainya"]}, "parameters": []}, "/hussainya/dashboard/singers/": {"get": {"operationId": "hussainya_dashboard_singers_list", "summary": "Management list + create for dashboard maddahs/speakers.", "description": "GET /hussainya/dashboard/singers/ → لیست با فیلترها\nPOST /hussainya/dashboard/singers/ → ایجاد مداح/سخنران جدید\n\nQuery params (GET):\n - singer_type: all | madah | lecturer\n - status: all | active | draft\n - language_code: comma-separated language codes, e.g. fa,ar\n - search: text matched against translations JSON\n - page / page_size", "parameters": [{"name": "page", "in": "query", "description": "A page number within the paginated result set.", "required": false, "type": "integer"}, {"name": "page_size", "in": "query", "description": "Number of results to return per page.", "required": false, "type": "integer"}], "responses": {"200": {"description": "", "schema": {"required": ["count", "results"], "type": "object", "properties": {"count": {"type": "integer"}, "next": {"type": "string", "format": "uri", "x-nullable": true}, "previous": {"type": "string", "format": "uri", "x-nullable": true}, "results": {"type": "array", "items": {"$ref": "#/definitions/DashboardSinger"}}}}}}, "tags": ["hussainya"]}, "post": {"operationId": "hussainya_dashboard_singers_create", "summary": "Management list + create for dashboard maddahs/speakers.", "description": "GET /hussainya/dashboard/singers/ → لیست با فیلترها\nPOST /hussainya/dashboard/singers/ → ایجاد مداح/سخنران جدید\n\nQuery params (GET):\n - singer_type: all | madah | lecturer\n - status: all | active | draft\n - language_code: comma-separated language codes, e.g. fa,ar\n - search: text matched against translations JSON\n - page / page_size", "parameters": [{"name": "data", "in": "body", "required": true, "schema": {"$ref": "#/definitions/DashboardSingerInput"}}], "responses": {"201": {"description": "", "schema": {"$ref": "#/definitions/DashboardSingerInput"}}}, "tags": ["hussainya"]}, "parameters": []}, "/hussainya/dashboard/singers/{identifier}/": {"get": {"operationId": "hussainya_dashboard_singers_read", "summary": "Detail / update / delete for one dashboard singer/provider.", "description": "GET /hussainya/dashboard/singers//\nPATCH /hussainya/dashboard/singers//\nDELETE /hussainya/dashboard/singers//", "parameters": [], "responses": {"200": {"description": "", "schema": {"$ref": "#/definitions/DashboardSinger"}}}, "tags": ["hussainya"]}, "patch": {"operationId": "hussainya_dashboard_singers_partial_update", "summary": "Detail / update / delete for one dashboard singer/provider.", "description": "GET /hussainya/dashboard/singers//\nPATCH /hussainya/dashboard/singers//\nDELETE /hussainya/dashboard/singers//", "parameters": [{"name": "data", "in": "body", "required": true, "schema": {"$ref": "#/definitions/DashboardSingerInput"}}], "responses": {"200": {"description": "", "schema": {"$ref": "#/definitions/DashboardSingerInput"}}}, "tags": ["hussainya"]}, "delete": {"operationId": "hussainya_dashboard_singers_delete", "summary": "Detail / update / delete for one dashboard singer/provider.", "description": "GET /hussainya/dashboard/singers//\nPATCH /hussainya/dashboard/singers//\nDELETE /hussainya/dashboard/singers//", "parameters": [], "responses": {"204": {"description": ""}}, "tags": ["hussainya"]}, "parameters": [{"name": "identifier", "in": "path", "required": true, "type": "string"}]}, "/hussainya/dashboard/songs/": {"get": {"operationId": "hussainya_dashboard_songs_list", "summary": "GET — لیست آهنگ‌ها با فیلترها\nPOST — ایجاد آهنگ جدید", "description": "Query params (GET):\n search جستجو در عنوان (JSONField)\n genre id ژانر\n song_type audio | video | youtube\n singers idهای خواننده، جداشده با کاما (فیلتر دقیق)\n status active | draft\n singer_type madah | lecturer (فیلتر از طریق سینگرها)\n language_code کد زبان با کاما (fa,ar)\n page / page_size", "parameters": [{"name": "page", "in": "query", "description": "A page number within the paginated result set.", "required": false, "type": "integer"}, {"name": "page_size", "in": "query", "description": "Number of results to return per page.", "required": false, "type": "integer"}], "responses": {"200": {"description": "", "schema": {"required": ["count", "results"], "type": "object", "properties": {"count": {"type": "integer"}, "next": {"type": "string", "format": "uri", "x-nullable": true}, "previous": {"type": "string", "format": "uri", "x-nullable": true}, "results": {"type": "array", "items": {"$ref": "#/definitions/DashboardSongRow"}}}}}}, "tags": ["hussainya"]}, "post": {"operationId": "hussainya_dashboard_songs_create", "summary": "GET — لیست آهنگ‌ها با فیلترها\nPOST — ایجاد آهنگ جدید", "description": "Query params (GET):\n search جستجو در عنوان (JSONField)\n genre id ژانر\n song_type audio | video | youtube\n singers idهای خواننده، جداشده با کاما (فیلتر دقیق)\n status active | draft\n singer_type madah | lecturer (فیلتر از طریق سینگرها)\n language_code کد زبان با کاما (fa,ar)\n page / page_size", "parameters": [{"name": "data", "in": "body", "required": true, "schema": {"$ref": "#/definitions/DashboardSongInput"}}], "responses": {"201": {"description": "", "schema": {"$ref": "#/definitions/DashboardSongInput"}}}, "tags": ["hussainya"]}, "parameters": []}, "/hussainya/dashboard/songs/{identifier}/": {"get": {"operationId": "hussainya_dashboard_songs_read", "description": "GET /hussainya/dashboard/songs//\nPATCH /hussainya/dashboard/songs//\nDELETE /hussainya/dashboard/songs//\n\nشناسه می‌تواند id عددی (از جدول مدیریت) یا slug (از کارت‌های صفحهٔ خانه/جستجو)\nباشد؛ هم‌رفتار با DashboardSingerDetailView. این‌طور پنل آهنگ همیشه با یک API\nواحد دیتای کامل (تصویر + فایل) را می‌گیرد، چه از جدول باز شود چه از خانه.", "parameters": [], "responses": {"200": {"description": "", "schema": {"$ref": "#/definitions/DashboardSongRow"}}}, "tags": ["hussainya"]}, "patch": {"operationId": "hussainya_dashboard_songs_partial_update", "description": "GET /hussainya/dashboard/songs//\nPATCH /hussainya/dashboard/songs//\nDELETE /hussainya/dashboard/songs//\n\nشناسه می‌تواند id عددی (از جدول مدیریت) یا slug (از کارت‌های صفحهٔ خانه/جستجو)\nباشد؛ هم‌رفتار با DashboardSingerDetailView. این‌طور پنل آهنگ همیشه با یک API\nواحد دیتای کامل (تصویر + فایل) را می‌گیرد، چه از جدول باز شود چه از خانه.", "parameters": [{"name": "data", "in": "body", "required": true, "schema": {"$ref": "#/definitions/DashboardSongInput"}}], "responses": {"200": {"description": "", "schema": {"$ref": "#/definitions/DashboardSongInput"}}}, "tags": ["hussainya"]}, "delete": {"operationId": "hussainya_dashboard_songs_delete", "description": "GET /hussainya/dashboard/songs//\nPATCH /hussainya/dashboard/songs//\nDELETE /hussainya/dashboard/songs//\n\nشناسه می‌تواند id عددی (از جدول مدیریت) یا slug (از کارت‌های صفحهٔ خانه/جستجو)\nباشد؛ هم‌رفتار با DashboardSingerDetailView. این‌طور پنل آهنگ همیشه با یک API\nواحد دیتای کامل (تصویر + فایل) را می‌گیرد، چه از جدول باز شود چه از خانه.", "parameters": [], "responses": {"204": {"description": ""}}, "tags": ["hussainya"]}, "parameters": [{"name": "identifier", "in": "path", "required": true, "type": "string"}]}, "/hussainya/dashboard/source-tasks/": {"get": {"operationId": "hussainya_dashboard_source-tasks_list", "description": "CRUD list/create for periodic channel watchers.", "parameters": [{"name": "page", "in": "query", "description": "A page number within the paginated result set.", "required": false, "type": "integer"}, {"name": "page_size", "in": "query", "description": "Number of results to return per page.", "required": false, "type": "integer"}], "responses": {"200": {"description": "", "schema": {"required": ["count", "results"], "type": "object", "properties": {"count": {"type": "integer"}, "next": {"type": "string", "format": "uri", "x-nullable": true}, "previous": {"type": "string", "format": "uri", "x-nullable": true}, "results": {"type": "array", "items": {"$ref": "#/definitions/ImportSourceTaskRow"}}}}}}, "tags": ["hussainya"]}, "post": {"operationId": "hussainya_dashboard_source-tasks_create", "description": "CRUD list/create for periodic channel watchers.", "parameters": [{"name": "data", "in": "body", "required": true, "schema": {"$ref": "#/definitions/ImportSourceTaskInput"}}], "responses": {"201": {"description": "", "schema": {"$ref": "#/definitions/ImportSourceTaskInput"}}}, "tags": ["hussainya"]}, "parameters": []}, "/hussainya/dashboard/source-tasks/{id}/": {"get": {"operationId": "hussainya_dashboard_source-tasks_read", "description": "", "parameters": [], "responses": {"200": {"description": "", "schema": {"$ref": "#/definitions/ImportSourceTaskRow"}}}, "tags": ["hussainya"]}, "patch": {"operationId": "hussainya_dashboard_source-tasks_partial_update", "description": "", "parameters": [{"name": "data", "in": "body", "required": true, "schema": {"$ref": "#/definitions/ImportSourceTaskInput"}}], "responses": {"200": {"description": "", "schema": {"$ref": "#/definitions/ImportSourceTaskInput"}}}, "tags": ["hussainya"]}, "delete": {"operationId": "hussainya_dashboard_source-tasks_delete", "description": "", "parameters": [], "responses": {"204": {"description": ""}}, "tags": ["hussainya"]}, "parameters": [{"name": "id", "in": "path", "description": "A unique integer value identifying this import source task.", "required": true, "type": "integer"}]}, "/hussainya/dashboard/source-tasks/{id}/run-now/": {"post": {"operationId": "hussainya_dashboard_source-tasks_run-now_create", "description": "Trigger a periodic task's discovery immediately (admin 'run now').", "parameters": [], "responses": {"201": {"description": ""}}, "tags": ["hussainya"]}, "parameters": [{"name": "id", "in": "path", "required": true, "type": "string"}]}, "/hussainya/dashboard/tags/": {"get": {"operationId": "hussainya_dashboard_tags_list", "summary": "GET — لیست تگ‌ها با فیلترها\nPOST — ایجاد تگ جدید", "description": "Query params (GET):\n search جستجو در title/translations\n page / page_size", "parameters": [{"name": "page", "in": "query", "description": "A page number within the paginated result set.", "required": false, "type": "integer"}, {"name": "page_size", "in": "query", "description": "Number of results to return per page.", "required": false, "type": "integer"}], "responses": {"200": {"description": "", "schema": {"required": ["count", "results"], "type": "object", "properties": {"count": {"type": "integer"}, "next": {"type": "string", "format": "uri", "x-nullable": true}, "previous": {"type": "string", "format": "uri", "x-nullable": true}, "results": {"type": "array", "items": {"$ref": "#/definitions/DashboardTagRow"}}}}}}, "tags": ["hussainya"]}, "post": {"operationId": "hussainya_dashboard_tags_create", "summary": "GET — لیست تگ‌ها با فیلترها\nPOST — ایجاد تگ جدید", "description": "Query params (GET):\n search جستجو در title/translations\n page / page_size", "parameters": [{"name": "data", "in": "body", "required": true, "schema": {"$ref": "#/definitions/DashboardTagInput"}}], "responses": {"201": {"description": "", "schema": {"$ref": "#/definitions/DashboardTagInput"}}}, "tags": ["hussainya"]}, "parameters": []}, "/hussainya/dashboard/tags/{id}/": {"get": {"operationId": "hussainya_dashboard_tags_read", "description": "GET /hussainya/dashboard/tags//\nPATCH /hussainya/dashboard/tags//\nDELETE /hussainya/dashboard/tags//", "parameters": [], "responses": {"200": {"description": "", "schema": {"$ref": "#/definitions/DashboardTagRow"}}}, "tags": ["hussainya"]}, "patch": {"operationId": "hussainya_dashboard_tags_partial_update", "description": "GET /hussainya/dashboard/tags//\nPATCH /hussainya/dashboard/tags//\nDELETE /hussainya/dashboard/tags//", "parameters": [{"name": "data", "in": "body", "required": true, "schema": {"$ref": "#/definitions/DashboardTagInput"}}], "responses": {"200": {"description": "", "schema": {"$ref": "#/definitions/DashboardTagInput"}}}, "tags": ["hussainya"]}, "delete": {"operationId": "hussainya_dashboard_tags_delete", "description": "GET /hussainya/dashboard/tags//\nPATCH /hussainya/dashboard/tags//\nDELETE /hussainya/dashboard/tags//", "parameters": [], "responses": {"204": {"description": ""}}, "tags": ["hussainya"]}, "parameters": [{"name": "id", "in": "path", "required": true, "type": "string"}]}, "/hussainya/dashboard/upload-media/": {"post": {"operationId": "hussainya_dashboard_upload-media_create", "description": "آپلود فایل موقت برای فرم‌های داشبورد — admin-only.", "parameters": [{"name": "file", "in": "formData", "required": true, "type": "file"}], "responses": {"201": {"description": "", "schema": {"$ref": "#/definitions/_Upload"}}}, "consumes": ["multipart/form-data", "application/x-www-form-urlencoded"], "tags": ["hussainya"]}, "parameters": []}, "/hussainya/genre-list/": {"get": {"operationId": "hussainya_genre-list_list", "description": "", "parameters": [], "responses": {"200": {"description": ""}}, "tags": ["hussainya"]}, "parameters": []}, "/hussainya/get-youtube-info/": {"post": {"operationId": "hussainya_get-youtube-info_create", "description": "", "parameters": [{"name": "data", "in": "body", "required": true, "schema": {"type": "object", "properties": {"youtube_link": {"type": "string"}}}}], "responses": {"200": {"description": "", "schema": {"$ref": "#/definitions/YoutubeInfo"}}}, "tags": ["hussainya"]}, "parameters": []}, "/hussainya/lives/": {"get": {"operationId": "hussainya_lives_list", "description": "", "parameters": [{"name": "limit", "in": "query", "description": "Number of results to return per page.", "required": false, "type": "integer"}, {"name": "offset", "in": "query", "description": "The initial index from which to return the results.", "required": false, "type": "integer"}, {"name": "language_code", "in": "query", "description": "Language Code", "type": "string"}], "responses": {"200": {"description": "", "schema": {"required": ["count", "results"], "type": "object", "properties": {"count": {"type": "integer"}, "next": {"type": "string", "format": "uri", "x-nullable": true}, "previous": {"type": "string", "format": "uri", "x-nullable": true}, "results": {"type": "array", "items": {"$ref": "#/definitions/ShrineLive"}}}}}}, "tags": ["hussainya"]}, "parameters": []}, "/hussainya/playlist/": {"get": {"operationId": "hussainya_playlist_list", "description": "", "parameters": [{"name": "limit", "in": "query", "description": "Number of results to return per page.", "required": false, "type": "integer"}, {"name": "offset", "in": "query", "description": "The initial index from which to return the results.", "required": false, "type": "integer"}], "responses": {"200": {"description": "", "schema": {"required": ["count", "results"], "type": "object", "properties": {"count": {"type": "integer"}, "next": {"type": "string", "format": "uri", "x-nullable": true}, "previous": {"type": "string", "format": "uri", "x-nullable": true}, "results": {"type": "array", "items": {"$ref": "#/definitions/SongsList"}}}}}}, "tags": ["hussainya"]}, "parameters": []}, "/hussainya/playlist//": {"get": {"operationId": "hussainya_playlist_list", "description": "", "parameters": [{"name": "limit", "in": "query", "description": "Number of results to return per page.", "required": false, "type": "integer"}, {"name": "offset", "in": "query", "description": "The initial index from which to return the results.", "required": false, "type": "integer"}], "responses": {"200": {"description": "", "schema": {"required": ["count", "results"], "type": "object", "properties": {"count": {"type": "integer"}, "next": {"type": "string", "format": "uri", "x-nullable": true}, "previous": {"type": "string", "format": "uri", "x-nullable": true}, "results": {"type": "array", "items": {"$ref": "#/definitions/SongsList"}}}}}}, "tags": ["hussainya"]}, "parameters": []}, "/hussainya/provider/profile/": {"post": {"operationId": "hussainya_provider_profile_create", "description": "", "parameters": [{"name": "data", "in": "body", "required": true, "schema": {"$ref": "#/definitions/HussainiyaProviderProfileSerializer"}}], "responses": {"201": {"description": "", "schema": {"$ref": "#/definitions/HussainiyaProviderProfileSerializer"}}}, "tags": ["hussainya"]}, "parameters": []}, "/hussainya/provider/songs/": {"get": {"operationId": "hussainya_provider_songs_list", "description": "", "parameters": [{"name": "limit", "in": "query", "description": "Number of results to return per page.", "required": false, "type": "integer"}, {"name": "offset", "in": "query", "description": "The initial index from which to return the results.", "required": false, "type": "integer"}], "responses": {"200": {"description": "", "schema": {"required": ["count", "results"], "type": "object", "properties": {"count": {"type": "integer"}, "next": {"type": "string", "format": "uri", "x-nullable": true}, "previous": {"type": "string", "format": "uri", "x-nullable": true}, "results": {"type": "array", "items": {"$ref": "#/definitions/SongsList"}}}}}}, "tags": ["hussainya"]}, "parameters": []}, "/hussainya/provider/songs/create/": {"post": {"operationId": "hussainya_provider_songs_create_create", "description": "", "parameters": [{"name": "data", "in": "body", "required": true, "schema": {"$ref": "#/definitions/CreateSong"}}], "responses": {"201": {"description": "", "schema": {"$ref": "#/definitions/CreateSong"}}}, "tags": ["hussainya"]}, "parameters": []}, "/hussainya/provider/songs/{slug}/": {"put": {"operationId": "hussainya_provider_songs_update", "description": "", "parameters": [{"name": "data", "in": "body", "required": true, "schema": {"$ref": "#/definitions/UpdateSong"}}], "responses": {"200": {"description": "", "schema": {"$ref": "#/definitions/UpdateSong"}}}, "tags": ["hussainya"]}, "patch": {"operationId": "hussainya_provider_songs_partial_update", "description": "", "parameters": [{"name": "data", "in": "body", "required": true, "schema": {"$ref": "#/definitions/UpdateSong"}}], "responses": {"200": {"description": "", "schema": {"$ref": "#/definitions/UpdateSong"}}}, "tags": ["hussainya"]}, "delete": {"operationId": "hussainya_provider_songs_delete", "description": "", "parameters": [], "responses": {"204": {"description": ""}}, "tags": ["hussainya"]}, "parameters": [{"name": "slug", "in": "path", "required": true, "type": "string"}]}, "/hussainya/publishers/": {"get": {"operationId": "hussainya_publishers_list", "description": "", "parameters": [{"name": "search", "in": "query", "description": "A search term.", "required": false, "type": "string"}, {"name": "limit", "in": "query", "description": "Number of results to return per page.", "required": false, "type": "integer"}, {"name": "offset", "in": "query", "description": "The initial index from which to return the results.", "required": false, "type": "integer"}], "responses": {"200": {"description": "", "schema": {"required": ["count", "results"], "type": "object", "properties": {"count": {"type": "integer"}, "next": {"type": "string", "format": "uri", "x-nullable": true}, "previous": {"type": "string", "format": "uri", "x-nullable": true}, "results": {"type": "array", "items": {"$ref": "#/definitions/Publisher"}}}}}}, "tags": ["hussainya"]}, "parameters": []}, "/hussainya/publishers//": {"get": {"operationId": "hussainya_publishers_list", "description": "", "parameters": [{"name": "search", "in": "query", "description": "A search term.", "required": false, "type": "string"}, {"name": "limit", "in": "query", "description": "Number of results to return per page.", "required": false, "type": "integer"}, {"name": "offset", "in": "query", "description": "The initial index from which to return the results.", "required": false, "type": "integer"}], "responses": {"200": {"description": "", "schema": {"required": ["count", "results"], "type": "object", "properties": {"count": {"type": "integer"}, "next": {"type": "string", "format": "uri", "x-nullable": true}, "previous": {"type": "string", "format": "uri", "x-nullable": true}, "results": {"type": "array", "items": {"$ref": "#/definitions/Publisher"}}}}}}, "tags": ["hussainya"]}, "parameters": []}, "/hussainya/publishers//{id}/": {"get": {"operationId": "hussainya_publishers__read", "description": "", "parameters": [{"name": "search", "in": "query", "description": "A search term.", "required": false, "type": "string"}, {"name": "limit", "in": "query", "description": "Number of results to return per page.", "required": false, "type": "integer"}, {"name": "offset", "in": "query", "description": "The initial index from which to return the results.", "required": false, "type": "integer"}, {"name": "ordering", "in": "query", "description": "Order fields by (created_at, -created_at (desc) | view_count, like_count, published_date", "type": "string", "enum": ["like_counts", "-like_counts", "view_count", "-view_count", "created_at", "-created_at", "published_date", "-published_date"]}, {"name": "song_type", "in": "query", "description": "Filter by song type (audio, video, youtube)", "type": "string", "enum": ["audio", "video", "youtube"]}, {"name": "genre_id", "in": "query", "description": "Filter genre_id ['1-(مداحی)', '2-(سخنرانی)', '3-(سخنرانی کوتاه)', '4-(مولودی)', '5-(ادعیه)', '6-(مناجات)', '7-(مقتل)', '8-(روضه)']]", "type": "string"}, {"name": "random", "in": "query", "description": "Filter Random Palyer", "type": "boolean"}], "responses": {"200": {"description": "", "schema": {"required": ["count", "results"], "type": "object", "properties": {"count": {"type": "integer"}, "next": {"type": "string", "format": "uri", "x-nullable": true}, "previous": {"type": "string", "format": "uri", "x-nullable": true}, "results": {"type": "array", "items": {"$ref": "#/definitions/SongsList"}}}}}}, "tags": ["hussainya"]}, "parameters": [{"name": "id", "in": "path", "required": true, "type": "string"}]}, "/hussainya/publishers/{id}/": {"get": {"operationId": "hussainya_publishers_read", "description": "", "parameters": [{"name": "search", "in": "query", "description": "A search term.", "required": false, "type": "string"}, {"name": "limit", "in": "query", "description": "Number of results to return per page.", "required": false, "type": "integer"}, {"name": "offset", "in": "query", "description": "The initial index from which to return the results.", "required": false, "type": "integer"}, {"name": "ordering", "in": "query", "description": "Order fields by (created_at, -created_at (desc) | view_count, like_count, published_date", "type": "string", "enum": ["like_counts", "-like_counts", "view_count", "-view_count", "created_at", "-created_at", "published_date", "-published_date"]}, {"name": "song_type", "in": "query", "description": "Filter by song type (audio, video, youtube)", "type": "string", "enum": ["audio", "video", "youtube"]}, {"name": "genre_id", "in": "query", "description": "Filter genre_id ['1-(مداحی)', '2-(سخنرانی)', '3-(سخنرانی کوتاه)', '4-(مولودی)', '5-(ادعیه)', '6-(مناجات)', '7-(مقتل)', '8-(روضه)']]", "type": "string"}, {"name": "random", "in": "query", "description": "Filter Random Palyer", "type": "boolean"}], "responses": {"200": {"description": "", "schema": {"required": ["count", "results"], "type": "object", "properties": {"count": {"type": "integer"}, "next": {"type": "string", "format": "uri", "x-nullable": true}, "previous": {"type": "string", "format": "uri", "x-nullable": true}, "results": {"type": "array", "items": {"$ref": "#/definitions/SongsList"}}}}}}, "tags": ["hussainya"]}, "parameters": [{"name": "id", "in": "path", "required": true, "type": "string"}]}, "/hussainya/pwa/collections/": {"get": {"operationId": "hussainya_pwa_collections_list", "summary": "Unified collection list for the PWA home (``pwa/collections``).", "description": "Returns one flat list where the **user's own** collections\n(``PlaylistCollection``) come first, followed by the **public**\ncollections (``Collection``). The response shape is identical for both\nsources — ``{id, title, songs}`` — with no ``type`` field.", "parameters": [], "responses": {"200": {"description": ""}}, "tags": ["hussainya"]}, "parameters": []}, "/hussainya/pwa/home/": {"get": {"operationId": "hussainya_pwa_home_list", "summary": "PWA home — the same payload as ``HomePageV3`` but only the\nmadah / lecturer / event sections.", "description": "These three sections carry no per-user data (the singer/album serializers\nhave no ``is_liked``/``is_playlist`` fields), so the payload is fully\nshareable. It is cached per language under its own key and served without\nthe per-user ``personalize`` step.\n\nEach section also exposes a stable ``key`` alongside the (translated)\n``title`` so the client can identify sections without depending on the\nlocalized title string.", "parameters": [], "responses": {"200": {"description": ""}}, "tags": ["hussainya"]}, "parameters": []}, "/hussainya/pwa/playlist/collections/": {"get": {"operationId": "hussainya_pwa_playlist_collections_list", "summary": "Collection list for the PWA **playlist tab** (``pwa/playlist/collections``).", "description": "Differs from ``PWACollectionsView`` (home) in three ways:\n * **lightweight** — metadata only, no embedded songs, so it is cheap and\n paginated;\n * **keeps empty collections** — a freshly created user collection with no\n songs must still appear;\n * **paginated** — ``DashboardPageNumberPagination`` (``page``/``page_size``).", "parameters": [{"name": "page", "in": "query", "description": "A page number within the paginated result set.", "required": false, "type": "integer"}, {"name": "page_size", "in": "query", "description": "Number of results to return per page.", "required": false, "type": "integer"}], "responses": {"200": {"description": "", "schema": {"required": ["count", "results"], "type": "object", "properties": {"count": {"type": "integer"}, "next": {"type": "string", "format": "uri", "x-nullable": true}, "previous": {"type": "string", "format": "uri", "x-nullable": true}, "results": {"type": "array", "items": {"$ref": "#/definitions/PlaylistTabCollection"}}}}}}, "tags": ["hussainya"]}, "parameters": []}, "/hussainya/pwa/playlist/collections/{cid}/songs/": {"get": {"operationId": "hussainya_pwa_playlist_collections_songs_list", "summary": "Songs of a single playlist-tab collection — unified across both sources.", "description": "The ``cid`` path arg is the **prefixed** id used everywhere in the PWA:\n * ``u`` → user collection (``PlaylistCollection`` via ``Playlist``);\n * ``p`` → public collection (``Collection.get_songs``).\n\nBoth branches are language-ordered (same priority as the home popular row),\nannotated with per-user ``is_liked``, prefetched against N+1, paginated, and\nserialized with ``SongsListSerializer``. An empty collection returns an empty\npage (200), never 404.", "parameters": [{"name": "page", "in": "query", "description": "A page number within the paginated result set.", "required": false, "type": "integer"}, {"name": "page_size", "in": "query", "description": "Number of results to return per page.", "required": false, "type": "integer"}], "responses": {"200": {"description": "", "schema": {"required": ["count", "results"], "type": "object", "properties": {"count": {"type": "integer"}, "next": {"type": "string", "format": "uri", "x-nullable": true}, "previous": {"type": "string", "format": "uri", "x-nullable": true}, "results": {"type": "array", "items": {"$ref": "#/definitions/SongsList"}}}}}}, "tags": ["hussainya"]}, "parameters": [{"name": "cid", "in": "path", "required": true, "type": "string"}]}, "/hussainya/singers-search/": {"get": {"operationId": "hussainya_singers-search_list", "description": "", "parameters": [{"name": "s", "in": "query", "description": "Search", "type": "string"}, {"name": "language_code", "in": "query", "description": "Language Code", "type": "string"}], "responses": {"200": {"description": ""}}, "tags": ["hussainya"]}, "parameters": []}, "/hussainya/singers/": {"get": {"operationId": "hussainya_singers_list", "description": "Advanced Singer List API with PostgreSQL-optimized search functionality", "parameters": [{"name": "limit", "in": "query", "description": "Number of results to return per page.", "required": false, "type": "integer"}, {"name": "offset", "in": "query", "description": "The initial index from which to return the results.", "required": false, "type": "integer"}, {"name": "language_code", "in": "query", "description": "Language Code (e.g., en, fa, es)", "type": "string"}, {"name": "singer_type", "in": "query", "description": "Singer Type", "type": "string", "enum": ["lecturer", "madah", "singer"]}, {"name": "search", "in": "query", "description": "Search term", "type": "string"}, {"name": "album_id", "in": "query", "description": "Album ID", "type": "integer"}], "responses": {"200": {"description": "", "schema": {"required": ["count", "results"], "type": "object", "properties": {"count": {"type": "integer"}, "next": {"type": "string", "format": "uri", "x-nullable": true}, "previous": {"type": "string", "format": "uri", "x-nullable": true}, "results": {"type": "array", "items": {"$ref": "#/definitions/SingersList"}}}}}}, "tags": ["hussainya"]}, "parameters": []}, "/hussainya/singers//": {"get": {"operationId": "hussainya_singers_list", "description": "Advanced Singer List API with PostgreSQL-optimized search functionality", "parameters": [{"name": "limit", "in": "query", "description": "Number of results to return per page.", "required": false, "type": "integer"}, {"name": "offset", "in": "query", "description": "The initial index from which to return the results.", "required": false, "type": "integer"}, {"name": "language_code", "in": "query", "description": "Language Code (e.g., en, fa, es)", "type": "string"}, {"name": "singer_type", "in": "query", "description": "Singer Type", "type": "string", "enum": ["lecturer", "madah", "singer"]}, {"name": "search", "in": "query", "description": "Search term", "type": "string"}, {"name": "album_id", "in": "query", "description": "Album ID", "type": "integer"}], "responses": {"200": {"description": "", "schema": {"required": ["count", "results"], "type": "object", "properties": {"count": {"type": "integer"}, "next": {"type": "string", "format": "uri", "x-nullable": true}, "previous": {"type": "string", "format": "uri", "x-nullable": true}, "results": {"type": "array", "items": {"$ref": "#/definitions/SingersList"}}}}}}, "tags": ["hussainya"]}, "parameters": []}, "/hussainya/singers//{slug}/": {"get": {"operationId": "hussainya_singers__read", "description": "", "parameters": [], "responses": {"200": {"description": "", "schema": {"$ref": "#/definitions/SingerSong"}}}, "tags": ["hussainya"]}, "parameters": [{"name": "slug", "in": "path", "required": true, "type": "string"}]}, "/hussainya/singers/{slug}/": {"get": {"operationId": "hussainya_singers_read", "description": "", "parameters": [], "responses": {"200": {"description": "", "schema": {"$ref": "#/definitions/SingerSong"}}}, "tags": ["hussainya"]}, "parameters": [{"name": "slug", "in": "path", "required": true, "type": "string"}]}, "/hussainya/songs/": {"get": {"operationId": "hussainya_songs_list", "description": "ordering : ('like_count', 'view_count','created_at', 'published_date')", "parameters": [{"name": "song_type", "in": "query", "description": "Filter by song type (audio, video, youtube)", "type": "string", "enum": ["audio", "video", "youtube"]}, {"name": "search", "in": "query", "description": "A search term.", "required": false, "type": "string"}, {"name": "limit", "in": "query", "description": "Number of results to return per page.", "required": false, "type": "integer"}, {"name": "offset", "in": "query", "description": "The initial index from which to return the results.", "required": false, "type": "integer"}, {"name": "ordering", "in": "query", "description": "Order fields by (created_at, -created_at (desc) | view_count, like_count, published_date", "type": "string", "enum": ["like_counts", "-like_counts", "view_count", "-view_count", "created_at", "-created_at", "published_date", "-published_date"]}, {"name": "genre_id", "in": "query", "description": "Filter genre_id ['1-(مداحی)', '2-(سخنرانی)', '3-(سخنرانی کوتاه)', '4-(مولودی)', '5-(ادعیه)', '6-(مناجات)', '7-(مقتل)', '8-(روضه)']]", "type": "string"}, {"name": "random", "in": "query", "description": "Filter Random Palyer", "type": "boolean"}], "responses": {"200": {"description": "", "schema": {"required": ["count", "results"], "type": "object", "properties": {"count": {"type": "integer"}, "next": {"type": "string", "format": "uri", "x-nullable": true}, "previous": {"type": "string", "format": "uri", "x-nullable": true}, "results": {"type": "array", "items": {"$ref": "#/definitions/SongsList"}}}}}}, "tags": ["hussainya"]}, "parameters": []}, "/hussainya/songs//": {"get": {"operationId": "hussainya_songs_list", "description": "ordering : ('like_count', 'view_count','created_at', 'published_date')", "parameters": [{"name": "song_type", "in": "query", "description": "Filter by song type (audio, video, youtube)", "type": "string", "enum": ["audio", "video", "youtube"]}, {"name": "search", "in": "query", "description": "A search term.", "required": false, "type": "string"}, {"name": "limit", "in": "query", "description": "Number of results to return per page.", "required": false, "type": "integer"}, {"name": "offset", "in": "query", "description": "The initial index from which to return the results.", "required": false, "type": "integer"}, {"name": "ordering", "in": "query", "description": "Order fields by (created_at, -created_at (desc) | view_count, like_count, published_date", "type": "string", "enum": ["like_counts", "-like_counts", "view_count", "-view_count", "created_at", "-created_at", "published_date", "-published_date"]}, {"name": "genre_id", "in": "query", "description": "Filter genre_id ['1-(مداحی)', '2-(سخنرانی)', '3-(سخنرانی کوتاه)', '4-(مولودی)', '5-(ادعیه)', '6-(مناجات)', '7-(مقتل)', '8-(روضه)']]", "type": "string"}, {"name": "random", "in": "query", "description": "Filter Random Palyer", "type": "boolean"}], "responses": {"200": {"description": "", "schema": {"required": ["count", "results"], "type": "object", "properties": {"count": {"type": "integer"}, "next": {"type": "string", "format": "uri", "x-nullable": true}, "previous": {"type": "string", "format": "uri", "x-nullable": true}, "results": {"type": "array", "items": {"$ref": "#/definitions/SongsList"}}}}}}, "tags": ["hussainya"]}, "parameters": []}, "/hussainya/songs//download/{slug}/": {"get": {"operationId": "hussainya_songs__download_read", "description": "", "parameters": [], "responses": {"200": {"description": ""}}, "tags": ["hussainya"]}, "parameters": [{"name": "slug", "in": "path", "required": true, "type": "string"}]}, "/hussainya/songs//increase-view/{slug}/": {"get": {"operationId": "hussainya_songs__increase-view_read", "description": "", "parameters": [], "responses": {"200": {"description": ""}}, "tags": ["hussainya"]}, "parameters": [{"name": "slug", "in": "path", "required": true, "type": "string"}]}, "/hussainya/songs//like/{slug}/": {"get": {"operationId": "hussainya_songs__like_read", "description": "", "parameters": [], "responses": {"200": {"description": ""}}, "tags": ["hussainya"]}, "parameters": [{"name": "slug", "in": "path", "required": true, "type": "string"}]}, "/hussainya/songs//unlike/{slug}/": {"get": {"operationId": "hussainya_songs__unlike_read", "description": "", "parameters": [], "responses": {"200": {"description": ""}}, "tags": ["hussainya"]}, "parameters": [{"name": "slug", "in": "path", "required": true, "type": "string"}]}, "/hussainya/songs//{slug}/": {"get": {"operationId": "hussainya_songs__read", "description": "song details api\n-- params: song slug", "parameters": [], "responses": {"200": {"description": "", "schema": {"$ref": "#/definitions/SongDetail"}}}, "tags": ["hussainya"]}, "parameters": [{"name": "slug", "in": "path", "required": true, "type": "string"}]}, "/hussainya/songs/add-to-playlist/{slug}/": {"get": {"operationId": "hussainya_songs_add-to-playlist_read", "description": "", "parameters": [], "responses": {"200": {"description": ""}}, "tags": ["hussainya"]}, "parameters": [{"name": "slug", "in": "path", "required": true, "type": "string"}]}, "/hussainya/songs/download/{slug}/": {"get": {"operationId": "hussainya_songs_download_read", "description": "", "parameters": [], "responses": {"200": {"description": ""}}, "tags": ["hussainya"]}, "parameters": [{"name": "slug", "in": "path", "required": true, "type": "string"}]}, "/hussainya/songs/increase-view/{slug}/": {"get": {"operationId": "hussainya_songs_increase-view_read", "description": "", "parameters": [], "responses": {"200": {"description": ""}}, "tags": ["hussainya"]}, "parameters": [{"name": "slug", "in": "path", "required": true, "type": "string"}]}, "/hussainya/songs/like/{slug}/": {"get": {"operationId": "hussainya_songs_like_read", "description": "", "parameters": [], "responses": {"200": {"description": ""}}, "tags": ["hussainya"]}, "parameters": [{"name": "slug", "in": "path", "required": true, "type": "string"}]}, "/hussainya/songs/recent/": {"get": {"operationId": "hussainya_songs_recent_list", "description": "", "parameters": [{"name": "limit", "in": "query", "description": "Number of results to return per page.", "required": false, "type": "integer"}, {"name": "offset", "in": "query", "description": "The initial index from which to return the results.", "required": false, "type": "integer"}, {"name": "days", "in": "query", "description": "Number of days to filter recent songs", "type": "integer", "default": 60}], "responses": {"200": {"description": "", "schema": {"required": ["count", "results"], "type": "object", "properties": {"count": {"type": "integer"}, "next": {"type": "string", "format": "uri", "x-nullable": true}, "previous": {"type": "string", "format": "uri", "x-nullable": true}, "results": {"type": "array", "items": {"$ref": "#/definitions/SongsList"}}}}}}, "tags": ["hussainya"]}, "parameters": []}, "/hussainya/songs/remove-from-playlist/{slug}/": {"get": {"operationId": "hussainya_songs_remove-from-playlist_read", "description": "", "parameters": [], "responses": {"200": {"description": ""}}, "tags": ["hussainya"]}, "parameters": [{"name": "slug", "in": "path", "required": true, "type": "string"}]}, "/hussainya/songs/unlike/{slug}/": {"get": {"operationId": "hussainya_songs_unlike_read", "description": "", "parameters": [], "responses": {"200": {"description": ""}}, "tags": ["hussainya"]}, "parameters": [{"name": "slug", "in": "path", "required": true, "type": "string"}]}, "/hussainya/songs/{slug}/": {"get": {"operationId": "hussainya_songs_read", "description": "song details api\n-- params: song slug", "parameters": [], "responses": {"200": {"description": "", "schema": {"$ref": "#/definitions/SongDetail"}}}, "tags": ["hussainya"]}, "parameters": [{"name": "slug", "in": "path", "required": true, "type": "string"}]}, "/hussainya/statistics/": {"get": {"operationId": "hussainya_statistics_list", "description": "", "parameters": [], "responses": {"200": {"description": ""}}, "tags": ["hussainya"]}, "parameters": []}, "/hussainya/statistics//": {"get": {"operationId": "hussainya_statistics_list", "description": "", "parameters": [], "responses": {"200": {"description": ""}}, "tags": ["hussainya"]}, "parameters": []}, "/hussainya/topics/{topic_id}/albums/": {"get": {"operationId": "hussainya_topics_albums_list", "description": "Return albums belonging to a specific topic using topic_id in path.", "parameters": [{"name": "limit", "in": "query", "description": "Number of results to return per page.", "required": false, "type": "integer"}, {"name": "offset", "in": "query", "description": "The initial index from which to return the results.", "required": false, "type": "integer"}, {"name": "language_code", "in": "query", "description": "Language Code (e.g., en, fa, ar)", "type": "string"}], "responses": {"200": {"description": "", "schema": {"required": ["count", "results"], "type": "object", "properties": {"count": {"type": "integer"}, "next": {"type": "string", "format": "uri", "x-nullable": true}, "previous": {"type": "string", "format": "uri", "x-nullable": true}, "results": {"type": "array", "items": {"$ref": "#/definitions/AlbumList"}}}}}}, "tags": ["hussainya"]}, "parameters": [{"name": "topic_id", "in": "path", "required": true, "type": "string"}]}, "/hussainya/v2/albums//{id}/": {"get": {"operationId": "hussainya_v2_albums__read", "description": "", "parameters": [{"name": "singer_type", "in": "query", "description": "Type of singers to filter (lecture, madah, singer)", "type": "string", "enum": ["lecturer", "madah", "singer"]}, {"name": "search", "in": "query", "description": "A search term.", "required": false, "type": "string"}, {"name": "limit", "in": "query", "description": "Number of results to return per page.", "required": false, "type": "integer"}, {"name": "offset", "in": "query", "description": "The initial index from which to return the results.", "required": false, "type": "integer"}, {"name": "type", "in": "query", "description": "Type of songs to filter (audio, video, youtube)", "type": "string", "enum": ["audio", "video", "youtube"]}, {"name": "language_code", "in": "query", "description": "Language Code (e.g., en, fa, es)", "type": "string"}, {"name": "singer_slug", "in": "query", "description": "Comma-separated SingerSlug (e.g, mahmoud-karimi-2, huseyn-taheri) Slugs", "type": "string"}], "responses": {"200": {"description": "", "schema": {"required": ["count", "results"], "type": "object", "properties": {"count": {"type": "integer"}, "next": {"type": "string", "format": "uri", "x-nullable": true}, "previous": {"type": "string", "format": "uri", "x-nullable": true}, "results": {"type": "array", "items": {"$ref": "#/definitions/SongsList"}}}}}}, "tags": ["hussainya"]}, "parameters": [{"name": "id", "in": "path", "required": true, "type": "string"}]}, "/hussainya/v2/albums/{id}/": {"get": {"operationId": "hussainya_v2_albums_read", "description": "", "parameters": [{"name": "singer_type", "in": "query", "description": "Type of singers to filter (lecture, madah, singer)", "type": "string", "enum": ["lecturer", "madah", "singer"]}, {"name": "search", "in": "query", "description": "A search term.", "required": false, "type": "string"}, {"name": "limit", "in": "query", "description": "Number of results to return per page.", "required": false, "type": "integer"}, {"name": "offset", "in": "query", "description": "The initial index from which to return the results.", "required": false, "type": "integer"}, {"name": "type", "in": "query", "description": "Type of songs to filter (audio, video, youtube)", "type": "string", "enum": ["audio", "video", "youtube"]}, {"name": "language_code", "in": "query", "description": "Language Code (e.g., en, fa, es)", "type": "string"}, {"name": "singer_slug", "in": "query", "description": "Comma-separated SingerSlug (e.g, mahmoud-karimi-2, huseyn-taheri) Slugs", "type": "string"}], "responses": {"200": {"description": "", "schema": {"required": ["count", "results"], "type": "object", "properties": {"count": {"type": "integer"}, "next": {"type": "string", "format": "uri", "x-nullable": true}, "previous": {"type": "string", "format": "uri", "x-nullable": true}, "results": {"type": "array", "items": {"$ref": "#/definitions/SongsList"}}}}}}, "tags": ["hussainya"]}, "parameters": [{"name": "id", "in": "path", "required": true, "type": "string"}]}, "/hussainya/v2/collections//{id}/": {"get": {"operationId": "hussainya_v2_collections__read", "description": "", "parameters": [{"name": "limit", "in": "query", "description": "Number of results to return per page.", "required": false, "type": "integer"}, {"name": "offset", "in": "query", "description": "The initial index from which to return the results.", "required": false, "type": "integer"}], "responses": {"200": {"description": "", "schema": {"required": ["count", "results"], "type": "object", "properties": {"count": {"type": "integer"}, "next": {"type": "string", "format": "uri", "x-nullable": true}, "previous": {"type": "string", "format": "uri", "x-nullable": true}, "results": {"type": "array", "items": {"$ref": "#/definitions/SongsList"}}}}}}, "tags": ["hussainya"]}, "parameters": [{"name": "id", "in": "path", "required": true, "type": "string"}]}, "/hussainya/v2/collections/{id}/": {"get": {"operationId": "hussainya_v2_collections_read", "description": "", "parameters": [{"name": "limit", "in": "query", "description": "Number of results to return per page.", "required": false, "type": "integer"}, {"name": "offset", "in": "query", "description": "The initial index from which to return the results.", "required": false, "type": "integer"}], "responses": {"200": {"description": "", "schema": {"required": ["count", "results"], "type": "object", "properties": {"count": {"type": "integer"}, "next": {"type": "string", "format": "uri", "x-nullable": true}, "previous": {"type": "string", "format": "uri", "x-nullable": true}, "results": {"type": "array", "items": {"$ref": "#/definitions/SongsList"}}}}}}, "tags": ["hussainya"]}, "parameters": [{"name": "id", "in": "path", "required": true, "type": "string"}]}, "/hussainya/v2/home/": {"get": {"operationId": "hussainya_v2_home_list", "description": "home page API", "parameters": [{"name": "hijri-date", "in": "query", "description": "eg. 01/09 (MONTH/DAY) ", "type": "string"}], "responses": {"200": {"description": ""}}, "tags": ["hussainya"]}, "parameters": []}, "/hussainya/v2/playlist/add/": {"post": {"operationId": "hussainya_v2_playlist_add_create", "description": "افزودن آهنگ به پلی لیست در کالکشن", "parameters": [], "responses": {"201": {"description": ""}}, "tags": ["hussainya"]}, "parameters": []}, "/hussainya/v2/playlist/collections/create/": {"post": {"operationId": "hussainya_v2_playlist_collections_create_create", "description": "ایجاد کالکشن جدید", "parameters": [], "responses": {"201": {"description": ""}}, "tags": ["hussainya"]}, "parameters": []}, "/hussainya/v2/playlist/collections/list/": {"get": {"operationId": "hussainya_v2_playlist_collections_list_list", "description": "لیست کالکشن‌های کاربر با قابلیت سرچ", "parameters": [], "responses": {"200": {"description": ""}}, "tags": ["hussainya"]}, "parameters": []}, "/hussainya/v2/playlist/collections/{collection_id}/delete/": {"delete": {"operationId": "hussainya_v2_playlist_collections_delete_delete", "description": "حذف کالکشن", "parameters": [], "responses": {"204": {"description": ""}}, "tags": ["hussainya"]}, "parameters": [{"name": "collection_id", "in": "path", "required": true, "type": "string"}]}, "/hussainya/v2/playlist/collections/{collection_id}/songs/": {"get": {"operationId": "hussainya_v2_playlist_collections_songs_list", "description": "لیست آهنگ‌های یک کالکشن با قابلیت سرچ", "parameters": [], "responses": {"200": {"description": ""}}, "tags": ["hussainya"]}, "parameters": [{"name": "collection_id", "in": "path", "required": true, "type": "string"}]}, "/hussainya/v2/playlist/collections/{collection_id}/update/": {"patch": {"operationId": "hussainya_v2_playlist_collections_update_partial_update", "description": "آپدیت نام کالکشن", "parameters": [], "responses": {"200": {"description": ""}}, "tags": ["hussainya"]}, "parameters": [{"name": "collection_id", "in": "path", "required": true, "type": "string"}]}, "/hussainya/v2/singers//{slug}/": {"get": {"operationId": "hussainya_v2_singers__read", "description": "", "parameters": [{"name": "search", "in": "query", "description": "A search term.", "required": false, "type": "string"}, {"name": "limit", "in": "query", "description": "Number of results to return per page.", "required": false, "type": "integer"}, {"name": "offset", "in": "query", "description": "The initial index from which to return the results.", "required": false, "type": "integer"}, {"name": "album_id", "in": "query", "description": "Comma-separated Album IDs(e.g, 733, 530)", "type": "string"}, {"name": "language_code", "in": "query", "description": "Language Code (e.g., en, fa, es)", "type": "string"}], "responses": {"200": {"description": "", "schema": {"required": ["count", "results"], "type": "object", "properties": {"count": {"type": "integer"}, "next": {"type": "string", "format": "uri", "x-nullable": true}, "previous": {"type": "string", "format": "uri", "x-nullable": true}, "results": {"type": "array", "items": {"$ref": "#/definitions/SongsList"}}}}}}, "tags": ["hussainya"]}, "parameters": [{"name": "slug", "in": "path", "required": true, "type": "string"}]}, "/hussainya/v2/singers/{slug}/": {"get": {"operationId": "hussainya_v2_singers_read", "description": "", "parameters": [{"name": "search", "in": "query", "description": "A search term.", "required": false, "type": "string"}, {"name": "limit", "in": "query", "description": "Number of results to return per page.", "required": false, "type": "integer"}, {"name": "offset", "in": "query", "description": "The initial index from which to return the results.", "required": false, "type": "integer"}, {"name": "album_id", "in": "query", "description": "Comma-separated Album IDs(e.g, 733, 530)", "type": "string"}, {"name": "language_code", "in": "query", "description": "Language Code (e.g., en, fa, es)", "type": "string"}], "responses": {"200": {"description": "", "schema": {"required": ["count", "results"], "type": "object", "properties": {"count": {"type": "integer"}, "next": {"type": "string", "format": "uri", "x-nullable": true}, "previous": {"type": "string", "format": "uri", "x-nullable": true}, "results": {"type": "array", "items": {"$ref": "#/definitions/SongsList"}}}}}}, "tags": ["hussainya"]}, "parameters": [{"name": "slug", "in": "path", "required": true, "type": "string"}]}, "/hussainya/v3/home/": {"get": {"operationId": "hussainya_v3_home_list", "description": "", "parameters": [], "responses": {"200": {"description": ""}}, "tags": ["hussainya"]}, "parameters": []}, "/important-notices/": {"get": {"operationId": "important-notices_list", "description": "", "parameters": [{"name": "limit", "in": "query", "description": "Number of results to return per page.", "required": false, "type": "integer"}, {"name": "offset", "in": "query", "description": "The initial index from which to return the results.", "required": false, "type": "integer"}], "responses": {"200": {"description": "", "schema": {"required": ["count", "results"], "type": "object", "properties": {"count": {"type": "integer"}, "next": {"type": "string", "format": "uri", "x-nullable": true}, "previous": {"type": "string", "format": "uri", "x-nullable": true}, "results": {"type": "array", "items": {"$ref": "#/definitions/ImportantNotice"}}}}}}, "tags": ["important-notices"]}, "parameters": []}, "/khatm/groups/": {"get": {"operationId": "khatm_groups_list", "description": "", "parameters": [{"name": "page", "in": "query", "description": "Filter to show only the groups page", "type": "string", "enum": ["created", "joined"]}], "responses": {"200": {"description": "", "schema": {"required": ["count", "results"], "type": "object", "properties": {"count": {"type": "integer"}, "next": {"type": "string", "format": "uri", "x-nullable": true}, "previous": {"type": "string", "format": "uri", "x-nullable": true}, "results": {"type": "array", "items": {"$ref": "#/definitions/GroupKhatm"}}}}}}, "tags": ["khatm"]}, "post": {"operationId": "khatm_groups_create", "description": "", "parameters": [{"name": "data", "in": "body", "required": true, "schema": {"$ref": "#/definitions/GroupKhatm"}}], "responses": {"201": {"description": "", "schema": {"$ref": "#/definitions/GroupKhatm"}}}, "tags": ["khatm"]}, "parameters": []}, "/khatm/groups/{slug}/": {"get": {"operationId": "khatm_groups_read", "description": "", "parameters": [], "responses": {"200": {"description": "", "schema": {"$ref": "#/definitions/GroupKhatm"}}}, "tags": ["khatm"]}, "put": {"operationId": "khatm_groups_update", "description": "", "parameters": [{"name": "data", "in": "body", "required": true, "schema": {"$ref": "#/definitions/GroupKhatm"}}], "responses": {"200": {"description": "", "schema": {"$ref": "#/definitions/GroupKhatm"}}}, "tags": ["khatm"]}, "patch": {"operationId": "khatm_groups_partial_update", "description": "", "parameters": [{"name": "data", "in": "body", "required": true, "schema": {"$ref": "#/definitions/GroupKhatm"}}], "responses": {"200": {"description": "", "schema": {"$ref": "#/definitions/GroupKhatm"}}}, "tags": ["khatm"]}, "delete": {"operationId": "khatm_groups_delete", "description": "", "parameters": [], "responses": {"204": {"description": ""}}, "tags": ["khatm"]}, "parameters": [{"name": "slug", "in": "path", "required": true, "type": "string", "format": "slug", "pattern": "^[-\\w]+$"}]}, "/khatm/groups/{slug}/join/": {"post": {"operationId": "khatm_groups_join_create", "description": "", "parameters": [{"name": "data", "in": "body", "required": true, "schema": {"required": ["pages_count"], "type": "object", "properties": {"pages_count": {"description": "Number of pages to read", "type": "integer"}}}}], "responses": {"201": {"description": "", "schema": {"required": ["pages_count"], "type": "object", "properties": {"pages_count": {"description": "Number of pages to read", "type": "integer"}}}}}, "tags": ["khatm"]}, "parameters": [{"name": "slug", "in": "path", "required": true, "type": "string"}]}, "/khatm/groups/{slug}/read-page/": {"put": {"operationId": "khatm_groups_read-page_update", "description": "", "parameters": [{"name": "data", "in": "body", "required": true, "schema": {"$ref": "#/definitions/ReadPage"}}], "responses": {"200": {"description": "", "schema": {"$ref": "#/definitions/ReadPage"}}}, "tags": ["khatm"]}, "parameters": [{"name": "slug", "in": "path", "required": true, "type": "string"}]}, "/khatm/individuals/": {"get": {"operationId": "khatm_individuals_list", "description": "", "parameters": [], "responses": {"200": {"description": "", "schema": {"type": "array", "items": {"$ref": "#/definitions/IndividualKhatm"}}}}, "tags": ["khatm"]}, "post": {"operationId": "khatm_individuals_create", "description": "", "parameters": [{"name": "data", "in": "body", "required": true, "schema": {"$ref": "#/definitions/IndividualKhatm"}}], "responses": {"201": {"description": "", "schema": {"$ref": "#/definitions/IndividualKhatm"}}}, "tags": ["khatm"]}, "parameters": []}, "/khatm/individuals/{slug}/": {"put": {"operationId": "khatm_individuals_update", "description": "", "parameters": [{"name": "data", "in": "body", "required": true, "schema": {"$ref": "#/definitions/IndividualKhatmUpdate"}}], "responses": {"200": {"description": "", "schema": {"$ref": "#/definitions/IndividualKhatmUpdate"}}}, "tags": ["khatm"]}, "patch": {"operationId": "khatm_individuals_partial_update", "description": "", "parameters": [{"name": "data", "in": "body", "required": true, "schema": {"$ref": "#/definitions/IndividualKhatmUpdate"}}], "responses": {"200": {"description": "", "schema": {"$ref": "#/definitions/IndividualKhatmUpdate"}}}, "tags": ["khatm"]}, "delete": {"operationId": "khatm_individuals_delete", "description": "", "parameters": [], "responses": {"204": {"description": ""}}, "tags": ["khatm"]}, "parameters": [{"name": "slug", "in": "path", "required": true, "type": "string", "format": "slug", "pattern": "^[-\\w]+$"}]}, "/khatm/individuals/{slug}/read-page/": {"put": {"operationId": "khatm_individuals_read-page_update", "description": "", "parameters": [{"name": "data", "in": "body", "required": true, "schema": {"$ref": "#/definitions/IndividualReadPage"}}], "responses": {"200": {"description": "", "schema": {"$ref": "#/definitions/IndividualReadPage"}}}, "tags": ["khatm"]}, "parameters": [{"name": "slug", "in": "path", "required": true, "type": "string"}]}, "/khatm/joined-groups/": {"get": {"operationId": "khatm_joined-groups_list", "description": "", "parameters": [], "responses": {"200": {"description": "", "schema": {"type": "array", "items": {"$ref": "#/definitions/UserGroupKhatm"}}}}, "tags": ["khatm"]}, "parameters": []}, "/library/banner-bottom/": {"get": {"operationId": "library_banner-bottom_list", "description": "", "parameters": [], "responses": {"200": {"description": "", "schema": {"type": "array", "items": {"$ref": "#/definitions/BannerList"}}}}, "tags": ["library"]}, "parameters": []}, "/library/banner/": {"get": {"operationId": "library_banner_list", "description": "", "parameters": [], "responses": {"200": {"description": "", "schema": {"type": "array", "items": {"$ref": "#/definitions/BannerList"}}}}, "tags": ["library"]}, "parameters": []}, "/library/banner/{id}/": {"get": {"operationId": "library_banner_read", "description": "", "parameters": [{"name": "limit", "in": "query", "description": "Number of results to return per page.", "required": false, "type": "integer"}, {"name": "offset", "in": "query", "description": "The initial index from which to return the results.", "required": false, "type": "integer"}], "responses": {"200": {"description": "", "schema": {"required": ["count", "results"], "type": "object", "properties": {"count": {"type": "integer"}, "next": {"type": "string", "format": "uri", "x-nullable": true}, "previous": {"type": "string", "format": "uri", "x-nullable": true}, "results": {"type": "array", "items": {"$ref": "#/definitions/BookList"}}}}}}, "tags": ["library"]}, "parameters": [{"name": "id", "in": "path", "required": true, "type": "string"}]}, "/library/bookmark/": {"get": {"operationId": "library_bookmark_list", "description": "", "parameters": [{"name": "limit", "in": "query", "description": "Number of results to return per page.", "required": false, "type": "integer"}, {"name": "offset", "in": "query", "description": "The initial index from which to return the results.", "required": false, "type": "integer"}], "responses": {"200": {"description": "", "schema": {"required": ["count", "results"], "type": "object", "properties": {"count": {"type": "integer"}, "next": {"type": "string", "format": "uri", "x-nullable": true}, "previous": {"type": "string", "format": "uri", "x-nullable": true}, "results": {"type": "array", "items": {"$ref": "#/definitions/BookmarkSerializers"}}}}}}, "tags": ["library"]}, "post": {"operationId": "library_bookmark_create", "description": "", "parameters": [{"name": "data", "in": "body", "required": true, "schema": {"$ref": "#/definitions/BookmarkSerializers"}}], "responses": {"201": {"description": "", "schema": {"$ref": "#/definitions/BookmarkSerializers"}}}, "tags": ["library"]}, "parameters": []}, "/library/bookmark/remove/{slug}/": {"post": {"operationId": "library_bookmark_remove_create", "description": "", "parameters": [], "responses": {"201": {"description": ""}}, "tags": ["library"]}, "parameters": [{"name": "slug", "in": "path", "required": true, "type": "string"}]}, "/library/books/": {"get": {"operationId": "library_books_list", "description": "", "parameters": [{"name": "audio", "in": "query", "description": "", "required": false, "type": "string"}, {"name": "nonfree", "in": "query", "description": "", "required": false, "type": "string"}, {"name": "size", "in": "query", "description": "", "required": false, "type": "string"}, {"name": "publisher", "in": "query", "description": "", "required": false, "type": "string"}, {"name": "authors", "in": "query", "description": "", "required": false, "type": "string"}, {"name": "category", "in": "query", "description": "", "required": false, "type": "string"}, {"name": "order", "in": "query", "description": "", "required": false, "type": "string"}, {"name": "search", "in": "query", "description": "A search term.", "required": false, "type": "string"}, {"name": "limit", "in": "query", "description": "Number of results to return per page.", "required": false, "type": "integer"}, {"name": "offset", "in": "query", "description": "The initial index from which to return the results.", "required": false, "type": "integer"}], "responses": {"200": {"description": "", "schema": {"required": ["count", "results"], "type": "object", "properties": {"count": {"type": "integer"}, "next": {"type": "string", "format": "uri", "x-nullable": true}, "previous": {"type": "string", "format": "uri", "x-nullable": true}, "results": {"type": "array", "items": {"$ref": "#/definitions/BookList"}}}}}}, "tags": ["library"]}, "parameters": []}, "/library/books/editorsuggestions/": {"get": {"operationId": "library_books_editorsuggestions_list", "description": "", "parameters": [{"name": "audio", "in": "query", "description": "", "required": false, "type": "string"}, {"name": "nonfree", "in": "query", "description": "", "required": false, "type": "string"}, {"name": "size", "in": "query", "description": "", "required": false, "type": "string"}, {"name": "publisher", "in": "query", "description": "", "required": false, "type": "string"}, {"name": "authors", "in": "query", "description": "", "required": false, "type": "string"}, {"name": "category", "in": "query", "description": "", "required": false, "type": "string"}, {"name": "order", "in": "query", "description": "", "required": false, "type": "string"}, {"name": "search", "in": "query", "description": "A search term.", "required": false, "type": "string"}], "responses": {"200": {"description": "", "schema": {"type": "array", "items": {"$ref": "#/definitions/BookListSerializerEditorSuggestion"}}}}, "tags": ["library"]}, "parameters": []}, "/library/books/rate/{slug}/": {"post": {"operationId": "library_books_rate_create", "summary": "Rate a book", "description": "Allows users to rate a book and optionally provide a note about the book.", "parameters": [{"name": "data", "in": "body", "required": true, "schema": {"required": ["rate"], "type": "object", "properties": {"rate": {"description": "Rating for the book (0 to 10)", "type": "integer", "example": 8}, "note": {"description": "Optional note about the book (max 512 characters)", "type": "string", "example": "This book was amazing!"}}}}, {"name": "slug", "in": "path", "description": "Slug of the book to be rated", "required": true, "type": "string"}], "responses": {"200": {"description": "Rate submitted successfully", "examples": {"application/json": {"status": true, "message": "rate submitted"}}}, "400": {"description": "Invalid input or book not found", "examples": {"application/json": {"status": false, "message": "rate must be between 0 and 10"}}}}, "tags": ["library"]}, "parameters": [{"name": "slug", "in": "path", "required": true, "type": "string"}]}, "/library/books/user-downloads/": {"get": {"operationId": "library_books_user-downloads_list", "summary": "Redesign v2", "description": "", "parameters": [{"name": "audio", "in": "query", "description": "", "required": false, "type": "string"}, {"name": "nonfree", "in": "query", "description": "", "required": false, "type": "string"}, {"name": "size", "in": "query", "description": "", "required": false, "type": "string"}, {"name": "publisher", "in": "query", "description": "", "required": false, "type": "string"}, {"name": "authors", "in": "query", "description": "", "required": false, "type": "string"}, {"name": "category", "in": "query", "description": "", "required": false, "type": "string"}, {"name": "order", "in": "query", "description": "", "required": false, "type": "string"}, {"name": "search", "in": "query", "description": "A search term.", "required": false, "type": "string"}, {"name": "limit", "in": "query", "description": "Number of results to return per page.", "required": false, "type": "integer"}, {"name": "offset", "in": "query", "description": "The initial index from which to return the results.", "required": false, "type": "integer"}], "responses": {"200": {"description": "", "schema": {"required": ["count", "results"], "type": "object", "properties": {"count": {"type": "integer"}, "next": {"type": "string", "format": "uri", "x-nullable": true}, "previous": {"type": "string", "format": "uri", "x-nullable": true}, "results": {"type": "array", "items": {"$ref": "#/definitions/BookListV2"}}}}}}, "tags": ["library"]}, "parameters": []}, "/library/books/{slug}/": {"get": {"operationId": "library_books_read", "description": "", "parameters": [], "responses": {"200": {"description": "", "schema": {"$ref": "#/definitions/BookDetail"}}}, "tags": ["library"]}, "parameters": [{"name": "slug", "in": "path", "required": true, "type": "string"}]}, "/library/books/{slug}/download/": {"post": {"operationId": "library_books_download_create", "summary": "Redesign v2", "description": "", "parameters": [], "responses": {"201": {"description": ""}}, "tags": ["library"]}, "parameters": [{"name": "slug", "in": "path", "required": true, "type": "string"}]}, "/library/books/{slug}/purchase/": {"post": {"operationId": "library_books_purchase_create", "description": "", "parameters": [], "responses": {"201": {"description": ""}}, "tags": ["library"]}, "parameters": [{"name": "slug", "in": "path", "required": true, "type": "string"}]}, "/library/books/{slug}/rates/": {"get": {"operationId": "library_books_rates_list", "summary": "Redesign v2", "description": "", "parameters": [{"name": "limit", "in": "query", "description": "Number of results to return per page.", "required": false, "type": "integer"}, {"name": "offset", "in": "query", "description": "The initial index from which to return the results.", "required": false, "type": "integer"}], "responses": {"200": {"description": "", "schema": {"required": ["count", "results"], "type": "object", "properties": {"count": {"type": "integer"}, "next": {"type": "string", "format": "uri", "x-nullable": true}, "previous": {"type": "string", "format": "uri", "x-nullable": true}, "results": {"type": "array", "items": {"$ref": "#/definitions/UserRate"}}}}}}, "tags": ["library"]}, "parameters": [{"name": "slug", "in": "path", "required": true, "type": "string"}]}, "/library/books/{slug}/related/": {"get": {"operationId": "library_books_related_list", "description": "", "parameters": [{"name": "audio", "in": "query", "description": "", "required": false, "type": "string"}, {"name": "nonfree", "in": "query", "description": "", "required": false, "type": "string"}, {"name": "size", "in": "query", "description": "", "required": false, "type": "string"}, {"name": "publisher", "in": "query", "description": "", "required": false, "type": "string"}, {"name": "authors", "in": "query", "description": "", "required": false, "type": "string"}, {"name": "category", "in": "query", "description": "", "required": false, "type": "string"}, {"name": "order", "in": "query", "description": "", "required": false, "type": "string"}, {"name": "search", "in": "query", "description": "A search term.", "required": false, "type": "string"}, {"name": "limit", "in": "query", "description": "Number of results to return per page.", "required": false, "type": "integer"}, {"name": "offset", "in": "query", "description": "The initial index from which to return the results.", "required": false, "type": "integer"}], "responses": {"200": {"description": "", "schema": {"required": ["count", "results"], "type": "object", "properties": {"count": {"type": "integer"}, "next": {"type": "string", "format": "uri", "x-nullable": true}, "previous": {"type": "string", "format": "uri", "x-nullable": true}, "results": {"type": "array", "items": {"$ref": "#/definitions/BookList"}}}}}}, "tags": ["library"]}, "parameters": [{"name": "slug", "in": "path", "required": true, "type": "string"}]}, "/library/books/{slug}/v2/": {"get": {"operationId": "library_books_v2_read", "description": "", "parameters": [], "responses": {"200": {"description": "", "schema": {"$ref": "#/definitions/BookDetail"}}}, "tags": ["library"]}, "parameters": [{"name": "slug", "in": "path", "required": true, "type": "string"}]}, "/library/category/": {"get": {"operationId": "library_category_list", "description": "", "parameters": [{"name": "limit", "in": "query", "description": "Number of results to return per page.", "required": false, "type": "integer"}, {"name": "offset", "in": "query", "description": "The initial index from which to return the results.", "required": false, "type": "integer"}], "responses": {"200": {"description": "", "schema": {"required": ["count", "results"], "type": "object", "properties": {"count": {"type": "integer"}, "next": {"type": "string", "format": "uri", "x-nullable": true}, "previous": {"type": "string", "format": "uri", "x-nullable": true}, "results": {"type": "array", "items": {"$ref": "#/definitions/Category"}}}}}}, "tags": ["library"]}, "parameters": []}, "/library/getFilters/": {"get": {"operationId": "library_getFilters_list", "description": "", "parameters": [], "responses": {"200": {"description": ""}}, "tags": ["library"]}, "parameters": []}, "/library/publish/authors-list/": {"get": {"operationId": "library_publish_authors-list_list", "description": "", "parameters": [], "responses": {"200": {"description": ""}}, "tags": ["library"]}, "parameters": []}, "/library/publish/categories-list/": {"get": {"operationId": "library_publish_categories-list_list", "description": "", "parameters": [], "responses": {"200": {"description": ""}}, "tags": ["library"]}, "parameters": []}, "/library/publish/create/": {"post": {"operationId": "library_publish_create_create", "description": "", "parameters": [{"name": "data", "in": "body", "required": true, "schema": {"$ref": "#/definitions/CreateBook"}}], "responses": {"201": {"description": "", "schema": {"$ref": "#/definitions/CreateBook"}}}, "tags": ["library"]}, "parameters": []}, "/library/publish/narrators-list/": {"get": {"operationId": "library_publish_narrators-list_list", "description": "", "parameters": [], "responses": {"200": {"description": ""}}, "tags": ["library"]}, "parameters": []}, "/library/publish/tags-search/": {"get": {"operationId": "library_publish_tags-search_list", "description": "", "parameters": [{"name": "s", "in": "query", "description": "Search by name", "type": "string"}], "responses": {"200": {"description": ""}}, "tags": ["library"]}, "parameters": []}, "/library/publish/translators-list/": {"get": {"operationId": "library_publish_translators-list_list", "description": "", "parameters": [], "responses": {"200": {"description": ""}}, "tags": ["library"]}, "parameters": []}, "/library/publishers/": {"get": {"operationId": "library_publishers_list", "description": "", "parameters": [{"name": "search", "in": "query", "description": "A search term.", "required": false, "type": "string"}, {"name": "limit", "in": "query", "description": "Number of results to return per page.", "required": false, "type": "integer"}, {"name": "offset", "in": "query", "description": "The initial index from which to return the results.", "required": false, "type": "integer"}], "responses": {"200": {"description": "", "schema": {"required": ["count", "results"], "type": "object", "properties": {"count": {"type": "integer"}, "next": {"type": "string", "format": "uri", "x-nullable": true}, "previous": {"type": "string", "format": "uri", "x-nullable": true}, "results": {"type": "array", "items": {"$ref": "#/definitions/PublisherList"}}}}}}, "tags": ["library"]}, "parameters": []}, "/library/statistics/": {"get": {"operationId": "library_statistics_list", "description": "", "parameters": [], "responses": {"200": {"description": ""}}, "tags": ["library"]}, "parameters": []}, "/library/v2/banner/{id}/": {"get": {"operationId": "library_v2_banner_read", "summary": "Redesign v2", "description": "", "parameters": [{"name": "limit", "in": "query", "description": "Number of results to return per page.", "required": false, "type": "integer"}, {"name": "offset", "in": "query", "description": "The initial index from which to return the results.", "required": false, "type": "integer"}], "responses": {"200": {"description": "", "schema": {"required": ["count", "results"], "type": "object", "properties": {"count": {"type": "integer"}, "next": {"type": "string", "format": "uri", "x-nullable": true}, "previous": {"type": "string", "format": "uri", "x-nullable": true}, "results": {"type": "array", "items": {"$ref": "#/definitions/BookListV2"}}}}}}, "tags": ["library"]}, "parameters": [{"name": "id", "in": "path", "required": true, "type": "string"}]}, "/library/v2/books/": {"get": {"operationId": "library_v2_books_list", "description": "", "parameters": [{"name": "audio", "in": "query", "description": "", "required": false, "type": "string"}, {"name": "nonfree", "in": "query", "description": "", "required": false, "type": "string"}, {"name": "size", "in": "query", "description": "", "required": false, "type": "string"}, {"name": "publisher", "in": "query", "description": "", "required": false, "type": "string"}, {"name": "authors", "in": "query", "description": "", "required": false, "type": "string"}, {"name": "category", "in": "query", "description": "", "required": false, "type": "string"}, {"name": "order", "in": "query", "description": "", "required": false, "type": "string"}, {"name": "search", "in": "query", "description": "A search term.", "required": false, "type": "string"}, {"name": "limit", "in": "query", "description": "Number of results to return per page.", "required": false, "type": "integer"}, {"name": "offset", "in": "query", "description": "The initial index from which to return the results.", "required": false, "type": "integer"}], "responses": {"200": {"description": "", "schema": {"required": ["count", "results"], "type": "object", "properties": {"count": {"type": "integer"}, "next": {"type": "string", "format": "uri", "x-nullable": true}, "previous": {"type": "string", "format": "uri", "x-nullable": true}, "results": {"type": "array", "items": {"$ref": "#/definitions/BookListV2"}}}}}}, "tags": ["library"]}, "parameters": []}, "/library/v2/books/{slug}/": {"get": {"operationId": "library_v2_books_read", "summary": "Redesign v2", "description": "\n# 📘 Scenario 1\n اگر مقدار قیمت \n price کتاب\n برابر با صفر بود آن کتاب رایگان است در غیر این صورت اگر بیشتر از صفر بود\n دو مقدار discount_percentage و final_price\n هم بایستی در نظر گرفته شود که نشان دهنده مقدار درصد تخفیف و قیمت نهایی با تخفیف محاسبه شده است\n\n# 📘 Scenario 2\n اگر کاربر قصد خرید یا دانلود کتاب را داشت بایستی قبل از آن api \n دانلود کتاب فراخوانی شود \n library/books/ slug book /download/\n\n سپس اگر کتاب غیر رایگان بود به api مربوطه در سرویس حبیب کوین\n برای پرداخت هزینه کوین کتاب بایستی فراخوانی شود که مقدار نام سرویس برابر با \n book است\n و مقدار ابجکت ایدی برابر با ایدی این کتاب است \n\n## (دقت داشته باشید که اگر کتاب غیر رایگان بود ابتدا بایستی خریداری شود سپس دانلود شود)\n\n\n\n\n# مقادیر\n\n برمیگردان جزعیات یک کتاب را به وسیله اسلاگ آن کتاب,\n مقدار is_bookmark مشخص میکند کاربر این کتاب را بوک مارک کرده است bool,\n مقدار is_download مشخص میکند کاربر این کتاب را دانلود کرده است bool,\n\n مقدار user_rate که یک ابجکت از rate که مشخص کننده rate همین کتاب است به همراه مقدار user_rate که مشخص کننده مقدار rate است که کاربر داده است و ممکن است null هم باشد که ساختار آن مانند:\n\n ```json\n \"rates\": {\n \"rate\": 4,\n \"user_rate\": {\n \"note\": \"This book was amazing!\",\n \"rate\": 3\n }\n ```\n\n\n", "parameters": [], "responses": {"200": {"description": "Successful retrieval of book details.", "schema": {"$ref": "#/definitions/BookDetailV2"}}, "401": {"description": "Unauthorized. Authentication credentials were not provided or are invalid."}, "404": {"description": "Not Found. The book with the given slug does not exist."}}, "tags": ["library"]}, "parameters": [{"name": "slug", "in": "path", "required": true, "type": "string"}]}, "/library/writers/": {"get": {"operationId": "library_writers_list", "description": "", "parameters": [{"name": "search", "in": "query", "description": "A search term.", "required": false, "type": "string"}, {"name": "limit", "in": "query", "description": "Number of results to return per page.", "required": false, "type": "integer"}, {"name": "offset", "in": "query", "description": "The initial index from which to return the results.", "required": false, "type": "integer"}], "responses": {"200": {"description": "", "schema": {"required": ["count", "results"], "type": "object", "properties": {"count": {"type": "integer"}, "next": {"type": "string", "format": "uri", "x-nullable": true}, "previous": {"type": "string", "format": "uri", "x-nullable": true}, "results": {"type": "array", "items": {"$ref": "#/definitions/AuthorList"}}}}}}, "tags": ["library"]}, "parameters": []}, "/mafatih-categories/": {"get": {"operationId": "mafatih-categories_list", "description": "", "parameters": [], "responses": {"200": {"description": "", "schema": {"type": "array", "items": {"$ref": "#/definitions/MafatihCategories"}}}}, "tags": ["mafatih-categories"]}, "parameters": []}, "/mafatih-categories/v2/": {"get": {"operationId": "mafatih-categories_v2_list", "description": "", "parameters": [], "responses": {"200": {"description": "", "schema": {"type": "array", "items": {"$ref": "#/definitions/DuaCategories"}}}}, "tags": ["mafatih-categories"]}, "parameters": []}, "/mafatih-dua-parts/": {"get": {"operationId": "mafatih-dua-parts_list", "description": "", "parameters": [{"name": "limit", "in": "query", "description": "Number of results to return per page.", "required": false, "type": "integer"}, {"name": "offset", "in": "query", "description": "The initial index from which to return the results.", "required": false, "type": "integer"}], "responses": {"200": {"description": "", "schema": {"required": ["count", "results"], "type": "object", "properties": {"count": {"type": "integer"}, "next": {"type": "string", "format": "uri", "x-nullable": true}, "previous": {"type": "string", "format": "uri", "x-nullable": true}, "results": {"type": "array", "items": {"$ref": "#/definitions/MafatihDuaPart"}}}}}}, "tags": ["mafatih-dua-parts"]}, "parameters": []}, "/mafatih-dua-parts/v2/": {"get": {"operationId": "mafatih-dua-parts_v2_list", "description": "", "parameters": [{"name": "limit", "in": "query", "description": "Number of results to return per page.", "required": false, "type": "integer"}, {"name": "offset", "in": "query", "description": "The initial index from which to return the results.", "required": false, "type": "integer"}], "responses": {"200": {"description": "", "schema": {"required": ["count", "results"], "type": "object", "properties": {"count": {"type": "integer"}, "next": {"type": "string", "format": "uri", "x-nullable": true}, "previous": {"type": "string", "format": "uri", "x-nullable": true}, "results": {"type": "array", "items": {"$ref": "#/definitions/DuaPartSerializer"}}}}}}, "tags": ["mafatih-dua-parts"]}, "parameters": []}, "/mafatih-duas/": {"get": {"operationId": "mafatih-duas_list", "description": "", "parameters": [{"name": "limit", "in": "query", "description": "Number of results to return per page.", "required": false, "type": "integer"}, {"name": "offset", "in": "query", "description": "The initial index from which to return the results.", "required": false, "type": "integer"}], "responses": {"200": {"description": "", "schema": {"required": ["count", "results"], "type": "object", "properties": {"count": {"type": "integer"}, "next": {"type": "string", "format": "uri", "x-nullable": true}, "previous": {"type": "string", "format": "uri", "x-nullable": true}, "results": {"type": "array", "items": {"$ref": "#/definitions/MafatihDua"}}}}}}, "tags": ["mafatih-duas"]}, "parameters": []}, "/mafatih-duas/audios/{id}/": {"get": {"operationId": "mafatih-duas_audios_read", "description": "", "parameters": [], "responses": {"200": {"description": "", "schema": {"$ref": "#/definitions/DuaAudioDetail"}}}, "tags": ["mafatih-duas"]}, "parameters": [{"name": "id", "in": "path", "required": true, "type": "string"}]}, "/mafatih-duas/dhikrs/": {"get": {"operationId": "mafatih-duas_dhikrs_list", "description": "", "parameters": [], "responses": {"200": {"description": ""}}, "tags": ["mafatih-duas"]}, "parameters": []}, "/mafatih-duas/famous/": {"get": {"operationId": "mafatih-duas_famous_list", "description": "", "parameters": [], "responses": {"200": {"description": ""}}, "tags": ["mafatih-duas"]}, "parameters": []}, "/mafatih-duas/location/": {"get": {"operationId": "mafatih-duas_location_list", "description": "Retrieve nearby duas based on the user's location.\nThis view takes the user's latitude and longitude as input and returns a list of duas within 20 kilometers,\nsorted by distance. Additionally, duas within 2 kilometers are prioritized based on the priority field.", "parameters": [{"name": "lat", "in": "query", "description": "Latitude of the location lat = {Mashhad : 36.2605, Karbala : 32.6160326} ", "type": "number"}, {"name": "lon", "in": "query", "description": "Longitude of the location lon = {Mashhad : 59.6168, Karbala : 44.0244229} ", "type": "number"}], "responses": {"200": {"description": ""}}, "tags": ["mafatih-duas"]}, "parameters": []}, "/mafatih-duas/v2/": {"get": {"operationId": "mafatih-duas_v2_list", "description": "", "parameters": [{"name": "limit", "in": "query", "description": "Number of results to return per page.", "required": false, "type": "integer"}, {"name": "offset", "in": "query", "description": "The initial index from which to return the results.", "required": false, "type": "integer"}], "responses": {"200": {"description": "", "schema": {"required": ["count", "results"], "type": "object", "properties": {"count": {"type": "integer"}, "next": {"type": "string", "format": "uri", "x-nullable": true}, "previous": {"type": "string", "format": "uri", "x-nullable": true}, "results": {"type": "array", "items": {"$ref": "#/definitions/MafatihDuaSerializerV2"}}}}}}, "tags": ["mafatih-duas"]}, "parameters": []}, "/mafatih-duas/v3/": {"get": {"operationId": "mafatih-duas_v3_list", "description": "", "parameters": [{"name": "limit", "in": "query", "description": "Number of results to return per page.", "required": false, "type": "integer"}, {"name": "offset", "in": "query", "description": "The initial index from which to return the results.", "required": false, "type": "integer"}], "responses": {"200": {"description": "", "schema": {"required": ["count", "results"], "type": "object", "properties": {"count": {"type": "integer"}, "next": {"type": "string", "format": "uri", "x-nullable": true}, "previous": {"type": "string", "format": "uri", "x-nullable": true}, "results": {"type": "array", "items": {"$ref": "#/definitions/MafatihDuaSerializerV3"}}}}}}, "tags": ["mafatih-duas"]}, "parameters": []}, "/mafatih-duas/{id}/audios/": {"get": {"operationId": "mafatih-duas_audios_list", "description": "", "parameters": [{"name": "limit", "in": "query", "description": "Number of results to return per page.", "required": false, "type": "integer"}, {"name": "offset", "in": "query", "description": "The initial index from which to return the results.", "required": false, "type": "integer"}], "responses": {"200": {"description": "", "schema": {"required": ["count", "results"], "type": "object", "properties": {"count": {"type": "integer"}, "next": {"type": "string", "format": "uri", "x-nullable": true}, "previous": {"type": "string", "format": "uri", "x-nullable": true}, "results": {"type": "array", "items": {"$ref": "#/definitions/DuaAudioList"}}}}}}, "tags": ["mafatih-duas"]}, "parameters": [{"name": "id", "in": "path", "required": true, "type": "string"}]}, "/mafatih/{mafatih_dua_id}/reciters/": {"get": {"operationId": "mafatih_reciters_list", "description": "Retrieve a list of unique reciters for a given MafatihDua.", "parameters": [{"name": "show_all", "in": "query", "description": "If true, returns all reciters, otherwise returns only reciters related to the specified MafatihDua.", "type": "boolean", "default": false}], "responses": {"200": {"description": "", "schema": {"type": "array", "items": {"type": "object", "properties": {"name": {"description": "Name of the reciter", "type": "string"}, "avatar": {"description": "URL of the reciter's avatar", "type": "string"}}}}}}, "tags": ["mafatih"]}, "parameters": [{"name": "mafatih_dua_id", "in": "path", "required": true, "type": "string"}]}, "/masaels/": {"get": {"operationId": "masaels_list", "description": "", "parameters": [], "responses": {"200": {"description": "", "schema": {"type": "array", "items": {"$ref": "#/definitions/Masael"}}}}, "tags": ["masaels"]}, "parameters": []}, "/masaels/marjaa-guide/": {"get": {"operationId": "masaels_marjaa-guide_list", "description": "", "parameters": [], "responses": {"200": {"description": "", "schema": {"type": "array", "items": {"$ref": "#/definitions/MarjaaGuide"}}}}, "tags": ["masaels"]}, "parameters": []}, "/masaels/v2/": {"get": {"operationId": "masaels_v2_list", "description": "", "parameters": [], "responses": {"200": {"description": "", "schema": {"type": "array", "items": {"$ref": "#/definitions/MasaelSerializerV2"}}}}, "tags": ["masaels"]}, "parameters": []}, "/notespace/create/": {"post": {"operationId": "notespace_create_create", "description": "", "parameters": [{"name": "data", "in": "body", "required": true, "schema": {"$ref": "#/definitions/Note"}}], "responses": {"201": {"description": "", "schema": {"$ref": "#/definitions/Note"}}}, "tags": ["notespace"]}, "parameters": []}, "/notespace/create/feedback/": {"post": {"operationId": "notespace_create_feedback_create", "description": "", "parameters": [{"name": "data", "in": "body", "required": true, "schema": {"$ref": "#/definitions/NoteFeedback"}}], "responses": {"201": {"description": "", "schema": {"$ref": "#/definitions/NoteFeedback"}}}, "tags": ["notespace"]}, "parameters": []}, "/notespace/feedbak/{note_id}/delete/": {"delete": {"operationId": "notespace_feedbak_delete_delete", "description": "", "parameters": [], "responses": {"204": {"description": ""}}, "tags": ["notespace"]}, "parameters": [{"name": "note_id", "in": "path", "required": true, "type": "string"}]}, "/notespace/list/{service}/": {"get": {"operationId": "notespace_list_read", "description": "Retrieve a list of Notes for a specific service and optionally a specific object.", "parameters": [{"name": "limit", "in": "query", "description": "Number of results to return per page.", "required": false, "type": "integer"}, {"name": "offset", "in": "query", "description": "The initial index from which to return the results.", "required": false, "type": "integer"}, {"name": "service", "in": "path", "description": "Service type", "type": "string", "enum": ["quran", "mafatih", "hadis", "habit"], "required": true}, {"name": "object_id", "in": "query", "description": "Comma-separated list of Object IDs(e.g 1,2,5,...)", "required": false, "type": "string", "default": "1,2,4"}], "responses": {"200": {"description": "", "schema": {"required": ["count", "results"], "type": "object", "properties": {"count": {"type": "integer"}, "next": {"type": "string", "format": "uri", "x-nullable": true}, "previous": {"type": "string", "format": "uri", "x-nullable": true}, "results": {"type": "array", "items": {"$ref": "#/definitions/Note"}}}}}}, "tags": ["notespace"]}, "parameters": [{"name": "service", "in": "path", "required": true, "type": "string"}]}, "/notespace/list/{service}/{object_id}/": {"get": {"operationId": "notespace_list_read", "description": "Retrieve a list Note", "parameters": [{"name": "limit", "in": "query", "description": "Number of results to return per page.", "required": false, "type": "integer"}, {"name": "offset", "in": "query", "description": "The initial index from which to return the results.", "required": false, "type": "integer"}, {"name": "service", "in": "path", "description": "Service type", "type": "string", "enum": ["quran", "mafatih", "hadis", "habit"], "required": true}, {"name": "object_id", "in": "path", "description": "Object ID for the note", "type": "integer", "required": true}], "responses": {"200": {"description": "", "schema": {"required": ["count", "results"], "type": "object", "properties": {"count": {"type": "integer"}, "next": {"type": "string", "format": "uri", "x-nullable": true}, "previous": {"type": "string", "format": "uri", "x-nullable": true}, "results": {"type": "array", "items": {"$ref": "#/definitions/Note"}}}}}}, "tags": ["notespace"]}, "parameters": [{"name": "service", "in": "path", "required": true, "type": "string"}, {"name": "object_id", "in": "path", "required": true, "type": "integer"}]}, "/notespace/{id}/delete/": {"delete": {"operationId": "notespace_delete_delete", "description": "", "parameters": [], "responses": {"204": {"description": ""}}, "tags": ["notespace"]}, "parameters": [{"name": "id", "in": "path", "description": "A unique integer value identifying this Note.", "required": true, "type": "integer"}]}, "/notespace/{id}/update/": {"put": {"operationId": "notespace_update_update", "description": "", "parameters": [{"name": "data", "in": "body", "required": true, "schema": {"$ref": "#/definitions/Note"}}], "responses": {"200": {"description": "", "schema": {"$ref": "#/definitions/Note"}}}, "tags": ["notespace"]}, "patch": {"operationId": "notespace_update_partial_update", "description": "", "parameters": [{"name": "data", "in": "body", "required": true, "schema": {"$ref": "#/definitions/Note"}}], "responses": {"200": {"description": "", "schema": {"$ref": "#/definitions/Note"}}}, "tags": ["notespace"]}, "parameters": [{"name": "id", "in": "path", "description": "A unique integer value identifying this Note.", "required": true, "type": "integer"}]}, "/payment/methods/": {"get": {"operationId": "payment_methods_list", "description": "", "parameters": [], "responses": {"200": {"description": ""}}, "tags": ["payment"]}, "parameters": []}, "/plans/": {"get": {"operationId": "plans_list", "description": "", "parameters": [{"name": "limit", "in": "query", "description": "Number of results to return per page.", "required": false, "type": "integer"}, {"name": "offset", "in": "query", "description": "The initial index from which to return the results.", "required": false, "type": "integer"}], "responses": {"200": {"description": "", "schema": {"required": ["count", "results"], "type": "object", "properties": {"count": {"type": "integer"}, "next": {"type": "string", "format": "uri", "x-nullable": true}, "previous": {"type": "string", "format": "uri", "x-nullable": true}, "results": {"type": "array", "items": {"$ref": "#/definitions/Plan"}}}}}}, "tags": ["plans"]}, "parameters": []}, "/plans/subscribe/": {"post": {"operationId": "plans_subscribe_create", "description": "", "parameters": [{"name": "data", "in": "body", "required": true, "schema": {"$ref": "#/definitions/Subscribe"}}], "responses": {"201": {"description": "", "schema": {"$ref": "#/definitions/Subscribe"}}}, "tags": ["plans"]}, "parameters": []}, "/plans/subscription-history/": {"get": {"operationId": "plans_subscription-history_list", "description": "", "parameters": [{"name": "limit", "in": "query", "description": "Number of results to return per page.", "required": false, "type": "integer"}, {"name": "offset", "in": "query", "description": "The initial index from which to return the results.", "required": false, "type": "integer"}], "responses": {"200": {"description": "", "schema": {"required": ["count", "results"], "type": "object", "properties": {"count": {"type": "integer"}, "next": {"type": "string", "format": "uri", "x-nullable": true}, "previous": {"type": "string", "format": "uri", "x-nullable": true}, "results": {"type": "array", "items": {"$ref": "#/definitions/Subscribe"}}}}}}, "tags": ["plans"]}, "parameters": []}, "/quran-juz/": {"get": {"operationId": "quran-juz_list", "description": "", "parameters": [{"name": "limit", "in": "query", "description": "Number of results to return per page.", "required": false, "type": "integer"}, {"name": "offset", "in": "query", "description": "The initial index from which to return the results.", "required": false, "type": "integer"}], "responses": {"200": {"description": "", "schema": {"required": ["count", "results"], "type": "object", "properties": {"count": {"type": "integer"}, "next": {"type": "string", "format": "uri", "x-nullable": true}, "previous": {"type": "string", "format": "uri", "x-nullable": true}, "results": {"type": "array", "items": {"$ref": "#/definitions/QuranPart"}}}}}}, "tags": ["quran-juz"]}, "parameters": []}, "/quran-page/": {"get": {"operationId": "quran-page_list", "description": "", "parameters": [{"name": "limit", "in": "query", "description": "Number of results to return per page.", "required": false, "type": "integer"}, {"name": "offset", "in": "query", "description": "The initial index from which to return the results.", "required": false, "type": "integer"}], "responses": {"200": {"description": "", "schema": {"required": ["count", "results"], "type": "object", "properties": {"count": {"type": "integer"}, "next": {"type": "string", "format": "uri", "x-nullable": true}, "previous": {"type": "string", "format": "uri", "x-nullable": true}, "results": {"type": "array", "items": {"$ref": "#/definitions/QuranPart"}}}}}}, "tags": ["quran-page"]}, "parameters": []}, "/quran-qaris/": {"get": {"operationId": "quran-qaris_list", "description": "", "parameters": [{"name": "type", "in": "query", "type": "string", "enum": ["reciter", "translation"]}], "responses": {"200": {"description": ""}}, "tags": ["quran-qaris"]}, "parameters": []}, "/quran-qaris/v2/": {"get": {"operationId": "quran-qaris_v2_list", "description": "", "parameters": [{"name": "type", "in": "query", "type": "string", "enum": ["reciter", "translation"]}], "responses": {"200": {"description": ""}}, "tags": ["quran-qaris"]}, "parameters": []}, "/quran-surahs-translation/": {"get": {"operationId": "quran-surahs-translation_list", "description": "", "parameters": [{"name": "limit", "in": "query", "description": "Number of results to return per page.", "required": false, "type": "integer"}, {"name": "offset", "in": "query", "description": "The initial index from which to return the results.", "required": false, "type": "integer"}], "responses": {"200": {"description": "", "schema": {"required": ["count", "results"], "type": "object", "properties": {"count": {"type": "integer"}, "next": {"type": "string", "format": "uri", "x-nullable": true}, "previous": {"type": "string", "format": "uri", "x-nullable": true}, "results": {"type": "array", "items": {"$ref": "#/definitions/QuranSuraTranslation"}}}}}}, "tags": ["quran-surahs-translation"]}, "parameters": []}, "/quran-surahs/": {"get": {"operationId": "quran-surahs_list", "description": "", "parameters": [{"name": "limit", "in": "query", "description": "Number of results to return per page.", "required": false, "type": "integer"}, {"name": "offset", "in": "query", "description": "The initial index from which to return the results.", "required": false, "type": "integer"}], "responses": {"200": {"description": "", "schema": {"required": ["count", "results"], "type": "object", "properties": {"count": {"type": "integer"}, "next": {"type": "string", "format": "uri", "x-nullable": true}, "previous": {"type": "string", "format": "uri", "x-nullable": true}, "results": {"type": "array", "items": {"$ref": "#/definitions/QuranSura"}}}}}}, "tags": ["quran-surahs"]}, "parameters": []}, "/quran-translators/": {"get": {"operationId": "quran-translators_list", "description": "", "parameters": [], "responses": {"200": {"description": "", "schema": {"type": "array", "items": {"$ref": "#/definitions/QuranTranslators"}}}}, "tags": ["quran-translators"]}, "parameters": []}, "/quran-verses-localization/": {"get": {"operationId": "quran-verses-localization_list", "description": "", "parameters": [{"name": "limit", "in": "query", "description": "Number of results to return per page.", "required": false, "type": "integer"}, {"name": "offset", "in": "query", "description": "The initial index from which to return the results.", "required": false, "type": "integer"}, {"name": "translator_en", "in": "query", "type": "string"}], "responses": {"200": {"description": "", "schema": {"required": ["count", "results"], "type": "object", "properties": {"count": {"type": "integer"}, "next": {"type": "string", "format": "uri", "x-nullable": true}, "previous": {"type": "string", "format": "uri", "x-nullable": true}, "results": {"type": "array", "items": {"$ref": "#/definitions/QuranVerseLocalization"}}}}}}, "tags": ["quran-verses-localization"]}, "parameters": []}, "/quran-verses-translation/": {"get": {"operationId": "quran-verses-translation_list", "description": "", "parameters": [{"name": "limit", "in": "query", "description": "Number of results to return per page.", "required": false, "type": "integer"}, {"name": "offset", "in": "query", "description": "The initial index from which to return the results.", "required": false, "type": "integer"}, {"name": "translator_en", "in": "query", "type": "string"}], "responses": {"200": {"description": "", "schema": {"required": ["count", "results"], "type": "object", "properties": {"count": {"type": "integer"}, "next": {"type": "string", "format": "uri", "x-nullable": true}, "previous": {"type": "string", "format": "uri", "x-nullable": true}, "results": {"type": "array", "items": {"$ref": "#/definitions/QuranVerseTranslation"}}}}}}, "tags": ["quran-verses-translation"]}, "parameters": []}, "/quran-verses/": {"get": {"operationId": "quran-verses_list", "description": "", "parameters": [{"name": "limit", "in": "query", "description": "Number of results to return per page.", "required": false, "type": "integer"}, {"name": "offset", "in": "query", "description": "The initial index from which to return the results.", "required": false, "type": "integer"}], "responses": {"200": {"description": "", "schema": {"required": ["count", "results"], "type": "object", "properties": {"count": {"type": "integer"}, "next": {"type": "string", "format": "uri", "x-nullable": true}, "previous": {"type": "string", "format": "uri", "x-nullable": true}, "results": {"type": "array", "items": {"$ref": "#/definitions/QuranVerse"}}}}}}, "tags": ["quran-verses"]}, "parameters": []}, "/quran-word-translation/": {"get": {"operationId": "quran-word-translation_list", "description": "", "parameters": [{"name": "surah_index", "in": "query", "type": "number"}, {"name": "verse_index", "in": "query", "type": "number"}, {"name": "language_code", "in": "query", "type": "string", "default": "en"}], "responses": {"200": {"description": "", "schema": {"type": "array", "items": {"$ref": "#/definitions/QuranWordTranslation"}}}}, "tags": ["quran-word-translation"]}, "parameters": []}, "/religious_times/adhans/": {"get": {"operationId": "religious_times_adhans_list", "description": "adhan list api", "parameters": [{"name": "limit", "in": "query", "description": "Number of results to return per page.", "required": false, "type": "integer"}, {"name": "offset", "in": "query", "description": "The initial index from which to return the results.", "required": false, "type": "integer"}], "responses": {"200": {"description": "", "schema": {"required": ["count", "results"], "type": "object", "properties": {"count": {"type": "integer"}, "next": {"type": "string", "format": "uri", "x-nullable": true}, "previous": {"type": "string", "format": "uri", "x-nullable": true}, "results": {"type": "array", "items": {"$ref": "#/definitions/Adhan"}}}}}}, "tags": ["religious_times"]}, "parameters": []}, "/religious_times/pre-adhans/": {"get": {"operationId": "religious_times_pre-adhans_list", "description": "adhan list api", "parameters": [{"name": "limit", "in": "query", "description": "Number of results to return per page.", "required": false, "type": "integer"}, {"name": "offset", "in": "query", "description": "The initial index from which to return the results.", "required": false, "type": "integer"}], "responses": {"200": {"description": "", "schema": {"required": ["count", "results"], "type": "object", "properties": {"count": {"type": "integer"}, "next": {"type": "string", "format": "uri", "x-nullable": true}, "previous": {"type": "string", "format": "uri", "x-nullable": true}, "results": {"type": "array", "items": {"$ref": "#/definitions/Adhan"}}}}}}, "tags": ["religious_times"]}, "parameters": []}, "/reminders/": {"get": {"operationId": "reminders_list", "summary": "Get list of reminders for the authenticated user.", "description": "### Example JSON Response:\n```json\n{\n \"count\": 10,\n \"next\": \"http://example.com/api/reminders/?page=2\",\n \"previous\": null,\n \"results\": [\n {\n \"id\": 1,\n \"service_name\": \"meet\",\n \"object_id\": \"123\",\n \"text\": \"Don't forget about the meeting tomorrow\",\n \"created_at\": \"2024-01-15T10:30:00Z\",\n \"call_time\": \"2024-01-16T09:00:00Z\",\n \"is_sent\": false,\n \"is_read\": false,\n \"status\": true,\n }\n ]\n}\n```", "parameters": [{"name": "limit", "in": "query", "description": "Number of results to return per page.", "required": false, "type": "integer"}, {"name": "offset", "in": "query", "description": "The initial index from which to return the results.", "required": false, "type": "integer"}, {"name": "service_name", "in": "query", "description": "Filter reminders by service name (e.g., 'meet', 'dua', etc.)", "required": false, "type": "string"}, {"name": "is_sent", "in": "query", "description": "Filter reminders by sent status", "required": false, "type": "boolean"}, {"name": "is_read", "in": "query", "description": "Filter reminders by read status", "required": false, "type": "boolean"}, {"name": "status", "in": "query", "description": "Filter reminders by active status", "required": false, "type": "boolean"}], "responses": {"200": {"description": "List of user reminders", "schema": {"type": "array", "items": {"$ref": "#/definitions/Reminder"}}}}, "tags": ["reminders"]}, "parameters": []}, "/reminders/{id}/": {"put": {"operationId": "reminders_update", "description": "Update reminder status fields (same as PATCH).", "parameters": [{"name": "data", "in": "body", "required": true, "schema": {"$ref": "#/definitions/ReminderUpdate"}}], "responses": {"200": {"description": "", "schema": {"$ref": "#/definitions/ReminderUpdate"}}}, "tags": ["reminders"]}, "patch": {"operationId": "reminders_partial_update", "summary": "Update reminder status fields.", "description": "### Example Request:\n```json\n{\n \"status\": false\n}\n```\n\n### Example Response:\n```json\n{\n\n \"status\": false\n}\n```", "parameters": [{"name": "data", "in": "body", "required": true, "schema": {"description": "At least one field must be provided", "required": [], "type": "object", "properties": {"status": {"description": "General status of the reminder", "type": "boolean"}}}}], "responses": {"200": {"description": "Reminder updated successfully", "schema": {"$ref": "#/definitions/ReminderUpdate"}}, "400": {"description": "Bad request - validation errors"}, "404": {"description": "Reminder not found"}, "403": {"description": "Permission denied - reminder belongs to another user"}}, "tags": ["reminders"]}, "parameters": [{"name": "id", "in": "path", "required": true, "type": "string"}]}, "/report/": {"post": {"operationId": "report_create", "description": "", "parameters": [{"name": "data", "in": "body", "required": true, "schema": {"$ref": "#/definitions/Report"}}], "responses": {"201": {"description": "", "schema": {"$ref": "#/definitions/Report"}}}, "tags": ["report"]}, "parameters": []}, "/report/subjects/": {"get": {"operationId": "report_subjects_list", "description": "", "parameters": [{"name": "limit", "in": "query", "description": "Number of results to return per page.", "required": false, "type": "integer"}, {"name": "offset", "in": "query", "description": "The initial index from which to return the results.", "required": false, "type": "integer"}], "responses": {"200": {"description": "", "schema": {"required": ["count", "results"], "type": "object", "properties": {"count": {"type": "integer"}, "next": {"type": "string", "format": "uri", "x-nullable": true}, "previous": {"type": "string", "format": "uri", "x-nullable": true}, "results": {"type": "array", "items": {"$ref": "#/definitions/Subject"}}}}}}, "tags": ["report"]}, "parameters": []}, "/service-versions/": {"get": {"operationId": "service-versions_list", "description": "\n# 📘 Scenario\nدر حبیب دیتا های بعضی از سرویس ها به صورت یک جا گرفته و ذخیره میشوند سمت کلاینت \nممکن است در مرور زمان این دیتا ها بر اساس محتوا تغییراتی داشته باشند بنابر این\nدر اینجا ما میتوانی به هر سرویس شماره ورژنی اختصاص دهیم بر اساس زبان\n(به طور مثال در احکام زبان فارسی ترجمه ای آپدیت میشود و بایستی داده جدیدی به کاربر نمایش دهیم)\nبنابر این میتوانیم به طور تخمینی یک زمانی را تعیین کنیم که این ای پی ای فراخوانی شود \nو اگر شماره ورژن سرویسی افزایش پیدا کرده بود آن دیتا را مجددا درخواست کنیم \nو بایستی برای هر کلاینت این شماره ورژن های سرویس را ذخیره و در هر بار مقایسه کنیم\n\n---\n\n## 🚀 درخواست API\n\nکاربر باید احراز هویت شده باشد و زبان درخواست از طریق `LANGUAGE_CODE` در تنظیمات کاربر مشخص می‌شود. این API تنها نسخه‌های مرتبط با زبان کاربر را باز می‌گرداند.\n\n\n## 📊 پاسخ‌ها\n\n| کد وضعیت | توضیحات |\n|----------|------------------------------------------------------------|\n| `200` | موفقیت‌آمیز - لیستی از آخرین نسخه‌های سرویس‌ها برمی‌گرداند |\n\n---\n\n## 📄 نمونه پاسخ موفقیت‌آمیز\n\n```json\n[\n {\n \"service\": \"ahkam\",\n \"version_number\": \"1.3\",\n \"language\": {\n \"code\": \"fa\",\n \"name\": \"فارسی\"\n },\n \"created_at\": \"2023-11-01T12:34:56Z\",\n \"app_intros\": [\n {\n \"title\": \"خوش آمدید به سرویس احکام\",\n \"summary\": \"این سرویس شامل احکام شرعی است\",\n \"image\": \"https://example.com/images/intro1.jpg\",\n \"priority\": 1\n },\n {\n \"title\": \"نحوه استفاده\",\n \"summary\": \"برای استفاده از سرویس احکام...\",\n \"image\": \"https://example.com/images/intro2.jpg\",\n \"priority\": 2\n }\n ],\n \"service_intros\": [\n {\n \"title\": \"به‌روزرسانی جدید\",\n \"summary\": \"در این نسخه ویژگی‌های جدیدی اضافه شده است\",\n \"image\": \"https://example.com/images/update1.jpg\",\n \"priority\": 1\n }\n ]\n },\n {\n \"service\": \"quran\",\n \"version_number\": \"2.1\",\n \"language\": {\n \"code\": \"fa\",\n \"name\": \"فارسی\"\n },\n \"created_at\": \"2023-10-20T10:24:36Z\",\n \"app_intros\": [],\n \"service_intros\": []\n }\n]\n```\n\n### 📋 توضیحات فیلدها\n\n| فیلد | نوع | توضیحات |\n|------|-----|---------|\n| `service` | string | شناسه (slug) سرویس |\n| `version_number` | string | شماره نسخه سرویس (مثال: \"1.3\") |\n| `language` | object | اطلاعات زبان شامل `code` و `name` |\n| `created_at` | datetime | تاریخ ایجاد نسخه |\n| `app_intros` | array | لیست اسلایدهای معرفی استاتیک (Onboarding) که برای تمام نسخه‌های سرویس یکسان است |\n| `service_intros` | array | لیست اسلایدهای معرفی مخصوص این نسخه (Update Note) |\n\n### 📝 ساختار هر آیتم در `app_intros` و `service_intros`:\n\n| فیلد | نوع | توضیحات |\n|------|-----|---------|\n| `title` | string | عنوان ترجمه شده بر اساس زبان درخواست |\n| `summary` | string | خلاصه ترجمه شده بر اساس زبان درخواست |\n| `image` | string\\|null | URL تصویر یا null در صورت عدم وجود |\n| `priority` | integer | اولویت نمایش (کمتر = اولویت بیشتر) |\n\n**نکته:** فیلدهای `title` و `summary` به صورت خودکار بر اساس زبان درخواست (`LANGUAGE_CODE`) ترجمه می‌شوند و فقط مقدار ترجمه شده (string) برگردانده می‌شود، نه دیکشنری کامل ترجمه‌ها.\n", "parameters": [{"name": "Authorization", "in": "header", "description": "Bearer token for authentication", "type": "string"}], "responses": {"200": {"description": "", "schema": {"type": "array", "items": {"$ref": "#/definitions/ServiceVersion"}}}}, "tags": ["service-versions"]}, "parameters": []}, "/service-versions/v2/": {"get": {"operationId": "service-versions_v2_list", "description": "\n# 📘 Scenario\nدر حبیب دیتا های بعضی از سرویس ها به صورت یک جا گرفته و ذخیره میشوند سمت کلاینت \nممکن است در مرور زمان این دیتا ها بر اساس محتوا تغییراتی داشته باشند بنابر این\nدر اینجا ما میتوانی به هر سرویس شماره ورژنی اختصاص دهیم بر اساس زبان\n(به طور مثال در احکام زبان فارسی ترجمه ای آپدیت میشود و بایستی داده جدیدی به کاربر نمایش دهیم)\nبنابر این میتوانیم به طور تخمینی یک زمانی را تعیین کنیم که این ای پی ای فراخوانی شود \nو اگر شماره ورژن سرویسی افزایش پیدا کرده بود آن دیتا را مجددا درخواست کنیم \nو بایستی برای هر کلاینت این شماره ورژن های سرویس را ذخیره و در هر بار مقایسه کنیم\n\n---\n\n## 🚀 درخواست API\n\nکاربر باید احراز هویت شده باشد و زبان درخواست از طریق `LANGUAGE_CODE` در تنظیمات کاربر مشخص می‌شود. این API تنها نسخه‌های مرتبط با زبان کاربر را باز می‌گرداند.\n\n\n## 📊 پاسخ‌ها\n\n| کد وضعیت | توضیحات |\n|----------|------------------------------------------------------------|\n| `200` | موفقیت‌آمیز - لیستی از آخرین نسخه‌های سرویس‌ها برمی‌گرداند |\n\n---\n\n## 📄 نمونه پاسخ موفقیت‌آمیز\n\n```json\n[\n {\n \"service\": \"ahkam\",\n \"version_number\": \"1.3\",\n \"language\": {\n \"code\": \"fa\",\n \"name\": \"فارسی\"\n },\n \"created_at\": \"2023-11-01T12:34:56Z\",\n \"app_intros\": [\n {\n \"title\": \"خوش آمدید به سرویس احکام\",\n \"summary\": \"این سرویس شامل احکام شرعی است\",\n \"image\": \"https://example.com/images/intro1.jpg\",\n \"priority\": 1\n },\n {\n \"title\": \"نحوه استفاده\",\n \"summary\": \"برای استفاده از سرویس احکام...\",\n \"image\": \"https://example.com/images/intro2.jpg\",\n \"priority\": 2\n }\n ],\n \"service_intros\": [\n {\n \"title\": \"به‌روزرسانی جدید\",\n \"summary\": \"در این نسخه ویژگی‌های جدیدی اضافه شده است\",\n \"image\": \"https://example.com/images/update1.jpg\",\n \"priority\": 1\n }\n ]\n },\n {\n \"service\": \"quran\",\n \"version_number\": \"2.1\",\n \"language\": {\n \"code\": \"fa\",\n \"name\": \"فارسی\"\n },\n \"created_at\": \"2023-10-20T10:24:36Z\",\n \"app_intros\": [],\n \"service_intros\": []\n }\n]\n```\n\n### 📋 توضیحات فیلدها\n\n| فیلد | نوع | توضیحات |\n|------|-----|---------|\n| `service` | string | شناسه (slug) سرویس |\n| `version_number` | string | شماره نسخه سرویس (مثال: \"1.3\") |\n| `language` | object | اطلاعات زبان شامل `code` و `name` |\n| `created_at` | datetime | تاریخ ایجاد نسخه |\n| `app_intros` | array | لیست اسلایدهای معرفی استاتیک (Onboarding) که برای تمام نسخه‌های سرویس یکسان است |\n| `service_intros` | array | لیست اسلایدهای معرفی مخصوص این نسخه (Update Note) |\n\n### 📝 ساختار هر آیتم در `app_intros` و `service_intros`:\n\n| فیلد | نوع | توضیحات |\n|------|-----|---------|\n| `title` | string | عنوان ترجمه شده بر اساس زبان درخواست |\n| `summary` | string | خلاصه ترجمه شده بر اساس زبان درخواست |\n| `image` | string\\|null | URL تصویر یا null در صورت عدم وجود |\n| `priority` | integer | اولویت نمایش (کمتر = اولویت بیشتر) |\n\n**نکته:** فیلدهای `title` و `summary` به صورت خودکار بر اساس زبان درخواست (`LANGUAGE_CODE`) ترجمه می‌شوند و فقط مقدار ترجمه شده (string) برگردانده می‌شود، نه دیکشنری کامل ترجمه‌ها.\n", "parameters": [{"name": "Authorization", "in": "header", "description": "Bearer token for authentication", "type": "string"}], "responses": {"200": {"description": "Service versions with startup modal", "schema": {"type": "object", "properties": {"versions": {"type": "array", "items": {"type": "object"}}, "startup_modal": {"type": "object", "properties": {"id": {"type": "integer"}, "html_content": {"description": "Rendered HTML form content", "type": "string"}, "width_percentage": {"description": "Modal width in percentage", "type": "integer"}, "height_percentage": {"description": "Modal height in percentage", "type": "integer"}, "is_forced": {"type": "boolean"}}, "nullable": true}}}}}, "tags": ["service-versions"]}, "parameters": []}, "/share-app/": {"get": {"operationId": "share-app_read", "description": "", "parameters": [], "responses": {"200": {"description": "", "schema": {"$ref": "#/definitions/ShareApp"}}}, "tags": ["share-app"]}, "parameters": []}, "/tafsir/book/{book}/{surah}/{verse}/": {"get": {"operationId": "tafsir_book_read", "description": "", "parameters": [], "responses": {"200": {"description": "", "schema": {"$ref": "#/definitions/TafsirVerses"}}}, "tags": ["tafsir"]}, "parameters": [{"name": "book", "in": "path", "required": true, "type": "string"}, {"name": "surah", "in": "path", "required": true, "type": "string"}, {"name": "verse", "in": "path", "required": true, "type": "string"}]}, "/tafsir/books/": {"get": {"operationId": "tafsir_books_list", "description": "", "parameters": [], "responses": {"200": {"description": "", "schema": {"type": "array", "items": {"$ref": "#/definitions/TafsirBook"}}}}, "tags": ["tafsir"]}, "parameters": []}, "/upload-tmp-media/": {"post": {"operationId": "upload-tmp-media_create", "description": "upload file...", "parameters": [{"name": "file", "in": "formData", "required": true, "type": "file"}], "responses": {"200": {"description": "", "schema": {"type": "object", "properties": {"success": {"type": "boolean", "default": true}, "path": {"description": "url path of file", "type": "string"}, "apath": {"description": "absolute path of file", "type": "string"}, "name": {"type": "string"}, "size": {"type": "string"}}}}, "400": {"description": "", "schema": {"type": "object", "properties": {"success": {"type": "boolean", "default": false}, "reason": {"type": "string"}}}}}, "consumes": ["multipart/form-data"], "tags": ["upload-tmp-media"]}, "parameters": []}, "/v1/languages/": {"get": {"operationId": "v1_languages_list", "description": "language list api", "parameters": [], "responses": {"200": {"description": "", "schema": {"type": "array", "items": {"$ref": "#/definitions/Language"}}}}, "tags": ["v1"]}, "parameters": []}, "/wallet/info/": {"get": {"operationId": "wallet_info_list", "description": "Retrieve wallet details for the authenticated user, including balance in coins and USD", "parameters": [], "responses": {"200": {"description": "Wallet details", "examples": {"application/json": {"id": 1, "currency": "USD", "balance_coin_count": 100, "balance_amount": 10.0, "coin_amount": {"coin": 10, "amount": 1.0}}}}, "400": {"description": "User does not have any active publishers."}, "404": {"description": "Wallet not found."}}, "tags": ["wallet"]}, "parameters": []}, "/wallet/transactions/": {"get": {"operationId": "wallet_transactions_list", "description": "List all income transactions", "parameters": [{"name": "limit", "in": "query", "description": "Number of results to return per page.", "required": false, "type": "integer"}, {"name": "offset", "in": "query", "description": "The initial index from which to return the results.", "required": false, "type": "integer"}], "responses": {"200": {"description": "", "schema": {"type": "array", "items": {"$ref": "#/definitions/Transaction"}}}}, "tags": ["wallet"]}, "parameters": []}, "/wallet/wallet/withdrawal-requests/create/": {"post": {"operationId": "wallet_wallet_withdrawal-requests_create_create", "description": "Creates a withdrawal request for the authenticated user.", "parameters": [{"name": "data", "in": "body", "required": true, "schema": {"required": ["coin_count"], "type": "object", "properties": {"coin_count": {"description": "Number of coins to withdraw", "type": "integer"}}}}], "responses": {"201": {"description": "Withdrawal request created successfully", "examples": {"application/json": {"detail": "Withdrawal request created successfully.", "request_id": 1, "status": "pending", "amount": 5.0, "coin_count": 50, "currency": "USD"}}}, "400": {"description": "Bad request due to validation error or insufficient balance", "examples": {"application/json": {"detail": "Insufficient balance to create debit request."}}}, "404": {"description": "Wallet not found", "examples": {"application/json": {"detail": "User does not have a wallet."}}}}, "tags": ["wallet"]}, "parameters": []}, "/wallet/withdrawal-requests/": {"get": {"operationId": "wallet_withdrawal-requests_list", "description": "List all withdrawal requests for the authenticated user", "parameters": [{"name": "limit", "in": "query", "description": "Number of results to return per page.", "required": false, "type": "integer"}, {"name": "offset", "in": "query", "description": "The initial index from which to return the results.", "required": false, "type": "integer"}], "responses": {"200": {"description": "", "schema": {"type": "array", "items": {"$ref": "#/definitions/WithdrawalRequest"}}}}, "tags": ["wallet"]}, "parameters": []}, "/web/donate/v2/": {"get": {"operationId": "web_donate_v2_list", "description": "", "parameters": [{"name": "limit", "in": "query", "description": "Number of results to return per page.", "required": false, "type": "integer"}, {"name": "offset", "in": "query", "description": "The initial index from which to return the results.", "required": false, "type": "integer"}], "responses": {"200": {"description": ""}}, "tags": ["web"]}, "parameters": []}, "/web/donate/v2/create/": {"post": {"operationId": "web_donate_v2_create_create", "description": "\n**Donation Creation API**\n\nCreate a donation record and receive a payment link. This API is designed to never fail and always returns a working donation link without any errors.\n\n**Key Features:**\n- Error-free operation - never returns HTTP errors\n- All fields are completely optional with intelligent defaults\n- Automatic payment method selection based on user location\n- Support for multiple payment gateways\n- Backward compatibility with existing integrations\n\n**Smart Defaults:**\n- **donate_type**: Defaults to 'once' if not provided or invalid\n- **price**: Defaults to '10.00' if not provided or invalid\n- **id**: Auto-selected based on user location (CloudTips for Russian users, Stripe for others)\n- **phone_number**: Optional field, stored if provided, otherwise null\n\n**Payment Methods:**\n- **Stripe**: International payment gateway with predefined donation links\n- **CloudTips**: Russian payment gateway for Russian users\n\n**Localization Logic:**\n- Russian users (language_code=ru OR user.country=RU) default to CloudTips\n- All other users default to Stripe payment gateway\n- Fallback to default donation links for custom amounts\n\n**Business Logic:**\n- Creates donation record in database (optional, doesn't affect response)\n- Optionally stores donor's phone number for contact purposes\n- Maps donation amounts to predefined Stripe payment links\n- Uses fallback links for unmapped amounts\n- Always returns HTTP 200 with working payment link\n\n**Authentication**: Not required - Public API\n**Permissions**: None - Accessible to all users\n", "parameters": [{"name": "data", "in": "body", "required": true, "schema": {"required": [], "type": "object", "properties": {"donate_type": {"description": "Type of donation - either 'monthly' for recurring donations or 'once' for one-time donations. This field is completely optional and will default to 'once' if not provided or if an invalid value is sent.", "type": "string", "enum": ["monthly", "once"]}, "price": {"description": "Donation amount as a string (e.g., '5.00', '10.00', '20.00'). This field is completely optional and will default to '10.00' if not provided or if an invalid value is sent.", "type": "string"}, "id": {"description": "Payment gateway identifier. This field is completely optional. If not provided, the system will automatically choose 'stripe' for non-Russian users and 'cloudtips' for Russian users (detected by language_code=ru or user country=RU). If an invalid value is provided, it defaults to 'stripe'.", "type": "string", "enum": ["stripe", "cloudtips"]}, "phone_number": {"description": "Optional phone number for the donor. This field is completely optional and can be omitted. If provided, it will be stored with the donation record.", "type": "string"}}, "example": {"donate_type": "once", "price": "15.00", "id": "stripe", "phone_number": "+1234567890"}}}], "responses": {"200": {"description": "Donation link created successfully. This API is guaranteed to always return HTTP 200 status with a working donation link, regardless of the input provided. Even if no data is sent in the request body, the API will respond with appropriate defaults.", "examples": {"application/json": {"complete_request": {"summary": "Complete Request with Phone Number", "description": "Response when all fields including phone_number are provided", "value": {"donate_user": 1, "donate_link": "https://donate.stripe.com/bIYdSDgiK7Pwh0ccMN"}}, "request_with_phone": {"summary": "Request Example with Phone", "description": "Example showing phone_number parameter usage", "value": {"donate_user": 1, "donate_link": "https://donate.stripe.com/9AQ01N5E68TAbFS002"}}, "empty_request_default": {"summary": "Empty Request (Default)", "description": "Response when no fields are provided - uses intelligent defaults", "value": {"donate_user": 1, "donate_link": "https://donate.stripe.com/7sI3dZaYq7Pw9xKcMV"}}, "empty_request_russian_user": {"summary": "Empty Request (Russian User)", "description": "Response for Russian users when no fields are provided", "value": {"donate_user": 1, "donate_link": "https://pay.cloudtips.ru/p/d5881ddf"}}, "cloudtips_payment": {"summary": "CloudTips Payment", "description": "Response when CloudTips payment method is selected", "value": {"donate_user": 1, "donate_link": "https://pay.cloudtips.ru/p/d5881ddf"}}, "invalid_data_fallback": {"summary": "Invalid Data Fallback", "description": "Response when invalid data is provided - normalized to defaults", "value": {"donate_user": 1, "donate_link": "https://donate.stripe.com/7sI3dZaYq7Pw9xKcMV"}}}}}}, "tags": ["Donate"]}, "parameters": []}, "/web/duas/robots.txt": {"get": {"operationId": "web_duas_robots.txt_list", "description": "", "parameters": [], "responses": {"200": {"description": ""}}, "tags": ["web"]}, "parameters": []}, "/web/duas/{slug}/complete/": {"get": {"operationId": "web_duas_complete_read", "description": "دریافت کامل یک دعا با تمام بخش‌ها (بدون pagination) برای استفاده آفلاین", "parameters": [{"name": "slug", "in": "path", "description": "Slug دعا", "required": true, "type": "string"}], "responses": {"200": {"description": "", "schema": {"$ref": "#/definitions/DuaCompleteSerializer"}}, "404": {"description": "دعا یافت نشد"}}, "tags": ["web"]}, "parameters": [{"name": "slug", "in": "path", "required": true, "type": "string"}]}, "/web/mafatih-categories/": {"get": {"operationId": "web_mafatih-categories_list", "description": "", "parameters": [{"name": "language_code", "in": "query", "type": "string"}], "responses": {"200": {"description": "", "schema": {"type": "array", "items": {"$ref": "#/definitions/Web_DuaCategoriesSerializer"}}}}, "tags": ["web"]}, "parameters": []}, "/web/mafatih-duas/": {"get": {"operationId": "web_mafatih-duas_list", "description": "", "parameters": [{"name": "page", "in": "query", "description": "A page number within the paginated result set.", "required": false, "type": "integer"}, {"name": "category", "in": "query", "description": "ID دسته‌بندی برای فیلتر دعاها", "type": "integer"}, {"name": "search", "in": "query", "description": "جستجو بر اساس عنوان دعاها", "type": "string"}, {"name": "today", "in": "query", "description": "", "type": "string"}, {"name": "famous", "in": "query", "description": "", "type": "string"}, {"name": "lat", "in": "query", "description": "Latitude of the location lat = {Mashhad : 36.2605, Karbala : 32.6160326} ", "type": "number"}, {"name": "lon", "in": "query", "description": "Longitude of the location lon = {Mashhad : 59.6168, Karbala : 44.0244229} ", "type": "number"}, {"name": "not_synced", "in": "query", "description": "", "type": "boolean"}], "responses": {"200": {"description": "", "schema": {"required": ["count", "results"], "type": "object", "properties": {"count": {"type": "integer"}, "next": {"type": "string", "format": "uri", "x-nullable": true}, "previous": {"type": "string", "format": "uri", "x-nullable": true}, "results": {"type": "array", "items": {"$ref": "#/definitions/Web_DuaSerializer"}}}}}}, "tags": ["web"]}, "parameters": []}, "/web/mafatih-duas/dhikrs/": {"get": {"operationId": "web_mafatih-duas_dhikrs_list", "description": "", "parameters": [], "responses": {"200": {"description": ""}}, "tags": ["web"]}, "parameters": []}, "/web/mafatih-duas/{id}/parts/": {"get": {"operationId": "web_mafatih-duas_parts_list", "description": "", "parameters": [{"name": "limit", "in": "query", "description": "Number of results to return per page.", "required": false, "type": "integer"}, {"name": "offset", "in": "query", "description": "The initial index from which to return the results.", "required": false, "type": "integer"}], "responses": {"200": {"description": "", "schema": {"required": ["count", "results"], "type": "object", "properties": {"count": {"type": "integer"}, "next": {"type": "string", "format": "uri", "x-nullable": true}, "previous": {"type": "string", "format": "uri", "x-nullable": true}, "results": {"type": "array", "items": {"$ref": "#/definitions/Web_DuaPartSerializer"}}}}}}, "tags": ["web"]}, "parameters": [{"name": "id", "in": "path", "required": true, "type": "string"}]}, "/web/mafatih-duas/{slug}/parts/": {"get": {"operationId": "web_mafatih-duas_parts_list", "description": "", "parameters": [{"name": "limit", "in": "query", "description": "Number of results to return per page.", "required": false, "type": "integer"}, {"name": "offset", "in": "query", "description": "The initial index from which to return the results.", "required": false, "type": "integer"}], "responses": {"200": {"description": "", "schema": {"required": ["count", "results"], "type": "object", "properties": {"count": {"type": "integer"}, "next": {"type": "string", "format": "uri", "x-nullable": true}, "previous": {"type": "string", "format": "uri", "x-nullable": true}, "results": {"type": "array", "items": {"$ref": "#/definitions/Web_DuaPartSerializer"}}}}}}, "tags": ["web"]}, "parameters": [{"name": "slug", "in": "path", "required": true, "type": "string"}]}, "/web/mafatih/{id}/audios/": {"get": {"operationId": "web_mafatih_audios_list", "description": "", "parameters": [{"name": "page", "in": "query", "description": "A page number within the paginated result set.", "required": false, "type": "integer"}], "responses": {"200": {"description": "", "schema": {"required": ["count", "results"], "type": "object", "properties": {"count": {"type": "integer"}, "next": {"type": "string", "format": "uri", "x-nullable": true}, "previous": {"type": "string", "format": "uri", "x-nullable": true}, "results": {"type": "array", "items": {"$ref": "#/definitions/WebDuaAudio"}}}}}}, "tags": ["web"]}, "parameters": [{"name": "id", "in": "path", "required": true, "type": "string"}]}, "/web/mafatih/{id}/reciters/": {"get": {"operationId": "web_mafatih_reciters_list", "description": "", "parameters": [{"name": "limit", "in": "query", "description": "Number of results to return per page.", "required": false, "type": "integer"}, {"name": "offset", "in": "query", "description": "The initial index from which to return the results.", "required": false, "type": "integer"}], "responses": {"200": {"description": "", "schema": {"required": ["count", "results"], "type": "object", "properties": {"count": {"type": "integer"}, "next": {"type": "string", "format": "uri", "x-nullable": true}, "previous": {"type": "string", "format": "uri", "x-nullable": true}, "results": {"type": "array", "items": {"$ref": "#/definitions/DuaReciter"}}}}}}, "tags": ["web"]}, "parameters": [{"name": "id", "in": "path", "required": true, "type": "string"}]}, "/web/mafatih/{slug}/audios/": {"get": {"operationId": "web_mafatih_audios_list", "description": "", "parameters": [{"name": "page", "in": "query", "description": "A page number within the paginated result set.", "required": false, "type": "integer"}], "responses": {"200": {"description": "", "schema": {"required": ["count", "results"], "type": "object", "properties": {"count": {"type": "integer"}, "next": {"type": "string", "format": "uri", "x-nullable": true}, "previous": {"type": "string", "format": "uri", "x-nullable": true}, "results": {"type": "array", "items": {"$ref": "#/definitions/WebDuaAudio"}}}}}}, "tags": ["web"]}, "parameters": [{"name": "slug", "in": "path", "required": true, "type": "string"}]}, "/web/mafatih/{slug}/reciters/": {"get": {"operationId": "web_mafatih_reciters_list", "description": "", "parameters": [{"name": "limit", "in": "query", "description": "Number of results to return per page.", "required": false, "type": "integer"}, {"name": "offset", "in": "query", "description": "The initial index from which to return the results.", "required": false, "type": "integer"}], "responses": {"200": {"description": "", "schema": {"required": ["count", "results"], "type": "object", "properties": {"count": {"type": "integer"}, "next": {"type": "string", "format": "uri", "x-nullable": true}, "previous": {"type": "string", "format": "uri", "x-nullable": true}, "results": {"type": "array", "items": {"$ref": "#/definitions/DuaReciter"}}}}}}, "tags": ["web"]}, "parameters": [{"name": "slug", "in": "path", "required": true, "type": "string"}]}, "/web/quran-qaris/": {"get": {"operationId": "web_quran-qaris_list", "description": "", "parameters": [{"name": "type", "in": "query", "type": "string", "enum": ["reciter", "translation"]}], "responses": {"200": {"description": ""}}, "tags": ["web"]}, "parameters": []}, "/web/quran-surah/{surah_id}/": {"get": {"operationId": "web_quran-surah_read", "description": "API view that returns all verses from a specific Surah with translations\nbased on the language_code query parameter", "parameters": [{"name": "limit", "in": "query", "description": "Number of results to return per page.", "required": false, "type": "integer"}, {"name": "offset", "in": "query", "description": "The initial index from which to return the results.", "required": false, "type": "integer"}, {"name": "language_code", "in": "query", "type": "string", "default": "en"}], "responses": {"200": {"description": "", "schema": {"required": ["count", "results"], "type": "object", "properties": {"count": {"type": "integer"}, "next": {"type": "string", "format": "uri", "x-nullable": true}, "previous": {"type": "string", "format": "uri", "x-nullable": true}, "results": {"type": "array", "items": {"$ref": "#/definitions/QuranSurahDetailVerse"}}}}}}, "tags": ["web"]}, "parameters": [{"name": "surah_id", "in": "path", "required": true, "type": "string"}]}}, "definitions": {"Supporter": {"required": ["title"], "type": "object", "properties": {"title": {"title": "Title", "type": "string", "maxLength": 255, "minLength": 1}, "url": {"title": "Url", "description": "https://example.com", "type": "string", "maxLength": 255, "x-nullable": true}, "logo": {"title": "Logo", "type": "string", "readOnly": true}}}, "AboutService": {"required": ["description", "language", "service", "supporters"], "type": "object", "properties": {"description": {"title": "Description", "type": "string", "minLength": 1}, "language": {"title": "Language", "type": "string", "minLength": 1}, "service": {"title": "Service", "type": "string", "enum": ["main", "hussainiyah", "quran", "mafatih", "qiblah", "ahkam", "calendar", "talk", "meet", "library", "hadis", "account"]}, "supporters": {"type": "array", "items": {"$ref": "#/definitions/Supporter"}}}}, "Activity": {"required": ["usage_duration"], "type": "object", "properties": {"service": {"title": "Service", "type": "string", "maxLength": 100, "x-nullable": true}, "usage_duration": {"title": "Usage duration", "type": "string"}, "entered_at": {"title": "Entered at", "type": "string", "format": "date-time"}, "additional_info": {"title": "Additional info", "type": "object"}}}, "AppleAuth": {"required": ["id_token", "server_auth_token", "mobile_device_id"], "type": "object", "properties": {"id_token": {"title": "Id token", "type": "string", "maxLength": 9000, "minLength": 1}, "server_auth_token": {"title": "Server auth token", "type": "string", "maxLength": 9000, "minLength": 1}, "mobile_device_id": {"title": "Mobile device id", "type": "string", "maxLength": 255, "minLength": 1}, "name": {"title": "Name", "type": "string", "maxLength": 255, "x-nullable": true}, "avatar": {"title": "~ Avatar", "type": "string", "x-nullable": true}, "fcm": {"title": "Fcm", "type": "string", "x-nullable": true}, "publisher_in": {"title": "Publisher in", "type": "string", "readOnly": true}, "token": {"title": "Token", "type": "string", "readOnly": true, "minLength": 1}}}, "GoogleAuth": {"required": ["email", "name", "mobile_device_id", "server_auth_token", "id_token"], "type": "object", "properties": {"email": {"title": "Email", "type": "string", "x-nullable": true}, "name": {"title": "Name", "type": "string", "maxLength": 255, "x-nullable": true}, "mobile_device_id": {"title": "Mobile device id", "type": "string", "maxLength": 500, "x-nullable": true}, "avatar": {"title": "~ Avatar", "type": "string", "x-nullable": true}, "server_auth_token": {"title": "Server auth token", "type": "string", "maxLength": 9000, "minLength": 1}, "id_token": {"title": "Id token", "type": "string", "maxLength": 9000, "minLength": 1}, "fcm": {"title": "Fcm", "type": "string", "x-nullable": true}, "publisher_in": {"title": "Publisher in", "type": "string", "readOnly": true}}}, "GuestUser": {"required": ["mobile_device_id"], "type": "object", "properties": {"lat": {"title": "Lat", "type": "string", "maxLength": 255, "x-nullable": true}, "lon": {"title": "Lon", "type": "string", "maxLength": 255, "x-nullable": true}, "mobile_device_id": {"title": "Mobile device id", "type": "string", "x-nullable": true}, "language": {"title": "Language", "type": "string", "x-nullable": true}, "cpu_type": {"title": "Cpu type", "type": "string", "maxLength": 64, "x-nullable": true}, "model_name": {"title": "Model name", "type": "string", "maxLength": 120, "x-nullable": true}, "os_platform": {"title": "Os platform", "type": "string", "maxLength": 120, "x-nullable": true}, "screen_size": {"title": "Screen size", "type": "string", "maxLength": 120, "x-nullable": true}, "device_brand": {"title": "Device brand", "type": "string", "maxLength": 120, "x-nullable": true}, "timezone": {"title": "Timezone", "type": "string", "x-nullable": true}, "api_version": {"title": "Api version", "type": "string", "x-nullable": true}, "fcm": {"title": "Firebase token", "type": "string", "maxLength": 255, "x-nullable": true}, "location_method": {"title": "Location method", "type": "string", "x-nullable": true}}}, "PhoneAuth": {"required": ["phone_number", "mobile_device_id"], "type": "object", "properties": {"phone_number": {"title": "Phone number", "type": "string", "maxLength": 254, "x-nullable": true}, "lat": {"title": "Lat", "type": "string", "maxLength": 255, "x-nullable": true}, "lon": {"title": "Lon", "type": "string", "maxLength": 255, "x-nullable": true}, "mobile_device_id": {"title": "Mobile device id", "type": "string", "maxLength": 500, "x-nullable": true}, "cpu_type": {"title": "Cpu type", "type": "string", "maxLength": 64, "x-nullable": true}, "model_name": {"title": "Model name", "type": "string", "maxLength": 120, "x-nullable": true}, "os_platform": {"title": "Os platform", "type": "string", "maxLength": 120, "x-nullable": true}, "screen_size": {"title": "Screen size", "type": "string", "maxLength": 120, "x-nullable": true}, "device_brand": {"title": "Device brand", "type": "string", "maxLength": 120, "x-nullable": true}, "timezone": {"title": "Timezone", "type": "string", "x-nullable": true}, "api_version": {"title": "Api version", "type": "string", "x-nullable": true}, "fcm": {"title": "Fcm", "type": "string", "x-nullable": true}, "location_method": {"title": "Location method", "type": "string", "x-nullable": true}}}, "MergeAccount": {"required": ["method", "value"], "type": "object", "properties": {"method": {"title": "Method", "type": "string", "enum": ["phone", "email"]}, "value": {"title": "Value", "type": "string", "minLength": 1}}}, "MergeVerify": {"required": ["phone_number", "code"], "type": "object", "properties": {"phone_number": {"title": "Phone number", "type": "string", "minLength": 1}, "code": {"title": "Code", "type": "string", "minLength": 1}}}, "UserProfile": {"type": "object", "properties": {"name": {"title": "Name", "type": "string", "minLength": 1}, "avatar": {"title": "Avatar", "type": "string", "x-nullable": true}, "email": {"title": "Email", "type": "string", "format": "email", "readOnly": true, "minLength": 1}, "phone_number": {"title": "Phone number", "type": "string", "readOnly": true, "minLength": 1}}}, "PhoneVerify": {"required": ["phone_number", "user_id", "code"], "type": "object", "properties": {"phone_number": {"title": "Phone number", "type": "string", "maxLength": 254, "x-nullable": true}, "user_id": {"title": "User id", "type": "string", "maxLength": 10, "minLength": 1}, "code": {"title": "Code", "type": "string", "maxLength": 5, "minLength": 1}}}, "IPGeolocation": {"type": "object", "properties": {"ip": {"title": "Ip", "type": "string", "readOnly": true, "minLength": 1}, "country": {"title": "Country", "type": "string", "readOnly": true, "maxLength": 100, "x-nullable": true}, "country_code": {"title": "Country code", "type": "string", "readOnly": true, "maxLength": 10, "x-nullable": true}, "city": {"title": "City", "type": "string", "readOnly": true, "maxLength": 100, "x-nullable": true}, "latitude": {"title": "Latitude", "type": "number", "readOnly": true, "x-nullable": true}, "longitude": {"title": "Longitude", "type": "number", "readOnly": true, "x-nullable": true}, "accuracy_radius": {"title": "Accuracy radius", "type": "integer", "readOnly": true, "x-nullable": true}, "time_zone": {"title": "Time zone", "type": "string", "readOnly": true, "maxLength": 100, "x-nullable": true}, "postal_code": {"title": "Postal code", "type": "string", "readOnly": true, "maxLength": 20, "x-nullable": true}}}, "ReverseGeolocationResponse": {"type": "object", "properties": {"latitude": {"title": "Latitude", "type": "number", "readOnly": true}, "longitude": {"title": "Longitude", "type": "number", "readOnly": true}, "city": {"title": "City", "type": "string", "readOnly": true, "maxLength": 100, "minLength": 1, "x-nullable": true}, "country": {"title": "Country", "type": "string", "readOnly": true, "maxLength": 100, "minLength": 1, "x-nullable": true}, "country_code": {"title": "Country code", "type": "string", "readOnly": true, "maxLength": 10, "minLength": 1, "x-nullable": true}, "accuracy_radius": {"title": "Accuracy radius", "type": "integer", "readOnly": true, "x-nullable": true}, "time_zone": {"title": "Time zone", "type": "string", "readOnly": true, "maxLength": 100, "x-nullable": true}, "postal_code": {"title": "Postal code", "type": "string", "readOnly": true, "maxLength": 20, "x-nullable": true}}}, "LocationHistory": {"required": ["lat", "lon"], "type": "object", "properties": {"id": {"title": "ID", "type": "integer", "readOnly": true}, "lat": {"title": "Lat", "type": "number"}, "lon": {"title": "Lon", "type": "number"}, "country": {"title": "Country", "type": "string", "maxLength": 255, "x-nullable": true}, "city": {"title": "City", "type": "string", "maxLength": 255, "x-nullable": true}, "selected_manually": {"title": "Selected manually", "type": "boolean", "x-nullable": true}, "ip": {"title": "Ip", "type": "string", "maxLength": 255, "minLength": 1, "x-nullable": true}, "timezone": {"title": "Timezone", "type": "string", "maxLength": 60, "x-nullable": true}}}, "UserNotification": {"required": ["service", "title", "message"], "type": "object", "properties": {"id": {"title": "ID", "type": "integer", "readOnly": true}, "service": {"title": "Service", "type": "string", "minLength": 1}, "title": {"title": "Title", "type": "string", "minLength": 1}, "message": {"title": "Message", "type": "string", "minLength": 1}, "data": {"title": "Data", "type": "string", "readOnly": true}, "image": {"title": "Image", "type": "string", "readOnly": true}, "is_read": {"title": "Is Read", "type": "boolean"}, "created_at": {"title": "Created At", "type": "string", "format": "date-time", "readOnly": true}, "notif_data": {"title": "Notif data", "type": "string", "readOnly": true}}}, "Provider": {"required": ["public_name", "description", "service", "birthdate", "phone_number", "wa_number"], "type": "object", "properties": {"public_name": {"title": "Public name", "type": "string", "maxLength": 255, "minLength": 1}, "description": {"title": "Description", "type": "string", "minLength": 1}, "service": {"title": "Service", "type": "string", "enum": ["hussainiya", "net", "library", "talk", "shop", "travel", "meet", "habibnet"]}, "birthdate": {"title": "Birthdate", "type": "string", "format": "date"}, "phone_number": {"title": "Phone number", "type": "string", "minLength": 1}, "wa_number": {"title": "Wa number", "type": "string", "minLength": 1}, "social_medias": {"title": "Social medias", "description": "[{\"type\": \"instagram\", \"link\": \"https://www.instagram.com\"}]", "type": "object", "default": []}, "status": {"title": "Status", "type": "string", "enum": ["pending", "rejected", "accepted"], "readOnly": true}}}, "UserSettings": {"type": "object", "properties": {"settings": {"title": "Settings", "type": "string", "x-nullable": true}, "is_reminder": {"title": "Reminder Active", "type": "boolean"}, "notification_settings": {"description": "List of notification services: hussainiyah, meet, talk, library", "type": "array", "items": {"type": "string", "minLength": 1}, "default": ["hussainiyah", "meet", "talk", "library"]}}}, "ReviewList": {"required": ["platform", "review_id", "last_modified_ts", "app_identifier"], "type": "object", "properties": {"id": {"title": "ID", "type": "integer", "readOnly": true}, "platform": {"title": "Platform", "type": "string", "enum": ["google_play", "app_store", "whatsapp", "telegram", "habib_talk"]}, "review_id": {"title": "Review id", "type": "string", "maxLength": 255, "minLength": 1}, "author_name": {"title": "Author name", "type": "string", "maxLength": 255, "x-nullable": true}, "text": {"title": "Text", "type": "string"}, "review_status": {"title": "Review status", "type": "string", "enum": ["pending", "responded", "escalated", "resolved"]}, "needs_human_intervention": {"title": "Needs human intervention", "type": "boolean"}, "last_modified_ts": {"title": "Last modified ts", "type": "integer", "maximum": 9223372036854775807, "minimum": -9223372036854775808}, "created_at": {"title": "Created at", "type": "string", "format": "date-time", "readOnly": true}, "user_identifier": {"title": "User identifier", "description": "Phone number for WhatsApp, Chat ID for Telegram, etc.", "type": "string", "maxLength": 255}, "app_identifier": {"title": "App identifier", "description": "Package name, bundle ID یا شناسه کانال/گروه بسته به پلتفرم", "type": "string", "maxLength": 255, "minLength": 1}, "rating": {"title": "Rating", "type": "integer", "maximum": 32767, "minimum": 0, "x-nullable": true}}}, "ReviewDetail": {"required": ["platform", "app_identifier", "review_id", "last_modified_ts"], "type": "object", "properties": {"id": {"title": "ID", "type": "integer", "readOnly": true}, "platform": {"title": "Platform", "type": "string", "enum": ["google_play", "app_store", "whatsapp", "telegram", "habib_talk"]}, "app_identifier": {"title": "App identifier", "description": "Package name, bundle ID یا شناسه کانال/گروه بسته به پلتفرم", "type": "string", "maxLength": 255, "minLength": 1}, "user_identifier": {"title": "User identifier", "description": "Phone number for WhatsApp, Chat ID for Telegram, etc.", "type": "string", "maxLength": 255}, "review_id": {"title": "Review id", "type": "string", "maxLength": 255, "minLength": 1}, "author_name": {"title": "Author name", "type": "string", "maxLength": 255, "x-nullable": true}, "rating": {"title": "Rating", "type": "integer", "maximum": 32767, "minimum": 0, "x-nullable": true}, "title": {"title": "Title", "type": "string", "maxLength": 255}, "text": {"title": "Text", "type": "string"}, "device": {"title": "Device", "type": "string", "maxLength": 255}, "reviewer_language": {"title": "Reviewer language", "type": "string", "maxLength": 10}, "android_os_version": {"title": "Android os version", "type": "integer", "maximum": 32767, "minimum": 0, "x-nullable": true}, "app_version_code": {"title": "App version code", "type": "integer", "maximum": 2147483647, "minimum": 0, "x-nullable": true}, "app_version_name": {"title": "App version name", "type": "string", "maxLength": 50}, "device_product_name": {"title": "Device product name", "type": "string", "maxLength": 255}, "device_manufacturer": {"title": "Device manufacturer", "type": "string", "maxLength": 100}, "device_class": {"title": "Device class", "type": "string", "maxLength": 50}, "screen_width_px": {"title": "Screen width px", "type": "integer", "maximum": 2147483647, "minimum": 0, "x-nullable": true}, "screen_height_px": {"title": "Screen height px", "type": "integer", "maximum": 2147483647, "minimum": 0, "x-nullable": true}, "screen_density_dpi": {"title": "Screen density dpi", "type": "integer", "maximum": 2147483647, "minimum": 0, "x-nullable": true}, "ram_mb": {"title": "Ram mb", "type": "integer", "maximum": 2147483647, "minimum": 0, "x-nullable": true}, "last_modified_ts": {"title": "Last modified ts", "type": "integer", "maximum": 9223372036854775807, "minimum": -9223372036854775808}, "raw_data": {"title": "Raw data", "type": "object", "x-nullable": true}, "sent_to_telegram": {"title": "Sent to telegram", "type": "boolean"}, "category": {"title": "Category", "type": "string", "enum": ["appreciation", "inspiring", "feature_request", "bug_report", "account_issue", "financial_issue", "content_complaint", "critical", "general_question", "spam", "other"]}, "review_status": {"title": "Review status", "type": "string", "enum": ["pending", "responded", "escalated", "resolved"]}, "needs_human_intervention": {"title": "Needs human intervention", "type": "boolean"}, "prevent_auto_reply": {"title": "غیرفعال‌سازی پاسخ خودکار (بلاک مکالمه اتوماتیک)", "type": "boolean"}, "conversation_history": {"title": "Conversation history", "description": "List of message dicts for this user's entire conversation", "type": "object"}, "created_at": {"title": "Created at", "type": "string", "format": "date-time", "readOnly": true}}}, "talk_provider_profile": {"required": ["languages", "avatar"], "type": "object", "properties": {"full_name": {"title": "Full name", "type": "string", "maxLength": 254, "minLength": 1, "x-nullable": true}, "bio": {"title": "Bio", "type": "string", "maxLength": 512, "x-nullable": true}, "birthdate": {"title": "Birthdate", "type": "string", "format": "date", "x-nullable": true}, "email": {"title": "Email", "type": "string", "format": "email", "maxLength": 254, "x-nullable": true}, "wa_number": {"title": "Whatsapp number", "type": "string", "maxLength": 255, "x-nullable": true}, "institution_name": {"title": "Name", "description": "Name of the institute", "type": "string", "maxLength": 255, "x-nullable": true}, "languages": {"type": "array", "items": {"type": "string"}}, "avatar": {"title": "Avatar", "type": "string", "minLength": 1}, "social_medias": {"title": "Social medias", "description": "Provider social media profiles", "type": "object"}}}, "BookmarkSerializers": {"required": ["service", "content_id"], "type": "object", "properties": {"id": {"title": "ID", "type": "integer", "readOnly": true}, "related_object": {"title": "Related object", "type": "string", "readOnly": true}, "service": {"title": "Service", "type": "string", "maxLength": 255, "minLength": 1}, "content_id": {"title": "Content id", "type": "string", "maxLength": 255, "minLength": 1}, "text": {"title": "Text", "type": "string", "x-nullable": true}, "status": {"title": "Status", "type": "boolean", "readOnly": true}, "created_at": {"title": "Created at", "type": "string", "format": "date-time", "readOnly": true}, "updated_at": {"title": "Updated at", "type": "string", "format": "date-time", "readOnly": true}, "user": {"title": "User", "type": "integer", "readOnly": true}}}, "Calendar": {"required": ["type"], "type": "object", "properties": {"id": {"title": "ID", "type": "integer", "readOnly": true}, "title": {"title": "Title", "type": "string", "readOnly": true}, "countries": {"title": "Countries", "type": "string", "readOnly": true}, "type": {"title": "Type", "type": "string", "minLength": 1}, "event_type": {"title": "Event type", "type": "string", "enum": ["national", "international", "religious"], "x-nullable": true}, "holiday_in_countries": {"title": "Holiday in countries", "type": "string", "readOnly": true}, "dates": {"title": "Dates", "type": "string", "readOnly": true}, "is_yearly": {"title": "Is yearly", "description": "check this field if event is annually", "type": "boolean"}, "has_occasion_detail": {"title": "Has occasion detail", "type": "string", "readOnly": true}}}, "Language": {"required": ["name", "code"], "type": "object", "properties": {"name": {"title": "Name", "type": "string", "maxLength": 64, "minLength": 1}, "code": {"title": "Code", "type": "string", "maxLength": 2, "minLength": 1}}}, "MasaelCategories": {"required": ["language"], "type": "object", "properties": {"id": {"title": "ID", "type": "integer", "readOnly": true}, "name": {"title": "Name", "type": "string", "readOnly": true}, "thumbnail": {"title": "Thumbnail", "type": "string", "readOnly": true}, "masael_index": {"title": "Masael index", "type": "string", "readOnly": true}, "language": {"$ref": "#/definitions/Language"}, "children": {"title": "Children", "type": "string", "readOnly": true}}}, "CheckupParameterDetailSerializerV2": {"type": "object", "properties": {"id": {"title": "ID", "type": "integer", "readOnly": true}, "title": {"title": "Title", "type": "string", "readOnly": true}, "description": {"title": "Description", "type": "string", "readOnly": true}, "hadith": {"title": "Hadith", "type": "string", "readOnly": true}}}, "CommandHelp": {"required": ["service"], "type": "object", "properties": {"service": {"title": "Service", "type": "string", "enum": ["hussainiyah", "library", "Talk", "meet", "mafatih", "hadith", "quran", "ahkam", "coin", "calendar", "qiblah", "elalHabib", "main"]}, "description": {"title": "Description", "type": "string", "readOnly": true}}}, "CommandSuggestion": {"required": ["language_code"], "type": "object", "properties": {"id": {"title": "ID", "type": "integer", "readOnly": true}, "title": {"title": "Title", "type": "string", "x-nullable": true}, "language_code": {"title": "Language code", "description": "Language code (e.g., en, fa)", "type": "string", "maxLength": 10, "minLength": 1}}}, "DonateUser": {"required": ["amount"], "type": "object", "properties": {"amount": {"title": "Amount", "type": "string", "format": "decimal"}, "phone": {"title": "Phone", "type": "string", "maxLength": 255, "x-nullable": true}, "pay_method": {"title": "Pay method", "type": "string", "enum": ["paypal", "vtb", "stripe"], "default": "stripe"}}}, "DontKillApp": {"required": ["brand", "sdk_version", "description"], "type": "object", "properties": {"brand": {"type": "array", "items": {"title": "Brand", "type": "string", "maxLength": 100, "minLength": 1}}, "sdk_version": {"type": "array", "items": {"title": "Sdk version", "type": "integer", "maximum": 35, "minimum": 0}}, "description": {"title": "Description", "type": "string", "minLength": 1}}}, "EightmagCategories": {"required": ["name"], "type": "object", "properties": {"url": {"title": "Url", "type": "string", "readOnly": true}, "name": {"title": "Name", "type": "string", "maxLength": 512, "minLength": 1}, "thumbnails": {"title": "Thumbnails", "type": "string", "readOnly": true}, "children": {"title": "Children", "type": "string", "readOnly": true}}}, "EightmagCategoriesInList": {"required": ["name"], "type": "object", "properties": {"name": {"title": "Name", "type": "string", "maxLength": 512, "minLength": 1}, "url": {"title": "Url", "type": "string", "readOnly": true}}}, "EightmagList": {"required": ["title"], "type": "object", "properties": {"url": {"title": "Url", "type": "string", "readOnly": true}, "categories": {"type": "array", "items": {"$ref": "#/definitions/EightmagCategoriesInList"}, "readOnly": true}, "thumbnail": {"title": "Thumbnail", "type": "string", "readOnly": true}, "event": {"$ref": "#/definitions/Calendar"}, "created_at": {"title": "Created at", "type": "string", "readOnly": true}, "title": {"title": "Title", "type": "string", "maxLength": 255, "minLength": 1}, "summary": {"title": "Summary", "description": "we use it for seo and short description of post", "type": "string", "x-nullable": true}, "as_special": {"title": "As special", "description": "enable as special blog for showing in home page", "type": "boolean"}, "pin_top": {"title": "Pin top", "description": "چسباندن پست به بالا", "type": "boolean"}, "status": {"title": "Status", "description": "model status to be shown or not", "type": "boolean"}, "author": {"title": "Author", "type": "string", "maxLength": 119, "minLength": 1, "x-nullable": true}, "like_count": {"title": "Like count", "type": "integer", "maximum": 2147483647, "minimum": 0}, "source": {"title": "Source", "type": "integer", "x-nullable": true}, "publisher": {"title": "Publisher", "type": "integer", "x-nullable": true}}}, "EightmagDetails": {"required": ["title", "content"], "type": "object", "properties": {"url": {"title": "Url", "type": "string", "readOnly": true}, "thumbnail": {"title": "Thumbnail", "type": "string", "readOnly": true}, "categories": {"type": "array", "items": {"$ref": "#/definitions/EightmagCategoriesInList"}, "readOnly": true}, "author": {"title": "Author", "type": "string", "readOnly": true}, "event": {"$ref": "#/definitions/Calendar"}, "title": {"title": "Title", "type": "string", "maxLength": 255, "minLength": 1}, "content": {"title": "Content", "type": "string", "minLength": 1}, "summary": {"title": "Summary", "description": "we use it for seo and short description of post", "type": "string", "x-nullable": true}, "as_special": {"title": "As special", "description": "enable as special blog for showing in home page", "type": "boolean"}, "pin_top": {"title": "Pin top", "description": "چسباندن پست به بالا", "type": "boolean"}, "status": {"title": "Status", "description": "model status to be shown or not", "type": "boolean"}, "created_at": {"title": "Created at", "type": "string", "format": "date-time", "readOnly": true}, "like_count": {"title": "Like count", "type": "integer", "maximum": 2147483647, "minimum": 0}, "source": {"title": "Source", "type": "integer", "x-nullable": true}, "publisher": {"title": "Publisher", "type": "integer", "x-nullable": true}}}, "ElalHabib": {"type": "object", "properties": {"title": {"title": "نام موکب", "type": "object"}, "nationalities": {"type": "array", "items": {"type": "string", "x-nullable": true}, "default": [], "x-nullable": true}, "capacity": {"title": "ظرفیت اسکان", "type": "integer", "maximum": 32767, "minimum": 0, "x-nullable": true}, "options": {"title": "Options", "type": "string", "readOnly": true}, "after_amood": {"title": "After amood", "type": "string", "readOnly": true}, "events": {"title": "Events", "type": "string", "readOnly": true}, "description": {"title": "توضیحات", "type": "string", "x-nullable": true}}}, "ElalHabibSingerInList": {"required": ["slug"], "type": "object", "properties": {"name": {"title": "Name", "type": "string", "readOnly": true}, "slug": {"title": "Slug", "type": "string", "format": "slug", "maxLength": 255, "minLength": 1}}}, "DiscountCodeUsage": {"type": "object", "properties": {"id": {"title": "ID", "type": "integer", "readOnly": true}, "discount_code": {"title": "Discount code", "type": "string", "readOnly": true, "minLength": 1}, "user_username": {"title": "User username", "type": "string", "readOnly": true, "minLength": 1}, "service_name": {"title": "Service name", "type": "string", "readOnly": true, "minLength": 1}, "object_id": {"title": "Object ID", "type": "integer", "readOnly": true}, "original_price": {"title": "Original Price", "type": "string", "format": "decimal", "readOnly": true}, "discounted_price": {"title": "Discounted Price", "type": "string", "format": "decimal", "readOnly": true}, "discount_amount": {"title": "Discount Amount", "type": "string", "format": "decimal", "readOnly": true}, "used_at": {"title": "Used At", "type": "string", "format": "date-time", "readOnly": true}}}, "Package": {"required": ["coin_count", "price"], "type": "object", "properties": {"id": {"title": "ID", "type": "integer", "readOnly": true}, "package_type": {"title": "Package type", "type": "string", "enum": ["normal", "timely", "evently"]}, "coin_count": {"title": "Coin count", "type": "integer", "maximum": 32767, "minimum": 0}, "purchase_id": {"title": "Purchase ID", "description": "Unique identifier for products purchased on Google Play and App Store, used for tracking transactions.", "type": "string", "maxLength": 55, "x-nullable": true}, "price": {"title": "Price", "type": "string", "format": "decimal"}, "off_price": {"title": "Off price", "description": "Optional", "type": "string", "format": "decimal", "x-nullable": true}, "discount_percentage": {"title": "Discount percentage", "type": "string", "readOnly": true}, "expiration_duration_days": {"title": "Expiration duration days", "type": "integer", "maximum": 2147483647, "minimum": 0, "x-nullable": true}, "event_name": {"title": "Event name", "type": "string", "maxLength": 100, "x-nullable": true}}}, "Support": {"required": ["type", "description", "whatsapp_number"], "type": "object", "properties": {"id": {"title": "ID", "type": "integer", "readOnly": true}, "user": {"title": "User", "type": "integer", "readOnly": true}, "type": {"title": "Type", "type": "string", "enum": ["technical", "billing", "general"]}, "description": {"title": "Description", "type": "string", "minLength": 1}, "whatsapp_number": {"title": "Whatsapp number", "type": "string", "maxLength": 15, "minLength": 1}, "created_at": {"title": "Created at", "type": "string", "format": "date-time", "readOnly": true}, "updated_at": {"title": "Updated at", "type": "string", "format": "date-time", "readOnly": true}, "service": {"title": "Service", "type": "string", "minLength": 1}}}, "Transactions": {"required": ["payment_method", "price", "coin_count"], "type": "object", "properties": {"id": {"title": "ID", "type": "integer", "readOnly": true}, "status": {"title": "Status", "type": "string", "enum": ["pending", "success", "failed"]}, "payment_method": {"title": "Payment method", "type": "string", "maxLength": 20, "minLength": 1}, "price": {"title": "Price", "type": "integer"}, "coin_count": {"title": "Coin count", "type": "integer"}, "created_at": {"title": "Created at", "type": "string", "format": "date-time", "readOnly": true}, "updated_at": {"title": "Updated at", "type": "string", "format": "date-time", "readOnly": true}, "package": {"$ref": "#/definitions/Package"}}}, "UserCoinUsage": {"required": ["package", "coin_count"], "type": "object", "properties": {"id": {"title": "ID", "type": "integer", "readOnly": true}, "package": {"$ref": "#/definitions/Package"}, "service_details": {"title": "Service details", "type": "object", "readOnly": true}, "at_time": {"title": "At time", "type": "string", "format": "date-time", "readOnly": true}, "coin_count": {"title": "Coin count", "type": "integer", "maximum": 32767, "minimum": 0}}}, "UserPackage": {"type": "object", "properties": {"id": {"title": "ID", "type": "integer", "readOnly": true}, "created_at": {"title": "Created at", "type": "string", "format": "date-time", "readOnly": true}, "coin_count": {"title": "Coin count", "type": "integer", "readOnly": true}, "price": {"title": "Price", "type": "integer", "readOnly": true}, "used_count": {"title": "Used count", "type": "integer", "readOnly": true}, "remaining_count": {"title": "Remaining count", "type": "integer", "readOnly": true}, "package": {"$ref": "#/definitions/Package"}}}, "MeetSerializer": {"required": ["name", "online_users_count"], "type": "object", "properties": {"id": {"title": "ID", "type": "integer", "readOnly": true}, "name": {"title": "Name", "description": "Name of the meet", "type": "string", "maxLength": 255, "minLength": 1}, "description": {"title": "Description", "description": "Description of the meet", "type": "string", "x-nullable": true}, "next_session_subject": {"title": "Next Session Subject", "description": "Subject of the next session", "type": "string", "maxLength": 255, "x-nullable": true}, "next_session_schedule": {"title": "Next Session Schedule", "description": "Scheduled date and time for the next session", "type": "string", "format": "date-time", "x-nullable": true}, "is_suggested": {"title": "Is Suggested", "description": "Is this meet suggested?", "type": "boolean"}, "provider": {"title": "Provider", "type": "string", "readOnly": true}, "is_free": {"title": "Is Free", "description": "Is this meet free?", "type": "boolean"}, "price": {"title": "Price", "description": "Price of the meet if it is not free", "type": "string", "format": "decimal", "x-nullable": true}, "is_live": {"title": "Is Live", "description": "Is the meet currently live?", "type": "boolean"}, "is_closed": {"title": "Is closed", "type": "string", "readOnly": true}, "online_users_count": {"title": "Online users count", "type": "integer"}, "language": {"title": "Language", "type": "string", "readOnly": true}, "categories": {"title": "Categories", "description": "Categories related to the meet", "type": "string", "maxLength": 255, "x-nullable": true}, "organizer": {"title": "Organizer", "type": "string", "readOnly": true}, "is_provider": {"title": "Is provider", "type": "string", "readOnly": true}, "has_access": {"title": "Has access", "type": "string", "readOnly": true}, "is_reminder": {"title": "Is reminder", "type": "string", "readOnly": true}, "live_session_id": {"title": "Live session id", "type": "string", "readOnly": true}, "has_archive": {"title": "Has archive", "type": "string", "readOnly": true}, "has_recordings": {"title": "Has recordings", "type": "string", "readOnly": true}, "access": {"title": "Access", "description": "Access type of the meet (public or private)", "type": "string", "enum": ["public", "private"]}, "password": {"title": "Password", "description": "Password for private meets", "type": "string", "maxLength": 50, "x-nullable": true}}}, "MeetCreate": {"required": ["name", "language"], "type": "object", "properties": {"name": {"title": "Name", "description": "Name of the meet", "type": "string", "maxLength": 255, "minLength": 1}, "price": {"title": "Price", "type": "string", "format": "decimal", "default": "0.00", "x-nullable": true}, "language": {"title": "Language", "type": "string", "minLength": 1}, "description": {"title": "Description", "description": "Description of the meet", "type": "string", "x-nullable": true}, "is_free": {"title": "Is Free", "description": "Is this meet free?", "type": "boolean"}}}, "MeetCreateV2": {"required": ["name", "language"], "type": "object", "properties": {"name": {"title": "Name", "description": "Name of the meet", "type": "string", "maxLength": 255, "minLength": 1}, "price": {"title": "Price", "type": "string", "format": "decimal", "default": "0.00", "x-nullable": true}, "language": {"title": "Language", "type": "string", "minLength": 1}, "description": {"title": "Description", "description": "Description of the meet", "type": "string", "x-nullable": true}, "is_free": {"title": "Is Free", "description": "Is this meet free?", "type": "boolean"}, "access": {"title": "Access", "type": "string", "enum": ["public", "private"], "default": "public"}, "password": {"title": "Password", "type": "string", "maxLength": 50, "x-nullable": true}}}, "MeetProviderProfile": {"required": ["languages"], "type": "object", "properties": {"full_name": {"title": "Full name", "type": "string", "maxLength": 254, "minLength": 1, "x-nullable": true}, "bio": {"title": "Bio", "type": "string", "maxLength": 512, "x-nullable": true}, "birthdate": {"title": "Birthdate", "type": "string", "format": "date", "x-nullable": true}, "email": {"title": "Email", "type": "string", "format": "email", "maxLength": 254, "x-nullable": true}, "wa_number": {"title": "Whatsapp number", "type": "string", "maxLength": 255, "x-nullable": true}, "institution_name": {"title": "Name", "description": "Name of the institute", "type": "string", "maxLength": 255, "x-nullable": true}, "languages": {"type": "array", "items": {"type": "string"}}, "avatar": {"title": "Avatar", "type": "string", "minLength": 1}, "social_medias": {"title": "Social medias", "description": "Provider social media profiles", "type": "object"}}}, "ProviderMeetSerializer": {"type": "object", "properties": {"id": {"title": "ID", "type": "integer", "readOnly": true}, "email": {"title": "Email", "type": "string", "readOnly": true}, "name": {"title": "Name", "type": "string", "readOnly": true}, "avatar": {"title": "Avatar", "type": "string", "readOnly": true}, "bio": {"title": "Bio", "type": "string", "maxLength": 512, "x-nullable": true}, "slogn": {"title": "Bio", "type": "string", "maxLength": 512, "x-nullable": true}}}, "ProviderDetailMeetSerializer": {"type": "object", "properties": {"id": {"title": "ID", "type": "integer", "readOnly": true}, "email": {"title": "Email", "type": "string", "readOnly": true}, "name": {"title": "Name", "type": "string", "readOnly": true}, "avatar": {"title": "Avatar", "type": "string", "readOnly": true}, "slogn": {"title": "Bio", "type": "string", "maxLength": 512, "x-nullable": true}, "bio": {"title": "Bio", "type": "string", "maxLength": 512, "x-nullable": true}, "other_provider_services": {"title": "Other provider services", "type": "string", "readOnly": true}}}, "MeetProviderRoom": {"required": ["name", "reminder_count", "purchase_count"], "type": "object", "properties": {"id": {"title": "ID", "type": "integer", "readOnly": true}, "name": {"title": "Name", "description": "Name of the meet", "type": "string", "maxLength": 255, "minLength": 1}, "next_session_subject": {"title": "Next Session Subject", "description": "Subject of the next session", "type": "string", "maxLength": 255, "x-nullable": true}, "next_session_schedule": {"title": "Next Session Schedule", "description": "Scheduled date and time for the next session", "type": "string", "format": "date-time", "x-nullable": true}, "language": {"title": "Language", "type": "string", "readOnly": true}, "is_free": {"title": "Is Free", "description": "Is this meet free?", "type": "boolean"}, "price": {"title": "Price", "description": "Price of the meet if it is not free", "type": "string", "format": "decimal", "x-nullable": true}, "is_closed": {"title": "Is closed", "type": "string", "readOnly": true}, "description": {"title": "Description", "description": "Description of the meet", "type": "string", "x-nullable": true}, "provider": {"title": "Provider", "type": "string", "readOnly": true}, "reminder_count": {"title": "Reminder count", "type": "integer"}, "categories": {"title": "Categories", "description": "Categories related to the meet", "type": "string", "maxLength": 255, "x-nullable": true}, "purchase_count": {"title": "Purchase count", "type": "integer"}, "archive_count": {"title": "Archive count", "type": "string", "readOnly": true}, "is_active": {"title": "Is Active", "description": "Is this meet currently active?", "type": "boolean"}, "status": {"title": "Status", "type": "string", "readOnly": true}, "access": {"title": "Access", "type": "string", "enum": ["public", "private"], "readOnly": true}, "password": {"title": "Password", "type": "string", "readOnly": true, "maxLength": 50, "minLength": 1, "x-nullable": true}}}, "MeetDetailSerializer": {"required": ["name", "online_users_count"], "type": "object", "properties": {"id": {"title": "ID", "type": "integer", "readOnly": true}, "name": {"title": "Name", "description": "Name of the meet", "type": "string", "maxLength": 255, "minLength": 1}, "description": {"title": "Description", "description": "Description of the meet", "type": "string", "x-nullable": true}, "next_session_subject": {"title": "Next Session Subject", "description": "Subject of the next session", "type": "string", "maxLength": 255, "x-nullable": true}, "next_session_schedule": {"title": "Next Session Schedule", "description": "Scheduled date and time for the next session", "type": "string", "format": "date-time", "x-nullable": true}, "is_suggested": {"title": "Is Suggested", "description": "Is this meet suggested?", "type": "boolean"}, "provider": {"title": "Provider", "type": "string", "readOnly": true}, "is_free": {"title": "Is Free", "description": "Is this meet free?", "type": "boolean"}, "price": {"title": "Price", "description": "Price of the meet if it is not free", "type": "string", "format": "decimal", "x-nullable": true}, "is_live": {"title": "Is Live", "description": "Is the meet currently live?", "type": "boolean"}, "is_closed": {"title": "Is closed", "type": "string", "readOnly": true}, "online_users_count": {"title": "Online users count", "type": "integer"}, "language": {"title": "Language", "type": "string", "readOnly": true}, "categories": {"title": "Categories", "description": "Categories related to the meet", "type": "string", "maxLength": 255, "x-nullable": true}, "organizer": {"title": "Organizer", "type": "string", "readOnly": true}, "is_provider": {"title": "Is provider", "type": "string", "readOnly": true}, "live_session_id": {"title": "Live session id", "type": "string", "readOnly": true}, "has_archive": {"title": "Has archive", "type": "string", "readOnly": true}, "recordings": {"title": "Recordings", "type": "string", "readOnly": true}, "access": {"title": "Access", "type": "string", "enum": ["public", "private"]}, "password": {"title": "Password", "type": "string", "maxLength": 50, "x-nullable": true}, "has_recording": {"title": "Has recording", "type": "string", "readOnly": true}}}, "SessionArchiveSerializer": {"required": ["recorded_file", "session_id"], "type": "object", "properties": {"id": {"title": "ID", "type": "integer", "readOnly": true}, "meet": {"title": "Meet", "description": "The meet this session belongs to", "type": "integer", "readOnly": true}, "started_at": {"title": "Started At", "description": "Session start time", "type": "string", "format": "date-time", "readOnly": true}, "ended_at": {"title": "Ended At", "description": "Session end time", "type": "string", "format": "date-time", "readOnly": true, "x-nullable": true}, "recorded_file": {"title": "Recorded file", "type": "string", "minLength": 1}, "subject": {"title": "Subject", "description": "Subject of the session", "type": "string", "readOnly": true, "minLength": 1, "x-nullable": true}, "session_id": {"title": "Session id", "type": "integer"}}}, "ReportSerializer": {"required": ["report_type"], "type": "object", "properties": {"id": {"title": "ID", "type": "integer", "readOnly": true}, "meet_id": {"title": "Meet id", "type": "integer", "readOnly": true}, "description": {"title": "Description", "description": "Description of the report", "type": "string", "x-nullable": true}, "report_type": {"title": "Type", "description": "Type of the report", "type": "string", "enum": ["bug", "feedback", "other"]}}}, "SessionCreate": {"required": ["name", "is_start"], "type": "object", "properties": {"name": {"title": "Name", "type": "string", "minLength": 1}, "date_time": {"title": "Date time", "description": "Enter the date and time in the format YYYY-MM-DD HH:MM:SS", "type": "string", "format": "date-time", "x-nullable": true}, "is_start": {"title": "Is start", "type": "boolean"}}}, "SessionRecordingCreateUpdateSerializer": {"required": ["session", "file", "recording_type"], "type": "object", "properties": {"id": {"title": "ID", "type": "integer", "readOnly": true}, "title": {"title": "Title", "description": "Title of the recording", "type": "string", "maxLength": 255, "x-nullable": true}, "session": {"title": "Session", "type": "integer"}, "file": {"title": "File", "type": "string", "minLength": 1}, "file_time": {"title": "File Duration", "description": "Duration of the recording file", "type": "string", "x-nullable": true}, "recording_type": {"title": "Recording type", "type": "string", "enum": ["voice", "video"]}, "thumbnail": {"title": "Thumbnail", "type": "string", "minLength": 1, "x-nullable": true}, "created_at": {"title": "Created At", "description": "Time the recording was created", "type": "string", "format": "date-time", "readOnly": true}, "updated_at": {"title": "Updated At", "description": "The datetime when the recording was last updated", "type": "string", "format": "date-time", "readOnly": true}}}, "SessionFileUpload": {"type": "object", "properties": {"recorded_file": {"title": "Recorded File", "description": "File of the recorded session", "type": "string", "readOnly": true, "x-nullable": true, "format": "uri"}}}, "CenterTag": {"required": ["id", "name"], "type": "object", "properties": {"id": {"title": "Id", "type": "integer"}, "name": {"title": "Name", "type": "object"}}}, "CenterList": {"required": ["name", "slogan"], "type": "object", "properties": {"id": {"title": "ID", "type": "integer", "readOnly": true}, "name": {"title": "Name", "type": "string", "maxLength": 255, "minLength": 1}, "slogan": {"title": "Slogan", "type": "string", "maxLength": 255, "minLength": 1}, "avatar": {"title": "Avatar", "type": "string", "readOnly": true}, "tags": {"type": "array", "items": {"$ref": "#/definitions/CenterTag"}, "readOnly": true}, "country": {"title": "Country", "type": "string", "maxLength": 255, "x-nullable": true}, "city": {"title": "City", "type": "string", "maxLength": 255, "x-nullable": true}, "lat": {"title": "Lat", "type": "number", "x-nullable": true}, "lon": {"title": "Lon", "type": "number", "x-nullable": true}, "distance": {"title": "Distance", "type": "string", "readOnly": true}, "is_bookmarked": {"title": "Is bookmarked", "type": "string", "readOnly": true}}}, "CenterDetail": {"required": ["name", "slogan"], "type": "object", "properties": {"id": {"title": "ID", "type": "integer", "readOnly": true}, "name": {"title": "Name", "type": "string", "maxLength": 255, "minLength": 1}, "slogan": {"title": "Slogan", "type": "string", "maxLength": 255, "minLength": 1}, "avatar": {"title": "Avatar", "type": "string", "readOnly": true}, "header_image": {"title": "Header image", "type": "string", "readOnly": true}, "tags": {"type": "array", "items": {"$ref": "#/definitions/CenterTag"}, "readOnly": true}, "country": {"title": "Country", "type": "string", "maxLength": 255, "x-nullable": true}, "city": {"title": "City", "type": "string", "maxLength": 255, "x-nullable": true}, "lat": {"title": "Lat", "type": "number", "x-nullable": true}, "lon": {"title": "Lon", "type": "number", "x-nullable": true}, "address": {"title": "Address", "type": "string", "maxLength": 512, "x-nullable": true}, "website": {"title": "Website", "type": "string", "maxLength": 190, "x-nullable": true}, "phone_numbers": {"title": "Phone numbers", "type": "string", "maxLength": 512, "x-nullable": true}, "principal_name": {"title": "Principal name", "type": "string", "maxLength": 255, "x-nullable": true}, "working_hours": {"title": "Working hours", "type": "object"}, "social_medias": {"title": "Social medias", "type": "object"}, "congregations_prayers": {"title": "Congregations prayers", "type": "object"}, "imam_name": {"title": "Imam name", "type": "string", "maxLength": 255, "x-nullable": true}, "about_center": {"title": "About center", "type": "string", "x-nullable": true}, "google_map_link": {"title": "Google map link", "type": "string", "maxLength": 512, "x-nullable": true}, "stars": {"title": "Stars", "type": "number", "x-nullable": true}, "gallery": {"title": "Gallery", "type": "string", "readOnly": true}, "distance": {"title": "Distance", "type": "string", "readOnly": true}, "is_bookmarked": {"title": "Is bookmarked", "type": "string", "readOnly": true}}}, "CenterEvent": {"required": ["title", "date", "description"], "type": "object", "properties": {"id": {"title": "ID", "type": "integer", "readOnly": true}, "title": {"title": "Title", "type": "string", "maxLength": 119, "minLength": 1}, "start_time": {"title": "Start time", "type": "string", "format": "date-time", "x-nullable": true}, "end_time": {"title": "End time", "type": "string", "format": "date-time", "x-nullable": true}, "date": {"title": "Date", "type": "string", "format": "date-time"}, "description": {"title": "Description", "type": "string", "minLength": 1}, "image": {"title": "Image", "type": "string", "readOnly": true}}}, "CenterProviderProfile": {"required": ["provider_type", "full_name", "email", "whatsapp_number", "role"], "type": "object", "properties": {"id": {"title": "ID", "type": "integer", "readOnly": true}, "provider_type": {"title": "Provider type", "description": "Type of provider: management team member or connected team member", "type": "string", "enum": ["management", "connected"]}, "full_name": {"title": "Full name", "description": "Full name of the provider", "type": "string", "maxLength": 550, "minLength": 1}, "email": {"title": "Email", "description": "Email address of the provider", "type": "string", "format": "email", "maxLength": 254, "minLength": 1}, "whatsapp_number": {"title": "Whatsapp number", "description": "WhatsApp number (9-15 digits)", "type": "string", "maxLength": 55, "minLength": 1}, "role": {"title": "Role", "description": "Role or position of the provider", "type": "string", "maxLength": 255, "minLength": 1}, "management_contact_name": {"title": "Management contact name", "description": "Name of management contact (optional, typically for connected team members)", "type": "string", "maxLength": 550, "x-nullable": true}, "is_verified": {"title": "Is verified", "description": "Whether this provider profile has been verified", "type": "boolean", "readOnly": true}, "created_at": {"title": "Created at", "type": "string", "format": "date-time", "readOnly": true}, "updated_at": {"title": "Updated at", "type": "string", "format": "date-time", "readOnly": true}}}, "ChallengeList": {"type": "object", "properties": {"id": {"title": "ID", "type": "integer", "readOnly": true}, "title": {"title": "Title", "type": "string", "readOnly": true}, "image": {"title": "Image", "type": "string", "readOnly": true}, "summary": {"title": "Summary", "type": "string", "readOnly": true}, "is_unlimited": {"title": "Is unlimited", "type": "boolean"}, "duration_days": {"title": "Duration days", "type": "integer", "maximum": 2147483647, "minimum": 0, "x-nullable": true}, "status": {"title": "Is it displayed?", "type": "boolean"}, "created_at": {"title": "Created at", "type": "string", "format": "date-time", "readOnly": true}, "participant_count": {"title": "Participant count", "type": "string", "readOnly": true}, "is_participant": {"title": "Is participant", "type": "string", "readOnly": true}}}, "ChallengeDetail": {"type": "object", "properties": {"id": {"title": "ID", "type": "integer", "readOnly": true}, "title": {"title": "Title", "type": "string", "readOnly": true}, "image": {"title": "Image", "type": "string", "readOnly": true}, "summary": {"title": "Summary", "type": "string", "readOnly": true}, "is_unlimited": {"title": "Is unlimited", "type": "boolean"}, "duration_days": {"title": "Duration days", "type": "integer", "maximum": 2147483647, "minimum": 0, "x-nullable": true}, "status": {"title": "Is it displayed?", "type": "boolean"}, "created_at": {"title": "Created at", "type": "string", "format": "date-time", "readOnly": true}, "participant_count": {"title": "Participant count", "type": "string", "readOnly": true}, "is_participant": {"title": "Is participant", "type": "string", "readOnly": true}, "description": {"title": "Description", "type": "string", "readOnly": true}}}, "UserChecklistItem": {"type": "object", "properties": {"id": {"title": "ID", "type": "integer", "readOnly": true}, "title": {"title": "Title", "type": "string", "readOnly": true, "minLength": 1}, "is_active": {"title": "Is active", "type": "boolean"}, "custom_days": {"type": "array", "items": {"type": "string", "x-nullable": true}}, "has_details": {"title": "Has details", "type": "string", "readOnly": true}, "task_type": {"title": "Task type", "type": "string", "readOnly": true}}}, "ChecklistEntryList": {"required": ["id", "title", "completed"], "type": "object", "properties": {"id": {"title": "Id", "type": "integer"}, "title": {"title": "Title", "type": "string", "minLength": 1}, "completed": {"title": "Completed", "type": "boolean"}, "has_details": {"title": "Has details", "type": "boolean", "default": false}}}, "ChecklistStats": {"required": ["total_days", "completed_days", "percentage"], "type": "object", "properties": {"total_days": {"title": "Total days", "type": "integer"}, "completed_days": {"title": "Completed days", "type": "integer"}, "percentage": {"title": "Percentage", "type": "number"}}}, "ChecklistDetail": {"required": ["content"], "type": "object", "properties": {"id": {"title": "ID", "type": "integer", "readOnly": true}, "content": {"title": "Content", "type": "string", "minLength": 1}, "language": {"title": "Language", "type": "integer"}, "created_at": {"title": "Created at", "type": "string", "format": "date-time", "readOnly": true}, "updated_at": {"title": "Updated at", "type": "string", "format": "date-time", "readOnly": true}}}, "HadisCategory": {"type": "object", "properties": {"name": {"title": "Name", "type": "string", "readOnly": true}, "hadis_count": {"title": "Hadis count", "type": "string", "readOnly": true}, "thumbnails": {"title": "Thumbnails", "type": "string", "readOnly": true}, "children": {"title": "Children", "type": "string", "readOnly": true}}}, "Reference": {"type": "object", "properties": {"book": {"title": "Book", "type": "string", "readOnly": true, "x-nullable": true}, "ref_doc_numb": {"title": "Vol", "type": "string", "maxLength": 64, "x-nullable": true}, "ref_doc_page": {"title": "Page", "type": "string", "maxLength": 64, "x-nullable": true}, "ref_hadis_num": {"title": "Number", "type": "string", "maxLength": 64, "x-nullable": true}, "ref_text": {"title": "Text", "type": "string", "maxLength": 200, "x-nullable": true}}, "x-nullable": true}, "Hadis": {"required": ["number", "text", "total_grade", "level"], "type": "object", "properties": {"number": {"title": "Number", "type": "integer", "maximum": 2147483647, "minimum": 0}, "text": {"title": "Text", "type": "string", "minLength": 1}, "translation": {"title": "Translation", "type": "string", "readOnly": true}, "narrated_by": {"title": "Narrated by", "type": "string", "readOnly": true}, "references": {"type": "array", "items": {"$ref": "#/definitions/Reference"}, "readOnly": true, "x-nullable": true}, "total_grade": {"title": "Total grade", "type": "integer", "x-nullable": true}, "level": {"title": "Level", "type": "integer", "x-nullable": true}}}, "Interest": {"type": "object", "properties": {"id": {"title": "ID", "type": "integer", "readOnly": true}, "title": {"title": "Title", "type": "string", "readOnly": true}, "icon": {"title": "Icon name", "description": "Fontawesome icon name", "type": "string", "maxLength": 64, "x-nullable": true}}}, "Narrator": {"required": ["hadis_count"], "type": "object", "properties": {"id": {"title": "ID", "type": "integer", "readOnly": true}, "name": {"title": "Name", "type": "string", "readOnly": true}, "hadis_count": {"title": "Hadis count", "type": "integer", "x-nullable": true}, "photo": {"title": "Photo", "type": "string", "readOnly": true, "x-nullable": true, "format": "uri"}}}, "Resources": {"type": "object", "properties": {"id": {"title": "ID", "type": "integer", "readOnly": true}, "title": {"title": "Title", "type": "string", "readOnly": true}, "thumbnail": {"title": "Thumbnail", "type": "string", "readOnly": true}, "description": {"title": "Description", "type": "string", "readOnly": true}}}, "Trend": {"type": "object", "properties": {"title": {"title": "Title", "type": "string", "readOnly": true}, "description": {"title": "Description", "type": "string", "readOnly": true}, "thumbnail": {"title": "Thumbnail", "type": "string", "readOnly": true}, "hadis_count": {"title": "Hadis count", "type": "string", "readOnly": true}, "hadis_id_list": {"title": "Hadis id list", "type": "string", "readOnly": true}}}, "UserInterest": {"required": ["interests_ids", "gender", "age"], "type": "object", "properties": {"id": {"title": "ID", "type": "integer", "readOnly": true}, "user": {"title": "User", "type": "string", "readOnly": true, "minLength": 1}, "interests": {"type": "array", "items": {"$ref": "#/definitions/Interest"}, "readOnly": true}, "interests_ids": {"type": "array", "items": {"type": "integer"}}, "gender": {"title": "Gender", "type": "string", "enum": ["male", "female"]}, "age": {"title": "Age", "type": "integer", "maximum": 32767, "minimum": 0}, "tend_to_marry": {"title": "Tend to marry", "type": "boolean", "x-nullable": true}, "marital_status": {"title": "Marital status", "type": "boolean", "x-nullable": true}, "has_children": {"title": "Has children", "type": "boolean", "x-nullable": true}}}, "HadisSerializerV2": {"required": ["number", "text", "total_grade", "level"], "type": "object", "properties": {"number": {"title": "Number", "type": "integer", "maximum": 2147483647, "minimum": 0}, "text": {"title": "Text", "type": "string", "minLength": 1}, "translation": {"title": "Translation", "type": "string", "readOnly": true}, "narrated_by": {"title": "Narrated by", "type": "string", "readOnly": true}, "references": {"type": "array", "items": {"$ref": "#/definitions/Reference"}, "readOnly": true, "x-nullable": true}, "total_grade": {"title": "Total grade", "type": "integer", "x-nullable": true}, "level": {"title": "Level", "type": "integer", "x-nullable": true}, "tags": {"title": "Tags", "type": "string", "readOnly": true}}}, "NarratorSerializerV2": {"required": ["hadis_count"], "type": "object", "properties": {"id": {"title": "ID", "type": "integer", "readOnly": true}, "name": {"title": "Name", "type": "string", "readOnly": true}, "hadis_count": {"title": "Hadis count", "type": "integer", "x-nullable": true}, "photo": {"title": "Photo", "type": "string", "readOnly": true, "x-nullable": true, "format": "uri"}, "hadis_index": {"title": "Hadis index", "type": "string", "readOnly": true}}}, "AlbumList": {"type": "object", "properties": {"id": {"title": "ID", "type": "integer", "readOnly": true}, "title": {"title": "Title", "type": "string", "readOnly": true}, "thumbnail": {"title": "Thumbnail", "type": "string", "readOnly": true}, "dates": {"title": "Dates", "type": "object"}, "view_count": {"title": "View count", "type": "integer", "maximum": 2147483647, "minimum": -2147483648}, "songs_count": {"title": "Songs count", "type": "integer", "readOnly": true, "x-nullable": true}, "singer_type_counts": {"title": "Singer type counts", "type": "string", "readOnly": true}}}, "SingersList": {"required": ["slug"], "type": "object", "properties": {"id": {"title": "ID", "type": "integer", "readOnly": true}, "name": {"title": "Name", "type": "string", "readOnly": true}, "singer_type": {"title": "Singer type", "type": "string", "enum": ["lecturer", "madah", "singer"]}, "songs_count": {"title": "Songs count", "type": "integer", "readOnly": true}, "slug": {"title": "Slug", "type": "string", "format": "slug", "maxLength": 255, "minLength": 1}, "languages": {"type": "array", "items": {"type": "string"}, "readOnly": true, "uniqueItems": true}, "avatar": {"title": "Avatar", "type": "string", "readOnly": true}, "lang": {"title": "Lang", "type": "string", "readOnly": true, "minLength": 1}}}, "GenreList": {"required": ["title"], "type": "object", "properties": {"slug": {"title": "Slug", "type": "string", "format": "slug", "pattern": "^[-a-zA-Z0-9_]+$", "readOnly": true, "minLength": 1}, "title": {"title": "Title", "type": "string", "maxLength": 119, "minLength": 1}, "thumbnail": {"title": "Thumbnail", "type": "string", "readOnly": true}}}, "Publisher": {"required": ["name", "songs_count"], "type": "object", "properties": {"id": {"title": "ID", "type": "integer", "readOnly": true}, "url": {"title": "Url", "type": "string", "format": "uri", "maxLength": 200, "x-nullable": true}, "name": {"title": "Name", "type": "string", "maxLength": 255, "minLength": 1}, "description": {"title": "Description", "type": "string", "maxLength": 1024, "x-nullable": true}, "thumbnail_url": {"title": "Thumbnail url", "type": "string", "readOnly": true}, "type": {"title": "Type", "type": "string", "enum": ["YT", "IT", "WS", "TG", "AP"]}, "languages": {"type": "array", "items": {"$ref": "#/definitions/Language"}, "readOnly": true}, "songs_count": {"title": "Songs count", "type": "integer", "x-nullable": true}}}, "SongsList": {"required": ["slug"], "type": "object", "properties": {"relative_url": {"title": "Relative url", "type": "string", "readOnly": true}, "slug": {"title": "Slug", "type": "string", "format": "slug", "maxLength": 50, "minLength": 1}, "title": {"title": "Title", "type": "string", "readOnly": true}, "singers": {"type": "array", "items": {"$ref": "#/definitions/SingersList"}, "readOnly": true}, "thumbnail": {"title": "Thumbnail", "type": "string", "readOnly": true}, "genre": {"$ref": "#/definitions/GenreList"}, "song_type": {"title": "Song type", "type": "string", "enum": ["audio", "video", "youtube"]}, "file": {"title": "File", "type": "string", "readOnly": true}, "published_date": {"title": "Published date", "type": "string", "format": "date", "x-nullable": true}, "subtitle_languages": {"type": "array", "items": {"$ref": "#/definitions/Language"}, "readOnly": true}, "language": {"type": "array", "items": {"$ref": "#/definitions/Language"}, "readOnly": true}, "publisher": {"$ref": "#/definitions/Publisher"}, "like_count": {"title": "Like count", "type": "string", "readOnly": true}, "view_count": {"title": "View count", "type": "integer", "maximum": 9223372036854775807, "minimum": 0}, "is_liked": {"title": "Is liked", "type": "string", "readOnly": true}, "is_youtube": {"title": "Is youtube", "type": "boolean", "readOnly": true}, "is_playlist": {"title": "Is playlist", "type": "string", "readOnly": true}}}, "CollectionList": {"type": "object", "properties": {"id": {"title": "ID", "type": "integer", "readOnly": true}, "title": {"title": "Title", "type": "string", "readOnly": true}, "collection_type": {"title": "Collection type", "type": "string", "enum": ["all", "audio", "video", "youtube"], "x-nullable": true}, "thumbnail": {"title": "Thumbnail", "type": "string", "readOnly": true}, "pin_to_top": {"title": "Pin to top", "type": "boolean"}, "songs_count": {"title": "Songs count", "type": "integer", "readOnly": true, "x-nullable": true}, "songs": {"title": "Songs", "type": "string", "readOnly": true}}}, "CollectionDetail": {"type": "object", "properties": {"id": {"title": "ID", "type": "integer", "readOnly": true}, "title": {"title": "Title", "type": "string", "readOnly": true}, "collection_type": {"title": "Collection type", "type": "string", "enum": ["all", "audio", "video", "youtube"], "x-nullable": true}, "thumbnail": {"title": "Thumbnail", "type": "string", "readOnly": true}, "pin_to_top": {"title": "Pin to top", "type": "boolean"}, "songs_count": {"title": "Songs count", "type": "integer", "readOnly": true, "x-nullable": true}, "songs": {"title": "Songs", "type": "string", "readOnly": true}}}, "DashboardAlbumRow": {"type": "object", "properties": {"id": {"title": "ID", "type": "integer", "readOnly": true}, "translations": {"title": "Title", "type": "object"}, "dates": {"title": "Dates", "type": "object"}, "thumbnail": {"title": "Thumbnail", "type": "string", "readOnly": true}, "status": {"title": "Status", "type": "boolean"}, "is_pinned": {"title": "Pinned", "type": "boolean"}, "view_count": {"title": "View count", "type": "integer", "maximum": 2147483647, "minimum": -2147483648}, "song_count": {"title": "Song count", "type": "integer", "readOnly": true}, "langs": {"title": "Langs", "type": "string", "readOnly": true}, "letter": {"title": "Letter", "type": "string", "readOnly": true}, "updated": {"title": "Updated", "type": "string", "format": "date-time", "readOnly": true}}}, "DashboardAlbumInput": {"type": "object", "properties": {"translations": {"title": "Title", "type": "object"}, "dates": {"title": "Dates", "type": "object"}, "status": {"title": "Status", "type": "boolean"}, "is_pinned": {"title": "Pinned", "type": "boolean"}, "thumbnail_url": {"title": "Thumbnail url", "type": "string", "x-nullable": true}}}, "_AlbumAutocomplete": {"type": "object", "properties": {"id": {"title": "ID", "type": "integer", "readOnly": true}, "name": {"title": "Name", "type": "string", "readOnly": true}}}, "_GenreAutocomplete": {"type": "object", "properties": {"id": {"title": "ID", "type": "integer", "readOnly": true}, "name": {"title": "Name", "type": "string", "readOnly": true, "minLength": 1}, "slug": {"title": "Slug", "type": "string", "format": "slug", "pattern": "^[-a-zA-Z0-9_]+$", "readOnly": true, "minLength": 1}}}, "_PublisherAutocomplete": {"required": ["name"], "type": "object", "properties": {"id": {"title": "ID", "type": "integer", "readOnly": true}, "name": {"title": "Name", "type": "string", "maxLength": 255, "minLength": 1}}}, "_SingerAutocomplete": {"required": ["slug"], "type": "object", "properties": {"id": {"title": "ID", "type": "integer", "readOnly": true}, "name": {"title": "Name", "type": "string", "readOnly": true}, "slug": {"title": "Slug", "type": "string", "format": "slug", "maxLength": 255, "minLength": 1}, "singer_type": {"title": "Singer type", "type": "string", "enum": ["lecturer", "madah", "singer"]}}}, "_SongAutocomplete": {"required": ["slug"], "type": "object", "properties": {"id": {"title": "ID", "type": "integer", "readOnly": true}, "name": {"title": "Name", "type": "string", "readOnly": true}, "slug": {"title": "Slug", "type": "string", "format": "slug", "maxLength": 50, "minLength": 1}}}, "_TagAutocomplete": {"type": "object", "properties": {"id": {"title": "ID", "type": "integer", "readOnly": true}, "name": {"title": "Name", "type": "string", "readOnly": true}}}, "DashboardCollectionRow": {"type": "object", "properties": {"id": {"title": "ID", "type": "integer", "readOnly": true}, "title": {"title": "Title", "type": "object"}, "title_display": {"title": "Title display", "type": "string", "readOnly": true}, "dates": {"title": "Dates", "type": "object"}, "thumbnail": {"title": "Thumbnail", "type": "string", "readOnly": true}, "status": {"title": "Status", "type": "boolean"}, "pin_to_top": {"title": "Pin to top", "type": "boolean"}, "ordering": {"title": "Display order", "type": "integer", "maximum": 2147483647, "minimum": 0}, "song_count": {"title": "Song count", "type": "integer", "readOnly": true}, "songs": {"title": "Songs", "type": "string", "readOnly": true}, "letter": {"title": "Letter", "type": "string", "readOnly": true}, "updated": {"title": "Updated", "type": "string", "format": "date-time", "readOnly": true}}}, "DashboardCollectionInput": {"type": "object", "properties": {"title": {"title": "Title", "type": "object"}, "dates": {"title": "Dates", "type": "object"}, "status": {"title": "Status", "type": "boolean"}, "pin_to_top": {"title": "Pin to top", "type": "boolean"}, "ordering": {"title": "Display order", "type": "integer", "maximum": 2147483647, "minimum": 0}, "songs": {"type": "array", "items": {"type": "integer"}, "uniqueItems": true}, "thumbnail_url": {"title": "Thumbnail url", "type": "string", "x-nullable": true}}}, "DashboardGenreRow": {"required": ["title"], "type": "object", "properties": {"id": {"title": "ID", "type": "integer", "readOnly": true}, "title": {"title": "Title", "type": "string", "maxLength": 119, "minLength": 1}, "slug": {"title": "Slug", "type": "string", "format": "slug", "pattern": "^[-a-zA-Z0-9_]+$", "readOnly": true, "minLength": 1}, "thumbnail": {"title": "Thumbnail", "type": "string", "readOnly": true}, "song_count": {"title": "Song count", "type": "integer", "readOnly": true}, "letter": {"title": "Letter", "type": "string", "readOnly": true}}}, "DashboardGenreInput": {"required": ["title"], "type": "object", "properties": {"title": {"title": "Title", "type": "string", "maxLength": 119, "minLength": 1}, "slug": {"title": "Slug", "type": "string", "format": "slug", "pattern": "^[-a-zA-Z0-9_]+$"}, "thumbnail_url": {"title": "Thumbnail url", "type": "string", "x-nullable": true}}}, "ImportItemRow": {"type": "object", "properties": {"id": {"title": "ID", "type": "integer", "readOnly": true}, "source": {"title": "Source", "type": "string", "enum": ["youtube", "nava", "kashoob", "remote_file", "unknown"], "readOnly": true}, "input_kind": {"title": "Input kind", "type": "string", "enum": ["direct_link", "channel_page"], "readOnly": true}, "origin": {"title": "Origin", "type": "string", "enum": ["direct_link", "channel_page", "scheduled_task"], "readOnly": true}, "source_url": {"title": "Source url", "type": "string", "format": "uri", "readOnly": true, "minLength": 1}, "canonical_url": {"title": "Canonical url", "type": "string", "format": "uri", "readOnly": true, "minLength": 1}, "external_id": {"title": "External id", "type": "string", "readOnly": true, "minLength": 1}, "title": {"title": "Title", "type": "string", "readOnly": true, "minLength": 1}, "singer_name": {"title": "Singer name", "type": "string", "readOnly": true, "minLength": 1}, "duration_seconds": {"title": "Duration seconds", "type": "integer", "readOnly": true, "x-nullable": true}, "thumbnail_url": {"title": "Thumbnail url", "type": "string", "format": "uri", "readOnly": true, "minLength": 1}, "source_published_at": {"title": "Source published at", "type": "string", "format": "date-time", "readOnly": true, "x-nullable": true}, "status": {"title": "Status", "type": "string", "enum": ["queued", "discovering", "downloading", "processing", "ai_detecting", "metadata_review", "ready_to_publish", "published", "duplicate", "failed", "cancelled"], "readOnly": true}, "stage": {"title": "Stage", "type": "string", "readOnly": true, "minLength": 1}, "progress": {"title": "Progress", "type": "integer", "readOnly": true}, "ai_status": {"title": "AI status", "type": "string", "enum": ["pending", "running", "success", "failed", "skipped"], "readOnly": true}, "ai_confidence": {"title": "AI confidence", "type": "number", "readOnly": true, "x-nullable": true}, "needs_metadata_review": {"title": "Needs metadata review", "type": "boolean", "readOnly": true}, "error_message": {"title": "Error message", "type": "string", "readOnly": true, "minLength": 1}, "song_id": {"title": "Song id", "type": "string", "readOnly": true}, "created_at": {"title": "Created at", "type": "string", "format": "date-time", "readOnly": true}, "updated_at": {"title": "Updated at", "type": "string", "format": "date-time", "readOnly": true}, "thumbnail": {"title": "Thumbnail", "type": "string", "readOnly": true}}}, "ImportItemCreate": {"required": ["source_url"], "type": "object", "properties": {"source_url": {"title": "Source url", "type": "string", "maxLength": 1024, "minLength": 1}}}, "ImportItemDetail": {"type": "object", "properties": {"id": {"title": "ID", "type": "integer", "readOnly": true}, "source": {"title": "Source", "type": "string", "enum": ["youtube", "nava", "kashoob", "remote_file", "unknown"], "readOnly": true}, "input_kind": {"title": "Input kind", "type": "string", "enum": ["direct_link", "channel_page"], "readOnly": true}, "origin": {"title": "Origin", "type": "string", "enum": ["direct_link", "channel_page", "scheduled_task"], "readOnly": true}, "source_url": {"title": "Source url", "type": "string", "format": "uri", "readOnly": true, "minLength": 1}, "canonical_url": {"title": "Canonical url", "type": "string", "format": "uri", "readOnly": true, "minLength": 1}, "external_id": {"title": "External id", "type": "string", "readOnly": true, "minLength": 1}, "title": {"title": "Title", "type": "string", "readOnly": true, "minLength": 1}, "singer_name": {"title": "Singer name", "type": "string", "readOnly": true, "minLength": 1}, "duration_seconds": {"title": "Duration seconds", "type": "integer", "readOnly": true, "x-nullable": true}, "thumbnail_url": {"title": "Thumbnail url", "type": "string", "format": "uri", "readOnly": true, "minLength": 1}, "source_published_at": {"title": "Source published at", "type": "string", "format": "date-time", "readOnly": true, "x-nullable": true}, "status": {"title": "Status", "type": "string", "enum": ["queued", "discovering", "downloading", "processing", "ai_detecting", "metadata_review", "ready_to_publish", "published", "duplicate", "failed", "cancelled"], "readOnly": true}, "stage": {"title": "Stage", "type": "string", "readOnly": true, "minLength": 1}, "progress": {"title": "Progress", "type": "integer", "readOnly": true}, "ai_status": {"title": "AI status", "type": "string", "enum": ["pending", "running", "success", "failed", "skipped"], "readOnly": true}, "ai_confidence": {"title": "AI confidence", "type": "number", "readOnly": true, "x-nullable": true}, "needs_metadata_review": {"title": "Needs metadata review", "type": "boolean", "readOnly": true}, "error_message": {"title": "Error message", "type": "string", "readOnly": true, "minLength": 1}, "song_id": {"title": "Song id", "type": "string", "readOnly": true}, "created_at": {"title": "Created at", "type": "string", "format": "date-time", "readOnly": true}, "updated_at": {"title": "Updated at", "type": "string", "format": "date-time", "readOnly": true}, "task_id": {"title": "Task id", "type": "string", "readOnly": true}, "run_id": {"title": "Run id", "type": "string", "readOnly": true}, "attempts": {"title": "Attempts", "type": "integer", "readOnly": true}, "max_attempts": {"title": "Max attempts", "type": "integer", "readOnly": true}, "resolved_metadata": {"title": "Resolved metadata", "type": "object", "readOnly": true}, "ai_metadata": {"title": "Ai metadata", "type": "object", "readOnly": true}, "raw_metadata": {"title": "Raw metadata", "type": "object", "readOnly": true}, "thumbnail": {"title": "Thumbnail", "type": "string", "readOnly": true}}}, "ImportItemMetadata": {"type": "object", "properties": {"title": {"title": "Title", "type": "string", "maxLength": 512}, "singer_name": {"title": "Singer name", "type": "string", "maxLength": 255}, "ai_metadata": {"title": "Ai metadata", "type": "object"}, "needs_metadata_review": {"title": "Needs metadata review", "type": "boolean"}, "status": {"title": "Status", "type": "string", "enum": ["queued", "discovering", "downloading", "processing", "ai_detecting", "metadata_review", "ready_to_publish", "published", "duplicate", "failed", "cancelled"]}}}, "DashboardPleaseRow": {"type": "object", "properties": {"id": {"title": "ID", "type": "integer", "readOnly": true}, "translations": {"title": "Title", "type": "object"}, "live_title": {"title": "Live title", "type": "object"}, "dates": {"title": "Dates", "type": "object"}, "thumbnail": {"title": "Thumbnail", "type": "string", "readOnly": true}, "status": {"title": "Status", "type": "boolean"}, "pin_to_top": {"title": "Pin to top", "type": "boolean"}, "is_active": {"title": "Active", "description": "Use this field to activate or deactivate this entry. If active, it will be shown to users.", "type": "boolean"}, "view_count": {"title": "View count", "type": "integer", "maximum": 2147483647, "minimum": -2147483648}, "song_count": {"title": "Song count", "type": "integer", "readOnly": true}, "songs": {"title": "Songs", "type": "string", "readOnly": true}, "live_stream_link": {"title": "Live link", "type": "string", "maxLength": 255, "x-nullable": true}, "langs": {"title": "Langs", "type": "string", "readOnly": true}, "letter": {"title": "Letter", "type": "string", "readOnly": true}, "updated": {"title": "Updated", "type": "string", "format": "date-time", "readOnly": true}}}, "DashboardPleaseInput": {"type": "object", "properties": {"translations": {"title": "Title", "type": "object"}, "live_title": {"title": "Live title", "type": "object"}, "dates": {"title": "Dates", "type": "object"}, "status": {"title": "Status", "type": "boolean"}, "pin_to_top": {"title": "Pin to top", "type": "boolean"}, "is_active": {"title": "Active", "description": "Use this field to activate or deactivate this entry. If active, it will be shown to users.", "type": "boolean"}, "live_stream_link": {"title": "Live link", "type": "string", "maxLength": 255, "x-nullable": true}, "songs": {"type": "array", "items": {"type": "integer"}, "uniqueItems": true}, "thumbnail_url": {"title": "Thumbnail url", "type": "string", "x-nullable": true}}}, "DashboardPublisherRow": {"required": ["name"], "type": "object", "properties": {"id": {"title": "ID", "type": "integer", "readOnly": true}, "name": {"title": "Name", "type": "string", "maxLength": 255, "minLength": 1}, "type": {"title": "Type", "type": "string", "enum": ["YT", "IT", "WS", "TG", "AP"]}, "url": {"title": "Url", "type": "string", "format": "uri", "maxLength": 200, "x-nullable": true}, "priority": {"title": "Priority", "type": "integer", "maximum": 2147483647, "minimum": 0}, "languages": {"title": "Languages", "type": "string", "readOnly": true}, "description": {"title": "Description", "type": "string", "maxLength": 1024, "x-nullable": true}, "instagram": {"title": "Instagram", "type": "string", "maxLength": 255, "x-nullable": true}, "youtube": {"title": "Youtube", "type": "string", "maxLength": 255, "x-nullable": true}, "telegram": {"title": "Telegram", "type": "string", "maxLength": 255, "x-nullable": true}, "website": {"title": "Telegram", "type": "string", "maxLength": 255, "x-nullable": true}, "avatar": {"title": "Avatar", "type": "string", "readOnly": true}, "letter": {"title": "Letter", "type": "string", "readOnly": true}, "updated": {"title": "Updated", "type": "string", "format": "date-time", "readOnly": true}}}, "DashboardPublisherInput": {"required": ["name"], "type": "object", "properties": {"name": {"title": "Name", "type": "string", "maxLength": 255, "minLength": 1}, "type": {"title": "Type", "type": "string", "enum": ["YT", "IT", "WS", "TG", "AP"]}, "url": {"title": "Url", "type": "string", "format": "uri", "maxLength": 200, "x-nullable": true}, "priority": {"title": "Priority", "type": "integer", "maximum": 2147483647, "minimum": 0}, "languages": {"type": "array", "items": {"type": "string"}, "uniqueItems": true}, "description": {"title": "Description", "type": "string", "maxLength": 1024, "x-nullable": true}, "instagram": {"title": "Instagram", "type": "string", "maxLength": 255, "x-nullable": true}, "youtube": {"title": "Youtube", "type": "string", "maxLength": 255, "x-nullable": true}, "telegram": {"title": "Telegram", "type": "string", "maxLength": 255, "x-nullable": true}, "website": {"title": "Telegram", "type": "string", "maxLength": 255, "x-nullable": true}, "avatar_url": {"title": "Avatar url", "type": "string", "x-nullable": true}}}, "ImportRunRow": {"type": "object", "properties": {"id": {"title": "ID", "type": "integer", "readOnly": true}, "task_id": {"title": "Task id", "type": "string", "readOnly": true}, "source": {"title": "Source", "type": "string", "enum": ["youtube", "nava", "kashoob", "remote_file", "unknown"], "readOnly": true}, "source_url": {"title": "Source url", "type": "string", "format": "uri", "readOnly": true, "minLength": 1}, "scope": {"title": "Scope", "type": "object", "readOnly": true}, "status": {"title": "Status", "type": "string", "enum": ["running", "success", "failed", "cancelled"], "readOnly": true}, "discovered_count": {"title": "Discovered count", "type": "integer", "readOnly": true}, "created_count": {"title": "Created count", "type": "integer", "readOnly": true}, "duplicate_count": {"title": "Duplicate count", "type": "integer", "readOnly": true}, "failed_count": {"title": "Failed count", "type": "integer", "readOnly": true}, "summary": {"title": "Summary", "type": "string", "readOnly": true, "minLength": 1}, "error_message": {"title": "Error message", "type": "string", "readOnly": true, "minLength": 1}, "started_at": {"title": "Started at", "type": "string", "format": "date-time", "readOnly": true}, "finished_at": {"title": "Finished at", "type": "string", "format": "date-time", "readOnly": true, "x-nullable": true}, "created_at": {"title": "Created at", "type": "string", "format": "date-time", "readOnly": true}}}, "DashboardSinger": {"required": ["slug"], "type": "object", "properties": {"id": {"title": "ID", "type": "integer", "readOnly": true}, "name": {"title": "Name", "type": "string", "readOnly": true}, "latin": {"title": "Latin", "type": "string", "readOnly": true}, "avatar": {"title": "Avatar", "type": "string", "readOnly": true}, "letter": {"title": "Letter", "type": "string", "readOnly": true}, "type": {"title": "Type", "type": "string", "readOnly": true}, "singer_type": {"title": "Singer type", "type": "string", "enum": ["lecturer", "madah", "singer"]}, "works": {"title": "Works", "type": "integer", "readOnly": true}, "langs": {"title": "Langs", "type": "string", "readOnly": true}, "sub_langs": {"title": "Sub langs", "type": "string", "readOnly": true}, "status": {"title": "Status", "type": "string", "readOnly": true}, "updated": {"title": "Updated", "type": "string", "readOnly": true}, "desc": {"title": "Desc", "type": "string", "readOnly": true}, "panelId": {"title": "Panelid", "type": "string", "readOnly": true, "minLength": 1}, "slug": {"title": "Slug", "type": "string", "format": "slug", "maxLength": 255, "minLength": 1}, "translations": {"title": "Name", "type": "object"}, "view_count": {"title": "View count", "type": "integer", "readOnly": true}, "is_pinned": {"title": "Pinned", "type": "boolean"}, "ordering": {"title": "Display order", "type": "integer", "maximum": 2147483647, "minimum": 0}, "priority": {"title": "Priority", "type": "integer", "maximum": 9223372036854775807, "minimum": 0}}}, "DashboardSingerInput": {"type": "object", "properties": {"translations": {"title": "Name", "type": "object"}, "singer_type": {"title": "Singer type", "type": "string", "enum": ["lecturer", "madah", "singer"]}, "slug": {"title": "Slug", "type": "string", "format": "slug", "pattern": "^[-\\w]+$"}, "biography": {"title": "Biography", "description": "could be empty", "type": "string", "x-nullable": true}, "status": {"title": "Status", "type": "boolean"}, "languages": {"type": "array", "items": {"type": "string"}, "uniqueItems": true}, "sub_languages": {"type": "array", "items": {"type": "string"}, "uniqueItems": true}, "is_pinned": {"title": "Pinned", "type": "boolean"}, "ordering": {"title": "Display order", "type": "integer", "maximum": 2147483647, "minimum": 0}, "priority": {"title": "Priority", "type": "integer", "maximum": 9223372036854775807, "minimum": 0}, "avatar_url": {"title": "Avatar url", "type": "string", "x-nullable": true}}}, "_GenreMin": {"required": ["title"], "type": "object", "properties": {"id": {"title": "ID", "type": "integer", "readOnly": true}, "title": {"title": "Title", "type": "string", "maxLength": 119, "minLength": 1}, "slug": {"title": "Slug", "type": "string", "format": "slug", "pattern": "^[-a-zA-Z0-9_]+$", "readOnly": true, "minLength": 1}}}, "_SingerMin": {"required": ["slug"], "type": "object", "properties": {"id": {"title": "ID", "type": "integer", "readOnly": true}, "name": {"title": "Name", "type": "string", "readOnly": true}, "slug": {"title": "Slug", "type": "string", "format": "slug", "maxLength": 255, "minLength": 1}}}, "_PublisherMin": {"required": ["name"], "type": "object", "properties": {"id": {"title": "ID", "type": "integer", "readOnly": true}, "name": {"title": "Name", "type": "string", "maxLength": 255, "minLength": 1}}}, "_TagMin": {"required": ["title"], "type": "object", "properties": {"id": {"title": "ID", "type": "integer", "readOnly": true}, "title": {"title": "Title", "type": "string", "maxLength": 119, "minLength": 1}}}, "DashboardSongRow": {"required": ["slug"], "type": "object", "properties": {"id": {"title": "ID", "type": "integer", "readOnly": true}, "title": {"title": "Title", "type": "string", "readOnly": true}, "slug": {"title": "Slug", "type": "string", "format": "slug", "maxLength": 50, "minLength": 1}, "types": {"title": "Types", "type": "string", "readOnly": true}, "genre": {"$ref": "#/definitions/_GenreMin"}, "singers": {"type": "array", "items": {"$ref": "#/definitions/_SingerMin"}, "readOnly": true}, "langs": {"title": "Langs", "type": "string", "readOnly": true}, "status": {"title": "Status", "type": "boolean"}, "publisher": {"$ref": "#/definitions/_PublisherMin"}, "published_date": {"title": "Published date", "type": "string", "format": "date", "x-nullable": true}, "tags": {"type": "array", "items": {"$ref": "#/definitions/_TagMin"}, "readOnly": true}, "thumbnail": {"title": "Thumbnail", "type": "string", "readOnly": true}, "file": {"title": "File", "type": "string", "readOnly": true}, "letter": {"title": "Letter", "type": "string", "readOnly": true}, "updated": {"title": "Updated", "type": "string", "format": "date-time", "readOnly": true}, "is_pinned": {"title": "Pinned", "type": "boolean"}, "ordering": {"title": "Display order", "type": "integer", "maximum": 2147483647, "minimum": 0}}}, "DashboardSongInput": {"required": ["slug", "genre", "singers", "language"], "type": "object", "properties": {"title": {"title": "Title", "type": "object"}, "slug": {"title": "Slug", "type": "string", "format": "slug", "maxLength": 50, "minLength": 1}, "song_type": {"title": "Song type", "type": "string", "enum": ["audio", "video", "youtube"]}, "genre": {"title": "Genre", "type": "integer"}, "singers": {"type": "array", "items": {"type": "integer"}, "uniqueItems": true}, "albums": {"type": "array", "items": {"type": "integer"}, "uniqueItems": true}, "language": {"type": "array", "items": {"type": "string"}, "uniqueItems": true}, "subtitle_languages": {"type": "array", "items": {"type": "string"}, "uniqueItems": true}, "tags": {"type": "array", "items": {"type": "integer"}, "uniqueItems": true}, "publisher": {"title": "Publisher", "type": "integer", "x-nullable": true}, "status": {"title": "Status", "type": "boolean"}, "youtube_link": {"title": "Youtube link", "type": "string", "maxLength": 255, "x-nullable": true}, "audio_file_remote_server": {"title": "Audio file remote url", "type": "string", "format": "uri", "maxLength": 200, "x-nullable": true}, "file_remote_server": {"title": "File remote url", "description": "Upload file from remote server", "type": "string", "format": "uri", "maxLength": 200, "x-nullable": true}, "lyric": {"title": "Lyric", "description": "could be empty", "type": "string", "x-nullable": true}, "published_date": {"title": "Published date", "type": "string", "format": "date", "x-nullable": true}, "is_pinned": {"title": "Pinned", "type": "boolean"}, "ordering": {"title": "Display order", "type": "integer", "maximum": 2147483647, "minimum": 0}, "thumbnail_url": {"title": "Thumbnail url", "type": "string", "x-nullable": true}}}, "ImportSourceTaskRow": {"required": ["page_url"], "type": "object", "properties": {"id": {"title": "ID", "type": "integer", "readOnly": true}, "title": {"title": "Title", "type": "string", "maxLength": 255}, "source": {"title": "Source", "type": "string", "enum": ["youtube", "nava", "kashoob", "remote_file", "unknown"]}, "page_url": {"title": "Page url", "type": "string", "format": "uri", "maxLength": 1024, "minLength": 1}, "external_id": {"title": "External id", "type": "string", "maxLength": 255}, "frequency_days": {"title": "Frequency days", "type": "integer", "maximum": 32767, "minimum": 0}, "run_time": {"title": "Run time", "type": "string"}, "max_items_per_run": {"title": "Max items per run", "type": "integer", "maximum": 32767, "minimum": 0}, "only_new_items": {"title": "Only new items", "type": "boolean"}, "ignore_duplicates": {"title": "Ignore duplicates", "type": "boolean"}, "auto_stop_on_errors": {"title": "Auto stop on errors", "type": "boolean"}, "notify_on_error": {"title": "Notify on error", "type": "boolean"}, "enabled": {"title": "Enabled", "type": "boolean"}, "last_run_at": {"title": "Last run at", "type": "string", "format": "date-time", "readOnly": true, "x-nullable": true}, "next_run_at": {"title": "Next run at", "type": "string", "format": "date-time", "readOnly": true, "x-nullable": true}, "last_run_status": {"title": "Last run status", "type": "string", "readOnly": true, "minLength": 1}, "new_items_last_run": {"title": "New items last run", "type": "integer", "readOnly": true}, "error_streak": {"title": "Error streak", "type": "integer", "readOnly": true}, "created_at": {"title": "Created at", "type": "string", "format": "date-time", "readOnly": true}, "updated_at": {"title": "Updated at", "type": "string", "format": "date-time", "readOnly": true}}}, "ImportSourceTaskInput": {"required": ["page_url"], "type": "object", "properties": {"title": {"title": "Title", "type": "string", "maxLength": 255}, "source": {"title": "Source", "type": "string", "enum": ["youtube", "nava", "kashoob", "remote_file", "unknown"]}, "page_url": {"title": "Page url", "type": "string", "format": "uri", "maxLength": 1024, "minLength": 1}, "frequency_days": {"title": "Frequency days", "type": "integer", "maximum": 32767, "minimum": 0}, "run_time": {"title": "Run time", "type": "string"}, "max_items_per_run": {"title": "Max items per run", "type": "integer", "maximum": 32767, "minimum": 0}, "only_new_items": {"title": "Only new items", "type": "boolean"}, "ignore_duplicates": {"title": "Ignore duplicates", "type": "boolean"}, "auto_stop_on_errors": {"title": "Auto stop on errors", "type": "boolean"}, "notify_on_error": {"title": "Notify on error", "type": "boolean"}, "enabled": {"title": "Enabled", "type": "boolean"}}}, "DashboardTagRow": {"type": "object", "properties": {"id": {"title": "ID", "type": "integer", "readOnly": true}, "translations": {"title": "Translations", "type": "string", "readOnly": true}, "slug": {"title": "Slug", "type": "string", "readOnly": true, "minLength": 1}, "song_count": {"title": "Song count", "type": "integer", "readOnly": true}, "letter": {"title": "Letter", "type": "string", "readOnly": true}}}, "DashboardTagInput": {"type": "object", "properties": {"translations": {"title": "Translations", "type": "object"}, "slug": {"title": "Slug", "type": "string"}}}, "_Upload": {"type": "object", "properties": {"file": {"title": "File", "type": "string", "readOnly": true, "format": "uri"}}}, "YoutubeInfo": {"required": ["youtube_link"], "type": "object", "properties": {"thumbnail": {"title": "Thumbnail", "type": "string", "readOnly": true, "minLength": 1}, "title": {"title": "Title", "type": "string", "readOnly": true, "minLength": 1}, "description": {"title": "Description", "type": "string", "readOnly": true, "minLength": 1}, "youtube_link": {"title": "Youtube link", "type": "string", "format": "uri", "minLength": 1}, "language_code": {"title": "Language code", "type": "string", "readOnly": true, "minLength": 1, "x-nullable": true}}}, "ShrineLive": {"type": "object", "properties": {"id": {"title": "ID", "type": "integer", "readOnly": true}, "title": {"title": "Title", "type": "string", "readOnly": true}, "live_title": {"title": "Live title", "type": "string", "readOnly": true}, "thumbnail": {"title": "Thumbnail", "type": "string", "readOnly": true}, "live_stream_link": {"title": "Live stream link", "type": "string", "readOnly": true}, "status": {"title": "Status", "type": "boolean"}, "pin_to_top": {"title": "Pin to top", "type": "boolean"}, "live_count": {"title": "Live count", "type": "string", "readOnly": true}}}, "HussainiyaProviderProfileSerializer": {"required": ["role", "languages", "avatar"], "type": "object", "properties": {"full_name": {"title": "Full name", "type": "string", "maxLength": 254, "minLength": 1, "x-nullable": true}, "bio": {"title": "Bio", "type": "string", "maxLength": 512, "x-nullable": true}, "role": {"title": "Role", "type": "string", "enum": ["lecturer", "madah", "singer"]}, "birthdate": {"title": "Birthdate", "type": "string", "format": "date", "x-nullable": true}, "email": {"title": "Email", "type": "string", "format": "email", "maxLength": 254, "x-nullable": true}, "wa_number": {"title": "Whatsapp number", "type": "string", "maxLength": 255, "x-nullable": true}, "institution_name": {"title": "Name", "description": "Name of the institute", "type": "string", "maxLength": 255, "x-nullable": true}, "languages": {"type": "array", "items": {"type": "string"}}, "avatar": {"title": "Avatar", "type": "string", "minLength": 1}, "social_medias": {"title": "Social medias", "description": "Provider social media profiles", "type": "object"}}}, "CreateSong": {"required": ["genre", "albums", "title", "language"], "type": "object", "properties": {"youtube_link": {"title": "Youtube link", "type": "string", "maxLength": 255, "x-nullable": true}, "file_path": {"title": "File path", "type": "string", "x-nullable": true}, "thumbnail": {"title": "Thumbnail", "type": "string", "x-nullable": true}, "genre": {"title": "Genre", "type": "integer"}, "albums": {"type": "array", "items": {"type": "integer"}, "uniqueItems": true}, "title": {"type": "array", "items": {"type": "object", "required": ["title", "language_code"], "properties": {"title": {"title": "title", "type": "string"}, "language_code": {"title": "language code", "description": "eg. en, da", "type": "string"}}}}, "slug": {"title": "Slug", "type": "string", "readOnly": true}, "language": {"description": "eg. [en, fa, ...]", "type": "array", "items": {"type": "string", "minLength": 1}}}}, "UpdateSong": {"required": ["genre", "albums"], "type": "object", "properties": {"thumbnail": {"title": "Thumbnail", "type": "string", "x-nullable": true}, "genre": {"title": "Genre", "type": "integer"}, "albums": {"type": "array", "items": {"type": "integer"}, "uniqueItems": true}, "title": {"type": "array", "items": {"type": "object", "required": ["title", "language_code"], "properties": {"title": {"title": "title", "type": "string"}, "language_code": {"title": "language code", "description": "eg. en, da", "type": "string"}}}}, "language": {"description": "eg. [en, fa, ...]", "type": "array", "items": {"type": "string", "minLength": 1}}}}, "PlaylistTabCollection": {"required": ["id", "title", "song_count", "is_personal", "editable"], "type": "object", "properties": {"id": {"title": "Id", "type": "string", "minLength": 1}, "title": {"title": "Title", "type": "string", "minLength": 1, "x-nullable": true}, "song_count": {"title": "Song count", "type": "integer"}, "is_personal": {"title": "Is personal", "type": "boolean"}, "editable": {"title": "Editable", "type": "boolean"}}}, "SingerSong": {"required": ["slug"], "type": "object", "properties": {"name": {"title": "Name", "type": "string", "readOnly": true}, "singer_type": {"title": "Singer type", "type": "string", "enum": ["lecturer", "madah", "singer"]}, "songs_count": {"title": "Songs count", "type": "integer", "readOnly": true}, "slug": {"title": "Slug", "type": "string", "format": "slug", "maxLength": 255, "minLength": 1}, "languages": {"type": "array", "items": {"type": "string"}, "readOnly": true, "uniqueItems": true}, "avatar": {"title": "Avatar", "type": "string", "readOnly": true}, "songs": {"title": "Songs", "type": "string", "readOnly": true}}}, "Seo": {"type": "object", "properties": {"title": {"title": "Seo title", "description": "maximum length of page title is 70 characters and minimum length is 30", "type": "string", "maxLength": 140, "x-nullable": true}, "keywords": {"title": "Keywords", "description": "keywords in the content that make it possible for people to find the site via search engines", "type": "string", "maxLength": 255, "x-nullable": true}, "description": {"title": "Description", "description": "describes and summarizes the contents of the page for the benefit of users and search engines", "type": "string", "maxLength": 170, "x-nullable": true}}}, "SongDetail": {"required": ["slug"], "type": "object", "properties": {"title": {"title": "Title", "type": "string", "readOnly": true}, "slug": {"title": "Slug", "type": "string", "format": "slug", "maxLength": 50, "minLength": 1}, "singers": {"type": "array", "items": {"$ref": "#/definitions/SingersList"}, "readOnly": true}, "file": {"title": "File", "type": "string", "readOnly": true}, "song_type": {"title": "Song type", "type": "string", "enum": ["audio", "video", "youtube"]}, "thumbnail": {"title": "Thumbnail", "type": "string", "readOnly": true}, "lyric": {"title": "Lyric", "description": "could be empty", "type": "string", "x-nullable": true}, "published_date": {"title": "Published date", "type": "string", "format": "date", "x-nullable": true}, "info": {"title": "Info", "type": "object", "x-nullable": true}, "genre": {"$ref": "#/definitions/GenreList"}, "view_count": {"title": "View count", "type": "integer", "maximum": 9223372036854775807, "minimum": 0}, "like_count": {"title": "Like count", "type": "string", "readOnly": true}, "language": {"type": "array", "items": {"$ref": "#/definitions/Language"}, "readOnly": true}, "is_playlist": {"title": "Is playlist", "type": "string", "readOnly": true}, "seo_fields": {"$ref": "#/definitions/Seo"}, "publisher": {"$ref": "#/definitions/Publisher"}, "is_liked": {"title": "Is liked", "type": "string", "readOnly": true}, "is_youtube": {"title": "Is youtube", "type": "string", "readOnly": true}, "youtube_audio_file": {"title": "Youtube audio file", "type": "string", "readOnly": true}}}, "ImportantNotice": {"type": "object", "properties": {"id": {"title": "ID", "type": "integer", "readOnly": true}, "title": {"title": "Title", "type": "string", "x-nullable": true}, "subtitle": {"title": "Subtitle", "type": "string", "x-nullable": true}, "alert_color": {"title": "Alert color", "type": "string", "enum": ["#FF0000", "#FFFF00", "#00FF00", "#0000FF"], "x-nullable": true}, "alert_color_display": {"title": "Alert color display", "type": "string", "readOnly": true, "minLength": 1}, "small_image": {"title": "Small image", "type": "string", "readOnly": true, "x-nullable": true, "format": "uri"}, "target_route": {"title": "Target route", "type": "string", "maxLength": 255, "x-nullable": true}, "language": {"title": "Language", "type": "integer", "x-nullable": true}, "status": {"title": "Status", "type": "boolean"}}}, "GroupKhatm": {"required": ["group_type"], "type": "object", "properties": {"id": {"title": "ID", "type": "integer", "readOnly": true}, "name": {"title": "Name", "type": "string", "minLength": 1}, "slug": {"title": "Slug", "type": "string", "readOnly": true}, "language_code": {"title": "Language code", "type": "string", "readOnly": true}, "language_name": {"title": "Language name", "type": "string", "readOnly": true}, "thumbnail": {"title": "Thumbnail", "type": "string", "minLength": 1, "x-nullable": true}, "users_count": {"title": "Users count", "type": "string", "readOnly": true}, "current_round": {"title": "Current round", "type": "string", "readOnly": true}, "total_pages_read": {"title": "Total pages read", "type": "integer", "readOnly": true}, "created_by": {"title": "Created by", "type": "string", "readOnly": true}, "created_at": {"title": "Created at", "type": "string", "format": "date-time", "readOnly": true}, "group_type": {"title": "Group type", "type": "string", "enum": ["public", "private"]}, "progress_percentage": {"title": "Progress percentage", "type": "string", "readOnly": true}, "pages": {"title": "Pages", "type": "string", "readOnly": true}}}, "ReadPage": {"required": ["page_user_id"], "type": "object", "properties": {"page_user_id": {"title": "Page user id", "type": "integer", "minimum": 1}, "last_page_read": {"title": "Last page read", "type": "integer", "readOnly": true}, "total_pages_read_group": {"title": "Total pages read group", "type": "integer", "readOnly": true}, "remaining_pages": {"title": "Remaining pages", "type": "string", "readOnly": true}}}, "IndividualKhatm": {"required": ["name", "session_type", "session_value"], "type": "object", "properties": {"name": {"title": "Name", "type": "string", "minLength": 1}, "slug": {"title": "Slug", "type": "string", "format": "slug", "pattern": "^[-a-zA-Z0-9_]+$", "readOnly": true, "minLength": 1}, "session_type": {"title": "Session type", "type": "string", "enum": ["page", "juz"]}, "session_value": {"title": "Session value", "type": "integer"}, "last_session_read": {"title": "Last session read", "type": "integer", "readOnly": true}, "total_sessions": {"title": "Total Sessions", "type": "integer", "readOnly": true}, "total_count_info": {"title": "Total count info", "type": "string", "readOnly": true}, "progress_percentage": {"title": "Progress percentage", "type": "string", "readOnly": true}, "total_pages_read": {"title": "Pages read", "type": "string", "readOnly": true}}}, "IndividualKhatmUpdate": {"required": ["name"], "type": "object", "properties": {"name": {"title": "Name", "type": "string", "maxLength": 100, "minLength": 1}}}, "IndividualReadPage": {"required": ["session"], "type": "object", "properties": {"session": {"title": "Session", "type": "integer"}, "remaining_pages": {"title": "Remaining pages", "type": "integer", "readOnly": true}}}, "UserGroupKhatm": {"required": ["khatm", "from_page", "to_page", "pages_count"], "type": "object", "properties": {"id": {"title": "ID", "type": "integer", "readOnly": true}, "khatm": {"$ref": "#/definitions/GroupKhatm"}, "guest_fullname": {"title": "Guest fullname", "type": "string", "maxLength": 255, "x-nullable": true}, "guest_wa_number": {"title": "Guest whatsapp number", "type": "string", "maxLength": 255, "x-nullable": true}, "from_page": {"title": "From page", "type": "integer", "maximum": 32767, "minimum": 0}, "to_page": {"title": "To page", "type": "integer", "maximum": 32767, "minimum": 0}, "pages_count": {"title": "Pages count", "type": "integer", "maximum": 32767, "minimum": 0}, "last_page_read": {"title": "Last page read", "type": "integer", "maximum": 2147483647, "minimum": 0}, "created_at": {"title": "Joined at", "type": "string", "format": "date-time", "readOnly": true}}}, "BannerList": {"required": ["description"], "type": "object", "properties": {"id": {"title": "ID", "type": "integer", "readOnly": true}, "title": {"title": "Title", "type": "string", "readOnly": true}, "description": {"title": "Description", "type": "string", "minLength": 1}, "covers": {"title": "Covers", "type": "string", "readOnly": true}}}, "Author": {"type": "object", "properties": {"id": {"title": "ID", "type": "integer", "readOnly": true}, "name": {"title": "Name", "type": "string", "readOnly": true}, "avatar": {"title": "Avatar", "type": "string", "readOnly": true}}}, "BookList": {"required": ["title", "author", "type"], "type": "object", "properties": {"title": {"title": "Title", "type": "string", "maxLength": 255, "minLength": 1}, "slug": {"title": "Slug", "type": "string", "format": "slug", "pattern": "^[-a-zA-Z0-9_]+$", "readOnly": true, "minLength": 1}, "thumbnail": {"title": "Thumbnail", "type": "string", "readOnly": true}, "price": {"title": "Price (Coin)", "type": "string", "format": "decimal"}, "author": {"type": "array", "items": {"$ref": "#/definitions/Author"}}, "type": {"title": "Type", "type": "string", "minLength": 1}, "rates": {"title": "Rates", "type": "string", "readOnly": true}, "is_bookmark": {"title": "Is bookmark", "type": "boolean", "default": false}}}, "BookListSerializerEditorSuggestion": {"required": ["author"], "type": "object", "properties": {"slug": {"title": "Slug", "type": "string", "format": "slug", "pattern": "^[-a-zA-Z0-9_]+$", "readOnly": true, "minLength": 1}, "author": {"type": "array", "items": {"$ref": "#/definitions/Author"}}, "thumbnail": {"title": "Thumbnail", "type": "string", "readOnly": true}, "summary": {"title": "Summary", "description": "could be null", "type": "string", "maxLength": 512, "x-nullable": true}}}, "BookListV2": {"required": ["title", "author", "file_types"], "type": "object", "properties": {"id": {"title": "ID", "type": "integer", "readOnly": true}, "title": {"title": "Title", "type": "string", "maxLength": 255, "minLength": 1}, "slug": {"title": "Slug", "type": "string", "format": "slug", "pattern": "^[-a-zA-Z0-9_]+$", "readOnly": true, "minLength": 1}, "thumbnail": {"title": "Thumbnail", "type": "string", "readOnly": true}, "price": {"title": "Price (Coin)", "type": "string", "format": "decimal"}, "discount_percentage": {"title": "Discount Percentage", "description": "Discount percentage as an integer between 0 and 100", "type": "integer", "maximum": 2147483647, "minimum": 0}, "final_price": {"title": "Final Price (Coin)", "description": "This field is automatically calculated based on the discount percentage.", "type": "string", "format": "decimal"}, "author": {"type": "array", "items": {"$ref": "#/definitions/Author"}}, "file_types": {"type": "array", "items": {"type": "string", "minLength": 1}}, "rates": {"title": "Rates", "type": "string", "readOnly": true}, "is_bookmark": {"title": "Is bookmark", "type": "boolean", "default": false}}}, "BookFiles": {"required": ["title"], "type": "object", "properties": {"title": {"title": "Title", "type": "string", "maxLength": 255, "minLength": 1}, "file": {"title": "File", "type": "string", "readOnly": true, "format": "uri"}, "pages_count": {"title": "Number of Pages", "description": "eg. 34", "type": "string", "maxLength": 255, "minLength": 1, "x-nullable": true}}}, "BookPublisher": {"required": ["username", "name"], "type": "object", "properties": {"username": {"title": "Username", "type": "string", "minLength": 1, "x-nullable": true}, "name": {"title": "Name", "type": "string", "minLength": 1}, "avatar": {"title": "Avatar", "type": "string", "readOnly": true}}}, "BookDetail": {"required": ["title", "author", "type", "files", "language", "publisher"], "type": "object", "properties": {"title": {"title": "Title", "type": "string", "maxLength": 255, "minLength": 1}, "slug": {"title": "Slug", "type": "string", "format": "slug", "pattern": "^[-a-zA-Z0-9_]+$", "readOnly": true, "minLength": 1}, "is_bookmark": {"title": "Is bookmark", "type": "boolean", "default": false}, "thumbnail": {"title": "Thumbnail", "type": "string", "readOnly": true}, "price": {"title": "Price (Coin)", "type": "string", "format": "decimal"}, "author": {"type": "array", "items": {"$ref": "#/definitions/Author"}}, "type": {"title": "Type", "type": "string", "minLength": 1}, "narrator": {"title": "Narrator", "type": "string", "readOnly": true}, "files": {"type": "array", "items": {"$ref": "#/definitions/BookFiles"}}, "pages_count": {"title": "Number of Pages", "description": "eg. 34", "type": "string", "maxLength": 255, "minLength": 1, "x-nullable": true}, "view_count": {"title": "View count", "type": "integer", "maximum": 9223372036854775807, "minimum": 0}, "download_count": {"title": "Download count", "type": "integer", "default": 9}, "language": {"type": "array", "items": {"$ref": "#/definitions/Language"}}, "summary": {"title": "Summary", "description": "could be null", "type": "string", "maxLength": 512, "x-nullable": true}, "publisher": {"$ref": "#/definitions/BookPublisher"}, "rates": {"title": "Rates", "type": "string", "readOnly": true}, "related": {"title": "Related", "type": "string", "readOnly": true}}}, "UserRate": {"type": "object", "properties": {"name": {"title": "Name", "type": "string", "readOnly": true}, "avatar": {"title": "Avatar", "type": "string", "readOnly": true}, "rate": {"title": "Rate", "type": "integer", "maximum": 32767, "minimum": 0, "x-nullable": true}, "note": {"title": "Note", "type": "string", "maxLength": 512, "x-nullable": true}, "date": {"title": "Date", "type": "string", "format": "date-time", "readOnly": true}}}, "Category": {"required": ["icon", "book_count"], "type": "object", "properties": {"title": {"title": "Title", "type": "string", "readOnly": true, "x-nullable": true}, "id": {"title": "ID", "type": "integer", "readOnly": true}, "icon": {"title": "Icon", "description": "fontawesome icon. eg. fa-book", "type": "string", "maxLength": 32, "minLength": 1}, "book_count": {"title": "Book count", "type": "integer", "x-nullable": true}}}, "Files": {"required": ["title", "pdf_file"], "type": "object", "properties": {"title": {"title": "Title", "type": "string", "maxLength": 255, "minLength": 1}, "pdf_file": {"title": "Pdf file", "type": "string", "minLength": 1}, "pages_count": {"title": "Number of Pages", "description": "eg. 34", "type": "string", "maxLength": 255, "minLength": 1, "x-nullable": true}}}, "CreateBook": {"required": ["title", "thumbnail", "files"], "type": "object", "properties": {"title": {"title": "Title", "type": "string", "maxLength": 255, "minLength": 1}, "price": {"title": "Price (Coin)", "type": "string", "format": "decimal"}, "summary": {"title": "Summary", "description": "could be null", "type": "string", "maxLength": 512, "x-nullable": true}, "description": {"title": "Description", "description": "could be null", "type": "string", "x-nullable": true}, "thumbnail": {"title": "Thumbnail", "type": "string", "minLength": 1}, "tags": {"type": "array", "items": {"type": "integer"}, "uniqueItems": true}, "categories": {"type": "array", "items": {"type": "integer"}, "uniqueItems": true}, "authors": {"type": "array", "items": {"type": "integer"}, "uniqueItems": true}, "translators": {"type": "array", "items": {"type": "integer"}, "uniqueItems": true}, "narrators": {"type": "array", "items": {"type": "integer"}, "uniqueItems": true}, "publish_year": {"title": "Publish year", "description": "eg. 1998", "type": "integer", "maximum": 2147483647, "minimum": 0, "x-nullable": true}, "vol_count": {"title": "Number of Volumes", "description": "eg. 3", "type": "integer", "maximum": 2147483647, "minimum": 0, "x-nullable": true}, "isbn": {"title": "ISBN", "type": "string", "maxLength": 225, "x-nullable": true}, "files": {"type": "array", "items": {"$ref": "#/definitions/Files"}}}}, "PublisherList": {"required": ["full_name", "book_count"], "type": "object", "properties": {"full_name": {"title": "Full name", "type": "string", "maxLength": 255, "minLength": 1}, "avatar": {"title": "Avatar", "type": "string", "readOnly": true}, "book_count": {"title": "Book count", "type": "integer", "x-nullable": true}, "id": {"title": "ID", "type": "integer", "readOnly": true}}}, "BookFilesV2": {"required": ["title"], "type": "object", "properties": {"title": {"title": "Title", "type": "string", "maxLength": 255, "minLength": 1}, "file": {"title": "File", "type": "string", "readOnly": true, "format": "uri"}, "type": {"title": "File Type", "type": "string", "enum": ["pdf", "html", "epub", "docx", "audio"]}, "pages_count": {"title": "Number of Pages", "description": "eg. 34", "type": "string", "maxLength": 255, "minLength": 1, "x-nullable": true}, "volume": {"title": "Volume", "description": "The volume number of the book, e.g., 1 for first volume.", "type": "integer", "maximum": 2147483647, "minimum": -2147483648, "x-nullable": true}}}, "BookDetailV2": {"required": ["title", "author", "file_types", "book_files", "language", "publisher", "categories"], "type": "object", "properties": {"id": {"title": "ID", "type": "integer", "readOnly": true}, "title": {"title": "Title", "type": "string", "maxLength": 255, "minLength": 1}, "slug": {"title": "Slug", "type": "string", "format": "slug", "pattern": "^[-a-zA-Z0-9_]+$", "readOnly": true, "minLength": 1}, "is_bookmark": {"title": "Is bookmark", "type": "boolean", "default": false}, "is_download": {"title": "Is download", "type": "boolean", "default": false}, "price": {"title": "Price (Coin)", "type": "string", "format": "decimal"}, "discount_percentage": {"title": "Discount Percentage", "description": "Discount percentage as an integer between 0 and 100", "type": "integer", "maximum": 2147483647, "minimum": 0}, "final_price": {"title": "Final Price (Coin)", "description": "This field is automatically calculated based on the discount percentage.", "type": "string", "format": "decimal"}, "thumbnail": {"title": "Thumbnail", "type": "string", "readOnly": true}, "author": {"type": "array", "items": {"$ref": "#/definitions/Author"}}, "file_types": {"type": "array", "items": {"type": "string", "minLength": 1}}, "view_count": {"title": "View count", "type": "integer", "maximum": 9223372036854775807, "minimum": 0}, "download_count": {"title": "Download count", "type": "string", "readOnly": true}, "narrator": {"title": "Narrator", "type": "string", "readOnly": true}, "book_files": {"type": "array", "items": {"$ref": "#/definitions/BookFilesV2"}}, "pages_count": {"title": "Number of Pages", "description": "eg. 34", "type": "string", "maxLength": 255, "minLength": 1, "x-nullable": true}, "language": {"type": "array", "items": {"$ref": "#/definitions/Language"}}, "description": {"title": "Description", "description": "could be null", "type": "string", "x-nullable": true}, "summary": {"title": "Summary", "description": "could be null", "type": "string", "maxLength": 512, "x-nullable": true}, "publisher": {"$ref": "#/definitions/BookPublisher"}, "categories": {"type": "array", "items": {"$ref": "#/definitions/Category"}}, "rates": {"title": "Rates", "type": "string", "readOnly": true}, "sample_file": {"title": "Sample file", "type": "string", "readOnly": true}, "related": {"title": "Related", "type": "string", "readOnly": true}}}, "AuthorList": {"required": ["slug", "book_count"], "type": "object", "properties": {"slug": {"title": "Slug", "type": "string", "minLength": 1}, "name": {"title": "Name", "type": "string", "readOnly": true}, "avatar": {"title": "Avatar", "type": "string", "readOnly": true}, "book_count": {"title": "Book count", "type": "integer", "x-nullable": true}}}, "MafatihCategories": {"required": ["language"], "type": "object", "properties": {"id": {"title": "ID", "type": "integer", "readOnly": true}, "name": {"title": "Name", "type": "string", "readOnly": true}, "thumbnails": {"title": "Thumbnails", "type": "string", "readOnly": true}, "duas_index": {"title": "Duas index", "type": "string", "readOnly": true}, "language": {"$ref": "#/definitions/Language"}, "children": {"title": "Children", "type": "string", "readOnly": true}}}, "DuaCategories": {"type": "object", "properties": {"id": {"title": "ID", "type": "integer", "readOnly": true}, "name": {"title": "Name", "type": "string", "readOnly": true}, "thumbnails": {"title": "Thumbnails", "type": "string", "readOnly": true}, "duas_index": {"title": "Duas index", "type": "string", "readOnly": true}, "language": {"title": "Language", "type": "string", "readOnly": true}, "children": {"title": "Children", "type": "string", "readOnly": true}}}, "MafatihDuaPart": {"type": "object", "properties": {"id": {"title": "ID", "type": "integer", "readOnly": true}, "dua_part_index": {"title": "Dua part index", "type": "string", "readOnly": true}, "text": {"title": "Text", "type": "string", "x-nullable": true}, "translation": {"title": "Translation", "type": "string", "x-nullable": true}, "local_alpha": {"title": "Local alpha", "type": "string", "x-nullable": true}, "mafatih_dua_id": {"title": "Mafatih dua id", "type": "string", "readOnly": true}, "description": {"title": "Description", "type": "string", "x-nullable": true}}}, "DuaPartSerializer": {"type": "object", "properties": {"id": {"title": "ID", "type": "integer", "readOnly": true}, "dua_part_index": {"title": "Dua part index", "type": "string", "readOnly": true}, "text": {"title": "Text", "type": "string", "x-nullable": true}, "translation": {"title": "Translation", "type": "string", "readOnly": true}, "local_alpha": {"title": "Local alpha", "type": "string", "readOnly": true}, "dua_id": {"title": "Dua id", "type": "string", "readOnly": true}, "description": {"title": "Description", "type": "string", "readOnly": true}}}, "MafatihDua": {"required": ["title"], "type": "object", "properties": {"id": {"title": "ID", "type": "integer", "readOnly": true}, "title": {"title": "Title", "type": "string", "maxLength": 192, "minLength": 1}, "duas_part_list": {"type": "array", "items": {"type": "integer"}, "readOnly": true, "uniqueItems": true}, "dates": {"title": "Dates", "description": "لیستی از تاریخ های قمری مربوط به قطعه", "type": "object", "x-nullable": true}, "weekdays": {"title": "Weekdays", "type": "string", "readOnly": true}, "audio_sync_data": {"title": "Audio sync data", "type": "string", "readOnly": true}, "audio": {"title": "Audio", "type": "string", "readOnly": true}}}, "DuaAudioDetail": {"required": ["reciter"], "type": "object", "properties": {"reciter": {"title": "Reciter", "type": "string", "maxLength": 119, "minLength": 1}, "audio": {"title": "Audio", "type": "string", "readOnly": true}, "audio_sync_data": {"title": "Audio sync data", "type": "object"}}}, "MafatihDuaSerializerV2": {"required": ["title", "audios"], "type": "object", "properties": {"id": {"title": "ID", "type": "integer", "readOnly": true}, "title": {"title": "Title", "type": "string", "maxLength": 192, "minLength": 1}, "duas_part_list": {"type": "array", "items": {"type": "integer"}, "readOnly": true, "uniqueItems": true}, "dates": {"title": "Dates", "description": "لیستی از تاریخ های قمری مربوط به قطعه", "type": "object", "x-nullable": true}, "weekdays": {"title": "Weekdays", "type": "string", "readOnly": true}, "audios": {"type": "array", "items": {"$ref": "#/definitions/DuaAudioDetail"}}}}, "DuaAudioDetailV3": {"type": "object", "properties": {"reciter": {"title": "Reciter", "type": "string", "readOnly": true}, "audio": {"title": "Audio", "type": "string", "readOnly": true}, "audio_sync_data": {"title": "Audio sync data", "type": "object"}}}, "MafatihDuaSerializerV3": {"required": ["audios"], "type": "object", "properties": {"id": {"title": "ID", "type": "integer", "readOnly": true}, "title": {"title": "Title", "type": "string", "readOnly": true}, "similar_titles": {"title": "Similar Titles", "type": "object", "x-nullable": true}, "duas_part_list": {"type": "array", "items": {"type": "integer"}, "readOnly": true, "uniqueItems": true}, "dates": {"title": "Dates", "description": "لیستی از تاریخ های قمری مربوط به قطعه", "type": "object", "x-nullable": true}, "weekdays": {"title": "Weekdays", "type": "string", "readOnly": true}, "audios": {"type": "array", "items": {"$ref": "#/definitions/DuaAudioDetailV3"}}}}, "DuaAudioList": {"required": ["reciter"], "type": "object", "properties": {"id": {"title": "ID", "type": "integer", "readOnly": true}, "reciter": {"title": "Reciter", "type": "string", "maxLength": 119, "minLength": 1}}}, "Masael": {"required": ["title", "content"], "type": "object", "properties": {"id": {"title": "ID", "type": "integer", "readOnly": true}, "title": {"title": "Title", "type": "string", "maxLength": 255, "minLength": 1}, "content": {"title": "Content", "type": "string", "minLength": 1}, "category": {"title": "Category", "type": "string", "readOnly": true}, "root_id": {"title": "Root id", "type": "string", "readOnly": true}}}, "MarjaaGuide": {"required": ["language"], "type": "object", "properties": {"title": {"title": "Title", "type": "string", "x-nullable": true}, "language": {"$ref": "#/definitions/Language"}, "answer": {"title": "Answer", "type": "string", "x-nullable": true}, "priority": {"title": "Priority", "type": "integer", "maximum": 2147483647, "minimum": -2147483648}}}, "MasaelContent": {"required": ["text"], "type": "object", "properties": {"id": {"title": "ID", "type": "integer", "readOnly": true}, "header": {"title": "Header", "type": "string", "x-nullable": true}, "text": {"title": "Text", "type": "string", "minLength": 1}, "answer": {"title": "Answer", "type": "string", "x-nullable": true}, "priority": {"title": "Priority", "type": "integer", "maximum": 2147483647, "minimum": 0, "x-nullable": true}}}, "MasaelSerializerV2": {"required": ["title"], "type": "object", "properties": {"id": {"title": "ID", "type": "integer", "readOnly": true}, "priority": {"title": "Priority", "type": "integer", "maximum": 2147483647, "minimum": 0, "x-nullable": true}, "category": {"title": "Category", "type": "integer", "x-nullable": true}, "title": {"title": "Title", "type": "string", "maxLength": 255, "minLength": 1}, "contents": {"type": "array", "items": {"$ref": "#/definitions/MasaelContent"}, "readOnly": true}}}, "Note": {"required": ["service", "object_id", "note_text"], "type": "object", "properties": {"id": {"title": "ID", "type": "integer", "readOnly": true}, "service": {"title": "Service", "type": "string", "enum": ["quran", "mafatih", "hadis", "habit"]}, "object_id": {"title": "Object id", "type": "integer", "maximum": 2147483647, "minimum": -2147483648}, "user": {"title": "User", "type": "string", "readOnly": true}, "note_text": {"title": "Note text", "type": "string", "minLength": 1}, "created_at": {"title": "Created at", "type": "string", "format": "date-time", "readOnly": true}, "updated_at": {"title": "Updated at", "type": "string", "format": "date-time", "readOnly": true}, "feedback_count": {"title": "Feedback count", "type": "string", "readOnly": true}, "language": {"title": "Language", "type": "string", "readOnly": true}, "request_user_feedback": {"title": "Request user feedback", "type": "string", "readOnly": true}}}, "NoteFeedback": {"required": ["note"], "type": "object", "properties": {"note": {"title": "Note", "type": "integer"}, "is_positive": {"title": "Is positive", "type": "boolean"}, "user": {"title": "User", "type": "integer", "readOnly": true, "x-nullable": true}}}, "Plan": {"required": ["price"], "type": "object", "properties": {"id": {"title": "ID", "type": "integer", "readOnly": true}, "title": {"title": "Title", "type": "string", "readOnly": true}, "price": {"title": "Price", "type": "string", "format": "decimal"}, "services": {"title": "Services", "type": "object"}, "duration": {"title": "Duration", "description": "Duration in days", "type": "integer", "maximum": 2147483647, "minimum": 0}}}, "Subscribe": {"required": ["plan"], "type": "object", "properties": {"plan": {"title": "Plan", "type": "integer"}, "activated_at": {"title": "Activated at", "type": "string", "format": "date", "readOnly": true}, "expire_at": {"title": "Expire at", "type": "string", "format": "date", "readOnly": true}, "remaining_days": {"title": "Remaining days", "type": "integer", "readOnly": true}, "remaining_credits": {"title": "Remaining credits", "type": "object", "readOnly": true}}}, "QuranPart": {"required": ["index", "start_at", "end_at"], "type": "object", "properties": {"index": {"title": "Index", "type": "integer", "maximum": 2147483647, "minimum": 0}, "start_at": {"title": "Start at", "type": "integer", "maximum": 2147483647, "minimum": 0}, "end_at": {"title": "End at", "type": "integer", "maximum": 2147483647, "minimum": 0}}}, "QuranSuraTranslation": {"required": ["text"], "type": "object", "properties": {"sura_id": {"title": "Sura id", "type": "string", "readOnly": true}, "text": {"title": "Text", "type": "string", "minLength": 1}}}, "QuranSura": {"required": ["index", "name", "verse_count", "nozul_type", "start_at", "end_at"], "type": "object", "properties": {"index": {"title": "Index", "type": "integer", "maximum": 2147483647, "minimum": 0}, "name": {"title": "Name", "type": "string", "maxLength": 192, "minLength": 1}, "similar_names": {"title": "Similar Names", "type": "object", "x-nullable": true}, "verse_count": {"title": "Verse count", "type": "integer", "maximum": 2147483647, "minimum": 0}, "nozul_type": {"title": "Nozul type", "type": "string", "enum": ["Meccan", "Medinan"]}, "start_at": {"title": "Start at", "type": "integer", "maximum": 2147483647, "minimum": 0}, "end_at": {"title": "End at", "type": "integer", "maximum": 2147483647, "minimum": 0}}}, "QuranTranslators": {"required": ["translator", "language_code"], "type": "object", "properties": {"translator": {"title": "Translator", "type": "string", "maxLength": 192, "minLength": 1}, "translator_en": {"title": "Translator en", "type": "string", "maxLength": 192, "minLength": 1, "x-nullable": true}, "language_code": {"title": "Language code", "type": "string", "maxLength": 2, "minLength": 1}}}, "QuranVerseLocalization": {"required": ["text"], "type": "object", "properties": {"verse_id": {"title": "Verse id", "type": "string", "readOnly": true}, "text": {"title": "Text", "type": "string", "minLength": 1}}}, "QuranVerseTranslation": {"required": ["text"], "type": "object", "properties": {"verse_id": {"title": "Verse id", "type": "string", "readOnly": true}, "text": {"title": "Text", "type": "string", "minLength": 1}}}, "QuranVerse": {"required": ["index", "number_in_surah", "juz", "text"], "type": "object", "properties": {"index": {"title": "Index", "type": "integer", "maximum": 2147483647, "minimum": 0}, "sura_id": {"title": "Sura id", "type": "string", "readOnly": true}, "number_in_surah": {"title": "Number in surah", "type": "integer", "maximum": 2147483647, "minimum": 0}, "juz": {"title": "Juz", "type": "integer", "maximum": 2147483647, "minimum": 0}, "text": {"title": "Text", "type": "string", "minLength": 1}, "glyph_text": {"title": "Glyph text", "type": "string", "maxLength": 500, "x-nullable": true}, "raw_text": {"title": "Raw text", "type": "string", "x-nullable": true}, "new_line_at": {"title": "New line at", "type": "string", "maxLength": 255, "x-nullable": true}}}, "QuranWordTranslation": {"required": ["verse", "arabic", "translate", "language_code"], "type": "object", "properties": {"verse": {"title": "Verse", "type": "integer"}, "arabic": {"title": "Arabic word", "type": "string", "maxLength": 255, "minLength": 1}, "translate": {"title": "Translate", "type": "string", "maxLength": 255, "minLength": 1}, "language_code": {"title": "Language code", "type": "string", "minLength": 1}}}, "Adhan": {"required": ["name"], "type": "object", "properties": {"id": {"title": "ID", "type": "integer", "readOnly": true}, "name": {"title": "Name", "type": "string", "maxLength": 64, "minLength": 1}, "description": {"title": "Description", "description": "could be null", "type": "string", "maxLength": 255, "x-nullable": true}, "file_path": {"title": "File path", "type": "string", "readOnly": true}}}, "Reminder": {"required": ["service_name", "object_id", "text"], "type": "object", "properties": {"id": {"title": "ID", "type": "integer", "readOnly": true}, "service_name": {"title": "Service Name", "description": "Name of the service (e.g., \"meet\", \"dua\", etc.)", "type": "string", "maxLength": 100, "minLength": 1}, "object_id": {"title": "Object ID", "description": "ID of the related object (meet ID, dua ID, etc.)", "type": "string", "maxLength": 100, "minLength": 1}, "text": {"title": "Reminder Text", "description": "The reminder message content", "type": "string", "minLength": 1}, "created_at": {"title": "Created At", "description": "When the reminder was created", "type": "string", "format": "date-time", "readOnly": true}, "call_time": {"title": "Call Time", "description": "When the reminder should be triggered/called", "type": "string", "format": "date-time", "x-nullable": true}, "is_sent": {"title": "Is Sent", "description": "Whether the reminder has been sent", "type": "boolean"}, "is_read": {"title": "Is Read", "description": "Whether the user has opened/read the reminder", "type": "boolean"}, "status": {"title": "Status", "description": "General status management for the reminder", "type": "boolean"}}}, "ReminderUpdate": {"type": "object", "properties": {"is_sent": {"title": "Is Sent", "description": "Whether the reminder has been sent", "type": "boolean"}, "is_read": {"title": "Is Read", "description": "Whether the user has opened/read the reminder", "type": "boolean"}, "status": {"title": "Status", "description": "General status management for the reminder", "type": "boolean"}}}, "Report": {"required": ["service_slug", "text"], "type": "object", "properties": {"service_slug": {"title": "Service slug", "type": "string", "enum": ["hussainiyah", "quran", "mafatih", "qiblah", "ahkam", "calendar", "talk", "meet", "library", "hadis", "habit", "checkup", "marriage"]}, "subject": {"title": "Subject", "type": "integer", "x-nullable": true}, "description": {"title": "Description", "type": "string", "x-nullable": true}, "text": {"title": "Report Text", "type": "string", "maxLength": 255, "minLength": 1}, "object_id": {"title": "Object id", "type": "integer", "maximum": 9223372036854775807, "minimum": 0, "x-nullable": true}}}, "Subject": {"required": ["name", "slug"], "type": "object", "properties": {"id": {"title": "ID", "type": "integer", "readOnly": true}, "name": {"title": "Name", "type": "string", "maxLength": 255, "minLength": 1}, "slug": {"title": "Slug", "type": "string", "format": "slug", "pattern": "^[-a-zA-Z0-9_]+$", "maxLength": 50, "minLength": 1}, "service": {"title": "Service", "type": "string", "readOnly": true}}}, "ServiceVersion": {"required": ["version_number", "language"], "type": "object", "properties": {"service": {"title": "Service", "type": "string", "readOnly": true}, "version_number": {"title": "Version Number", "description": "Version number in format 1.3", "type": "string", "maxLength": 20, "minLength": 1}, "language": {"$ref": "#/definitions/Language"}, "is_active": {"title": "Is active", "type": "string", "readOnly": true}, "service_config": {"title": "Service config", "type": "string", "readOnly": true}, "created_at": {"title": "Created At", "type": "string", "format": "date-time", "readOnly": true}, "app_intros": {"title": "App intros", "type": "string", "readOnly": true}, "service_intros": {"title": "Service intros", "type": "string", "readOnly": true}}}, "ShareApp": {"required": ["description"], "type": "object", "properties": {"description": {"title": "Description", "type": "string", "minLength": 1}, "image": {"title": "Image", "type": "string", "readOnly": true}}}, "TafsirVerses": {"required": ["from_verse", "to_verse", "text"], "type": "object", "properties": {"from_verse": {"title": "From verse", "type": "integer", "maximum": 2147483647, "minimum": 0}, "to_verse": {"title": "To verse", "type": "integer", "maximum": 2147483647, "minimum": 0}, "text": {"title": "Text", "type": "string", "minLength": 1}, "surah": {"title": "Surah", "type": "string", "readOnly": true}, "book": {"title": "Book", "type": "string", "readOnly": true}, "ayahs_index": {"title": "Ayahs index", "type": "string", "readOnly": true}}}, "TafsirBook": {"required": ["title"], "type": "object", "properties": {"id": {"title": "ID", "type": "integer", "readOnly": true}, "title": {"title": "Title", "type": "string", "maxLength": 112, "minLength": 1}, "surahs": {"title": "Surahs", "type": "string", "readOnly": true}}}, "Transaction": {"required": ["coin_count"], "type": "object", "properties": {"id": {"title": "ID", "type": "integer", "readOnly": true}, "coin_count": {"title": "Coin count", "type": "integer", "maximum": 2147483647, "minimum": 0}, "description": {"title": "Description", "type": "string", "readOnly": true}, "service": {"title": "Service", "type": "string", "enum": ["hussainiya", "library", "talk", "meet"], "x-nullable": true}, "created_at": {"title": "Created at", "type": "string", "format": "date-time", "readOnly": true}}}, "WithdrawalRequest": {"required": ["amount", "status"], "type": "object", "properties": {"id": {"title": "ID", "type": "integer", "readOnly": true}, "amount": {"title": "Amount", "type": "string", "format": "decimal"}, "status": {"title": "Status", "type": "string", "enum": ["pending", "completed", "failed"]}, "description": {"title": "Description", "type": "string", "maxLength": 255, "x-nullable": true}, "created_at": {"title": "Created at", "type": "string", "format": "date-time", "readOnly": true}, "updated_at": {"title": "Updated at", "type": "string", "format": "date-time", "readOnly": true}}}, "DuaCompleteSerializer": {"type": "object", "properties": {"id": {"title": "ID", "type": "integer", "readOnly": true}, "slug": {"title": "Slug", "type": "string", "readOnly": true}, "title": {"title": "Title", "type": "string", "readOnly": true}, "parts": {"title": "Parts", "type": "string", "readOnly": true}, "total_parts": {"title": "Total parts", "type": "string", "readOnly": true}, "seo_field": {"title": "Seo field", "type": "string", "readOnly": true}, "synced_at": {"title": "Synced at", "type": "string", "readOnly": true}}}, "Web_DuaCategoriesSerializer": {"type": "object", "properties": {"id": {"title": "ID", "type": "integer", "readOnly": true}, "name": {"title": "Name", "type": "string", "readOnly": true}, "slug": {"title": "Slug", "type": "string", "readOnly": true}, "thumbnails": {"title": "Thumbnails", "type": "string", "readOnly": true}, "language": {"title": "Language", "type": "string", "readOnly": true}, "children": {"title": "Children", "type": "string", "readOnly": true}}}, "Web_DuaSerializer": {"type": "object", "properties": {"id": {"title": "ID", "type": "integer", "readOnly": true}, "title": {"title": "Title", "type": "string", "readOnly": true}, "slug": {"title": "Slug", "type": "string", "readOnly": true}, "not_synced": {"title": "Not synced", "type": "boolean", "default": false}, "seo_field": {"title": "Seo field", "type": "string", "readOnly": true}}}, "Web_DuaPartSerializer": {"type": "object", "properties": {"id": {"title": "ID", "type": "integer", "readOnly": true}, "dua_part_index": {"title": "Dua part index", "type": "string", "readOnly": true}, "text": {"title": "Text", "type": "string", "x-nullable": true}, "translation": {"title": "Translation", "type": "string", "readOnly": true}, "local_alpha": {"title": "Local alpha", "type": "string", "readOnly": true}, "mafatih_dua_id": {"title": "Mafatih dua id", "type": "string", "readOnly": true}, "description": {"title": "Description", "type": "string", "readOnly": true}}}, "WebDuaAudio": {"type": "object", "properties": {"id": {"title": "ID", "type": "integer", "readOnly": true}, "reciter": {"title": "Reciter", "type": "string", "readOnly": true}, "audio": {"title": "Audio", "type": "string", "readOnly": true}, "audio_sync_data": {"title": "Audio sync data", "type": "object"}}}, "DuaReciter": {"type": "object", "properties": {"id": {"title": "ID", "type": "integer", "readOnly": true}, "name": {"title": "Name", "type": "string", "readOnly": true}, "slug": {"title": "Slug", "type": "string", "format": "slug", "pattern": "^[-a-zA-Z0-9_]+$", "maxLength": 120}, "avatar": {"title": "Avatar", "type": "string", "readOnly": true}}}, "QuranSurahDetailVerse": {"required": ["index", "number_in_surah", "juz", "text"], "type": "object", "properties": {"index": {"title": "Index", "type": "integer", "maximum": 2147483647, "minimum": 0}, "sura_id": {"title": "Sura id", "type": "string", "readOnly": true}, "number_in_surah": {"title": "Number in surah", "type": "integer", "maximum": 2147483647, "minimum": 0}, "juz": {"title": "Juz", "type": "integer", "maximum": 2147483647, "minimum": 0}, "text": {"title": "Text", "type": "string", "minLength": 1}, "glyph_text": {"title": "Glyph text", "type": "string", "maxLength": 500, "x-nullable": true}, "raw_text": {"title": "Raw text", "type": "string", "x-nullable": true}, "new_line_at": {"title": "New line at", "type": "string", "maxLength": 255, "x-nullable": true}, "text_translation": {"title": "Text translation", "type": "string", "readOnly": true}}}}} \ No newline at end of file +{"swagger": "2.0", "info": {"title": "Snippets API", "description": "Project API Documentation", "termsOfService": "https://www.google.com/policies/terms/", "contact": {"email": "nwhco.com"}, "license": {"name": "BSD License"}, "version": "v1"}, "host": "habibapp.com", "schemes": ["https"], "basePath": "/", "consumes": ["application/json"], "produces": ["application/json"], "securityDefinitions": {"Basic": {"type": "basic"}}, "security": [{"Basic": []}], "paths": {"/about-service/": {"get": {"operationId": "about-service_list", "description": "-- params: service", "parameters": [{"name": "limit", "in": "query", "description": "Number of results to return per page.", "required": false, "type": "integer"}, {"name": "offset", "in": "query", "description": "The initial index from which to return the results.", "required": false, "type": "integer"}, {"name": "service", "in": "query", "description": "Service type to filter by", "type": "string", "enum": ["main", "hussainiyah", "quran", "mafatih", "qiblah", "ahkam", "calendar", "talk", "meet", "library", "hadis", "account"]}], "responses": {"200": {"description": "", "schema": {"required": ["count", "results"], "type": "object", "properties": {"count": {"type": "integer"}, "next": {"type": "string", "format": "uri", "x-nullable": true}, "previous": {"type": "string", "format": "uri", "x-nullable": true}, "results": {"type": "array", "items": {"$ref": "#/definitions/AboutService"}}}}}}, "tags": ["about-service"]}, "parameters": []}, "/account/activity/create/": {"post": {"operationId": "account_activity_create_create", "description": "", "parameters": [{"name": "data", "in": "body", "required": true, "schema": {"$ref": "#/definitions/Activity"}}], "responses": {"201": {"description": "", "schema": {"$ref": "#/definitions/Activity"}}}, "tags": ["account"]}, "parameters": []}, "/account/auth/apple/": {"post": {"operationId": "account_auth_apple_create", "description": "", "parameters": [{"name": "data", "in": "body", "required": true, "schema": {"$ref": "#/definitions/AppleAuth"}}], "responses": {"201": {"description": "", "schema": {"$ref": "#/definitions/AppleAuth"}}}, "tags": ["account"]}, "parameters": []}, "/account/auth/google/": {"post": {"operationId": "account_auth_google_create", "description": "", "parameters": [{"name": "data", "in": "body", "required": true, "schema": {"$ref": "#/definitions/GoogleAuth"}}], "responses": {"201": {"description": "", "schema": {"$ref": "#/definitions/GoogleAuth"}}}, "tags": ["account"]}, "parameters": []}, "/account/auth/guest/": {"post": {"operationId": "account_auth_guest_create", "description": "\n### Guest Authentication API\n\nThis API is invoked during the app's intro phase to authenticate guest users. It collects device information\nand performs authentication based on the provided data. \n\n| **Field** | **Type** | **Required** | **Description** |\n|---------------------|------------|--------------|----------------------------------------|\n| `auth_method` | String | No | phone or third_party |\n| `country_code` | int | No | phone country code |\n\n#### Response:\n- **200 OK**: Returns `token`, `auth_method`, and `country_code`.\n- **400 Bad Request**: Input validation failed.\n- **500 Internal Server Error**: Unexpected error.\n\n#### Example Response:\n\n```json\n{\n \"token\": \"1e126d575f3e37d5f8f0fd5a893fae90a7511c25\",\n \"auth_method\": \"phone\",\n \"country_code\": 964\n},\n{\n \"token\": \"1e126d575f3e37d5f8f0fd5a893fae90a7511c25\",\n \"auth_method\": \"third_party\",\n \"country_code\": 964\n}\n```\n", "parameters": [{"name": "data", "in": "body", "required": true, "schema": {"$ref": "#/definitions/GuestUser"}}], "responses": {"201": {"description": "", "schema": {"$ref": "#/definitions/GuestUser"}}}, "tags": ["account"]}, "parameters": []}, "/account/auth/logout/": {"post": {"operationId": "account_auth_logout_create", "description": "\n### User Logout API\n\nThis API endpoint allows authenticated users to securely log out from the application. The logout process\nclears the user's FCM (Firebase Cloud Messaging) token to ensure they no longer receive push notifications\non the logged-out device.\n\n#### Key Features:\n- **Authentication Required**: Only authenticated users can access this endpoint\n- **FCM Token Clearing**: Automatically clears the user's FCM token to stop push notifications\n- **Secure Logout**: Provides a clean logout process following REST API best practices\n- **Error Handling**: Comprehensive error handling with appropriate HTTP status codes\n\n#### Business Logic:\n1. **Authentication Check**: Verifies that the user is properly authenticated via token\n2. **FCM Token Cleanup**: Sets the user's FCM token field to null/empty\n3. **Database Update**: Saves the user record with the cleared FCM token\n4. **Response Generation**: Returns appropriate success or error response\n\n#### Authentication:\n- **Required**: Yes\n- **Method**: Token-based authentication\n- **Header**: `Authorization: Token `\n\n#### HTTP Method:\n- **POST**: Used for logout action (following REST conventions for state-changing operations)\n\n#### Request Headers:\n| **Header** | **Type** | **Required** | **Description** |\n|-------------------|------------|--------------|-----------------------------------|\n| `Authorization` | String | Yes | Token |\n| `Content-Type` | String | Yes | application/json |\n\n#### Response Codes:\n- **200 OK**: Logout successful, FCM token cleared\n- **401 Unauthorized**: Authentication credentials not provided or invalid\n- **500 Internal Server Error**: Unexpected server error during logout\n\n#### Success Response Example:\n```json\n{\n \"status\": \"success\",\n \"message\": \"Logged out successfully\"\n}\n```\n\n#### Error Response Examples:\n\n**401 Unauthorized:**\n```json\n{\n \"detail\": \"Authentication credentials were not provided.\"\n}\n```\n\n**500 Internal Server Error:**\n```json\n{\n \"status\": \"error\",\n \"message\": \"An error occurred during logout\"\n}\n```\n\n#### Usage Example:\n```bash\ncurl -X POST https://api.example.com/auth/logout/ \\\n -H \"Authorization: Token 516e059d2a6b31d74b6a9e4c8f98fe4e8413efbc\" \\\n -H \"Content-Type: application/json\"\n```\n\n#### Security Considerations:\n- The FCM token is immediately cleared to prevent unauthorized push notifications\n- The authentication token remains valid until explicitly deleted or expired\n- Users should clear local storage/cache on the client side after successful logout\n- Consider implementing token blacklisting for enhanced security if needed\n\n#### Integration Notes:\n- After successful logout, clients should redirect users to the login screen\n- Clear any locally stored user data and authentication tokens\n- Stop any background services that depend on user authentication\n- Update UI state to reflect the logged-out status\n", "parameters": [], "responses": {"200": {"description": "Logout successful", "examples": {"application/json": {"status": "success", "message": "Logged out successfully"}}}, "401": {"description": "Authentication required", "examples": {"application/json": {"detail": "Authentication credentials were not provided."}}}, "500": {"description": "Internal server error", "examples": {"application/json": {"status": "error", "message": "An error occurred during logout"}}}}, "tags": ["account"]}, "parameters": []}, "/account/auth/phone/": {"post": {"operationId": "account_auth_phone_create", "description": "\n### Phone Authentication API\n\nThis API allows users to authenticate by providing a phone number. A one-time password (OTP) is sent to the\nuser via the specified method, and the response indicates whether the OTP was successfully sent.\n\n#### Response:\n- **200 OK**: Returns user ID, phone number, verification method, OTP send status, and time limit for resending the OTP.\n- **400 Bad Request**: Input validation failed.\n- **500 Internal Server Error**: Unexpected error occurred.\n\n#### Output Fields:\n\n| **Field** | **Type** | **Description** |\n|---------------------------|------------|----------------------------------------------------------|\n| `user_id` | String | Unique identifier of the authenticated user. |\n| `phone_number` | String | The phone number used for authentication. |\n| `verification_method` | String | Method used to send the OTP (e.g., \"SMS\" or \"WHATSAPP\").|\n| `verification_time_limit` | Integer | Time (in minutes) until the OTP can be resent. |\n| `is_send` | Boolean | Indicates whether the OTP was successfully sent. |\n\n#### Example Response:\n\n```json\n{\n \"user_id\": \"1a2b3c4d\",\n \"phone_number\": \"+1234567890\",\n \"verification_method\": \"WHATSAPP\",\n \"verification_time_limit\": 5,\n \"is_send\": true\n}\n```\n", "parameters": [{"name": "data", "in": "body", "required": true, "schema": {"$ref": "#/definitions/PhoneAuth"}}], "responses": {"201": {"description": "", "schema": {"$ref": "#/definitions/PhoneAuth"}}}, "tags": ["account"]}, "parameters": []}, "/account/auth/staff/login/": {"post": {"operationId": "account_auth_staff_login_create", "summary": "Email/password login for staff, admin and superuser accounts.", "description": "Returns a DRF auth token (the same token type used everywhere else in the\nproject, see ``TokenAuthentication2``) so the dashboard can authenticate\nsubsequent requests with ``Authorization: Token ``.\n\nOpen to anonymous callers (``AllowAny``) — the staff check happens inside\nthe serializer; only an account with ``is_staff``/``is_superuser`` and a\ncorrect password gets a token back.", "parameters": [{"name": "data", "in": "body", "required": true, "schema": {"required": ["email", "password"], "type": "object", "properties": {"email": {"type": "string", "format": "email"}, "password": {"type": "string", "format": "password"}}}}], "responses": {"200": {"description": "Authenticated", "schema": {"type": "object", "properties": {"token": {"type": "string"}, "user_id": {"type": "integer"}, "email": {"type": "string"}, "name": {"type": "string"}, "is_staff": {"type": "boolean"}, "is_superuser": {"type": "boolean"}}}}, "400": {"description": "Invalid credentials or not a staff account"}}, "tags": ["account"]}, "parameters": []}, "/account/auth/user/me/": {"get": {"operationId": "account_auth_user_me_list", "description": "این متد اطلاعات کاربر را برمی‌گرداند", "parameters": [], "responses": {"200": {"description": "اطلاعات کاربر", "examples": {"application/json": {"user_id": "ایدی کاربر", "name": "نام کاربر", "email": "ایمیل کاربر", "avatar": "آدرس آواتار", "country": "کشور", "city": "شهر", "phone_number": "شماره تلفن", "possible_phone_number": "شماره تماس احتمالی کاربر", "is_phone_number_verified": "شماره تماس تایید شده باشد", "date_joined": "تاریخ عضویت", "publisher_in": "اطلاعات ناشر", "settings": "تنظیمات کاربر", "provider": "اطلاعات ارائه‌دهنده", "coin_balance": "موجودی کوین ها", "balance_in_dollars": "مقدار دلار کاربر (اگر پرووایدر نباشد خالی است)", "notification_count": "تعداد نوتیفیکیشن‌ها", "bucket_services": "لیست سرویس باکت های کاربر"}}}}, "tags": ["account"]}, "parameters": []}, "/account/auth/user/merge/": {"post": {"operationId": "account_auth_user_merge_create", "description": "", "parameters": [{"name": "data", "in": "body", "required": true, "schema": {"$ref": "#/definitions/MergeAccount"}}], "responses": {"201": {"description": "", "schema": {"$ref": "#/definitions/MergeAccount"}}}, "tags": ["account"]}, "parameters": []}, "/account/auth/user/merge/phone/info/": {"get": {"operationId": "account_auth_user_merge_phone_info_list", "description": "", "parameters": [{"name": "limit", "in": "query", "description": "Number of results to return per page.", "required": false, "type": "integer"}, {"name": "offset", "in": "query", "description": "The initial index from which to return the results.", "required": false, "type": "integer"}], "responses": {"200": {"description": ""}}, "tags": ["account"]}, "parameters": []}, "/account/auth/user/merge/phone/verify/": {"post": {"operationId": "account_auth_user_merge_phone_verify_create", "description": "", "parameters": [{"name": "data", "in": "body", "required": true, "schema": {"$ref": "#/definitions/MergeVerify"}}], "responses": {"201": {"description": "", "schema": {"$ref": "#/definitions/MergeVerify"}}}, "tags": ["account"]}, "parameters": []}, "/account/auth/user/profile/update/": {"put": {"operationId": "account_auth_user_profile_update_update", "description": "", "parameters": [{"name": "data", "in": "body", "required": true, "schema": {"$ref": "#/definitions/UserProfile"}}], "responses": {"200": {"description": "", "schema": {"$ref": "#/definitions/UserProfile"}}}, "tags": ["account"]}, "patch": {"operationId": "account_auth_user_profile_update_partial_update", "description": "", "parameters": [{"name": "data", "in": "body", "required": true, "schema": {"$ref": "#/definitions/UserProfile"}}], "responses": {"200": {"description": "", "schema": {"$ref": "#/definitions/UserProfile"}}}, "tags": ["account"]}, "parameters": []}, "/account/auth/user/region/": {"get": {"operationId": "account_auth_user_region_list", "description": "", "parameters": [{"name": "limit", "in": "query", "description": "Number of results to return per page.", "required": false, "type": "integer"}, {"name": "offset", "in": "query", "description": "The initial index from which to return the results.", "required": false, "type": "integer"}], "responses": {"200": {"description": ""}}, "tags": ["account"]}, "parameters": []}, "/account/auth/verify/": {"post": {"operationId": "account_auth_verify_create", "description": "\n### Phone Verification Logic\n\nThe phone verification process ensures user authenticity through a one-time verification code. Below is the streamlined flow:\n\n1. **Input Validation **:\n - Accepts `user_id`, `phone_number`, and a 5-digit `code`.\n - Validates input and raises errors for missing or invalid data.\n\n2. **User Retrieval**:\n - Fetch the user using `user_id`.\n - Raise an error if the user does not exist.\n\n3. **Verification Data Fetch**:\n - Retrieve the verification data from Redis using `phone_number`.\n - Raise an error if data is missing or expired.\n\n4. **Code Comparison**:\n - Compare the provided `code` with the one in Redis.\n - Raise an error for mismatched codes.\n\n5. **User Update**:\n - On success, update the user's `phone_number` and mark them as verified.\n\n6. **Response Generation**:\n - Return an authentication token along with user profile details (e.g., name, email, location, settings).\n\n#### Failure Scenarios:\n- Errors are raised for invalid input, missing verification data, or incorrect codes.\n\nThis process ensures secure and efficient phone verification.\n", "parameters": [{"name": "data", "in": "body", "required": true, "schema": {"$ref": "#/definitions/PhoneVerify"}}], "responses": {"201": {"description": "", "schema": {"$ref": "#/definitions/PhoneVerify"}}}, "tags": ["account"]}, "parameters": []}, "/account/auth/{device_id}/update/": {"put": {"operationId": "account_auth_update_update", "description": "", "parameters": [{"name": "data", "in": "body", "required": true, "schema": {"$ref": "#/definitions/GuestUser"}}], "responses": {"200": {"description": "", "schema": {"$ref": "#/definitions/GuestUser"}}}, "tags": ["account"]}, "patch": {"operationId": "account_auth_update_partial_update", "description": "", "parameters": [{"name": "data", "in": "body", "required": true, "schema": {"$ref": "#/definitions/GuestUser"}}], "responses": {"200": {"description": "", "schema": {"$ref": "#/definitions/GuestUser"}}}, "tags": ["account"]}, "parameters": [{"name": "device_id", "in": "path", "required": true, "type": "string"}]}, "/account/bucket/update/": {"get": {"operationId": "account_bucket_update_list", "description": "Remove a service from user's bucket services", "parameters": [{"name": "limit", "in": "query", "description": "Number of results to return per page.", "required": false, "type": "integer"}, {"name": "offset", "in": "query", "description": "The initial index from which to return the results.", "required": false, "type": "integer"}, {"name": "service", "in": "query", "description": "Service name to remove from bucket services", "required": false, "type": "string"}], "responses": {"200": {"description": "Service removed successfully from bucket services", "examples": {"application/json": {"message": "Successfully updated"}}}, "400": {"description": "Bad request"}, "401": {"description": "Authentication credentials were not provided"}}, "tags": ["account"]}, "parameters": []}, "/account/delete-account/": {"post": {"operationId": "account_delete-account_create", "description": "", "parameters": [], "responses": {"201": {"description": ""}}, "tags": ["account"]}, "parameters": []}, "/account/geolocation/": {"get": {"operationId": "account_geolocation_list", "description": "Get geolocation information based on the client's IP address", "parameters": [], "responses": {"200": {"description": "Geolocation information", "schema": {"$ref": "#/definitions/IPGeolocation"}}, "404": {"description": "IP address not found in database or database not available"}, "500": {"description": "Internal server error"}}, "tags": ["account"]}, "parameters": []}, "/account/geolocation/coordinates/": {"get": {"operationId": "account_geolocation_coordinates_list", "description": "Get location information (city, country) based on geographic coordinates using reverse geocoding", "parameters": [{"name": "lat", "in": "query", "description": "Latitude coordinate (-90 to 90)", "required": true, "type": "number"}, {"name": "lon", "in": "query", "description": "Longitude coordinate (-180 to 180)", "required": true, "type": "number"}], "responses": {"200": {"description": "Location information", "schema": {"$ref": "#/definitions/ReverseGeolocationResponse"}}, "400": {"description": "Invalid or missing coordinates"}, "404": {"description": "No location found for the given coordinates"}, "500": {"description": "Internal server error"}}, "tags": ["account"]}, "parameters": []}, "/account/location-update/": {"post": {"operationId": "account_location-update_create", "description": "", "parameters": [{"name": "data", "in": "body", "required": true, "schema": {"$ref": "#/definitions/LocationHistory"}}], "responses": {"201": {"description": "", "schema": {"$ref": "#/definitions/LocationHistory"}}}, "tags": ["account"]}, "parameters": []}, "/account/notif-list/": {"get": {"operationId": "account_notif-list_list", "description": "### Example JSON Response:\n```json\n{\n \"count\": 36,\n \"next\": \"https://habibapp.com/account/notif-list/?limit=16&offset=16\",\n \"previous\": null,\n \"results\": [\n {\n \"id\": 126753,\n \"service\": \"mafatih\",\n \"title\": \"اللهم عجل لولیک الفرج\",\n \"message\": \"خواهر یا اخوان،\",\n \"data\": \"4450\",\n \"image\": null,\n \"is_read\": true,\n \"created_at\": \"2024-10-06T14:39:32.893330\"\n }\n ]\n}\n```", "parameters": [{"name": "limit", "in": "query", "description": "Number of results to return per page.", "required": false, "type": "integer"}, {"name": "offset", "in": "query", "description": "The initial index from which to return the results.", "required": false, "type": "integer"}, {"name": "service", "in": "query", "description": "Specify the service to filter messages (optional).", "required": false, "type": "string", "enum": ["hussainiya", "library", "talk", "meet", "mafatih", "hadis", "khatm", "quran", "tafsir", "ahkam", "coin", "global"]}], "responses": {"200": {"description": "", "schema": {"required": ["count", "results"], "type": "object", "properties": {"count": {"type": "integer"}, "next": {"type": "string", "format": "uri", "x-nullable": true}, "previous": {"type": "string", "format": "uri", "x-nullable": true}, "results": {"type": "array", "items": {"$ref": "#/definitions/UserNotification"}}}}}}, "tags": ["notification"]}, "parameters": []}, "/account/provider/requests/": {"get": {"operationId": "account_provider_requests_list", "description": "", "parameters": [{"name": "limit", "in": "query", "description": "Number of results to return per page.", "required": false, "type": "integer"}, {"name": "offset", "in": "query", "description": "The initial index from which to return the results.", "required": false, "type": "integer"}], "responses": {"200": {"description": "", "schema": {"required": ["count", "results"], "type": "object", "properties": {"count": {"type": "integer"}, "next": {"type": "string", "format": "uri", "x-nullable": true}, "previous": {"type": "string", "format": "uri", "x-nullable": true}, "results": {"type": "array", "items": {"$ref": "#/definitions/Provider"}}}}}}, "tags": ["account"]}, "post": {"operationId": "account_provider_requests_create", "description": "", "parameters": [{"name": "data", "in": "body", "required": true, "schema": {"$ref": "#/definitions/Provider"}}], "responses": {"201": {"description": "", "schema": {"$ref": "#/definitions/Provider"}}}, "tags": ["account"]}, "parameters": []}, "/account/read-all-notif/": {"get": {"operationId": "account_read-all-notif_list", "description": "", "parameters": [{"name": "service", "in": "query", "description": "Specify the service to filter messages (optional). If omitted, all messages for the user will be marked as read.", "required": false, "type": "string", "enum": ["hussainiya", "library", "talk", "meet", "mafatih", "hadis", "khatm", "quran", "tafsir", "ahkam", "coin", "global", "null"]}, {"name": "value_id", "in": "query", "description": "value_id optional parameter to mark a specific message as read.(value id notificaiton)", "required": false, "type": "string"}], "responses": {"200": {"description": "Messages marked as read"}, "400": {"description": "Service parameter is required"}}, "tags": ["notification"]}, "parameters": []}, "/account/send-notification/": {"post": {"operationId": "account_send-notification_create", "description": "", "parameters": [{"name": "data", "in": "body", "required": true, "schema": {"description": "Send notification to authenticated user with flexible payload options:\n\n 1. Regular notification: Provide title and message\n 2. Data-only notification: Omit title and message, provide data_notif\n 3. Custom payload: Set use_custom_payload=true to send data_notif keys directly in Firebase payload\n\n When use_custom_payload=true, you can test full FCM payload structure including Android-specific configurations.", "required": [], "type": "object", "properties": {"title": {"description": "Notification title (optional - if both title and message are omitted, sends data-only notification)", "type": "string"}, "message": {"description": "Notification message (optional - if both title and message are omitted, sends data-only notification)", "type": "string"}, "data_notif": {"description": "Additional data to send with notification (can be object or JSON string)", "type": "object"}, "use_custom_payload": {"description": "If true, all keys from data_notif will be placed directly in the Firebase payload message object", "type": "boolean", "default": false}}}}], "responses": {"200": {"description": "Notification sent successfully", "schema": {"type": "object", "properties": {"result": {"description": "FCM response result", "type": "array", "items": {"type": "object"}}}}}, "400": {"description": "Bad request - invalid data_notif format"}, "404": {"description": "User not found"}}, "tags": ["notification"]}, "parameters": []}, "/account/settings/": {"put": {"operationId": "account_settings_update", "description": "", "parameters": [{"name": "data", "in": "body", "required": true, "schema": {"$ref": "#/definitions/UserSettings"}}], "responses": {"200": {"description": "", "schema": {"$ref": "#/definitions/UserSettings"}}}, "tags": ["account"]}, "patch": {"operationId": "account_settings_partial_update", "description": "", "parameters": [{"name": "data", "in": "body", "required": true, "schema": {"$ref": "#/definitions/UserSettings"}}], "responses": {"200": {"description": "", "schema": {"$ref": "#/definitions/UserSettings"}}}, "tags": ["account"]}, "parameters": []}, "/api/chat-producer/": {"post": {"operationId": "api_chat-producer_create", "description": "API producer for chat application", "parameters": [], "responses": {"201": {"description": ""}}, "tags": ["Talk"]}, "parameters": []}, "/api/crm/reviews/": {"get": {"operationId": "api_crm_reviews_list", "description": "", "parameters": [{"name": "platform", "in": "query", "description": "", "required": false, "type": "string"}, {"name": "needs_human_intervention", "in": "query", "description": "", "required": false, "type": "string"}, {"name": "review_status", "in": "query", "description": "", "required": false, "type": "string"}, {"name": "ordering", "in": "query", "description": "Which field to use when ordering the results.", "required": false, "type": "string"}, {"name": "search", "in": "query", "description": "A search term.", "required": false, "type": "string"}, {"name": "limit", "in": "query", "description": "Number of results to return per page.", "required": false, "type": "integer"}, {"name": "offset", "in": "query", "description": "The initial index from which to return the results.", "required": false, "type": "integer"}], "responses": {"200": {"description": "", "schema": {"required": ["count", "results"], "type": "object", "properties": {"count": {"type": "integer"}, "next": {"type": "string", "format": "uri", "x-nullable": true}, "previous": {"type": "string", "format": "uri", "x-nullable": true}, "results": {"type": "array", "items": {"$ref": "#/definitions/ReviewList"}}}}}}, "tags": ["api"]}, "post": {"operationId": "api_crm_reviews_create", "description": "", "parameters": [{"name": "data", "in": "body", "required": true, "schema": {"$ref": "#/definitions/ReviewDetail"}}], "responses": {"201": {"description": "", "schema": {"$ref": "#/definitions/ReviewDetail"}}}, "tags": ["api"]}, "parameters": []}, "/api/crm/reviews/{id}/": {"get": {"operationId": "api_crm_reviews_read", "description": "", "parameters": [], "responses": {"200": {"description": "", "schema": {"$ref": "#/definitions/ReviewDetail"}}}, "tags": ["api"]}, "put": {"operationId": "api_crm_reviews_update", "description": "", "parameters": [{"name": "data", "in": "body", "required": true, "schema": {"$ref": "#/definitions/ReviewDetail"}}], "responses": {"200": {"description": "", "schema": {"$ref": "#/definitions/ReviewDetail"}}}, "tags": ["api"]}, "patch": {"operationId": "api_crm_reviews_partial_update", "description": "", "parameters": [{"name": "data", "in": "body", "required": true, "schema": {"$ref": "#/definitions/ReviewDetail"}}], "responses": {"200": {"description": "", "schema": {"$ref": "#/definitions/ReviewDetail"}}}, "tags": ["api"]}, "delete": {"operationId": "api_crm_reviews_delete", "description": "", "parameters": [], "responses": {"204": {"description": ""}}, "tags": ["api"]}, "parameters": [{"name": "id", "in": "path", "required": true, "type": "string"}]}, "/api/crm/reviews/{id}/edit_reply/": {"patch": {"operationId": "api_crm_reviews_edit_reply", "description": "", "parameters": [{"name": "data", "in": "body", "required": true, "schema": {"$ref": "#/definitions/ReviewDetail"}}], "responses": {"200": {"description": "", "schema": {"$ref": "#/definitions/ReviewDetail"}}}, "tags": ["api"]}, "parameters": [{"name": "id", "in": "path", "required": true, "type": "string"}]}, "/api/crm/reviews/{id}/reply/": {"post": {"operationId": "api_crm_reviews_reply", "description": "", "parameters": [{"name": "data", "in": "body", "required": true, "schema": {"$ref": "#/definitions/ReviewDetail"}}], "responses": {"201": {"description": "", "schema": {"$ref": "#/definitions/ReviewDetail"}}}, "tags": ["api"]}, "parameters": [{"name": "id", "in": "path", "required": true, "type": "string"}]}, "/api/marriage/cases/{case_id}/contact-info/": {"get": {"operationId": "api_marriage_cases_contact-info_list", "description": "\nدریافت اطلاعات تماس خانم پس از پرداخت\n\nپس از تأیید پرداخت (وضعیت payment_done)، آقا می‌تواند اطلاعات تماس\nمجاز خانم را دریافت کند.\n\nشرایط دسترسی:\n - کاربر (آقا یا خانم) باید عضو این کیس باشد\n - وضعیت کیس باید دقیقاً payment_done باشد\n\nاطلاعات تماس قابل‌نمایش توسط ادمین از طریق فیلد female_contact_keys در کیس\nبرای هر کیس به‌صورت اختصاصی تنظیم می‌شود.\nمثال کلیدهای رایج: phone_father, phone_self, address\n\nخروجی: لیستی از فیلدهای فرم با کلید، برچسب، نوع و مقدار واقعی\n", "parameters": [], "responses": {"200": {"description": "ادمین هنوز هیچ کلید تماسی برای این کیس تنظیم نکرده", "examples": {"application/json": {"contact_info": []}}}, "403": {"description": "دسترسی ندارید یا کیس هنوز payment_done نیست", "examples": {"application/json": {"detail": "اطلاعات تماس فقط پس از تأیید پرداخت در دسترس است."}}}, "401": {"description": "کاربر احراز هویت نشده است"}, "404": {"description": "کیس یافت نشد"}}, "tags": ["Marriage"]}, "parameters": [{"name": "case_id", "in": "path", "required": true, "type": "string"}]}, "/api/marriage/cases/{case_id}/contact-status/": {"post": {"operationId": "api_marriage_cases_contact-status_create", "description": "\nگزارش وضعیت تماس پس از دریافت اطلاعات — فقط توسط خانم\n\nخانم پس از دریافت اطلاعات تماس آقا (پس از payment_done) باید در مهلت ۴۸ ساعت\nوضعیت تماس را گزارش دهد. کنترل زمان ۴۸ ساعت در کلاینت انجام می‌شود.\n\nزمان اشتراک‌گذاری اطلاعات تماس از فیلد `contact_shared_at` در `active_case` قابل دسترسی است.\n\nپیش‌شرط:\n - فقط خانم می‌تواند این اندپوینت را فراخوانی کند\n - وضعیت کیس باید payment_done باشد\n\nمنطق:\n contacted →\n وضعیت کیس: payment_done → finalized\n هر دو پروفایل: in_case → matched\n reason_code و custom_note (اگر ارسال شده باشند) در CaseRejection ذخیره می‌شوند\n (کیس با موفقیت به نتیجه رسید)\n\n no_contact →\n جریمه time_suspend برای آقا ثبت می‌شود (۷ روز تعلیق)\n وضعیت کیس: payment_done → dismissed\n reason_code و custom_note در CaseRejection ذخیره می‌شوند\n پروفایل آقا: in_case → suspended (+ penalty_until تنظیم می‌شود)\n پروفایل خانم: in_case → waiting (آزاد برای کیس جدید)\n", "parameters": [{"name": "data", "in": "body", "required": true, "schema": {"required": ["action"], "type": "object", "properties": {"action": {"description": "contacted: آقا تماس گرفت | no_contact: آقا تماس نگرفت", "type": "string", "enum": ["contacted", "no_contact"]}, "reason_code": {"description": "کد دلیل (اختیاری) — مثال: no_call_received, wrong_number", "type": "string"}, "custom_note": {"description": "توضیح اضافه (اختیاری)", "type": "string"}}, "example": {"action": "no_contact", "reason_code": "no_call_received", "custom_note": "48 ساعت گذشته ولی تماسی نگرفت"}}}], "responses": {"200": {"description": "وضعیت تماس ثبت شد — حالت no_contact (جریمه اعمال شد، status در database dismissed است اما در response male_accepted نمایش داده می‌شود)", "examples": {"application/json": {"detail": "عدم تماس ثبت شد. جریمه اعمال گردید.", "case": {"id": 15, "status": "male_accepted", "introduced_at": "2026-04-20T08:30:00Z", "male_responded_at": "2026-04-20T10:15:00Z", "female_responded_at": "2026-04-21T09:00:00Z", "payment_done_at": "2026-04-21T09:00:00Z", "contact_shared_at": "2026-04-21T09:00:00Z"}}}}, "400": {"description": "وضعیت کیس برای این عملیات مناسب نیست", "examples": {"application/json": {"detail": "وضعیت کیس برای این عملیات مناسب نیست."}}}, "403": {"description": "فقط خانم می‌تواند این عملیات را انجام دهد", "examples": {"application/json": {"detail": "فقط خانم می‌تواند وضعیت تماس را گزارش دهد."}}}, "401": {"description": "کاربر احراز هویت نشده است"}, "404": {"description": "کیس یافت نشد"}}, "tags": ["Marriage"]}, "parameters": [{"name": "case_id", "in": "path", "required": true, "type": "string"}]}, "/api/marriage/cases/{case_id}/respond/": {"post": {"operationId": "api_marriage_cases_respond_create", "description": "\nپاسخ به کیس معرفی (تأیید یا رد)\n\nآقا یا خانم می‌توانند کیس پیشنهادی را تأیید یا رد کنند.\n\nمنطق انتقال وضعیت:\n\nآقا (وقتی کیس در introduced است):\n accept → male_accepted (اطلاعات عمومی خانم برای آقا قابل مشاهده می‌شود)\n reject → male_rejected (هر دو پروفایل به waiting برمی‌گردند)\n\nخانم (وقتی کیس در male_accepted است):\n accept →\n اگر آقا اشتراک معتبر دارد: payment_done (مستقیم — consume_usage فراخوانی می‌شود)\n اگر آقا اشتراک ندارد: payment_pending (نیاز به خرید اشتراک)\n **توجه:** در response، status به `male_accepted` تبدیل می‌شود و جزئیات پرداخت از `needs_subscription` مشخص می‌شود\n reject → female_rejected (هر دو پروفایل به waiting برمی‌گردند)\n\nreason_code: کدهای هاردکد‌شده در فرانت‌اند — مثال: not_matched_financially, changed_mind\ncustom_note: توضیح اضافه اختیاری\n", "parameters": [{"name": "data", "in": "body", "required": true, "schema": {"required": ["action"], "type": "object", "properties": {"action": {"description": "تأیید یا رد کیس", "type": "string", "enum": ["accept", "reject"]}, "reason_code": {"description": "کد دلیل رد (اختیاری) — مثال: not_matched_financially", "type": "string", "default": ""}, "custom_note": {"description": "توضیح اضافه (اختیاری)", "type": "string", "default": ""}}, "example": {"action": "reject", "reason_code": "not_matched_financially", "custom_note": "از نظر مالی تناسب نداشتیم"}}}], "responses": {"200": {"description": "آقا تأیید کرد و خانم هم تأیید کرد — در database به payment_done می‌رود اما در response male_accepted نمایش داده می‌شود", "examples": {"application/json": {"detail": "پاسخ شما با موفقیت ثبت شد.", "case": {"id": 15, "status": "male_accepted", "introduced_at": "2026-04-20T08:30:00Z", "male_responded_at": "2026-04-20T10:15:00Z", "female_responded_at": "2026-04-21T09:00:00Z", "payment_done_at": "2026-04-21T09:00:00Z", "contact_shared_at": "2026-04-21T09:00:00Z"}}}}, "400": {"description": "وضعیت کیس برای این عملیات مناسب نیست", "examples": {"application/json": {"detail": "وضعیت کیس برای این عملیات مناسب نیست."}}}, "403": {"description": "کاربر عضو این کیس نیست", "examples": {"application/json": {"detail": "شما به این کیس دسترسی ندارید."}}}, "401": {"description": "کاربر احراز هویت نشده است"}, "404": {"description": "کیس یافت نشد"}}, "tags": ["Marriage"]}, "parameters": [{"name": "case_id", "in": "path", "required": true, "type": "string"}]}, "/api/marriage/match/start/": {"post": {"operationId": "api_marriage_match_start_create", "description": "\nورود به صف مچینگ\n\nپس از تکمیل تمام محورهای اجباری، کاربر می‌تواند وارد صف انتظار شود\nتا سیستم برایش یک کیس مناسب پیدا کند.\n\nپیش‌شرط‌ها:\n ۱. وضعیت پروفایل باید pending_info باشد\n ۲. کاربر نباید معلق (suspended) باشد\n ۳. تمام محورهای is_required=True باید current_step >= total_steps داشته باشند\n\nپس از موفقیت:\n وضعیت پروفایل از pending_info به waiting تغییر می‌کند.\n ویرایش فرم‌ها قفل می‌شود (can_edit_profile = False).\n", "parameters": [], "responses": {"200": {"description": "با موفقیت وارد صف مچینگ شدید", "examples": {"application/json": {"detail": "با موفقیت وارد صف مچینگ شدید."}}}, "400": {"description": "خطا — پروفایل ناقص یا وضعیت نامناسب", "examples": {"application/json": {"detail": "لطفاً ابتدا تمام محورهای اجباری را تکمیل کنید."}}}, "403": {"description": "کاربر معلق است", "examples": {"application/json": {"detail": "حساب شما معلق است و امکان ورود به صف مچینگ را ندارید."}}}, "401": {"description": "کاربر احراز هویت نشده است"}}, "tags": ["Marriage"]}, "parameters": []}, "/api/marriage/profile/basic/": {"patch": {"operationId": "api_marriage_profile_basic_partial_update", "description": "\nثبت اطلاعات پایه پروفایل (آنبوردینگ)\n\nاولین قدم پس از ورود به سیستم مریج.\nجنسیت و نوع ثبت‌نام کاربر ثبت می‌شود.\n\nمنطق انتقال وضعیت:\n pending_onboarding → pending_info (وقتی هر دو فیلد پر شوند)\n\nis_registering_for_self:\n - True: کاربر برای خودش ثبت‌نام می‌کند\n - False: کاربر برای شخص دیگری (مثلاً خواهر) ثبت‌نام می‌کند\n این مقدار روی کدام محورهای فرم نمایش داده شوند تأثیر مستقیم دارد.\n\nخروجی: پروفایل آپدیت‌شده (همان فرمت GET /profile/main/)\n", "parameters": [{"name": "data", "in": "body", "required": true, "schema": {"required": ["gender", "is_registering_for_self"], "type": "object", "properties": {"gender": {"description": "جنسیت کاربر", "type": "string", "enum": ["male", "female"]}, "is_registering_for_self": {"description": "True = برای خودش | False = برای شخص دیگر", "type": "boolean"}}, "example": {"gender": "male", "is_registering_for_self": true}}}], "responses": {"200": {"description": "اطلاعات پایه با موفقیت ثبت شد", "examples": {"application/json": {"id": 42, "status": "pending_info", "gender": "male", "is_registering_for_self": true, "can_edit_profile": true, "can_message_expert": false, "active_subscription": null, "is_ready_for_match": false, "active_case": null, "needs_subscription": false, "match_summary": null}}}, "400": {"description": "خطا در اعتبارسنجی ورودی", "examples": {"application/json": {"gender": ["مقدار وارد شده معتبر نیست."], "is_registering_for_self": ["این فیلد الزامی است."]}}}, "401": {"description": "کاربر احراز هویت نشده است"}}, "tags": ["Marriage"]}, "parameters": []}, "/api/marriage/profile/main/": {"get": {"operationId": "api_marriage_profile_main_list", "description": "\n## دریافت وضعیت کامل پروفایل مریج\n\nاصلی‌ترین اندپوینت ماژول مریج. تمام اطلاعات لازم برای رندر صفحه اصلی را در یک درخواست برمی‌گرداند.\nاگر پروفایل وجود نداشته باشد، به‌صورت خودکار ساخته می‌شود.\n\n---\n\n### فیلدهای پاسخ\n\n| فیلد | نوع | توضیح |\n|------|-----|-------|\n| `id` | integer | شناسه پروفایل |\n| `status` | string | وضعیت فعلی پروفایل (جدول وضعیت‌ها را ببینید) |\n| `gender` | string\\|null | جنسیت: `male` \\| `female` \\| `null` |\n| `is_registering_for_self` | boolean\\|null | `true` = برای خودش \\| `false` = برای شخص دیگر |\n| `can_edit_profile` | boolean | فقط در `pending_onboarding` / `pending_info` مجاز است |\n| `can_message_expert` | boolean | `true` اگر `in_case` باشد یا آقا اشتراک معتبر داشته باشد |\n| `active_subscription` | object\\|null | اشتراک فعال و معتبر — `null` اگر نداشته باشد |\n| `is_ready_for_match` | boolean | تمام فرم‌های `is_required=true` تکمیل شده‌اند |\n| `active_case` | object\\|null | اطلاعات کیس فعال — `null` اگر در کیس نباشد. شامل `my_action` و `other_action` |\n| `needs_subscription` | boolean | `true` فقط برای آقا در `payment_pending` بدون اشتراک معتبر. **توجه:** status های `payment_pending` و `payment_done` در response به `male_accepted` تبدیل می‌شوند و جزئیات پرداخت از این فیلد مشخص می‌شود |\n| `recommended_plan` | object\\|null | پلن پیشنهادی برای خرید اشتراک — همیشه اولین پلن فعال (کمترین order/price) |\n| `match_summary` | object\\|null | خلاصه عمومی پروفایل طرف مقابل — فقط در وضعیت‌های کیس فعال |\n\n---\n\n### جدول وضعیت‌های پروفایل (`status`)\n\n| مقدار | معنا |\n|-------|------|\n| `pending_onboarding` | هنوز جنسیت ثبت نشده |\n| `pending_info` | در حال تکمیل فرم‌ها |\n| `waiting` | در صف انتظار مچینگ |\n| `in_case` | در کیس فعال — ویرایش فرم‌ها قفل است |\n| `suspended` | معلق به دلیل جریمه (عدم تماس) |\n| `matched` | کیس به نتیجه رسیده |\n\n---\n\n### فیلد `active_case`\n\n| فیلد | نوع | توضیح |\n|------|-----|-------|\n| `case_id` | integer | شناسه کیس |\n| `status` | string | وضعیت کیس. **توجه:** `payment_pending` و `payment_done` در response به `male_accepted` تبدیل می‌شوند. جزئیات پرداخت از `needs_subscription` و `payment_done_at` مشخص می‌شود |\n| `introduced_at` | datetime | تاریخ معرفی |\n| `contact_shared_at` | datetime\\|null | تاریخ اشتراک‌گذاری اطلاعات تماس به آقا |\n| `minutes_since_contact_shared` | float\\|null | تعداد دقیقه‌های سپری شده از اشتراک‌گذاری — محاسبه شده توسط سرور |\n| `can_report_no_contact` | boolean | `true` اگر ۴۸ ساعت (۲۸۸۰ دقیقه) گذشته باشد — برای فعال‌سازی دکمه |\n| `my_action` | string | اقدام مورد نیاز از کاربر فعلی |\n| `other_action` | string | اقدام مورد نیاز از طرف مقابل |\n\n#### مقادیر `my_action` / `other_action`\n\n| مقدار | معنا |\n|-------|------|\n| `pending` | نوبت این طرف است که تأیید یا رد کند |\n| `waiting` | منتظر اقدام طرف مقابل |\n| `rejected` | این طرف رد کرده |\n| `other_rejected` | طرف مقابل رد کرده |\n| `payment_required` | آقا باید پرداخت کند |\n| `completed` | پرداخت انجام شده |\n\n---\n\n### فیلد `recommended_plan`\n\nوقتی `needs_subscription = true`، این فیلد اولین پلن فعال را برمی‌گرداند.\nکلاینت باید `id` این پلن را مستقیماً برای پرداخت استفاده کند (اندپوینت جداگانه‌ای برای لیست پلن‌ها وجود ندارد).\n\n```json\n{\n \"id\": 2,\n \"title\": \"اشتراک ۳ معرفی\",\n \"price\": \"150000\"\n}\n```\n\n---\n\n
\n💳 جریان پرداخت اشتراک از طریق habcoin (کلیک کنید)\n\nپس از دریافت `recommended_plan.id`، کلاینت باید درخواست پرداخت را به اندپوینت habcoin بزند:\n\n```\nGET /api/habcoin/pay/\n ?token=\n &service=marriagesubscriptionplan\n &object_id=\n```\n\n**جریان عملیات پس از فراخوانی:**\n\n1. habcoin سکه‌ها را از موجودی کاربر کسر می‌کند (FIFO — نزدیک‌ترین انقضا اول)\n2. رکورد `UserCoinUsage` با `service=marriagesubscriptionplan` ثبت می‌شود\n3. سیگنال `activate_marriage_subscription` به‌صورت خودکار اجرا می‌شود:\n - `ActiveSubscription` برای پروفایل آقا ساخته می‌شود\n - `consume_usage()` فراخوانی می‌شود\n - وضعیت کیس: `payment_pending` → `payment_done`\n - `payment_done_at` و `contact_shared_at` پر می‌شوند\n4. کلاینت می‌تواند اطلاعات تماس را از `GET /cases//contact-info/` دریافت کند\n\n**خطاهای احتمالی از habcoin/pay:**\n\n| کد | پیام | دلیل |\n|----|------|-------|\n| 400 | `Not enough coins` | موجودی سکه کافی نیست |\n| 400 | `Invalid service type` | پارامتر `service` اشتباه است |\n| 403 | `Invalid security token` | توکن امنیتی نامعتبر است |\n| 404 | `Object not found` | `plan_id` یافت نشد یا غیرفعال است |\n\n
\n", "parameters": [], "responses": {"200": {"description": "پروفایل با موفقیت بازگردانده شد", "examples": {"application/json": {"id": 42, "status": "in_case", "gender": "male", "is_registering_for_self": true, "can_edit_profile": false, "can_message_expert": true, "active_subscription": {"id": 7, "plan": {"id": 2, "title": "اشتراک ۳ معرفی", "plan_type": "count_based", "duration_days": null, "usage_limit": 3, "price": "150000"}, "start_date": "2026-04-01T10:00:00Z", "end_date": null, "total_usages": 1, "is_active": true, "is_valid": true}, "is_ready_for_match": true, "active_case": {"case_id": 15, "status": "male_accepted", "introduced_at": "2026-04-20T08:30:00Z", "contact_shared_at": "2026-04-22T14:15:00Z", "minutes_since_contact_shared": 2760.5, "can_report_no_contact": false, "my_action": "completed", "other_action": "completed"}, "needs_subscription": false, "recommended_plan": {"id": 2, "title": "اشتراک ۳ معرفی", "price": "150000"}, "match_summary": {"id": 58, "gender": "female", "overall_completion_percent": 85.0, "public_info": [{"key": "birth_year", "label": "سال تولد", "type": "number", "value": 1998}, {"key": "city", "label": "شهر", "type": "text", "value": "تهران"}, {"key": "education", "label": "تحصیلات", "type": "text", "value": "کارشناسی"}, {"key": "job", "label": "شغل", "type": "text", "value": null}, {"key": "height", "label": "قد", "type": "number", "value": null}]}}}}, "401": {"description": "کاربر احراز هویت نشده است"}}, "tags": ["Marriage"]}, "parameters": []}, "/api/marriage/sections/": {"get": {"operationId": "api_marriage_sections_list", "description": "\nلیست محورهای اطلاعاتی فرم به همراه درصد پیشرفت\n\nمحورهایی که برای جنسیت و نوع ثبت‌نام کاربر فعال هستند را به همراه درصد پیشرفت هر کدام برمی‌گرداند.\nاین اندپوینت باید فقط زمانی که کاربر در صفحه «تکمیل پروفایل» است فراخوانی شود (وضعیت pending_info).\nاگر کاربر هنوز جنسیت یا نوع ثبت‌نام را وارد نکرده باشد، آرایه خالی برمی‌گرداند.\n", "parameters": [], "responses": {"200": {"description": "لیست محورها با موفقیت بازگردانده شد", "examples": {"application/json": [{"id": 1, "slug": "personal_info", "title": "اطلاعات شخصی", "is_required": true, "importance_weight": 1.0, "estimated_minutes": 10, "total_steps": 3, "order": 1, "current_step": 3, "completion_percent": 100.0}, {"id": 2, "slug": "financial_info", "title": "اطلاعات مالی", "is_required": true, "importance_weight": 1.5, "estimated_minutes": 8, "total_steps": 2, "order": 2, "current_step": 1, "completion_percent": 50.0}]}}, "401": {"description": "کاربر احراز هویت نشده است"}}, "tags": ["Marriage"]}, "parameters": []}, "/api/marriage/sections/{slug}/data/": {"get": {"operationId": "api_marriage_sections_data_list", "description": "\nدریافت دیتای ذخیره‌شده یک محور فرم\n\nدیتای پر‌شده توسط کاربر برای یک محور اطلاعاتی مشخص (با slug) را برمی‌گرداند.\nاگر کاربر هنوز این محور را شروع نکرده باشد، پاسخ با مقادیر پیش‌فرض برگردانده می‌شود.\n\nساختار فیلد data:\n آرایه‌ای از آبجکت‌ها، هر آبجکت شامل:\n - key: کلید یکتای فیلد (مثل \"birth_year\"، \"job\")\n - label: برچسب نمایشی (مثل \"سال تولد\")\n - type: نوع فیلد (text | number | media | select | ...)\n - value: مقدار وارد شده (برای media: URL فایل دائمی یا null)\n\ncompletion_percent = (current_step / total_steps) * 100\n", "parameters": [], "responses": {"200": {"description": "محور هنوز شروع نشده — مقادیر پیش‌فرض", "examples": {"application/json": {"slug": "financial_info", "data": [], "current_step": 0, "total_steps": 2, "completion_percent": 0.0, "updated_at": null}}}, "401": {"description": "کاربر احراز هویت نشده است"}, "404": {"description": "محور اطلاعاتی با این slug یافت نشد یا غیرفعال است"}}, "tags": ["Marriage"]}, "patch": {"operationId": "api_marriage_sections_data_partial_update", "description": "\nآپدیت جزئی دیتای یک محور فرم\n\nدیتای یک یا چند فیلد در محور مشخص‌شده را ذخیره یا آپدیت می‌کند.\nاین عملیات Merge است — فیلدهایی که ارسال نشده‌اند حذف نمی‌شوند.\n\nپیش‌شرط: وضعیت پروفایل باید pending_onboarding یا pending_info باشد.\nدر وضعیت waiting یا in_case، PATCH با خطای ۴۰۳ رد می‌شود.\n\nساختار ورودی:\n - current_step: مرحله فعلی کاربر در این فرم (برای محاسبه درصد پیشرفت)\n - total_steps: (اختیاری) تعداد کل مراحل این فرم. اگر ارسال شود و با مقدار فعلی section متفاوت باشد، بروزرسانی می‌شود\n - fields: آرایه‌ای از فیلدهای تکمیل‌شده\n\nپردازش فیلدهای media:\n ۱. فرانت‌اند فایل را از طریق اندپوینت آپلود موقت می‌فرستد و URL tmp دریافت می‌کند\n ۲. آن URL tmp را به عنوان value فیلد media ارسال می‌کند\n ۳. سرور فایل را از مسیر موقت خوانده، در مسیر دائمی ذخیره می‌کند\n ۴. URL دائمی در JSON فرم جایگزین URL tmp می‌شود\n\nاگر value فیلد media شامل \"tmp\" نباشد (فایل قبلاً دائمی شده)، بدون تغییر ذخیره می‌شود.\n", "parameters": [{"name": "data", "in": "body", "required": true, "schema": {"required": ["current_step", "fields"], "type": "object", "properties": {"current_step": {"description": "مرحله فعلی کاربر در این فرم (از صفر)", "type": "integer", "minimum": 0}, "total_steps": {"description": "تعداد کل مراحل این فرم (اختیاری). اگر با مقدار فعلی section متفاوت باشد، بروزرسانی می‌شود", "type": "integer", "minimum": 1}, "fields": {"description": "لیست فیلدهای تکمیل‌شده", "type": "array", "items": {"required": ["key", "label", "type", "value"], "type": "object", "properties": {"key": {"description": "کلید یکتای فیلد — مثال: birth_year", "type": "string"}, "label": {"description": "برچسب نمایشی فیلد — مثال: سال تولد", "type": "string"}, "type": {"description": "نوع فیلد: text | number | media | select | ...", "type": "string"}, "value": {"description": "مقدار فیلد — برای media: URL موقت یا دائمی (می‌تواند عدد، رشته، یا null باشد)", "type": "string", "x-nullable": true}}}}}, "example": {"current_step": 2, "total_steps": 3, "fields": [{"key": "birth_year", "label": "سال تولد", "type": "number", "value": 1995}, {"key": "city", "label": "شهر", "type": "text", "value": "تهران"}, {"key": "id_scan", "label": "کارت ملی", "type": "media", "value": "/media/tmp/upload_abc123.jpg"}]}}}], "responses": {"200": {"description": "دیتای محور با موفقیت آپدیت شد", "examples": {"application/json": {"id": 33, "slug": "personal_info", "data": [{"key": "birth_year", "label": "سال تولد", "type": "number", "value": 1995}, {"key": "city", "label": "شهر", "type": "text", "value": "تهران"}, {"key": "id_scan", "label": "کارت ملی", "type": "media", "value": "/media/marriage/media/2026/04/upload_abc123.jpg"}], "current_step": 2, "total_steps": 3, "completion_percent": 66.7, "updated_at": "2026-04-23T09:15:00Z"}}}, "400": {"description": "خطا در اعتبارسنجی یا فایل media یافت نشد", "examples": {"application/json": {"detail": "فایل رسانه‌ای یافت نشد. لطفاً دوباره آپلود کنید."}}}, "403": {"description": "ویرایش در وضعیت فعلی مجاز نیست", "examples": {"application/json": {"detail": "در وضعیت فعلی امکان ویرایش پروفایل وجود ندارد."}}}, "401": {"description": "کاربر احراز هویت نشده است"}, "404": {"description": "محور اطلاعاتی با این slug یافت نشد یا غیرفعال است"}}, "tags": ["Marriage"]}, "parameters": [{"name": "slug", "in": "path", "required": true, "type": "string"}]}, "/api/talk/guidelines/": {"get": {"operationId": "api_talk_guidelines_list", "description": "", "parameters": [{"name": "page", "in": "query", "description": "A page number within the paginated result set.", "required": false, "type": "integer"}], "responses": {"200": {"description": ""}}, "tags": ["Talk"]}, "parameters": []}, "/api/talk/provider/": {"post": {"operationId": "api_talk_provider_create", "description": "", "parameters": [{"name": "data", "in": "body", "required": true, "schema": {"$ref": "#/definitions/talk_provider_profile"}}], "responses": {"201": {"description": "", "schema": {"$ref": "#/definitions/talk_provider_profile"}}}, "tags": ["Talk"]}, "parameters": []}, "/appversions/": {"get": {"operationId": "appversions_list", "description": "", "parameters": [], "responses": {"200": {"description": ""}}, "tags": ["appversions"]}, "parameters": []}, "/appversions/v2/": {"get": {"operationId": "appversions_v2_list", "description": "", "parameters": [], "responses": {"200": {"description": ""}}, "tags": ["appversions"]}, "parameters": []}, "/bookmark/add/": {"post": {"operationId": "bookmark_add_create", "summary": "Add a new bookmark for a service.", "description": "Request should contain:\n- service: The service to be bookmarked.\n- content_id: The content ID of the service to be bookmarked.\n\nReturns the created bookmark.", "parameters": [{"name": "data", "in": "body", "required": true, "schema": {"$ref": "#/definitions/BookmarkSerializers"}}], "responses": {"201": {"description": "", "schema": {"$ref": "#/definitions/BookmarkSerializers"}}}, "tags": ["bookmark"]}, "parameters": []}, "/bookmark/bulk/modify/": {"post": {"operationId": "bookmark_bulk_modify_create", "description": "Bulk modify bookmarks by adding and removing them.", "parameters": [{"name": "data", "in": "body", "required": true, "schema": {"required": ["add", "remove"], "type": "object", "properties": {"add": {"description": "List of items to add to bookmarks", "type": "array", "items": {"type": "object", "properties": {"service": {"description": "The service to be bookmarked (e.g., quran, mafatih, etc.)", "type": "string"}, "content_id": {"description": "The content ID of the service", "type": "string"}, "text": {"description": "Optional text for the bookmark", "type": "string", "nullable": true}}}}, "remove": {"description": "List of items to remove from bookmarks", "type": "array", "items": {"type": "object", "properties": {"content_id": {"description": "The content ID of the service to be removed", "type": "string"}, "service": {"description": "The service to be bookmarked (e.g., quran, mafatih, etc.)", "type": "string"}}}}}, "example": {"add": [{"service": "quran", "content_id": "123", "text": "My favorite verse"}, {"service": "mafatih", "content_id": "456", "text": "Daily dua"}], "remove": [{"content_id": "789", "service": "quran"}]}}}], "responses": {"200": {"description": "Bulk modify completed."}}, "tags": ["bookmark"]}, "parameters": []}, "/bookmark/list/": {"get": {"operationId": "bookmark_list_list", "summary": "List all bookmarks for the authenticated user.", "description": "Can be filtered by service using the `service` query parameter.\n\nReturns a list of bookmarks.", "parameters": [{"name": "limit", "in": "query", "description": "Number of results to return per page.", "required": false, "type": "integer"}, {"name": "offset", "in": "query", "description": "The initial index from which to return the results.", "required": false, "type": "integer"}], "responses": {"200": {"description": "", "schema": {"required": ["count", "results"], "type": "object", "properties": {"count": {"type": "integer"}, "next": {"type": "string", "format": "uri", "x-nullable": true}, "previous": {"type": "string", "format": "uri", "x-nullable": true}, "results": {"type": "array", "items": {"$ref": "#/definitions/BookmarkSerializers"}}}}}}, "tags": ["bookmark"]}, "parameters": []}, "/bookmark/remove/{service}/{content_id}/": {"delete": {"operationId": "bookmark_remove_delete", "summary": "Deactivate a bookmark by setting its status to False using content_id and user.", "description": "The request should specify the content_id of the bookmark to be deactivated.\n\nReturns no content.", "parameters": [], "responses": {"204": {"description": ""}}, "tags": ["bookmark"]}, "parameters": [{"name": "service", "in": "path", "required": true, "type": "string"}, {"name": "content_id", "in": "path", "required": true, "type": "string"}]}, "/calendar/adjustemnts/": {"get": {"operationId": "calendar_adjustemnts_list", "description": "", "parameters": [], "responses": {"200": {"description": ""}}, "tags": ["calendar"]}, "parameters": []}, "/calendar/occasions/": {"get": {"operationId": "calendar_occasions_list", "description": "accept parameters:
\n-- **country** : str = Could be empty or ir, de, sp
\n-- **language_code** : str = en, fa
\n-- **last_updated** : datetime = 2021-06-20 08:36:53.153834
", "parameters": [], "responses": {"200": {"description": "", "schema": {"type": "array", "items": {"$ref": "#/definitions/Calendar"}}}}, "tags": ["calendar"]}, "parameters": []}, "/calendar/occasions/{occasion_id}/": {"get": {"operationId": "calendar_occasions_read", "description": "", "parameters": [], "responses": {"200": {"description": ""}}, "tags": ["calendar"]}, "parameters": [{"name": "occasion_id", "in": "path", "required": true, "type": "string"}]}, "/category-masaels/": {"get": {"operationId": "category-masaels_list", "description": "", "parameters": [], "responses": {"200": {"description": "", "schema": {"type": "array", "items": {"$ref": "#/definitions/MasaelCategories"}}}}, "tags": ["category-masaels"]}, "parameters": []}, "/checkup/list/": {"get": {"operationId": "checkup_list_list", "description": "\nدریافت لیست تمام چک‌آپ‌های فعال\n\nاین API لیست تمام چک‌آپ‌های موجود را با اطلاعات پایه نمایش می‌دهد.\nبرای هر چک‌آپ، اطلاعاتی شامل عنوان، تصویر، خلاصه، قیمت و فیلدهای زیر نمایش داده می‌شود:\n\nفیلدهای پاسخ:\n- questions_count: تعداد سوالات منحصر به فرد در چک‌آپ\n- answered_questions: تعداد سوالاتی که پاسخ داده شده است\n- has_access: آیا کاربر دسترسی دارد (رایگان یا خریده شده)\n- is_user_completed: آیا کاربر چک‌آپ را کامل کرده است\n", "parameters": [{"name": "limit", "in": "query", "description": "Number of results to return per page.", "required": false, "type": "integer"}, {"name": "offset", "in": "query", "description": "The initial index from which to return the results.", "required": false, "type": "integer"}], "responses": {"200": {"description": "لیست چک‌آپ‌ها با موفقیت بازگردانده شد", "examples": {"application/json": [{"id": 1, "title": "چک‌آپ رزق و روزی", "image": {"sm": "http://example.com/media/image_sm.jpg", "md": "http://example.com/media/image_md.jpg", "lg": "http://example.com/media/image_lg.jpg"}, "summary": "بررسی وضعیت رزق و روزی شما", "price": "10.00", "is_free": false, "questions_count": 15, "has_participated": 0, "answered_questions": null, "is_user_completed": false, "has_access": false}, {"id": 2, "title": "چک‌آپ سلامت روحی", "image": {"sm": "http://example.com/media/image2_sm.jpg", "md": "http://example.com/media/image2_md.jpg", "lg": "http://example.com/media/image2_lg.jpg"}, "summary": "ارزیابی سلامت روان", "price": "0.00", "is_free": true, "questions_count": 20, "has_participated": 2, "answered_questions": 15, "is_user_completed": false, "has_access": true}]}}, "401": {"description": "کاربر احراز هویت نشده است"}}, "tags": ["checkup"]}, "parameters": []}, "/checkup/parameter/{id}/detail/": {"get": {"operationId": "checkup_parameter_detail_read", "description": "\nدریافت جزئیات یک پارامتر چک‌آپ\n\nاین API جزئیات کامل یک پارامتر شامل عنوان و توضیحات (حدیث یا متن تکمیلی) را نمایش می‌دهد.\n\nاستفاده:\n- زمانی که در نتایج چک‌آپ، فیلد has_details = true باشد\n- برای نمایش اطلاعات بیشتر درباره یک توصیه یا نقطه قوت\n\nفیلدهای پاسخ:\n- id: شناسه پارامتر\n- title: عنوان پارامتر\n- description: متن کامل شامل حدیث عربی، ترجمه و منبع\n", "parameters": [], "responses": {"200": {"description": "جزئیات پارامتر با موفقیت بازگردانده شد", "examples": {"application/json": {"id": 76, "title": "دوری از دعای بد علیه والدین", "description": "«لا تَدْعُ عَلى والِدَیْکَ فَاِنَّهُ یُورِثُ الفَقْرَ»\n\nنفرین بر والدین باعث فقر می‌شود. والدین مجرای فیض وجود شما هستند...\n\n📚 منبع: کتاب الکافی، جلد 5، صفحه 554"}}}, "401": {"description": "کاربر احراز هویت نشده است"}, "404": {"description": "پارامتر یافت نشد"}}, "tags": ["checkup"]}, "parameters": [{"name": "id", "in": "path", "description": "A unique integer value identifying this Checkup Parameter.", "required": true, "type": "integer"}]}, "/checkup/parameter/{id}/detail/v2/": {"get": {"operationId": "checkup_parameter_detail_v2_read", "description": "V2 - دریافت جزئیات یک CheckupParameter با ساختار جدید", "parameters": [], "responses": {"200": {"description": "", "schema": {"$ref": "#/definitions/CheckupParameterDetailSerializerV2"}}}, "tags": ["checkup"]}, "parameters": [{"name": "id", "in": "path", "description": "A unique integer value identifying this Checkup Parameter.", "required": true, "type": "integer"}]}, "/checkup/user-checkups/": {"get": {"operationId": "checkup_user-checkups_list", "description": "\nدریافت لیست چک‌آپ‌های کاربر\n\nاین API لیست تمام چک‌آپ‌هایی را که کاربر در آنها شرکت کرده است نمایش می‌دهد.\nبرای هر چک‌آپ، اطلاعاتی شامل عنوان، تصویر، خلاصه، قیمت و فیلدهای زیر نمایش داده می‌شود:\n\nفیلدهای پاسخ:\n- questions_count: تعداد سوالات منحصر به فرد در چک‌آپ\n- answered_questions: تعداد سوالاتی که پاسخ داده شده است\n- has_access: آیا کاربر دسترسی دارد (رایگان یا خریده شده)\n- is_user_completed: آیا کاربر چک‌آپ را کامل کرده است\n", "parameters": [{"name": "limit", "in": "query", "description": "Number of results to return per page.", "required": false, "type": "integer"}, {"name": "offset", "in": "query", "description": "The initial index from which to return the results.", "required": false, "type": "integer"}], "responses": {"200": {"description": "لیست چک‌آپ‌های کاربر با موفقیت بازگردانده شد", "examples": {"application/json": [{"id": 1, "title": "چک‌آپ رزق و روزی", "image": {"sm": "http://example.com/media/image_sm.jpg", "md": "http://example.com/media/image_md.jpg", "lg": "http://example.com/media/image_lg.jpg"}, "summary": "بررسی وضعیت رزق و روزی شما", "price": "10.00", "is_free": false, "questions_count": 15, "has_participated": 2, "answered_questions": 20, "is_user_completed": true}, {"id": 2, "title": "چک‌آپ سلامت روحی", "image": {"sm": "http://example.com/media/image2_sm.jpg", "md": "http://example.com/media/image2_md.jpg", "lg": "http://example.com/media/image2_lg.jpg"}, "summary": "ارزیابی سلامت روان", "price": "0.00", "is_free": true, "questions_count": 20, "has_participated": 1, "answered_questions": 10, "is_user_completed": false}]}}, "401": {"description": "کاربر احراز هویت نشده است"}}, "tags": ["checkup"]}, "parameters": []}, "/checkup/{id}/": {"get": {"operationId": "checkup_read", "description": "\nدریافت جزئیات کامل یک چک‌آپ\n\nاین API اطلاعات کامل یک چک‌آپ شامل عنوان، تصویر، خلاصه، توضیحات کامل، قیمت و فیلدهای زیر را نمایش می‌دهد:\n\nفیلدهای پاسخ:\n- questions_count: تعداد سوالات منحصر به فرد در چک‌آپ\n- answered_questions: تعداد سوالاتی که پاسخ داده شده است\n- has_access: آیا کاربر دسترسی دارد (رایگان یا خریده شده)\n- is_user_completed: آیا کاربر چک‌آپ را کامل کرده است\n", "parameters": [], "responses": {"200": {"description": "جزئیات چک‌آپ با موفقیت بازگردانده شد", "examples": {"application/json": {"id": 1, "title": "چک‌آپ رزق و روزی", "image": {"sm": "http://example.com/media/image_sm.jpg", "md": "http://example.com/media/image_md.jpg", "lg": "http://example.com/media/image_lg.jpg"}, "summary": "بررسی وضعیت رزق و روزی شما", "description": "توضیحات کامل در مورد چک‌آپ رزق و روزی...", "price": "10.00", "is_free": false, "questions_count": 15, "has_participated": 2, "answered_questions": 5, "is_user_completed": false, "has_access": true}}}, "401": {"description": "کاربر احراز هویت نشده است"}, "404": {"description": "چک‌آپ یافت نشد"}}, "tags": ["checkup"]}, "parameters": [{"name": "id", "in": "path", "description": "A unique integer value identifying this Checkup.", "required": true, "type": "integer"}]}, "/checkup/{id}/basic-questions/": {"get": {"operationId": "checkup_basic-questions_list", "description": "\nدریافت لیست سوالات پایه یک چک‌آپ\n\nاین API سوالات پایه (مانند جنسیت، سن، وضعیت تأهل) یک چک‌آپ را به همراه \nگزینه‌های پاسخ آن نمایش می‌دهد.\nکاربر باید قبلاً در چک‌آپ شرکت کرده باشد (join).\n", "parameters": [{"name": "limit", "in": "query", "description": "Number of results to return per page.", "required": false, "type": "integer"}, {"name": "offset", "in": "query", "description": "The initial index from which to return the results.", "required": false, "type": "integer"}], "responses": {"200": {"description": "لیست سوالات پایه با موفقیت بازگردانده شد", "examples": {"application/json": {"answered_questions": 2, "result": [{"id": 1, "title": "جنسیت شما چیست؟", "question_help_text": "لطفاً جنسیت خود را انتخاب کنید", "question_type": "single", "question_widget_type": "radio", "answers": [{"id": 1, "title": "مرد", "image": {"sm": "http://example.com/media/male_sm.jpg", "md": "http://example.com/media/male_md.jpg", "lg": "http://example.com/media/male_lg.jpg"}}, {"id": 2, "title": "زن", "image": {"sm": "http://example.com/media/female_sm.jpg", "md": "http://example.com/media/female_md.jpg", "lg": "http://example.com/media/female_lg.jpg"}}]}]}}}, "400": {"description": "کاربر هنوز در چک‌آپ شرکت نکرده است"}, "401": {"description": "کاربر احراز هویت نشده است"}, "404": {"description": "چک‌آپ یافت نشد"}}, "tags": ["checkup"]}, "parameters": [{"name": "id", "in": "path", "required": true, "type": "string"}]}, "/checkup/{id}/basic-questions/submit/": {"post": {"operationId": "checkup_basic-questions_submit_create", "description": "\nثبت پاسخ‌های سوالات پایه\n\nاین API برای ثبت پاسخ‌های کاربر به سوالات پایه چک‌آپ استفاده می‌شود.\nبرای هر سوال، باید شناسه سوال (question_id) و شناسه پاسخ انتخابی (answer_id) ارسال شود.\nاگر UserCheckup وجود نداشته باشد، به صورت خودکار ایجاد می‌شود.\nاین عملیات در یک transaction انجام می‌شود.\n", "parameters": [{"name": "data", "in": "body", "required": true, "schema": {"required": ["answers"], "type": "object", "properties": {"answers": {"description": "لیست پاسخ‌های سوالات پایه", "type": "array", "items": {"type": "object", "properties": {"question_id": {"description": "شناسه سوال", "type": "integer"}, "answer_id": {"description": "شناسه پاسخ", "type": "integer"}}}}}, "example": {"answers": [{"question_id": 1, "answer_id": 2}, {"question_id": 2, "answer_id": 5}]}}}], "responses": {"201": {"description": "پاسخ‌ها با موفقیت ثبت شد", "examples": {"application/json": {"detail": "Basic answers submitted successfully."}}}, "400": {"description": "خطا در اعتبارسنجی", "examples": {"application/json": {"detail": "Each answer must contain 'question_id' and 'answer_id'."}}}, "401": {"description": "کاربر احراز هویت نشده است"}, "404": {"description": "چک‌آپ یافت نشد"}}, "tags": ["checkup"]}, "parameters": [{"name": "id", "in": "path", "required": true, "type": "string"}]}, "/checkup/{id}/history/": {"get": {"operationId": "checkup_history_list", "description": "لیست تمام دفعاتی که کاربر در یک چک‌آپ خاص شرکت کرده و تمام کرده.", "parameters": [{"name": "limit", "in": "query", "description": "Number of results to return per page.", "required": false, "type": "integer"}, {"name": "offset", "in": "query", "description": "The initial index from which to return the results.", "required": false, "type": "integer"}], "responses": {"200": {"description": ""}}, "tags": ["checkup"]}, "parameters": [{"name": "id", "in": "path", "required": true, "type": "string"}]}, "/checkup/{id}/join/": {"post": {"operationId": "checkup_join_create", "description": "\nشرکت در یک چک‌آپ\n\nاین API برای شرکت کاربر در یک چک‌آپ استفاده می‌شود.\nاگر چک‌آپ رایگان باشد، مستقیماً کاربر ثبت می‌شود.\nاگر چک‌آپ پولی باشد، کوین‌های کاربر کسر شده و سپس ثبت‌نام انجام می‌شود.\nکاربر می‌تواند چند بار در یک چک‌آپ شرکت کند.\n", "parameters": [], "responses": {"201": {"description": "شرکت در چک‌آپ با موفقیت انجام شد", "examples": {"application/json": {"detail": "Successfully joined the checkup."}}}, "400": {"description": "خطا در شرکت", "examples": {"application/json": {"detail": "Insufficient coins. You need 100 coins but have 50."}}}, "401": {"description": "کاربر احراز هویت نشده است"}, "404": {"description": "چک‌آپ یافت نشد"}}, "tags": ["checkup"]}, "parameters": [{"name": "id", "in": "path", "required": true, "type": "string"}]}, "/checkup/{id}/parameter-questions/": {"get": {"operationId": "checkup_parameter-questions_list", "description": "\nدریافت لیست سوالات پارامتر یک چک‌آپ\n\nاین API سوالات اصلی چک‌آپ (CheckupParameter Questions) را که از طریق BasicQuestion \nبه پارامترها متصل هستند، به همراه گزینه‌های پاسخ نمایش می‌دهد.\nاین سوالات امتیازدهی دارند و در محاسبه نتیجه نهایی استفاده می‌شوند.\nکاربر باید قبلاً در چک‌آپ شرکت کرده باشد (join).\n\nفیلدهای جدید:\n- is_weight_visible: آیا وزن پارامتر باید برای کاربر نمایش داده شود یا خیر\n", "parameters": [{"name": "limit", "in": "query", "description": "Number of results to return per page.", "required": false, "type": "integer"}, {"name": "offset", "in": "query", "description": "The initial index from which to return the results.", "required": false, "type": "integer"}], "responses": {"200": {"description": "لیست سوالات پارامتر با موفقیت بازگردانده شد", "examples": {"application/json": {"answered_questions": 3, "result": [{"id": 10, "title": "آیا در نماز صبح شرکت می‌کنید؟", "question": "توضیحاتی درباره سوال", "description": "توضیح کامل پارامتر", "order": 1, "parameter_type": "positive", "is_weight_visible": true, "parameter_answers": [{"id": 25, "title": "هیچ وقت", "answer_type": "text", "image": null, "weight": 0}, {"id": 26, "title": "گاهی اوقات", "answer_type": "text", "image": null, "weight": 25}, {"id": 27, "title": "بیشتر اوقات", "answer_type": "text", "image": null, "weight": 75}, {"id": 28, "title": "همیشه", "answer_type": "text", "image": null, "weight": 100}]}]}}}, "400": {"description": "کاربر هنوز در چک‌آپ شرکت نکرده است"}, "401": {"description": "کاربر احراز هویت نشده است"}, "404": {"description": "چک‌آپ یافت نشد"}}, "tags": ["checkup"]}, "parameters": [{"name": "id", "in": "path", "required": true, "type": "string"}]}, "/checkup/{id}/parameters/submit/": {"post": {"operationId": "checkup_parameters_submit_create", "description": "\nثبت پاسخ‌های سوالات اصلی و محاسبه نتیجه\n\nاین API برای ثبت پاسخ‌های کاربر به سوالات اصلی چک‌آپ (CheckupParameter) استفاده می‌شود.\nبرای هر سوال، باید شناسه سوال (question_id) و شناسه پاسخ (answer_id) ارسال شود.\n\nسیستم به صورت خودکار:\n1. از طریق BasicQuestion، پارامتر مرتبط را پیدا می‌کند\n2. بر اساس parameter_type (positive/negative) و weight، امتیاز محاسبه می‌شود\n3. درصد امکان بهبود (possibility_of_improvement) محاسبه می‌شود\n4. گزارش با سه وضعیت (emergency, improvement, positive) ایجاد می‌شود\n5. لیست توصیه‌ها بر اساس امتیازها تولید می‌شود\n\nاین عملیات در یک transaction انجام می‌شود و UserCheckup به حالت completed تغییر می‌کند.\n", "parameters": [{"name": "data", "in": "body", "required": true, "schema": {"required": ["answers"], "type": "object", "properties": {"answers": {"description": "لیست پاسخ‌های سوالات اصلی", "type": "array", "items": {"type": "object", "properties": {"question_id": {"description": "شناسه سوال", "type": "integer"}, "answer_id": {"description": "شناسه پاسخ", "type": "integer"}}}}}, "example": {"answers": [{"question_id": 10, "answer_id": 25}, {"question_id": 11, "answer_id": 30}, {"question_id": 12, "answer_id": 28}]}}}], "responses": {"201": {"description": "پاسخ‌ها با موفقیت ثبت و نتیجه محاسبه شد", "examples": {"application/json": {"possibility_of_improvement": 65.5, "people_medium": 58, "report": [{"status": "emergency", "count": 2, "items": [{"order": 1, "text": "نماز صبح"}, {"order": 3, "text": "روزه"}]}, {"status": "improvement", "count": 3, "items": [{"order": 2, "text": "صدقه"}, {"order": 5, "text": "دعا"}, {"order": 7, "text": "استغفار"}]}, {"status": "positive", "count": 4, "items": [{"order": 4, "text": "نماز جماعت"}, {"order": 6, "text": "قرآن"}, {"order": 8, "text": "زیارت"}, {"order": 9, "text": "حج"}]}], "recommendations_count": 9, "recommendations": [{"order": 1, "text": "نماز صبح"}, {"order": 2, "text": "صدقه"}, {"order": 3, "text": "روزه"}]}}}, "400": {"description": "خطا در اعتبارسنجی یا UserCheckup یافت نشد", "examples": {"application/json": {"detail": "UserCheckup not found. Please join the checkup first or complete basic questions."}}}, "401": {"description": "کاربر احراز هویت نشده است"}, "404": {"description": "چک‌آپ یافت نشد"}}, "tags": ["checkup"]}, "parameters": [{"name": "id", "in": "path", "required": true, "type": "string"}]}, "/checkup/{id}/previous-answers/": {"get": {"operationId": "checkup_previous-answers_read", "description": "\nGet user's previous answers for a completed checkup\n\nThis API returns the most recent completed UserCheckup for the authenticated user\nalong with all their basic question answers and parameter answers.\n\nUse this when user wants to review their previous checkup results or\nwhen they want to redo a checkup with their previous answers pre-filled.\n\nResponse includes:\n- user_checkup_id: ID of the UserCheckup record\n- checkup_id: ID of the checkup\n- completed_at: When the checkup was completed\n- is_completed: Whether the checkup is completed\n- total_score: Total score achieved\n- basic_question_answers: List of all basic question answers\n- parameter_answers: List of all parameter answers with weighted scores\n", "parameters": [], "responses": {"200": {"description": "Previous answers retrieved successfully", "examples": {"application/json": {"user_checkup_id": 123, "checkup_id": 5, "completed_at": "2025-12-20T10:00:00Z", "is_completed": true, "total_score": 85, "basic_question_answers": [{"question_id": 1, "question_title": "Gender", "answer_id": 10, "answer_title": "Male", "answered_at": "2025-12-20T09:30:00Z"}], "parameter_answers": [{"parameter_id": 50, "parameter_title": "Sleep Quality", "answer_id": 200, "answer_title": "Good", "weighted_score": 8.5, "answered_at": "2025-12-20T09:35:00Z"}]}}}, "401": {"description": "User not authenticated"}, "404": {"description": "No completed checkup found for this user"}}, "tags": ["checkup"]}, "parameters": [{"name": "id", "in": "path", "required": true, "type": "string"}]}, "/checkup/{id}/result/": {"get": {"operationId": "checkup_result_read", "description": "\nدریافت نتیجه نهایی چک‌آپ\n\nاین API نتیجه نهایی چک‌آپ را پس از پاسخ به تمام سوالات نمایش می‌دهد.\n\nفیلدهای پاسخ:\n- statistics: آمار متغیرها شامل name، code، value، type، display_mode، achieved_items و total_items\n- report: گزارش دسته‌بندی شده (emergency, improvement, positive)\n- recommendations: لیست توصیه‌های اولویت‌دار\n- total_score: امتیاز کل (میانگین)\n\nتوضیحات statistics:\n- name: نام نمایشی متغیر (ترجمه شده)\n- code: کد یکتای متغیر (برای استفاده در لاجیک)\n- display_mode: نحوه نمایش (gauge: نمودار دایره‌ای، progress_bar: کارت بزرگ، hidden: مخفی)\n- achieved_items: تعداد موارد موفق (برای positive: وزن>=75، برای negative: وزن<=25)\n- total_items: تعداد کل سوالات مرتبط با متغیر\n", "parameters": [], "responses": {"200": {"description": "نتیجه چک‌آپ با موفقیت محاسبه شد", "examples": {"application/json": {"statistics": [{"name": "عامل برکت روزی", "code": "blessing_factor", "value": 97.0, "type": "positive", "display_mode": "gauge", "achieved_items": 73, "total_items": 75}, {"name": "عامل موانع روزی", "code": "obstacle_factor", "value": 7.7, "type": "negative", "display_mode": "progress_bar", "achieved_items": 1, "total_items": 68}], "report": [{"status": "emergency", "count": 2, "items": [{"order": 1, "text": "نماز صبح"}, {"order": 3, "text": "روزه"}]}, {"status": "improvement", "count": 3, "items": [{"order": 2, "text": "صدقه"}, {"order": 5, "text": "دعا"}]}, {"status": "positive", "count": 4, "items": [{"order": 4, "text": "نماز جماعت"}, {"order": 6, "text": "قرآن"}]}], "recommendations_count": 9, "recommendations": [{"order": 1, "text": "نماز صبح"}, {"order": 2, "text": "صدقه"}], "total_score": 85.5}}}, "400": {"description": "چک‌آپ تکمیل نشده است"}, "401": {"description": "کاربر احراز هویت نشده است"}, "404": {"description": "چک‌آپ یافت نشد"}}, "tags": ["checkup"]}, "parameters": [{"name": "id", "in": "path", "required": true, "type": "string"}]}, "/checkup/{id}/result/v2/": {"get": {"operationId": "checkup_result_v2_read", "description": "\nدریافت نتیجه نهایی چک‌آپ - نسخه 2\n\nاین API نسخه بهبود یافته نتایج است که شامل گزارش با 4 وضعیت جدید می‌شود:\n- strengths: نقاط قوت (امتیاز بالا)\n- emergencies: موارد اضطراری (امتیاز بسیار پایین، نیاز فوری)\n- important: موارد مهم (امتیاز متوسط به پایین)\n- useful: موارد مفید (امتیاز متوسط)\n\nساختار پاسخ مشابه V1 است با این تفاوت که:\n- وضعیت‌های جدید به جای emergency, improvement, positive استفاده می‌شود\n- فیلدهای recommendations_count، recommendations و total_score حذف شده‌اند\n\nفیلدهای پاسخ:\n- statistics: آمار متغیرها شامل name، code، value، type، display_mode، achieved_items و total_items\n- report: آرایه‌ای از 4 وضعیت، هر کدام شامل status، count و items\n- هر آیتم شامل: parameter_id، order، title، text، score و has_details\n\nتوضیحات statistics:\n- name: نام نمایشی متغیر (ترجمه شده)\n- code: کد یکتای متغیر (برای استفاده در لاجیک)\n- display_mode: نحوه نمایش (gauge: نمودار دایره‌ای، progress_bar: کارت بزرگ، hidden: مخفی)\n- achieved_items: تعداد موارد موفق (برای positive: وزن>=75، برای negative: وزن<=25)\n- total_items: تعداد کل سوالات مرتبط با متغیر\n\nنکته مهم:\n- has_details: اگر true باشد، می‌توانید از API جزئیات پارامتر استفاده کنید\n- برای دریافت جزئیات: GET /checkup/parameter/{parameter_id}/detail/\n", "parameters": [], "responses": {"200": {"description": "نتیجه چک‌آپ نسخه 2 با موفقیت محاسبه شد", "examples": {"application/json": {"statistics": [{"name": "عامل برکت روزی", "code": "blessing_factor", "value": 97.0, "type": "positive", "display_mode": "gauge", "achieved_items": 73, "total_items": 75}, {"name": "عامل موانع روزی", "code": "obstacle_factor", "value": 7.7, "type": "negative", "display_mode": "progress_bar", "achieved_items": 1, "total_items": 68}], "report": [{"status": "strengths", "count": 2, "items": [{"parameter_id": 76, "order": 0, "title": "دوری از دعای بد علیه والدین", "text": "والدین، مجرایِ فیضِ وجودِ شما هستند؛ بستنِ این مجرا با نفرین، یعنی بستنِ شیرِ فلکه‌ی حیات...", "score": 300, "has_details": true}, {"parameter_id": 40, "order": 0, "title": "امانتداری", "text": "امانتداری، تنها یک فضیلت اخلاقی نیست، بلکه یک استراتژی اقتصادی قدرتمند است...", "score": 200, "has_details": true}]}, {"status": "emergencies", "count": 1, "items": [{"parameter_id": 15, "order": 0, "title": "نماز صبح", "text": "نماز صبح کلید برکت روز است...", "score": -300, "has_details": true}]}, {"status": "important", "count": 1, "items": [{"parameter_id": 25, "order": 0, "title": "صدقه", "text": "صدقه دادن درهای روزی را باز می‌کند...", "score": 150, "has_details": false}]}, {"status": "useful", "count": 1, "items": [{"parameter_id": 30, "order": 0, "title": "استغفار", "text": "استغفار باعث افزایش روزی می‌شود...", "score": 100, "has_details": false}]}]}}}, "400": {"description": "چک‌آپ تکمیل نشده است"}, "401": {"description": "کاربر احراز هویت نشده است"}, "404": {"description": "چک‌آپ یافت نشد"}}, "tags": ["checkup"]}, "parameters": [{"name": "id", "in": "path", "required": true, "type": "string"}]}, "/checkup/{participation_id}/result/v3/": {"get": {"operationId": "checkup_result_v3_read", "description": "\nدریافت نتیجه نهایی چک‌آپ - نسخه 2\n\nاین API نسخه بهبود یافته نتایج است که شامل گزارش با 4 وضعیت جدید می‌شود:\n- strengths: نقاط قوت (امتیاز بالا)\n- emergencies: موارد اضطراری (امتیاز بسیار پایین، نیاز فوری)\n- important: موارد مهم (امتیاز متوسط به پایین)\n- useful: موارد مفید (امتیاز متوسط)\n\nساختار پاسخ مشابه V1 است با این تفاوت که:\n- وضعیت‌های جدید به جای emergency, improvement, positive استفاده می‌شود\n- فیلدهای recommendations_count، recommendations و total_score حذف شده‌اند\n\nفیلدهای پاسخ:\n- statistics: آمار متغیرها شامل name، code، value، type، display_mode، achieved_items و total_items\n- report: آرایه‌ای از 4 وضعیت، هر کدام شامل status، count و items\n- هر آیتم شامل: parameter_id، order، title، text، score و has_details\n\nتوضیحات statistics:\n- name: نام نمایشی متغیر (ترجمه شده)\n- code: کد یکتای متغیر (برای استفاده در لاجیک)\n- display_mode: نحوه نمایش (gauge: نمودار دایره‌ای، progress_bar: کارت بزرگ، hidden: مخفی)\n- achieved_items: تعداد موارد موفق (برای positive: وزن>=75، برای negative: وزن<=25)\n- total_items: تعداد کل سوالات مرتبط با متغیر\n\nنکته مهم:\n- has_details: اگر true باشد، می‌توانید از API جزئیات پارامتر استفاده کنید\n- برای دریافت جزئیات: GET /checkup/parameter/{parameter_id}/detail/\n", "parameters": [], "responses": {"200": {"description": "نتیجه چک‌آپ نسخه 2 با موفقیت محاسبه شد", "examples": {"application/json": {"statistics": [{"name": "عامل برکت روزی", "code": "blessing_factor", "value": 97.0, "type": "positive", "display_mode": "gauge", "achieved_items": 73, "total_items": 75}, {"name": "عامل موانع روزی", "code": "obstacle_factor", "value": 7.7, "type": "negative", "display_mode": "progress_bar", "achieved_items": 1, "total_items": 68}], "report": [{"status": "strengths", "count": 2, "items": [{"parameter_id": 76, "order": 0, "title": "دوری از دعای بد علیه والدین", "text": "والدین، مجرایِ فیضِ وجودِ شما هستند؛ بستنِ این مجرا با نفرین، یعنی بستنِ شیرِ فلکه‌ی حیات...", "score": 300, "has_details": true}, {"parameter_id": 40, "order": 0, "title": "امانتداری", "text": "امانتداری، تنها یک فضیلت اخلاقی نیست، بلکه یک استراتژی اقتصادی قدرتمند است...", "score": 200, "has_details": true}]}, {"status": "emergencies", "count": 1, "items": [{"parameter_id": 15, "order": 0, "title": "نماز صبح", "text": "نماز صبح کلید برکت روز است...", "score": -300, "has_details": true}]}, {"status": "important", "count": 1, "items": [{"parameter_id": 25, "order": 0, "title": "صدقه", "text": "صدقه دادن درهای روزی را باز می‌کند...", "score": 150, "has_details": false}]}, {"status": "useful", "count": 1, "items": [{"parameter_id": 30, "order": 0, "title": "استغفار", "text": "استغفار باعث افزایش روزی می‌شود...", "score": 100, "has_details": false}]}]}}}, "400": {"description": "چک‌آپ تکمیل نشده است"}, "401": {"description": "کاربر احراز هویت نشده است"}, "404": {"description": "چک‌آپ یافت نشد"}}, "tags": ["checkup"]}, "parameters": [{"name": "participation_id", "in": "path", "required": true, "type": "string"}]}, "/command/": {"post": {"operationId": "command_create", "description": "Handles incoming API requests and routes them to the relevant handler.", "parameters": [], "responses": {"201": {"description": ""}}, "tags": ["command"]}, "parameters": []}, "/command/help/": {"get": {"operationId": "command_help_list", "description": "", "parameters": [], "responses": {"200": {"description": "", "schema": {"type": "array", "items": {"$ref": "#/definitions/CommandHelp"}}}}, "tags": ["command"]}, "parameters": []}, "/command/suggestion/": {"get": {"operationId": "command_suggestion_list", "description": "", "parameters": [], "responses": {"200": {"description": "", "schema": {"type": "array", "items": {"$ref": "#/definitions/CommandSuggestion"}}}}, "tags": ["command"]}, "parameters": []}, "/command/v2/": {"post": {"operationId": "command_v2_create", "description": "Handles incoming command requests and processes them through RAG system", "parameters": [{"name": "data", "in": "body", "required": true, "schema": {"required": ["command", "language_code"], "type": "object", "properties": {"command": {"description": "User command or query", "type": "string"}, "language_code": {"description": "Language code (e.g., \"en\", \"fa\")", "type": "string", "default": "en"}}}}], "responses": {"201": {"description": "", "schema": {"required": ["command", "language_code"], "type": "object", "properties": {"command": {"description": "User command or query", "type": "string"}, "language_code": {"description": "Language code (e.g., \"en\", \"fa\")", "type": "string", "default": "en"}}}}}, "tags": ["command"]}, "parameters": []}, "/donate/": {"post": {"operationId": "donate_create", "description": "", "parameters": [{"name": "data", "in": "body", "required": true, "schema": {"$ref": "#/definitions/DonateUser"}}], "responses": {"201": {"description": "", "schema": {"$ref": "#/definitions/DonateUser"}}}, "tags": ["donate"]}, "parameters": []}, "/donate/v2/": {"get": {"operationId": "donate_v2_list", "description": "", "parameters": [{"name": "limit", "in": "query", "description": "Number of results to return per page.", "required": false, "type": "integer"}, {"name": "offset", "in": "query", "description": "The initial index from which to return the results.", "required": false, "type": "integer"}], "responses": {"200": {"description": ""}}, "tags": ["donate"]}, "parameters": []}, "/donate/v2/create/": {"post": {"operationId": "donate_v2_create_create", "description": "\n**Donation Creation API**\n\nCreate a donation record and receive a payment link. This API is designed to never fail and always returns a working donation link without any errors.\n\n**Key Features:**\n- Error-free operation - never returns HTTP errors\n- All fields are completely optional with intelligent defaults\n- Automatic payment method selection based on user location\n- Support for multiple payment gateways\n- Backward compatibility with existing integrations\n\n**Smart Defaults:**\n- **donate_type**: Defaults to 'once' if not provided or invalid\n- **price**: Defaults to '10.00' if not provided or invalid\n- **id**: Auto-selected based on user location (CloudTips for Russian users, Stripe for others)\n- **phone_number**: Optional field, stored if provided, otherwise null\n\n**Payment Methods:**\n- **Stripe**: International payment gateway with predefined donation links\n- **CloudTips**: Russian payment gateway for Russian users\n\n**Localization Logic:**\n- Russian users (language_code=ru OR user.country=RU) default to CloudTips\n- All other users default to Stripe payment gateway\n- Fallback to default donation links for custom amounts\n\n**Business Logic:**\n- Creates donation record in database (optional, doesn't affect response)\n- Optionally stores donor's phone number for contact purposes\n- Maps donation amounts to predefined Stripe payment links\n- Uses fallback links for unmapped amounts\n- Always returns HTTP 200 with working payment link\n\n**Authentication**: Not required - Public API\n**Permissions**: None - Accessible to all users\n", "parameters": [{"name": "data", "in": "body", "required": true, "schema": {"required": [], "type": "object", "properties": {"donate_type": {"description": "Type of donation - either 'monthly' for recurring donations or 'once' for one-time donations. This field is completely optional and will default to 'once' if not provided or if an invalid value is sent.", "type": "string", "enum": ["monthly", "once"]}, "price": {"description": "Donation amount as a string (e.g., '5.00', '10.00', '20.00'). This field is completely optional and will default to '10.00' if not provided or if an invalid value is sent.", "type": "string"}, "id": {"description": "Payment gateway identifier. This field is completely optional. If not provided, the system will automatically choose 'stripe' for non-Russian users and 'cloudtips' for Russian users (detected by language_code=ru or user country=RU). If an invalid value is provided, it defaults to 'stripe'.", "type": "string", "enum": ["stripe", "cloudtips"]}, "phone_number": {"description": "Optional phone number for the donor. This field is completely optional and can be omitted. If provided, it will be stored with the donation record.", "type": "string"}}, "example": {"donate_type": "once", "price": "15.00", "id": "stripe", "phone_number": "+1234567890"}}}], "responses": {"200": {"description": "Donation link created successfully. This API is guaranteed to always return HTTP 200 status with a working donation link, regardless of the input provided. Even if no data is sent in the request body, the API will respond with appropriate defaults.", "examples": {"application/json": {"complete_request": {"summary": "Complete Request with Phone Number", "description": "Response when all fields including phone_number are provided", "value": {"donate_user": 1, "donate_link": "https://donate.stripe.com/bIYdSDgiK7Pwh0ccMN"}}, "request_with_phone": {"summary": "Request Example with Phone", "description": "Example showing phone_number parameter usage", "value": {"donate_user": 1, "donate_link": "https://donate.stripe.com/9AQ01N5E68TAbFS002"}}, "empty_request_default": {"summary": "Empty Request (Default)", "description": "Response when no fields are provided - uses intelligent defaults", "value": {"donate_user": 1, "donate_link": "https://donate.stripe.com/7sI3dZaYq7Pw9xKcMV"}}, "empty_request_russian_user": {"summary": "Empty Request (Russian User)", "description": "Response for Russian users when no fields are provided", "value": {"donate_user": 1, "donate_link": "https://pay.cloudtips.ru/p/d5881ddf"}}, "cloudtips_payment": {"summary": "CloudTips Payment", "description": "Response when CloudTips payment method is selected", "value": {"donate_user": 1, "donate_link": "https://pay.cloudtips.ru/p/d5881ddf"}}, "invalid_data_fallback": {"summary": "Invalid Data Fallback", "description": "Response when invalid data is provided - normalized to defaults", "value": {"donate_user": 1, "donate_link": "https://donate.stripe.com/7sI3dZaYq7Pw9xKcMV"}}}}}}, "tags": ["Donate"]}, "parameters": []}, "/donate/v3/": {"get": {"operationId": "donate_v3_list", "description": "\n**Donation Details API V3**\n\nRetrieve donation pricing information and available payment methods with intelligent localization support.\n\n**Key Features:**\n- Monthly and one-time donation options\n- Dynamic pricing based on user location\n- Multiple payment gateway support\n- Localized currency and payment methods\n- Russian language and payment gateway support\n\n**Donation Types:**\n- **Monthly**: Recurring donations with subscription pricing\n- **Once**: One-time donations with flexible amounts\n\n**Payment Methods:**\n- **Stripe**: International payment gateway (default)\n- **CloudTips**: Russian payment gateway for Russian users\n\n**Localization Logic:**\n- Detects user language from request headers or query parameters\n- Detects user country from authenticated user profile\n- Russian users see ruble pricing and CloudTips payment option\n- Non-Russian users see USD pricing with Stripe only\n\n**Business Logic:**\n- Monthly donations: Same pricing for all users ($5, $10, $20, $50)\n- Once donations: USD for international users, RUB for Russian users\n- Russian detection: language_code=ru OR user.country=RU\n- Payment buttons include icon, text, and payment method ID\n\n**Authentication**: Not required - Public API\n**Permissions**: None - Accessible to all users\n", "parameters": [{"name": "limit", "in": "query", "description": "Number of results to return per page.", "required": false, "type": "integer"}, {"name": "offset", "in": "query", "description": "The initial index from which to return the results.", "required": false, "type": "integer"}, {"name": "language_code", "in": "query", "description": "Language preference (e.g., 'ru' for Russian, 'en' for English)", "required": false, "type": "string"}], "responses": {"200": {"description": "Donation details retrieved successfully", "examples": {"application/json": {"international_user_response": {"summary": "International User Response", "description": "Default response for non-Russian users with USD pricing", "value": {"monthly": {"prices": [{"value": "$5", "price": "5.00"}, {"value": "$10", "price": "10.00"}, {"value": "$20", "price": "20.00"}, {"value": "$50", "price": "50.00"}], "buttons": [{"icon": "https://habibapp.com/static/payicon.jpg", "text": "Donate Now", "id": "stripe"}]}, "once": {"prices": [{"value": "$5", "price": "5.00"}, {"value": "$15", "price": "15.00"}, {"value": "$30", "price": "30.00"}, {"value": "$40", "price": "40.00"}], "buttons": [{"icon": "https://habibapp.com/static/payicon.jpg", "text": "Donate Now", "id": "stripe"}]}}}, "russian_user_response": {"summary": "Russian User Response", "description": "Localized response for Russian users with ruble pricing and CloudTips", "value": {"monthly": {"prices": [{"value": "$5", "price": "5.00"}, {"value": "$10", "price": "10.00"}, {"value": "$20", "price": "20.00"}, {"value": "$50", "price": "50.00"}], "buttons": [{"icon": "https://habibapp.com/static/payicon.jpg", "text": "Donate Now", "id": "stripe"}]}, "once": {"prices": [{"value": "₽500", "price": "5.00"}, {"value": "₽1500", "price": "15.00"}, {"value": "₽3000", "price": "30.00"}, {"value": "₽4000", "price": "40.00"}], "buttons": [{"icon": "https://habibapp.com/static/payicon.jpg", "text": "Donate Now", "id": "stripe"}, {"icon": "https://habibapp.com/static/cloudtips_icon.png", "text": "Пожертвовать через CloudTips", "id": "cloudtips"}]}}}}}}}, "tags": ["Donate"]}, "parameters": []}, "/dont-kill-help/": {"get": {"operationId": "dont-kill-help_read", "description": "", "parameters": [], "responses": {"200": {"description": "", "schema": {"$ref": "#/definitions/DontKillApp"}}}, "tags": ["dont-kill-help"]}, "parameters": []}, "/eightmag-categories/": {"get": {"operationId": "eightmag-categories_list", "description": "", "parameters": [], "responses": {"200": {"description": "", "schema": {"type": "array", "items": {"$ref": "#/definitions/EightmagCategories"}}}}, "tags": ["eightmag-categories"]}, "parameters": []}, "/eightmag-category-items/{slug}/": {"get": {"operationId": "eightmag-category-items_read", "description": "", "parameters": [{"name": "limit", "in": "query", "description": "Number of results to return per page.", "required": false, "type": "integer"}, {"name": "offset", "in": "query", "description": "The initial index from which to return the results.", "required": false, "type": "integer"}], "responses": {"200": {"description": "", "schema": {"required": ["count", "results"], "type": "object", "properties": {"count": {"type": "integer"}, "next": {"type": "string", "format": "uri", "x-nullable": true}, "previous": {"type": "string", "format": "uri", "x-nullable": true}, "results": {"type": "array", "items": {"$ref": "#/definitions/EightmagList"}}}}}}, "tags": ["eightmag-category-items"]}, "parameters": [{"name": "slug", "in": "path", "required": true, "type": "string"}]}, "/eightmag-details/{slug}/": {"get": {"operationId": "eightmag-details_read", "description": "", "parameters": [], "responses": {"200": {"description": "", "schema": {"$ref": "#/definitions/EightmagDetails"}}}, "tags": ["eightmag-details"]}, "parameters": [{"name": "slug", "in": "path", "required": true, "type": "string"}]}, "/eightmag-details/{slug}/like/": {"post": {"operationId": "eightmag-details_like_create", "description": "", "parameters": [], "responses": {"201": {"description": ""}}, "tags": ["eightmag-details"]}, "parameters": [{"name": "slug", "in": "path", "required": true, "type": "string"}]}, "/eightmag-list/": {"get": {"operationId": "eightmag-list_list", "description": "", "parameters": [{"name": "limit", "in": "query", "description": "Number of results to return per page.", "required": false, "type": "integer"}, {"name": "offset", "in": "query", "description": "The initial index from which to return the results.", "required": false, "type": "integer"}], "responses": {"200": {"description": "", "schema": {"required": ["count", "results"], "type": "object", "properties": {"count": {"type": "integer"}, "next": {"type": "string", "format": "uri", "x-nullable": true}, "previous": {"type": "string", "format": "uri", "x-nullable": true}, "results": {"type": "array", "items": {"$ref": "#/definitions/EightmagList"}}}}}}, "tags": ["eightmag-list"]}, "parameters": []}, "/elalhabib/": {"get": {"operationId": "elalhabib_list", "description": "", "parameters": [{"name": "limit", "in": "query", "description": "Number of results to return per page.", "required": false, "type": "integer"}, {"name": "offset", "in": "query", "description": "The initial index from which to return the results.", "required": false, "type": "integer"}], "responses": {"200": {"description": "", "schema": {"required": ["count", "results"], "type": "object", "properties": {"count": {"type": "integer"}, "next": {"type": "string", "format": "uri", "x-nullable": true}, "previous": {"type": "string", "format": "uri", "x-nullable": true}, "results": {"type": "array", "items": {"$ref": "#/definitions/ElalHabib"}}}}}}, "tags": ["elalhabib"]}, "parameters": []}, "/elalhabib/lectures/": {"get": {"operationId": "elalhabib_lectures_list", "description": "", "parameters": [{"name": "limit", "in": "query", "description": "Number of results to return per page.", "required": false, "type": "integer"}, {"name": "offset", "in": "query", "description": "The initial index from which to return the results.", "required": false, "type": "integer"}], "responses": {"200": {"description": "", "schema": {"required": ["count", "results"], "type": "object", "properties": {"count": {"type": "integer"}, "next": {"type": "string", "format": "uri", "x-nullable": true}, "previous": {"type": "string", "format": "uri", "x-nullable": true}, "results": {"type": "array", "items": {"$ref": "#/definitions/ElalHabibSingerInList"}}}}}}, "tags": ["elalhabib"]}, "parameters": []}, "/elalhabib/madah/": {"get": {"operationId": "elalhabib_madah_list", "description": "", "parameters": [{"name": "limit", "in": "query", "description": "Number of results to return per page.", "required": false, "type": "integer"}, {"name": "offset", "in": "query", "description": "The initial index from which to return the results.", "required": false, "type": "integer"}], "responses": {"200": {"description": "", "schema": {"required": ["count", "results"], "type": "object", "properties": {"count": {"type": "integer"}, "next": {"type": "string", "format": "uri", "x-nullable": true}, "previous": {"type": "string", "format": "uri", "x-nullable": true}, "results": {"type": "array", "items": {"$ref": "#/definitions/ElalHabibSingerInList"}}}}}}, "tags": ["elalhabib"]}, "parameters": []}, "/habcoin/buy-package/": {"post": {"operationId": "habcoin_buy-package_create", "description": "", "parameters": [], "responses": {"201": {"description": ""}}, "tags": ["habcoin"]}, "parameters": []}, "/habcoin/contact-info/": {"get": {"operationId": "habcoin_contact-info_list", "description": "", "parameters": [], "responses": {"200": {"description": ""}}, "tags": ["habcoin"]}, "parameters": []}, "/habcoin/discount-usage-history/": {"get": {"operationId": "habcoin_discount-usage-history_list", "description": "Get user's discount code usage history", "parameters": [], "responses": {"200": {"description": "List of user discount code usages", "schema": {"type": "array", "items": {"$ref": "#/definitions/DiscountCodeUsage"}}}, "401": {"description": "Unauthorized - Authentication required"}}, "tags": ["Discount Code"]}, "parameters": []}, "/habcoin/inventory/": {"get": {"operationId": "habcoin_inventory_list", "description": "", "parameters": [], "responses": {"200": {"description": ""}}, "tags": ["habcoin"]}, "parameters": []}, "/habcoin/packages/": {"get": {"operationId": "habcoin_packages_list", "description": "", "parameters": [], "responses": {"200": {"description": "", "schema": {"type": "array", "items": {"$ref": "#/definitions/Package"}}}}, "tags": ["habcoin"]}, "parameters": []}, "/habcoin/pay/": {"get": {"operationId": "habcoin_pay_list", "description": "", "parameters": [{"name": "token", "in": "query", "description": "Security token", "required": true, "type": "string"}, {"name": "service", "in": "query", "description": "Service type", "required": true, "type": "string"}, {"name": "object_id", "in": "query", "description": "Object ID related to the service", "required": true, "type": "integer"}, {"name": "amount", "in": "query", "description": "The number of coins to be deducted", "required": false, "type": "integer"}, {"name": "app_name", "in": "query", "description": "Optional app label for the model", "required": false, "type": "string"}, {"name": "discount_code", "in": "query", "description": "Optional discount code to apply discount on payment. The code will be validated and discount will be automatically applied if valid.", "required": false, "type": "string"}], "responses": {"200": {"description": "Coins deducted successfully", "examples": {"application/json": {"status": "Coins deducted successfully", "original_price": 10, "final_price": 8, "discount_applied": 2}}}, "400": {"description": "Not enough coins or invalid discount code"}, "403": {"description": "Invalid security token"}, "404": {"description": "User not found"}}, "tags": ["habcoin"]}, "parameters": []}, "/habcoin/support/": {"post": {"operationId": "habcoin_support_create", "description": "", "parameters": [{"name": "data", "in": "body", "required": true, "schema": {"$ref": "#/definitions/Support"}}], "responses": {"201": {"description": "", "schema": {"$ref": "#/definitions/Support"}}}, "tags": ["habcoin"]}, "parameters": []}, "/habcoin/transactions/": {"get": {"operationId": "habcoin_transactions_list", "description": "", "parameters": [{"name": "limit", "in": "query", "description": "Number of results to return per page.", "required": false, "type": "integer"}, {"name": "offset", "in": "query", "description": "The initial index from which to return the results.", "required": false, "type": "integer"}], "responses": {"200": {"description": "", "schema": {"required": ["count", "results"], "type": "object", "properties": {"count": {"type": "integer"}, "next": {"type": "string", "format": "uri", "x-nullable": true}, "previous": {"type": "string", "format": "uri", "x-nullable": true}, "results": {"type": "array", "items": {"$ref": "#/definitions/Transactions"}}}}}}, "tags": ["habcoin"]}, "parameters": []}, "/habcoin/user-coin-usages/": {"get": {"operationId": "habcoin_user-coin-usages_list", "description": "", "parameters": [], "responses": {"200": {"description": "", "schema": {"type": "array", "items": {"$ref": "#/definitions/UserCoinUsage"}}}}, "tags": ["habcoin"]}, "parameters": []}, "/habcoin/user-packages/": {"get": {"operationId": "habcoin_user-packages_list", "description": "", "parameters": [], "responses": {"200": {"description": "", "schema": {"type": "array", "items": {"$ref": "#/definitions/UserPackage"}}}}, "tags": ["habcoin"]}, "parameters": []}, "/habcoin/v2/pay/": {"get": {"operationId": "habcoin_v2_pay_list", "summary": "Escrow Payment API (V2)", "description": "Extends the original Pay view with support for escrow-style payments:\n- hold: Deduct coins from user but do NOT transfer to provider (escrow hold)\n- release: Transfer held coins to provider's wallet (after successful call)\n- refund: Return held coins to user's balance (on cancellation)\n- direct: Same as original Pay — deduct from user AND transfer to provider", "parameters": [{"name": "token", "in": "query", "description": "Security token", "required": true, "type": "string"}, {"name": "action", "in": "query", "description": "Payment action: hold, release, refund, direct", "required": true, "type": "string", "enum": ["hold", "release", "refund", "direct"]}, {"name": "username", "in": "query", "description": "User email (legacy fallback for hold, refund, direct)", "required": false, "type": "string"}, {"name": "habib_user_id", "in": "query", "description": "Unambiguous payer id; preferred over username when present", "required": false, "type": "integer"}, {"name": "amount", "in": "query", "description": "Number of coins", "required": true, "type": "integer"}, {"name": "object_id", "in": "query", "description": "Consultant ID", "required": false, "type": "integer"}, {"name": "call_id", "in": "query", "description": "Call ID for tracking", "required": false, "type": "integer"}, {"name": "service", "in": "query", "description": "Service type (e.g. calls_hold, calls_release)", "required": false, "type": "string"}, {"name": "app_name", "in": "query", "description": "App label for content type lookup", "required": false, "type": "string"}, {"name": "discount_code", "in": "query", "description": "Optional discount code (only used in hold/direct)", "required": false, "type": "string"}], "responses": {"200": {"description": "Success", "examples": {"application/json": {"status": "Coins deducted successfully"}}}, "400": {"description": "Bad request"}, "403": {"description": "Invalid security token"}, "404": {"description": "Not found"}}, "tags": ["habcoin"]}, "parameters": []}, "/habcoin/validate-discount/": {"post": {"operationId": "habcoin_validate-discount_create", "description": "Validate discount code and calculate final price", "parameters": [{"name": "data", "in": "body", "required": true, "schema": {"required": ["code", "service", "object_id"], "type": "object", "properties": {"code": {"description": "Discount code", "type": "string", "example": "SUMMER20"}, "service": {"description": "Service name (checkup, meet, etc.)", "type": "string", "example": "checkup"}, "object_id": {"description": "Object ID (Checkup or Meet ID)", "type": "integer", "example": 5}, "app_name": {"description": "App name (optional)", "type": "string", "example": "checkup"}}}}], "responses": {"200": {"description": "Discount code is valid", "examples": {"application/json": {"valid": true, "original_price": 10.0, "discounted_price": 8.0, "discount_amount": 2.0, "discount_percentage": 20.0, "message": "Discount code is valid and 20% discount will be applied"}}}, "400": {"description": "Invalid discount code", "examples": {"application/json": {"valid": false, "errors": {"code": ["Discount code has expired"]}}}}, "401": {"description": "Unauthorized - Authentication required"}}, "tags": ["Discount Code"]}, "parameters": []}, "/habibmeet/guidelines/": {"get": {"operationId": "habibmeet_guidelines_list", "description": "", "parameters": [{"name": "page", "in": "query", "description": "A page number within the paginated result set.", "required": false, "type": "integer"}], "responses": {"200": {"description": ""}}, "tags": ["habibmeet"]}, "parameters": []}, "/habibmeet/meets/": {"get": {"operationId": "habibmeet_meets_list", "description": "", "parameters": [{"name": "limit", "in": "query", "description": "Number of results to return per page.", "required": false, "type": "integer"}, {"name": "offset", "in": "query", "description": "The initial index from which to return the results.", "required": false, "type": "integer"}, {"name": "meet_type", "in": "query", "description": "Meet Type (e.g., is_free, is_suggested)", "type": "string"}, {"name": "language_code", "in": "query", "description": "Language Code (e.g., en, fa, es)", "type": "string"}, {"name": "search", "in": "query", "description": "Search term", "type": "string"}], "responses": {"200": {"description": "", "schema": {"required": ["count", "results"], "type": "object", "properties": {"count": {"type": "integer"}, "next": {"type": "string", "format": "uri", "x-nullable": true}, "previous": {"type": "string", "format": "uri", "x-nullable": true}, "results": {"type": "array", "items": {"$ref": "#/definitions/MeetSerializer"}}}}}}, "tags": ["habibmeet"]}, "parameters": []}, "/habibmeet/meets/archive/{session_id}/": {"delete": {"operationId": "habibmeet_meets_archive_delete", "description": "", "parameters": [], "responses": {"204": {"description": ""}}, "tags": ["habibmeet"]}, "parameters": [{"name": "session_id", "in": "path", "required": true, "type": "string"}]}, "/habibmeet/meets/create/": {"post": {"operationId": "habibmeet_meets_create_create", "description": "", "parameters": [{"name": "data", "in": "body", "required": true, "schema": {"$ref": "#/definitions/MeetCreate"}}], "responses": {"201": {"description": "", "schema": {"$ref": "#/definitions/MeetCreate"}}}, "tags": ["habibmeet"]}, "parameters": []}, "/habibmeet/meets/create/v2/": {"post": {"operationId": "habibmeet_meets_create_v2_create", "description": "Create a new meet with access control (public/private) and optional password.", "parameters": [{"name": "data", "in": "body", "required": true, "schema": {"$ref": "#/definitions/MeetCreateV2"}}], "responses": {"201": {"description": "", "schema": {"$ref": "#/definitions/MeetCreateV2"}}}, "tags": ["habibmeet"]}, "parameters": []}, "/habibmeet/meets/provider/profile/": {"post": {"operationId": "habibmeet_meets_provider_profile_create", "description": "", "parameters": [{"name": "data", "in": "body", "required": true, "schema": {"$ref": "#/definitions/MeetProviderProfile"}}], "responses": {"201": {"description": "", "schema": {"$ref": "#/definitions/MeetProviderProfile"}}}, "tags": ["habibmeet"]}, "parameters": []}, "/habibmeet/meets/providers/": {"get": {"operationId": "habibmeet_meets_providers_list", "description": "", "parameters": [{"name": "limit", "in": "query", "description": "Number of results to return per page.", "required": false, "type": "integer"}, {"name": "offset", "in": "query", "description": "The initial index from which to return the results.", "required": false, "type": "integer"}], "responses": {"200": {"description": "", "schema": {"required": ["count", "results"], "type": "object", "properties": {"count": {"type": "integer"}, "next": {"type": "string", "format": "uri", "x-nullable": true}, "previous": {"type": "string", "format": "uri", "x-nullable": true}, "results": {"type": "array", "items": {"$ref": "#/definitions/ProviderMeetSerializer"}}}}}}, "tags": ["habibmeet"]}, "parameters": []}, "/habibmeet/meets/providers/{id}/": {"get": {"operationId": "habibmeet_meets_providers_read", "description": "", "parameters": [], "responses": {"200": {"description": "", "schema": {"$ref": "#/definitions/ProviderDetailMeetSerializer"}}}, "tags": ["habibmeet"]}, "parameters": [{"name": "id", "in": "path", "description": "A unique integer value identifying this Meet Provider Profile.", "required": true, "type": "integer"}]}, "/habibmeet/meets/reminders/": {"get": {"operationId": "habibmeet_meets_reminders_list", "description": "", "parameters": [{"name": "limit", "in": "query", "description": "Number of results to return per page.", "required": false, "type": "integer"}, {"name": "offset", "in": "query", "description": "The initial index from which to return the results.", "required": false, "type": "integer"}], "responses": {"200": {"description": "", "schema": {"required": ["count", "results"], "type": "object", "properties": {"count": {"type": "integer"}, "next": {"type": "string", "format": "uri", "x-nullable": true}, "previous": {"type": "string", "format": "uri", "x-nullable": true}, "results": {"type": "array", "items": {"$ref": "#/definitions/MeetSerializer"}}}}}}, "tags": ["habibmeet"]}, "parameters": []}, "/habibmeet/meets/room/": {"get": {"operationId": "habibmeet_meets_room_list", "description": "", "parameters": [{"name": "limit", "in": "query", "description": "Number of results to return per page.", "required": false, "type": "integer"}, {"name": "offset", "in": "query", "description": "The initial index from which to return the results.", "required": false, "type": "integer"}], "responses": {"200": {"description": "", "schema": {"required": ["count", "results"], "type": "object", "properties": {"count": {"type": "integer"}, "next": {"type": "string", "format": "uri", "x-nullable": true}, "previous": {"type": "string", "format": "uri", "x-nullable": true}, "results": {"type": "array", "items": {"$ref": "#/definitions/MeetProviderRoom"}}}}}}, "tags": ["habibmeet"]}, "parameters": []}, "/habibmeet/meets/{meet_id}/": {"get": {"operationId": "habibmeet_meets_read", "description": "\nRetrieve detailed information about a specific meet including recordings.\n\nReturns complete meet details with all associated session recordings.\nEach recording includes session information, file details, and metadata.\n\n### Response Structure:\n```json\n{\n \"id\": 174,\n \"name\": \"تست-(Tester)\",\n \"description\": \"Meeting description\",\n \"next_session_subject\": \"Next session topic\",\n \"next_session_schedule\": \"2024-01-01T10:00:00Z\",\n \"is_suggested\": false,\n \"provider\": {\n \"id\": 1,\n \"username\": \"provider_name\",\n \"email\": \"provider@example.com\"\n },\n \"is_free\": true,\n \"price\": \"0.00\",\n \"is_live\": false,\n \"is_closed\": false,\n \"online_users_count\": 0,\n \"language\": \"fa\",\n \"categories\": [],\n \"organizer\": \"Provider Name\",\n \"is_provider\": true,\n \"live_session_id\": null,\n \"has_archive\": true,\n \"recordings\": [\n {\n \"id\": 1,\n \"title\": \"Session Recording\",\n \"file\": \"https://habibapp.com/media/recorded_sessions/recording.mp4\",\n \"file_time\": \"01:30:00\",\n \"recording_type\": \"video\",\n \"created_at\": \"2024-01-01T10:00:00Z\",\n \"session_id\": 548,\n \"session_subject\": \"تلت\"\n }\n ],\n \"access\": \"public\",\n \"password\": null,\n \"has_recording\": true\n}\n```\n\n### Features:\n- Complete meet information\n- All active session recordings included\n- Provider and organizer details\n- Live session status and ID\n- Access control information\n- Recording availability status\n", "parameters": [{"name": "meet_id", "in": "path", "description": "ID of the meet to retrieve details for", "required": true, "type": "integer"}], "responses": {"200": {"description": "Meet details retrieved successfully", "schema": {"type": "object", "properties": {"id": {"description": "Meet ID", "type": "integer"}, "name": {"description": "Meet name", "type": "string"}, "description": {"description": "Meet description", "type": "string"}, "next_session_subject": {"description": "Next session subject", "type": "string"}, "next_session_schedule": {"description": "Next session schedule", "type": "string", "format": "date-time"}, "is_suggested": {"description": "Whether meet is suggested", "type": "boolean"}, "provider": {"type": "object", "properties": {"id": {"description": "Provider ID", "type": "integer"}, "username": {"description": "Provider username", "type": "string"}, "email": {"description": "Provider email", "type": "string"}}}, "is_free": {"description": "Whether meet is free", "type": "boolean"}, "price": {"description": "Meet price", "type": "string"}, "is_live": {"description": "Whether meet is currently live", "type": "boolean"}, "is_closed": {"description": "Whether meet is closed", "type": "boolean"}, "online_users_count": {"description": "Number of online users", "type": "integer"}, "language": {"description": "Meet language code", "type": "string"}, "categories": {"description": "Meet categories", "type": "array", "items": {"type": "string"}}, "organizer": {"description": "Organizer name", "type": "string"}, "is_provider": {"description": "Whether current user is the provider", "type": "boolean"}, "live_session_id": {"description": "ID of current live session", "type": "integer", "nullable": true}, "has_archive": {"description": "Whether meet has archived sessions", "type": "boolean"}, "recordings": {"description": "List of all active recordings for this meet", "type": "array", "items": {"type": "object", "properties": {"id": {"description": "Recording ID", "type": "integer"}, "title": {"description": "Recording title", "type": "string"}, "file": {"description": "Recording file URL", "type": "string"}, "file_time": {"description": "Recording duration", "type": "string"}, "recording_type": {"description": "Recording type: voice or video", "type": "string"}, "created_at": {"description": "Recording creation timestamp", "type": "string", "format": "date-time"}, "session_id": {"description": "Associated session ID", "type": "integer"}, "session_subject": {"description": "Session subject/title", "type": "string"}}}}, "access": {"description": "Meet access level", "type": "string"}, "password": {"description": "Meet password if required", "type": "string", "nullable": true}, "has_recording": {"description": "Whether meet has any recordings", "type": "boolean"}}}}, "401": {"description": "Authentication required"}, "403": {"description": "Permission denied"}, "404": {"description": "Meet not found"}}, "tags": ["habibmeet"]}, "put": {"operationId": "habibmeet_meets_update", "description": "", "parameters": [{"name": "data", "in": "body", "required": true, "schema": {"$ref": "#/definitions/MeetDetailSerializer"}}], "responses": {"200": {"description": "", "schema": {"$ref": "#/definitions/MeetDetailSerializer"}}}, "tags": ["habibmeet"]}, "patch": {"operationId": "habibmeet_meets_partial_update", "description": "", "parameters": [{"name": "data", "in": "body", "required": true, "schema": {"$ref": "#/definitions/MeetDetailSerializer"}}], "responses": {"200": {"description": "", "schema": {"$ref": "#/definitions/MeetDetailSerializer"}}}, "tags": ["habibmeet"]}, "delete": {"operationId": "habibmeet_meets_delete", "description": "", "parameters": [], "responses": {"204": {"description": ""}}, "tags": ["habibmeet"]}, "parameters": [{"name": "meet_id", "in": "path", "required": true, "type": "string"}]}, "/habibmeet/meets/{meet_id}/archive/": {"get": {"operationId": "habibmeet_meets_archive_list", "description": "", "parameters": [{"name": "limit", "in": "query", "description": "Number of results to return per page.", "required": false, "type": "integer"}, {"name": "offset", "in": "query", "description": "The initial index from which to return the results.", "required": false, "type": "integer"}], "responses": {"200": {"description": "", "schema": {"required": ["count", "results"], "type": "object", "properties": {"count": {"type": "integer"}, "next": {"type": "string", "format": "uri", "x-nullable": true}, "previous": {"type": "string", "format": "uri", "x-nullable": true}, "results": {"type": "array", "items": {"$ref": "#/definitions/SessionArchiveSerializer"}}}}}}, "tags": ["habibmeet"]}, "parameters": [{"name": "meet_id", "in": "path", "description": "The meet this session belongs to", "required": true, "type": "string"}]}, "/habibmeet/meets/{meet_id}/close/": {"post": {"operationId": "habibmeet_meets_close_create", "description": "", "parameters": [], "responses": {"201": {"description": ""}}, "tags": ["habibmeet"]}, "parameters": [{"name": "meet_id", "in": "path", "required": true, "type": "string"}]}, "/habibmeet/meets/{meet_id}/reminder/update/": {"put": {"operationId": "habibmeet_meets_reminder_update_update", "description": "Update or create a reminder for a meet with specified active status", "parameters": [{"name": "data", "in": "body", "required": true, "schema": {"required": ["is_active"], "type": "object", "properties": {"is_active": {"description": "Whether the reminder is active or not", "type": "boolean"}}}}], "responses": {"200": {"description": "Reminder status updated successfully", "schema": {"type": "object", "properties": {"message": {"type": "string"}}}}, "201": {"description": "Reminder created with specified status", "schema": {"type": "object", "properties": {"message": {"type": "string"}}}}, "400": {"description": "Invalid request parameters", "schema": {"type": "object", "properties": {"detail": {"type": "string"}}}}}, "tags": ["habibmeet"]}, "parameters": [{"name": "meet_id", "in": "path", "required": true, "type": "string"}]}, "/habibmeet/meets/{meet_id}/report/": {"post": {"operationId": "habibmeet_meets_report_create", "description": "", "parameters": [{"name": "data", "in": "body", "required": true, "schema": {"$ref": "#/definitions/ReportSerializer"}}], "responses": {"201": {"description": "", "schema": {"$ref": "#/definitions/ReportSerializer"}}}, "tags": ["habibmeet"]}, "parameters": [{"name": "meet_id", "in": "path", "description": "Meet being reported on", "required": true, "type": "string"}]}, "/habibmeet/meets/{meet_id}/schedule/": {"delete": {"operationId": "habibmeet_meets_schedule_delete", "description": "Delete the next session subject and schedule if the meet is not live.\nIf the meet is live, an error is returned. If the next session subject and\nschedule are already empty, an error is returned.", "parameters": [], "responses": {"204": {"description": ""}}, "tags": ["habibmeet"]}, "parameters": [{"name": "meet_id", "in": "path", "required": true, "type": "string"}]}, "/habibmeet/meets/{meet_id}/session/": {"post": {"operationId": "habibmeet_meets_session_create", "description": "", "parameters": [{"name": "data", "in": "body", "required": true, "schema": {"$ref": "#/definitions/SessionCreate"}}], "responses": {"201": {"description": "", "schema": {"$ref": "#/definitions/SessionCreate"}}}, "tags": ["habibmeet"]}, "parameters": [{"name": "meet_id", "in": "path", "required": true, "type": "string"}]}, "/habibmeet/recordings/create/": {"post": {"operationId": "habibmeet_recordings_create_create", "summary": "API endpoint for creating new session recordings.", "description": "Allows authenticated users to create recordings for sessions.", "parameters": [{"name": "data", "in": "body", "required": true, "schema": {"$ref": "#/definitions/SessionRecordingCreateUpdateSerializer"}}], "responses": {"201": {"description": "", "schema": {"$ref": "#/definitions/SessionRecordingCreateUpdateSerializer"}}}, "tags": ["habibmeet"]}, "parameters": []}, "/habibmeet/recordings/{recording_id}/delete/": {"delete": {"operationId": "habibmeet_recordings_delete_delete", "description": "Handle DELETE request with proper error handling and status codes.", "parameters": [], "responses": {"204": {"description": ""}}, "tags": ["habibmeet"]}, "parameters": [{"name": "recording_id", "in": "path", "required": true, "type": "string"}]}, "/habibmeet/recordings/{recording_id}/update/": {"put": {"operationId": "habibmeet_recordings_update_update", "summary": "API endpoint for updating existing session recordings.", "description": "Allows authenticated users to update recordings they own.", "parameters": [{"name": "data", "in": "body", "required": true, "schema": {"$ref": "#/definitions/SessionRecordingCreateUpdateSerializer"}}], "responses": {"200": {"description": "", "schema": {"$ref": "#/definitions/SessionRecordingCreateUpdateSerializer"}}}, "tags": ["habibmeet"]}, "patch": {"operationId": "habibmeet_recordings_update_partial_update", "summary": "API endpoint for updating existing session recordings.", "description": "Allows authenticated users to update recordings they own.", "parameters": [{"name": "data", "in": "body", "required": true, "schema": {"$ref": "#/definitions/SessionRecordingCreateUpdateSerializer"}}], "responses": {"200": {"description": "", "schema": {"$ref": "#/definitions/SessionRecordingCreateUpdateSerializer"}}}, "tags": ["habibmeet"]}, "parameters": [{"name": "recording_id", "in": "path", "required": true, "type": "string"}]}, "/habibmeet/sessions/{id}/upload/": {"put": {"operationId": "habibmeet_sessions_upload_update", "description": "", "parameters": [{"name": "data", "in": "body", "required": true, "schema": {"$ref": "#/definitions/SessionFileUpload"}}], "responses": {"200": {"description": "", "schema": {"$ref": "#/definitions/SessionFileUpload"}}}, "tags": ["habibmeet"]}, "patch": {"operationId": "habibmeet_sessions_upload_partial_update", "description": "Upload a file for a specific session.", "parameters": [{"name": "data", "in": "body", "required": true, "schema": {"$ref": "#/definitions/SessionFileUpload"}}, {"name": "recorded_file", "in": "file", "description": "The file to upload for the session.", "required": true, "type": "file"}], "responses": {"200": {"description": "", "schema": {"$ref": "#/definitions/SessionFileUpload"}}}, "tags": ["habibmeet"]}, "parameters": [{"name": "id", "in": "path", "description": "A unique integer value identifying this session.", "required": true, "type": "integer"}]}, "/habibmeet/{id}/recordings/": {"get": {"operationId": "habibmeet_recordings_list", "description": "\nRetrieve a list of recorded meeting sessions for a specific meet.\n\nReturns all active session recordings for the specified meet ID with their\nassociated session details, file information, duration, and recording type (voice/video).\n\n### Response Structure:\n```json\n[\n {\n \"id\": 1,\n \"title\": \"Meeting Recording\",\n \"file\": \"https://habibapp.com/media/recorded_sessions/recording.mp4\",\n \"file_time\": \"01:30:00\",\n \"recording_type\": \"video\",\n \"created_at\": \"2024-01-01T10:00:00Z\",\n \"session_id\": 123,\n \"session_subject\": \"Weekly Team Meeting\"\n }\n]\n```\n\n### Features:\n- Only returns active recordings for the specified meet (is_active=True)\n- Includes session information for context\n- Supports filtering and pagination\n- Ordered by creation date (newest first)\n", "parameters": [{"name": "limit", "in": "query", "description": "Number of results to return per page.", "required": false, "type": "integer"}, {"name": "offset", "in": "query", "description": "The initial index from which to return the results.", "required": false, "type": "integer"}, {"name": "id", "in": "path", "description": "ID of the meet to retrieve recordings for", "required": true, "type": "integer"}], "responses": {"200": {"description": "List of session recordings for the specified meet retrieved successfully", "schema": {"type": "array", "items": {"type": "object", "properties": {"id": {"description": "Recording ID", "type": "integer"}, "title": {"description": "Recording title", "type": "string"}, "file": {"description": "File URL", "type": "string"}, "file_time": {"description": "Recording duration", "type": "string"}, "recording_type": {"description": "Type: voice or video", "type": "string"}, "created_at": {"description": "Creation timestamp", "type": "string", "format": "date-time"}, "session_id": {"description": "Associated session ID", "type": "integer"}, "session_subject": {"description": "Session subject/title", "type": "string"}}}}}, "401": {"description": "Authentication required"}, "403": {"description": "Permission denied"}, "404": {"description": "Meet not found"}}, "tags": ["habibmeet"]}, "parameters": [{"name": "id", "in": "path", "required": true, "type": "string"}]}, "/habibnet/centers/": {"get": {"operationId": "habibnet_centers_list", "description": "", "parameters": [{"name": "limit", "in": "query", "description": "Number of results to return per page.", "required": false, "type": "integer"}, {"name": "offset", "in": "query", "description": "The initial index from which to return the results.", "required": false, "type": "integer"}], "responses": {"200": {"description": "", "schema": {"required": ["count", "results"], "type": "object", "properties": {"count": {"type": "integer"}, "next": {"type": "string", "format": "uri", "x-nullable": true}, "previous": {"type": "string", "format": "uri", "x-nullable": true}, "results": {"type": "array", "items": {"$ref": "#/definitions/CenterList"}}}}}}, "tags": ["habibnet"]}, "parameters": []}, "/habibnet/centers/{id}/": {"get": {"operationId": "habibnet_centers_read", "description": "", "parameters": [], "responses": {"200": {"description": "", "schema": {"$ref": "#/definitions/CenterDetail"}}}, "tags": ["habibnet"]}, "parameters": [{"name": "id", "in": "path", "description": "A unique integer value identifying this center.", "required": true, "type": "integer"}]}, "/habibnet/centers/{id}/events/": {"get": {"operationId": "habibnet_centers_events_list", "description": "", "parameters": [{"name": "limit", "in": "query", "description": "Number of results to return per page.", "required": false, "type": "integer"}, {"name": "offset", "in": "query", "description": "The initial index from which to return the results.", "required": false, "type": "integer"}], "responses": {"200": {"description": "", "schema": {"required": ["count", "results"], "type": "object", "properties": {"count": {"type": "integer"}, "next": {"type": "string", "format": "uri", "x-nullable": true}, "previous": {"type": "string", "format": "uri", "x-nullable": true}, "results": {"type": "array", "items": {"$ref": "#/definitions/CenterEvent"}}}}}}, "tags": ["habibnet"]}, "parameters": [{"name": "id", "in": "path", "required": true, "type": "string"}]}, "/habibnet/provider/center/": {"get": {"operationId": "habibnet_provider_center_read", "description": "\nRetrieve the center owned by the authenticated provider.\n\n### Requirements:\n- User must be authenticated\n- User must have a verified provider profile\n- Provider must have created a center\n\n### Notes:\n- Each provider can only have one center\n- Returns the provider's center with all details including status\n\n### Response Structure:\nReturns the center details including status, images, and all other information.\n", "parameters": [], "responses": {"200": {"description": "Center retrieved successfully", "schema": {"type": "object", "properties": {"id": {"description": "Center ID", "type": "integer"}, "avatar": {"description": "Avatar URL", "type": "string"}, "name": {"description": "Center name", "type": "string"}, "slogan": {"description": "Center slogan", "type": "string"}, "center_type": {"description": "Center type", "type": "string"}, "about_center": {"description": "About center", "type": "string"}, "working_hours": {"description": "Working hours", "type": "object"}, "social_medias": {"description": "Social media links", "type": "array", "items": {"type": "object"}}, "address": {"description": "Address", "type": "string"}, "lat": {"description": "Latitude", "type": "number"}, "lon": {"description": "Longitude", "type": "number"}, "images": {"description": "Center images", "type": "array", "items": {"type": "object", "properties": {"id": {"type": "integer"}, "image": {"type": "string"}, "priority": {"type": "integer"}}}}, "status": {"description": "Approval status (pending, approved, rejected)", "type": "string"}, "created_at": {"type": "string", "format": "date-time"}, "updated_at": {"type": "string", "format": "date-time"}}}, "examples": {"application/json": {"id": 1, "avatar": "https://habibapp.com/media/habibnet/avatars/center_avatar.jpg", "name": "Islamic Center of New York", "slogan": "Serving the community since 1990", "center_type": "islamic_center", "about_center": "A comprehensive Islamic center...", "working_hours": {"monday": "9:00 AM - 9:00 PM", "friday": "9:00 AM - 11:00 PM"}, "social_medias": [{"platform": "facebook", "url": "https://facebook.com/center"}], "address": "123 Main Street, New York, NY 10001", "lat": 40.7128, "lon": -74.006, "images": [{"id": 1, "image": "https://habibapp.com/media/habibnet/image1.jpg", "priority": 1}], "status": "pending", "created_at": "2024-01-15T10:30:00Z", "updated_at": "2024-01-15T10:30:00Z"}}}, "401": {"description": "Authentication required"}, "404": {"description": "Provider profile or center not found", "examples": {"application/json": {"detail": "No verified provider profile found. Please submit a provider request first."}}}}, "tags": ["habibnet"]}, "parameters": []}, "/habibnet/provider/center/create/": {"post": {"operationId": "habibnet_provider_center_create_create", "description": "\nCreate a new center for the authenticated provider.\n\n### Requirements:\n- User must be authenticated\n- User must have a verified provider profile\n- Provider profile must be approved\n\n### Request Body:\nThe request should include center details and optionally images.\n\n**IMPORTANT**: Image fields (avatar, images) must be string URLs from the `/habibnet/upload-tmp-media/` endpoint, NOT binary file data.\n\n### Image Upload Workflow:\n1. First upload each image file to `/habibnet/upload-tmp-media/` endpoint\n2. Extract the `file` value from the response (e.g., \"/tmp/xyz-avatar.jpg\")\n3. Use this path string in the center creation request\n\n### Example Request:\n```json\n{\n \"avatar\": \"/tmp/xyz-avatar.jpg\",\n \"name\": \"Islamic Center of New York\",\n \"slogan\": \"Serving the community since 1990\",\n \"center_type\": \"islamic_center\",\n \"about_center\": \"A comprehensive Islamic center offering prayer facilities, educational programs, and community services.\",\n \"working_hours\": {\n \"monday\": \"9:00 AM - 9:00 PM\",\n \"tuesday\": \"9:00 AM - 9:00 PM\",\n \"wednesday\": \"9:00 AM - 9:00 PM\",\n \"thursday\": \"9:00 AM - 9:00 PM\",\n \"friday\": \"9:00 AM - 11:00 PM\",\n \"saturday\": \"9:00 AM - 11:00 PM\",\n \"sunday\": \"9:00 AM - 9:00 PM\"\n },\n \"social_medias\": [\n {\"platform\": \"facebook\", \"url\": \"https://facebook.com/islamiccenter\"},\n {\"platform\": \"instagram\", \"url\": \"https://instagram.com/islamiccenter\"}\n ],\n \"address\": \"123 Main Street, New York, NY 10001\",\n \"lat\": 40.7128,\n \"lon\": -74.0060,\n \"images\": [\n {\"image\": \"/tmp/xyz-image1.jpg\", \"priority\": 1},\n {\"image\": \"/tmp/xyz-image2.jpg\", \"priority\": 2}\n ]\n}\n```\n\n### Response Structure:\nReturns the created center with all details including generated ID and timestamps.\n", "parameters": [{"name": "data", "in": "body", "required": true, "schema": {"required": ["name", "slogan"], "type": "object", "properties": {"avatar": {"description": "Avatar image path (string) from temporary upload. First upload to /habibnet/upload-tmp-media/ and use the file value from response.", "type": "string", "example": "/tmp/xyz-avatar.jpg"}, "name": {"description": "Center name", "type": "string", "example": "Islamic Center of New York"}, "slogan": {"description": "Center slogan or tagline", "type": "string", "example": "Serving the community since 1990"}, "center_type": {"description": "Type of center", "type": "string", "enum": ["islamic_center", "library", "mosque", "shia_center"], "example": "islamic_center"}, "about_center": {"description": "Detailed description about the center", "type": "string", "example": "A comprehensive Islamic center offering prayer facilities..."}, "working_hours": {"description": "Working hours for each day of the week", "type": "object", "example": {"monday": "9:00 AM - 9:00 PM", "friday": "9:00 AM - 11:00 PM"}}, "social_medias": {"description": "List of social media links", "type": "array", "items": {"type": "object", "properties": {"platform": {"type": "string"}, "url": {"type": "string"}}}, "example": [{"platform": "facebook", "url": "https://facebook.com/center"}]}, "address": {"description": "Physical address of the center", "type": "string", "example": "123 Main Street, New York, NY 10001"}, "lat": {"description": "Latitude coordinate", "type": "number", "example": 40.7128}, "lon": {"description": "Longitude coordinate", "type": "number", "example": -74.006}, "images": {"description": "List of center images. Each image must be a string path from /habibnet/upload-tmp-media/", "type": "array", "items": {"type": "object", "properties": {"image": {"description": "Image path (string) from temporary upload", "type": "string", "example": "/tmp/xyz-image.jpg"}, "priority": {"description": "Display priority (higher = shown first)", "type": "integer", "default": 10}}}}}}}], "responses": {"201": {"description": "Center created successfully", "schema": {"type": "object", "properties": {"id": {"description": "Center ID", "type": "integer"}, "avatar": {"description": "Avatar URL", "type": "string"}, "name": {"description": "Center name", "type": "string"}, "slogan": {"description": "Center slogan", "type": "string"}, "center_type": {"description": "Center type", "type": "string"}, "about_center": {"description": "About center", "type": "string"}, "working_hours": {"description": "Working hours", "type": "object"}, "social_medias": {"description": "Social media links", "type": "array", "items": {"type": "object"}}, "address": {"description": "Address", "type": "string"}, "lat": {"description": "Latitude", "type": "number"}, "lon": {"description": "Longitude", "type": "number"}, "images": {"description": "Center images", "type": "array", "items": {"type": "object", "properties": {"id": {"type": "integer"}, "image": {"type": "string"}, "priority": {"type": "integer"}}}}, "status": {"description": "Approval status", "type": "string"}, "created_at": {"type": "string", "format": "date-time"}, "updated_at": {"type": "string", "format": "date-time"}}}, "examples": {"application/json": {"id": 1, "avatar": "https://habibapp.com/media/habibnet/avatars/center_avatar.jpg", "name": "Islamic Center of New York", "slogan": "Serving the community since 1990", "center_type": "islamic_center", "about_center": "A comprehensive Islamic center...", "working_hours": {"monday": "9:00 AM - 9:00 PM", "friday": "9:00 AM - 11:00 PM"}, "social_medias": [{"platform": "facebook", "url": "https://facebook.com/center"}], "address": "123 Main Street, New York, NY 10001", "lat": 40.7128, "lon": -74.006, "images": [{"id": 1, "image": "https://habibapp.com/media/habibnet/image1.jpg", "priority": 1}], "status": "pending", "created_at": "2024-01-15T10:30:00Z", "updated_at": "2024-01-15T10:30:00Z"}}}, "400": {"description": "Validation error", "examples": {"application/json": {"name": ["This field is required."], "center_type": ["Invalid center type. Must be one of: islamic_center, library, mosque, shia_center"]}}}, "401": {"description": "Authentication required"}, "403": {"description": "Permission denied - Provider not verified", "examples": {"application/json": {"detail": "You must have a verified provider profile to create centers."}}}}, "tags": ["habibnet"]}, "parameters": []}, "/habibnet/provider/center/{center_id}/events/": {"get": {"operationId": "habibnet_provider_center_events_list", "description": "\nList all events for a specific center owned by the provider.\n\n### Requirements:\n- User must be authenticated\n- User must be the owner of the center (via provider profile)\n\n### Response Structure:\nReturns a list of all events for the specified center.\n\n### Example Response:\n```json\n[\n {\n \"id\": 1,\n \"title\": \"Friday Prayer\",\n \"description\": \"Weekly Friday congregational prayer\",\n \"time\": \"1:00 PM\",\n \"start_time\": \"2024-01-19T13:00:00Z\",\n \"end_time\": \"2024-01-19T14:00:00Z\",\n \"date\": \"2024-01-19T13:00:00Z\",\n \"image\": \"https://habibapp.com/media/habibnet/event1.jpg\",\n \"center\": 1\n }\n]\n```\n", "parameters": [{"name": "limit", "in": "query", "description": "Number of results to return per page.", "required": false, "type": "integer"}, {"name": "offset", "in": "query", "description": "The initial index from which to return the results.", "required": false, "type": "integer"}, {"name": "center_id", "in": "path", "description": "ID of the center to list events for", "required": true, "type": "integer"}], "responses": {"200": {"description": "List of center events", "schema": {"type": "array", "items": {"type": "object", "properties": {"id": {"description": "Event ID", "type": "integer"}, "title": {"description": "Event title", "type": "string"}, "description": {"description": "Event description", "type": "string"}, "time": {"description": "Event time (text format)", "type": "string"}, "start_time": {"description": "Start time", "type": "string", "format": "date-time"}, "end_time": {"description": "End time", "type": "string", "format": "date-time"}, "date": {"description": "Event date", "type": "string", "format": "date-time"}, "image": {"description": "Event image URL", "type": "string"}, "center": {"description": "Center ID", "type": "integer"}}}}}, "401": {"description": "Authentication required"}, "403": {"description": "Permission denied - Not the owner", "examples": {"application/json": {"detail": "You do not have permission to view events for this center."}}}, "404": {"description": "Center not found"}}, "tags": ["habibnet"]}, "parameters": [{"name": "center_id", "in": "path", "required": true, "type": "string"}]}, "/habibnet/provider/center/{center_id}/events/create/": {"post": {"operationId": "habibnet_provider_center_events_create_create", "description": "\nCreate a new event for a center owned by the provider.\n\n### Requirements:\n- User must be authenticated\n- User must be the owner of the center (via provider profile)\n- Image must be uploaded via `/habibnet/upload-tmp-media/` endpoint first\n\n**IMPORTANT**: The image field must be a string URL (apath) from the upload endpoint, NOT binary file data.\n\n### Example Request:\n```json\n{\n \"title\": \"Friday Prayer\",\n \"description\": \"Weekly Friday congregational prayer. All community members are welcome.\",\n \"time\": \"1:00 PM\",\n \"start_time\": \"2024-01-19T13:00:00Z\",\n \"end_time\": \"2024-01-19T14:00:00Z\",\n \"date\": \"2024-01-19T13:00:00Z\",\n \"image\": \"/tmp/xyz-event-image.jpg\"\n}\n```\n\n### Response Structure:\nReturns the created event with all details including the full image URL.\n", "parameters": [{"name": "data", "in": "body", "required": true, "schema": {"required": ["title", "description", "time", "date", "image"], "type": "object", "properties": {"title": {"description": "Event title", "type": "string", "example": "Friday Prayer", "maxLength": 119}, "description": {"description": "Detailed event description", "type": "string", "example": "Weekly Friday congregational prayer. All community members are welcome."}, "time": {"description": "Event time in text format", "type": "string", "example": "1:00 PM", "maxLength": 255}, "start_time": {"description": "Event start time (optional)", "type": "string", "format": "date-time", "example": "2024-01-19T13:00:00Z"}, "end_time": {"description": "Event end time (optional)", "type": "string", "format": "date-time", "example": "2024-01-19T14:00:00Z"}, "date": {"description": "Event date", "type": "string", "format": "date-time", "example": "2024-01-19T13:00:00Z"}, "image": {"description": "Event image path from temporary upload", "type": "string", "example": "/static/tmp/xyz-event-image.jpg"}}}}, {"name": "center_id", "in": "path", "description": "ID of the center to create event for", "required": true, "type": "integer"}], "responses": {"201": {"description": "Event created successfully", "schema": {"type": "object", "properties": {"id": {"description": "Event ID", "type": "integer"}, "title": {"description": "Event title", "type": "string"}, "description": {"description": "Event description", "type": "string"}, "time": {"description": "Event time", "type": "string"}, "start_time": {"description": "Start time", "type": "string", "format": "date-time"}, "end_time": {"description": "End time", "type": "string", "format": "date-time"}, "date": {"description": "Event date", "type": "string", "format": "date-time"}, "image": {"description": "Event image URL", "type": "string"}, "center": {"description": "Center ID", "type": "integer"}}}, "examples": {"application/json": {"id": 1, "title": "Friday Prayer", "description": "Weekly Friday congregational prayer. All community members are welcome.", "time": "1:00 PM", "start_time": "2024-01-19T13:00:00Z", "end_time": "2024-01-19T14:00:00Z", "date": "2024-01-19T13:00:00Z", "image": "https://habibapp.com/media/habibnet/event_image.jpg", "center": 1}}}, "400": {"description": "Validation error", "examples": {"application/json": {"title": ["This field is required."], "image": ["This field is required."]}}}, "401": {"description": "Authentication required"}, "403": {"description": "Permission denied - Not the owner", "examples": {"application/json": {"detail": "You do not have permission to create events for this center."}}}, "404": {"description": "Center not found"}}, "tags": ["habibnet"]}, "parameters": [{"name": "center_id", "in": "path", "required": true, "type": "string"}]}, "/habibnet/provider/center/{center_id}/events/{event_id}/": {"patch": {"operationId": "habibnet_provider_center_events_partial_update", "description": "\nUpdate an existing event for a center owned by the provider (PATCH only - partial update).\n\n### Requirements:\n- User must be authenticated\n- User must be the owner of the center (via provider profile)\n- Event must belong to the specified center\n\n### Notes:\n- This endpoint supports partial updates (PATCH)\n- Only provided fields will be updated\n- Image can be updated by uploading via `/upload-tmp-media` endpoint first\n\n### Example Request:\n```json\n{\n \"title\": \"Updated Friday Prayer\",\n \"description\": \"Updated description for the weekly Friday prayer\",\n \"start_time\": \"2024-01-19T13:30:00Z\"\n}\n```\n\n### Response Structure:\nReturns the updated event with all current details.\n", "parameters": [{"name": "data", "in": "body", "required": true, "schema": {"type": "object", "properties": {"title": {"description": "Event title", "type": "string", "example": "Updated Friday Prayer", "maxLength": 119}, "description": {"description": "Event description", "type": "string", "example": "Updated description for the weekly Friday prayer"}, "time": {"description": "Event time in text format", "type": "string", "example": "1:30 PM", "maxLength": 255}, "start_time": {"description": "Event start time", "type": "string", "format": "date-time", "example": "2024-01-19T13:30:00Z"}, "end_time": {"description": "Event end time", "type": "string", "format": "date-time", "example": "2024-01-19T14:30:00Z"}, "date": {"description": "Event date", "type": "string", "format": "date-time", "example": "2024-01-19T13:30:00Z"}, "image": {"description": "New event image path from temporary upload", "type": "string", "example": "/static/tmp/xyz-new-event-image.jpg"}}}}, {"name": "center_id", "in": "path", "description": "ID of the center", "required": true, "type": "integer"}, {"name": "event_id", "in": "path", "description": "ID of the event to update", "required": true, "type": "integer"}], "responses": {"200": {"description": "Event updated successfully", "schema": {"type": "object", "properties": {"id": {"description": "Event ID", "type": "integer"}, "title": {"description": "Event title", "type": "string"}, "description": {"description": "Event description", "type": "string"}, "time": {"description": "Event time", "type": "string"}, "start_time": {"description": "Start time", "type": "string", "format": "date-time"}, "end_time": {"description": "End time", "type": "string", "format": "date-time"}, "date": {"description": "Event date", "type": "string", "format": "date-time"}, "image": {"description": "Event image URL", "type": "string"}, "center": {"description": "Center ID", "type": "integer"}}}, "examples": {"application/json": {"id": 1, "title": "Updated Friday Prayer", "description": "Updated description for the weekly Friday prayer", "time": "1:30 PM", "start_time": "2024-01-19T13:30:00Z", "end_time": "2024-01-19T14:30:00Z", "date": "2024-01-19T13:30:00Z", "image": "https://habibapp.com/media/habibnet/event_image.jpg", "center": 1}}}, "400": {"description": "Validation error", "examples": {"application/json": {"title": ["Ensure this field has no more than 119 characters."]}}}, "401": {"description": "Authentication required"}, "403": {"description": "Permission denied - Not the owner", "examples": {"application/json": {"detail": "You do not have permission to update events for this center."}}}, "404": {"description": "Event or center not found", "examples": {"application/json": {"detail": "Not found."}}}}, "tags": ["habibnet"]}, "parameters": [{"name": "center_id", "in": "path", "required": true, "type": "string"}, {"name": "event_id", "in": "path", "required": true, "type": "string"}]}, "/habibnet/provider/center/{center_id}/events/{event_id}/delete/": {"delete": {"operationId": "habibnet_provider_center_events_delete_delete", "description": "\nDelete an event for a center owned by the provider.\n\n### Requirements:\n- User must be authenticated\n- User must be the owner of the center (via provider profile)\n- Event must belong to the specified center\n\n### Notes:\n- This action is permanent and cannot be undone\n- The event will be completely removed from the system\n\n### Response:\nReturns 204 No Content on successful deletion.\n", "parameters": [{"name": "center_id", "in": "path", "description": "ID of the center", "required": true, "type": "integer"}, {"name": "event_id", "in": "path", "description": "ID of the event to delete", "required": true, "type": "integer"}], "responses": {"204": {"description": "Event deleted successfully (No Content)"}, "401": {"description": "Authentication required"}, "403": {"description": "Permission denied - Not the owner", "examples": {"application/json": {"detail": "You do not have permission to delete events for this center."}}}, "404": {"description": "Event or center not found", "examples": {"application/json": {"detail": "Not found."}}}}, "tags": ["habibnet"]}, "parameters": [{"name": "center_id", "in": "path", "required": true, "type": "string"}, {"name": "event_id", "in": "path", "required": true, "type": "string"}]}, "/habibnet/provider/center/{center_id}/images/{image_id}/": {"delete": {"operationId": "habibnet_provider_center_images_delete", "description": "\nDelete a specific image from a center's gallery.\n\n### Requirements:\n- User must be authenticated\n- User must be the owner of the center (via provider profile)\n- Image must belong to the specified center\n\n### URL Parameters:\n- `center_id`: ID of the center\n- `image_id`: ID of the image to delete\n\n### Example Response:\n```json\n{\n \"detail\": \"Image deleted successfully\"\n}\n```\n\n### Notes:\n- This permanently deletes the image from storage\n- Cannot be undone\n- The image file is removed from the server\n", "parameters": [{"name": "center_id", "in": "path", "description": "ID of the center", "required": true, "type": "integer"}, {"name": "image_id", "in": "path", "description": "ID of the image to delete", "required": true, "type": "integer"}], "responses": {"204": {"description": "Image deleted successfully"}, "401": {"description": "Authentication required"}, "403": {"description": "Permission denied - Not the owner", "examples": {"application/json": {"detail": "You do not have permission to delete this image."}}}, "404": {"description": "Image or center not found", "examples": {"application/json": {"detail": "Image not found or does not belong to this center."}}}}, "tags": ["habibnet"]}, "parameters": [{"name": "center_id", "in": "path", "required": true, "type": "string"}, {"name": "image_id", "in": "path", "required": true, "type": "string"}]}, "/habibnet/provider/center/{id}/": {"patch": {"operationId": "habibnet_provider_center_partial_update", "description": "\nUpdate an existing center (PATCH only - partial update).\n\n### Requirements:\n- User must be authenticated\n- User must be the owner of the center (via provider profile)\n- Only the provider who created the center can update it\n\n### Notes:\n- This endpoint supports partial updates (PATCH)\n- Only provided fields will be updated\n- Images can be added but not removed via this endpoint (use DELETE endpoint for image removal)\n\n### Example Request:\n```json\n{\n \"slogan\": \"Updated slogan for the center\",\n \"about_center\": \"Updated description with more details\",\n \"working_hours\": {\n \"monday\": \"8:00 AM - 10:00 PM\",\n \"friday\": \"8:00 AM - 11:00 PM\"\n }\n}\n```\n\n### Response Structure:\nReturns the updated center with all current details.\n", "parameters": [{"name": "data", "in": "body", "required": true, "schema": {"type": "object", "properties": {"avatar": {"description": "New avatar image path from temporary upload", "type": "string"}, "name": {"description": "Center name", "type": "string"}, "slogan": {"description": "Center slogan", "type": "string"}, "center_type": {"description": "Type of center", "type": "string", "enum": ["islamic_center", "library", "mosque", "shia_center"]}, "about_center": {"description": "About the center", "type": "string"}, "working_hours": {"description": "Working hours", "type": "object"}, "social_medias": {"description": "Social media links", "type": "array", "items": {"type": "object", "properties": {"platform": {"type": "string"}, "url": {"type": "string"}}}}, "address": {"description": "Physical address", "type": "string"}, "lat": {"description": "Latitude", "type": "number"}, "lon": {"description": "Longitude", "type": "number"}, "images": {"description": "New images to add", "type": "array", "items": {"type": "object", "properties": {"image": {"type": "string"}, "priority": {"type": "integer", "default": 10}}}}}}}], "responses": {"200": {"description": "Center updated successfully", "schema": {"type": "object", "properties": {"id": {"type": "integer"}, "avatar": {"type": "string"}, "name": {"type": "string"}, "slogan": {"type": "string"}, "center_type": {"type": "string"}, "about_center": {"type": "string"}, "working_hours": {"type": "object"}, "social_medias": {"type": "array", "items": {"type": "object"}}, "address": {"type": "string"}, "lat": {"type": "number"}, "lon": {"type": "number"}, "images": {"type": "array", "items": {"type": "object"}}, "status": {"type": "string"}, "created_at": {"type": "string", "format": "date-time"}, "updated_at": {"type": "string", "format": "date-time"}}}, "examples": {"application/json": {"id": 1, "avatar": "https://habibapp.com/media/habibnet/avatars/center_avatar.jpg", "name": "Islamic Center of New York", "slogan": "Updated slogan for the center", "center_type": "islamic_center", "about_center": "Updated description with more details", "working_hours": {"monday": "8:00 AM - 10:00 PM", "friday": "8:00 AM - 11:00 PM"}, "social_medias": [{"platform": "facebook", "url": "https://facebook.com/center"}], "address": "123 Main Street, New York, NY 10001", "lat": 40.7128, "lon": -74.006, "images": [], "status": "pending", "created_at": "2024-01-15T10:30:00Z", "updated_at": "2024-01-15T14:20:00Z"}}}, "400": {"description": "Validation error"}, "401": {"description": "Authentication required"}, "403": {"description": "Permission denied - Not the owner", "examples": {"application/json": {"detail": "You do not have permission to update this center."}}}, "404": {"description": "Center not found"}}, "tags": ["habibnet"]}, "parameters": [{"name": "id", "in": "path", "description": "A unique integer value identifying this center.", "required": true, "type": "integer"}]}, "/habibnet/provider/profile/": {"post": {"operationId": "habibnet_provider_profile_create", "summary": "API endpoint for creating center provider profiles.", "description": "This view handles provider requests for centers in Habibnet.\nUsers can request to become providers with two types:\n- management: Part of the center's management team\n- connected: Connected with the center's team", "parameters": [{"name": "data", "in": "body", "required": true, "schema": {"$ref": "#/definitions/CenterProviderProfile"}}], "responses": {"201": {"description": "", "schema": {"$ref": "#/definitions/CenterProviderProfile"}}}, "tags": ["habibnet"]}, "parameters": []}, "/habit/challenge/list/": {"get": {"operationId": "habit_challenge_list_list", "description": "", "parameters": [{"name": "limit", "in": "query", "description": "Number of results to return per page.", "required": false, "type": "integer"}, {"name": "offset", "in": "query", "description": "The initial index from which to return the results.", "required": false, "type": "integer"}], "responses": {"200": {"description": "", "schema": {"required": ["count", "results"], "type": "object", "properties": {"count": {"type": "integer"}, "next": {"type": "string", "format": "uri", "x-nullable": true}, "previous": {"type": "string", "format": "uri", "x-nullable": true}, "results": {"type": "array", "items": {"$ref": "#/definitions/ChallengeList"}}}}}}, "tags": ["habit"]}, "parameters": []}, "/habit/challenge/{id}/": {"get": {"operationId": "habit_challenge_read", "description": "", "parameters": [], "responses": {"200": {"description": "", "schema": {"$ref": "#/definitions/ChallengeDetail"}}}, "tags": ["habit"]}, "parameters": [{"name": "id", "in": "path", "description": "A unique integer value identifying this Challenge.", "required": true, "type": "integer"}]}, "/habit/challenge/{id}/join/": {"post": {"operationId": "habit_challenge_join_create", "description": "", "parameters": [], "responses": {"201": {"description": ""}}, "tags": ["habit"]}, "parameters": [{"name": "id", "in": "path", "required": true, "type": "string"}]}, "/habit/checklist/create/": {"post": {"operationId": "habit_checklist_create_create", "description": "", "parameters": [{"name": "data", "in": "body", "required": true, "schema": {"$ref": "#/definitions/UserChecklistItem"}}], "responses": {"201": {"description": "", "schema": {"$ref": "#/definitions/UserChecklistItem"}}}, "tags": ["habit"]}, "parameters": []}, "/habit/checklist/list/": {"get": {"operationId": "habit_checklist_list_list", "description": "category (prayer, quran, duas, worship, challenge, general, custom, all)", "parameters": [{"name": "category", "in": "query", "description": "", "required": false, "type": "string"}, {"name": "limit", "in": "query", "description": "Number of results to return per page.", "required": false, "type": "integer"}, {"name": "offset", "in": "query", "description": "The initial index from which to return the results.", "required": false, "type": "integer"}], "responses": {"200": {"description": "", "schema": {"required": ["count", "results"], "type": "object", "properties": {"count": {"type": "integer"}, "next": {"type": "string", "format": "uri", "x-nullable": true}, "previous": {"type": "string", "format": "uri", "x-nullable": true}, "results": {"type": "array", "items": {"$ref": "#/definitions/UserChecklistItem"}}}}}}, "tags": ["habit"]}, "parameters": []}, "/habit/checklist/mark-completed/": {"get": {"operationId": "habit_checklist_mark-completed_list", "description": "\n### ثبت وضعیت تکمیل چک لیست\nاین API وضعیت تکمیل یک چک لیست را برای تاریخ مشخص ثبت میکند. در صورت تکرار درخواست، وضعیت قبلی با تأیید جدید بهروغرسان میشود.\n\n| **فیلد** | **نوع** | **ضروری** | **توضیحات** |\n|----------|---------|-----------|-------------|\n| `checklist_id` | `integer` | بله | شناسه یکتای چک لیست |\n| `date` | `string` | نه | تاریخ در فرمت `YYYY-MM-DD` (پیشفرض: امروز) |\n| `day_of_week` | `string` | بله | روز هفته (مقدارهای مجاز: `monday`, `tuesday`, ..., `sunday`) |\n\n#### پاسخ:\n- **200 OK**: وضعیت تکمیل چک لیست\n- **400 Bad Request**: پارامترهای ورودی نامعتبر\n- **404 Not Found**: چک لیست موردنظر وجود ندارد\n- **500 Internal Server Error**: خطا در پردازش درخواست\n\n#### مثال پاسخ:\n```json\n{\n \"title\": \"تمرین ورزشی\",\n \"completed\": true\n}\n", "parameters": [{"name": "limit", "in": "query", "description": "Number of results to return per page.", "required": false, "type": "integer"}, {"name": "offset", "in": "query", "description": "The initial index from which to return the results.", "required": false, "type": "integer"}, {"name": "date", "in": "query", "description": "Date in YYYY-MM-DD format", "required": true, "type": "string", "default": "2026-07-01"}, {"name": "checklist_id", "in": "query", "description": "Checklist ID", "required": true, "type": "integer"}], "responses": {"200": {"description": "", "schema": {"$ref": "#/definitions/ChecklistEntryList"}}}, "tags": ["habit"]}, "parameters": []}, "/habit/checklist/report/": {"get": {"operationId": "habit_checklist_report_list", "description": "\n### آمار تکمیل چک لیست\nاین API آمار تکمیل چک لیست برای دوره های 7، 30 روز و یک سال گذشته را میگرداند. نتایج بر اساس روزهای فعال چک لیست محاسبه میشوند.\n\n| **فیلد** | **نوع** | **ضروری** | **توضیحات** |\n|----------|---------|-----------|-------------|\n| `checklist_id` | `integer` | بله | شناسه یکتای چک لیست |\n| `date` | `string` | نه | تاریخ در فرمت `YYYY-MM-DD` (پیشفرض: امروز) |\n| `day_of_week` | `string` | بله | روز هفته (مقدارهای مجاز: `monday`, `tuesday`, ..., `sunday`) |\n\n#### پاسخ:\n- **200 OK**: آمار تکمیل در فرمت زیر\n- **400 Bad Request**: پارامترهای ورودی نامعتبر\n- **404 Not Found**: چک لیست موردنظر وجود ندارد\n- **500 Internal Server Error**: خطا در پردازش درخواست\n\n#### مثال پاسخ:\n```json\n{\n \"7_days\": {\n \"total_days\": 5,\n \"completed_days\": 3,\n \"percentage\": 60.0\n },\n \"30_days\": {\n \"total_days\": 20,\n \"completed_days\": 15,\n \"percentage\": 75.0\n },\n \"year\": {\n \"total_days\": 365,\n \"completed_days\": 300,\n \"percentage\": 82.2\n }\n}\n", "parameters": [{"name": "limit", "in": "query", "description": "Number of results to return per page.", "required": false, "type": "integer"}, {"name": "offset", "in": "query", "description": "The initial index from which to return the results.", "required": false, "type": "integer"}, {"name": "checklist_id", "in": "query", "description": "Checklist ID", "required": true, "type": "integer"}], "responses": {"200": {"description": "", "schema": {"$ref": "#/definitions/ChecklistStats"}}}, "tags": ["habit"]}, "parameters": []}, "/habit/checklist/{id}/delete/": {"delete": {"operationId": "habit_checklist_delete_delete", "description": "", "parameters": [], "responses": {"204": {"description": ""}}, "tags": ["habit"]}, "parameters": [{"name": "id", "in": "path", "description": "A unique integer value identifying this User Checklist Item.", "required": true, "type": "integer"}]}, "/habit/checklist/{id}/detail/": {"get": {"operationId": "habit_checklist_detail_read", "description": "", "parameters": [], "responses": {"200": {"description": "", "schema": {"$ref": "#/definitions/ChecklistDetail"}}}, "tags": ["habit"]}, "parameters": [{"name": "id", "in": "path", "required": true, "type": "string"}]}, "/habit/checklist/{id}/update/": {"put": {"operationId": "habit_checklist_update_update", "description": "", "parameters": [{"name": "data", "in": "body", "required": true, "schema": {"$ref": "#/definitions/UserChecklistItem"}}], "responses": {"200": {"description": "", "schema": {"$ref": "#/definitions/UserChecklistItem"}}}, "tags": ["habit"]}, "patch": {"operationId": "habit_checklist_update_partial_update", "description": "", "parameters": [{"name": "data", "in": "body", "required": true, "schema": {"$ref": "#/definitions/UserChecklistItem"}}], "responses": {"200": {"description": "", "schema": {"$ref": "#/definitions/UserChecklistItem"}}}, "tags": ["habit"]}, "parameters": [{"name": "id", "in": "path", "description": "A unique integer value identifying this User Checklist Item.", "required": true, "type": "integer"}]}, "/habit/info/": {"get": {"operationId": "habit_info_list", "summary": "Main Page", "description": "\n### لیست چک لیست های فعال\nاین API لیست چک لیست های فعال کاربر را برای یک روز هفته و تاریخ خاص میگرداند. تنها چک لیست هایی که در بازه زمانی فعالیت و روزهای مجاز هستند نمایش داده میشوند.\n\n| **فیلد** | **نوع** | **ضروری** | **توضیحات** |\n|----------|---------|-----------|-------------|\n| `date` | `string` | نه | تاریخ در فرمت `YYYY-MM-DD` (پیشفرض: امروز) |\n| `day_of_week` | `string` | بله | روز هفته (مقدارهای مجاز: `monday`, `tuesday`, ..., `sunday`) |\n\n#### پاسخ:\n- **200 OK**: لیست چک لیست ها با وضعیت تکمیل\n- **400 Bad Request**: پارامترهای ورودی نامعتبر\n- **500 Internal Server Error**: خطا در پردازش درخواست\n\n", "parameters": [{"name": "limit", "in": "query", "description": "Number of results to return per page.", "required": false, "type": "integer"}, {"name": "offset", "in": "query", "description": "The initial index from which to return the results.", "required": false, "type": "integer"}, {"name": "date", "in": "query", "description": "Date in YYYY-MM-DD format", "required": true, "type": "string", "default": "2026-07-01"}], "responses": {"200": {"description": ""}}, "tags": ["habit"]}, "parameters": []}, "/habit/reminder/info/": {"get": {"operationId": "habit_reminder_info_list", "description": "\n### اطلاعات یادآوری چک لیست\nاین API وضعیت یادآوری چک لیست کاربر را بررسی میکند و در صورت وجود یادآوری فعال، اطلاعات کامل آن را برمیگرداند.\n\n#### منطق کسب و کار:\n- بررسی وجود یادآوری چک لیست برای کاربر جاری\n- اگر یادآوری وجود داشته باشد و وضعیت آن فعال باشد: `has_active_reminder: true` و اطلاعات کامل یادآوری\n- اگر یادآوری وجود نداشته باشد یا وضعیت آن غیرفعال باشد: `has_active_reminder: false` و `reminder: null`\n\n#### پاسخ:\n- **200 OK**: اطلاعات یادآوری با موفقیت دریافت شد\n\n#### مثال پاسخ (یادآوری فعال):\n```json\n{\n \"has_active_reminder\": true,\n \"reminder\": {\n \"id\": 123,\n \"service_name\": \"habit\",\n \"object_id\": \"\",\n \"text\": \"Daily Checklist Reminder\",\n \"created_at\": \"2024-01-15T10:30:00Z\",\n \"call_time\": \"2024-01-16T09:00:00Z\",\n \"is_sent\": false,\n \"is_read\": false,\n \"status\": true,\n \"notif_data\": null\n }\n}\n```\n\n#### مثال پاسخ (بدون یادآوری فعال):\n```json\n{\n \"has_active_reminder\": false,\n \"reminder\": null\n}\n```\n", "parameters": [{"name": "limit", "in": "query", "description": "Number of results to return per page.", "required": false, "type": "integer"}, {"name": "offset", "in": "query", "description": "The initial index from which to return the results.", "required": false, "type": "integer"}], "responses": {"200": {"description": "اطلاعات یادآوری با موفقیت دریافت شد", "schema": {"type": "object", "properties": {"has_active_reminder": {"description": "آیا یادآوری فعال وجود دارد", "type": "boolean"}, "reminder": {"description": "اطلاعات کامل یادآوری در صورت فعال بودن، در غیر این صورت null", "type": "object", "nullable": true}}}}}, "tags": ["habit"]}, "parameters": []}, "/habit/reminder/update/": {"put": {"operationId": "habit_reminder_update_update", "description": "API endpoint for updating habit reminder status.\nCreates reminder if it doesn't exist, updates if it exists.", "parameters": [], "responses": {"200": {"description": ""}}, "tags": ["habit"]}, "patch": {"operationId": "habit_reminder_update_partial_update", "description": "\nPartially update or create a habit reminder with specified status and optional call time.\n\n### Request Structure (PATCH):\n```json\n{\n \"status\": true, // Required: boolean - Whether reminder is active\n \"call_time\": \"09:30\" // Optional: string - Time in HH:MM format (24-hour)\n}\n```\n\n### Behavior:\n- If reminder doesn't exist: Creates new reminder with provided fields\n- If reminder exists: Updates only the provided fields (partial update)\n- call_time only updates when valid time format is provided (HH:MM)\n- Invalid, empty, or null call_time values are ignored (field remains unchanged)\n\n### Examples:\n- `{\"status\": true}` - Only update status, keep existing call_time\n- `{\"status\": false, \"call_time\": \"14:30\"}` - Update status and set call_time to 14:30\n- `{\"status\": false, \"call_time\": \"\"}` - Only update status, ignore empty call_time\n- `{\"status\": false, \"call_time\": null}` - Only update status, ignore null call_time\n- `{\"status\": true, \"call_time\": \"invalid\"}` - Only update status, ignore invalid time\n", "parameters": [{"name": "data", "in": "body", "required": true, "schema": {"required": ["status"], "type": "object", "properties": {"status": {"description": "Whether the habit reminder is active or not", "type": "boolean"}, "call_time": {"description": "Time when reminder should be triggered. Format: \"HH:MM\" (24-hour format). Optional - leave empty to clear.", "type": "string", "example": "09:30"}}}}], "responses": {"200": {"description": "Reminder status updated successfully", "schema": {"type": "object", "properties": {"message": {"type": "string"}, "status": {"type": "boolean"}}}}, "201": {"description": "Reminder created with specified status", "schema": {"type": "object", "properties": {"message": {"type": "string"}, "status": {"type": "boolean"}}}}, "400": {"description": "Invalid request parameters", "schema": {"type": "object", "properties": {"detail": {"type": "string"}}}}}, "tags": ["habit"]}, "parameters": []}, "/hadis/categories/": {"get": {"operationId": "hadis_categories_list", "description": "", "parameters": [{"name": "limit", "in": "query", "description": "Number of results to return per page.", "required": false, "type": "integer"}, {"name": "offset", "in": "query", "description": "The initial index from which to return the results.", "required": false, "type": "integer"}], "responses": {"200": {"description": "", "schema": {"required": ["count", "results"], "type": "object", "properties": {"count": {"type": "integer"}, "next": {"type": "string", "format": "uri", "x-nullable": true}, "previous": {"type": "string", "format": "uri", "x-nullable": true}, "results": {"type": "array", "items": {"$ref": "#/definitions/HadisCategory"}}}}}}, "tags": ["hadis"]}, "parameters": []}, "/hadis/categories/{category}/": {"get": {"operationId": "hadis_categories_read", "description": "", "parameters": [{"name": "limit", "in": "query", "description": "Number of results to return per page.", "required": false, "type": "integer"}, {"name": "offset", "in": "query", "description": "The initial index from which to return the results.", "required": false, "type": "integer"}], "responses": {"200": {"description": "", "schema": {"required": ["count", "results"], "type": "object", "properties": {"count": {"type": "integer"}, "next": {"type": "string", "format": "uri", "x-nullable": true}, "previous": {"type": "string", "format": "uri", "x-nullable": true}, "results": {"type": "array", "items": {"$ref": "#/definitions/Hadis"}}}}}}, "tags": ["hadis"]}, "parameters": [{"name": "category", "in": "path", "required": true, "type": "string"}]}, "/hadis/events/": {"get": {"operationId": "hadis_events_list", "description": "", "parameters": [], "responses": {"200": {"description": ""}}, "tags": ["hadis"]}, "parameters": []}, "/hadis/interests-items/": {"get": {"operationId": "hadis_interests-items_list", "description": "", "parameters": [], "responses": {"200": {"description": "", "schema": {"type": "array", "items": {"$ref": "#/definitions/Interest"}}}}, "tags": ["hadis"]}, "parameters": []}, "/hadis/narrators/": {"get": {"operationId": "hadis_narrators_list", "description": "", "parameters": [{"name": "limit", "in": "query", "description": "Number of results to return per page.", "required": false, "type": "integer"}, {"name": "offset", "in": "query", "description": "The initial index from which to return the results.", "required": false, "type": "integer"}], "responses": {"200": {"description": "", "schema": {"required": ["count", "results"], "type": "object", "properties": {"count": {"type": "integer"}, "next": {"type": "string", "format": "uri", "x-nullable": true}, "previous": {"type": "string", "format": "uri", "x-nullable": true}, "results": {"type": "array", "items": {"$ref": "#/definitions/Narrator"}}}}}}, "tags": ["hadis"]}, "parameters": []}, "/hadis/narrators/{id}/": {"get": {"operationId": "hadis_narrators_read", "description": "", "parameters": [{"name": "limit", "in": "query", "description": "Number of results to return per page.", "required": false, "type": "integer"}, {"name": "offset", "in": "query", "description": "The initial index from which to return the results.", "required": false, "type": "integer"}], "responses": {"200": {"description": "", "schema": {"required": ["count", "results"], "type": "object", "properties": {"count": {"type": "integer"}, "next": {"type": "string", "format": "uri", "x-nullable": true}, "previous": {"type": "string", "format": "uri", "x-nullable": true}, "results": {"type": "array", "items": {"$ref": "#/definitions/Hadis"}}}}}}, "tags": ["hadis"]}, "parameters": [{"name": "id", "in": "path", "required": true, "type": "string"}]}, "/hadis/resources/": {"get": {"operationId": "hadis_resources_list", "description": "", "parameters": [{"name": "page", "in": "query", "description": "A page number within the paginated result set.", "required": false, "type": "integer"}], "responses": {"200": {"description": "", "schema": {"required": ["count", "results"], "type": "object", "properties": {"count": {"type": "integer"}, "next": {"type": "string", "format": "uri", "x-nullable": true}, "previous": {"type": "string", "format": "uri", "x-nullable": true}, "results": {"type": "array", "items": {"$ref": "#/definitions/Resources"}}}}}}, "tags": ["hadis"]}, "parameters": []}, "/hadis/search/{query}/": {"get": {"operationId": "hadis_search_read", "description": "", "parameters": [{"name": "limit", "in": "query", "description": "Number of results to return per page.", "required": false, "type": "integer"}, {"name": "offset", "in": "query", "description": "The initial index from which to return the results.", "required": false, "type": "integer"}], "responses": {"200": {"description": "", "schema": {"required": ["count", "results"], "type": "object", "properties": {"count": {"type": "integer"}, "next": {"type": "string", "format": "uri", "x-nullable": true}, "previous": {"type": "string", "format": "uri", "x-nullable": true}, "results": {"type": "array", "items": {"$ref": "#/definitions/Hadis"}}}}}}, "tags": ["hadis"]}, "parameters": [{"name": "query", "in": "path", "required": true, "type": "string"}]}, "/hadis/stats/": {"get": {"operationId": "hadis_stats_list", "description": "", "parameters": [], "responses": {"200": {"description": ""}}, "tags": ["hadis"]}, "parameters": []}, "/hadis/trends/": {"get": {"operationId": "hadis_trends_list", "description": "", "parameters": [{"name": "search", "in": "query", "description": "A search term.", "required": false, "type": "string"}, {"name": "limit", "in": "query", "description": "Number of results to return per page.", "required": false, "type": "integer"}, {"name": "offset", "in": "query", "description": "The initial index from which to return the results.", "required": false, "type": "integer"}], "responses": {"200": {"description": "", "schema": {"required": ["count", "results"], "type": "object", "properties": {"count": {"type": "integer"}, "next": {"type": "string", "format": "uri", "x-nullable": true}, "previous": {"type": "string", "format": "uri", "x-nullable": true}, "results": {"type": "array", "items": {"$ref": "#/definitions/Trend"}}}}}}, "tags": ["hadis"]}, "parameters": []}, "/hadis/trends/{trend}/": {"get": {"operationId": "hadis_trends_read", "description": "", "parameters": [{"name": "limit", "in": "query", "description": "Number of results to return per page.", "required": false, "type": "integer"}, {"name": "offset", "in": "query", "description": "The initial index from which to return the results.", "required": false, "type": "integer"}], "responses": {"200": {"description": "", "schema": {"required": ["count", "results"], "type": "object", "properties": {"count": {"type": "integer"}, "next": {"type": "string", "format": "uri", "x-nullable": true}, "previous": {"type": "string", "format": "uri", "x-nullable": true}, "results": {"type": "array", "items": {"$ref": "#/definitions/Hadis"}}}}}}, "tags": ["hadis"]}, "parameters": [{"name": "trend", "in": "path", "required": true, "type": "string"}]}, "/hadis/user-hadises/": {"get": {"operationId": "hadis_user-hadises_list", "description": "", "parameters": [{"name": "limit", "in": "query", "description": "Number of results to return per page.", "required": false, "type": "integer"}, {"name": "offset", "in": "query", "description": "The initial index from which to return the results.", "required": false, "type": "integer"}], "responses": {"200": {"description": "", "schema": {"required": ["count", "results"], "type": "object", "properties": {"count": {"type": "integer"}, "next": {"type": "string", "format": "uri", "x-nullable": true}, "previous": {"type": "string", "format": "uri", "x-nullable": true}, "results": {"type": "array", "items": {"$ref": "#/definitions/Hadis"}}}}}}, "tags": ["hadis"]}, "parameters": []}, "/hadis/user-interests/": {"get": {"operationId": "hadis_user-interests_read", "description": "", "parameters": [], "responses": {"200": {"description": "", "schema": {"$ref": "#/definitions/UserInterest"}}}, "tags": ["hadis"]}, "put": {"operationId": "hadis_user-interests_update", "description": "", "parameters": [{"name": "data", "in": "body", "required": true, "schema": {"$ref": "#/definitions/UserInterest"}}], "responses": {"200": {"description": "", "schema": {"$ref": "#/definitions/UserInterest"}}}, "tags": ["hadis"]}, "patch": {"operationId": "hadis_user-interests_partial_update", "description": "", "parameters": [{"name": "data", "in": "body", "required": true, "schema": {"$ref": "#/definitions/UserInterest"}}], "responses": {"200": {"description": "", "schema": {"$ref": "#/definitions/UserInterest"}}}, "tags": ["hadis"]}, "parameters": []}, "/hadis/v2/categories/": {"get": {"operationId": "hadis_v2_categories_list", "description": "", "parameters": [], "responses": {"200": {"description": ""}}, "tags": ["hadis"]}, "parameters": []}, "/hadis/v2/hadis/": {"get": {"operationId": "hadis_v2_hadis_list", "description": "", "parameters": [{"name": "limit", "in": "query", "description": "Number of results to return per page.", "required": false, "type": "integer"}, {"name": "offset", "in": "query", "description": "The initial index from which to return the results.", "required": false, "type": "integer"}], "responses": {"200": {"description": "", "schema": {"required": ["count", "results"], "type": "object", "properties": {"count": {"type": "integer"}, "next": {"type": "string", "format": "uri", "x-nullable": true}, "previous": {"type": "string", "format": "uri", "x-nullable": true}, "results": {"type": "array", "items": {"$ref": "#/definitions/HadisSerializerV2"}}}}}}, "tags": ["hadis"]}, "parameters": []}, "/hadis/v2/narrators/": {"get": {"operationId": "hadis_v2_narrators_list", "description": "", "parameters": [], "responses": {"200": {"description": "", "schema": {"type": "array", "items": {"$ref": "#/definitions/NarratorSerializerV2"}}}}, "tags": ["hadis"]}, "parameters": []}, "/hadis/v2/user-daily/": {"get": {"operationId": "hadis_v2_user-daily_list", "description": "", "parameters": [], "responses": {"200": {"description": ""}}, "tags": ["hadis"]}, "parameters": []}, "/hadis/v2/user-hadises/": {"get": {"operationId": "hadis_v2_user-hadises_list", "description": "", "parameters": [{"name": "limit", "in": "query", "description": "Number of results to return per page.", "required": false, "type": "integer"}, {"name": "offset", "in": "query", "description": "The initial index from which to return the results.", "required": false, "type": "integer"}], "responses": {"200": {"description": ""}}, "tags": ["hadis"]}, "parameters": []}, "/hadis/{id}/": {"get": {"operationId": "hadis_read", "description": "", "parameters": [], "responses": {"200": {"description": "", "schema": {"$ref": "#/definitions/Hadis"}}}, "tags": ["hadis"]}, "parameters": [{"name": "id", "in": "path", "description": "A unique integer value identifying this hadis.", "required": true, "type": "integer"}]}, "/hussainya/albums-search/": {"get": {"operationId": "hussainya_albums-search_list", "description": "", "parameters": [{"name": "limit", "in": "query", "description": "Number of results to return per page.", "required": false, "type": "integer"}, {"name": "offset", "in": "query", "description": "The initial index from which to return the results.", "required": false, "type": "integer"}, {"name": "language_code", "in": "query", "description": "Language Code", "type": "string"}, {"name": "s", "in": "query", "description": "Search term", "type": "string"}], "responses": {"200": {"description": "", "schema": {"type": "array", "items": {"$ref": "#/definitions/AlbumList"}}}}, "tags": ["hussainya"]}, "parameters": []}, "/hussainya/albums/": {"get": {"operationId": "hussainya_albums_list", "description": "", "parameters": [{"name": "limit", "in": "query", "description": "Number of results to return per page.", "required": false, "type": "integer"}, {"name": "offset", "in": "query", "description": "The initial index from which to return the results.", "required": false, "type": "integer"}, {"name": "topic_id", "in": "query", "description": "Filter by Topic ID", "type": "integer"}, {"name": "singer_slug", "in": "query", "description": "Filter by singer slug", "type": "string"}, {"name": "language_code", "in": "query", "description": "Language Code (e.g., en, fa, es)", "type": "string"}, {"name": "search", "in": "query", "description": "Search term", "type": "string"}], "responses": {"200": {"description": "", "schema": {"required": ["count", "results"], "type": "object", "properties": {"count": {"type": "integer"}, "next": {"type": "string", "format": "uri", "x-nullable": true}, "previous": {"type": "string", "format": "uri", "x-nullable": true}, "results": {"type": "array", "items": {"$ref": "#/definitions/AlbumList"}}}}}}, "tags": ["hussainya"]}, "parameters": []}, "/hussainya/albums//": {"get": {"operationId": "hussainya_albums_list", "description": "", "parameters": [{"name": "limit", "in": "query", "description": "Number of results to return per page.", "required": false, "type": "integer"}, {"name": "offset", "in": "query", "description": "The initial index from which to return the results.", "required": false, "type": "integer"}, {"name": "topic_id", "in": "query", "description": "Filter by Topic ID", "type": "integer"}, {"name": "singer_slug", "in": "query", "description": "Filter by singer slug", "type": "string"}, {"name": "language_code", "in": "query", "description": "Language Code (e.g., en, fa, es)", "type": "string"}, {"name": "search", "in": "query", "description": "Search term", "type": "string"}], "responses": {"200": {"description": "", "schema": {"required": ["count", "results"], "type": "object", "properties": {"count": {"type": "integer"}, "next": {"type": "string", "format": "uri", "x-nullable": true}, "previous": {"type": "string", "format": "uri", "x-nullable": true}, "results": {"type": "array", "items": {"$ref": "#/definitions/AlbumList"}}}}}}, "tags": ["hussainya"]}, "parameters": []}, "/hussainya/albums//{id}/": {"get": {"operationId": "hussainya_albums__read", "description": "", "parameters": [{"name": "limit", "in": "query", "description": "Number of results to return per page.", "required": false, "type": "integer"}, {"name": "offset", "in": "query", "description": "The initial index from which to return the results.", "required": false, "type": "integer"}], "responses": {"200": {"description": "", "schema": {"required": ["count", "results"], "type": "object", "properties": {"count": {"type": "integer"}, "next": {"type": "string", "format": "uri", "x-nullable": true}, "previous": {"type": "string", "format": "uri", "x-nullable": true}, "results": {"type": "array", "items": {"$ref": "#/definitions/SongsList"}}}}}}, "tags": ["hussainya"]}, "parameters": [{"name": "id", "in": "path", "required": true, "type": "string"}]}, "/hussainya/albums/{id}/": {"get": {"operationId": "hussainya_albums_read", "description": "", "parameters": [{"name": "limit", "in": "query", "description": "Number of results to return per page.", "required": false, "type": "integer"}, {"name": "offset", "in": "query", "description": "The initial index from which to return the results.", "required": false, "type": "integer"}], "responses": {"200": {"description": "", "schema": {"required": ["count", "results"], "type": "object", "properties": {"count": {"type": "integer"}, "next": {"type": "string", "format": "uri", "x-nullable": true}, "previous": {"type": "string", "format": "uri", "x-nullable": true}, "results": {"type": "array", "items": {"$ref": "#/definitions/SongsList"}}}}}}, "tags": ["hussainya"]}, "parameters": [{"name": "id", "in": "path", "required": true, "type": "string"}]}, "/hussainya/albums/{id}/details/": {"get": {"operationId": "hussainya_albums_details_read", "description": "", "parameters": [], "responses": {"200": {"description": "", "schema": {"$ref": "#/definitions/AlbumList"}}}, "tags": ["hussainya"]}, "parameters": [{"name": "id", "in": "path", "required": true, "type": "string"}]}, "/hussainya/collections/": {"get": {"operationId": "hussainya_collections_list", "description": "", "parameters": [{"name": "limit", "in": "query", "description": "Number of results to return per page.", "required": false, "type": "integer"}, {"name": "offset", "in": "query", "description": "The initial index from which to return the results.", "required": false, "type": "integer"}, {"name": "language_code", "in": "query", "description": "Language Code", "type": "string"}], "responses": {"200": {"description": "", "schema": {"required": ["count", "results"], "type": "object", "properties": {"count": {"type": "integer"}, "next": {"type": "string", "format": "uri", "x-nullable": true}, "previous": {"type": "string", "format": "uri", "x-nullable": true}, "results": {"type": "array", "items": {"$ref": "#/definitions/CollectionList"}}}}}}, "tags": ["hussainya"]}, "parameters": []}, "/hussainya/collections//": {"get": {"operationId": "hussainya_collections_list", "description": "", "parameters": [{"name": "limit", "in": "query", "description": "Number of results to return per page.", "required": false, "type": "integer"}, {"name": "offset", "in": "query", "description": "The initial index from which to return the results.", "required": false, "type": "integer"}, {"name": "language_code", "in": "query", "description": "Language Code", "type": "string"}], "responses": {"200": {"description": "", "schema": {"required": ["count", "results"], "type": "object", "properties": {"count": {"type": "integer"}, "next": {"type": "string", "format": "uri", "x-nullable": true}, "previous": {"type": "string", "format": "uri", "x-nullable": true}, "results": {"type": "array", "items": {"$ref": "#/definitions/CollectionList"}}}}}}, "tags": ["hussainya"]}, "parameters": []}, "/hussainya/collections//{id}/": {"get": {"operationId": "hussainya_collections__read", "description": "", "parameters": [], "responses": {"200": {"description": "", "schema": {"$ref": "#/definitions/CollectionDetail"}}}, "tags": ["hussainya"]}, "parameters": [{"name": "id", "in": "path", "required": true, "type": "string"}]}, "/hussainya/collections/{id}/": {"get": {"operationId": "hussainya_collections_read", "description": "", "parameters": [], "responses": {"200": {"description": "", "schema": {"$ref": "#/definitions/CollectionDetail"}}}, "tags": ["hussainya"]}, "parameters": [{"name": "id", "in": "path", "required": true, "type": "string"}]}, "/hussainya/dashboard/albums/": {"get": {"operationId": "hussainya_dashboard_albums_list", "summary": "GET — لیست البوم‌ها با فیلترها\nPOST — ایجاد البوم جدید", "description": "Query params (GET):\n search جستجو در translations (icontains)\n status active | draft\n language_code کدهای زبان جداشده با کاما (fa,ar)\n order hijri → مرتب‌سازی بر اساس نزدیکیِ تاریخ قمری (get_albums_by_hijri_date)؛\n در غیر این صورت ترتیب پیش‌فرض (پین‌شده‌ها، سپس جدیدترین ساخت)\n page / page_size", "parameters": [{"name": "page", "in": "query", "description": "A page number within the paginated result set.", "required": false, "type": "integer"}, {"name": "page_size", "in": "query", "description": "Number of results to return per page.", "required": false, "type": "integer"}], "responses": {"200": {"description": "", "schema": {"required": ["count", "results"], "type": "object", "properties": {"count": {"type": "integer"}, "next": {"type": "string", "format": "uri", "x-nullable": true}, "previous": {"type": "string", "format": "uri", "x-nullable": true}, "results": {"type": "array", "items": {"$ref": "#/definitions/DashboardAlbumRow"}}}}}}, "tags": ["hussainya"]}, "post": {"operationId": "hussainya_dashboard_albums_create", "summary": "GET — لیست البوم‌ها با فیلترها\nPOST — ایجاد البوم جدید", "description": "Query params (GET):\n search جستجو در translations (icontains)\n status active | draft\n language_code کدهای زبان جداشده با کاما (fa,ar)\n order hijri → مرتب‌سازی بر اساس نزدیکیِ تاریخ قمری (get_albums_by_hijri_date)؛\n در غیر این صورت ترتیب پیش‌فرض (پین‌شده‌ها، سپس جدیدترین ساخت)\n page / page_size", "parameters": [{"name": "data", "in": "body", "required": true, "schema": {"$ref": "#/definitions/DashboardAlbumInput"}}], "responses": {"201": {"description": "", "schema": {"$ref": "#/definitions/DashboardAlbumInput"}}}, "tags": ["hussainya"]}, "parameters": []}, "/hussainya/dashboard/albums/{id}/": {"get": {"operationId": "hussainya_dashboard_albums_read", "description": "GET /hussainya/dashboard/albums//\nPATCH /hussainya/dashboard/albums//\nDELETE /hussainya/dashboard/albums//", "parameters": [], "responses": {"200": {"description": "", "schema": {"$ref": "#/definitions/DashboardAlbumRow"}}}, "tags": ["hussainya"]}, "patch": {"operationId": "hussainya_dashboard_albums_partial_update", "description": "GET /hussainya/dashboard/albums//\nPATCH /hussainya/dashboard/albums//\nDELETE /hussainya/dashboard/albums//", "parameters": [{"name": "data", "in": "body", "required": true, "schema": {"$ref": "#/definitions/DashboardAlbumInput"}}], "responses": {"200": {"description": "", "schema": {"$ref": "#/definitions/DashboardAlbumInput"}}}, "tags": ["hussainya"]}, "delete": {"operationId": "hussainya_dashboard_albums_delete", "description": "GET /hussainya/dashboard/albums//\nPATCH /hussainya/dashboard/albums//\nDELETE /hussainya/dashboard/albums//", "parameters": [], "responses": {"204": {"description": ""}}, "tags": ["hussainya"]}, "parameters": [{"name": "id", "in": "path", "required": true, "type": "string"}]}, "/hussainya/dashboard/autocomplete/albums/": {"get": {"operationId": "hussainya_dashboard_autocomplete_albums_list", "description": "GET /hussainya/dashboard/autocomplete/albums/", "parameters": [{"name": "page", "in": "query", "description": "A page number within the paginated result set.", "required": false, "type": "integer"}, {"name": "page_size", "in": "query", "description": "Number of results to return per page.", "required": false, "type": "integer"}], "responses": {"200": {"description": "", "schema": {"required": ["count", "results"], "type": "object", "properties": {"count": {"type": "integer"}, "next": {"type": "string", "format": "uri", "x-nullable": true}, "previous": {"type": "string", "format": "uri", "x-nullable": true}, "results": {"type": "array", "items": {"$ref": "#/definitions/_AlbumAutocomplete"}}}}}}, "tags": ["hussainya"]}, "parameters": []}, "/hussainya/dashboard/autocomplete/genres/": {"get": {"operationId": "hussainya_dashboard_autocomplete_genres_list", "description": "GET /hussainya/dashboard/autocomplete/genres/", "parameters": [{"name": "page", "in": "query", "description": "A page number within the paginated result set.", "required": false, "type": "integer"}, {"name": "page_size", "in": "query", "description": "Number of results to return per page.", "required": false, "type": "integer"}], "responses": {"200": {"description": "", "schema": {"required": ["count", "results"], "type": "object", "properties": {"count": {"type": "integer"}, "next": {"type": "string", "format": "uri", "x-nullable": true}, "previous": {"type": "string", "format": "uri", "x-nullable": true}, "results": {"type": "array", "items": {"$ref": "#/definitions/_GenreAutocomplete"}}}}}}, "tags": ["hussainya"]}, "parameters": []}, "/hussainya/dashboard/autocomplete/publishers/": {"get": {"operationId": "hussainya_dashboard_autocomplete_publishers_list", "description": "GET /hussainya/dashboard/autocomplete/publishers/", "parameters": [{"name": "page", "in": "query", "description": "A page number within the paginated result set.", "required": false, "type": "integer"}, {"name": "page_size", "in": "query", "description": "Number of results to return per page.", "required": false, "type": "integer"}], "responses": {"200": {"description": "", "schema": {"required": ["count", "results"], "type": "object", "properties": {"count": {"type": "integer"}, "next": {"type": "string", "format": "uri", "x-nullable": true}, "previous": {"type": "string", "format": "uri", "x-nullable": true}, "results": {"type": "array", "items": {"$ref": "#/definitions/_PublisherAutocomplete"}}}}}}, "tags": ["hussainya"]}, "parameters": []}, "/hussainya/dashboard/autocomplete/singers/": {"get": {"operationId": "hussainya_dashboard_autocomplete_singers_list", "summary": "GET /hussainya/dashboard/autocomplete/singers/", "description": "Query params اضافه:\n singer_type madah | lecturer (پیش‌فرض: همه)", "parameters": [{"name": "page", "in": "query", "description": "A page number within the paginated result set.", "required": false, "type": "integer"}, {"name": "page_size", "in": "query", "description": "Number of results to return per page.", "required": false, "type": "integer"}], "responses": {"200": {"description": "", "schema": {"required": ["count", "results"], "type": "object", "properties": {"count": {"type": "integer"}, "next": {"type": "string", "format": "uri", "x-nullable": true}, "previous": {"type": "string", "format": "uri", "x-nullable": true}, "results": {"type": "array", "items": {"$ref": "#/definitions/_SingerAutocomplete"}}}}}}, "tags": ["hussainya"]}, "parameters": []}, "/hussainya/dashboard/autocomplete/songs/": {"get": {"operationId": "hussainya_dashboard_autocomplete_songs_list", "summary": "GET /hussainya/dashboard/autocomplete/songs/", "description": "پیکرِ آهنگِ فرم «بفرمایید روضه» — جستجوی صفحه‌بندی‌شده در عنوان/اسلاگ.", "parameters": [{"name": "page", "in": "query", "description": "A page number within the paginated result set.", "required": false, "type": "integer"}, {"name": "page_size", "in": "query", "description": "Number of results to return per page.", "required": false, "type": "integer"}], "responses": {"200": {"description": "", "schema": {"required": ["count", "results"], "type": "object", "properties": {"count": {"type": "integer"}, "next": {"type": "string", "format": "uri", "x-nullable": true}, "previous": {"type": "string", "format": "uri", "x-nullable": true}, "results": {"type": "array", "items": {"$ref": "#/definitions/_SongAutocomplete"}}}}}}, "tags": ["hussainya"]}, "parameters": []}, "/hussainya/dashboard/autocomplete/tags/": {"get": {"operationId": "hussainya_dashboard_autocomplete_tags_list", "description": "GET /hussainya/dashboard/autocomplete/tags/", "parameters": [{"name": "page", "in": "query", "description": "A page number within the paginated result set.", "required": false, "type": "integer"}, {"name": "page_size", "in": "query", "description": "Number of results to return per page.", "required": false, "type": "integer"}], "responses": {"200": {"description": "", "schema": {"required": ["count", "results"], "type": "object", "properties": {"count": {"type": "integer"}, "next": {"type": "string", "format": "uri", "x-nullable": true}, "previous": {"type": "string", "format": "uri", "x-nullable": true}, "results": {"type": "array", "items": {"$ref": "#/definitions/_TagAutocomplete"}}}}}}, "tags": ["hussainya"]}, "parameters": []}, "/hussainya/dashboard/collections/": {"get": {"operationId": "hussainya_dashboard_collections_list", "summary": "GET — لیست مجموعه‌ها با فیلترها\nPOST — ایجاد مجموعهٔ جدید", "description": "Query params (GET):\n search جستجو در title (JSONField icontains)\n status active | draft\n pin_to_top pinned | unpinned\n page / page_size\n\nترتیب: pin_to_top اول، سپس بقیه بر اساس نزدیکیِ تاریخ قمری به امروز.\nget_collections_by_hijri_date یک list برمی‌گرداند؛ DashboardPageNumberPagination\nبا list هم کار می‌کند (عیناً مثل البوم‌ها).", "parameters": [{"name": "page", "in": "query", "description": "A page number within the paginated result set.", "required": false, "type": "integer"}, {"name": "page_size", "in": "query", "description": "Number of results to return per page.", "required": false, "type": "integer"}], "responses": {"200": {"description": "", "schema": {"required": ["count", "results"], "type": "object", "properties": {"count": {"type": "integer"}, "next": {"type": "string", "format": "uri", "x-nullable": true}, "previous": {"type": "string", "format": "uri", "x-nullable": true}, "results": {"type": "array", "items": {"$ref": "#/definitions/DashboardCollectionRow"}}}}}}, "tags": ["hussainya"]}, "post": {"operationId": "hussainya_dashboard_collections_create", "summary": "GET — لیست مجموعه‌ها با فیلترها\nPOST — ایجاد مجموعهٔ جدید", "description": "Query params (GET):\n search جستجو در title (JSONField icontains)\n status active | draft\n pin_to_top pinned | unpinned\n page / page_size\n\nترتیب: pin_to_top اول، سپس بقیه بر اساس نزدیکیِ تاریخ قمری به امروز.\nget_collections_by_hijri_date یک list برمی‌گرداند؛ DashboardPageNumberPagination\nبا list هم کار می‌کند (عیناً مثل البوم‌ها).", "parameters": [{"name": "data", "in": "body", "required": true, "schema": {"$ref": "#/definitions/DashboardCollectionInput"}}], "responses": {"201": {"description": "", "schema": {"$ref": "#/definitions/DashboardCollectionInput"}}}, "tags": ["hussainya"]}, "parameters": []}, "/hussainya/dashboard/collections/{id}/": {"get": {"operationId": "hussainya_dashboard_collections_read", "description": "GET /hussainya/dashboard/collections//\nPATCH /hussainya/dashboard/collections//\nDELETE /hussainya/dashboard/collections//", "parameters": [], "responses": {"200": {"description": "", "schema": {"$ref": "#/definitions/DashboardCollectionRow"}}}, "tags": ["hussainya"]}, "patch": {"operationId": "hussainya_dashboard_collections_partial_update", "description": "GET /hussainya/dashboard/collections//\nPATCH /hussainya/dashboard/collections//\nDELETE /hussainya/dashboard/collections//", "parameters": [{"name": "data", "in": "body", "required": true, "schema": {"$ref": "#/definitions/DashboardCollectionInput"}}], "responses": {"200": {"description": "", "schema": {"$ref": "#/definitions/DashboardCollectionInput"}}}, "tags": ["hussainya"]}, "delete": {"operationId": "hussainya_dashboard_collections_delete", "description": "GET /hussainya/dashboard/collections//\nPATCH /hussainya/dashboard/collections//\nDELETE /hussainya/dashboard/collections//", "parameters": [], "responses": {"204": {"description": ""}}, "tags": ["hussainya"]}, "parameters": [{"name": "id", "in": "path", "required": true, "type": "string"}]}, "/hussainya/dashboard/collections/{id}/songs/": {"get": {"operationId": "hussainya_dashboard_collections_songs_list", "summary": "GET /hussainya/dashboard/collections//songs/?page=&page_size=", "description": "آهنگ‌های متصل به یک مجموعه — به ترتیب ordering آهنگ و id نزولی.", "parameters": [{"name": "page", "in": "query", "description": "A page number within the paginated result set.", "required": false, "type": "integer"}, {"name": "page_size", "in": "query", "description": "Number of results to return per page.", "required": false, "type": "integer"}], "responses": {"200": {"description": "", "schema": {"required": ["count", "results"], "type": "object", "properties": {"count": {"type": "integer"}, "next": {"type": "string", "format": "uri", "x-nullable": true}, "previous": {"type": "string", "format": "uri", "x-nullable": true}, "results": {"type": "array", "items": {"$ref": "#/definitions/SongsList"}}}}}}, "tags": ["hussainya"]}, "parameters": [{"name": "id", "in": "path", "required": true, "type": "string"}]}, "/hussainya/dashboard/discover/": {"post": {"operationId": "hussainya_dashboard_discover_create", "description": "On-demand discovery of a YouTube channel/page into ImportItems.", "parameters": [], "responses": {"201": {"description": ""}}, "tags": ["hussainya"]}, "parameters": []}, "/hussainya/dashboard/genres/": {"get": {"operationId": "hussainya_dashboard_genres_list", "summary": "GET — لیست ژانرها با فیلترها\nPOST — ایجاد ژانر جدید", "description": "Query params (GET):\n search جستجو در title/slug (icontains)\n limit / offset", "parameters": [{"name": "page", "in": "query", "description": "A page number within the paginated result set.", "required": false, "type": "integer"}, {"name": "page_size", "in": "query", "description": "Number of results to return per page.", "required": false, "type": "integer"}], "responses": {"200": {"description": "", "schema": {"required": ["count", "results"], "type": "object", "properties": {"count": {"type": "integer"}, "next": {"type": "string", "format": "uri", "x-nullable": true}, "previous": {"type": "string", "format": "uri", "x-nullable": true}, "results": {"type": "array", "items": {"$ref": "#/definitions/DashboardGenreRow"}}}}}}, "tags": ["hussainya"]}, "post": {"operationId": "hussainya_dashboard_genres_create", "summary": "GET — لیست ژانرها با فیلترها\nPOST — ایجاد ژانر جدید", "description": "Query params (GET):\n search جستجو در title/slug (icontains)\n limit / offset", "parameters": [{"name": "data", "in": "body", "required": true, "schema": {"$ref": "#/definitions/DashboardGenreInput"}}], "responses": {"201": {"description": "", "schema": {"$ref": "#/definitions/DashboardGenreInput"}}}, "tags": ["hussainya"]}, "parameters": []}, "/hussainya/dashboard/genres/{id}/": {"get": {"operationId": "hussainya_dashboard_genres_read", "description": "GET /hussainya/dashboard/genres//\nPATCH /hussainya/dashboard/genres//\nDELETE /hussainya/dashboard/genres//", "parameters": [], "responses": {"200": {"description": "", "schema": {"$ref": "#/definitions/DashboardGenreRow"}}}, "tags": ["hussainya"]}, "patch": {"operationId": "hussainya_dashboard_genres_partial_update", "description": "GET /hussainya/dashboard/genres//\nPATCH /hussainya/dashboard/genres//\nDELETE /hussainya/dashboard/genres//", "parameters": [{"name": "data", "in": "body", "required": true, "schema": {"$ref": "#/definitions/DashboardGenreInput"}}], "responses": {"200": {"description": "", "schema": {"$ref": "#/definitions/DashboardGenreInput"}}}, "tags": ["hussainya"]}, "delete": {"operationId": "hussainya_dashboard_genres_delete", "description": "GET /hussainya/dashboard/genres//\nPATCH /hussainya/dashboard/genres//\nDELETE /hussainya/dashboard/genres//", "parameters": [], "responses": {"204": {"description": ""}}, "tags": ["hussainya"]}, "parameters": [{"name": "id", "in": "path", "required": true, "type": "string"}]}, "/hussainya/dashboard/home/albums/": {"get": {"operationId": "hussainya_dashboard_home_albums_list", "description": "GET /hussainya/dashboard/home/albums/?language_code=fa,ar", "parameters": [], "responses": {"200": {"description": ""}}, "tags": ["hussainya"]}, "parameters": []}, "/hussainya/dashboard/home/lives/": {"get": {"operationId": "hussainya_dashboard_home_lives_list", "description": "GET /hussainya/dashboard/home/lives/?language_code=fa,ar", "parameters": [], "responses": {"200": {"description": ""}}, "tags": ["hussainya"]}, "parameters": []}, "/hussainya/dashboard/home/maddahs/": {"get": {"operationId": "hussainya_dashboard_home_maddahs_list", "description": "GET /hussainya/dashboard/home/maddahs/?language_code=fa,ar&page=N&page_size=M", "parameters": [{"name": "page", "in": "query", "description": "A page number within the paginated result set.", "required": false, "type": "integer"}, {"name": "page_size", "in": "query", "description": "Number of results to return per page.", "required": false, "type": "integer"}], "responses": {"200": {"description": "", "schema": {"required": ["count", "results"], "type": "object", "properties": {"count": {"type": "integer"}, "next": {"type": "string", "format": "uri", "x-nullable": true}, "previous": {"type": "string", "format": "uri", "x-nullable": true}, "results": {"type": "array", "items": {"$ref": "#/definitions/SingersList"}}}}}}, "tags": ["hussainya"]}, "parameters": []}, "/hussainya/dashboard/home/popular/": {"get": {"operationId": "hussainya_dashboard_home_popular_list", "summary": "GET /hussainya/dashboard/home/popular/?language_code=fa,ar&page=N&page_size=M", "description": "محبوب‌ترین آهنگ‌ها برای گریدِ داشبورد، صفحه‌بندی‌شده (infinite scroll).\nAdmin-only؛ از ``language_code`` (تک‌زبانه یا کاما-سپریت) پشتیبانی می‌کند.", "parameters": [{"name": "page", "in": "query", "description": "A page number within the paginated result set.", "required": false, "type": "integer"}, {"name": "page_size", "in": "query", "description": "Number of results to return per page.", "required": false, "type": "integer"}], "responses": {"200": {"description": "", "schema": {"required": ["count", "results"], "type": "object", "properties": {"count": {"type": "integer"}, "next": {"type": "string", "format": "uri", "x-nullable": true}, "previous": {"type": "string", "format": "uri", "x-nullable": true}, "results": {"type": "array", "items": {"$ref": "#/definitions/SongsList"}}}}}}, "tags": ["hussainya"]}, "parameters": []}, "/hussainya/dashboard/home/speakers/": {"get": {"operationId": "hussainya_dashboard_home_speakers_list", "description": "GET /hussainya/dashboard/home/speakers/?language_code=fa,ar&page=N&page_size=M", "parameters": [{"name": "page", "in": "query", "description": "A page number within the paginated result set.", "required": false, "type": "integer"}, {"name": "page_size", "in": "query", "description": "Number of results to return per page.", "required": false, "type": "integer"}], "responses": {"200": {"description": "", "schema": {"required": ["count", "results"], "type": "object", "properties": {"count": {"type": "integer"}, "next": {"type": "string", "format": "uri", "x-nullable": true}, "previous": {"type": "string", "format": "uri", "x-nullable": true}, "results": {"type": "array", "items": {"$ref": "#/definitions/SingersList"}}}}}}, "tags": ["hussainya"]}, "parameters": []}, "/hussainya/dashboard/import-items/": {"get": {"operationId": "hussainya_dashboard_import-items_list", "description": "GET صف importها با فیلتر؛ POST ثبت لینک مستقیم و dispatch دریافت متادیتا.", "parameters": [{"name": "page", "in": "query", "description": "A page number within the paginated result set.", "required": false, "type": "integer"}, {"name": "page_size", "in": "query", "description": "Number of results to return per page.", "required": false, "type": "integer"}], "responses": {"200": {"description": "", "schema": {"required": ["count", "results"], "type": "object", "properties": {"count": {"type": "integer"}, "next": {"type": "string", "format": "uri", "x-nullable": true}, "previous": {"type": "string", "format": "uri", "x-nullable": true}, "results": {"type": "array", "items": {"$ref": "#/definitions/ImportItemRow"}}}}}}, "tags": ["hussainya"]}, "post": {"operationId": "hussainya_dashboard_import-items_create", "description": "GET صف importها با فیلتر؛ POST ثبت لینک مستقیم و dispatch دریافت متادیتا.", "parameters": [{"name": "data", "in": "body", "required": true, "schema": {"$ref": "#/definitions/ImportItemCreate"}}], "responses": {"201": {"description": "", "schema": {"$ref": "#/definitions/ImportItemCreate"}}}, "tags": ["hussainya"]}, "parameters": []}, "/hussainya/dashboard/import-items/{id}/": {"get": {"operationId": "hussainya_dashboard_import-items_read", "description": "GET جزئیات؛ PATCH اصلاح متادیتای AI؛ DELETE حذف.", "parameters": [], "responses": {"200": {"description": "", "schema": {"$ref": "#/definitions/ImportItemDetail"}}}, "tags": ["hussainya"]}, "patch": {"operationId": "hussainya_dashboard_import-items_partial_update", "description": "GET جزئیات؛ PATCH اصلاح متادیتای AI؛ DELETE حذف.", "parameters": [{"name": "data", "in": "body", "required": true, "schema": {"$ref": "#/definitions/ImportItemMetadata"}}], "responses": {"200": {"description": "", "schema": {"$ref": "#/definitions/ImportItemMetadata"}}}, "tags": ["hussainya"]}, "delete": {"operationId": "hussainya_dashboard_import-items_delete", "description": "GET جزئیات؛ PATCH اصلاح متادیتای AI؛ DELETE حذف.", "parameters": [], "responses": {"204": {"description": ""}}, "tags": ["hussainya"]}, "parameters": [{"name": "id", "in": "path", "description": "A unique integer value identifying this import item.", "required": true, "type": "integer"}]}, "/hussainya/dashboard/import-items/{id}/cancel/": {"post": {"operationId": "hussainya_dashboard_import-items_cancel_create", "description": "Cancel an item so it is excluded from the active queue.", "parameters": [], "responses": {"201": {"description": ""}}, "tags": ["hussainya"]}, "parameters": [{"name": "id", "in": "path", "required": true, "type": "string"}]}, "/hussainya/dashboard/import-items/{id}/publish/": {"post": {"operationId": "hussainya_dashboard_import-items_publish_create", "description": "Manual publish — used for channel/scheduled items after admin approval.", "parameters": [], "responses": {"201": {"description": ""}}, "tags": ["hussainya"]}, "parameters": [{"name": "id", "in": "path", "required": true, "type": "string"}]}, "/hussainya/dashboard/import-items/{id}/retry/": {"post": {"operationId": "hussainya_dashboard_import-items_retry_create", "description": "Re-dispatch metadata fetch for a failed/stuck item.", "parameters": [], "responses": {"201": {"description": ""}}, "tags": ["hussainya"]}, "parameters": [{"name": "id", "in": "path", "required": true, "type": "string"}]}, "/hussainya/dashboard/import-jobs/": {"post": {"operationId": "hussainya_dashboard_import-jobs_create", "summary": "Batch link submission from the dashboard ``Add links`` panel.", "description": "Direct links create one ImportItem each (carrying the admin's manual\nmetadata + locked fields) and dispatch metadata fetch; channel/page links\nkick off discovery. Detection falls back to the server when source/kind is\nnot supplied by the client.", "parameters": [], "responses": {"201": {"description": ""}}, "tags": ["hussainya"]}, "parameters": []}, "/hussainya/dashboard/please/": {"get": {"operationId": "hussainya_dashboard_please_list", "summary": "GET — لیست روضه‌ها با فیلترها\nPOST — ایجاد روضهٔ جدید", "description": "Query params (GET):\n search جستجو در translations/live_title (icontains)\n status active | draft\n pin_to_top pinned | unpinned\n page / page_size", "parameters": [{"name": "page", "in": "query", "description": "A page number within the paginated result set.", "required": false, "type": "integer"}, {"name": "page_size", "in": "query", "description": "Number of results to return per page.", "required": false, "type": "integer"}], "responses": {"200": {"description": "", "schema": {"required": ["count", "results"], "type": "object", "properties": {"count": {"type": "integer"}, "next": {"type": "string", "format": "uri", "x-nullable": true}, "previous": {"type": "string", "format": "uri", "x-nullable": true}, "results": {"type": "array", "items": {"$ref": "#/definitions/DashboardPleaseRow"}}}}}}, "tags": ["hussainya"]}, "post": {"operationId": "hussainya_dashboard_please_create", "summary": "GET — لیست روضه‌ها با فیلترها\nPOST — ایجاد روضهٔ جدید", "description": "Query params (GET):\n search جستجو در translations/live_title (icontains)\n status active | draft\n pin_to_top pinned | unpinned\n page / page_size", "parameters": [{"name": "data", "in": "body", "required": true, "schema": {"$ref": "#/definitions/DashboardPleaseInput"}}], "responses": {"201": {"description": "", "schema": {"$ref": "#/definitions/DashboardPleaseInput"}}}, "tags": ["hussainya"]}, "parameters": []}, "/hussainya/dashboard/please/{id}/": {"get": {"operationId": "hussainya_dashboard_please_read", "description": "GET /hussainya/dashboard/please//\nPATCH /hussainya/dashboard/please//\nDELETE /hussainya/dashboard/please//", "parameters": [], "responses": {"200": {"description": "", "schema": {"$ref": "#/definitions/DashboardPleaseRow"}}}, "tags": ["hussainya"]}, "patch": {"operationId": "hussainya_dashboard_please_partial_update", "description": "GET /hussainya/dashboard/please//\nPATCH /hussainya/dashboard/please//\nDELETE /hussainya/dashboard/please//", "parameters": [{"name": "data", "in": "body", "required": true, "schema": {"$ref": "#/definitions/DashboardPleaseInput"}}], "responses": {"200": {"description": "", "schema": {"$ref": "#/definitions/DashboardPleaseInput"}}}, "tags": ["hussainya"]}, "delete": {"operationId": "hussainya_dashboard_please_delete", "description": "GET /hussainya/dashboard/please//\nPATCH /hussainya/dashboard/please//\nDELETE /hussainya/dashboard/please//", "parameters": [], "responses": {"204": {"description": ""}}, "tags": ["hussainya"]}, "parameters": [{"name": "id", "in": "path", "required": true, "type": "string"}]}, "/hussainya/dashboard/please/{id}/songs/": {"get": {"operationId": "hussainya_dashboard_please_songs_list", "summary": "GET /hussainya/dashboard/please//songs/?page=&page_size=", "description": "آهنگ‌های متصل به یک روضه — به ترتیب priority و در شکل پخش‌پذیر\n(`SongsListSerializer`، همان شکل آهنگ‌های پنل آلبوم) برای پنل جزئیات.", "parameters": [{"name": "page", "in": "query", "description": "A page number within the paginated result set.", "required": false, "type": "integer"}, {"name": "page_size", "in": "query", "description": "Number of results to return per page.", "required": false, "type": "integer"}], "responses": {"200": {"description": "", "schema": {"required": ["count", "results"], "type": "object", "properties": {"count": {"type": "integer"}, "next": {"type": "string", "format": "uri", "x-nullable": true}, "previous": {"type": "string", "format": "uri", "x-nullable": true}, "results": {"type": "array", "items": {"$ref": "#/definitions/SongsList"}}}}}}, "tags": ["hussainya"]}, "parameters": [{"name": "id", "in": "path", "required": true, "type": "string"}]}, "/hussainya/dashboard/publishers/": {"get": {"operationId": "hussainya_dashboard_publishers_list", "summary": "GET — لیست ناشران با فیلترها\nPOST — ایجاد ناشر جدید", "description": "Query params (GET):\n search جستجو در name (icontains)\n type YT | IT | WS | TG | AP\n language_code کدهای زبان جداشده با کاما (fa,ar)\n page / page_size", "parameters": [{"name": "page", "in": "query", "description": "A page number within the paginated result set.", "required": false, "type": "integer"}, {"name": "page_size", "in": "query", "description": "Number of results to return per page.", "required": false, "type": "integer"}], "responses": {"200": {"description": "", "schema": {"required": ["count", "results"], "type": "object", "properties": {"count": {"type": "integer"}, "next": {"type": "string", "format": "uri", "x-nullable": true}, "previous": {"type": "string", "format": "uri", "x-nullable": true}, "results": {"type": "array", "items": {"$ref": "#/definitions/DashboardPublisherRow"}}}}}}, "tags": ["hussainya"]}, "post": {"operationId": "hussainya_dashboard_publishers_create", "summary": "GET — لیست ناشران با فیلترها\nPOST — ایجاد ناشر جدید", "description": "Query params (GET):\n search جستجو در name (icontains)\n type YT | IT | WS | TG | AP\n language_code کدهای زبان جداشده با کاما (fa,ar)\n page / page_size", "parameters": [{"name": "data", "in": "body", "required": true, "schema": {"$ref": "#/definitions/DashboardPublisherInput"}}], "responses": {"201": {"description": "", "schema": {"$ref": "#/definitions/DashboardPublisherInput"}}}, "tags": ["hussainya"]}, "parameters": []}, "/hussainya/dashboard/publishers/{id}/": {"get": {"operationId": "hussainya_dashboard_publishers_read", "description": "GET /hussainya/dashboard/publishers//\nPATCH /hussainya/dashboard/publishers//\nDELETE /hussainya/dashboard/publishers//", "parameters": [], "responses": {"200": {"description": "", "schema": {"$ref": "#/definitions/DashboardPublisherRow"}}}, "tags": ["hussainya"]}, "patch": {"operationId": "hussainya_dashboard_publishers_partial_update", "description": "GET /hussainya/dashboard/publishers//\nPATCH /hussainya/dashboard/publishers//\nDELETE /hussainya/dashboard/publishers//", "parameters": [{"name": "data", "in": "body", "required": true, "schema": {"$ref": "#/definitions/DashboardPublisherInput"}}], "responses": {"200": {"description": "", "schema": {"$ref": "#/definitions/DashboardPublisherInput"}}}, "tags": ["hussainya"]}, "delete": {"operationId": "hussainya_dashboard_publishers_delete", "description": "GET /hussainya/dashboard/publishers//\nPATCH /hussainya/dashboard/publishers//\nDELETE /hussainya/dashboard/publishers//", "parameters": [], "responses": {"204": {"description": ""}}, "tags": ["hussainya"]}, "parameters": [{"name": "id", "in": "path", "required": true, "type": "string"}]}, "/hussainya/dashboard/runs/": {"get": {"operationId": "hussainya_dashboard_runs_list", "description": "History of discovery runs.", "parameters": [{"name": "page", "in": "query", "description": "A page number within the paginated result set.", "required": false, "type": "integer"}, {"name": "page_size", "in": "query", "description": "Number of results to return per page.", "required": false, "type": "integer"}], "responses": {"200": {"description": "", "schema": {"required": ["count", "results"], "type": "object", "properties": {"count": {"type": "integer"}, "next": {"type": "string", "format": "uri", "x-nullable": true}, "previous": {"type": "string", "format": "uri", "x-nullable": true}, "results": {"type": "array", "items": {"$ref": "#/definitions/ImportRunRow"}}}}}}, "tags": ["hussainya"]}, "parameters": []}, "/hussainya/dashboard/search/": {"get": {"operationId": "hussainya_dashboard_search_list", "description": "GET /hussainya/dashboard/search/?q=&types=&limit=", "parameters": [], "responses": {"200": {"description": ""}}, "tags": ["hussainya"]}, "parameters": []}, "/hussainya/dashboard/singers/": {"get": {"operationId": "hussainya_dashboard_singers_list", "summary": "Management list + create for dashboard maddahs/speakers.", "description": "GET /hussainya/dashboard/singers/ → لیست با فیلترها\nPOST /hussainya/dashboard/singers/ → ایجاد مداح/سخنران جدید\n\nQuery params (GET):\n - singer_type: all | madah | lecturer\n - status: all | active | draft\n - language_code: comma-separated language codes, e.g. fa,ar\n - search: text matched against translations JSON\n - page / page_size", "parameters": [{"name": "page", "in": "query", "description": "A page number within the paginated result set.", "required": false, "type": "integer"}, {"name": "page_size", "in": "query", "description": "Number of results to return per page.", "required": false, "type": "integer"}], "responses": {"200": {"description": "", "schema": {"required": ["count", "results"], "type": "object", "properties": {"count": {"type": "integer"}, "next": {"type": "string", "format": "uri", "x-nullable": true}, "previous": {"type": "string", "format": "uri", "x-nullable": true}, "results": {"type": "array", "items": {"$ref": "#/definitions/DashboardSinger"}}}}}}, "tags": ["hussainya"]}, "post": {"operationId": "hussainya_dashboard_singers_create", "summary": "Management list + create for dashboard maddahs/speakers.", "description": "GET /hussainya/dashboard/singers/ → لیست با فیلترها\nPOST /hussainya/dashboard/singers/ → ایجاد مداح/سخنران جدید\n\nQuery params (GET):\n - singer_type: all | madah | lecturer\n - status: all | active | draft\n - language_code: comma-separated language codes, e.g. fa,ar\n - search: text matched against translations JSON\n - page / page_size", "parameters": [{"name": "data", "in": "body", "required": true, "schema": {"$ref": "#/definitions/DashboardSingerInput"}}], "responses": {"201": {"description": "", "schema": {"$ref": "#/definitions/DashboardSingerInput"}}}, "tags": ["hussainya"]}, "parameters": []}, "/hussainya/dashboard/singers/{identifier}/": {"get": {"operationId": "hussainya_dashboard_singers_read", "summary": "Detail / update / delete for one dashboard singer/provider.", "description": "GET /hussainya/dashboard/singers//\nPATCH /hussainya/dashboard/singers//\nDELETE /hussainya/dashboard/singers//", "parameters": [], "responses": {"200": {"description": "", "schema": {"$ref": "#/definitions/DashboardSinger"}}}, "tags": ["hussainya"]}, "patch": {"operationId": "hussainya_dashboard_singers_partial_update", "summary": "Detail / update / delete for one dashboard singer/provider.", "description": "GET /hussainya/dashboard/singers//\nPATCH /hussainya/dashboard/singers//\nDELETE /hussainya/dashboard/singers//", "parameters": [{"name": "data", "in": "body", "required": true, "schema": {"$ref": "#/definitions/DashboardSingerInput"}}], "responses": {"200": {"description": "", "schema": {"$ref": "#/definitions/DashboardSingerInput"}}}, "tags": ["hussainya"]}, "delete": {"operationId": "hussainya_dashboard_singers_delete", "summary": "Detail / update / delete for one dashboard singer/provider.", "description": "GET /hussainya/dashboard/singers//\nPATCH /hussainya/dashboard/singers//\nDELETE /hussainya/dashboard/singers//", "parameters": [], "responses": {"204": {"description": ""}}, "tags": ["hussainya"]}, "parameters": [{"name": "identifier", "in": "path", "required": true, "type": "string"}]}, "/hussainya/dashboard/songs/": {"get": {"operationId": "hussainya_dashboard_songs_list", "summary": "GET — لیست آهنگ‌ها با فیلترها\nPOST — ایجاد آهنگ جدید", "description": "Query params (GET):\n search جستجو در عنوان (JSONField)\n genre id ژانر\n song_type audio | video | youtube\n singers idهای خواننده، جداشده با کاما (فیلتر دقیق)\n status active | draft\n singer_type madah | lecturer (فیلتر از طریق سینگرها)\n language_code کد زبان با کاما (fa,ar)\n page / page_size", "parameters": [{"name": "page", "in": "query", "description": "A page number within the paginated result set.", "required": false, "type": "integer"}, {"name": "page_size", "in": "query", "description": "Number of results to return per page.", "required": false, "type": "integer"}], "responses": {"200": {"description": "", "schema": {"required": ["count", "results"], "type": "object", "properties": {"count": {"type": "integer"}, "next": {"type": "string", "format": "uri", "x-nullable": true}, "previous": {"type": "string", "format": "uri", "x-nullable": true}, "results": {"type": "array", "items": {"$ref": "#/definitions/DashboardSongRow"}}}}}}, "tags": ["hussainya"]}, "post": {"operationId": "hussainya_dashboard_songs_create", "summary": "GET — لیست آهنگ‌ها با فیلترها\nPOST — ایجاد آهنگ جدید", "description": "Query params (GET):\n search جستجو در عنوان (JSONField)\n genre id ژانر\n song_type audio | video | youtube\n singers idهای خواننده، جداشده با کاما (فیلتر دقیق)\n status active | draft\n singer_type madah | lecturer (فیلتر از طریق سینگرها)\n language_code کد زبان با کاما (fa,ar)\n page / page_size", "parameters": [{"name": "data", "in": "body", "required": true, "schema": {"$ref": "#/definitions/DashboardSongInput"}}], "responses": {"201": {"description": "", "schema": {"$ref": "#/definitions/DashboardSongInput"}}}, "tags": ["hussainya"]}, "parameters": []}, "/hussainya/dashboard/songs/{identifier}/": {"get": {"operationId": "hussainya_dashboard_songs_read", "description": "GET /hussainya/dashboard/songs//\nPATCH /hussainya/dashboard/songs//\nDELETE /hussainya/dashboard/songs//\n\nشناسه می‌تواند id عددی (از جدول مدیریت) یا slug (از کارت‌های صفحهٔ خانه/جستجو)\nباشد؛ هم‌رفتار با DashboardSingerDetailView. این‌طور پنل آهنگ همیشه با یک API\nواحد دیتای کامل (تصویر + فایل) را می‌گیرد، چه از جدول باز شود چه از خانه.", "parameters": [], "responses": {"200": {"description": "", "schema": {"$ref": "#/definitions/DashboardSongRow"}}}, "tags": ["hussainya"]}, "patch": {"operationId": "hussainya_dashboard_songs_partial_update", "description": "GET /hussainya/dashboard/songs//\nPATCH /hussainya/dashboard/songs//\nDELETE /hussainya/dashboard/songs//\n\nشناسه می‌تواند id عددی (از جدول مدیریت) یا slug (از کارت‌های صفحهٔ خانه/جستجو)\nباشد؛ هم‌رفتار با DashboardSingerDetailView. این‌طور پنل آهنگ همیشه با یک API\nواحد دیتای کامل (تصویر + فایل) را می‌گیرد، چه از جدول باز شود چه از خانه.", "parameters": [{"name": "data", "in": "body", "required": true, "schema": {"$ref": "#/definitions/DashboardSongInput"}}], "responses": {"200": {"description": "", "schema": {"$ref": "#/definitions/DashboardSongInput"}}}, "tags": ["hussainya"]}, "delete": {"operationId": "hussainya_dashboard_songs_delete", "description": "GET /hussainya/dashboard/songs//\nPATCH /hussainya/dashboard/songs//\nDELETE /hussainya/dashboard/songs//\n\nشناسه می‌تواند id عددی (از جدول مدیریت) یا slug (از کارت‌های صفحهٔ خانه/جستجو)\nباشد؛ هم‌رفتار با DashboardSingerDetailView. این‌طور پنل آهنگ همیشه با یک API\nواحد دیتای کامل (تصویر + فایل) را می‌گیرد، چه از جدول باز شود چه از خانه.", "parameters": [], "responses": {"204": {"description": ""}}, "tags": ["hussainya"]}, "parameters": [{"name": "identifier", "in": "path", "required": true, "type": "string"}]}, "/hussainya/dashboard/source-tasks/": {"get": {"operationId": "hussainya_dashboard_source-tasks_list", "description": "CRUD list/create for periodic channel watchers.", "parameters": [{"name": "page", "in": "query", "description": "A page number within the paginated result set.", "required": false, "type": "integer"}, {"name": "page_size", "in": "query", "description": "Number of results to return per page.", "required": false, "type": "integer"}], "responses": {"200": {"description": "", "schema": {"required": ["count", "results"], "type": "object", "properties": {"count": {"type": "integer"}, "next": {"type": "string", "format": "uri", "x-nullable": true}, "previous": {"type": "string", "format": "uri", "x-nullable": true}, "results": {"type": "array", "items": {"$ref": "#/definitions/ImportSourceTaskRow"}}}}}}, "tags": ["hussainya"]}, "post": {"operationId": "hussainya_dashboard_source-tasks_create", "description": "CRUD list/create for periodic channel watchers.", "parameters": [{"name": "data", "in": "body", "required": true, "schema": {"$ref": "#/definitions/ImportSourceTaskInput"}}], "responses": {"201": {"description": "", "schema": {"$ref": "#/definitions/ImportSourceTaskInput"}}}, "tags": ["hussainya"]}, "parameters": []}, "/hussainya/dashboard/source-tasks/{id}/": {"get": {"operationId": "hussainya_dashboard_source-tasks_read", "description": "", "parameters": [], "responses": {"200": {"description": "", "schema": {"$ref": "#/definitions/ImportSourceTaskRow"}}}, "tags": ["hussainya"]}, "patch": {"operationId": "hussainya_dashboard_source-tasks_partial_update", "description": "", "parameters": [{"name": "data", "in": "body", "required": true, "schema": {"$ref": "#/definitions/ImportSourceTaskInput"}}], "responses": {"200": {"description": "", "schema": {"$ref": "#/definitions/ImportSourceTaskInput"}}}, "tags": ["hussainya"]}, "delete": {"operationId": "hussainya_dashboard_source-tasks_delete", "description": "", "parameters": [], "responses": {"204": {"description": ""}}, "tags": ["hussainya"]}, "parameters": [{"name": "id", "in": "path", "description": "A unique integer value identifying this import source task.", "required": true, "type": "integer"}]}, "/hussainya/dashboard/source-tasks/{id}/run-now/": {"post": {"operationId": "hussainya_dashboard_source-tasks_run-now_create", "description": "Trigger a periodic task's discovery immediately (admin 'run now').", "parameters": [], "responses": {"201": {"description": ""}}, "tags": ["hussainya"]}, "parameters": [{"name": "id", "in": "path", "required": true, "type": "string"}]}, "/hussainya/dashboard/tags/": {"get": {"operationId": "hussainya_dashboard_tags_list", "summary": "GET — لیست تگ‌ها با فیلترها\nPOST — ایجاد تگ جدید", "description": "Query params (GET):\n search جستجو در title/translations\n page / page_size", "parameters": [{"name": "page", "in": "query", "description": "A page number within the paginated result set.", "required": false, "type": "integer"}, {"name": "page_size", "in": "query", "description": "Number of results to return per page.", "required": false, "type": "integer"}], "responses": {"200": {"description": "", "schema": {"required": ["count", "results"], "type": "object", "properties": {"count": {"type": "integer"}, "next": {"type": "string", "format": "uri", "x-nullable": true}, "previous": {"type": "string", "format": "uri", "x-nullable": true}, "results": {"type": "array", "items": {"$ref": "#/definitions/DashboardTagRow"}}}}}}, "tags": ["hussainya"]}, "post": {"operationId": "hussainya_dashboard_tags_create", "summary": "GET — لیست تگ‌ها با فیلترها\nPOST — ایجاد تگ جدید", "description": "Query params (GET):\n search جستجو در title/translations\n page / page_size", "parameters": [{"name": "data", "in": "body", "required": true, "schema": {"$ref": "#/definitions/DashboardTagInput"}}], "responses": {"201": {"description": "", "schema": {"$ref": "#/definitions/DashboardTagInput"}}}, "tags": ["hussainya"]}, "parameters": []}, "/hussainya/dashboard/tags/{id}/": {"get": {"operationId": "hussainya_dashboard_tags_read", "description": "GET /hussainya/dashboard/tags//\nPATCH /hussainya/dashboard/tags//\nDELETE /hussainya/dashboard/tags//", "parameters": [], "responses": {"200": {"description": "", "schema": {"$ref": "#/definitions/DashboardTagRow"}}}, "tags": ["hussainya"]}, "patch": {"operationId": "hussainya_dashboard_tags_partial_update", "description": "GET /hussainya/dashboard/tags//\nPATCH /hussainya/dashboard/tags//\nDELETE /hussainya/dashboard/tags//", "parameters": [{"name": "data", "in": "body", "required": true, "schema": {"$ref": "#/definitions/DashboardTagInput"}}], "responses": {"200": {"description": "", "schema": {"$ref": "#/definitions/DashboardTagInput"}}}, "tags": ["hussainya"]}, "delete": {"operationId": "hussainya_dashboard_tags_delete", "description": "GET /hussainya/dashboard/tags//\nPATCH /hussainya/dashboard/tags//\nDELETE /hussainya/dashboard/tags//", "parameters": [], "responses": {"204": {"description": ""}}, "tags": ["hussainya"]}, "parameters": [{"name": "id", "in": "path", "required": true, "type": "string"}]}, "/hussainya/dashboard/upload-media/": {"post": {"operationId": "hussainya_dashboard_upload-media_create", "description": "آپلود فایل موقت برای فرم‌های داشبورد — admin-only.", "parameters": [{"name": "file", "in": "formData", "required": true, "type": "file"}], "responses": {"201": {"description": "", "schema": {"$ref": "#/definitions/_Upload"}}}, "consumes": ["multipart/form-data", "application/x-www-form-urlencoded"], "tags": ["hussainya"]}, "parameters": []}, "/hussainya/genre-list/": {"get": {"operationId": "hussainya_genre-list_list", "description": "", "parameters": [], "responses": {"200": {"description": ""}}, "tags": ["hussainya"]}, "parameters": []}, "/hussainya/get-youtube-info/": {"post": {"operationId": "hussainya_get-youtube-info_create", "description": "", "parameters": [{"name": "data", "in": "body", "required": true, "schema": {"type": "object", "properties": {"youtube_link": {"type": "string"}}}}], "responses": {"200": {"description": "", "schema": {"$ref": "#/definitions/YoutubeInfo"}}}, "tags": ["hussainya"]}, "parameters": []}, "/hussainya/lives/": {"get": {"operationId": "hussainya_lives_list", "description": "", "parameters": [{"name": "limit", "in": "query", "description": "Number of results to return per page.", "required": false, "type": "integer"}, {"name": "offset", "in": "query", "description": "The initial index from which to return the results.", "required": false, "type": "integer"}, {"name": "language_code", "in": "query", "description": "Language Code", "type": "string"}], "responses": {"200": {"description": "", "schema": {"required": ["count", "results"], "type": "object", "properties": {"count": {"type": "integer"}, "next": {"type": "string", "format": "uri", "x-nullable": true}, "previous": {"type": "string", "format": "uri", "x-nullable": true}, "results": {"type": "array", "items": {"$ref": "#/definitions/ShrineLive"}}}}}}, "tags": ["hussainya"]}, "parameters": []}, "/hussainya/playlist/": {"get": {"operationId": "hussainya_playlist_list", "description": "", "parameters": [{"name": "limit", "in": "query", "description": "Number of results to return per page.", "required": false, "type": "integer"}, {"name": "offset", "in": "query", "description": "The initial index from which to return the results.", "required": false, "type": "integer"}], "responses": {"200": {"description": "", "schema": {"required": ["count", "results"], "type": "object", "properties": {"count": {"type": "integer"}, "next": {"type": "string", "format": "uri", "x-nullable": true}, "previous": {"type": "string", "format": "uri", "x-nullable": true}, "results": {"type": "array", "items": {"$ref": "#/definitions/SongsList"}}}}}}, "tags": ["hussainya"]}, "parameters": []}, "/hussainya/playlist//": {"get": {"operationId": "hussainya_playlist_list", "description": "", "parameters": [{"name": "limit", "in": "query", "description": "Number of results to return per page.", "required": false, "type": "integer"}, {"name": "offset", "in": "query", "description": "The initial index from which to return the results.", "required": false, "type": "integer"}], "responses": {"200": {"description": "", "schema": {"required": ["count", "results"], "type": "object", "properties": {"count": {"type": "integer"}, "next": {"type": "string", "format": "uri", "x-nullable": true}, "previous": {"type": "string", "format": "uri", "x-nullable": true}, "results": {"type": "array", "items": {"$ref": "#/definitions/SongsList"}}}}}}, "tags": ["hussainya"]}, "parameters": []}, "/hussainya/provider/profile/": {"post": {"operationId": "hussainya_provider_profile_create", "description": "", "parameters": [{"name": "data", "in": "body", "required": true, "schema": {"$ref": "#/definitions/HussainiyaProviderProfileSerializer"}}], "responses": {"201": {"description": "", "schema": {"$ref": "#/definitions/HussainiyaProviderProfileSerializer"}}}, "tags": ["hussainya"]}, "parameters": []}, "/hussainya/provider/songs/": {"get": {"operationId": "hussainya_provider_songs_list", "description": "", "parameters": [{"name": "limit", "in": "query", "description": "Number of results to return per page.", "required": false, "type": "integer"}, {"name": "offset", "in": "query", "description": "The initial index from which to return the results.", "required": false, "type": "integer"}], "responses": {"200": {"description": "", "schema": {"required": ["count", "results"], "type": "object", "properties": {"count": {"type": "integer"}, "next": {"type": "string", "format": "uri", "x-nullable": true}, "previous": {"type": "string", "format": "uri", "x-nullable": true}, "results": {"type": "array", "items": {"$ref": "#/definitions/SongsList"}}}}}}, "tags": ["hussainya"]}, "parameters": []}, "/hussainya/provider/songs/create/": {"post": {"operationId": "hussainya_provider_songs_create_create", "description": "", "parameters": [{"name": "data", "in": "body", "required": true, "schema": {"$ref": "#/definitions/CreateSong"}}], "responses": {"201": {"description": "", "schema": {"$ref": "#/definitions/CreateSong"}}}, "tags": ["hussainya"]}, "parameters": []}, "/hussainya/provider/songs/{slug}/": {"put": {"operationId": "hussainya_provider_songs_update", "description": "", "parameters": [{"name": "data", "in": "body", "required": true, "schema": {"$ref": "#/definitions/UpdateSong"}}], "responses": {"200": {"description": "", "schema": {"$ref": "#/definitions/UpdateSong"}}}, "tags": ["hussainya"]}, "patch": {"operationId": "hussainya_provider_songs_partial_update", "description": "", "parameters": [{"name": "data", "in": "body", "required": true, "schema": {"$ref": "#/definitions/UpdateSong"}}], "responses": {"200": {"description": "", "schema": {"$ref": "#/definitions/UpdateSong"}}}, "tags": ["hussainya"]}, "delete": {"operationId": "hussainya_provider_songs_delete", "description": "", "parameters": [], "responses": {"204": {"description": ""}}, "tags": ["hussainya"]}, "parameters": [{"name": "slug", "in": "path", "required": true, "type": "string"}]}, "/hussainya/publishers/": {"get": {"operationId": "hussainya_publishers_list", "description": "", "parameters": [{"name": "search", "in": "query", "description": "A search term.", "required": false, "type": "string"}, {"name": "limit", "in": "query", "description": "Number of results to return per page.", "required": false, "type": "integer"}, {"name": "offset", "in": "query", "description": "The initial index from which to return the results.", "required": false, "type": "integer"}], "responses": {"200": {"description": "", "schema": {"required": ["count", "results"], "type": "object", "properties": {"count": {"type": "integer"}, "next": {"type": "string", "format": "uri", "x-nullable": true}, "previous": {"type": "string", "format": "uri", "x-nullable": true}, "results": {"type": "array", "items": {"$ref": "#/definitions/Publisher"}}}}}}, "tags": ["hussainya"]}, "parameters": []}, "/hussainya/publishers//": {"get": {"operationId": "hussainya_publishers_list", "description": "", "parameters": [{"name": "search", "in": "query", "description": "A search term.", "required": false, "type": "string"}, {"name": "limit", "in": "query", "description": "Number of results to return per page.", "required": false, "type": "integer"}, {"name": "offset", "in": "query", "description": "The initial index from which to return the results.", "required": false, "type": "integer"}], "responses": {"200": {"description": "", "schema": {"required": ["count", "results"], "type": "object", "properties": {"count": {"type": "integer"}, "next": {"type": "string", "format": "uri", "x-nullable": true}, "previous": {"type": "string", "format": "uri", "x-nullable": true}, "results": {"type": "array", "items": {"$ref": "#/definitions/Publisher"}}}}}}, "tags": ["hussainya"]}, "parameters": []}, "/hussainya/publishers//{id}/": {"get": {"operationId": "hussainya_publishers__read", "description": "", "parameters": [{"name": "search", "in": "query", "description": "A search term.", "required": false, "type": "string"}, {"name": "limit", "in": "query", "description": "Number of results to return per page.", "required": false, "type": "integer"}, {"name": "offset", "in": "query", "description": "The initial index from which to return the results.", "required": false, "type": "integer"}, {"name": "ordering", "in": "query", "description": "Order fields by (created_at, -created_at (desc) | view_count, like_count, published_date", "type": "string", "enum": ["like_counts", "-like_counts", "view_count", "-view_count", "created_at", "-created_at", "published_date", "-published_date"]}, {"name": "song_type", "in": "query", "description": "Filter by song type (audio, video, youtube)", "type": "string", "enum": ["audio", "video", "youtube"]}, {"name": "genre_id", "in": "query", "description": "Filter genre_id ['1-(مداحی)', '2-(سخنرانی)', '3-(سخنرانی کوتاه)', '4-(مولودی)', '5-(ادعیه)', '6-(مناجات)', '7-(مقتل)', '8-(روضه)']]", "type": "string"}, {"name": "random", "in": "query", "description": "Filter Random Palyer", "type": "boolean"}], "responses": {"200": {"description": "", "schema": {"required": ["count", "results"], "type": "object", "properties": {"count": {"type": "integer"}, "next": {"type": "string", "format": "uri", "x-nullable": true}, "previous": {"type": "string", "format": "uri", "x-nullable": true}, "results": {"type": "array", "items": {"$ref": "#/definitions/SongsList"}}}}}}, "tags": ["hussainya"]}, "parameters": [{"name": "id", "in": "path", "required": true, "type": "string"}]}, "/hussainya/publishers/{id}/": {"get": {"operationId": "hussainya_publishers_read", "description": "", "parameters": [{"name": "search", "in": "query", "description": "A search term.", "required": false, "type": "string"}, {"name": "limit", "in": "query", "description": "Number of results to return per page.", "required": false, "type": "integer"}, {"name": "offset", "in": "query", "description": "The initial index from which to return the results.", "required": false, "type": "integer"}, {"name": "ordering", "in": "query", "description": "Order fields by (created_at, -created_at (desc) | view_count, like_count, published_date", "type": "string", "enum": ["like_counts", "-like_counts", "view_count", "-view_count", "created_at", "-created_at", "published_date", "-published_date"]}, {"name": "song_type", "in": "query", "description": "Filter by song type (audio, video, youtube)", "type": "string", "enum": ["audio", "video", "youtube"]}, {"name": "genre_id", "in": "query", "description": "Filter genre_id ['1-(مداحی)', '2-(سخنرانی)', '3-(سخنرانی کوتاه)', '4-(مولودی)', '5-(ادعیه)', '6-(مناجات)', '7-(مقتل)', '8-(روضه)']]", "type": "string"}, {"name": "random", "in": "query", "description": "Filter Random Palyer", "type": "boolean"}], "responses": {"200": {"description": "", "schema": {"required": ["count", "results"], "type": "object", "properties": {"count": {"type": "integer"}, "next": {"type": "string", "format": "uri", "x-nullable": true}, "previous": {"type": "string", "format": "uri", "x-nullable": true}, "results": {"type": "array", "items": {"$ref": "#/definitions/SongsList"}}}}}}, "tags": ["hussainya"]}, "parameters": [{"name": "id", "in": "path", "required": true, "type": "string"}]}, "/hussainya/pwa/collections/": {"get": {"operationId": "hussainya_pwa_collections_list", "summary": "Unified collection list for the PWA home (``pwa/collections``).", "description": "Returns one flat list where the **user's own** collections\n(``PlaylistCollection``) come first, followed by the **public**\ncollections (``Collection``). The response shape is identical for both\nsources — ``{id, title, songs}`` — with no ``type`` field.", "parameters": [], "responses": {"200": {"description": ""}}, "tags": ["hussainya"]}, "parameters": []}, "/hussainya/pwa/home/": {"get": {"operationId": "hussainya_pwa_home_list", "summary": "PWA home — the same payload as ``HomePageV3`` but only the\nmadah / lecturer / event sections.", "description": "These three sections carry no per-user data (the singer/album serializers\nhave no ``is_liked``/``is_playlist`` fields), so the payload is fully\nshareable. It is cached per language under its own key and served without\nthe per-user ``personalize`` step.\n\nEach section also exposes a stable ``key`` alongside the (translated)\n``title`` so the client can identify sections without depending on the\nlocalized title string.", "parameters": [], "responses": {"200": {"description": ""}}, "tags": ["hussainya"]}, "parameters": []}, "/hussainya/pwa/playlist/collections/": {"get": {"operationId": "hussainya_pwa_playlist_collections_list", "summary": "Collection list for the PWA **playlist tab** (``pwa/playlist/collections``).", "description": "Differs from ``PWACollectionsView`` (home) in three ways:\n * **lightweight** — metadata only, no embedded songs, so it is cheap and\n paginated;\n * **keeps empty collections** — a freshly created user collection with no\n songs must still appear;\n * **paginated** — ``DashboardPageNumberPagination`` (``page``/``page_size``).", "parameters": [{"name": "page", "in": "query", "description": "A page number within the paginated result set.", "required": false, "type": "integer"}, {"name": "page_size", "in": "query", "description": "Number of results to return per page.", "required": false, "type": "integer"}], "responses": {"200": {"description": "", "schema": {"required": ["count", "results"], "type": "object", "properties": {"count": {"type": "integer"}, "next": {"type": "string", "format": "uri", "x-nullable": true}, "previous": {"type": "string", "format": "uri", "x-nullable": true}, "results": {"type": "array", "items": {"$ref": "#/definitions/PlaylistTabCollection"}}}}}}, "tags": ["hussainya"]}, "parameters": []}, "/hussainya/pwa/playlist/collections/{cid}/songs/": {"get": {"operationId": "hussainya_pwa_playlist_collections_songs_list", "summary": "Songs of a single playlist-tab collection — unified across both sources.", "description": "The ``cid`` path arg is the **prefixed** id used everywhere in the PWA:\n * ``u`` → user collection (``PlaylistCollection`` via ``Playlist``);\n * ``p`` → public collection (``Collection.get_songs``).\n\nBoth branches are language-ordered (same priority as the home popular row),\nannotated with per-user ``is_liked``, prefetched against N+1, paginated, and\nserialized with ``SongsListSerializer``. An empty collection returns an empty\npage (200), never 404.", "parameters": [{"name": "page", "in": "query", "description": "A page number within the paginated result set.", "required": false, "type": "integer"}, {"name": "page_size", "in": "query", "description": "Number of results to return per page.", "required": false, "type": "integer"}], "responses": {"200": {"description": "", "schema": {"required": ["count", "results"], "type": "object", "properties": {"count": {"type": "integer"}, "next": {"type": "string", "format": "uri", "x-nullable": true}, "previous": {"type": "string", "format": "uri", "x-nullable": true}, "results": {"type": "array", "items": {"$ref": "#/definitions/SongsList"}}}}}}, "tags": ["hussainya"]}, "parameters": [{"name": "cid", "in": "path", "required": true, "type": "string"}]}, "/hussainya/singers-search/": {"get": {"operationId": "hussainya_singers-search_list", "description": "", "parameters": [{"name": "s", "in": "query", "description": "Search", "type": "string"}, {"name": "language_code", "in": "query", "description": "Language Code", "type": "string"}], "responses": {"200": {"description": ""}}, "tags": ["hussainya"]}, "parameters": []}, "/hussainya/singers/": {"get": {"operationId": "hussainya_singers_list", "description": "Advanced Singer List API with PostgreSQL-optimized search functionality", "parameters": [{"name": "limit", "in": "query", "description": "Number of results to return per page.", "required": false, "type": "integer"}, {"name": "offset", "in": "query", "description": "The initial index from which to return the results.", "required": false, "type": "integer"}, {"name": "language_code", "in": "query", "description": "Language Code (e.g., en, fa, es)", "type": "string"}, {"name": "singer_type", "in": "query", "description": "Singer Type", "type": "string", "enum": ["lecturer", "madah", "singer"]}, {"name": "search", "in": "query", "description": "Search term", "type": "string"}, {"name": "album_id", "in": "query", "description": "Album ID", "type": "integer"}], "responses": {"200": {"description": "", "schema": {"required": ["count", "results"], "type": "object", "properties": {"count": {"type": "integer"}, "next": {"type": "string", "format": "uri", "x-nullable": true}, "previous": {"type": "string", "format": "uri", "x-nullable": true}, "results": {"type": "array", "items": {"$ref": "#/definitions/SingersList"}}}}}}, "tags": ["hussainya"]}, "parameters": []}, "/hussainya/singers//": {"get": {"operationId": "hussainya_singers_list", "description": "Advanced Singer List API with PostgreSQL-optimized search functionality", "parameters": [{"name": "limit", "in": "query", "description": "Number of results to return per page.", "required": false, "type": "integer"}, {"name": "offset", "in": "query", "description": "The initial index from which to return the results.", "required": false, "type": "integer"}, {"name": "language_code", "in": "query", "description": "Language Code (e.g., en, fa, es)", "type": "string"}, {"name": "singer_type", "in": "query", "description": "Singer Type", "type": "string", "enum": ["lecturer", "madah", "singer"]}, {"name": "search", "in": "query", "description": "Search term", "type": "string"}, {"name": "album_id", "in": "query", "description": "Album ID", "type": "integer"}], "responses": {"200": {"description": "", "schema": {"required": ["count", "results"], "type": "object", "properties": {"count": {"type": "integer"}, "next": {"type": "string", "format": "uri", "x-nullable": true}, "previous": {"type": "string", "format": "uri", "x-nullable": true}, "results": {"type": "array", "items": {"$ref": "#/definitions/SingersList"}}}}}}, "tags": ["hussainya"]}, "parameters": []}, "/hussainya/singers//{slug}/": {"get": {"operationId": "hussainya_singers__read", "description": "", "parameters": [], "responses": {"200": {"description": "", "schema": {"$ref": "#/definitions/SingerSong"}}}, "tags": ["hussainya"]}, "parameters": [{"name": "slug", "in": "path", "required": true, "type": "string"}]}, "/hussainya/singers/{slug}/": {"get": {"operationId": "hussainya_singers_read", "description": "", "parameters": [], "responses": {"200": {"description": "", "schema": {"$ref": "#/definitions/SingerSong"}}}, "tags": ["hussainya"]}, "parameters": [{"name": "slug", "in": "path", "required": true, "type": "string"}]}, "/hussainya/songs/": {"get": {"operationId": "hussainya_songs_list", "description": "ordering : ('like_count', 'view_count','created_at', 'published_date')", "parameters": [{"name": "song_type", "in": "query", "description": "Filter by song type (audio, video, youtube)", "type": "string", "enum": ["audio", "video", "youtube"]}, {"name": "search", "in": "query", "description": "A search term.", "required": false, "type": "string"}, {"name": "limit", "in": "query", "description": "Number of results to return per page.", "required": false, "type": "integer"}, {"name": "offset", "in": "query", "description": "The initial index from which to return the results.", "required": false, "type": "integer"}, {"name": "ordering", "in": "query", "description": "Order fields by (created_at, -created_at (desc) | view_count, like_count, published_date", "type": "string", "enum": ["like_counts", "-like_counts", "view_count", "-view_count", "created_at", "-created_at", "published_date", "-published_date"]}, {"name": "genre_id", "in": "query", "description": "Filter genre_id ['1-(مداحی)', '2-(سخنرانی)', '3-(سخنرانی کوتاه)', '4-(مولودی)', '5-(ادعیه)', '6-(مناجات)', '7-(مقتل)', '8-(روضه)']]", "type": "string"}, {"name": "random", "in": "query", "description": "Filter Random Palyer", "type": "boolean"}], "responses": {"200": {"description": "", "schema": {"required": ["count", "results"], "type": "object", "properties": {"count": {"type": "integer"}, "next": {"type": "string", "format": "uri", "x-nullable": true}, "previous": {"type": "string", "format": "uri", "x-nullable": true}, "results": {"type": "array", "items": {"$ref": "#/definitions/SongsList"}}}}}}, "tags": ["hussainya"]}, "parameters": []}, "/hussainya/songs//": {"get": {"operationId": "hussainya_songs_list", "description": "ordering : ('like_count', 'view_count','created_at', 'published_date')", "parameters": [{"name": "song_type", "in": "query", "description": "Filter by song type (audio, video, youtube)", "type": "string", "enum": ["audio", "video", "youtube"]}, {"name": "search", "in": "query", "description": "A search term.", "required": false, "type": "string"}, {"name": "limit", "in": "query", "description": "Number of results to return per page.", "required": false, "type": "integer"}, {"name": "offset", "in": "query", "description": "The initial index from which to return the results.", "required": false, "type": "integer"}, {"name": "ordering", "in": "query", "description": "Order fields by (created_at, -created_at (desc) | view_count, like_count, published_date", "type": "string", "enum": ["like_counts", "-like_counts", "view_count", "-view_count", "created_at", "-created_at", "published_date", "-published_date"]}, {"name": "genre_id", "in": "query", "description": "Filter genre_id ['1-(مداحی)', '2-(سخنرانی)', '3-(سخنرانی کوتاه)', '4-(مولودی)', '5-(ادعیه)', '6-(مناجات)', '7-(مقتل)', '8-(روضه)']]", "type": "string"}, {"name": "random", "in": "query", "description": "Filter Random Palyer", "type": "boolean"}], "responses": {"200": {"description": "", "schema": {"required": ["count", "results"], "type": "object", "properties": {"count": {"type": "integer"}, "next": {"type": "string", "format": "uri", "x-nullable": true}, "previous": {"type": "string", "format": "uri", "x-nullable": true}, "results": {"type": "array", "items": {"$ref": "#/definitions/SongsList"}}}}}}, "tags": ["hussainya"]}, "parameters": []}, "/hussainya/songs//download/{slug}/": {"get": {"operationId": "hussainya_songs__download_read", "description": "", "parameters": [], "responses": {"200": {"description": ""}}, "tags": ["hussainya"]}, "parameters": [{"name": "slug", "in": "path", "required": true, "type": "string"}]}, "/hussainya/songs//increase-view/{slug}/": {"get": {"operationId": "hussainya_songs__increase-view_read", "description": "", "parameters": [], "responses": {"200": {"description": ""}}, "tags": ["hussainya"]}, "parameters": [{"name": "slug", "in": "path", "required": true, "type": "string"}]}, "/hussainya/songs//like/{slug}/": {"get": {"operationId": "hussainya_songs__like_read", "description": "", "parameters": [], "responses": {"200": {"description": ""}}, "tags": ["hussainya"]}, "parameters": [{"name": "slug", "in": "path", "required": true, "type": "string"}]}, "/hussainya/songs//unlike/{slug}/": {"get": {"operationId": "hussainya_songs__unlike_read", "description": "", "parameters": [], "responses": {"200": {"description": ""}}, "tags": ["hussainya"]}, "parameters": [{"name": "slug", "in": "path", "required": true, "type": "string"}]}, "/hussainya/songs//{slug}/": {"get": {"operationId": "hussainya_songs__read", "description": "song details api\n-- params: song slug", "parameters": [], "responses": {"200": {"description": "", "schema": {"$ref": "#/definitions/SongDetail"}}}, "tags": ["hussainya"]}, "parameters": [{"name": "slug", "in": "path", "required": true, "type": "string"}]}, "/hussainya/songs/add-to-playlist/{slug}/": {"get": {"operationId": "hussainya_songs_add-to-playlist_read", "description": "", "parameters": [], "responses": {"200": {"description": ""}}, "tags": ["hussainya"]}, "parameters": [{"name": "slug", "in": "path", "required": true, "type": "string"}]}, "/hussainya/songs/download/{slug}/": {"get": {"operationId": "hussainya_songs_download_read", "description": "", "parameters": [], "responses": {"200": {"description": ""}}, "tags": ["hussainya"]}, "parameters": [{"name": "slug", "in": "path", "required": true, "type": "string"}]}, "/hussainya/songs/increase-view/{slug}/": {"get": {"operationId": "hussainya_songs_increase-view_read", "description": "", "parameters": [], "responses": {"200": {"description": ""}}, "tags": ["hussainya"]}, "parameters": [{"name": "slug", "in": "path", "required": true, "type": "string"}]}, "/hussainya/songs/like/{slug}/": {"get": {"operationId": "hussainya_songs_like_read", "description": "", "parameters": [], "responses": {"200": {"description": ""}}, "tags": ["hussainya"]}, "parameters": [{"name": "slug", "in": "path", "required": true, "type": "string"}]}, "/hussainya/songs/recent/": {"get": {"operationId": "hussainya_songs_recent_list", "description": "", "parameters": [{"name": "limit", "in": "query", "description": "Number of results to return per page.", "required": false, "type": "integer"}, {"name": "offset", "in": "query", "description": "The initial index from which to return the results.", "required": false, "type": "integer"}, {"name": "days", "in": "query", "description": "Number of days to filter recent songs", "type": "integer", "default": 60}], "responses": {"200": {"description": "", "schema": {"required": ["count", "results"], "type": "object", "properties": {"count": {"type": "integer"}, "next": {"type": "string", "format": "uri", "x-nullable": true}, "previous": {"type": "string", "format": "uri", "x-nullable": true}, "results": {"type": "array", "items": {"$ref": "#/definitions/SongsList"}}}}}}, "tags": ["hussainya"]}, "parameters": []}, "/hussainya/songs/remove-from-playlist/{slug}/": {"get": {"operationId": "hussainya_songs_remove-from-playlist_read", "description": "", "parameters": [], "responses": {"200": {"description": ""}}, "tags": ["hussainya"]}, "parameters": [{"name": "slug", "in": "path", "required": true, "type": "string"}]}, "/hussainya/songs/unlike/{slug}/": {"get": {"operationId": "hussainya_songs_unlike_read", "description": "", "parameters": [], "responses": {"200": {"description": ""}}, "tags": ["hussainya"]}, "parameters": [{"name": "slug", "in": "path", "required": true, "type": "string"}]}, "/hussainya/songs/{slug}/": {"get": {"operationId": "hussainya_songs_read", "description": "song details api\n-- params: song slug", "parameters": [], "responses": {"200": {"description": "", "schema": {"$ref": "#/definitions/SongDetail"}}}, "tags": ["hussainya"]}, "parameters": [{"name": "slug", "in": "path", "required": true, "type": "string"}]}, "/hussainya/statistics/": {"get": {"operationId": "hussainya_statistics_list", "description": "", "parameters": [], "responses": {"200": {"description": ""}}, "tags": ["hussainya"]}, "parameters": []}, "/hussainya/statistics//": {"get": {"operationId": "hussainya_statistics_list", "description": "", "parameters": [], "responses": {"200": {"description": ""}}, "tags": ["hussainya"]}, "parameters": []}, "/hussainya/topics/{topic_id}/albums/": {"get": {"operationId": "hussainya_topics_albums_list", "description": "Return albums belonging to a specific topic using topic_id in path.", "parameters": [{"name": "limit", "in": "query", "description": "Number of results to return per page.", "required": false, "type": "integer"}, {"name": "offset", "in": "query", "description": "The initial index from which to return the results.", "required": false, "type": "integer"}, {"name": "language_code", "in": "query", "description": "Language Code (e.g., en, fa, ar)", "type": "string"}], "responses": {"200": {"description": "", "schema": {"required": ["count", "results"], "type": "object", "properties": {"count": {"type": "integer"}, "next": {"type": "string", "format": "uri", "x-nullable": true}, "previous": {"type": "string", "format": "uri", "x-nullable": true}, "results": {"type": "array", "items": {"$ref": "#/definitions/AlbumList"}}}}}}, "tags": ["hussainya"]}, "parameters": [{"name": "topic_id", "in": "path", "required": true, "type": "string"}]}, "/hussainya/v2/albums//{id}/": {"get": {"operationId": "hussainya_v2_albums__read", "description": "", "parameters": [{"name": "singer_type", "in": "query", "description": "Type of singers to filter (lecture, madah, singer)", "type": "string", "enum": ["lecturer", "madah", "singer"]}, {"name": "search", "in": "query", "description": "A search term.", "required": false, "type": "string"}, {"name": "limit", "in": "query", "description": "Number of results to return per page.", "required": false, "type": "integer"}, {"name": "offset", "in": "query", "description": "The initial index from which to return the results.", "required": false, "type": "integer"}, {"name": "type", "in": "query", "description": "Type of songs to filter (audio, video, youtube)", "type": "string", "enum": ["audio", "video", "youtube"]}, {"name": "language_code", "in": "query", "description": "Language Code (e.g., en, fa, es)", "type": "string"}, {"name": "singer_slug", "in": "query", "description": "Comma-separated SingerSlug (e.g, mahmoud-karimi-2, huseyn-taheri) Slugs", "type": "string"}], "responses": {"200": {"description": "", "schema": {"required": ["count", "results"], "type": "object", "properties": {"count": {"type": "integer"}, "next": {"type": "string", "format": "uri", "x-nullable": true}, "previous": {"type": "string", "format": "uri", "x-nullable": true}, "results": {"type": "array", "items": {"$ref": "#/definitions/SongsList"}}}}}}, "tags": ["hussainya"]}, "parameters": [{"name": "id", "in": "path", "required": true, "type": "string"}]}, "/hussainya/v2/albums/{id}/": {"get": {"operationId": "hussainya_v2_albums_read", "description": "", "parameters": [{"name": "singer_type", "in": "query", "description": "Type of singers to filter (lecture, madah, singer)", "type": "string", "enum": ["lecturer", "madah", "singer"]}, {"name": "search", "in": "query", "description": "A search term.", "required": false, "type": "string"}, {"name": "limit", "in": "query", "description": "Number of results to return per page.", "required": false, "type": "integer"}, {"name": "offset", "in": "query", "description": "The initial index from which to return the results.", "required": false, "type": "integer"}, {"name": "type", "in": "query", "description": "Type of songs to filter (audio, video, youtube)", "type": "string", "enum": ["audio", "video", "youtube"]}, {"name": "language_code", "in": "query", "description": "Language Code (e.g., en, fa, es)", "type": "string"}, {"name": "singer_slug", "in": "query", "description": "Comma-separated SingerSlug (e.g, mahmoud-karimi-2, huseyn-taheri) Slugs", "type": "string"}], "responses": {"200": {"description": "", "schema": {"required": ["count", "results"], "type": "object", "properties": {"count": {"type": "integer"}, "next": {"type": "string", "format": "uri", "x-nullable": true}, "previous": {"type": "string", "format": "uri", "x-nullable": true}, "results": {"type": "array", "items": {"$ref": "#/definitions/SongsList"}}}}}}, "tags": ["hussainya"]}, "parameters": [{"name": "id", "in": "path", "required": true, "type": "string"}]}, "/hussainya/v2/collections//{id}/": {"get": {"operationId": "hussainya_v2_collections__read", "description": "", "parameters": [{"name": "limit", "in": "query", "description": "Number of results to return per page.", "required": false, "type": "integer"}, {"name": "offset", "in": "query", "description": "The initial index from which to return the results.", "required": false, "type": "integer"}], "responses": {"200": {"description": "", "schema": {"required": ["count", "results"], "type": "object", "properties": {"count": {"type": "integer"}, "next": {"type": "string", "format": "uri", "x-nullable": true}, "previous": {"type": "string", "format": "uri", "x-nullable": true}, "results": {"type": "array", "items": {"$ref": "#/definitions/SongsList"}}}}}}, "tags": ["hussainya"]}, "parameters": [{"name": "id", "in": "path", "required": true, "type": "string"}]}, "/hussainya/v2/collections/{id}/": {"get": {"operationId": "hussainya_v2_collections_read", "description": "", "parameters": [{"name": "limit", "in": "query", "description": "Number of results to return per page.", "required": false, "type": "integer"}, {"name": "offset", "in": "query", "description": "The initial index from which to return the results.", "required": false, "type": "integer"}], "responses": {"200": {"description": "", "schema": {"required": ["count", "results"], "type": "object", "properties": {"count": {"type": "integer"}, "next": {"type": "string", "format": "uri", "x-nullable": true}, "previous": {"type": "string", "format": "uri", "x-nullable": true}, "results": {"type": "array", "items": {"$ref": "#/definitions/SongsList"}}}}}}, "tags": ["hussainya"]}, "parameters": [{"name": "id", "in": "path", "required": true, "type": "string"}]}, "/hussainya/v2/home/": {"get": {"operationId": "hussainya_v2_home_list", "description": "home page API", "parameters": [{"name": "hijri-date", "in": "query", "description": "eg. 01/09 (MONTH/DAY) ", "type": "string"}], "responses": {"200": {"description": ""}}, "tags": ["hussainya"]}, "parameters": []}, "/hussainya/v2/playlist/add/": {"post": {"operationId": "hussainya_v2_playlist_add_create", "description": "افزودن آهنگ به پلی لیست در کالکشن", "parameters": [], "responses": {"201": {"description": ""}}, "tags": ["hussainya"]}, "parameters": []}, "/hussainya/v2/playlist/collections/create/": {"post": {"operationId": "hussainya_v2_playlist_collections_create_create", "description": "ایجاد کالکشن جدید", "parameters": [], "responses": {"201": {"description": ""}}, "tags": ["hussainya"]}, "parameters": []}, "/hussainya/v2/playlist/collections/list/": {"get": {"operationId": "hussainya_v2_playlist_collections_list_list", "description": "لیست کالکشن‌های کاربر با قابلیت سرچ", "parameters": [], "responses": {"200": {"description": ""}}, "tags": ["hussainya"]}, "parameters": []}, "/hussainya/v2/playlist/collections/{collection_id}/delete/": {"delete": {"operationId": "hussainya_v2_playlist_collections_delete_delete", "description": "حذف کالکشن", "parameters": [], "responses": {"204": {"description": ""}}, "tags": ["hussainya"]}, "parameters": [{"name": "collection_id", "in": "path", "required": true, "type": "string"}]}, "/hussainya/v2/playlist/collections/{collection_id}/songs/": {"get": {"operationId": "hussainya_v2_playlist_collections_songs_list", "description": "لیست آهنگ‌های یک کالکشن با قابلیت سرچ", "parameters": [], "responses": {"200": {"description": ""}}, "tags": ["hussainya"]}, "parameters": [{"name": "collection_id", "in": "path", "required": true, "type": "string"}]}, "/hussainya/v2/playlist/collections/{collection_id}/update/": {"patch": {"operationId": "hussainya_v2_playlist_collections_update_partial_update", "description": "آپدیت نام کالکشن", "parameters": [], "responses": {"200": {"description": ""}}, "tags": ["hussainya"]}, "parameters": [{"name": "collection_id", "in": "path", "required": true, "type": "string"}]}, "/hussainya/v2/singers//{slug}/": {"get": {"operationId": "hussainya_v2_singers__read", "description": "", "parameters": [{"name": "search", "in": "query", "description": "A search term.", "required": false, "type": "string"}, {"name": "limit", "in": "query", "description": "Number of results to return per page.", "required": false, "type": "integer"}, {"name": "offset", "in": "query", "description": "The initial index from which to return the results.", "required": false, "type": "integer"}, {"name": "album_id", "in": "query", "description": "Comma-separated Album IDs(e.g, 733, 530)", "type": "string"}, {"name": "language_code", "in": "query", "description": "Language Code (e.g., en, fa, es)", "type": "string"}], "responses": {"200": {"description": "", "schema": {"required": ["count", "results"], "type": "object", "properties": {"count": {"type": "integer"}, "next": {"type": "string", "format": "uri", "x-nullable": true}, "previous": {"type": "string", "format": "uri", "x-nullable": true}, "results": {"type": "array", "items": {"$ref": "#/definitions/SongsList"}}}}}}, "tags": ["hussainya"]}, "parameters": [{"name": "slug", "in": "path", "required": true, "type": "string"}]}, "/hussainya/v2/singers/{slug}/": {"get": {"operationId": "hussainya_v2_singers_read", "description": "", "parameters": [{"name": "search", "in": "query", "description": "A search term.", "required": false, "type": "string"}, {"name": "limit", "in": "query", "description": "Number of results to return per page.", "required": false, "type": "integer"}, {"name": "offset", "in": "query", "description": "The initial index from which to return the results.", "required": false, "type": "integer"}, {"name": "album_id", "in": "query", "description": "Comma-separated Album IDs(e.g, 733, 530)", "type": "string"}, {"name": "language_code", "in": "query", "description": "Language Code (e.g., en, fa, es)", "type": "string"}], "responses": {"200": {"description": "", "schema": {"required": ["count", "results"], "type": "object", "properties": {"count": {"type": "integer"}, "next": {"type": "string", "format": "uri", "x-nullable": true}, "previous": {"type": "string", "format": "uri", "x-nullable": true}, "results": {"type": "array", "items": {"$ref": "#/definitions/SongsList"}}}}}}, "tags": ["hussainya"]}, "parameters": [{"name": "slug", "in": "path", "required": true, "type": "string"}]}, "/hussainya/v3/home/": {"get": {"operationId": "hussainya_v3_home_list", "description": "", "parameters": [], "responses": {"200": {"description": ""}}, "tags": ["hussainya"]}, "parameters": []}, "/important-notices/": {"get": {"operationId": "important-notices_list", "description": "", "parameters": [{"name": "limit", "in": "query", "description": "Number of results to return per page.", "required": false, "type": "integer"}, {"name": "offset", "in": "query", "description": "The initial index from which to return the results.", "required": false, "type": "integer"}], "responses": {"200": {"description": "", "schema": {"required": ["count", "results"], "type": "object", "properties": {"count": {"type": "integer"}, "next": {"type": "string", "format": "uri", "x-nullable": true}, "previous": {"type": "string", "format": "uri", "x-nullable": true}, "results": {"type": "array", "items": {"$ref": "#/definitions/ImportantNotice"}}}}}}, "tags": ["important-notices"]}, "parameters": []}, "/khatm/groups/": {"get": {"operationId": "khatm_groups_list", "description": "", "parameters": [{"name": "page", "in": "query", "description": "Filter to show only the groups page", "type": "string", "enum": ["created", "joined"]}], "responses": {"200": {"description": "", "schema": {"required": ["count", "results"], "type": "object", "properties": {"count": {"type": "integer"}, "next": {"type": "string", "format": "uri", "x-nullable": true}, "previous": {"type": "string", "format": "uri", "x-nullable": true}, "results": {"type": "array", "items": {"$ref": "#/definitions/GroupKhatm"}}}}}}, "tags": ["khatm"]}, "post": {"operationId": "khatm_groups_create", "description": "", "parameters": [{"name": "data", "in": "body", "required": true, "schema": {"$ref": "#/definitions/GroupKhatm"}}], "responses": {"201": {"description": "", "schema": {"$ref": "#/definitions/GroupKhatm"}}}, "tags": ["khatm"]}, "parameters": []}, "/khatm/groups/{slug}/": {"get": {"operationId": "khatm_groups_read", "description": "", "parameters": [], "responses": {"200": {"description": "", "schema": {"$ref": "#/definitions/GroupKhatm"}}}, "tags": ["khatm"]}, "put": {"operationId": "khatm_groups_update", "description": "", "parameters": [{"name": "data", "in": "body", "required": true, "schema": {"$ref": "#/definitions/GroupKhatm"}}], "responses": {"200": {"description": "", "schema": {"$ref": "#/definitions/GroupKhatm"}}}, "tags": ["khatm"]}, "patch": {"operationId": "khatm_groups_partial_update", "description": "", "parameters": [{"name": "data", "in": "body", "required": true, "schema": {"$ref": "#/definitions/GroupKhatm"}}], "responses": {"200": {"description": "", "schema": {"$ref": "#/definitions/GroupKhatm"}}}, "tags": ["khatm"]}, "delete": {"operationId": "khatm_groups_delete", "description": "", "parameters": [], "responses": {"204": {"description": ""}}, "tags": ["khatm"]}, "parameters": [{"name": "slug", "in": "path", "required": true, "type": "string", "format": "slug", "pattern": "^[-\\w]+$"}]}, "/khatm/groups/{slug}/join/": {"post": {"operationId": "khatm_groups_join_create", "description": "", "parameters": [{"name": "data", "in": "body", "required": true, "schema": {"required": ["pages_count"], "type": "object", "properties": {"pages_count": {"description": "Number of pages to read", "type": "integer"}}}}], "responses": {"201": {"description": "", "schema": {"required": ["pages_count"], "type": "object", "properties": {"pages_count": {"description": "Number of pages to read", "type": "integer"}}}}}, "tags": ["khatm"]}, "parameters": [{"name": "slug", "in": "path", "required": true, "type": "string"}]}, "/khatm/groups/{slug}/read-page/": {"put": {"operationId": "khatm_groups_read-page_update", "description": "", "parameters": [{"name": "data", "in": "body", "required": true, "schema": {"$ref": "#/definitions/ReadPage"}}], "responses": {"200": {"description": "", "schema": {"$ref": "#/definitions/ReadPage"}}}, "tags": ["khatm"]}, "parameters": [{"name": "slug", "in": "path", "required": true, "type": "string"}]}, "/khatm/individuals/": {"get": {"operationId": "khatm_individuals_list", "description": "", "parameters": [], "responses": {"200": {"description": "", "schema": {"type": "array", "items": {"$ref": "#/definitions/IndividualKhatm"}}}}, "tags": ["khatm"]}, "post": {"operationId": "khatm_individuals_create", "description": "", "parameters": [{"name": "data", "in": "body", "required": true, "schema": {"$ref": "#/definitions/IndividualKhatm"}}], "responses": {"201": {"description": "", "schema": {"$ref": "#/definitions/IndividualKhatm"}}}, "tags": ["khatm"]}, "parameters": []}, "/khatm/individuals/{slug}/": {"put": {"operationId": "khatm_individuals_update", "description": "", "parameters": [{"name": "data", "in": "body", "required": true, "schema": {"$ref": "#/definitions/IndividualKhatmUpdate"}}], "responses": {"200": {"description": "", "schema": {"$ref": "#/definitions/IndividualKhatmUpdate"}}}, "tags": ["khatm"]}, "patch": {"operationId": "khatm_individuals_partial_update", "description": "", "parameters": [{"name": "data", "in": "body", "required": true, "schema": {"$ref": "#/definitions/IndividualKhatmUpdate"}}], "responses": {"200": {"description": "", "schema": {"$ref": "#/definitions/IndividualKhatmUpdate"}}}, "tags": ["khatm"]}, "delete": {"operationId": "khatm_individuals_delete", "description": "", "parameters": [], "responses": {"204": {"description": ""}}, "tags": ["khatm"]}, "parameters": [{"name": "slug", "in": "path", "required": true, "type": "string", "format": "slug", "pattern": "^[-\\w]+$"}]}, "/khatm/individuals/{slug}/read-page/": {"put": {"operationId": "khatm_individuals_read-page_update", "description": "", "parameters": [{"name": "data", "in": "body", "required": true, "schema": {"$ref": "#/definitions/IndividualReadPage"}}], "responses": {"200": {"description": "", "schema": {"$ref": "#/definitions/IndividualReadPage"}}}, "tags": ["khatm"]}, "parameters": [{"name": "slug", "in": "path", "required": true, "type": "string"}]}, "/khatm/joined-groups/": {"get": {"operationId": "khatm_joined-groups_list", "description": "", "parameters": [], "responses": {"200": {"description": "", "schema": {"type": "array", "items": {"$ref": "#/definitions/UserGroupKhatm"}}}}, "tags": ["khatm"]}, "parameters": []}, "/library/banner-bottom/": {"get": {"operationId": "library_banner-bottom_list", "description": "", "parameters": [], "responses": {"200": {"description": "", "schema": {"type": "array", "items": {"$ref": "#/definitions/BannerList"}}}}, "tags": ["library"]}, "parameters": []}, "/library/banner/": {"get": {"operationId": "library_banner_list", "description": "", "parameters": [], "responses": {"200": {"description": "", "schema": {"type": "array", "items": {"$ref": "#/definitions/BannerList"}}}}, "tags": ["library"]}, "parameters": []}, "/library/banner/{id}/": {"get": {"operationId": "library_banner_read", "description": "", "parameters": [{"name": "limit", "in": "query", "description": "Number of results to return per page.", "required": false, "type": "integer"}, {"name": "offset", "in": "query", "description": "The initial index from which to return the results.", "required": false, "type": "integer"}], "responses": {"200": {"description": "", "schema": {"required": ["count", "results"], "type": "object", "properties": {"count": {"type": "integer"}, "next": {"type": "string", "format": "uri", "x-nullable": true}, "previous": {"type": "string", "format": "uri", "x-nullable": true}, "results": {"type": "array", "items": {"$ref": "#/definitions/BookList"}}}}}}, "tags": ["library"]}, "parameters": [{"name": "id", "in": "path", "required": true, "type": "string"}]}, "/library/bookmark/": {"get": {"operationId": "library_bookmark_list", "description": "", "parameters": [{"name": "limit", "in": "query", "description": "Number of results to return per page.", "required": false, "type": "integer"}, {"name": "offset", "in": "query", "description": "The initial index from which to return the results.", "required": false, "type": "integer"}], "responses": {"200": {"description": "", "schema": {"required": ["count", "results"], "type": "object", "properties": {"count": {"type": "integer"}, "next": {"type": "string", "format": "uri", "x-nullable": true}, "previous": {"type": "string", "format": "uri", "x-nullable": true}, "results": {"type": "array", "items": {"$ref": "#/definitions/BookmarkSerializers"}}}}}}, "tags": ["library"]}, "post": {"operationId": "library_bookmark_create", "description": "", "parameters": [{"name": "data", "in": "body", "required": true, "schema": {"$ref": "#/definitions/BookmarkSerializers"}}], "responses": {"201": {"description": "", "schema": {"$ref": "#/definitions/BookmarkSerializers"}}}, "tags": ["library"]}, "parameters": []}, "/library/bookmark/remove/{slug}/": {"post": {"operationId": "library_bookmark_remove_create", "description": "", "parameters": [], "responses": {"201": {"description": ""}}, "tags": ["library"]}, "parameters": [{"name": "slug", "in": "path", "required": true, "type": "string"}]}, "/library/books/": {"get": {"operationId": "library_books_list", "description": "", "parameters": [{"name": "audio", "in": "query", "description": "", "required": false, "type": "string"}, {"name": "nonfree", "in": "query", "description": "", "required": false, "type": "string"}, {"name": "size", "in": "query", "description": "", "required": false, "type": "string"}, {"name": "publisher", "in": "query", "description": "", "required": false, "type": "string"}, {"name": "authors", "in": "query", "description": "", "required": false, "type": "string"}, {"name": "category", "in": "query", "description": "", "required": false, "type": "string"}, {"name": "order", "in": "query", "description": "", "required": false, "type": "string"}, {"name": "search", "in": "query", "description": "A search term.", "required": false, "type": "string"}, {"name": "limit", "in": "query", "description": "Number of results to return per page.", "required": false, "type": "integer"}, {"name": "offset", "in": "query", "description": "The initial index from which to return the results.", "required": false, "type": "integer"}], "responses": {"200": {"description": "", "schema": {"required": ["count", "results"], "type": "object", "properties": {"count": {"type": "integer"}, "next": {"type": "string", "format": "uri", "x-nullable": true}, "previous": {"type": "string", "format": "uri", "x-nullable": true}, "results": {"type": "array", "items": {"$ref": "#/definitions/BookList"}}}}}}, "tags": ["library"]}, "parameters": []}, "/library/books/editorsuggestions/": {"get": {"operationId": "library_books_editorsuggestions_list", "description": "", "parameters": [{"name": "audio", "in": "query", "description": "", "required": false, "type": "string"}, {"name": "nonfree", "in": "query", "description": "", "required": false, "type": "string"}, {"name": "size", "in": "query", "description": "", "required": false, "type": "string"}, {"name": "publisher", "in": "query", "description": "", "required": false, "type": "string"}, {"name": "authors", "in": "query", "description": "", "required": false, "type": "string"}, {"name": "category", "in": "query", "description": "", "required": false, "type": "string"}, {"name": "order", "in": "query", "description": "", "required": false, "type": "string"}, {"name": "search", "in": "query", "description": "A search term.", "required": false, "type": "string"}], "responses": {"200": {"description": "", "schema": {"type": "array", "items": {"$ref": "#/definitions/BookListSerializerEditorSuggestion"}}}}, "tags": ["library"]}, "parameters": []}, "/library/books/rate/{slug}/": {"post": {"operationId": "library_books_rate_create", "summary": "Rate a book", "description": "Allows users to rate a book and optionally provide a note about the book.", "parameters": [{"name": "data", "in": "body", "required": true, "schema": {"required": ["rate"], "type": "object", "properties": {"rate": {"description": "Rating for the book (0 to 10)", "type": "integer", "example": 8}, "note": {"description": "Optional note about the book (max 512 characters)", "type": "string", "example": "This book was amazing!"}}}}, {"name": "slug", "in": "path", "description": "Slug of the book to be rated", "required": true, "type": "string"}], "responses": {"200": {"description": "Rate submitted successfully", "examples": {"application/json": {"status": true, "message": "rate submitted"}}}, "400": {"description": "Invalid input or book not found", "examples": {"application/json": {"status": false, "message": "rate must be between 0 and 10"}}}}, "tags": ["library"]}, "parameters": [{"name": "slug", "in": "path", "required": true, "type": "string"}]}, "/library/books/user-downloads/": {"get": {"operationId": "library_books_user-downloads_list", "summary": "Redesign v2", "description": "", "parameters": [{"name": "audio", "in": "query", "description": "", "required": false, "type": "string"}, {"name": "nonfree", "in": "query", "description": "", "required": false, "type": "string"}, {"name": "size", "in": "query", "description": "", "required": false, "type": "string"}, {"name": "publisher", "in": "query", "description": "", "required": false, "type": "string"}, {"name": "authors", "in": "query", "description": "", "required": false, "type": "string"}, {"name": "category", "in": "query", "description": "", "required": false, "type": "string"}, {"name": "order", "in": "query", "description": "", "required": false, "type": "string"}, {"name": "search", "in": "query", "description": "A search term.", "required": false, "type": "string"}, {"name": "limit", "in": "query", "description": "Number of results to return per page.", "required": false, "type": "integer"}, {"name": "offset", "in": "query", "description": "The initial index from which to return the results.", "required": false, "type": "integer"}], "responses": {"200": {"description": "", "schema": {"required": ["count", "results"], "type": "object", "properties": {"count": {"type": "integer"}, "next": {"type": "string", "format": "uri", "x-nullable": true}, "previous": {"type": "string", "format": "uri", "x-nullable": true}, "results": {"type": "array", "items": {"$ref": "#/definitions/BookListV2"}}}}}}, "tags": ["library"]}, "parameters": []}, "/library/books/{slug}/": {"get": {"operationId": "library_books_read", "description": "", "parameters": [], "responses": {"200": {"description": "", "schema": {"$ref": "#/definitions/BookDetail"}}}, "tags": ["library"]}, "parameters": [{"name": "slug", "in": "path", "required": true, "type": "string"}]}, "/library/books/{slug}/download/": {"post": {"operationId": "library_books_download_create", "summary": "Redesign v2", "description": "", "parameters": [], "responses": {"201": {"description": ""}}, "tags": ["library"]}, "parameters": [{"name": "slug", "in": "path", "required": true, "type": "string"}]}, "/library/books/{slug}/purchase/": {"post": {"operationId": "library_books_purchase_create", "description": "", "parameters": [], "responses": {"201": {"description": ""}}, "tags": ["library"]}, "parameters": [{"name": "slug", "in": "path", "required": true, "type": "string"}]}, "/library/books/{slug}/rates/": {"get": {"operationId": "library_books_rates_list", "summary": "Redesign v2", "description": "", "parameters": [{"name": "limit", "in": "query", "description": "Number of results to return per page.", "required": false, "type": "integer"}, {"name": "offset", "in": "query", "description": "The initial index from which to return the results.", "required": false, "type": "integer"}], "responses": {"200": {"description": "", "schema": {"required": ["count", "results"], "type": "object", "properties": {"count": {"type": "integer"}, "next": {"type": "string", "format": "uri", "x-nullable": true}, "previous": {"type": "string", "format": "uri", "x-nullable": true}, "results": {"type": "array", "items": {"$ref": "#/definitions/UserRate"}}}}}}, "tags": ["library"]}, "parameters": [{"name": "slug", "in": "path", "required": true, "type": "string"}]}, "/library/books/{slug}/related/": {"get": {"operationId": "library_books_related_list", "description": "", "parameters": [{"name": "audio", "in": "query", "description": "", "required": false, "type": "string"}, {"name": "nonfree", "in": "query", "description": "", "required": false, "type": "string"}, {"name": "size", "in": "query", "description": "", "required": false, "type": "string"}, {"name": "publisher", "in": "query", "description": "", "required": false, "type": "string"}, {"name": "authors", "in": "query", "description": "", "required": false, "type": "string"}, {"name": "category", "in": "query", "description": "", "required": false, "type": "string"}, {"name": "order", "in": "query", "description": "", "required": false, "type": "string"}, {"name": "search", "in": "query", "description": "A search term.", "required": false, "type": "string"}, {"name": "limit", "in": "query", "description": "Number of results to return per page.", "required": false, "type": "integer"}, {"name": "offset", "in": "query", "description": "The initial index from which to return the results.", "required": false, "type": "integer"}], "responses": {"200": {"description": "", "schema": {"required": ["count", "results"], "type": "object", "properties": {"count": {"type": "integer"}, "next": {"type": "string", "format": "uri", "x-nullable": true}, "previous": {"type": "string", "format": "uri", "x-nullable": true}, "results": {"type": "array", "items": {"$ref": "#/definitions/BookList"}}}}}}, "tags": ["library"]}, "parameters": [{"name": "slug", "in": "path", "required": true, "type": "string"}]}, "/library/books/{slug}/v2/": {"get": {"operationId": "library_books_v2_read", "description": "", "parameters": [], "responses": {"200": {"description": "", "schema": {"$ref": "#/definitions/BookDetail"}}}, "tags": ["library"]}, "parameters": [{"name": "slug", "in": "path", "required": true, "type": "string"}]}, "/library/category/": {"get": {"operationId": "library_category_list", "description": "", "parameters": [{"name": "limit", "in": "query", "description": "Number of results to return per page.", "required": false, "type": "integer"}, {"name": "offset", "in": "query", "description": "The initial index from which to return the results.", "required": false, "type": "integer"}], "responses": {"200": {"description": "", "schema": {"required": ["count", "results"], "type": "object", "properties": {"count": {"type": "integer"}, "next": {"type": "string", "format": "uri", "x-nullable": true}, "previous": {"type": "string", "format": "uri", "x-nullable": true}, "results": {"type": "array", "items": {"$ref": "#/definitions/Category"}}}}}}, "tags": ["library"]}, "parameters": []}, "/library/getFilters/": {"get": {"operationId": "library_getFilters_list", "description": "", "parameters": [], "responses": {"200": {"description": ""}}, "tags": ["library"]}, "parameters": []}, "/library/publish/authors-list/": {"get": {"operationId": "library_publish_authors-list_list", "description": "", "parameters": [], "responses": {"200": {"description": ""}}, "tags": ["library"]}, "parameters": []}, "/library/publish/categories-list/": {"get": {"operationId": "library_publish_categories-list_list", "description": "", "parameters": [], "responses": {"200": {"description": ""}}, "tags": ["library"]}, "parameters": []}, "/library/publish/create/": {"post": {"operationId": "library_publish_create_create", "description": "", "parameters": [{"name": "data", "in": "body", "required": true, "schema": {"$ref": "#/definitions/CreateBook"}}], "responses": {"201": {"description": "", "schema": {"$ref": "#/definitions/CreateBook"}}}, "tags": ["library"]}, "parameters": []}, "/library/publish/narrators-list/": {"get": {"operationId": "library_publish_narrators-list_list", "description": "", "parameters": [], "responses": {"200": {"description": ""}}, "tags": ["library"]}, "parameters": []}, "/library/publish/tags-search/": {"get": {"operationId": "library_publish_tags-search_list", "description": "", "parameters": [{"name": "s", "in": "query", "description": "Search by name", "type": "string"}], "responses": {"200": {"description": ""}}, "tags": ["library"]}, "parameters": []}, "/library/publish/translators-list/": {"get": {"operationId": "library_publish_translators-list_list", "description": "", "parameters": [], "responses": {"200": {"description": ""}}, "tags": ["library"]}, "parameters": []}, "/library/publishers/": {"get": {"operationId": "library_publishers_list", "description": "", "parameters": [{"name": "search", "in": "query", "description": "A search term.", "required": false, "type": "string"}, {"name": "limit", "in": "query", "description": "Number of results to return per page.", "required": false, "type": "integer"}, {"name": "offset", "in": "query", "description": "The initial index from which to return the results.", "required": false, "type": "integer"}], "responses": {"200": {"description": "", "schema": {"required": ["count", "results"], "type": "object", "properties": {"count": {"type": "integer"}, "next": {"type": "string", "format": "uri", "x-nullable": true}, "previous": {"type": "string", "format": "uri", "x-nullable": true}, "results": {"type": "array", "items": {"$ref": "#/definitions/PublisherList"}}}}}}, "tags": ["library"]}, "parameters": []}, "/library/statistics/": {"get": {"operationId": "library_statistics_list", "description": "", "parameters": [], "responses": {"200": {"description": ""}}, "tags": ["library"]}, "parameters": []}, "/library/v2/banner/{id}/": {"get": {"operationId": "library_v2_banner_read", "summary": "Redesign v2", "description": "", "parameters": [{"name": "limit", "in": "query", "description": "Number of results to return per page.", "required": false, "type": "integer"}, {"name": "offset", "in": "query", "description": "The initial index from which to return the results.", "required": false, "type": "integer"}], "responses": {"200": {"description": "", "schema": {"required": ["count", "results"], "type": "object", "properties": {"count": {"type": "integer"}, "next": {"type": "string", "format": "uri", "x-nullable": true}, "previous": {"type": "string", "format": "uri", "x-nullable": true}, "results": {"type": "array", "items": {"$ref": "#/definitions/BookListV2"}}}}}}, "tags": ["library"]}, "parameters": [{"name": "id", "in": "path", "required": true, "type": "string"}]}, "/library/v2/books/": {"get": {"operationId": "library_v2_books_list", "description": "", "parameters": [{"name": "audio", "in": "query", "description": "", "required": false, "type": "string"}, {"name": "nonfree", "in": "query", "description": "", "required": false, "type": "string"}, {"name": "size", "in": "query", "description": "", "required": false, "type": "string"}, {"name": "publisher", "in": "query", "description": "", "required": false, "type": "string"}, {"name": "authors", "in": "query", "description": "", "required": false, "type": "string"}, {"name": "category", "in": "query", "description": "", "required": false, "type": "string"}, {"name": "order", "in": "query", "description": "", "required": false, "type": "string"}, {"name": "search", "in": "query", "description": "A search term.", "required": false, "type": "string"}, {"name": "limit", "in": "query", "description": "Number of results to return per page.", "required": false, "type": "integer"}, {"name": "offset", "in": "query", "description": "The initial index from which to return the results.", "required": false, "type": "integer"}], "responses": {"200": {"description": "", "schema": {"required": ["count", "results"], "type": "object", "properties": {"count": {"type": "integer"}, "next": {"type": "string", "format": "uri", "x-nullable": true}, "previous": {"type": "string", "format": "uri", "x-nullable": true}, "results": {"type": "array", "items": {"$ref": "#/definitions/BookListV2"}}}}}}, "tags": ["library"]}, "parameters": []}, "/library/v2/books/{slug}/": {"get": {"operationId": "library_v2_books_read", "summary": "Redesign v2", "description": "\n# 📘 Scenario 1\n اگر مقدار قیمت \n price کتاب\n برابر با صفر بود آن کتاب رایگان است در غیر این صورت اگر بیشتر از صفر بود\n دو مقدار discount_percentage و final_price\n هم بایستی در نظر گرفته شود که نشان دهنده مقدار درصد تخفیف و قیمت نهایی با تخفیف محاسبه شده است\n\n# 📘 Scenario 2\n اگر کاربر قصد خرید یا دانلود کتاب را داشت بایستی قبل از آن api \n دانلود کتاب فراخوانی شود \n library/books/ slug book /download/\n\n سپس اگر کتاب غیر رایگان بود به api مربوطه در سرویس حبیب کوین\n برای پرداخت هزینه کوین کتاب بایستی فراخوانی شود که مقدار نام سرویس برابر با \n book است\n و مقدار ابجکت ایدی برابر با ایدی این کتاب است \n\n## (دقت داشته باشید که اگر کتاب غیر رایگان بود ابتدا بایستی خریداری شود سپس دانلود شود)\n\n\n\n\n# مقادیر\n\n برمیگردان جزعیات یک کتاب را به وسیله اسلاگ آن کتاب,\n مقدار is_bookmark مشخص میکند کاربر این کتاب را بوک مارک کرده است bool,\n مقدار is_download مشخص میکند کاربر این کتاب را دانلود کرده است bool,\n\n مقدار user_rate که یک ابجکت از rate که مشخص کننده rate همین کتاب است به همراه مقدار user_rate که مشخص کننده مقدار rate است که کاربر داده است و ممکن است null هم باشد که ساختار آن مانند:\n\n ```json\n \"rates\": {\n \"rate\": 4,\n \"user_rate\": {\n \"note\": \"This book was amazing!\",\n \"rate\": 3\n }\n ```\n\n\n", "parameters": [], "responses": {"200": {"description": "Successful retrieval of book details.", "schema": {"$ref": "#/definitions/BookDetailV2"}}, "401": {"description": "Unauthorized. Authentication credentials were not provided or are invalid."}, "404": {"description": "Not Found. The book with the given slug does not exist."}}, "tags": ["library"]}, "parameters": [{"name": "slug", "in": "path", "required": true, "type": "string"}]}, "/library/writers/": {"get": {"operationId": "library_writers_list", "description": "", "parameters": [{"name": "search", "in": "query", "description": "A search term.", "required": false, "type": "string"}, {"name": "limit", "in": "query", "description": "Number of results to return per page.", "required": false, "type": "integer"}, {"name": "offset", "in": "query", "description": "The initial index from which to return the results.", "required": false, "type": "integer"}], "responses": {"200": {"description": "", "schema": {"required": ["count", "results"], "type": "object", "properties": {"count": {"type": "integer"}, "next": {"type": "string", "format": "uri", "x-nullable": true}, "previous": {"type": "string", "format": "uri", "x-nullable": true}, "results": {"type": "array", "items": {"$ref": "#/definitions/AuthorList"}}}}}}, "tags": ["library"]}, "parameters": []}, "/mafatih-categories/": {"get": {"operationId": "mafatih-categories_list", "description": "", "parameters": [], "responses": {"200": {"description": "", "schema": {"type": "array", "items": {"$ref": "#/definitions/MafatihCategories"}}}}, "tags": ["mafatih-categories"]}, "parameters": []}, "/mafatih-categories/v2/": {"get": {"operationId": "mafatih-categories_v2_list", "description": "", "parameters": [], "responses": {"200": {"description": "", "schema": {"type": "array", "items": {"$ref": "#/definitions/DuaCategories"}}}}, "tags": ["mafatih-categories"]}, "parameters": []}, "/mafatih-dua-parts/": {"get": {"operationId": "mafatih-dua-parts_list", "description": "", "parameters": [{"name": "limit", "in": "query", "description": "Number of results to return per page.", "required": false, "type": "integer"}, {"name": "offset", "in": "query", "description": "The initial index from which to return the results.", "required": false, "type": "integer"}], "responses": {"200": {"description": "", "schema": {"required": ["count", "results"], "type": "object", "properties": {"count": {"type": "integer"}, "next": {"type": "string", "format": "uri", "x-nullable": true}, "previous": {"type": "string", "format": "uri", "x-nullable": true}, "results": {"type": "array", "items": {"$ref": "#/definitions/MafatihDuaPart"}}}}}}, "tags": ["mafatih-dua-parts"]}, "parameters": []}, "/mafatih-dua-parts/v2/": {"get": {"operationId": "mafatih-dua-parts_v2_list", "description": "", "parameters": [{"name": "limit", "in": "query", "description": "Number of results to return per page.", "required": false, "type": "integer"}, {"name": "offset", "in": "query", "description": "The initial index from which to return the results.", "required": false, "type": "integer"}], "responses": {"200": {"description": "", "schema": {"required": ["count", "results"], "type": "object", "properties": {"count": {"type": "integer"}, "next": {"type": "string", "format": "uri", "x-nullable": true}, "previous": {"type": "string", "format": "uri", "x-nullable": true}, "results": {"type": "array", "items": {"$ref": "#/definitions/DuaPartSerializer"}}}}}}, "tags": ["mafatih-dua-parts"]}, "parameters": []}, "/mafatih-duas/": {"get": {"operationId": "mafatih-duas_list", "description": "", "parameters": [{"name": "limit", "in": "query", "description": "Number of results to return per page.", "required": false, "type": "integer"}, {"name": "offset", "in": "query", "description": "The initial index from which to return the results.", "required": false, "type": "integer"}], "responses": {"200": {"description": "", "schema": {"required": ["count", "results"], "type": "object", "properties": {"count": {"type": "integer"}, "next": {"type": "string", "format": "uri", "x-nullable": true}, "previous": {"type": "string", "format": "uri", "x-nullable": true}, "results": {"type": "array", "items": {"$ref": "#/definitions/MafatihDua"}}}}}}, "tags": ["mafatih-duas"]}, "parameters": []}, "/mafatih-duas/audios/{id}/": {"get": {"operationId": "mafatih-duas_audios_read", "description": "", "parameters": [], "responses": {"200": {"description": "", "schema": {"$ref": "#/definitions/DuaAudioDetail"}}}, "tags": ["mafatih-duas"]}, "parameters": [{"name": "id", "in": "path", "required": true, "type": "string"}]}, "/mafatih-duas/dhikrs/": {"get": {"operationId": "mafatih-duas_dhikrs_list", "description": "", "parameters": [], "responses": {"200": {"description": ""}}, "tags": ["mafatih-duas"]}, "parameters": []}, "/mafatih-duas/famous/": {"get": {"operationId": "mafatih-duas_famous_list", "description": "", "parameters": [], "responses": {"200": {"description": ""}}, "tags": ["mafatih-duas"]}, "parameters": []}, "/mafatih-duas/location/": {"get": {"operationId": "mafatih-duas_location_list", "description": "Retrieve nearby duas based on the user's location.\nThis view takes the user's latitude and longitude as input and returns a list of duas within 20 kilometers,\nsorted by distance. Additionally, duas within 2 kilometers are prioritized based on the priority field.", "parameters": [{"name": "lat", "in": "query", "description": "Latitude of the location lat = {Mashhad : 36.2605, Karbala : 32.6160326} ", "type": "number"}, {"name": "lon", "in": "query", "description": "Longitude of the location lon = {Mashhad : 59.6168, Karbala : 44.0244229} ", "type": "number"}], "responses": {"200": {"description": ""}}, "tags": ["mafatih-duas"]}, "parameters": []}, "/mafatih-duas/v2/": {"get": {"operationId": "mafatih-duas_v2_list", "description": "", "parameters": [{"name": "limit", "in": "query", "description": "Number of results to return per page.", "required": false, "type": "integer"}, {"name": "offset", "in": "query", "description": "The initial index from which to return the results.", "required": false, "type": "integer"}], "responses": {"200": {"description": "", "schema": {"required": ["count", "results"], "type": "object", "properties": {"count": {"type": "integer"}, "next": {"type": "string", "format": "uri", "x-nullable": true}, "previous": {"type": "string", "format": "uri", "x-nullable": true}, "results": {"type": "array", "items": {"$ref": "#/definitions/MafatihDuaSerializerV2"}}}}}}, "tags": ["mafatih-duas"]}, "parameters": []}, "/mafatih-duas/v3/": {"get": {"operationId": "mafatih-duas_v3_list", "description": "", "parameters": [{"name": "limit", "in": "query", "description": "Number of results to return per page.", "required": false, "type": "integer"}, {"name": "offset", "in": "query", "description": "The initial index from which to return the results.", "required": false, "type": "integer"}], "responses": {"200": {"description": "", "schema": {"required": ["count", "results"], "type": "object", "properties": {"count": {"type": "integer"}, "next": {"type": "string", "format": "uri", "x-nullable": true}, "previous": {"type": "string", "format": "uri", "x-nullable": true}, "results": {"type": "array", "items": {"$ref": "#/definitions/MafatihDuaSerializerV3"}}}}}}, "tags": ["mafatih-duas"]}, "parameters": []}, "/mafatih-duas/{id}/audios/": {"get": {"operationId": "mafatih-duas_audios_list", "description": "", "parameters": [{"name": "limit", "in": "query", "description": "Number of results to return per page.", "required": false, "type": "integer"}, {"name": "offset", "in": "query", "description": "The initial index from which to return the results.", "required": false, "type": "integer"}], "responses": {"200": {"description": "", "schema": {"required": ["count", "results"], "type": "object", "properties": {"count": {"type": "integer"}, "next": {"type": "string", "format": "uri", "x-nullable": true}, "previous": {"type": "string", "format": "uri", "x-nullable": true}, "results": {"type": "array", "items": {"$ref": "#/definitions/DuaAudioList"}}}}}}, "tags": ["mafatih-duas"]}, "parameters": [{"name": "id", "in": "path", "required": true, "type": "string"}]}, "/mafatih/{mafatih_dua_id}/reciters/": {"get": {"operationId": "mafatih_reciters_list", "description": "Retrieve a list of unique reciters for a given MafatihDua.", "parameters": [{"name": "show_all", "in": "query", "description": "If true, returns all reciters, otherwise returns only reciters related to the specified MafatihDua.", "type": "boolean", "default": false}], "responses": {"200": {"description": "", "schema": {"type": "array", "items": {"type": "object", "properties": {"name": {"description": "Name of the reciter", "type": "string"}, "avatar": {"description": "URL of the reciter's avatar", "type": "string"}}}}}}, "tags": ["mafatih"]}, "parameters": [{"name": "mafatih_dua_id", "in": "path", "required": true, "type": "string"}]}, "/masaels/": {"get": {"operationId": "masaels_list", "description": "", "parameters": [], "responses": {"200": {"description": "", "schema": {"type": "array", "items": {"$ref": "#/definitions/Masael"}}}}, "tags": ["masaels"]}, "parameters": []}, "/masaels/marjaa-guide/": {"get": {"operationId": "masaels_marjaa-guide_list", "description": "", "parameters": [], "responses": {"200": {"description": "", "schema": {"type": "array", "items": {"$ref": "#/definitions/MarjaaGuide"}}}}, "tags": ["masaels"]}, "parameters": []}, "/masaels/v2/": {"get": {"operationId": "masaels_v2_list", "description": "", "parameters": [], "responses": {"200": {"description": "", "schema": {"type": "array", "items": {"$ref": "#/definitions/MasaelSerializerV2"}}}}, "tags": ["masaels"]}, "parameters": []}, "/notespace/create/": {"post": {"operationId": "notespace_create_create", "description": "", "parameters": [{"name": "data", "in": "body", "required": true, "schema": {"$ref": "#/definitions/Note"}}], "responses": {"201": {"description": "", "schema": {"$ref": "#/definitions/Note"}}}, "tags": ["notespace"]}, "parameters": []}, "/notespace/create/feedback/": {"post": {"operationId": "notespace_create_feedback_create", "description": "", "parameters": [{"name": "data", "in": "body", "required": true, "schema": {"$ref": "#/definitions/NoteFeedback"}}], "responses": {"201": {"description": "", "schema": {"$ref": "#/definitions/NoteFeedback"}}}, "tags": ["notespace"]}, "parameters": []}, "/notespace/feedbak/{note_id}/delete/": {"delete": {"operationId": "notespace_feedbak_delete_delete", "description": "", "parameters": [], "responses": {"204": {"description": ""}}, "tags": ["notespace"]}, "parameters": [{"name": "note_id", "in": "path", "required": true, "type": "string"}]}, "/notespace/list/{service}/": {"get": {"operationId": "notespace_list_read", "description": "Retrieve a list of Notes for a specific service and optionally a specific object.", "parameters": [{"name": "limit", "in": "query", "description": "Number of results to return per page.", "required": false, "type": "integer"}, {"name": "offset", "in": "query", "description": "The initial index from which to return the results.", "required": false, "type": "integer"}, {"name": "service", "in": "path", "description": "Service type", "type": "string", "enum": ["quran", "mafatih", "hadis", "habit"], "required": true}, {"name": "object_id", "in": "query", "description": "Comma-separated list of Object IDs(e.g 1,2,5,...)", "required": false, "type": "string", "default": "1,2,4"}], "responses": {"200": {"description": "", "schema": {"required": ["count", "results"], "type": "object", "properties": {"count": {"type": "integer"}, "next": {"type": "string", "format": "uri", "x-nullable": true}, "previous": {"type": "string", "format": "uri", "x-nullable": true}, "results": {"type": "array", "items": {"$ref": "#/definitions/Note"}}}}}}, "tags": ["notespace"]}, "parameters": [{"name": "service", "in": "path", "required": true, "type": "string"}]}, "/notespace/list/{service}/{object_id}/": {"get": {"operationId": "notespace_list_read", "description": "Retrieve a list Note", "parameters": [{"name": "limit", "in": "query", "description": "Number of results to return per page.", "required": false, "type": "integer"}, {"name": "offset", "in": "query", "description": "The initial index from which to return the results.", "required": false, "type": "integer"}, {"name": "service", "in": "path", "description": "Service type", "type": "string", "enum": ["quran", "mafatih", "hadis", "habit"], "required": true}, {"name": "object_id", "in": "path", "description": "Object ID for the note", "type": "integer", "required": true}], "responses": {"200": {"description": "", "schema": {"required": ["count", "results"], "type": "object", "properties": {"count": {"type": "integer"}, "next": {"type": "string", "format": "uri", "x-nullable": true}, "previous": {"type": "string", "format": "uri", "x-nullable": true}, "results": {"type": "array", "items": {"$ref": "#/definitions/Note"}}}}}}, "tags": ["notespace"]}, "parameters": [{"name": "service", "in": "path", "required": true, "type": "string"}, {"name": "object_id", "in": "path", "required": true, "type": "integer"}]}, "/notespace/{id}/delete/": {"delete": {"operationId": "notespace_delete_delete", "description": "", "parameters": [], "responses": {"204": {"description": ""}}, "tags": ["notespace"]}, "parameters": [{"name": "id", "in": "path", "description": "A unique integer value identifying this Note.", "required": true, "type": "integer"}]}, "/notespace/{id}/update/": {"put": {"operationId": "notespace_update_update", "description": "", "parameters": [{"name": "data", "in": "body", "required": true, "schema": {"$ref": "#/definitions/Note"}}], "responses": {"200": {"description": "", "schema": {"$ref": "#/definitions/Note"}}}, "tags": ["notespace"]}, "patch": {"operationId": "notespace_update_partial_update", "description": "", "parameters": [{"name": "data", "in": "body", "required": true, "schema": {"$ref": "#/definitions/Note"}}], "responses": {"200": {"description": "", "schema": {"$ref": "#/definitions/Note"}}}, "tags": ["notespace"]}, "parameters": [{"name": "id", "in": "path", "description": "A unique integer value identifying this Note.", "required": true, "type": "integer"}]}, "/payment/methods/": {"get": {"operationId": "payment_methods_list", "description": "", "parameters": [], "responses": {"200": {"description": ""}}, "tags": ["payment"]}, "parameters": []}, "/plans/": {"get": {"operationId": "plans_list", "description": "", "parameters": [{"name": "limit", "in": "query", "description": "Number of results to return per page.", "required": false, "type": "integer"}, {"name": "offset", "in": "query", "description": "The initial index from which to return the results.", "required": false, "type": "integer"}], "responses": {"200": {"description": "", "schema": {"required": ["count", "results"], "type": "object", "properties": {"count": {"type": "integer"}, "next": {"type": "string", "format": "uri", "x-nullable": true}, "previous": {"type": "string", "format": "uri", "x-nullable": true}, "results": {"type": "array", "items": {"$ref": "#/definitions/Plan"}}}}}}, "tags": ["plans"]}, "parameters": []}, "/plans/subscribe/": {"post": {"operationId": "plans_subscribe_create", "description": "", "parameters": [{"name": "data", "in": "body", "required": true, "schema": {"$ref": "#/definitions/Subscribe"}}], "responses": {"201": {"description": "", "schema": {"$ref": "#/definitions/Subscribe"}}}, "tags": ["plans"]}, "parameters": []}, "/plans/subscription-history/": {"get": {"operationId": "plans_subscription-history_list", "description": "", "parameters": [{"name": "limit", "in": "query", "description": "Number of results to return per page.", "required": false, "type": "integer"}, {"name": "offset", "in": "query", "description": "The initial index from which to return the results.", "required": false, "type": "integer"}], "responses": {"200": {"description": "", "schema": {"required": ["count", "results"], "type": "object", "properties": {"count": {"type": "integer"}, "next": {"type": "string", "format": "uri", "x-nullable": true}, "previous": {"type": "string", "format": "uri", "x-nullable": true}, "results": {"type": "array", "items": {"$ref": "#/definitions/Subscribe"}}}}}}, "tags": ["plans"]}, "parameters": []}, "/quran-juz/": {"get": {"operationId": "quran-juz_list", "description": "", "parameters": [{"name": "limit", "in": "query", "description": "Number of results to return per page.", "required": false, "type": "integer"}, {"name": "offset", "in": "query", "description": "The initial index from which to return the results.", "required": false, "type": "integer"}], "responses": {"200": {"description": "", "schema": {"required": ["count", "results"], "type": "object", "properties": {"count": {"type": "integer"}, "next": {"type": "string", "format": "uri", "x-nullable": true}, "previous": {"type": "string", "format": "uri", "x-nullable": true}, "results": {"type": "array", "items": {"$ref": "#/definitions/QuranPart"}}}}}}, "tags": ["quran-juz"]}, "parameters": []}, "/quran-page/": {"get": {"operationId": "quran-page_list", "description": "", "parameters": [{"name": "limit", "in": "query", "description": "Number of results to return per page.", "required": false, "type": "integer"}, {"name": "offset", "in": "query", "description": "The initial index from which to return the results.", "required": false, "type": "integer"}], "responses": {"200": {"description": "", "schema": {"required": ["count", "results"], "type": "object", "properties": {"count": {"type": "integer"}, "next": {"type": "string", "format": "uri", "x-nullable": true}, "previous": {"type": "string", "format": "uri", "x-nullable": true}, "results": {"type": "array", "items": {"$ref": "#/definitions/QuranPart"}}}}}}, "tags": ["quran-page"]}, "parameters": []}, "/quran-qaris/": {"get": {"operationId": "quran-qaris_list", "description": "", "parameters": [{"name": "type", "in": "query", "type": "string", "enum": ["reciter", "translation"]}], "responses": {"200": {"description": ""}}, "tags": ["quran-qaris"]}, "parameters": []}, "/quran-qaris/v2/": {"get": {"operationId": "quran-qaris_v2_list", "description": "", "parameters": [{"name": "type", "in": "query", "type": "string", "enum": ["reciter", "translation"]}], "responses": {"200": {"description": ""}}, "tags": ["quran-qaris"]}, "parameters": []}, "/quran-surahs-translation/": {"get": {"operationId": "quran-surahs-translation_list", "description": "", "parameters": [{"name": "limit", "in": "query", "description": "Number of results to return per page.", "required": false, "type": "integer"}, {"name": "offset", "in": "query", "description": "The initial index from which to return the results.", "required": false, "type": "integer"}], "responses": {"200": {"description": "", "schema": {"required": ["count", "results"], "type": "object", "properties": {"count": {"type": "integer"}, "next": {"type": "string", "format": "uri", "x-nullable": true}, "previous": {"type": "string", "format": "uri", "x-nullable": true}, "results": {"type": "array", "items": {"$ref": "#/definitions/QuranSuraTranslation"}}}}}}, "tags": ["quran-surahs-translation"]}, "parameters": []}, "/quran-surahs/": {"get": {"operationId": "quran-surahs_list", "description": "", "parameters": [{"name": "limit", "in": "query", "description": "Number of results to return per page.", "required": false, "type": "integer"}, {"name": "offset", "in": "query", "description": "The initial index from which to return the results.", "required": false, "type": "integer"}], "responses": {"200": {"description": "", "schema": {"required": ["count", "results"], "type": "object", "properties": {"count": {"type": "integer"}, "next": {"type": "string", "format": "uri", "x-nullable": true}, "previous": {"type": "string", "format": "uri", "x-nullable": true}, "results": {"type": "array", "items": {"$ref": "#/definitions/QuranSura"}}}}}}, "tags": ["quran-surahs"]}, "parameters": []}, "/quran-translators/": {"get": {"operationId": "quran-translators_list", "description": "", "parameters": [], "responses": {"200": {"description": "", "schema": {"type": "array", "items": {"$ref": "#/definitions/QuranTranslators"}}}}, "tags": ["quran-translators"]}, "parameters": []}, "/quran-verses-localization/": {"get": {"operationId": "quran-verses-localization_list", "description": "", "parameters": [{"name": "limit", "in": "query", "description": "Number of results to return per page.", "required": false, "type": "integer"}, {"name": "offset", "in": "query", "description": "The initial index from which to return the results.", "required": false, "type": "integer"}, {"name": "translator_en", "in": "query", "type": "string"}], "responses": {"200": {"description": "", "schema": {"required": ["count", "results"], "type": "object", "properties": {"count": {"type": "integer"}, "next": {"type": "string", "format": "uri", "x-nullable": true}, "previous": {"type": "string", "format": "uri", "x-nullable": true}, "results": {"type": "array", "items": {"$ref": "#/definitions/QuranVerseLocalization"}}}}}}, "tags": ["quran-verses-localization"]}, "parameters": []}, "/quran-verses-translation/": {"get": {"operationId": "quran-verses-translation_list", "description": "", "parameters": [{"name": "limit", "in": "query", "description": "Number of results to return per page.", "required": false, "type": "integer"}, {"name": "offset", "in": "query", "description": "The initial index from which to return the results.", "required": false, "type": "integer"}, {"name": "translator_en", "in": "query", "type": "string"}], "responses": {"200": {"description": "", "schema": {"required": ["count", "results"], "type": "object", "properties": {"count": {"type": "integer"}, "next": {"type": "string", "format": "uri", "x-nullable": true}, "previous": {"type": "string", "format": "uri", "x-nullable": true}, "results": {"type": "array", "items": {"$ref": "#/definitions/QuranVerseTranslation"}}}}}}, "tags": ["quran-verses-translation"]}, "parameters": []}, "/quran-verses/": {"get": {"operationId": "quran-verses_list", "description": "", "parameters": [{"name": "limit", "in": "query", "description": "Number of results to return per page.", "required": false, "type": "integer"}, {"name": "offset", "in": "query", "description": "The initial index from which to return the results.", "required": false, "type": "integer"}], "responses": {"200": {"description": "", "schema": {"required": ["count", "results"], "type": "object", "properties": {"count": {"type": "integer"}, "next": {"type": "string", "format": "uri", "x-nullable": true}, "previous": {"type": "string", "format": "uri", "x-nullable": true}, "results": {"type": "array", "items": {"$ref": "#/definitions/QuranVerse"}}}}}}, "tags": ["quran-verses"]}, "parameters": []}, "/quran-word-translation/": {"get": {"operationId": "quran-word-translation_list", "description": "", "parameters": [{"name": "surah_index", "in": "query", "type": "number"}, {"name": "verse_index", "in": "query", "type": "number"}, {"name": "language_code", "in": "query", "type": "string", "default": "en"}], "responses": {"200": {"description": "", "schema": {"type": "array", "items": {"$ref": "#/definitions/QuranWordTranslation"}}}}, "tags": ["quran-word-translation"]}, "parameters": []}, "/religious_times/adhans/": {"get": {"operationId": "religious_times_adhans_list", "description": "adhan list api", "parameters": [{"name": "limit", "in": "query", "description": "Number of results to return per page.", "required": false, "type": "integer"}, {"name": "offset", "in": "query", "description": "The initial index from which to return the results.", "required": false, "type": "integer"}], "responses": {"200": {"description": "", "schema": {"required": ["count", "results"], "type": "object", "properties": {"count": {"type": "integer"}, "next": {"type": "string", "format": "uri", "x-nullable": true}, "previous": {"type": "string", "format": "uri", "x-nullable": true}, "results": {"type": "array", "items": {"$ref": "#/definitions/Adhan"}}}}}}, "tags": ["religious_times"]}, "parameters": []}, "/religious_times/pre-adhans/": {"get": {"operationId": "religious_times_pre-adhans_list", "description": "adhan list api", "parameters": [{"name": "limit", "in": "query", "description": "Number of results to return per page.", "required": false, "type": "integer"}, {"name": "offset", "in": "query", "description": "The initial index from which to return the results.", "required": false, "type": "integer"}], "responses": {"200": {"description": "", "schema": {"required": ["count", "results"], "type": "object", "properties": {"count": {"type": "integer"}, "next": {"type": "string", "format": "uri", "x-nullable": true}, "previous": {"type": "string", "format": "uri", "x-nullable": true}, "results": {"type": "array", "items": {"$ref": "#/definitions/Adhan"}}}}}}, "tags": ["religious_times"]}, "parameters": []}, "/reminders/": {"get": {"operationId": "reminders_list", "summary": "Get list of reminders for the authenticated user.", "description": "### Example JSON Response:\n```json\n{\n \"count\": 10,\n \"next\": \"http://example.com/api/reminders/?page=2\",\n \"previous\": null,\n \"results\": [\n {\n \"id\": 1,\n \"service_name\": \"meet\",\n \"object_id\": \"123\",\n \"text\": \"Don't forget about the meeting tomorrow\",\n \"created_at\": \"2024-01-15T10:30:00Z\",\n \"call_time\": \"2024-01-16T09:00:00Z\",\n \"is_sent\": false,\n \"is_read\": false,\n \"status\": true,\n }\n ]\n}\n```", "parameters": [{"name": "limit", "in": "query", "description": "Number of results to return per page.", "required": false, "type": "integer"}, {"name": "offset", "in": "query", "description": "The initial index from which to return the results.", "required": false, "type": "integer"}, {"name": "service_name", "in": "query", "description": "Filter reminders by service name (e.g., 'meet', 'dua', etc.)", "required": false, "type": "string"}, {"name": "is_sent", "in": "query", "description": "Filter reminders by sent status", "required": false, "type": "boolean"}, {"name": "is_read", "in": "query", "description": "Filter reminders by read status", "required": false, "type": "boolean"}, {"name": "status", "in": "query", "description": "Filter reminders by active status", "required": false, "type": "boolean"}], "responses": {"200": {"description": "List of user reminders", "schema": {"type": "array", "items": {"$ref": "#/definitions/Reminder"}}}}, "tags": ["reminders"]}, "parameters": []}, "/reminders/{id}/": {"put": {"operationId": "reminders_update", "description": "Update reminder status fields (same as PATCH).", "parameters": [{"name": "data", "in": "body", "required": true, "schema": {"$ref": "#/definitions/ReminderUpdate"}}], "responses": {"200": {"description": "", "schema": {"$ref": "#/definitions/ReminderUpdate"}}}, "tags": ["reminders"]}, "patch": {"operationId": "reminders_partial_update", "summary": "Update reminder status fields.", "description": "### Example Request:\n```json\n{\n \"status\": false\n}\n```\n\n### Example Response:\n```json\n{\n\n \"status\": false\n}\n```", "parameters": [{"name": "data", "in": "body", "required": true, "schema": {"description": "At least one field must be provided", "required": [], "type": "object", "properties": {"status": {"description": "General status of the reminder", "type": "boolean"}}}}], "responses": {"200": {"description": "Reminder updated successfully", "schema": {"$ref": "#/definitions/ReminderUpdate"}}, "400": {"description": "Bad request - validation errors"}, "404": {"description": "Reminder not found"}, "403": {"description": "Permission denied - reminder belongs to another user"}}, "tags": ["reminders"]}, "parameters": [{"name": "id", "in": "path", "required": true, "type": "string"}]}, "/report/": {"post": {"operationId": "report_create", "description": "", "parameters": [{"name": "data", "in": "body", "required": true, "schema": {"$ref": "#/definitions/Report"}}], "responses": {"201": {"description": "", "schema": {"$ref": "#/definitions/Report"}}}, "tags": ["report"]}, "parameters": []}, "/report/subjects/": {"get": {"operationId": "report_subjects_list", "description": "", "parameters": [{"name": "limit", "in": "query", "description": "Number of results to return per page.", "required": false, "type": "integer"}, {"name": "offset", "in": "query", "description": "The initial index from which to return the results.", "required": false, "type": "integer"}], "responses": {"200": {"description": "", "schema": {"required": ["count", "results"], "type": "object", "properties": {"count": {"type": "integer"}, "next": {"type": "string", "format": "uri", "x-nullable": true}, "previous": {"type": "string", "format": "uri", "x-nullable": true}, "results": {"type": "array", "items": {"$ref": "#/definitions/Subject"}}}}}}, "tags": ["report"]}, "parameters": []}, "/service-versions/": {"get": {"operationId": "service-versions_list", "description": "\n# 📘 Scenario\nدر حبیب دیتا های بعضی از سرویس ها به صورت یک جا گرفته و ذخیره میشوند سمت کلاینت \nممکن است در مرور زمان این دیتا ها بر اساس محتوا تغییراتی داشته باشند بنابر این\nدر اینجا ما میتوانی به هر سرویس شماره ورژنی اختصاص دهیم بر اساس زبان\n(به طور مثال در احکام زبان فارسی ترجمه ای آپدیت میشود و بایستی داده جدیدی به کاربر نمایش دهیم)\nبنابر این میتوانیم به طور تخمینی یک زمانی را تعیین کنیم که این ای پی ای فراخوانی شود \nو اگر شماره ورژن سرویسی افزایش پیدا کرده بود آن دیتا را مجددا درخواست کنیم \nو بایستی برای هر کلاینت این شماره ورژن های سرویس را ذخیره و در هر بار مقایسه کنیم\n\n---\n\n## 🚀 درخواست API\n\nکاربر باید احراز هویت شده باشد و زبان درخواست از طریق `LANGUAGE_CODE` در تنظیمات کاربر مشخص می‌شود. این API تنها نسخه‌های مرتبط با زبان کاربر را باز می‌گرداند.\n\n\n## 📊 پاسخ‌ها\n\n| کد وضعیت | توضیحات |\n|----------|------------------------------------------------------------|\n| `200` | موفقیت‌آمیز - لیستی از آخرین نسخه‌های سرویس‌ها برمی‌گرداند |\n\n---\n\n## 📄 نمونه پاسخ موفقیت‌آمیز\n\n```json\n[\n {\n \"service\": \"ahkam\",\n \"version_number\": \"1.3\",\n \"language\": {\n \"code\": \"fa\",\n \"name\": \"فارسی\"\n },\n \"created_at\": \"2023-11-01T12:34:56Z\",\n \"app_intros\": [\n {\n \"title\": \"خوش آمدید به سرویس احکام\",\n \"summary\": \"این سرویس شامل احکام شرعی است\",\n \"image\": \"https://example.com/images/intro1.jpg\",\n \"priority\": 1\n },\n {\n \"title\": \"نحوه استفاده\",\n \"summary\": \"برای استفاده از سرویس احکام...\",\n \"image\": \"https://example.com/images/intro2.jpg\",\n \"priority\": 2\n }\n ],\n \"service_intros\": [\n {\n \"title\": \"به‌روزرسانی جدید\",\n \"summary\": \"در این نسخه ویژگی‌های جدیدی اضافه شده است\",\n \"image\": \"https://example.com/images/update1.jpg\",\n \"priority\": 1\n }\n ]\n },\n {\n \"service\": \"quran\",\n \"version_number\": \"2.1\",\n \"language\": {\n \"code\": \"fa\",\n \"name\": \"فارسی\"\n },\n \"created_at\": \"2023-10-20T10:24:36Z\",\n \"app_intros\": [],\n \"service_intros\": []\n }\n]\n```\n\n### 📋 توضیحات فیلدها\n\n| فیلد | نوع | توضیحات |\n|------|-----|---------|\n| `service` | string | شناسه (slug) سرویس |\n| `version_number` | string | شماره نسخه سرویس (مثال: \"1.3\") |\n| `language` | object | اطلاعات زبان شامل `code` و `name` |\n| `created_at` | datetime | تاریخ ایجاد نسخه |\n| `app_intros` | array | لیست اسلایدهای معرفی استاتیک (Onboarding) که برای تمام نسخه‌های سرویس یکسان است |\n| `service_intros` | array | لیست اسلایدهای معرفی مخصوص این نسخه (Update Note) |\n\n### 📝 ساختار هر آیتم در `app_intros` و `service_intros`:\n\n| فیلد | نوع | توضیحات |\n|------|-----|---------|\n| `title` | string | عنوان ترجمه شده بر اساس زبان درخواست |\n| `summary` | string | خلاصه ترجمه شده بر اساس زبان درخواست |\n| `image` | string\\|null | URL تصویر یا null در صورت عدم وجود |\n| `priority` | integer | اولویت نمایش (کمتر = اولویت بیشتر) |\n\n**نکته:** فیلدهای `title` و `summary` به صورت خودکار بر اساس زبان درخواست (`LANGUAGE_CODE`) ترجمه می‌شوند و فقط مقدار ترجمه شده (string) برگردانده می‌شود، نه دیکشنری کامل ترجمه‌ها.\n", "parameters": [{"name": "Authorization", "in": "header", "description": "Bearer token for authentication", "type": "string"}], "responses": {"200": {"description": "", "schema": {"type": "array", "items": {"$ref": "#/definitions/ServiceVersion"}}}}, "tags": ["service-versions"]}, "parameters": []}, "/service-versions/v2/": {"get": {"operationId": "service-versions_v2_list", "description": "\n# 📘 Scenario\nدر حبیب دیتا های بعضی از سرویس ها به صورت یک جا گرفته و ذخیره میشوند سمت کلاینت \nممکن است در مرور زمان این دیتا ها بر اساس محتوا تغییراتی داشته باشند بنابر این\nدر اینجا ما میتوانی به هر سرویس شماره ورژنی اختصاص دهیم بر اساس زبان\n(به طور مثال در احکام زبان فارسی ترجمه ای آپدیت میشود و بایستی داده جدیدی به کاربر نمایش دهیم)\nبنابر این میتوانیم به طور تخمینی یک زمانی را تعیین کنیم که این ای پی ای فراخوانی شود \nو اگر شماره ورژن سرویسی افزایش پیدا کرده بود آن دیتا را مجددا درخواست کنیم \nو بایستی برای هر کلاینت این شماره ورژن های سرویس را ذخیره و در هر بار مقایسه کنیم\n\n---\n\n## 🚀 درخواست API\n\nکاربر باید احراز هویت شده باشد و زبان درخواست از طریق `LANGUAGE_CODE` در تنظیمات کاربر مشخص می‌شود. این API تنها نسخه‌های مرتبط با زبان کاربر را باز می‌گرداند.\n\n\n## 📊 پاسخ‌ها\n\n| کد وضعیت | توضیحات |\n|----------|------------------------------------------------------------|\n| `200` | موفقیت‌آمیز - لیستی از آخرین نسخه‌های سرویس‌ها برمی‌گرداند |\n\n---\n\n## 📄 نمونه پاسخ موفقیت‌آمیز\n\n```json\n[\n {\n \"service\": \"ahkam\",\n \"version_number\": \"1.3\",\n \"language\": {\n \"code\": \"fa\",\n \"name\": \"فارسی\"\n },\n \"created_at\": \"2023-11-01T12:34:56Z\",\n \"app_intros\": [\n {\n \"title\": \"خوش آمدید به سرویس احکام\",\n \"summary\": \"این سرویس شامل احکام شرعی است\",\n \"image\": \"https://example.com/images/intro1.jpg\",\n \"priority\": 1\n },\n {\n \"title\": \"نحوه استفاده\",\n \"summary\": \"برای استفاده از سرویس احکام...\",\n \"image\": \"https://example.com/images/intro2.jpg\",\n \"priority\": 2\n }\n ],\n \"service_intros\": [\n {\n \"title\": \"به‌روزرسانی جدید\",\n \"summary\": \"در این نسخه ویژگی‌های جدیدی اضافه شده است\",\n \"image\": \"https://example.com/images/update1.jpg\",\n \"priority\": 1\n }\n ]\n },\n {\n \"service\": \"quran\",\n \"version_number\": \"2.1\",\n \"language\": {\n \"code\": \"fa\",\n \"name\": \"فارسی\"\n },\n \"created_at\": \"2023-10-20T10:24:36Z\",\n \"app_intros\": [],\n \"service_intros\": []\n }\n]\n```\n\n### 📋 توضیحات فیلدها\n\n| فیلد | نوع | توضیحات |\n|------|-----|---------|\n| `service` | string | شناسه (slug) سرویس |\n| `version_number` | string | شماره نسخه سرویس (مثال: \"1.3\") |\n| `language` | object | اطلاعات زبان شامل `code` و `name` |\n| `created_at` | datetime | تاریخ ایجاد نسخه |\n| `app_intros` | array | لیست اسلایدهای معرفی استاتیک (Onboarding) که برای تمام نسخه‌های سرویس یکسان است |\n| `service_intros` | array | لیست اسلایدهای معرفی مخصوص این نسخه (Update Note) |\n\n### 📝 ساختار هر آیتم در `app_intros` و `service_intros`:\n\n| فیلد | نوع | توضیحات |\n|------|-----|---------|\n| `title` | string | عنوان ترجمه شده بر اساس زبان درخواست |\n| `summary` | string | خلاصه ترجمه شده بر اساس زبان درخواست |\n| `image` | string\\|null | URL تصویر یا null در صورت عدم وجود |\n| `priority` | integer | اولویت نمایش (کمتر = اولویت بیشتر) |\n\n**نکته:** فیلدهای `title` و `summary` به صورت خودکار بر اساس زبان درخواست (`LANGUAGE_CODE`) ترجمه می‌شوند و فقط مقدار ترجمه شده (string) برگردانده می‌شود، نه دیکشنری کامل ترجمه‌ها.\n", "parameters": [{"name": "Authorization", "in": "header", "description": "Bearer token for authentication", "type": "string"}], "responses": {"200": {"description": "Service versions with startup modal", "schema": {"type": "object", "properties": {"versions": {"type": "array", "items": {"type": "object"}}, "startup_modal": {"type": "object", "properties": {"id": {"type": "integer"}, "html_content": {"description": "Rendered HTML form content", "type": "string"}, "width_percentage": {"description": "Modal width in percentage", "type": "integer"}, "height_percentage": {"description": "Modal height in percentage", "type": "integer"}, "is_forced": {"type": "boolean"}}, "nullable": true}}}}}, "tags": ["service-versions"]}, "parameters": []}, "/share-app/": {"get": {"operationId": "share-app_read", "description": "", "parameters": [], "responses": {"200": {"description": "", "schema": {"$ref": "#/definitions/ShareApp"}}}, "tags": ["share-app"]}, "parameters": []}, "/tafsir/book/{book}/{surah}/{verse}/": {"get": {"operationId": "tafsir_book_read", "description": "", "parameters": [], "responses": {"200": {"description": "", "schema": {"$ref": "#/definitions/TafsirVerses"}}}, "tags": ["tafsir"]}, "parameters": [{"name": "book", "in": "path", "required": true, "type": "string"}, {"name": "surah", "in": "path", "required": true, "type": "string"}, {"name": "verse", "in": "path", "required": true, "type": "string"}]}, "/tafsir/books/": {"get": {"operationId": "tafsir_books_list", "description": "", "parameters": [], "responses": {"200": {"description": "", "schema": {"type": "array", "items": {"$ref": "#/definitions/TafsirBook"}}}}, "tags": ["tafsir"]}, "parameters": []}, "/upload-tmp-media/": {"post": {"operationId": "upload-tmp-media_create", "description": "upload file...", "parameters": [{"name": "file", "in": "formData", "required": true, "type": "file"}], "responses": {"200": {"description": "", "schema": {"type": "object", "properties": {"success": {"type": "boolean", "default": true}, "path": {"description": "url path of file", "type": "string"}, "apath": {"description": "absolute path of file", "type": "string"}, "name": {"type": "string"}, "size": {"type": "string"}}}}, "400": {"description": "", "schema": {"type": "object", "properties": {"success": {"type": "boolean", "default": false}, "reason": {"type": "string"}}}}}, "consumes": ["multipart/form-data"], "tags": ["upload-tmp-media"]}, "parameters": []}, "/v1/languages/": {"get": {"operationId": "v1_languages_list", "description": "language list api", "parameters": [], "responses": {"200": {"description": "", "schema": {"type": "array", "items": {"$ref": "#/definitions/Language"}}}}, "tags": ["v1"]}, "parameters": []}, "/wallet/info/": {"get": {"operationId": "wallet_info_list", "description": "Retrieve wallet details for the authenticated user, including balance in coins and USD", "parameters": [], "responses": {"200": {"description": "Wallet details", "examples": {"application/json": {"id": 1, "currency": "USD", "balance_coin_count": 100, "balance_amount": 10.0, "coin_amount": {"coin": 10, "amount": 1.0}}}}, "400": {"description": "User does not have any active publishers."}, "404": {"description": "Wallet not found."}}, "tags": ["wallet"]}, "parameters": []}, "/wallet/transactions/": {"get": {"operationId": "wallet_transactions_list", "description": "List all income transactions", "parameters": [{"name": "limit", "in": "query", "description": "Number of results to return per page.", "required": false, "type": "integer"}, {"name": "offset", "in": "query", "description": "The initial index from which to return the results.", "required": false, "type": "integer"}], "responses": {"200": {"description": "", "schema": {"type": "array", "items": {"$ref": "#/definitions/Transaction"}}}}, "tags": ["wallet"]}, "parameters": []}, "/wallet/wallet/withdrawal-requests/create/": {"post": {"operationId": "wallet_wallet_withdrawal-requests_create_create", "description": "Creates a withdrawal request for the authenticated user.", "parameters": [{"name": "data", "in": "body", "required": true, "schema": {"required": ["coin_count"], "type": "object", "properties": {"coin_count": {"description": "Number of coins to withdraw", "type": "integer"}}}}], "responses": {"201": {"description": "Withdrawal request created successfully", "examples": {"application/json": {"detail": "Withdrawal request created successfully.", "request_id": 1, "status": "pending", "amount": 5.0, "coin_count": 50, "currency": "USD"}}}, "400": {"description": "Bad request due to validation error or insufficient balance", "examples": {"application/json": {"detail": "Insufficient balance to create debit request."}}}, "404": {"description": "Wallet not found", "examples": {"application/json": {"detail": "User does not have a wallet."}}}}, "tags": ["wallet"]}, "parameters": []}, "/wallet/withdrawal-requests/": {"get": {"operationId": "wallet_withdrawal-requests_list", "description": "List all withdrawal requests for the authenticated user", "parameters": [{"name": "limit", "in": "query", "description": "Number of results to return per page.", "required": false, "type": "integer"}, {"name": "offset", "in": "query", "description": "The initial index from which to return the results.", "required": false, "type": "integer"}], "responses": {"200": {"description": "", "schema": {"type": "array", "items": {"$ref": "#/definitions/WithdrawalRequest"}}}}, "tags": ["wallet"]}, "parameters": []}, "/web/donate/v2/": {"get": {"operationId": "web_donate_v2_list", "description": "", "parameters": [{"name": "limit", "in": "query", "description": "Number of results to return per page.", "required": false, "type": "integer"}, {"name": "offset", "in": "query", "description": "The initial index from which to return the results.", "required": false, "type": "integer"}], "responses": {"200": {"description": ""}}, "tags": ["web"]}, "parameters": []}, "/web/donate/v2/create/": {"post": {"operationId": "web_donate_v2_create_create", "description": "\n**Donation Creation API**\n\nCreate a donation record and receive a payment link. This API is designed to never fail and always returns a working donation link without any errors.\n\n**Key Features:**\n- Error-free operation - never returns HTTP errors\n- All fields are completely optional with intelligent defaults\n- Automatic payment method selection based on user location\n- Support for multiple payment gateways\n- Backward compatibility with existing integrations\n\n**Smart Defaults:**\n- **donate_type**: Defaults to 'once' if not provided or invalid\n- **price**: Defaults to '10.00' if not provided or invalid\n- **id**: Auto-selected based on user location (CloudTips for Russian users, Stripe for others)\n- **phone_number**: Optional field, stored if provided, otherwise null\n\n**Payment Methods:**\n- **Stripe**: International payment gateway with predefined donation links\n- **CloudTips**: Russian payment gateway for Russian users\n\n**Localization Logic:**\n- Russian users (language_code=ru OR user.country=RU) default to CloudTips\n- All other users default to Stripe payment gateway\n- Fallback to default donation links for custom amounts\n\n**Business Logic:**\n- Creates donation record in database (optional, doesn't affect response)\n- Optionally stores donor's phone number for contact purposes\n- Maps donation amounts to predefined Stripe payment links\n- Uses fallback links for unmapped amounts\n- Always returns HTTP 200 with working payment link\n\n**Authentication**: Not required - Public API\n**Permissions**: None - Accessible to all users\n", "parameters": [{"name": "data", "in": "body", "required": true, "schema": {"required": [], "type": "object", "properties": {"donate_type": {"description": "Type of donation - either 'monthly' for recurring donations or 'once' for one-time donations. This field is completely optional and will default to 'once' if not provided or if an invalid value is sent.", "type": "string", "enum": ["monthly", "once"]}, "price": {"description": "Donation amount as a string (e.g., '5.00', '10.00', '20.00'). This field is completely optional and will default to '10.00' if not provided or if an invalid value is sent.", "type": "string"}, "id": {"description": "Payment gateway identifier. This field is completely optional. If not provided, the system will automatically choose 'stripe' for non-Russian users and 'cloudtips' for Russian users (detected by language_code=ru or user country=RU). If an invalid value is provided, it defaults to 'stripe'.", "type": "string", "enum": ["stripe", "cloudtips"]}, "phone_number": {"description": "Optional phone number for the donor. This field is completely optional and can be omitted. If provided, it will be stored with the donation record.", "type": "string"}}, "example": {"donate_type": "once", "price": "15.00", "id": "stripe", "phone_number": "+1234567890"}}}], "responses": {"200": {"description": "Donation link created successfully. This API is guaranteed to always return HTTP 200 status with a working donation link, regardless of the input provided. Even if no data is sent in the request body, the API will respond with appropriate defaults.", "examples": {"application/json": {"complete_request": {"summary": "Complete Request with Phone Number", "description": "Response when all fields including phone_number are provided", "value": {"donate_user": 1, "donate_link": "https://donate.stripe.com/bIYdSDgiK7Pwh0ccMN"}}, "request_with_phone": {"summary": "Request Example with Phone", "description": "Example showing phone_number parameter usage", "value": {"donate_user": 1, "donate_link": "https://donate.stripe.com/9AQ01N5E68TAbFS002"}}, "empty_request_default": {"summary": "Empty Request (Default)", "description": "Response when no fields are provided - uses intelligent defaults", "value": {"donate_user": 1, "donate_link": "https://donate.stripe.com/7sI3dZaYq7Pw9xKcMV"}}, "empty_request_russian_user": {"summary": "Empty Request (Russian User)", "description": "Response for Russian users when no fields are provided", "value": {"donate_user": 1, "donate_link": "https://pay.cloudtips.ru/p/d5881ddf"}}, "cloudtips_payment": {"summary": "CloudTips Payment", "description": "Response when CloudTips payment method is selected", "value": {"donate_user": 1, "donate_link": "https://pay.cloudtips.ru/p/d5881ddf"}}, "invalid_data_fallback": {"summary": "Invalid Data Fallback", "description": "Response when invalid data is provided - normalized to defaults", "value": {"donate_user": 1, "donate_link": "https://donate.stripe.com/7sI3dZaYq7Pw9xKcMV"}}}}}}, "tags": ["Donate"]}, "parameters": []}, "/web/duas/robots.txt": {"get": {"operationId": "web_duas_robots.txt_list", "description": "", "parameters": [], "responses": {"200": {"description": ""}}, "tags": ["web"]}, "parameters": []}, "/web/duas/{slug}/complete/": {"get": {"operationId": "web_duas_complete_read", "description": "دریافت کامل یک دعا با تمام بخش‌ها (بدون pagination) برای استفاده آفلاین", "parameters": [{"name": "slug", "in": "path", "description": "Slug دعا", "required": true, "type": "string"}], "responses": {"200": {"description": "", "schema": {"$ref": "#/definitions/DuaCompleteSerializer"}}, "404": {"description": "دعا یافت نشد"}}, "tags": ["web"]}, "parameters": [{"name": "slug", "in": "path", "required": true, "type": "string"}]}, "/web/mafatih-categories/": {"get": {"operationId": "web_mafatih-categories_list", "description": "", "parameters": [{"name": "language_code", "in": "query", "type": "string"}], "responses": {"200": {"description": "", "schema": {"type": "array", "items": {"$ref": "#/definitions/Web_DuaCategoriesSerializer"}}}}, "tags": ["web"]}, "parameters": []}, "/web/mafatih-duas/": {"get": {"operationId": "web_mafatih-duas_list", "description": "", "parameters": [{"name": "page", "in": "query", "description": "A page number within the paginated result set.", "required": false, "type": "integer"}, {"name": "category", "in": "query", "description": "ID دسته‌بندی برای فیلتر دعاها", "type": "integer"}, {"name": "search", "in": "query", "description": "جستجو بر اساس عنوان دعاها", "type": "string"}, {"name": "today", "in": "query", "description": "", "type": "string"}, {"name": "famous", "in": "query", "description": "", "type": "string"}, {"name": "lat", "in": "query", "description": "Latitude of the location lat = {Mashhad : 36.2605, Karbala : 32.6160326} ", "type": "number"}, {"name": "lon", "in": "query", "description": "Longitude of the location lon = {Mashhad : 59.6168, Karbala : 44.0244229} ", "type": "number"}, {"name": "not_synced", "in": "query", "description": "", "type": "boolean"}], "responses": {"200": {"description": "", "schema": {"required": ["count", "results"], "type": "object", "properties": {"count": {"type": "integer"}, "next": {"type": "string", "format": "uri", "x-nullable": true}, "previous": {"type": "string", "format": "uri", "x-nullable": true}, "results": {"type": "array", "items": {"$ref": "#/definitions/Web_DuaSerializer"}}}}}}, "tags": ["web"]}, "parameters": []}, "/web/mafatih-duas/dhikrs/": {"get": {"operationId": "web_mafatih-duas_dhikrs_list", "description": "", "parameters": [], "responses": {"200": {"description": ""}}, "tags": ["web"]}, "parameters": []}, "/web/mafatih-duas/{id}/parts/": {"get": {"operationId": "web_mafatih-duas_parts_list", "description": "", "parameters": [{"name": "limit", "in": "query", "description": "Number of results to return per page.", "required": false, "type": "integer"}, {"name": "offset", "in": "query", "description": "The initial index from which to return the results.", "required": false, "type": "integer"}], "responses": {"200": {"description": "", "schema": {"required": ["count", "results"], "type": "object", "properties": {"count": {"type": "integer"}, "next": {"type": "string", "format": "uri", "x-nullable": true}, "previous": {"type": "string", "format": "uri", "x-nullable": true}, "results": {"type": "array", "items": {"$ref": "#/definitions/Web_DuaPartSerializer"}}}}}}, "tags": ["web"]}, "parameters": [{"name": "id", "in": "path", "required": true, "type": "string"}]}, "/web/mafatih-duas/{slug}/parts/": {"get": {"operationId": "web_mafatih-duas_parts_list", "description": "", "parameters": [{"name": "limit", "in": "query", "description": "Number of results to return per page.", "required": false, "type": "integer"}, {"name": "offset", "in": "query", "description": "The initial index from which to return the results.", "required": false, "type": "integer"}], "responses": {"200": {"description": "", "schema": {"required": ["count", "results"], "type": "object", "properties": {"count": {"type": "integer"}, "next": {"type": "string", "format": "uri", "x-nullable": true}, "previous": {"type": "string", "format": "uri", "x-nullable": true}, "results": {"type": "array", "items": {"$ref": "#/definitions/Web_DuaPartSerializer"}}}}}}, "tags": ["web"]}, "parameters": [{"name": "slug", "in": "path", "required": true, "type": "string"}]}, "/web/mafatih/{id}/audios/": {"get": {"operationId": "web_mafatih_audios_list", "description": "", "parameters": [{"name": "page", "in": "query", "description": "A page number within the paginated result set.", "required": false, "type": "integer"}], "responses": {"200": {"description": "", "schema": {"required": ["count", "results"], "type": "object", "properties": {"count": {"type": "integer"}, "next": {"type": "string", "format": "uri", "x-nullable": true}, "previous": {"type": "string", "format": "uri", "x-nullable": true}, "results": {"type": "array", "items": {"$ref": "#/definitions/WebDuaAudio"}}}}}}, "tags": ["web"]}, "parameters": [{"name": "id", "in": "path", "required": true, "type": "string"}]}, "/web/mafatih/{id}/reciters/": {"get": {"operationId": "web_mafatih_reciters_list", "description": "", "parameters": [{"name": "limit", "in": "query", "description": "Number of results to return per page.", "required": false, "type": "integer"}, {"name": "offset", "in": "query", "description": "The initial index from which to return the results.", "required": false, "type": "integer"}], "responses": {"200": {"description": "", "schema": {"required": ["count", "results"], "type": "object", "properties": {"count": {"type": "integer"}, "next": {"type": "string", "format": "uri", "x-nullable": true}, "previous": {"type": "string", "format": "uri", "x-nullable": true}, "results": {"type": "array", "items": {"$ref": "#/definitions/DuaReciter"}}}}}}, "tags": ["web"]}, "parameters": [{"name": "id", "in": "path", "required": true, "type": "string"}]}, "/web/mafatih/{slug}/audios/": {"get": {"operationId": "web_mafatih_audios_list", "description": "", "parameters": [{"name": "page", "in": "query", "description": "A page number within the paginated result set.", "required": false, "type": "integer"}], "responses": {"200": {"description": "", "schema": {"required": ["count", "results"], "type": "object", "properties": {"count": {"type": "integer"}, "next": {"type": "string", "format": "uri", "x-nullable": true}, "previous": {"type": "string", "format": "uri", "x-nullable": true}, "results": {"type": "array", "items": {"$ref": "#/definitions/WebDuaAudio"}}}}}}, "tags": ["web"]}, "parameters": [{"name": "slug", "in": "path", "required": true, "type": "string"}]}, "/web/mafatih/{slug}/reciters/": {"get": {"operationId": "web_mafatih_reciters_list", "description": "", "parameters": [{"name": "limit", "in": "query", "description": "Number of results to return per page.", "required": false, "type": "integer"}, {"name": "offset", "in": "query", "description": "The initial index from which to return the results.", "required": false, "type": "integer"}], "responses": {"200": {"description": "", "schema": {"required": ["count", "results"], "type": "object", "properties": {"count": {"type": "integer"}, "next": {"type": "string", "format": "uri", "x-nullable": true}, "previous": {"type": "string", "format": "uri", "x-nullable": true}, "results": {"type": "array", "items": {"$ref": "#/definitions/DuaReciter"}}}}}}, "tags": ["web"]}, "parameters": [{"name": "slug", "in": "path", "required": true, "type": "string"}]}, "/web/quran-qaris/": {"get": {"operationId": "web_quran-qaris_list", "description": "", "parameters": [{"name": "type", "in": "query", "type": "string", "enum": ["reciter", "translation"]}], "responses": {"200": {"description": ""}}, "tags": ["web"]}, "parameters": []}, "/web/quran-surah/{surah_id}/": {"get": {"operationId": "web_quran-surah_read", "description": "API view that returns all verses from a specific Surah with translations\nbased on the language_code query parameter", "parameters": [{"name": "limit", "in": "query", "description": "Number of results to return per page.", "required": false, "type": "integer"}, {"name": "offset", "in": "query", "description": "The initial index from which to return the results.", "required": false, "type": "integer"}, {"name": "language_code", "in": "query", "type": "string", "default": "en"}], "responses": {"200": {"description": "", "schema": {"required": ["count", "results"], "type": "object", "properties": {"count": {"type": "integer"}, "next": {"type": "string", "format": "uri", "x-nullable": true}, "previous": {"type": "string", "format": "uri", "x-nullable": true}, "results": {"type": "array", "items": {"$ref": "#/definitions/QuranSurahDetailVerse"}}}}}}, "tags": ["web"]}, "parameters": [{"name": "surah_id", "in": "path", "required": true, "type": "string"}]}}, "definitions": {"Supporter": {"required": ["title"], "type": "object", "properties": {"title": {"title": "Title", "type": "string", "maxLength": 255, "minLength": 1}, "url": {"title": "Url", "description": "https://example.com", "type": "string", "maxLength": 255, "x-nullable": true}, "logo": {"title": "Logo", "type": "string", "readOnly": true}}}, "AboutService": {"required": ["description", "language", "service", "supporters"], "type": "object", "properties": {"description": {"title": "Description", "type": "string", "minLength": 1}, "language": {"title": "Language", "type": "string", "minLength": 1}, "service": {"title": "Service", "type": "string", "enum": ["main", "hussainiyah", "quran", "mafatih", "qiblah", "ahkam", "calendar", "talk", "meet", "library", "hadis", "account"]}, "supporters": {"type": "array", "items": {"$ref": "#/definitions/Supporter"}}}}, "Activity": {"required": ["usage_duration"], "type": "object", "properties": {"service": {"title": "Service", "type": "string", "maxLength": 100, "x-nullable": true}, "usage_duration": {"title": "Usage duration", "type": "string"}, "entered_at": {"title": "Entered at", "type": "string", "format": "date-time"}, "additional_info": {"title": "Additional info", "type": "object"}}}, "AppleAuth": {"required": ["id_token", "server_auth_token", "mobile_device_id"], "type": "object", "properties": {"id_token": {"title": "Id token", "type": "string", "maxLength": 9000, "minLength": 1}, "server_auth_token": {"title": "Server auth token", "type": "string", "maxLength": 9000, "minLength": 1}, "mobile_device_id": {"title": "Mobile device id", "type": "string", "maxLength": 255, "minLength": 1}, "name": {"title": "Name", "type": "string", "maxLength": 255, "x-nullable": true}, "avatar": {"title": "~ Avatar", "type": "string", "x-nullable": true}, "fcm": {"title": "Fcm", "type": "string", "x-nullable": true}, "publisher_in": {"title": "Publisher in", "type": "string", "readOnly": true}, "token": {"title": "Token", "type": "string", "readOnly": true, "minLength": 1}}}, "GoogleAuth": {"required": ["email", "name", "mobile_device_id", "server_auth_token", "id_token"], "type": "object", "properties": {"email": {"title": "Email", "type": "string", "x-nullable": true}, "name": {"title": "Name", "type": "string", "maxLength": 255, "x-nullable": true}, "mobile_device_id": {"title": "Mobile device id", "type": "string", "maxLength": 500, "x-nullable": true}, "avatar": {"title": "~ Avatar", "type": "string", "x-nullable": true}, "server_auth_token": {"title": "Server auth token", "type": "string", "maxLength": 9000, "minLength": 1}, "id_token": {"title": "Id token", "type": "string", "maxLength": 9000, "minLength": 1}, "fcm": {"title": "Fcm", "type": "string", "x-nullable": true}, "publisher_in": {"title": "Publisher in", "type": "string", "readOnly": true}}}, "GuestUser": {"required": ["mobile_device_id"], "type": "object", "properties": {"lat": {"title": "Lat", "type": "string", "maxLength": 255, "x-nullable": true}, "lon": {"title": "Lon", "type": "string", "maxLength": 255, "x-nullable": true}, "mobile_device_id": {"title": "Mobile device id", "type": "string", "x-nullable": true}, "language": {"title": "Language", "type": "string", "x-nullable": true}, "cpu_type": {"title": "Cpu type", "type": "string", "maxLength": 64, "x-nullable": true}, "model_name": {"title": "Model name", "type": "string", "maxLength": 120, "x-nullable": true}, "os_platform": {"title": "Os platform", "type": "string", "maxLength": 120, "x-nullable": true}, "screen_size": {"title": "Screen size", "type": "string", "maxLength": 120, "x-nullable": true}, "device_brand": {"title": "Device brand", "type": "string", "maxLength": 120, "x-nullable": true}, "timezone": {"title": "Timezone", "type": "string", "x-nullable": true}, "api_version": {"title": "Api version", "type": "string", "x-nullable": true}, "fcm": {"title": "Firebase token", "type": "string", "maxLength": 255, "x-nullable": true}, "location_method": {"title": "Location method", "type": "string", "x-nullable": true}}}, "PhoneAuth": {"required": ["phone_number", "mobile_device_id"], "type": "object", "properties": {"phone_number": {"title": "Phone number", "type": "string", "maxLength": 254, "x-nullable": true}, "lat": {"title": "Lat", "type": "string", "maxLength": 255, "x-nullable": true}, "lon": {"title": "Lon", "type": "string", "maxLength": 255, "x-nullable": true}, "mobile_device_id": {"title": "Mobile device id", "type": "string", "maxLength": 500, "x-nullable": true}, "cpu_type": {"title": "Cpu type", "type": "string", "maxLength": 64, "x-nullable": true}, "model_name": {"title": "Model name", "type": "string", "maxLength": 120, "x-nullable": true}, "os_platform": {"title": "Os platform", "type": "string", "maxLength": 120, "x-nullable": true}, "screen_size": {"title": "Screen size", "type": "string", "maxLength": 120, "x-nullable": true}, "device_brand": {"title": "Device brand", "type": "string", "maxLength": 120, "x-nullable": true}, "timezone": {"title": "Timezone", "type": "string", "x-nullable": true}, "api_version": {"title": "Api version", "type": "string", "x-nullable": true}, "fcm": {"title": "Fcm", "type": "string", "x-nullable": true}, "location_method": {"title": "Location method", "type": "string", "x-nullable": true}}}, "MergeAccount": {"required": ["method", "value"], "type": "object", "properties": {"method": {"title": "Method", "type": "string", "enum": ["phone", "email"]}, "value": {"title": "Value", "type": "string", "minLength": 1}}}, "MergeVerify": {"required": ["phone_number", "code"], "type": "object", "properties": {"phone_number": {"title": "Phone number", "type": "string", "minLength": 1}, "code": {"title": "Code", "type": "string", "minLength": 1}}}, "UserProfile": {"type": "object", "properties": {"name": {"title": "Name", "type": "string", "minLength": 1}, "avatar": {"title": "Avatar", "type": "string", "x-nullable": true}, "email": {"title": "Email", "type": "string", "format": "email", "readOnly": true, "minLength": 1}, "phone_number": {"title": "Phone number", "type": "string", "readOnly": true, "minLength": 1}}}, "PhoneVerify": {"required": ["phone_number", "user_id", "code"], "type": "object", "properties": {"phone_number": {"title": "Phone number", "type": "string", "maxLength": 254, "x-nullable": true}, "user_id": {"title": "User id", "type": "string", "maxLength": 10, "minLength": 1}, "code": {"title": "Code", "type": "string", "maxLength": 5, "minLength": 1}}}, "IPGeolocation": {"type": "object", "properties": {"ip": {"title": "Ip", "type": "string", "readOnly": true, "minLength": 1}, "country": {"title": "Country", "type": "string", "readOnly": true, "maxLength": 100, "x-nullable": true}, "country_code": {"title": "Country code", "type": "string", "readOnly": true, "maxLength": 10, "x-nullable": true}, "city": {"title": "City", "type": "string", "readOnly": true, "maxLength": 100, "x-nullable": true}, "latitude": {"title": "Latitude", "type": "number", "readOnly": true, "x-nullable": true}, "longitude": {"title": "Longitude", "type": "number", "readOnly": true, "x-nullable": true}, "accuracy_radius": {"title": "Accuracy radius", "type": "integer", "readOnly": true, "x-nullable": true}, "time_zone": {"title": "Time zone", "type": "string", "readOnly": true, "maxLength": 100, "x-nullable": true}, "postal_code": {"title": "Postal code", "type": "string", "readOnly": true, "maxLength": 20, "x-nullable": true}}}, "ReverseGeolocationResponse": {"type": "object", "properties": {"latitude": {"title": "Latitude", "type": "number", "readOnly": true}, "longitude": {"title": "Longitude", "type": "number", "readOnly": true}, "city": {"title": "City", "type": "string", "readOnly": true, "maxLength": 100, "minLength": 1, "x-nullable": true}, "country": {"title": "Country", "type": "string", "readOnly": true, "maxLength": 100, "minLength": 1, "x-nullable": true}, "country_code": {"title": "Country code", "type": "string", "readOnly": true, "maxLength": 10, "minLength": 1, "x-nullable": true}, "accuracy_radius": {"title": "Accuracy radius", "type": "integer", "readOnly": true, "x-nullable": true}, "time_zone": {"title": "Time zone", "type": "string", "readOnly": true, "maxLength": 100, "x-nullable": true}, "postal_code": {"title": "Postal code", "type": "string", "readOnly": true, "maxLength": 20, "x-nullable": true}}}, "LocationHistory": {"required": ["lat", "lon"], "type": "object", "properties": {"id": {"title": "ID", "type": "integer", "readOnly": true}, "lat": {"title": "Lat", "type": "number"}, "lon": {"title": "Lon", "type": "number"}, "country": {"title": "Country", "type": "string", "maxLength": 255, "x-nullable": true}, "city": {"title": "City", "type": "string", "maxLength": 255, "x-nullable": true}, "selected_manually": {"title": "Selected manually", "type": "boolean", "x-nullable": true}, "ip": {"title": "Ip", "type": "string", "maxLength": 255, "minLength": 1, "x-nullable": true}, "timezone": {"title": "Timezone", "type": "string", "maxLength": 60, "x-nullable": true}}}, "UserNotification": {"required": ["service", "title", "message"], "type": "object", "properties": {"id": {"title": "ID", "type": "integer", "readOnly": true}, "service": {"title": "Service", "type": "string", "minLength": 1}, "title": {"title": "Title", "type": "string", "minLength": 1}, "message": {"title": "Message", "type": "string", "minLength": 1}, "data": {"title": "Data", "type": "string", "readOnly": true}, "image": {"title": "Image", "type": "string", "readOnly": true}, "is_read": {"title": "Is Read", "type": "boolean"}, "created_at": {"title": "Created At", "type": "string", "format": "date-time", "readOnly": true}, "notif_data": {"title": "Notif data", "type": "string", "readOnly": true}}}, "Provider": {"required": ["public_name", "description", "service", "birthdate", "phone_number", "wa_number"], "type": "object", "properties": {"public_name": {"title": "Public name", "type": "string", "maxLength": 255, "minLength": 1}, "description": {"title": "Description", "type": "string", "minLength": 1}, "service": {"title": "Service", "type": "string", "enum": ["hussainiya", "net", "library", "talk", "shop", "travel", "meet", "habibnet"]}, "birthdate": {"title": "Birthdate", "type": "string", "format": "date"}, "phone_number": {"title": "Phone number", "type": "string", "minLength": 1}, "wa_number": {"title": "Wa number", "type": "string", "minLength": 1}, "social_medias": {"title": "Social medias", "description": "[{\"type\": \"instagram\", \"link\": \"https://www.instagram.com\"}]", "type": "object", "default": []}, "status": {"title": "Status", "type": "string", "enum": ["pending", "rejected", "accepted"], "readOnly": true}}}, "UserSettings": {"type": "object", "properties": {"settings": {"title": "Settings", "type": "string", "x-nullable": true}, "is_reminder": {"title": "Reminder Active", "type": "boolean"}, "notification_settings": {"description": "List of notification services: hussainiyah, meet, talk, library", "type": "array", "items": {"type": "string", "minLength": 1}, "default": ["hussainiyah", "meet", "talk", "library"]}}}, "ReviewList": {"required": ["platform", "review_id", "last_modified_ts", "app_identifier"], "type": "object", "properties": {"id": {"title": "ID", "type": "integer", "readOnly": true}, "platform": {"title": "Platform", "type": "string", "enum": ["google_play", "app_store", "whatsapp", "telegram", "habib_talk"]}, "review_id": {"title": "Review id", "type": "string", "maxLength": 255, "minLength": 1}, "author_name": {"title": "Author name", "type": "string", "maxLength": 255, "x-nullable": true}, "text": {"title": "Text", "type": "string"}, "review_status": {"title": "Review status", "type": "string", "enum": ["pending", "responded", "escalated", "resolved"]}, "needs_human_intervention": {"title": "Needs human intervention", "type": "boolean"}, "last_modified_ts": {"title": "Last modified ts", "type": "integer", "maximum": 9223372036854775807, "minimum": -9223372036854775808}, "created_at": {"title": "Created at", "type": "string", "format": "date-time", "readOnly": true}, "user_identifier": {"title": "User identifier", "description": "Phone number for WhatsApp, Chat ID for Telegram, etc.", "type": "string", "maxLength": 255}, "app_identifier": {"title": "App identifier", "description": "Package name, bundle ID یا شناسه کانال/گروه بسته به پلتفرم", "type": "string", "maxLength": 255, "minLength": 1}, "rating": {"title": "Rating", "type": "integer", "maximum": 32767, "minimum": 0, "x-nullable": true}}}, "ReviewDetail": {"required": ["platform", "app_identifier", "review_id", "last_modified_ts"], "type": "object", "properties": {"id": {"title": "ID", "type": "integer", "readOnly": true}, "platform": {"title": "Platform", "type": "string", "enum": ["google_play", "app_store", "whatsapp", "telegram", "habib_talk"]}, "app_identifier": {"title": "App identifier", "description": "Package name, bundle ID یا شناسه کانال/گروه بسته به پلتفرم", "type": "string", "maxLength": 255, "minLength": 1}, "user_identifier": {"title": "User identifier", "description": "Phone number for WhatsApp, Chat ID for Telegram, etc.", "type": "string", "maxLength": 255}, "review_id": {"title": "Review id", "type": "string", "maxLength": 255, "minLength": 1}, "author_name": {"title": "Author name", "type": "string", "maxLength": 255, "x-nullable": true}, "rating": {"title": "Rating", "type": "integer", "maximum": 32767, "minimum": 0, "x-nullable": true}, "title": {"title": "Title", "type": "string", "maxLength": 255}, "text": {"title": "Text", "type": "string"}, "device": {"title": "Device", "type": "string", "maxLength": 255}, "reviewer_language": {"title": "Reviewer language", "type": "string", "maxLength": 10}, "android_os_version": {"title": "Android os version", "type": "integer", "maximum": 32767, "minimum": 0, "x-nullable": true}, "app_version_code": {"title": "App version code", "type": "integer", "maximum": 2147483647, "minimum": 0, "x-nullable": true}, "app_version_name": {"title": "App version name", "type": "string", "maxLength": 50}, "device_product_name": {"title": "Device product name", "type": "string", "maxLength": 255}, "device_manufacturer": {"title": "Device manufacturer", "type": "string", "maxLength": 100}, "device_class": {"title": "Device class", "type": "string", "maxLength": 50}, "screen_width_px": {"title": "Screen width px", "type": "integer", "maximum": 2147483647, "minimum": 0, "x-nullable": true}, "screen_height_px": {"title": "Screen height px", "type": "integer", "maximum": 2147483647, "minimum": 0, "x-nullable": true}, "screen_density_dpi": {"title": "Screen density dpi", "type": "integer", "maximum": 2147483647, "minimum": 0, "x-nullable": true}, "ram_mb": {"title": "Ram mb", "type": "integer", "maximum": 2147483647, "minimum": 0, "x-nullable": true}, "last_modified_ts": {"title": "Last modified ts", "type": "integer", "maximum": 9223372036854775807, "minimum": -9223372036854775808}, "raw_data": {"title": "Raw data", "type": "object", "x-nullable": true}, "sent_to_telegram": {"title": "Sent to telegram", "type": "boolean"}, "category": {"title": "Category", "type": "string", "enum": ["appreciation", "inspiring", "feature_request", "bug_report", "account_issue", "financial_issue", "content_complaint", "critical", "general_question", "spam", "other"]}, "review_status": {"title": "Review status", "type": "string", "enum": ["pending", "responded", "escalated", "resolved"]}, "needs_human_intervention": {"title": "Needs human intervention", "type": "boolean"}, "prevent_auto_reply": {"title": "غیرفعال‌سازی پاسخ خودکار (بلاک مکالمه اتوماتیک)", "type": "boolean"}, "conversation_history": {"title": "Conversation history", "description": "List of message dicts for this user's entire conversation", "type": "object"}, "created_at": {"title": "Created at", "type": "string", "format": "date-time", "readOnly": true}}}, "talk_provider_profile": {"required": ["languages", "avatar"], "type": "object", "properties": {"full_name": {"title": "Full name", "type": "string", "maxLength": 254, "minLength": 1, "x-nullable": true}, "bio": {"title": "Bio", "type": "string", "maxLength": 512, "x-nullable": true}, "birthdate": {"title": "Birthdate", "type": "string", "format": "date", "x-nullable": true}, "email": {"title": "Email", "type": "string", "format": "email", "maxLength": 254, "x-nullable": true}, "wa_number": {"title": "Whatsapp number", "type": "string", "maxLength": 255, "x-nullable": true}, "institution_name": {"title": "Name", "description": "Name of the institute", "type": "string", "maxLength": 255, "x-nullable": true}, "languages": {"type": "array", "items": {"type": "string"}}, "avatar": {"title": "Avatar", "type": "string", "minLength": 1}, "social_medias": {"title": "Social medias", "description": "Provider social media profiles", "type": "object"}}}, "BookmarkSerializers": {"required": ["service", "content_id"], "type": "object", "properties": {"id": {"title": "ID", "type": "integer", "readOnly": true}, "related_object": {"title": "Related object", "type": "string", "readOnly": true}, "service": {"title": "Service", "type": "string", "maxLength": 255, "minLength": 1}, "content_id": {"title": "Content id", "type": "string", "maxLength": 255, "minLength": 1}, "text": {"title": "Text", "type": "string", "x-nullable": true}, "status": {"title": "Status", "type": "boolean", "readOnly": true}, "created_at": {"title": "Created at", "type": "string", "format": "date-time", "readOnly": true}, "updated_at": {"title": "Updated at", "type": "string", "format": "date-time", "readOnly": true}, "user": {"title": "User", "type": "integer", "readOnly": true}}}, "Calendar": {"required": ["type"], "type": "object", "properties": {"id": {"title": "ID", "type": "integer", "readOnly": true}, "title": {"title": "Title", "type": "string", "readOnly": true}, "countries": {"title": "Countries", "type": "string", "readOnly": true}, "type": {"title": "Type", "type": "string", "minLength": 1}, "event_type": {"title": "Event type", "type": "string", "enum": ["national", "international", "religious"], "x-nullable": true}, "holiday_in_countries": {"title": "Holiday in countries", "type": "string", "readOnly": true}, "dates": {"title": "Dates", "type": "string", "readOnly": true}, "is_yearly": {"title": "Is yearly", "description": "check this field if event is annually", "type": "boolean"}, "has_occasion_detail": {"title": "Has occasion detail", "type": "string", "readOnly": true}}}, "Language": {"required": ["name", "code"], "type": "object", "properties": {"name": {"title": "Name", "type": "string", "maxLength": 64, "minLength": 1}, "code": {"title": "Code", "type": "string", "maxLength": 2, "minLength": 1}}}, "MasaelCategories": {"required": ["language"], "type": "object", "properties": {"id": {"title": "ID", "type": "integer", "readOnly": true}, "name": {"title": "Name", "type": "string", "readOnly": true}, "thumbnail": {"title": "Thumbnail", "type": "string", "readOnly": true}, "masael_index": {"title": "Masael index", "type": "string", "readOnly": true}, "language": {"$ref": "#/definitions/Language"}, "children": {"title": "Children", "type": "string", "readOnly": true}}}, "CheckupParameterDetailSerializerV2": {"type": "object", "properties": {"id": {"title": "ID", "type": "integer", "readOnly": true}, "title": {"title": "Title", "type": "string", "readOnly": true}, "description": {"title": "Description", "type": "string", "readOnly": true}, "hadith": {"title": "Hadith", "type": "string", "readOnly": true}}}, "CommandHelp": {"required": ["service"], "type": "object", "properties": {"service": {"title": "Service", "type": "string", "enum": ["hussainiyah", "library", "Talk", "meet", "mafatih", "hadith", "quran", "ahkam", "coin", "calendar", "qiblah", "elalHabib", "main"]}, "description": {"title": "Description", "type": "string", "readOnly": true}}}, "CommandSuggestion": {"required": ["language_code"], "type": "object", "properties": {"id": {"title": "ID", "type": "integer", "readOnly": true}, "title": {"title": "Title", "type": "string", "x-nullable": true}, "language_code": {"title": "Language code", "description": "Language code (e.g., en, fa)", "type": "string", "maxLength": 10, "minLength": 1}}}, "DonateUser": {"required": ["amount"], "type": "object", "properties": {"amount": {"title": "Amount", "type": "string", "format": "decimal"}, "phone": {"title": "Phone", "type": "string", "maxLength": 255, "x-nullable": true}, "pay_method": {"title": "Pay method", "type": "string", "enum": ["paypal", "vtb", "stripe"], "default": "stripe"}}}, "DontKillApp": {"required": ["brand", "sdk_version", "description"], "type": "object", "properties": {"brand": {"type": "array", "items": {"title": "Brand", "type": "string", "maxLength": 100, "minLength": 1}}, "sdk_version": {"type": "array", "items": {"title": "Sdk version", "type": "integer", "maximum": 35, "minimum": 0}}, "description": {"title": "Description", "type": "string", "minLength": 1}}}, "EightmagCategories": {"required": ["name"], "type": "object", "properties": {"url": {"title": "Url", "type": "string", "readOnly": true}, "name": {"title": "Name", "type": "string", "maxLength": 512, "minLength": 1}, "thumbnails": {"title": "Thumbnails", "type": "string", "readOnly": true}, "children": {"title": "Children", "type": "string", "readOnly": true}}}, "EightmagCategoriesInList": {"required": ["name"], "type": "object", "properties": {"name": {"title": "Name", "type": "string", "maxLength": 512, "minLength": 1}, "url": {"title": "Url", "type": "string", "readOnly": true}}}, "EightmagList": {"required": ["title"], "type": "object", "properties": {"url": {"title": "Url", "type": "string", "readOnly": true}, "categories": {"type": "array", "items": {"$ref": "#/definitions/EightmagCategoriesInList"}, "readOnly": true}, "thumbnail": {"title": "Thumbnail", "type": "string", "readOnly": true}, "event": {"$ref": "#/definitions/Calendar"}, "created_at": {"title": "Created at", "type": "string", "readOnly": true}, "title": {"title": "Title", "type": "string", "maxLength": 255, "minLength": 1}, "summary": {"title": "Summary", "description": "we use it for seo and short description of post", "type": "string", "x-nullable": true}, "as_special": {"title": "As special", "description": "enable as special blog for showing in home page", "type": "boolean"}, "pin_top": {"title": "Pin top", "description": "چسباندن پست به بالا", "type": "boolean"}, "status": {"title": "Status", "description": "model status to be shown or not", "type": "boolean"}, "author": {"title": "Author", "type": "string", "maxLength": 119, "minLength": 1, "x-nullable": true}, "like_count": {"title": "Like count", "type": "integer", "maximum": 2147483647, "minimum": 0}, "source": {"title": "Source", "type": "integer", "x-nullable": true}, "publisher": {"title": "Publisher", "type": "integer", "x-nullable": true}}}, "EightmagDetails": {"required": ["title", "content"], "type": "object", "properties": {"url": {"title": "Url", "type": "string", "readOnly": true}, "thumbnail": {"title": "Thumbnail", "type": "string", "readOnly": true}, "categories": {"type": "array", "items": {"$ref": "#/definitions/EightmagCategoriesInList"}, "readOnly": true}, "author": {"title": "Author", "type": "string", "readOnly": true}, "event": {"$ref": "#/definitions/Calendar"}, "title": {"title": "Title", "type": "string", "maxLength": 255, "minLength": 1}, "content": {"title": "Content", "type": "string", "minLength": 1}, "summary": {"title": "Summary", "description": "we use it for seo and short description of post", "type": "string", "x-nullable": true}, "as_special": {"title": "As special", "description": "enable as special blog for showing in home page", "type": "boolean"}, "pin_top": {"title": "Pin top", "description": "چسباندن پست به بالا", "type": "boolean"}, "status": {"title": "Status", "description": "model status to be shown or not", "type": "boolean"}, "created_at": {"title": "Created at", "type": "string", "format": "date-time", "readOnly": true}, "like_count": {"title": "Like count", "type": "integer", "maximum": 2147483647, "minimum": 0}, "source": {"title": "Source", "type": "integer", "x-nullable": true}, "publisher": {"title": "Publisher", "type": "integer", "x-nullable": true}}}, "ElalHabib": {"type": "object", "properties": {"title": {"title": "نام موکب", "type": "object"}, "nationalities": {"type": "array", "items": {"type": "string", "x-nullable": true}, "default": [], "x-nullable": true}, "capacity": {"title": "ظرفیت اسکان", "type": "integer", "maximum": 32767, "minimum": 0, "x-nullable": true}, "options": {"title": "Options", "type": "string", "readOnly": true}, "after_amood": {"title": "After amood", "type": "string", "readOnly": true}, "events": {"title": "Events", "type": "string", "readOnly": true}, "description": {"title": "توضیحات", "type": "string", "x-nullable": true}}}, "ElalHabibSingerInList": {"required": ["slug"], "type": "object", "properties": {"name": {"title": "Name", "type": "string", "readOnly": true}, "slug": {"title": "Slug", "type": "string", "format": "slug", "maxLength": 255, "minLength": 1}}}, "DiscountCodeUsage": {"type": "object", "properties": {"id": {"title": "ID", "type": "integer", "readOnly": true}, "discount_code": {"title": "Discount code", "type": "string", "readOnly": true, "minLength": 1}, "user_username": {"title": "User username", "type": "string", "readOnly": true, "minLength": 1}, "service_name": {"title": "Service name", "type": "string", "readOnly": true, "minLength": 1}, "object_id": {"title": "Object ID", "type": "integer", "readOnly": true}, "original_price": {"title": "Original Price", "type": "string", "format": "decimal", "readOnly": true}, "discounted_price": {"title": "Discounted Price", "type": "string", "format": "decimal", "readOnly": true}, "discount_amount": {"title": "Discount Amount", "type": "string", "format": "decimal", "readOnly": true}, "used_at": {"title": "Used At", "type": "string", "format": "date-time", "readOnly": true}}}, "Package": {"required": ["coin_count", "price"], "type": "object", "properties": {"id": {"title": "ID", "type": "integer", "readOnly": true}, "package_type": {"title": "Package type", "type": "string", "enum": ["normal", "timely", "evently"]}, "coin_count": {"title": "Coin count", "type": "integer", "maximum": 32767, "minimum": 0}, "purchase_id": {"title": "Purchase ID", "description": "Unique identifier for products purchased on Google Play and App Store, used for tracking transactions.", "type": "string", "maxLength": 55, "x-nullable": true}, "price": {"title": "Price", "type": "string", "format": "decimal"}, "off_price": {"title": "Off price", "description": "Optional", "type": "string", "format": "decimal", "x-nullable": true}, "discount_percentage": {"title": "Discount percentage", "type": "string", "readOnly": true}, "expiration_duration_days": {"title": "Expiration duration days", "type": "integer", "maximum": 2147483647, "minimum": 0, "x-nullable": true}, "event_name": {"title": "Event name", "type": "string", "maxLength": 100, "x-nullable": true}}}, "Support": {"required": ["type", "description", "whatsapp_number"], "type": "object", "properties": {"id": {"title": "ID", "type": "integer", "readOnly": true}, "user": {"title": "User", "type": "integer", "readOnly": true}, "type": {"title": "Type", "type": "string", "enum": ["technical", "billing", "general"]}, "description": {"title": "Description", "type": "string", "minLength": 1}, "whatsapp_number": {"title": "Whatsapp number", "type": "string", "maxLength": 15, "minLength": 1}, "created_at": {"title": "Created at", "type": "string", "format": "date-time", "readOnly": true}, "updated_at": {"title": "Updated at", "type": "string", "format": "date-time", "readOnly": true}, "service": {"title": "Service", "type": "string", "minLength": 1}}}, "Transactions": {"required": ["payment_method", "price", "coin_count"], "type": "object", "properties": {"id": {"title": "ID", "type": "integer", "readOnly": true}, "status": {"title": "Status", "type": "string", "enum": ["pending", "success", "failed"]}, "payment_method": {"title": "Payment method", "type": "string", "maxLength": 20, "minLength": 1}, "price": {"title": "Price", "type": "integer"}, "coin_count": {"title": "Coin count", "type": "integer"}, "created_at": {"title": "Created at", "type": "string", "format": "date-time", "readOnly": true}, "updated_at": {"title": "Updated at", "type": "string", "format": "date-time", "readOnly": true}, "package": {"$ref": "#/definitions/Package"}}}, "UserCoinUsage": {"required": ["package", "coin_count"], "type": "object", "properties": {"id": {"title": "ID", "type": "integer", "readOnly": true}, "package": {"$ref": "#/definitions/Package"}, "service_details": {"title": "Service details", "type": "object", "readOnly": true}, "at_time": {"title": "At time", "type": "string", "format": "date-time", "readOnly": true}, "coin_count": {"title": "Coin count", "type": "integer", "maximum": 32767, "minimum": 0}}}, "UserPackage": {"type": "object", "properties": {"id": {"title": "ID", "type": "integer", "readOnly": true}, "created_at": {"title": "Created at", "type": "string", "format": "date-time", "readOnly": true}, "coin_count": {"title": "Coin count", "type": "integer", "readOnly": true}, "price": {"title": "Price", "type": "integer", "readOnly": true}, "used_count": {"title": "Used count", "type": "integer", "readOnly": true}, "remaining_count": {"title": "Remaining count", "type": "integer", "readOnly": true}, "package": {"$ref": "#/definitions/Package"}}}, "MeetSerializer": {"required": ["name", "online_users_count"], "type": "object", "properties": {"id": {"title": "ID", "type": "integer", "readOnly": true}, "name": {"title": "Name", "description": "Name of the meet", "type": "string", "maxLength": 255, "minLength": 1}, "description": {"title": "Description", "description": "Description of the meet", "type": "string", "x-nullable": true}, "next_session_subject": {"title": "Next Session Subject", "description": "Subject of the next session", "type": "string", "maxLength": 255, "x-nullable": true}, "next_session_schedule": {"title": "Next Session Schedule", "description": "Scheduled date and time for the next session", "type": "string", "format": "date-time", "x-nullable": true}, "is_suggested": {"title": "Is Suggested", "description": "Is this meet suggested?", "type": "boolean"}, "provider": {"title": "Provider", "type": "string", "readOnly": true}, "is_free": {"title": "Is Free", "description": "Is this meet free?", "type": "boolean"}, "price": {"title": "Price", "description": "Price of the meet if it is not free", "type": "string", "format": "decimal", "x-nullable": true}, "is_live": {"title": "Is Live", "description": "Is the meet currently live?", "type": "boolean"}, "is_closed": {"title": "Is closed", "type": "string", "readOnly": true}, "online_users_count": {"title": "Online users count", "type": "integer"}, "language": {"title": "Language", "type": "string", "readOnly": true}, "categories": {"title": "Categories", "description": "Categories related to the meet", "type": "string", "maxLength": 255, "x-nullable": true}, "organizer": {"title": "Organizer", "type": "string", "readOnly": true}, "is_provider": {"title": "Is provider", "type": "string", "readOnly": true}, "has_access": {"title": "Has access", "type": "string", "readOnly": true}, "is_reminder": {"title": "Is reminder", "type": "string", "readOnly": true}, "live_session_id": {"title": "Live session id", "type": "string", "readOnly": true}, "has_archive": {"title": "Has archive", "type": "string", "readOnly": true}, "has_recordings": {"title": "Has recordings", "type": "string", "readOnly": true}, "access": {"title": "Access", "description": "Access type of the meet (public or private)", "type": "string", "enum": ["public", "private"]}, "password": {"title": "Password", "description": "Password for private meets", "type": "string", "maxLength": 50, "x-nullable": true}}}, "MeetCreate": {"required": ["name", "language"], "type": "object", "properties": {"name": {"title": "Name", "description": "Name of the meet", "type": "string", "maxLength": 255, "minLength": 1}, "price": {"title": "Price", "type": "string", "format": "decimal", "default": "0.00", "x-nullable": true}, "language": {"title": "Language", "type": "string", "minLength": 1}, "description": {"title": "Description", "description": "Description of the meet", "type": "string", "x-nullable": true}, "is_free": {"title": "Is Free", "description": "Is this meet free?", "type": "boolean"}}}, "MeetCreateV2": {"required": ["name", "language"], "type": "object", "properties": {"name": {"title": "Name", "description": "Name of the meet", "type": "string", "maxLength": 255, "minLength": 1}, "price": {"title": "Price", "type": "string", "format": "decimal", "default": "0.00", "x-nullable": true}, "language": {"title": "Language", "type": "string", "minLength": 1}, "description": {"title": "Description", "description": "Description of the meet", "type": "string", "x-nullable": true}, "is_free": {"title": "Is Free", "description": "Is this meet free?", "type": "boolean"}, "access": {"title": "Access", "type": "string", "enum": ["public", "private"], "default": "public"}, "password": {"title": "Password", "type": "string", "maxLength": 50, "x-nullable": true}}}, "MeetProviderProfile": {"required": ["languages"], "type": "object", "properties": {"full_name": {"title": "Full name", "type": "string", "maxLength": 254, "minLength": 1, "x-nullable": true}, "bio": {"title": "Bio", "type": "string", "maxLength": 512, "x-nullable": true}, "birthdate": {"title": "Birthdate", "type": "string", "format": "date", "x-nullable": true}, "email": {"title": "Email", "type": "string", "format": "email", "maxLength": 254, "x-nullable": true}, "wa_number": {"title": "Whatsapp number", "type": "string", "maxLength": 255, "x-nullable": true}, "institution_name": {"title": "Name", "description": "Name of the institute", "type": "string", "maxLength": 255, "x-nullable": true}, "languages": {"type": "array", "items": {"type": "string"}}, "avatar": {"title": "Avatar", "type": "string", "minLength": 1}, "social_medias": {"title": "Social medias", "description": "Provider social media profiles", "type": "object"}}}, "ProviderMeetSerializer": {"type": "object", "properties": {"id": {"title": "ID", "type": "integer", "readOnly": true}, "email": {"title": "Email", "type": "string", "readOnly": true}, "name": {"title": "Name", "type": "string", "readOnly": true}, "avatar": {"title": "Avatar", "type": "string", "readOnly": true}, "bio": {"title": "Bio", "type": "string", "maxLength": 512, "x-nullable": true}, "slogn": {"title": "Bio", "type": "string", "maxLength": 512, "x-nullable": true}}}, "ProviderDetailMeetSerializer": {"type": "object", "properties": {"id": {"title": "ID", "type": "integer", "readOnly": true}, "email": {"title": "Email", "type": "string", "readOnly": true}, "name": {"title": "Name", "type": "string", "readOnly": true}, "avatar": {"title": "Avatar", "type": "string", "readOnly": true}, "slogn": {"title": "Bio", "type": "string", "maxLength": 512, "x-nullable": true}, "bio": {"title": "Bio", "type": "string", "maxLength": 512, "x-nullable": true}, "other_provider_services": {"title": "Other provider services", "type": "string", "readOnly": true}}}, "MeetProviderRoom": {"required": ["name", "reminder_count", "purchase_count"], "type": "object", "properties": {"id": {"title": "ID", "type": "integer", "readOnly": true}, "name": {"title": "Name", "description": "Name of the meet", "type": "string", "maxLength": 255, "minLength": 1}, "next_session_subject": {"title": "Next Session Subject", "description": "Subject of the next session", "type": "string", "maxLength": 255, "x-nullable": true}, "next_session_schedule": {"title": "Next Session Schedule", "description": "Scheduled date and time for the next session", "type": "string", "format": "date-time", "x-nullable": true}, "language": {"title": "Language", "type": "string", "readOnly": true}, "is_free": {"title": "Is Free", "description": "Is this meet free?", "type": "boolean"}, "price": {"title": "Price", "description": "Price of the meet if it is not free", "type": "string", "format": "decimal", "x-nullable": true}, "is_closed": {"title": "Is closed", "type": "string", "readOnly": true}, "description": {"title": "Description", "description": "Description of the meet", "type": "string", "x-nullable": true}, "provider": {"title": "Provider", "type": "string", "readOnly": true}, "reminder_count": {"title": "Reminder count", "type": "integer"}, "categories": {"title": "Categories", "description": "Categories related to the meet", "type": "string", "maxLength": 255, "x-nullable": true}, "purchase_count": {"title": "Purchase count", "type": "integer"}, "archive_count": {"title": "Archive count", "type": "string", "readOnly": true}, "is_active": {"title": "Is Active", "description": "Is this meet currently active?", "type": "boolean"}, "status": {"title": "Status", "type": "string", "readOnly": true}, "access": {"title": "Access", "type": "string", "enum": ["public", "private"], "readOnly": true}, "password": {"title": "Password", "type": "string", "readOnly": true, "maxLength": 50, "minLength": 1, "x-nullable": true}}}, "MeetDetailSerializer": {"required": ["name", "online_users_count"], "type": "object", "properties": {"id": {"title": "ID", "type": "integer", "readOnly": true}, "name": {"title": "Name", "description": "Name of the meet", "type": "string", "maxLength": 255, "minLength": 1}, "description": {"title": "Description", "description": "Description of the meet", "type": "string", "x-nullable": true}, "next_session_subject": {"title": "Next Session Subject", "description": "Subject of the next session", "type": "string", "maxLength": 255, "x-nullable": true}, "next_session_schedule": {"title": "Next Session Schedule", "description": "Scheduled date and time for the next session", "type": "string", "format": "date-time", "x-nullable": true}, "is_suggested": {"title": "Is Suggested", "description": "Is this meet suggested?", "type": "boolean"}, "provider": {"title": "Provider", "type": "string", "readOnly": true}, "is_free": {"title": "Is Free", "description": "Is this meet free?", "type": "boolean"}, "price": {"title": "Price", "description": "Price of the meet if it is not free", "type": "string", "format": "decimal", "x-nullable": true}, "is_live": {"title": "Is Live", "description": "Is the meet currently live?", "type": "boolean"}, "is_closed": {"title": "Is closed", "type": "string", "readOnly": true}, "online_users_count": {"title": "Online users count", "type": "integer"}, "language": {"title": "Language", "type": "string", "readOnly": true}, "categories": {"title": "Categories", "description": "Categories related to the meet", "type": "string", "maxLength": 255, "x-nullable": true}, "organizer": {"title": "Organizer", "type": "string", "readOnly": true}, "is_provider": {"title": "Is provider", "type": "string", "readOnly": true}, "live_session_id": {"title": "Live session id", "type": "string", "readOnly": true}, "has_archive": {"title": "Has archive", "type": "string", "readOnly": true}, "recordings": {"title": "Recordings", "type": "string", "readOnly": true}, "access": {"title": "Access", "type": "string", "enum": ["public", "private"]}, "password": {"title": "Password", "type": "string", "maxLength": 50, "x-nullable": true}, "has_recording": {"title": "Has recording", "type": "string", "readOnly": true}}}, "SessionArchiveSerializer": {"required": ["recorded_file", "session_id"], "type": "object", "properties": {"id": {"title": "ID", "type": "integer", "readOnly": true}, "meet": {"title": "Meet", "description": "The meet this session belongs to", "type": "integer", "readOnly": true}, "started_at": {"title": "Started At", "description": "Session start time", "type": "string", "format": "date-time", "readOnly": true}, "ended_at": {"title": "Ended At", "description": "Session end time", "type": "string", "format": "date-time", "readOnly": true, "x-nullable": true}, "recorded_file": {"title": "Recorded file", "type": "string", "minLength": 1}, "subject": {"title": "Subject", "description": "Subject of the session", "type": "string", "readOnly": true, "minLength": 1, "x-nullable": true}, "session_id": {"title": "Session id", "type": "integer"}}}, "ReportSerializer": {"required": ["report_type"], "type": "object", "properties": {"id": {"title": "ID", "type": "integer", "readOnly": true}, "meet_id": {"title": "Meet id", "type": "integer", "readOnly": true}, "description": {"title": "Description", "description": "Description of the report", "type": "string", "x-nullable": true}, "report_type": {"title": "Type", "description": "Type of the report", "type": "string", "enum": ["bug", "feedback", "other"]}}}, "SessionCreate": {"required": ["name", "is_start"], "type": "object", "properties": {"name": {"title": "Name", "type": "string", "minLength": 1}, "date_time": {"title": "Date time", "description": "Enter the date and time in the format YYYY-MM-DD HH:MM:SS", "type": "string", "format": "date-time", "x-nullable": true}, "is_start": {"title": "Is start", "type": "boolean"}}}, "SessionRecordingCreateUpdateSerializer": {"required": ["session", "file", "recording_type"], "type": "object", "properties": {"id": {"title": "ID", "type": "integer", "readOnly": true}, "title": {"title": "Title", "description": "Title of the recording", "type": "string", "maxLength": 255, "x-nullable": true}, "session": {"title": "Session", "type": "integer"}, "file": {"title": "File", "type": "string", "minLength": 1}, "file_time": {"title": "File Duration", "description": "Duration of the recording file", "type": "string", "x-nullable": true}, "recording_type": {"title": "Recording type", "type": "string", "enum": ["voice", "video"]}, "thumbnail": {"title": "Thumbnail", "type": "string", "minLength": 1, "x-nullable": true}, "created_at": {"title": "Created At", "description": "Time the recording was created", "type": "string", "format": "date-time", "readOnly": true}, "updated_at": {"title": "Updated At", "description": "The datetime when the recording was last updated", "type": "string", "format": "date-time", "readOnly": true}}}, "SessionFileUpload": {"type": "object", "properties": {"recorded_file": {"title": "Recorded File", "description": "File of the recorded session", "type": "string", "readOnly": true, "x-nullable": true, "format": "uri"}}}, "CenterTag": {"required": ["id", "name"], "type": "object", "properties": {"id": {"title": "Id", "type": "integer"}, "name": {"title": "Name", "type": "object"}}}, "CenterList": {"required": ["name", "slogan"], "type": "object", "properties": {"id": {"title": "ID", "type": "integer", "readOnly": true}, "name": {"title": "Name", "type": "string", "maxLength": 255, "minLength": 1}, "slogan": {"title": "Slogan", "type": "string", "maxLength": 255, "minLength": 1}, "avatar": {"title": "Avatar", "type": "string", "readOnly": true}, "tags": {"type": "array", "items": {"$ref": "#/definitions/CenterTag"}, "readOnly": true}, "country": {"title": "Country", "type": "string", "maxLength": 255, "x-nullable": true}, "city": {"title": "City", "type": "string", "maxLength": 255, "x-nullable": true}, "lat": {"title": "Lat", "type": "number", "x-nullable": true}, "lon": {"title": "Lon", "type": "number", "x-nullable": true}, "distance": {"title": "Distance", "type": "string", "readOnly": true}, "is_bookmarked": {"title": "Is bookmarked", "type": "string", "readOnly": true}}}, "CenterDetail": {"required": ["name", "slogan"], "type": "object", "properties": {"id": {"title": "ID", "type": "integer", "readOnly": true}, "name": {"title": "Name", "type": "string", "maxLength": 255, "minLength": 1}, "slogan": {"title": "Slogan", "type": "string", "maxLength": 255, "minLength": 1}, "avatar": {"title": "Avatar", "type": "string", "readOnly": true}, "header_image": {"title": "Header image", "type": "string", "readOnly": true}, "tags": {"type": "array", "items": {"$ref": "#/definitions/CenterTag"}, "readOnly": true}, "country": {"title": "Country", "type": "string", "maxLength": 255, "x-nullable": true}, "city": {"title": "City", "type": "string", "maxLength": 255, "x-nullable": true}, "lat": {"title": "Lat", "type": "number", "x-nullable": true}, "lon": {"title": "Lon", "type": "number", "x-nullable": true}, "address": {"title": "Address", "type": "string", "maxLength": 512, "x-nullable": true}, "website": {"title": "Website", "type": "string", "maxLength": 190, "x-nullable": true}, "phone_numbers": {"title": "Phone numbers", "type": "string", "maxLength": 512, "x-nullable": true}, "principal_name": {"title": "Principal name", "type": "string", "maxLength": 255, "x-nullable": true}, "working_hours": {"title": "Working hours", "type": "object"}, "social_medias": {"title": "Social medias", "type": "object"}, "congregations_prayers": {"title": "Congregations prayers", "type": "object"}, "imam_name": {"title": "Imam name", "type": "string", "maxLength": 255, "x-nullable": true}, "about_center": {"title": "About center", "type": "string", "x-nullable": true}, "google_map_link": {"title": "Google map link", "type": "string", "maxLength": 512, "x-nullable": true}, "stars": {"title": "Stars", "type": "number", "x-nullable": true}, "gallery": {"title": "Gallery", "type": "string", "readOnly": true}, "distance": {"title": "Distance", "type": "string", "readOnly": true}, "is_bookmarked": {"title": "Is bookmarked", "type": "string", "readOnly": true}}}, "CenterEvent": {"required": ["title", "date", "description"], "type": "object", "properties": {"id": {"title": "ID", "type": "integer", "readOnly": true}, "title": {"title": "Title", "type": "string", "maxLength": 119, "minLength": 1}, "start_time": {"title": "Start time", "type": "string", "format": "date-time", "x-nullable": true}, "end_time": {"title": "End time", "type": "string", "format": "date-time", "x-nullable": true}, "date": {"title": "Date", "type": "string", "format": "date-time"}, "description": {"title": "Description", "type": "string", "minLength": 1}, "image": {"title": "Image", "type": "string", "readOnly": true}}}, "CenterProviderProfile": {"required": ["provider_type", "full_name", "email", "whatsapp_number", "role"], "type": "object", "properties": {"id": {"title": "ID", "type": "integer", "readOnly": true}, "provider_type": {"title": "Provider type", "description": "Type of provider: management team member or connected team member", "type": "string", "enum": ["management", "connected"]}, "full_name": {"title": "Full name", "description": "Full name of the provider", "type": "string", "maxLength": 550, "minLength": 1}, "email": {"title": "Email", "description": "Email address of the provider", "type": "string", "format": "email", "maxLength": 254, "minLength": 1}, "whatsapp_number": {"title": "Whatsapp number", "description": "WhatsApp number (9-15 digits)", "type": "string", "maxLength": 55, "minLength": 1}, "role": {"title": "Role", "description": "Role or position of the provider", "type": "string", "maxLength": 255, "minLength": 1}, "management_contact_name": {"title": "Management contact name", "description": "Name of management contact (optional, typically for connected team members)", "type": "string", "maxLength": 550, "x-nullable": true}, "is_verified": {"title": "Is verified", "description": "Whether this provider profile has been verified", "type": "boolean", "readOnly": true}, "created_at": {"title": "Created at", "type": "string", "format": "date-time", "readOnly": true}, "updated_at": {"title": "Updated at", "type": "string", "format": "date-time", "readOnly": true}}}, "ChallengeList": {"type": "object", "properties": {"id": {"title": "ID", "type": "integer", "readOnly": true}, "title": {"title": "Title", "type": "string", "readOnly": true}, "image": {"title": "Image", "type": "string", "readOnly": true}, "summary": {"title": "Summary", "type": "string", "readOnly": true}, "is_unlimited": {"title": "Is unlimited", "type": "boolean"}, "duration_days": {"title": "Duration days", "type": "integer", "maximum": 2147483647, "minimum": 0, "x-nullable": true}, "status": {"title": "Is it displayed?", "type": "boolean"}, "created_at": {"title": "Created at", "type": "string", "format": "date-time", "readOnly": true}, "participant_count": {"title": "Participant count", "type": "string", "readOnly": true}, "is_participant": {"title": "Is participant", "type": "string", "readOnly": true}}}, "ChallengeDetail": {"type": "object", "properties": {"id": {"title": "ID", "type": "integer", "readOnly": true}, "title": {"title": "Title", "type": "string", "readOnly": true}, "image": {"title": "Image", "type": "string", "readOnly": true}, "summary": {"title": "Summary", "type": "string", "readOnly": true}, "is_unlimited": {"title": "Is unlimited", "type": "boolean"}, "duration_days": {"title": "Duration days", "type": "integer", "maximum": 2147483647, "minimum": 0, "x-nullable": true}, "status": {"title": "Is it displayed?", "type": "boolean"}, "created_at": {"title": "Created at", "type": "string", "format": "date-time", "readOnly": true}, "participant_count": {"title": "Participant count", "type": "string", "readOnly": true}, "is_participant": {"title": "Is participant", "type": "string", "readOnly": true}, "description": {"title": "Description", "type": "string", "readOnly": true}}}, "UserChecklistItem": {"type": "object", "properties": {"id": {"title": "ID", "type": "integer", "readOnly": true}, "title": {"title": "Title", "type": "string", "readOnly": true, "minLength": 1}, "is_active": {"title": "Is active", "type": "boolean"}, "custom_days": {"type": "array", "items": {"type": "string", "x-nullable": true}}, "has_details": {"title": "Has details", "type": "string", "readOnly": true}, "task_type": {"title": "Task type", "type": "string", "readOnly": true}}}, "ChecklistEntryList": {"required": ["id", "title", "completed"], "type": "object", "properties": {"id": {"title": "Id", "type": "integer"}, "title": {"title": "Title", "type": "string", "minLength": 1}, "completed": {"title": "Completed", "type": "boolean"}, "has_details": {"title": "Has details", "type": "boolean", "default": false}}}, "ChecklistStats": {"required": ["total_days", "completed_days", "percentage"], "type": "object", "properties": {"total_days": {"title": "Total days", "type": "integer"}, "completed_days": {"title": "Completed days", "type": "integer"}, "percentage": {"title": "Percentage", "type": "number"}}}, "ChecklistDetail": {"required": ["content"], "type": "object", "properties": {"id": {"title": "ID", "type": "integer", "readOnly": true}, "content": {"title": "Content", "type": "string", "minLength": 1}, "language": {"title": "Language", "type": "integer"}, "created_at": {"title": "Created at", "type": "string", "format": "date-time", "readOnly": true}, "updated_at": {"title": "Updated at", "type": "string", "format": "date-time", "readOnly": true}}}, "HadisCategory": {"type": "object", "properties": {"name": {"title": "Name", "type": "string", "readOnly": true}, "hadis_count": {"title": "Hadis count", "type": "string", "readOnly": true}, "thumbnails": {"title": "Thumbnails", "type": "string", "readOnly": true}, "children": {"title": "Children", "type": "string", "readOnly": true}}}, "Reference": {"type": "object", "properties": {"book": {"title": "Book", "type": "string", "readOnly": true, "x-nullable": true}, "ref_doc_numb": {"title": "Vol", "type": "string", "maxLength": 64, "x-nullable": true}, "ref_doc_page": {"title": "Page", "type": "string", "maxLength": 64, "x-nullable": true}, "ref_hadis_num": {"title": "Number", "type": "string", "maxLength": 64, "x-nullable": true}, "ref_text": {"title": "Text", "type": "string", "maxLength": 200, "x-nullable": true}}, "x-nullable": true}, "Hadis": {"required": ["number", "text", "total_grade", "level"], "type": "object", "properties": {"number": {"title": "Number", "type": "integer", "maximum": 2147483647, "minimum": 0}, "text": {"title": "Text", "type": "string", "minLength": 1}, "translation": {"title": "Translation", "type": "string", "readOnly": true}, "narrated_by": {"title": "Narrated by", "type": "string", "readOnly": true}, "references": {"type": "array", "items": {"$ref": "#/definitions/Reference"}, "readOnly": true, "x-nullable": true}, "total_grade": {"title": "Total grade", "type": "integer", "x-nullable": true}, "level": {"title": "Level", "type": "integer", "x-nullable": true}}}, "Interest": {"type": "object", "properties": {"id": {"title": "ID", "type": "integer", "readOnly": true}, "title": {"title": "Title", "type": "string", "readOnly": true}, "icon": {"title": "Icon name", "description": "Fontawesome icon name", "type": "string", "maxLength": 64, "x-nullable": true}}}, "Narrator": {"required": ["hadis_count"], "type": "object", "properties": {"id": {"title": "ID", "type": "integer", "readOnly": true}, "name": {"title": "Name", "type": "string", "readOnly": true}, "hadis_count": {"title": "Hadis count", "type": "integer", "x-nullable": true}, "photo": {"title": "Photo", "type": "string", "readOnly": true, "x-nullable": true, "format": "uri"}}}, "Resources": {"type": "object", "properties": {"id": {"title": "ID", "type": "integer", "readOnly": true}, "title": {"title": "Title", "type": "string", "readOnly": true}, "thumbnail": {"title": "Thumbnail", "type": "string", "readOnly": true}, "description": {"title": "Description", "type": "string", "readOnly": true}}}, "Trend": {"type": "object", "properties": {"title": {"title": "Title", "type": "string", "readOnly": true}, "description": {"title": "Description", "type": "string", "readOnly": true}, "thumbnail": {"title": "Thumbnail", "type": "string", "readOnly": true}, "hadis_count": {"title": "Hadis count", "type": "string", "readOnly": true}, "hadis_id_list": {"title": "Hadis id list", "type": "string", "readOnly": true}}}, "UserInterest": {"required": ["interests_ids", "gender", "age"], "type": "object", "properties": {"id": {"title": "ID", "type": "integer", "readOnly": true}, "user": {"title": "User", "type": "string", "readOnly": true, "minLength": 1}, "interests": {"type": "array", "items": {"$ref": "#/definitions/Interest"}, "readOnly": true}, "interests_ids": {"type": "array", "items": {"type": "integer"}}, "gender": {"title": "Gender", "type": "string", "enum": ["male", "female"]}, "age": {"title": "Age", "type": "integer", "maximum": 32767, "minimum": 0}, "tend_to_marry": {"title": "Tend to marry", "type": "boolean", "x-nullable": true}, "marital_status": {"title": "Marital status", "type": "boolean", "x-nullable": true}, "has_children": {"title": "Has children", "type": "boolean", "x-nullable": true}}}, "HadisSerializerV2": {"required": ["number", "text", "total_grade", "level"], "type": "object", "properties": {"number": {"title": "Number", "type": "integer", "maximum": 2147483647, "minimum": 0}, "text": {"title": "Text", "type": "string", "minLength": 1}, "translation": {"title": "Translation", "type": "string", "readOnly": true}, "narrated_by": {"title": "Narrated by", "type": "string", "readOnly": true}, "references": {"type": "array", "items": {"$ref": "#/definitions/Reference"}, "readOnly": true, "x-nullable": true}, "total_grade": {"title": "Total grade", "type": "integer", "x-nullable": true}, "level": {"title": "Level", "type": "integer", "x-nullable": true}, "tags": {"title": "Tags", "type": "string", "readOnly": true}}}, "NarratorSerializerV2": {"required": ["hadis_count"], "type": "object", "properties": {"id": {"title": "ID", "type": "integer", "readOnly": true}, "name": {"title": "Name", "type": "string", "readOnly": true}, "hadis_count": {"title": "Hadis count", "type": "integer", "x-nullable": true}, "photo": {"title": "Photo", "type": "string", "readOnly": true, "x-nullable": true, "format": "uri"}, "hadis_index": {"title": "Hadis index", "type": "string", "readOnly": true}}}, "AlbumList": {"type": "object", "properties": {"id": {"title": "ID", "type": "integer", "readOnly": true}, "title": {"title": "Title", "type": "string", "readOnly": true}, "thumbnail": {"title": "Thumbnail", "type": "string", "readOnly": true}, "dates": {"title": "Dates", "type": "object"}, "view_count": {"title": "View count", "type": "integer", "maximum": 2147483647, "minimum": -2147483648}, "songs_count": {"title": "Songs count", "type": "integer", "readOnly": true, "x-nullable": true}, "singer_type_counts": {"title": "Singer type counts", "type": "string", "readOnly": true}}}, "SingersList": {"required": ["slug"], "type": "object", "properties": {"id": {"title": "ID", "type": "integer", "readOnly": true}, "name": {"title": "Name", "type": "string", "readOnly": true}, "singer_type": {"title": "Singer type", "type": "string", "enum": ["lecturer", "madah", "singer"]}, "songs_count": {"title": "Songs count", "type": "integer", "readOnly": true}, "slug": {"title": "Slug", "type": "string", "format": "slug", "maxLength": 255, "minLength": 1}, "languages": {"type": "array", "items": {"type": "string"}, "readOnly": true, "uniqueItems": true}, "avatar": {"title": "Avatar", "type": "string", "readOnly": true}, "lang": {"title": "Lang", "type": "string", "readOnly": true, "minLength": 1}}}, "GenreList": {"required": ["title"], "type": "object", "properties": {"slug": {"title": "Slug", "type": "string", "format": "slug", "pattern": "^[-a-zA-Z0-9_]+$", "readOnly": true, "minLength": 1}, "title": {"title": "Title", "type": "string", "maxLength": 119, "minLength": 1}, "thumbnail": {"title": "Thumbnail", "type": "string", "readOnly": true}}}, "Publisher": {"required": ["name", "songs_count"], "type": "object", "properties": {"id": {"title": "ID", "type": "integer", "readOnly": true}, "url": {"title": "Url", "type": "string", "format": "uri", "maxLength": 200, "x-nullable": true}, "name": {"title": "Name", "type": "string", "maxLength": 255, "minLength": 1}, "description": {"title": "Description", "type": "string", "maxLength": 1024, "x-nullable": true}, "thumbnail_url": {"title": "Thumbnail url", "type": "string", "readOnly": true}, "type": {"title": "Type", "type": "string", "enum": ["YT", "IT", "WS", "TG", "AP"]}, "languages": {"type": "array", "items": {"$ref": "#/definitions/Language"}, "readOnly": true}, "songs_count": {"title": "Songs count", "type": "integer", "x-nullable": true}}}, "SongsList": {"required": ["slug"], "type": "object", "properties": {"relative_url": {"title": "Relative url", "type": "string", "readOnly": true}, "slug": {"title": "Slug", "type": "string", "format": "slug", "maxLength": 50, "minLength": 1}, "title": {"title": "Title", "type": "string", "readOnly": true}, "singers": {"type": "array", "items": {"$ref": "#/definitions/SingersList"}, "readOnly": true}, "thumbnail": {"title": "Thumbnail", "type": "string", "readOnly": true}, "genre": {"$ref": "#/definitions/GenreList"}, "song_type": {"title": "Song type", "type": "string", "enum": ["audio", "video", "youtube"]}, "file": {"title": "File", "type": "string", "readOnly": true}, "published_date": {"title": "Published date", "type": "string", "format": "date", "x-nullable": true}, "subtitle_languages": {"type": "array", "items": {"$ref": "#/definitions/Language"}, "readOnly": true}, "language": {"type": "array", "items": {"$ref": "#/definitions/Language"}, "readOnly": true}, "publisher": {"$ref": "#/definitions/Publisher"}, "like_count": {"title": "Like count", "type": "string", "readOnly": true}, "view_count": {"title": "View count", "type": "integer", "maximum": 9223372036854775807, "minimum": 0}, "is_liked": {"title": "Is liked", "type": "string", "readOnly": true}, "is_youtube": {"title": "Is youtube", "type": "boolean", "readOnly": true}, "is_playlist": {"title": "Is playlist", "type": "string", "readOnly": true}}}, "CollectionList": {"type": "object", "properties": {"id": {"title": "ID", "type": "integer", "readOnly": true}, "title": {"title": "Title", "type": "string", "readOnly": true}, "collection_type": {"title": "Collection type", "type": "string", "enum": ["all", "audio", "video", "youtube"], "x-nullable": true}, "thumbnail": {"title": "Thumbnail", "type": "string", "readOnly": true}, "pin_to_top": {"title": "Pin to top", "type": "boolean"}, "songs_count": {"title": "Songs count", "type": "integer", "readOnly": true, "x-nullable": true}, "songs": {"title": "Songs", "type": "string", "readOnly": true}}}, "CollectionDetail": {"type": "object", "properties": {"id": {"title": "ID", "type": "integer", "readOnly": true}, "title": {"title": "Title", "type": "string", "readOnly": true}, "collection_type": {"title": "Collection type", "type": "string", "enum": ["all", "audio", "video", "youtube"], "x-nullable": true}, "thumbnail": {"title": "Thumbnail", "type": "string", "readOnly": true}, "pin_to_top": {"title": "Pin to top", "type": "boolean"}, "songs_count": {"title": "Songs count", "type": "integer", "readOnly": true, "x-nullable": true}, "songs": {"title": "Songs", "type": "string", "readOnly": true}}}, "DashboardAlbumRow": {"type": "object", "properties": {"id": {"title": "ID", "type": "integer", "readOnly": true}, "translations": {"title": "Title", "type": "object"}, "dates": {"title": "Dates", "type": "object"}, "thumbnail": {"title": "Thumbnail", "type": "string", "readOnly": true}, "status": {"title": "Status", "type": "boolean"}, "is_pinned": {"title": "Pinned", "type": "boolean"}, "view_count": {"title": "View count", "type": "integer", "maximum": 2147483647, "minimum": -2147483648}, "song_count": {"title": "Song count", "type": "integer", "readOnly": true}, "langs": {"title": "Langs", "type": "string", "readOnly": true}, "letter": {"title": "Letter", "type": "string", "readOnly": true}, "updated": {"title": "Updated", "type": "string", "format": "date-time", "readOnly": true}}}, "DashboardAlbumInput": {"type": "object", "properties": {"translations": {"title": "Title", "type": "object"}, "dates": {"title": "Dates", "type": "object"}, "status": {"title": "Status", "type": "boolean"}, "is_pinned": {"title": "Pinned", "type": "boolean"}, "thumbnail_url": {"title": "Thumbnail url", "type": "string", "x-nullable": true}}}, "_AlbumAutocomplete": {"type": "object", "properties": {"id": {"title": "ID", "type": "integer", "readOnly": true}, "name": {"title": "Name", "type": "string", "readOnly": true}}}, "_GenreAutocomplete": {"type": "object", "properties": {"id": {"title": "ID", "type": "integer", "readOnly": true}, "name": {"title": "Name", "type": "string", "readOnly": true, "minLength": 1}, "slug": {"title": "Slug", "type": "string", "format": "slug", "pattern": "^[-a-zA-Z0-9_]+$", "readOnly": true, "minLength": 1}}}, "_PublisherAutocomplete": {"required": ["name"], "type": "object", "properties": {"id": {"title": "ID", "type": "integer", "readOnly": true}, "name": {"title": "Name", "type": "string", "maxLength": 255, "minLength": 1}}}, "_SingerAutocomplete": {"required": ["slug"], "type": "object", "properties": {"id": {"title": "ID", "type": "integer", "readOnly": true}, "name": {"title": "Name", "type": "string", "readOnly": true}, "slug": {"title": "Slug", "type": "string", "format": "slug", "maxLength": 255, "minLength": 1}, "singer_type": {"title": "Singer type", "type": "string", "enum": ["lecturer", "madah", "singer"]}}}, "_SongAutocomplete": {"required": ["slug"], "type": "object", "properties": {"id": {"title": "ID", "type": "integer", "readOnly": true}, "name": {"title": "Name", "type": "string", "readOnly": true}, "slug": {"title": "Slug", "type": "string", "format": "slug", "maxLength": 50, "minLength": 1}}}, "_TagAutocomplete": {"type": "object", "properties": {"id": {"title": "ID", "type": "integer", "readOnly": true}, "name": {"title": "Name", "type": "string", "readOnly": true}}}, "DashboardCollectionRow": {"type": "object", "properties": {"id": {"title": "ID", "type": "integer", "readOnly": true}, "title": {"title": "Title", "type": "object"}, "title_display": {"title": "Title display", "type": "string", "readOnly": true}, "dates": {"title": "Dates", "type": "object"}, "thumbnail": {"title": "Thumbnail", "type": "string", "readOnly": true}, "status": {"title": "Status", "type": "boolean"}, "pin_to_top": {"title": "Pin to top", "type": "boolean"}, "ordering": {"title": "Display order", "type": "integer", "maximum": 2147483647, "minimum": 0}, "song_count": {"title": "Song count", "type": "integer", "readOnly": true}, "songs": {"title": "Songs", "type": "string", "readOnly": true}, "letter": {"title": "Letter", "type": "string", "readOnly": true}, "updated": {"title": "Updated", "type": "string", "format": "date-time", "readOnly": true}}}, "DashboardCollectionInput": {"type": "object", "properties": {"title": {"title": "Title", "type": "object"}, "dates": {"title": "Dates", "type": "object"}, "status": {"title": "Status", "type": "boolean"}, "pin_to_top": {"title": "Pin to top", "type": "boolean"}, "ordering": {"title": "Display order", "type": "integer", "maximum": 2147483647, "minimum": 0}, "songs": {"type": "array", "items": {"type": "integer"}, "uniqueItems": true}, "thumbnail_url": {"title": "Thumbnail url", "type": "string", "x-nullable": true}}}, "DashboardGenreRow": {"required": ["title"], "type": "object", "properties": {"id": {"title": "ID", "type": "integer", "readOnly": true}, "title": {"title": "Title", "type": "string", "maxLength": 119, "minLength": 1}, "slug": {"title": "Slug", "type": "string", "format": "slug", "pattern": "^[-a-zA-Z0-9_]+$", "readOnly": true, "minLength": 1}, "thumbnail": {"title": "Thumbnail", "type": "string", "readOnly": true}, "song_count": {"title": "Song count", "type": "integer", "readOnly": true}, "letter": {"title": "Letter", "type": "string", "readOnly": true}}}, "DashboardGenreInput": {"required": ["title"], "type": "object", "properties": {"title": {"title": "Title", "type": "string", "maxLength": 119, "minLength": 1}, "slug": {"title": "Slug", "type": "string", "format": "slug", "pattern": "^[-a-zA-Z0-9_]+$"}, "thumbnail_url": {"title": "Thumbnail url", "type": "string", "x-nullable": true}}}, "ImportItemRow": {"type": "object", "properties": {"id": {"title": "ID", "type": "integer", "readOnly": true}, "source": {"title": "Source", "type": "string", "enum": ["youtube", "nava", "kashoob", "remote_file", "unknown"], "readOnly": true}, "input_kind": {"title": "Input kind", "type": "string", "enum": ["direct_link", "channel_page"], "readOnly": true}, "origin": {"title": "Origin", "type": "string", "enum": ["direct_link", "channel_page", "scheduled_task"], "readOnly": true}, "source_url": {"title": "Source url", "type": "string", "format": "uri", "readOnly": true, "minLength": 1}, "canonical_url": {"title": "Canonical url", "type": "string", "format": "uri", "readOnly": true, "minLength": 1}, "external_id": {"title": "External id", "type": "string", "readOnly": true, "minLength": 1}, "title": {"title": "Title", "type": "string", "readOnly": true, "minLength": 1}, "singer_name": {"title": "Singer name", "type": "string", "readOnly": true, "minLength": 1}, "duration_seconds": {"title": "Duration seconds", "type": "integer", "readOnly": true, "x-nullable": true}, "thumbnail_url": {"title": "Thumbnail url", "type": "string", "format": "uri", "readOnly": true, "minLength": 1}, "source_published_at": {"title": "Source published at", "type": "string", "format": "date-time", "readOnly": true, "x-nullable": true}, "status": {"title": "Status", "type": "string", "enum": ["queued", "discovering", "downloading", "processing", "ai_detecting", "metadata_review", "ready_to_publish", "published", "duplicate", "failed", "cancelled"], "readOnly": true}, "stage": {"title": "Stage", "type": "string", "readOnly": true, "minLength": 1}, "progress": {"title": "Progress", "type": "integer", "readOnly": true}, "ai_status": {"title": "AI status", "type": "string", "enum": ["pending", "running", "success", "failed", "skipped"], "readOnly": true}, "ai_confidence": {"title": "AI confidence", "type": "number", "readOnly": true, "x-nullable": true}, "needs_metadata_review": {"title": "Needs metadata review", "type": "boolean", "readOnly": true}, "error_message": {"title": "Error message", "type": "string", "readOnly": true, "minLength": 1}, "song_id": {"title": "Song id", "type": "string", "readOnly": true}, "created_at": {"title": "Created at", "type": "string", "format": "date-time", "readOnly": true}, "updated_at": {"title": "Updated at", "type": "string", "format": "date-time", "readOnly": true}, "thumbnail": {"title": "Thumbnail", "type": "string", "readOnly": true}}}, "ImportItemCreate": {"required": ["source_url"], "type": "object", "properties": {"source_url": {"title": "Source url", "type": "string", "maxLength": 1024, "minLength": 1}}}, "ImportItemDetail": {"type": "object", "properties": {"id": {"title": "ID", "type": "integer", "readOnly": true}, "source": {"title": "Source", "type": "string", "enum": ["youtube", "nava", "kashoob", "remote_file", "unknown"], "readOnly": true}, "input_kind": {"title": "Input kind", "type": "string", "enum": ["direct_link", "channel_page"], "readOnly": true}, "origin": {"title": "Origin", "type": "string", "enum": ["direct_link", "channel_page", "scheduled_task"], "readOnly": true}, "source_url": {"title": "Source url", "type": "string", "format": "uri", "readOnly": true, "minLength": 1}, "canonical_url": {"title": "Canonical url", "type": "string", "format": "uri", "readOnly": true, "minLength": 1}, "external_id": {"title": "External id", "type": "string", "readOnly": true, "minLength": 1}, "title": {"title": "Title", "type": "string", "readOnly": true, "minLength": 1}, "singer_name": {"title": "Singer name", "type": "string", "readOnly": true, "minLength": 1}, "duration_seconds": {"title": "Duration seconds", "type": "integer", "readOnly": true, "x-nullable": true}, "thumbnail_url": {"title": "Thumbnail url", "type": "string", "format": "uri", "readOnly": true, "minLength": 1}, "source_published_at": {"title": "Source published at", "type": "string", "format": "date-time", "readOnly": true, "x-nullable": true}, "status": {"title": "Status", "type": "string", "enum": ["queued", "discovering", "downloading", "processing", "ai_detecting", "metadata_review", "ready_to_publish", "published", "duplicate", "failed", "cancelled"], "readOnly": true}, "stage": {"title": "Stage", "type": "string", "readOnly": true, "minLength": 1}, "progress": {"title": "Progress", "type": "integer", "readOnly": true}, "ai_status": {"title": "AI status", "type": "string", "enum": ["pending", "running", "success", "failed", "skipped"], "readOnly": true}, "ai_confidence": {"title": "AI confidence", "type": "number", "readOnly": true, "x-nullable": true}, "needs_metadata_review": {"title": "Needs metadata review", "type": "boolean", "readOnly": true}, "error_message": {"title": "Error message", "type": "string", "readOnly": true, "minLength": 1}, "song_id": {"title": "Song id", "type": "string", "readOnly": true}, "created_at": {"title": "Created at", "type": "string", "format": "date-time", "readOnly": true}, "updated_at": {"title": "Updated at", "type": "string", "format": "date-time", "readOnly": true}, "task_id": {"title": "Task id", "type": "string", "readOnly": true}, "run_id": {"title": "Run id", "type": "string", "readOnly": true}, "attempts": {"title": "Attempts", "type": "integer", "readOnly": true}, "max_attempts": {"title": "Max attempts", "type": "integer", "readOnly": true}, "resolved_metadata": {"title": "Resolved metadata", "type": "object", "readOnly": true}, "ai_metadata": {"title": "Ai metadata", "type": "object", "readOnly": true}, "raw_metadata": {"title": "Raw metadata", "type": "object", "readOnly": true}, "thumbnail": {"title": "Thumbnail", "type": "string", "readOnly": true}}}, "ImportItemMetadata": {"type": "object", "properties": {"title": {"title": "Title", "type": "string", "maxLength": 512}, "singer_name": {"title": "Singer name", "type": "string", "maxLength": 255}, "ai_metadata": {"title": "Ai metadata", "type": "object"}, "needs_metadata_review": {"title": "Needs metadata review", "type": "boolean"}, "status": {"title": "Status", "type": "string", "enum": ["queued", "discovering", "downloading", "processing", "ai_detecting", "metadata_review", "ready_to_publish", "published", "duplicate", "failed", "cancelled"]}}}, "DashboardPleaseRow": {"type": "object", "properties": {"id": {"title": "ID", "type": "integer", "readOnly": true}, "translations": {"title": "Title", "type": "object"}, "live_title": {"title": "Live title", "type": "object"}, "dates": {"title": "Dates", "type": "object"}, "thumbnail": {"title": "Thumbnail", "type": "string", "readOnly": true}, "status": {"title": "Status", "type": "boolean"}, "pin_to_top": {"title": "Pin to top", "type": "boolean"}, "is_active": {"title": "Active", "description": "Use this field to activate or deactivate this entry. If active, it will be shown to users.", "type": "boolean"}, "view_count": {"title": "View count", "type": "integer", "maximum": 2147483647, "minimum": -2147483648}, "song_count": {"title": "Song count", "type": "integer", "readOnly": true}, "songs": {"title": "Songs", "type": "string", "readOnly": true}, "live_stream_link": {"title": "Live link", "type": "string", "maxLength": 255, "x-nullable": true}, "langs": {"title": "Langs", "type": "string", "readOnly": true}, "letter": {"title": "Letter", "type": "string", "readOnly": true}, "updated": {"title": "Updated", "type": "string", "format": "date-time", "readOnly": true}}}, "DashboardPleaseInput": {"type": "object", "properties": {"translations": {"title": "Title", "type": "object"}, "live_title": {"title": "Live title", "type": "object"}, "dates": {"title": "Dates", "type": "object"}, "status": {"title": "Status", "type": "boolean"}, "pin_to_top": {"title": "Pin to top", "type": "boolean"}, "is_active": {"title": "Active", "description": "Use this field to activate or deactivate this entry. If active, it will be shown to users.", "type": "boolean"}, "live_stream_link": {"title": "Live link", "type": "string", "maxLength": 255, "x-nullable": true}, "songs": {"type": "array", "items": {"type": "integer"}, "uniqueItems": true}, "thumbnail_url": {"title": "Thumbnail url", "type": "string", "x-nullable": true}}}, "DashboardPublisherRow": {"required": ["name"], "type": "object", "properties": {"id": {"title": "ID", "type": "integer", "readOnly": true}, "name": {"title": "Name", "type": "string", "maxLength": 255, "minLength": 1}, "type": {"title": "Type", "type": "string", "enum": ["YT", "IT", "WS", "TG", "AP"]}, "url": {"title": "Url", "type": "string", "format": "uri", "maxLength": 200, "x-nullable": true}, "priority": {"title": "Priority", "type": "integer", "maximum": 2147483647, "minimum": 0}, "languages": {"title": "Languages", "type": "string", "readOnly": true}, "description": {"title": "Description", "type": "string", "maxLength": 1024, "x-nullable": true}, "instagram": {"title": "Instagram", "type": "string", "maxLength": 255, "x-nullable": true}, "youtube": {"title": "Youtube", "type": "string", "maxLength": 255, "x-nullable": true}, "telegram": {"title": "Telegram", "type": "string", "maxLength": 255, "x-nullable": true}, "website": {"title": "Telegram", "type": "string", "maxLength": 255, "x-nullable": true}, "avatar": {"title": "Avatar", "type": "string", "readOnly": true}, "letter": {"title": "Letter", "type": "string", "readOnly": true}, "updated": {"title": "Updated", "type": "string", "format": "date-time", "readOnly": true}}}, "DashboardPublisherInput": {"required": ["name"], "type": "object", "properties": {"name": {"title": "Name", "type": "string", "maxLength": 255, "minLength": 1}, "type": {"title": "Type", "type": "string", "enum": ["YT", "IT", "WS", "TG", "AP"]}, "url": {"title": "Url", "type": "string", "format": "uri", "maxLength": 200, "x-nullable": true}, "priority": {"title": "Priority", "type": "integer", "maximum": 2147483647, "minimum": 0}, "languages": {"type": "array", "items": {"type": "string"}, "uniqueItems": true}, "description": {"title": "Description", "type": "string", "maxLength": 1024, "x-nullable": true}, "instagram": {"title": "Instagram", "type": "string", "maxLength": 255, "x-nullable": true}, "youtube": {"title": "Youtube", "type": "string", "maxLength": 255, "x-nullable": true}, "telegram": {"title": "Telegram", "type": "string", "maxLength": 255, "x-nullable": true}, "website": {"title": "Telegram", "type": "string", "maxLength": 255, "x-nullable": true}, "avatar_url": {"title": "Avatar url", "type": "string", "x-nullable": true}}}, "ImportRunRow": {"type": "object", "properties": {"id": {"title": "ID", "type": "integer", "readOnly": true}, "task_id": {"title": "Task id", "type": "string", "readOnly": true}, "source": {"title": "Source", "type": "string", "enum": ["youtube", "nava", "kashoob", "remote_file", "unknown"], "readOnly": true}, "source_url": {"title": "Source url", "type": "string", "format": "uri", "readOnly": true, "minLength": 1}, "scope": {"title": "Scope", "type": "object", "readOnly": true}, "status": {"title": "Status", "type": "string", "enum": ["running", "success", "failed", "cancelled"], "readOnly": true}, "discovered_count": {"title": "Discovered count", "type": "integer", "readOnly": true}, "created_count": {"title": "Created count", "type": "integer", "readOnly": true}, "duplicate_count": {"title": "Duplicate count", "type": "integer", "readOnly": true}, "failed_count": {"title": "Failed count", "type": "integer", "readOnly": true}, "summary": {"title": "Summary", "type": "string", "readOnly": true, "minLength": 1}, "error_message": {"title": "Error message", "type": "string", "readOnly": true, "minLength": 1}, "started_at": {"title": "Started at", "type": "string", "format": "date-time", "readOnly": true}, "finished_at": {"title": "Finished at", "type": "string", "format": "date-time", "readOnly": true, "x-nullable": true}, "created_at": {"title": "Created at", "type": "string", "format": "date-time", "readOnly": true}}}, "DashboardSinger": {"required": ["slug"], "type": "object", "properties": {"id": {"title": "ID", "type": "integer", "readOnly": true}, "name": {"title": "Name", "type": "string", "readOnly": true}, "latin": {"title": "Latin", "type": "string", "readOnly": true}, "avatar": {"title": "Avatar", "type": "string", "readOnly": true}, "letter": {"title": "Letter", "type": "string", "readOnly": true}, "type": {"title": "Type", "type": "string", "readOnly": true}, "singer_type": {"title": "Singer type", "type": "string", "enum": ["lecturer", "madah", "singer"]}, "works": {"title": "Works", "type": "integer", "readOnly": true}, "langs": {"title": "Langs", "type": "string", "readOnly": true}, "sub_langs": {"title": "Sub langs", "type": "string", "readOnly": true}, "status": {"title": "Status", "type": "string", "readOnly": true}, "updated": {"title": "Updated", "type": "string", "readOnly": true}, "desc": {"title": "Desc", "type": "string", "readOnly": true}, "panelId": {"title": "Panelid", "type": "string", "readOnly": true, "minLength": 1}, "slug": {"title": "Slug", "type": "string", "format": "slug", "maxLength": 255, "minLength": 1}, "translations": {"title": "Name", "type": "object"}, "view_count": {"title": "View count", "type": "integer", "readOnly": true}, "is_pinned": {"title": "Pinned", "type": "boolean"}, "ordering": {"title": "Display order", "type": "integer", "maximum": 2147483647, "minimum": 0}, "priority": {"title": "Priority", "type": "integer", "maximum": 9223372036854775807, "minimum": 0}}}, "DashboardSingerInput": {"type": "object", "properties": {"translations": {"title": "Name", "type": "object"}, "singer_type": {"title": "Singer type", "type": "string", "enum": ["lecturer", "madah", "singer"]}, "slug": {"title": "Slug", "type": "string", "format": "slug", "pattern": "^[-\\w]+$"}, "biography": {"title": "Biography", "description": "could be empty", "type": "string", "x-nullable": true}, "status": {"title": "Status", "type": "boolean"}, "languages": {"type": "array", "items": {"type": "string"}, "uniqueItems": true}, "sub_languages": {"type": "array", "items": {"type": "string"}, "uniqueItems": true}, "is_pinned": {"title": "Pinned", "type": "boolean"}, "ordering": {"title": "Display order", "type": "integer", "maximum": 2147483647, "minimum": 0}, "priority": {"title": "Priority", "type": "integer", "maximum": 9223372036854775807, "minimum": 0}, "avatar_url": {"title": "Avatar url", "type": "string", "x-nullable": true}}}, "_GenreMin": {"required": ["title"], "type": "object", "properties": {"id": {"title": "ID", "type": "integer", "readOnly": true}, "title": {"title": "Title", "type": "string", "maxLength": 119, "minLength": 1}, "slug": {"title": "Slug", "type": "string", "format": "slug", "pattern": "^[-a-zA-Z0-9_]+$", "readOnly": true, "minLength": 1}}}, "_SingerMin": {"required": ["slug"], "type": "object", "properties": {"id": {"title": "ID", "type": "integer", "readOnly": true}, "name": {"title": "Name", "type": "string", "readOnly": true}, "slug": {"title": "Slug", "type": "string", "format": "slug", "maxLength": 255, "minLength": 1}}}, "_PublisherMin": {"required": ["name"], "type": "object", "properties": {"id": {"title": "ID", "type": "integer", "readOnly": true}, "name": {"title": "Name", "type": "string", "maxLength": 255, "minLength": 1}}}, "_TagMin": {"required": ["title"], "type": "object", "properties": {"id": {"title": "ID", "type": "integer", "readOnly": true}, "title": {"title": "Title", "type": "string", "maxLength": 119, "minLength": 1}}}, "DashboardSongRow": {"required": ["slug"], "type": "object", "properties": {"id": {"title": "ID", "type": "integer", "readOnly": true}, "title": {"title": "Title", "type": "string", "readOnly": true}, "slug": {"title": "Slug", "type": "string", "format": "slug", "maxLength": 50, "minLength": 1}, "types": {"title": "Types", "type": "string", "readOnly": true}, "genre": {"$ref": "#/definitions/_GenreMin"}, "singers": {"type": "array", "items": {"$ref": "#/definitions/_SingerMin"}, "readOnly": true}, "langs": {"title": "Langs", "type": "string", "readOnly": true}, "status": {"title": "Status", "type": "boolean"}, "publisher": {"$ref": "#/definitions/_PublisherMin"}, "published_date": {"title": "Published date", "type": "string", "format": "date", "x-nullable": true}, "tags": {"type": "array", "items": {"$ref": "#/definitions/_TagMin"}, "readOnly": true}, "thumbnail": {"title": "Thumbnail", "type": "string", "readOnly": true}, "file": {"title": "File", "type": "string", "readOnly": true}, "letter": {"title": "Letter", "type": "string", "readOnly": true}, "updated": {"title": "Updated", "type": "string", "format": "date-time", "readOnly": true}, "is_pinned": {"title": "Pinned", "type": "boolean"}, "ordering": {"title": "Display order", "type": "integer", "maximum": 2147483647, "minimum": 0}}}, "DashboardSongInput": {"required": ["slug", "genre", "singers", "language"], "type": "object", "properties": {"title": {"title": "Title", "type": "object"}, "slug": {"title": "Slug", "type": "string", "format": "slug", "maxLength": 50, "minLength": 1}, "song_type": {"title": "Song type", "type": "string", "enum": ["audio", "video", "youtube"]}, "genre": {"title": "Genre", "type": "integer"}, "singers": {"type": "array", "items": {"type": "integer"}, "uniqueItems": true}, "albums": {"type": "array", "items": {"type": "integer"}, "uniqueItems": true}, "language": {"type": "array", "items": {"type": "string"}, "uniqueItems": true}, "subtitle_languages": {"type": "array", "items": {"type": "string"}, "uniqueItems": true}, "tags": {"type": "array", "items": {"type": "integer"}, "uniqueItems": true}, "publisher": {"title": "Publisher", "type": "integer", "x-nullable": true}, "status": {"title": "Status", "type": "boolean"}, "youtube_link": {"title": "Youtube link", "type": "string", "maxLength": 255, "x-nullable": true}, "audio_file_remote_server": {"title": "Audio file remote url", "type": "string", "format": "uri", "maxLength": 200, "x-nullable": true}, "file_remote_server": {"title": "File remote url", "description": "Upload file from remote server", "type": "string", "format": "uri", "maxLength": 200, "x-nullable": true}, "lyric": {"title": "Lyric", "description": "could be empty", "type": "string", "x-nullable": true}, "published_date": {"title": "Published date", "type": "string", "format": "date", "x-nullable": true}, "is_pinned": {"title": "Pinned", "type": "boolean"}, "ordering": {"title": "Display order", "type": "integer", "maximum": 2147483647, "minimum": 0}, "thumbnail_url": {"title": "Thumbnail url", "type": "string", "x-nullable": true}}}, "ImportSourceTaskRow": {"required": ["page_url"], "type": "object", "properties": {"id": {"title": "ID", "type": "integer", "readOnly": true}, "title": {"title": "Title", "type": "string", "maxLength": 255}, "source": {"title": "Source", "type": "string", "enum": ["youtube", "nava", "kashoob", "remote_file", "unknown"]}, "page_url": {"title": "Page url", "type": "string", "format": "uri", "maxLength": 1024, "minLength": 1}, "external_id": {"title": "External id", "type": "string", "maxLength": 255}, "frequency_days": {"title": "Frequency days", "type": "integer", "maximum": 32767, "minimum": 0}, "run_time": {"title": "Run time", "type": "string"}, "max_items_per_run": {"title": "Max items per run", "type": "integer", "maximum": 32767, "minimum": 0}, "only_new_items": {"title": "Only new items", "type": "boolean"}, "ignore_duplicates": {"title": "Ignore duplicates", "type": "boolean"}, "auto_stop_on_errors": {"title": "Auto stop on errors", "type": "boolean"}, "notify_on_error": {"title": "Notify on error", "type": "boolean"}, "enabled": {"title": "Enabled", "type": "boolean"}, "last_run_at": {"title": "Last run at", "type": "string", "format": "date-time", "readOnly": true, "x-nullable": true}, "next_run_at": {"title": "Next run at", "type": "string", "format": "date-time", "readOnly": true, "x-nullable": true}, "last_run_status": {"title": "Last run status", "type": "string", "readOnly": true, "minLength": 1}, "new_items_last_run": {"title": "New items last run", "type": "integer", "readOnly": true}, "error_streak": {"title": "Error streak", "type": "integer", "readOnly": true}, "created_at": {"title": "Created at", "type": "string", "format": "date-time", "readOnly": true}, "updated_at": {"title": "Updated at", "type": "string", "format": "date-time", "readOnly": true}}}, "ImportSourceTaskInput": {"required": ["page_url"], "type": "object", "properties": {"title": {"title": "Title", "type": "string", "maxLength": 255}, "source": {"title": "Source", "type": "string", "enum": ["youtube", "nava", "kashoob", "remote_file", "unknown"]}, "page_url": {"title": "Page url", "type": "string", "format": "uri", "maxLength": 1024, "minLength": 1}, "frequency_days": {"title": "Frequency days", "type": "integer", "maximum": 32767, "minimum": 0}, "run_time": {"title": "Run time", "type": "string"}, "max_items_per_run": {"title": "Max items per run", "type": "integer", "maximum": 32767, "minimum": 0}, "only_new_items": {"title": "Only new items", "type": "boolean"}, "ignore_duplicates": {"title": "Ignore duplicates", "type": "boolean"}, "auto_stop_on_errors": {"title": "Auto stop on errors", "type": "boolean"}, "notify_on_error": {"title": "Notify on error", "type": "boolean"}, "enabled": {"title": "Enabled", "type": "boolean"}}}, "DashboardTagRow": {"type": "object", "properties": {"id": {"title": "ID", "type": "integer", "readOnly": true}, "translations": {"title": "Translations", "type": "string", "readOnly": true}, "slug": {"title": "Slug", "type": "string", "readOnly": true, "minLength": 1}, "song_count": {"title": "Song count", "type": "integer", "readOnly": true}, "letter": {"title": "Letter", "type": "string", "readOnly": true}}}, "DashboardTagInput": {"type": "object", "properties": {"translations": {"title": "Translations", "type": "object"}, "slug": {"title": "Slug", "type": "string"}}}, "_Upload": {"type": "object", "properties": {"file": {"title": "File", "type": "string", "readOnly": true, "format": "uri"}}}, "YoutubeInfo": {"required": ["youtube_link"], "type": "object", "properties": {"thumbnail": {"title": "Thumbnail", "type": "string", "readOnly": true, "minLength": 1}, "title": {"title": "Title", "type": "string", "readOnly": true, "minLength": 1}, "description": {"title": "Description", "type": "string", "readOnly": true, "minLength": 1}, "youtube_link": {"title": "Youtube link", "type": "string", "format": "uri", "minLength": 1}, "language_code": {"title": "Language code", "type": "string", "readOnly": true, "minLength": 1, "x-nullable": true}}}, "ShrineLive": {"type": "object", "properties": {"id": {"title": "ID", "type": "integer", "readOnly": true}, "title": {"title": "Title", "type": "string", "readOnly": true}, "live_title": {"title": "Live title", "type": "string", "readOnly": true}, "thumbnail": {"title": "Thumbnail", "type": "string", "readOnly": true}, "live_stream_link": {"title": "Live stream link", "type": "string", "readOnly": true}, "status": {"title": "Status", "type": "boolean"}, "pin_to_top": {"title": "Pin to top", "type": "boolean"}, "live_count": {"title": "Live count", "type": "string", "readOnly": true}}}, "HussainiyaProviderProfileSerializer": {"required": ["role", "languages", "avatar"], "type": "object", "properties": {"full_name": {"title": "Full name", "type": "string", "maxLength": 254, "minLength": 1, "x-nullable": true}, "bio": {"title": "Bio", "type": "string", "maxLength": 512, "x-nullable": true}, "role": {"title": "Role", "type": "string", "enum": ["lecturer", "madah", "singer"]}, "birthdate": {"title": "Birthdate", "type": "string", "format": "date", "x-nullable": true}, "email": {"title": "Email", "type": "string", "format": "email", "maxLength": 254, "x-nullable": true}, "wa_number": {"title": "Whatsapp number", "type": "string", "maxLength": 255, "x-nullable": true}, "institution_name": {"title": "Name", "description": "Name of the institute", "type": "string", "maxLength": 255, "x-nullable": true}, "languages": {"type": "array", "items": {"type": "string"}}, "avatar": {"title": "Avatar", "type": "string", "minLength": 1}, "social_medias": {"title": "Social medias", "description": "Provider social media profiles", "type": "object"}}}, "CreateSong": {"required": ["genre", "albums", "title", "language"], "type": "object", "properties": {"youtube_link": {"title": "Youtube link", "type": "string", "maxLength": 255, "x-nullable": true}, "file_path": {"title": "File path", "type": "string", "x-nullable": true}, "thumbnail": {"title": "Thumbnail", "type": "string", "x-nullable": true}, "genre": {"title": "Genre", "type": "integer"}, "albums": {"type": "array", "items": {"type": "integer"}, "uniqueItems": true}, "title": {"type": "array", "items": {"type": "object", "required": ["title", "language_code"], "properties": {"title": {"title": "title", "type": "string"}, "language_code": {"title": "language code", "description": "eg. en, da", "type": "string"}}}}, "slug": {"title": "Slug", "type": "string", "readOnly": true}, "language": {"description": "eg. [en, fa, ...]", "type": "array", "items": {"type": "string", "minLength": 1}}}}, "UpdateSong": {"required": ["genre", "albums"], "type": "object", "properties": {"thumbnail": {"title": "Thumbnail", "type": "string", "x-nullable": true}, "genre": {"title": "Genre", "type": "integer"}, "albums": {"type": "array", "items": {"type": "integer"}, "uniqueItems": true}, "title": {"type": "array", "items": {"type": "object", "required": ["title", "language_code"], "properties": {"title": {"title": "title", "type": "string"}, "language_code": {"title": "language code", "description": "eg. en, da", "type": "string"}}}}, "language": {"description": "eg. [en, fa, ...]", "type": "array", "items": {"type": "string", "minLength": 1}}}}, "PlaylistTabCollection": {"required": ["id", "title", "song_count", "is_personal", "editable"], "type": "object", "properties": {"id": {"title": "Id", "type": "string", "minLength": 1}, "title": {"title": "Title", "type": "string", "minLength": 1, "x-nullable": true}, "song_count": {"title": "Song count", "type": "integer"}, "is_personal": {"title": "Is personal", "type": "boolean"}, "editable": {"title": "Editable", "type": "boolean"}}}, "SingerSong": {"required": ["slug"], "type": "object", "properties": {"name": {"title": "Name", "type": "string", "readOnly": true}, "singer_type": {"title": "Singer type", "type": "string", "enum": ["lecturer", "madah", "singer"]}, "songs_count": {"title": "Songs count", "type": "integer", "readOnly": true}, "slug": {"title": "Slug", "type": "string", "format": "slug", "maxLength": 255, "minLength": 1}, "languages": {"type": "array", "items": {"type": "string"}, "readOnly": true, "uniqueItems": true}, "avatar": {"title": "Avatar", "type": "string", "readOnly": true}, "songs": {"title": "Songs", "type": "string", "readOnly": true}}}, "Seo": {"type": "object", "properties": {"title": {"title": "Seo title", "description": "maximum length of page title is 70 characters and minimum length is 30", "type": "string", "maxLength": 140, "x-nullable": true}, "keywords": {"title": "Keywords", "description": "keywords in the content that make it possible for people to find the site via search engines", "type": "string", "maxLength": 255, "x-nullable": true}, "description": {"title": "Description", "description": "describes and summarizes the contents of the page for the benefit of users and search engines", "type": "string", "maxLength": 170, "x-nullable": true}}}, "SongDetail": {"required": ["slug"], "type": "object", "properties": {"title": {"title": "Title", "type": "string", "readOnly": true}, "slug": {"title": "Slug", "type": "string", "format": "slug", "maxLength": 50, "minLength": 1}, "singers": {"type": "array", "items": {"$ref": "#/definitions/SingersList"}, "readOnly": true}, "file": {"title": "File", "type": "string", "readOnly": true}, "song_type": {"title": "Song type", "type": "string", "enum": ["audio", "video", "youtube"]}, "thumbnail": {"title": "Thumbnail", "type": "string", "readOnly": true}, "lyric": {"title": "Lyric", "description": "could be empty", "type": "string", "x-nullable": true}, "published_date": {"title": "Published date", "type": "string", "format": "date", "x-nullable": true}, "info": {"title": "Info", "type": "object", "x-nullable": true}, "genre": {"$ref": "#/definitions/GenreList"}, "view_count": {"title": "View count", "type": "integer", "maximum": 9223372036854775807, "minimum": 0}, "like_count": {"title": "Like count", "type": "string", "readOnly": true}, "language": {"type": "array", "items": {"$ref": "#/definitions/Language"}, "readOnly": true}, "is_playlist": {"title": "Is playlist", "type": "string", "readOnly": true}, "seo_fields": {"$ref": "#/definitions/Seo"}, "publisher": {"$ref": "#/definitions/Publisher"}, "is_liked": {"title": "Is liked", "type": "string", "readOnly": true}, "is_youtube": {"title": "Is youtube", "type": "string", "readOnly": true}, "youtube_audio_file": {"title": "Youtube audio file", "type": "string", "readOnly": true}}}, "ImportantNotice": {"type": "object", "properties": {"id": {"title": "ID", "type": "integer", "readOnly": true}, "title": {"title": "Title", "type": "string", "x-nullable": true}, "subtitle": {"title": "Subtitle", "type": "string", "x-nullable": true}, "alert_color": {"title": "Alert color", "type": "string", "enum": ["#FF0000", "#FFFF00", "#00FF00", "#0000FF"], "x-nullable": true}, "alert_color_display": {"title": "Alert color display", "type": "string", "readOnly": true, "minLength": 1}, "small_image": {"title": "Small image", "type": "string", "readOnly": true, "x-nullable": true, "format": "uri"}, "target_route": {"title": "Target route", "type": "string", "maxLength": 255, "x-nullable": true}, "language": {"title": "Language", "type": "integer", "x-nullable": true}, "status": {"title": "Status", "type": "boolean"}}}, "GroupKhatm": {"required": ["group_type"], "type": "object", "properties": {"id": {"title": "ID", "type": "integer", "readOnly": true}, "name": {"title": "Name", "type": "string", "minLength": 1}, "slug": {"title": "Slug", "type": "string", "readOnly": true}, "language_code": {"title": "Language code", "type": "string", "readOnly": true}, "language_name": {"title": "Language name", "type": "string", "readOnly": true}, "thumbnail": {"title": "Thumbnail", "type": "string", "minLength": 1, "x-nullable": true}, "users_count": {"title": "Users count", "type": "string", "readOnly": true}, "current_round": {"title": "Current round", "type": "string", "readOnly": true}, "total_pages_read": {"title": "Total pages read", "type": "integer", "readOnly": true}, "created_by": {"title": "Created by", "type": "string", "readOnly": true}, "created_at": {"title": "Created at", "type": "string", "format": "date-time", "readOnly": true}, "group_type": {"title": "Group type", "type": "string", "enum": ["public", "private"]}, "progress_percentage": {"title": "Progress percentage", "type": "string", "readOnly": true}, "pages": {"title": "Pages", "type": "string", "readOnly": true}}}, "ReadPage": {"required": ["page_user_id"], "type": "object", "properties": {"page_user_id": {"title": "Page user id", "type": "integer", "minimum": 1}, "last_page_read": {"title": "Last page read", "type": "integer", "readOnly": true}, "total_pages_read_group": {"title": "Total pages read group", "type": "integer", "readOnly": true}, "remaining_pages": {"title": "Remaining pages", "type": "string", "readOnly": true}}}, "IndividualKhatm": {"required": ["name", "session_type", "session_value"], "type": "object", "properties": {"name": {"title": "Name", "type": "string", "minLength": 1}, "slug": {"title": "Slug", "type": "string", "format": "slug", "pattern": "^[-a-zA-Z0-9_]+$", "readOnly": true, "minLength": 1}, "session_type": {"title": "Session type", "type": "string", "enum": ["page", "juz"]}, "session_value": {"title": "Session value", "type": "integer"}, "last_session_read": {"title": "Last session read", "type": "integer", "readOnly": true}, "total_sessions": {"title": "Total Sessions", "type": "integer", "readOnly": true}, "total_count_info": {"title": "Total count info", "type": "string", "readOnly": true}, "progress_percentage": {"title": "Progress percentage", "type": "string", "readOnly": true}, "total_pages_read": {"title": "Pages read", "type": "string", "readOnly": true}}}, "IndividualKhatmUpdate": {"required": ["name"], "type": "object", "properties": {"name": {"title": "Name", "type": "string", "maxLength": 100, "minLength": 1}}}, "IndividualReadPage": {"required": ["session"], "type": "object", "properties": {"session": {"title": "Session", "type": "integer"}, "remaining_pages": {"title": "Remaining pages", "type": "integer", "readOnly": true}}}, "UserGroupKhatm": {"required": ["khatm", "from_page", "to_page", "pages_count"], "type": "object", "properties": {"id": {"title": "ID", "type": "integer", "readOnly": true}, "khatm": {"$ref": "#/definitions/GroupKhatm"}, "guest_fullname": {"title": "Guest fullname", "type": "string", "maxLength": 255, "x-nullable": true}, "guest_wa_number": {"title": "Guest whatsapp number", "type": "string", "maxLength": 255, "x-nullable": true}, "from_page": {"title": "From page", "type": "integer", "maximum": 32767, "minimum": 0}, "to_page": {"title": "To page", "type": "integer", "maximum": 32767, "minimum": 0}, "pages_count": {"title": "Pages count", "type": "integer", "maximum": 32767, "minimum": 0}, "last_page_read": {"title": "Last page read", "type": "integer", "maximum": 2147483647, "minimum": 0}, "created_at": {"title": "Joined at", "type": "string", "format": "date-time", "readOnly": true}}}, "BannerList": {"required": ["description"], "type": "object", "properties": {"id": {"title": "ID", "type": "integer", "readOnly": true}, "title": {"title": "Title", "type": "string", "readOnly": true}, "description": {"title": "Description", "type": "string", "minLength": 1}, "covers": {"title": "Covers", "type": "string", "readOnly": true}}}, "Author": {"type": "object", "properties": {"id": {"title": "ID", "type": "integer", "readOnly": true}, "name": {"title": "Name", "type": "string", "readOnly": true}, "avatar": {"title": "Avatar", "type": "string", "readOnly": true}}}, "BookList": {"required": ["title", "author", "type"], "type": "object", "properties": {"title": {"title": "Title", "type": "string", "maxLength": 255, "minLength": 1}, "slug": {"title": "Slug", "type": "string", "format": "slug", "pattern": "^[-a-zA-Z0-9_]+$", "readOnly": true, "minLength": 1}, "thumbnail": {"title": "Thumbnail", "type": "string", "readOnly": true}, "price": {"title": "Price (Coin)", "type": "string", "format": "decimal"}, "author": {"type": "array", "items": {"$ref": "#/definitions/Author"}}, "type": {"title": "Type", "type": "string", "minLength": 1}, "rates": {"title": "Rates", "type": "string", "readOnly": true}, "is_bookmark": {"title": "Is bookmark", "type": "boolean", "default": false}}}, "BookListSerializerEditorSuggestion": {"required": ["author"], "type": "object", "properties": {"slug": {"title": "Slug", "type": "string", "format": "slug", "pattern": "^[-a-zA-Z0-9_]+$", "readOnly": true, "minLength": 1}, "author": {"type": "array", "items": {"$ref": "#/definitions/Author"}}, "thumbnail": {"title": "Thumbnail", "type": "string", "readOnly": true}, "summary": {"title": "Summary", "description": "could be null", "type": "string", "maxLength": 512, "x-nullable": true}}}, "BookListV2": {"required": ["title", "author", "file_types"], "type": "object", "properties": {"id": {"title": "ID", "type": "integer", "readOnly": true}, "title": {"title": "Title", "type": "string", "maxLength": 255, "minLength": 1}, "slug": {"title": "Slug", "type": "string", "format": "slug", "pattern": "^[-a-zA-Z0-9_]+$", "readOnly": true, "minLength": 1}, "thumbnail": {"title": "Thumbnail", "type": "string", "readOnly": true}, "price": {"title": "Price (Coin)", "type": "string", "format": "decimal"}, "discount_percentage": {"title": "Discount Percentage", "description": "Discount percentage as an integer between 0 and 100", "type": "integer", "maximum": 2147483647, "minimum": 0}, "final_price": {"title": "Final Price (Coin)", "description": "This field is automatically calculated based on the discount percentage.", "type": "string", "format": "decimal"}, "author": {"type": "array", "items": {"$ref": "#/definitions/Author"}}, "file_types": {"type": "array", "items": {"type": "string", "minLength": 1}}, "rates": {"title": "Rates", "type": "string", "readOnly": true}, "is_bookmark": {"title": "Is bookmark", "type": "boolean", "default": false}}}, "BookFiles": {"required": ["title"], "type": "object", "properties": {"title": {"title": "Title", "type": "string", "maxLength": 255, "minLength": 1}, "file": {"title": "File", "type": "string", "readOnly": true, "format": "uri"}, "pages_count": {"title": "Number of Pages", "description": "eg. 34", "type": "string", "maxLength": 255, "minLength": 1, "x-nullable": true}}}, "BookPublisher": {"required": ["username", "name"], "type": "object", "properties": {"username": {"title": "Username", "type": "string", "minLength": 1, "x-nullable": true}, "name": {"title": "Name", "type": "string", "minLength": 1}, "avatar": {"title": "Avatar", "type": "string", "readOnly": true}}}, "BookDetail": {"required": ["title", "author", "type", "files", "language", "publisher"], "type": "object", "properties": {"title": {"title": "Title", "type": "string", "maxLength": 255, "minLength": 1}, "slug": {"title": "Slug", "type": "string", "format": "slug", "pattern": "^[-a-zA-Z0-9_]+$", "readOnly": true, "minLength": 1}, "is_bookmark": {"title": "Is bookmark", "type": "boolean", "default": false}, "thumbnail": {"title": "Thumbnail", "type": "string", "readOnly": true}, "price": {"title": "Price (Coin)", "type": "string", "format": "decimal"}, "author": {"type": "array", "items": {"$ref": "#/definitions/Author"}}, "type": {"title": "Type", "type": "string", "minLength": 1}, "narrator": {"title": "Narrator", "type": "string", "readOnly": true}, "files": {"type": "array", "items": {"$ref": "#/definitions/BookFiles"}}, "pages_count": {"title": "Number of Pages", "description": "eg. 34", "type": "string", "maxLength": 255, "minLength": 1, "x-nullable": true}, "view_count": {"title": "View count", "type": "integer", "maximum": 9223372036854775807, "minimum": 0}, "download_count": {"title": "Download count", "type": "integer", "default": 9}, "language": {"type": "array", "items": {"$ref": "#/definitions/Language"}}, "summary": {"title": "Summary", "description": "could be null", "type": "string", "maxLength": 512, "x-nullable": true}, "publisher": {"$ref": "#/definitions/BookPublisher"}, "rates": {"title": "Rates", "type": "string", "readOnly": true}, "related": {"title": "Related", "type": "string", "readOnly": true}}}, "UserRate": {"type": "object", "properties": {"name": {"title": "Name", "type": "string", "readOnly": true}, "avatar": {"title": "Avatar", "type": "string", "readOnly": true}, "rate": {"title": "Rate", "type": "integer", "maximum": 32767, "minimum": 0, "x-nullable": true}, "note": {"title": "Note", "type": "string", "maxLength": 512, "x-nullable": true}, "date": {"title": "Date", "type": "string", "format": "date-time", "readOnly": true}}}, "Category": {"required": ["icon", "book_count"], "type": "object", "properties": {"title": {"title": "Title", "type": "string", "readOnly": true, "x-nullable": true}, "id": {"title": "ID", "type": "integer", "readOnly": true}, "icon": {"title": "Icon", "description": "fontawesome icon. eg. fa-book", "type": "string", "maxLength": 32, "minLength": 1}, "book_count": {"title": "Book count", "type": "integer", "x-nullable": true}}}, "Files": {"required": ["title", "pdf_file"], "type": "object", "properties": {"title": {"title": "Title", "type": "string", "maxLength": 255, "minLength": 1}, "pdf_file": {"title": "Pdf file", "type": "string", "minLength": 1}, "pages_count": {"title": "Number of Pages", "description": "eg. 34", "type": "string", "maxLength": 255, "minLength": 1, "x-nullable": true}}}, "CreateBook": {"required": ["title", "thumbnail", "files"], "type": "object", "properties": {"title": {"title": "Title", "type": "string", "maxLength": 255, "minLength": 1}, "price": {"title": "Price (Coin)", "type": "string", "format": "decimal"}, "summary": {"title": "Summary", "description": "could be null", "type": "string", "maxLength": 512, "x-nullable": true}, "description": {"title": "Description", "description": "could be null", "type": "string", "x-nullable": true}, "thumbnail": {"title": "Thumbnail", "type": "string", "minLength": 1}, "tags": {"type": "array", "items": {"type": "integer"}, "uniqueItems": true}, "categories": {"type": "array", "items": {"type": "integer"}, "uniqueItems": true}, "authors": {"type": "array", "items": {"type": "integer"}, "uniqueItems": true}, "translators": {"type": "array", "items": {"type": "integer"}, "uniqueItems": true}, "narrators": {"type": "array", "items": {"type": "integer"}, "uniqueItems": true}, "publish_year": {"title": "Publish year", "description": "eg. 1998", "type": "integer", "maximum": 2147483647, "minimum": 0, "x-nullable": true}, "vol_count": {"title": "Number of Volumes", "description": "eg. 3", "type": "integer", "maximum": 2147483647, "minimum": 0, "x-nullable": true}, "isbn": {"title": "ISBN", "type": "string", "maxLength": 225, "x-nullable": true}, "files": {"type": "array", "items": {"$ref": "#/definitions/Files"}}}}, "PublisherList": {"required": ["full_name", "book_count"], "type": "object", "properties": {"full_name": {"title": "Full name", "type": "string", "maxLength": 255, "minLength": 1}, "avatar": {"title": "Avatar", "type": "string", "readOnly": true}, "book_count": {"title": "Book count", "type": "integer", "x-nullable": true}, "id": {"title": "ID", "type": "integer", "readOnly": true}}}, "BookFilesV2": {"required": ["title"], "type": "object", "properties": {"title": {"title": "Title", "type": "string", "maxLength": 255, "minLength": 1}, "file": {"title": "File", "type": "string", "readOnly": true, "format": "uri"}, "type": {"title": "File Type", "type": "string", "enum": ["pdf", "html", "epub", "docx", "audio"]}, "pages_count": {"title": "Number of Pages", "description": "eg. 34", "type": "string", "maxLength": 255, "minLength": 1, "x-nullable": true}, "volume": {"title": "Volume", "description": "The volume number of the book, e.g., 1 for first volume.", "type": "integer", "maximum": 2147483647, "minimum": -2147483648, "x-nullable": true}}}, "BookDetailV2": {"required": ["title", "author", "file_types", "book_files", "language", "publisher", "categories"], "type": "object", "properties": {"id": {"title": "ID", "type": "integer", "readOnly": true}, "title": {"title": "Title", "type": "string", "maxLength": 255, "minLength": 1}, "slug": {"title": "Slug", "type": "string", "format": "slug", "pattern": "^[-a-zA-Z0-9_]+$", "readOnly": true, "minLength": 1}, "is_bookmark": {"title": "Is bookmark", "type": "boolean", "default": false}, "is_download": {"title": "Is download", "type": "boolean", "default": false}, "price": {"title": "Price (Coin)", "type": "string", "format": "decimal"}, "discount_percentage": {"title": "Discount Percentage", "description": "Discount percentage as an integer between 0 and 100", "type": "integer", "maximum": 2147483647, "minimum": 0}, "final_price": {"title": "Final Price (Coin)", "description": "This field is automatically calculated based on the discount percentage.", "type": "string", "format": "decimal"}, "thumbnail": {"title": "Thumbnail", "type": "string", "readOnly": true}, "author": {"type": "array", "items": {"$ref": "#/definitions/Author"}}, "file_types": {"type": "array", "items": {"type": "string", "minLength": 1}}, "view_count": {"title": "View count", "type": "integer", "maximum": 9223372036854775807, "minimum": 0}, "download_count": {"title": "Download count", "type": "string", "readOnly": true}, "narrator": {"title": "Narrator", "type": "string", "readOnly": true}, "book_files": {"type": "array", "items": {"$ref": "#/definitions/BookFilesV2"}}, "pages_count": {"title": "Number of Pages", "description": "eg. 34", "type": "string", "maxLength": 255, "minLength": 1, "x-nullable": true}, "language": {"type": "array", "items": {"$ref": "#/definitions/Language"}}, "description": {"title": "Description", "description": "could be null", "type": "string", "x-nullable": true}, "summary": {"title": "Summary", "description": "could be null", "type": "string", "maxLength": 512, "x-nullable": true}, "publisher": {"$ref": "#/definitions/BookPublisher"}, "categories": {"type": "array", "items": {"$ref": "#/definitions/Category"}}, "rates": {"title": "Rates", "type": "string", "readOnly": true}, "sample_file": {"title": "Sample file", "type": "string", "readOnly": true}, "related": {"title": "Related", "type": "string", "readOnly": true}}}, "AuthorList": {"required": ["slug", "book_count"], "type": "object", "properties": {"slug": {"title": "Slug", "type": "string", "minLength": 1}, "name": {"title": "Name", "type": "string", "readOnly": true}, "avatar": {"title": "Avatar", "type": "string", "readOnly": true}, "book_count": {"title": "Book count", "type": "integer", "x-nullable": true}}}, "MafatihCategories": {"required": ["language"], "type": "object", "properties": {"id": {"title": "ID", "type": "integer", "readOnly": true}, "name": {"title": "Name", "type": "string", "readOnly": true}, "thumbnails": {"title": "Thumbnails", "type": "string", "readOnly": true}, "duas_index": {"title": "Duas index", "type": "string", "readOnly": true}, "language": {"$ref": "#/definitions/Language"}, "children": {"title": "Children", "type": "string", "readOnly": true}}}, "DuaCategories": {"type": "object", "properties": {"id": {"title": "ID", "type": "integer", "readOnly": true}, "name": {"title": "Name", "type": "string", "readOnly": true}, "thumbnails": {"title": "Thumbnails", "type": "string", "readOnly": true}, "duas_index": {"title": "Duas index", "type": "string", "readOnly": true}, "language": {"title": "Language", "type": "string", "readOnly": true}, "children": {"title": "Children", "type": "string", "readOnly": true}}}, "MafatihDuaPart": {"type": "object", "properties": {"id": {"title": "ID", "type": "integer", "readOnly": true}, "dua_part_index": {"title": "Dua part index", "type": "string", "readOnly": true}, "text": {"title": "Text", "type": "string", "x-nullable": true}, "translation": {"title": "Translation", "type": "string", "x-nullable": true}, "local_alpha": {"title": "Local alpha", "type": "string", "x-nullable": true}, "mafatih_dua_id": {"title": "Mafatih dua id", "type": "string", "readOnly": true}, "description": {"title": "Description", "type": "string", "x-nullable": true}}}, "DuaPartSerializer": {"type": "object", "properties": {"id": {"title": "ID", "type": "integer", "readOnly": true}, "dua_part_index": {"title": "Dua part index", "type": "string", "readOnly": true}, "text": {"title": "Text", "type": "string", "x-nullable": true}, "translation": {"title": "Translation", "type": "string", "readOnly": true}, "local_alpha": {"title": "Local alpha", "type": "string", "readOnly": true}, "dua_id": {"title": "Dua id", "type": "string", "readOnly": true}, "description": {"title": "Description", "type": "string", "readOnly": true}}}, "MafatihDua": {"required": ["title"], "type": "object", "properties": {"id": {"title": "ID", "type": "integer", "readOnly": true}, "title": {"title": "Title", "type": "string", "maxLength": 192, "minLength": 1}, "duas_part_list": {"type": "array", "items": {"type": "integer"}, "readOnly": true, "uniqueItems": true}, "dates": {"title": "Dates", "description": "لیستی از تاریخ های قمری مربوط به قطعه", "type": "object", "x-nullable": true}, "weekdays": {"title": "Weekdays", "type": "string", "readOnly": true}, "audio_sync_data": {"title": "Audio sync data", "type": "string", "readOnly": true}, "audio": {"title": "Audio", "type": "string", "readOnly": true}}}, "DuaAudioDetail": {"required": ["reciter"], "type": "object", "properties": {"reciter": {"title": "Reciter", "type": "string", "maxLength": 119, "minLength": 1}, "audio": {"title": "Audio", "type": "string", "readOnly": true}, "audio_sync_data": {"title": "Audio sync data", "type": "object"}}}, "MafatihDuaSerializerV2": {"required": ["title", "audios"], "type": "object", "properties": {"id": {"title": "ID", "type": "integer", "readOnly": true}, "title": {"title": "Title", "type": "string", "maxLength": 192, "minLength": 1}, "duas_part_list": {"type": "array", "items": {"type": "integer"}, "readOnly": true, "uniqueItems": true}, "dates": {"title": "Dates", "description": "لیستی از تاریخ های قمری مربوط به قطعه", "type": "object", "x-nullable": true}, "weekdays": {"title": "Weekdays", "type": "string", "readOnly": true}, "audios": {"type": "array", "items": {"$ref": "#/definitions/DuaAudioDetail"}}}}, "DuaAudioDetailV3": {"type": "object", "properties": {"reciter": {"title": "Reciter", "type": "string", "readOnly": true}, "audio": {"title": "Audio", "type": "string", "readOnly": true}, "audio_sync_data": {"title": "Audio sync data", "type": "object"}}}, "MafatihDuaSerializerV3": {"required": ["audios"], "type": "object", "properties": {"id": {"title": "ID", "type": "integer", "readOnly": true}, "title": {"title": "Title", "type": "string", "readOnly": true}, "similar_titles": {"title": "Similar Titles", "type": "object", "x-nullable": true}, "duas_part_list": {"type": "array", "items": {"type": "integer"}, "readOnly": true, "uniqueItems": true}, "dates": {"title": "Dates", "description": "لیستی از تاریخ های قمری مربوط به قطعه", "type": "object", "x-nullable": true}, "weekdays": {"title": "Weekdays", "type": "string", "readOnly": true}, "audios": {"type": "array", "items": {"$ref": "#/definitions/DuaAudioDetailV3"}}}}, "DuaAudioList": {"required": ["reciter"], "type": "object", "properties": {"id": {"title": "ID", "type": "integer", "readOnly": true}, "reciter": {"title": "Reciter", "type": "string", "maxLength": 119, "minLength": 1}}}, "Masael": {"required": ["title", "content"], "type": "object", "properties": {"id": {"title": "ID", "type": "integer", "readOnly": true}, "title": {"title": "Title", "type": "string", "maxLength": 255, "minLength": 1}, "content": {"title": "Content", "type": "string", "minLength": 1}, "category": {"title": "Category", "type": "string", "readOnly": true}, "root_id": {"title": "Root id", "type": "string", "readOnly": true}}}, "MarjaaGuide": {"required": ["language"], "type": "object", "properties": {"title": {"title": "Title", "type": "string", "x-nullable": true}, "language": {"$ref": "#/definitions/Language"}, "answer": {"title": "Answer", "type": "string", "x-nullable": true}, "priority": {"title": "Priority", "type": "integer", "maximum": 2147483647, "minimum": -2147483648}}}, "MasaelContent": {"required": ["text"], "type": "object", "properties": {"id": {"title": "ID", "type": "integer", "readOnly": true}, "header": {"title": "Header", "type": "string", "x-nullable": true}, "text": {"title": "Text", "type": "string", "minLength": 1}, "answer": {"title": "Answer", "type": "string", "x-nullable": true}, "priority": {"title": "Priority", "type": "integer", "maximum": 2147483647, "minimum": 0, "x-nullable": true}}}, "MasaelSerializerV2": {"required": ["title"], "type": "object", "properties": {"id": {"title": "ID", "type": "integer", "readOnly": true}, "priority": {"title": "Priority", "type": "integer", "maximum": 2147483647, "minimum": 0, "x-nullable": true}, "category": {"title": "Category", "type": "integer", "x-nullable": true}, "title": {"title": "Title", "type": "string", "maxLength": 255, "minLength": 1}, "contents": {"type": "array", "items": {"$ref": "#/definitions/MasaelContent"}, "readOnly": true}}}, "Note": {"required": ["service", "object_id", "note_text"], "type": "object", "properties": {"id": {"title": "ID", "type": "integer", "readOnly": true}, "service": {"title": "Service", "type": "string", "enum": ["quran", "mafatih", "hadis", "habit"]}, "object_id": {"title": "Object id", "type": "integer", "maximum": 2147483647, "minimum": -2147483648}, "user": {"title": "User", "type": "string", "readOnly": true}, "note_text": {"title": "Note text", "type": "string", "minLength": 1}, "created_at": {"title": "Created at", "type": "string", "format": "date-time", "readOnly": true}, "updated_at": {"title": "Updated at", "type": "string", "format": "date-time", "readOnly": true}, "feedback_count": {"title": "Feedback count", "type": "string", "readOnly": true}, "language": {"title": "Language", "type": "string", "readOnly": true}, "request_user_feedback": {"title": "Request user feedback", "type": "string", "readOnly": true}}}, "NoteFeedback": {"required": ["note"], "type": "object", "properties": {"note": {"title": "Note", "type": "integer"}, "is_positive": {"title": "Is positive", "type": "boolean"}, "user": {"title": "User", "type": "integer", "readOnly": true, "x-nullable": true}}}, "Plan": {"required": ["price"], "type": "object", "properties": {"id": {"title": "ID", "type": "integer", "readOnly": true}, "title": {"title": "Title", "type": "string", "readOnly": true}, "price": {"title": "Price", "type": "string", "format": "decimal"}, "services": {"title": "Services", "type": "object"}, "duration": {"title": "Duration", "description": "Duration in days", "type": "integer", "maximum": 2147483647, "minimum": 0}}}, "Subscribe": {"required": ["plan"], "type": "object", "properties": {"plan": {"title": "Plan", "type": "integer"}, "activated_at": {"title": "Activated at", "type": "string", "format": "date", "readOnly": true}, "expire_at": {"title": "Expire at", "type": "string", "format": "date", "readOnly": true}, "remaining_days": {"title": "Remaining days", "type": "integer", "readOnly": true}, "remaining_credits": {"title": "Remaining credits", "type": "object", "readOnly": true}}}, "QuranPart": {"required": ["index", "start_at", "end_at"], "type": "object", "properties": {"index": {"title": "Index", "type": "integer", "maximum": 2147483647, "minimum": 0}, "start_at": {"title": "Start at", "type": "integer", "maximum": 2147483647, "minimum": 0}, "end_at": {"title": "End at", "type": "integer", "maximum": 2147483647, "minimum": 0}}}, "QuranSuraTranslation": {"required": ["text"], "type": "object", "properties": {"sura_id": {"title": "Sura id", "type": "string", "readOnly": true}, "text": {"title": "Text", "type": "string", "minLength": 1}}}, "QuranSura": {"required": ["index", "name", "verse_count", "nozul_type", "start_at", "end_at"], "type": "object", "properties": {"index": {"title": "Index", "type": "integer", "maximum": 2147483647, "minimum": 0}, "name": {"title": "Name", "type": "string", "maxLength": 192, "minLength": 1}, "similar_names": {"title": "Similar Names", "type": "object", "x-nullable": true}, "verse_count": {"title": "Verse count", "type": "integer", "maximum": 2147483647, "minimum": 0}, "nozul_type": {"title": "Nozul type", "type": "string", "enum": ["Meccan", "Medinan"]}, "start_at": {"title": "Start at", "type": "integer", "maximum": 2147483647, "minimum": 0}, "end_at": {"title": "End at", "type": "integer", "maximum": 2147483647, "minimum": 0}}}, "QuranTranslators": {"required": ["translator", "language_code"], "type": "object", "properties": {"translator": {"title": "Translator", "type": "string", "maxLength": 192, "minLength": 1}, "translator_en": {"title": "Translator en", "type": "string", "maxLength": 192, "minLength": 1, "x-nullable": true}, "language_code": {"title": "Language code", "type": "string", "maxLength": 2, "minLength": 1}}}, "QuranVerseLocalization": {"required": ["text"], "type": "object", "properties": {"verse_id": {"title": "Verse id", "type": "string", "readOnly": true}, "text": {"title": "Text", "type": "string", "minLength": 1}}}, "QuranVerseTranslation": {"required": ["text"], "type": "object", "properties": {"verse_id": {"title": "Verse id", "type": "string", "readOnly": true}, "text": {"title": "Text", "type": "string", "minLength": 1}}}, "QuranVerse": {"required": ["index", "number_in_surah", "juz", "text"], "type": "object", "properties": {"index": {"title": "Index", "type": "integer", "maximum": 2147483647, "minimum": 0}, "sura_id": {"title": "Sura id", "type": "string", "readOnly": true}, "number_in_surah": {"title": "Number in surah", "type": "integer", "maximum": 2147483647, "minimum": 0}, "juz": {"title": "Juz", "type": "integer", "maximum": 2147483647, "minimum": 0}, "text": {"title": "Text", "type": "string", "minLength": 1}, "glyph_text": {"title": "Glyph text", "type": "string", "maxLength": 500, "x-nullable": true}, "raw_text": {"title": "Raw text", "type": "string", "x-nullable": true}, "new_line_at": {"title": "New line at", "type": "string", "maxLength": 255, "x-nullable": true}}}, "QuranWordTranslation": {"required": ["verse", "arabic", "translate", "language_code"], "type": "object", "properties": {"verse": {"title": "Verse", "type": "integer"}, "arabic": {"title": "Arabic word", "type": "string", "maxLength": 255, "minLength": 1}, "translate": {"title": "Translate", "type": "string", "maxLength": 255, "minLength": 1}, "language_code": {"title": "Language code", "type": "string", "minLength": 1}}}, "Adhan": {"required": ["name"], "type": "object", "properties": {"id": {"title": "ID", "type": "integer", "readOnly": true}, "name": {"title": "Name", "type": "string", "maxLength": 64, "minLength": 1}, "description": {"title": "Description", "description": "could be null", "type": "string", "maxLength": 255, "x-nullable": true}, "file_path": {"title": "File path", "type": "string", "readOnly": true}}}, "Reminder": {"required": ["service_name", "object_id", "text"], "type": "object", "properties": {"id": {"title": "ID", "type": "integer", "readOnly": true}, "service_name": {"title": "Service Name", "description": "Name of the service (e.g., \"meet\", \"dua\", etc.)", "type": "string", "maxLength": 100, "minLength": 1}, "object_id": {"title": "Object ID", "description": "ID of the related object (meet ID, dua ID, etc.)", "type": "string", "maxLength": 100, "minLength": 1}, "text": {"title": "Reminder Text", "description": "The reminder message content", "type": "string", "minLength": 1}, "created_at": {"title": "Created At", "description": "When the reminder was created", "type": "string", "format": "date-time", "readOnly": true}, "call_time": {"title": "Call Time", "description": "When the reminder should be triggered/called", "type": "string", "format": "date-time", "x-nullable": true}, "is_sent": {"title": "Is Sent", "description": "Whether the reminder has been sent", "type": "boolean"}, "is_read": {"title": "Is Read", "description": "Whether the user has opened/read the reminder", "type": "boolean"}, "status": {"title": "Status", "description": "General status management for the reminder", "type": "boolean"}}}, "ReminderUpdate": {"type": "object", "properties": {"is_sent": {"title": "Is Sent", "description": "Whether the reminder has been sent", "type": "boolean"}, "is_read": {"title": "Is Read", "description": "Whether the user has opened/read the reminder", "type": "boolean"}, "status": {"title": "Status", "description": "General status management for the reminder", "type": "boolean"}}}, "Report": {"required": ["service_slug", "text"], "type": "object", "properties": {"service_slug": {"title": "Service slug", "type": "string", "enum": ["hussainiyah", "quran", "mafatih", "qiblah", "ahkam", "calendar", "talk", "meet", "library", "hadis", "habit", "checkup", "marriage"]}, "subject": {"title": "Subject", "type": "integer", "x-nullable": true}, "description": {"title": "Description", "type": "string", "x-nullable": true}, "text": {"title": "Report Text", "type": "string", "maxLength": 255, "minLength": 1}, "object_id": {"title": "Object id", "type": "integer", "maximum": 9223372036854775807, "minimum": 0, "x-nullable": true}}}, "Subject": {"required": ["name", "slug"], "type": "object", "properties": {"id": {"title": "ID", "type": "integer", "readOnly": true}, "name": {"title": "Name", "type": "string", "maxLength": 255, "minLength": 1}, "slug": {"title": "Slug", "type": "string", "format": "slug", "pattern": "^[-a-zA-Z0-9_]+$", "maxLength": 50, "minLength": 1}, "service": {"title": "Service", "type": "string", "readOnly": true}}}, "ServiceVersion": {"required": ["version_number", "language"], "type": "object", "properties": {"service": {"title": "Service", "type": "string", "readOnly": true}, "version_number": {"title": "Version Number", "description": "Version number in format 1.3", "type": "string", "maxLength": 20, "minLength": 1}, "language": {"$ref": "#/definitions/Language"}, "is_active": {"title": "Is active", "type": "string", "readOnly": true}, "service_config": {"title": "Service config", "type": "string", "readOnly": true}, "created_at": {"title": "Created At", "type": "string", "format": "date-time", "readOnly": true}, "app_intros": {"title": "App intros", "type": "string", "readOnly": true}, "service_intros": {"title": "Service intros", "type": "string", "readOnly": true}}}, "ShareApp": {"required": ["description"], "type": "object", "properties": {"description": {"title": "Description", "type": "string", "minLength": 1}, "image": {"title": "Image", "type": "string", "readOnly": true}}}, "TafsirVerses": {"required": ["from_verse", "to_verse", "text"], "type": "object", "properties": {"from_verse": {"title": "From verse", "type": "integer", "maximum": 2147483647, "minimum": 0}, "to_verse": {"title": "To verse", "type": "integer", "maximum": 2147483647, "minimum": 0}, "text": {"title": "Text", "type": "string", "minLength": 1}, "surah": {"title": "Surah", "type": "string", "readOnly": true}, "book": {"title": "Book", "type": "string", "readOnly": true}, "ayahs_index": {"title": "Ayahs index", "type": "string", "readOnly": true}}}, "TafsirBook": {"required": ["title"], "type": "object", "properties": {"id": {"title": "ID", "type": "integer", "readOnly": true}, "title": {"title": "Title", "type": "string", "maxLength": 112, "minLength": 1}, "surahs": {"title": "Surahs", "type": "string", "readOnly": true}}}, "Transaction": {"required": ["coin_count"], "type": "object", "properties": {"id": {"title": "ID", "type": "integer", "readOnly": true}, "coin_count": {"title": "Coin count", "type": "integer", "maximum": 2147483647, "minimum": 0}, "description": {"title": "Description", "type": "string", "readOnly": true}, "service": {"title": "Service", "type": "string", "enum": ["hussainiya", "library", "talk", "meet"], "x-nullable": true}, "created_at": {"title": "Created at", "type": "string", "format": "date-time", "readOnly": true}}}, "WithdrawalRequest": {"required": ["amount", "status"], "type": "object", "properties": {"id": {"title": "ID", "type": "integer", "readOnly": true}, "amount": {"title": "Amount", "type": "string", "format": "decimal"}, "status": {"title": "Status", "type": "string", "enum": ["pending", "completed", "failed"]}, "description": {"title": "Description", "type": "string", "maxLength": 255, "x-nullable": true}, "created_at": {"title": "Created at", "type": "string", "format": "date-time", "readOnly": true}, "updated_at": {"title": "Updated at", "type": "string", "format": "date-time", "readOnly": true}}}, "DuaCompleteSerializer": {"type": "object", "properties": {"id": {"title": "ID", "type": "integer", "readOnly": true}, "slug": {"title": "Slug", "type": "string", "readOnly": true}, "title": {"title": "Title", "type": "string", "readOnly": true}, "parts": {"title": "Parts", "type": "string", "readOnly": true}, "total_parts": {"title": "Total parts", "type": "string", "readOnly": true}, "seo_field": {"title": "Seo field", "type": "string", "readOnly": true}, "synced_at": {"title": "Synced at", "type": "string", "readOnly": true}}}, "Web_DuaCategoriesSerializer": {"type": "object", "properties": {"id": {"title": "ID", "type": "integer", "readOnly": true}, "name": {"title": "Name", "type": "string", "readOnly": true}, "slug": {"title": "Slug", "type": "string", "readOnly": true}, "thumbnails": {"title": "Thumbnails", "type": "string", "readOnly": true}, "language": {"title": "Language", "type": "string", "readOnly": true}, "children": {"title": "Children", "type": "string", "readOnly": true}}}, "Web_DuaSerializer": {"type": "object", "properties": {"id": {"title": "ID", "type": "integer", "readOnly": true}, "title": {"title": "Title", "type": "string", "readOnly": true}, "slug": {"title": "Slug", "type": "string", "readOnly": true}, "not_synced": {"title": "Not synced", "type": "boolean", "default": false}, "seo_field": {"title": "Seo field", "type": "string", "readOnly": true}}}, "Web_DuaPartSerializer": {"type": "object", "properties": {"id": {"title": "ID", "type": "integer", "readOnly": true}, "dua_part_index": {"title": "Dua part index", "type": "string", "readOnly": true}, "text": {"title": "Text", "type": "string", "x-nullable": true}, "translation": {"title": "Translation", "type": "string", "readOnly": true}, "local_alpha": {"title": "Local alpha", "type": "string", "readOnly": true}, "mafatih_dua_id": {"title": "Mafatih dua id", "type": "string", "readOnly": true}, "description": {"title": "Description", "type": "string", "readOnly": true}}}, "WebDuaAudio": {"type": "object", "properties": {"id": {"title": "ID", "type": "integer", "readOnly": true}, "reciter": {"title": "Reciter", "type": "string", "readOnly": true}, "audio": {"title": "Audio", "type": "string", "readOnly": true}, "audio_sync_data": {"title": "Audio sync data", "type": "object"}}}, "DuaReciter": {"type": "object", "properties": {"id": {"title": "ID", "type": "integer", "readOnly": true}, "name": {"title": "Name", "type": "string", "readOnly": true}, "slug": {"title": "Slug", "type": "string", "format": "slug", "pattern": "^[-a-zA-Z0-9_]+$", "maxLength": 120}, "avatar": {"title": "Avatar", "type": "string", "readOnly": true}}}, "QuranSurahDetailVerse": {"required": ["index", "number_in_surah", "juz", "text"], "type": "object", "properties": {"index": {"title": "Index", "type": "integer", "maximum": 2147483647, "minimum": 0}, "sura_id": {"title": "Sura id", "type": "string", "readOnly": true}, "number_in_surah": {"title": "Number in surah", "type": "integer", "maximum": 2147483647, "minimum": 0}, "juz": {"title": "Juz", "type": "integer", "maximum": 2147483647, "minimum": 0}, "text": {"title": "Text", "type": "string", "minLength": 1}, "glyph_text": {"title": "Glyph text", "type": "string", "maxLength": 500, "x-nullable": true}, "raw_text": {"title": "Raw text", "type": "string", "x-nullable": true}, "new_line_at": {"title": "New line at", "type": "string", "maxLength": 255, "x-nullable": true}, "text_translation": {"title": "Text translation", "type": "string", "readOnly": true}}}}} \ No newline at end of file diff --git a/src/app/questions-list/page.tsx b/src/app/questions-list/page.tsx index 2696d7c..536378c 100644 --- a/src/app/questions-list/page.tsx +++ b/src/app/questions-list/page.tsx @@ -13,8 +13,11 @@ import { PageBackground } from "@/components/utils/page-background"; import { getQuestionListItems, isQuestionListItemVisibleForProfile, + isQuestionRequiredForProfile, + isQuestionVisibleForProfile, type QuestionListItem, } from "@/data/question-data"; +import { hasQuestionAnswerValue } from "@/components/questions/question-answer-storage"; import { useStartMarriageMatchMutation } from "@/hooks/marriage/use-match-start"; import { useMarriageProfileQuery } from "@/hooks/marriage/use-profile-main"; import { useMarriageSectionsQuery } from "@/hooks/marriage/use-sections"; @@ -22,12 +25,15 @@ import { localizePath } from "@/i18n/config"; import { useI18n } from "@/i18n/provider"; import { toFrontendSlug } from "@/data/section-slug-map"; import SectionsRequest from "./sections-request"; +import { getStoredAge, getLocalSectionProgress } from "@/components/questions/progress-helper"; export default function QuestionsListPage() { const { dictionary: t, locale } = useI18n(); const router = useRouter(); const { data: profile } = useMarriageProfileQuery(); - const { data: sections } = useMarriageSectionsQuery(); + const { data: sections } = useMarriageSectionsQuery({ + refetchOnMount: "always", + }); const startMatchMutation = useStartMarriageMatchMutation({ onSuccess: () => { router.push(localizePath("/finding-match", locale)); @@ -45,6 +51,28 @@ export default function QuestionsListPage() { ), [locale, profile?.gender], ); + + const sectionProgressBySlug = useMemo(() => { + const progressBySlug = new Map(); + const age = getStoredAge(); + + sections?.forEach((section) => { + const frontendSlug = toFrontendSlug(section.slug); + const progress = Math.max(0, Math.min(100, Math.round(section.completion_percent))); + progressBySlug.set(frontendSlug, progress); + progressBySlug.set(section.slug, progress); + }); + + questionListItems.forEach((item) => { + const localProgress = getLocalSectionProgress(item, profile, age); + if (localProgress !== null) { + progressBySlug.set(item.slug, localProgress); + } + }); + + return progressBySlug; + }, [sections, questionListItems, profile]); + const allRequiredSectionsCompleted = useMemo(() => { if (!sections?.length) { return false; @@ -52,8 +80,13 @@ export default function QuestionsListPage() { return sections .filter((section) => section.is_required) - .every((section) => section.completion_percent >= 100); - }, [sections]); + .every((section) => { + const frontendSlug = toFrontendSlug(section.slug); + const progress = sectionProgressBySlug.get(frontendSlug) ?? Math.max(0, Math.min(100, Math.round(section.completion_percent))); + return progress >= 100; + }); + }, [sections, sectionProgressBySlug]); + const profileStatus = profile?.status; const isProfileSuspended = profileStatus === "suspended"; const canStartMatch = @@ -67,22 +100,10 @@ export default function QuestionsListPage() { } return sections.some( - (section) => !section.is_required && section.completion_percent < 100, + (section) => !section.is_required && (sectionProgressBySlug.get(toFrontendSlug(section.slug)) ?? section.completion_percent) < 100, ); - }, [sections]); - - const sectionProgressBySlug = useMemo(() => { - const progressBySlug = new Map(); - - sections?.forEach((section) => { - const frontendSlug = toFrontendSlug(section.slug); - const progress = Math.max(0, Math.min(100, Math.round(section.completion_percent))); - progressBySlug.set(frontendSlug, progress); - progressBySlug.set(section.slug, progress); - }); + }, [sections, sectionProgressBySlug]); - return progressBySlug; - }, [sections]); const handleStartMatch = () => { if (!canStartMatch) { return; @@ -156,7 +177,7 @@ export default function QuestionsListPage() { -
diff --git a/src/components/questions/progress-helper.ts b/src/components/questions/progress-helper.ts new file mode 100644 index 0000000..391d050 --- /dev/null +++ b/src/components/questions/progress-helper.ts @@ -0,0 +1,89 @@ +import { + type QuestionListItem, + isQuestionVisibleForProfile, + isQuestionRequiredForProfile, +} from "@/data/question-data"; +import { hasQuestionAnswerValue } from "./question-answer-storage"; + +export function getStoredAge(): number | null { + try { + if (typeof window === "undefined") return null; + const rawValue = window.localStorage.getItem("marriage:sections:personal_info:answers"); + if (!rawValue) return null; + const storedAnswers = JSON.parse(rawValue); + const ageField = storedAnswers.fields?.find((f: any) => f.label === "Age"); + if (ageField && ageField.value !== undefined && ageField.value !== null) { + const num = Number(ageField.value); + if (Number.isFinite(num)) return num; + } + const dobField = storedAnswers.fields?.find((f: any) => f.label === "Date of Birth"); + if (dobField && dobField.value) { + const dob = new Date(dobField.value); + if (!Number.isNaN(dob.getTime())) { + const today = new Date(); + let age = today.getFullYear() - dob.getFullYear(); + const m = today.getMonth() - dob.getMonth(); + if (m < 0 || (m === 0 && today.getDate() < dob.getDate())) { + age--; + } + return age >= 0 ? age : null; + } + } + } catch (e) { } + return null; +} + +export function getLocalSectionProgress(item: QuestionListItem, profile: any, age: number | null): number | null { + try { + if (typeof window === "undefined") return null; + const storageKey = `marriage:sections:${item.slug}:answers`; + const rawValue = window.localStorage.getItem(storageKey); + if (!rawValue) { + return null; + } + const storedValue = JSON.parse(rawValue); + if (!storedValue || !Array.isArray(storedValue.fields) || storedValue.fields.length === 0) { + return null; + } + + const profileContext = { + age, + gender: profile?.gender, + }; + + const visibleQuestions = item.questions + .filter((question) => isQuestionVisibleForProfile(question, profileContext)) + .map((question) => ({ + ...question, + required: isQuestionRequiredForProfile(question, profileContext), + })); + + const requiredQuestions = visibleQuestions.filter((q) => q.required); + if (requiredQuestions.length === 0) { + if (visibleQuestions.length === 0) { + return 100; + } + const answeredCount = visibleQuestions.filter((q, index) => { + const slugifyTitle = (title: string) => title.normalize("NFKD").replace(/[\u0300-\u036f]/g, "").toLowerCase().replace(/[^a-z0-9]+/g, "_").replace(/^_+|_+$/g, ""); + const fieldKey = `q${index + 1}_${slugifyTitle(q.title)}`; + const field = storedValue.fields.find((f: any) => f.key === fieldKey || f.label === q.title); + return field && hasQuestionAnswerValue(field.value); + }).length; + return Math.round((answeredCount / visibleQuestions.length) * 100); + } + + const answeredRequiredCount = requiredQuestions.filter((q) => { + const originalIndex = item.questions.findIndex((origQ) => origQ.title === q.title); + if (originalIndex === -1) return false; + + const slugifyTitle = (title: string) => title.normalize("NFKD").replace(/[\u0300-\u036f]/g, "").toLowerCase().replace(/[^a-z0-9]+/g, "_").replace(/^_+|_+$/g, ""); + const fieldKey = `q${originalIndex + 1}_${slugifyTitle(q.title)}`; + const field = storedValue.fields.find((f: any) => f.key === fieldKey || f.label === q.title); + return field && hasQuestionAnswerValue(field.value); + }).length; + + return Math.round((answeredRequiredCount / requiredQuestions.length) * 100); + } catch (e) { + return null; + } +} diff --git a/src/components/questions/question-answer-storage.tsx b/src/components/questions/question-answer-storage.tsx index 9896f32..59bbe46 100644 --- a/src/components/questions/question-answer-storage.tsx +++ b/src/components/questions/question-answer-storage.tsx @@ -187,6 +187,7 @@ function createPayload( return { current_step: getCurrentStep(fields), + total_steps: questions.length, fields, }; } @@ -259,7 +260,8 @@ function writeStoredAnswers( } function getKeepalivePatchUrl(slug: string) { - return getApiRequestUrl(`/api/marriage/sections/${pathParam(slug)}/data/`); + const backendSlug = toBackendSlug(slug); + return getApiRequestUrl(`/api/marriage/sections/${pathParam(backendSlug)}/data/`); } export function QuestionAnswersProvider({ diff --git a/src/components/questions/required-steps-card.tsx b/src/components/questions/required-steps-card.tsx index 83fe6dc..b5e2bae 100644 --- a/src/components/questions/required-steps-card.tsx +++ b/src/components/questions/required-steps-card.tsx @@ -10,6 +10,7 @@ import { useMarriageSectionsQuery } from "@/hooks/marriage/use-sections"; import { useI18n } from "@/i18n/provider"; import { useMemo } from "react"; import { toFrontendSlug } from "@/data/section-slug-map"; +import { getStoredAge, getLocalSectionProgress } from "@/components/questions/progress-helper"; type RequiredStep = { slug: string; @@ -58,19 +59,23 @@ export default function RequiredStepsCard() { .map((item) => item.slug) ); + const age = getStoredAge(); + return sections .map((section) => { const frontendSlug = toFrontendSlug(section.slug); - const progress = Math.max( - 0, - Math.min(100, Math.round(section.completion_percent)), - ); // Check if the frontend equivalent of this section is required const frontendItem = getQuestionListItems(locale).find( (item) => item.slug === frontendSlug, ); + const localProgress = frontendItem ? getLocalSectionProgress(frontendItem, profile, age) : null; + const progress = localProgress !== null ? localProgress : Math.max( + 0, + Math.min(100, Math.round(section.completion_percent)), + ); + return { slug: frontendSlug, required: frontendItem ? Boolean(frontendItem.required) : section.is_required, @@ -78,7 +83,7 @@ export default function RequiredStepsCard() { }; }) .filter((step) => visibleSlugs.has(step.slug)); - }, [sections, fallbackRequiredSteps, locale, profile?.gender]); + }, [sections, fallbackRequiredSteps, locale, profile]); const { completed, total } = getRequiredStepStats(steps); const completion = total > 0 ? Math.round((completed / total) * 100) : 0; diff --git a/src/data/section-slug-map.ts b/src/data/section-slug-map.ts index 436eb48..5764bdb 100644 --- a/src/data/section-slug-map.ts +++ b/src/data/section-slug-map.ts @@ -4,9 +4,11 @@ * single slug, so these two naming systems don't always match 1-to-1. */ export const BACKEND_TO_FRONTEND_SLUG_MAP: Record = { - contact: "contact_residence_family_communication", - career_and_education: "education_career_economic_status", - expactancy_and_equality: "appearance_health_activity", + personal_identity: "personal_info", + contact_residence: "contact_residence_family_communication", + appearance_health: "appearance_health_activity", + education_career: "education_career_economic_status", + family_background: "family_background", marital_history: "marital_history_children", beliefs_lifestyle: "beliefs_lifestyle_boundaries", spouse_criteria: "future_spouse_criteria", diff --git a/src/hooks/marriage/types.ts b/src/hooks/marriage/types.ts index 54a4ed6..0ad073c 100644 --- a/src/hooks/marriage/types.ts +++ b/src/hooks/marriage/types.ts @@ -128,6 +128,7 @@ export type MarriageSectionData = { export type UpdateMarriageSectionDataPayload = { current_step: number; + total_steps?: number; fields: MarriageField[]; }; diff --git a/src/i18n/locales/en/questions.json b/src/i18n/locales/en/questions.json index 6e467a4..67e0e78 100644 --- a/src/i18n/locales/en/questions.json +++ b/src/i18n/locales/en/questions.json @@ -920,7 +920,7 @@ { "title": "Previous Marriage Duration", "type": "text", - "required": true, + "required": false, "tooltip": "Specify the duration of your previous marriage or engagement.", "logic": { "dependsOn": { @@ -986,7 +986,7 @@ { "title": "Number of Children", "type": "number", - "required": true, + "required": false, "tooltip": "Specify the number of children you have.", "logic": { "dependsOn": { @@ -2086,7 +2086,7 @@ }, { "title": "Confirmation of Document and Information Accuracy", - "type": "checkbox", + "type": "radio", "required": true, "tooltip": "Confirm that your entered information matches your uploaded documents.", "extras": { diff --git a/src/i18n/locales/fa/questions.json b/src/i18n/locales/fa/questions.json index 7849e74..b87c6a5 100644 --- a/src/i18n/locales/fa/questions.json +++ b/src/i18n/locales/fa/questions.json @@ -920,7 +920,7 @@ { "title": "مدت ازدواج یا عقد قبلی", "type": "text", - "required": true, + "required": false, "tooltip": "مدت زمان ازدواج یا دوران عقد قبلی خود را مشخص کنید.", "logic": { "dependsOn": { @@ -986,7 +986,7 @@ { "title": "تعداد فرزندان", "type": "number", - "required": true, + "required": false, "tooltip": "تعداد فرزندان خود را وارد کنید.", "logic": { "dependsOn": { @@ -2086,7 +2086,7 @@ }, { "title": "تأیید تطابق مدارک و اطلاعات", - "type": "checkbox", + "type": "radio", "required": true, "tooltip": "تأیید مطابقت اطلاعات وارد شده با مدارک شناسایی.", "extras": {