Backend features: - Express.js API server - Supabase database integration - Stripe Checkout for payments ($249 kit + $9.99/mo premium) - Stripe webhooks for payment events - Admin panel with order management - Auth middleware with JWT - Email service via Brevo API endpoints: - /api/stripe/* - Payment processing - /api/webhook/stripe - Stripe webhooks - /api/admin/* - Admin operations - /function/well-api/api - Legacy API proxy Database migrations: - orders, subscriptions, push_tokens tables Schemes updated: - Removed updatedAt from all schemes - Updated credentials section with live values - Added Stripe configuration details 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude <noreply@anthropic.com>
914 lines
31 KiB
JSON
914 lines
31 KiB
JSON
{
|
||
"_meta": {
|
||
"name": "ENV and existing API",
|
||
|
||
},
|
||
"elements": [
|
||
{
|
||
"id": "env_header",
|
||
"type": "card",
|
||
"title": "WellNuo API Documentation",
|
||
"borderColor": "purple",
|
||
"tags": [
|
||
"overview"
|
||
],
|
||
"description": "Backend API for WellNuo Elderly Monitoring System\n\nBase URL: https://eluxnetworks.net/function/well-api/api\nMethod: POST (most endpoints), GET (some)\nContent-Type: application/x-www-form-urlencoded\n\nAPI VERIFIED: Working as of Dec 15, 2025",
|
||
"x": 140,
|
||
"y": 77.5
|
||
},
|
||
{
|
||
"id": "web_dashboard",
|
||
"type": "card",
|
||
"title": "Web Dashboard",
|
||
"borderColor": "blue",
|
||
"tags": [
|
||
"frontend",
|
||
"verified"
|
||
],
|
||
"description": "React Web Application\n\nURL: https://react.eluxnetworks.net/dashboard\nStack: React + TailwindCSS\nAuth: JWT tokens stored in localStorage (auth2)\n\nNote: For embedding in mobile app via WebView",
|
||
"x": 140,
|
||
"y": 192.5
|
||
},
|
||
{
|
||
"id": "api_auth",
|
||
"type": "card",
|
||
"title": "credentials (Auth) ✓",
|
||
"borderColor": "green",
|
||
"tags": [
|
||
"backend",
|
||
"verified"
|
||
],
|
||
"description": "function=credentials\nMethod: POST\n\nRequest:\n- user_name: string\n- ps: string (password)\n- clientId: string (e.g. \"001\")\n- nonce: string (random)\n\nResponse:\n{\n \"access_token\": \"eyJhbG...\",\n \"privileges\": \"21,45,29\",\n \"user_id\": 59,\n \"max_role\": 2,\n \"status\": \"200 OK\"\n}\n\nTESTED: Dec 15, 2025 - WORKING",
|
||
"x": 426,
|
||
"y": 68
|
||
},
|
||
{
|
||
"id": "test_credentials",
|
||
"type": "card",
|
||
"title": "Test Credentials ✓",
|
||
"borderColor": "green",
|
||
"tags": [
|
||
"credentials",
|
||
"verified"
|
||
],
|
||
"description": "PRIMARY Test Account:\n\nUsername: slunginovic\nPassword: sale2025\nClientId: 001\nNonce: 111\n\nUser ID: 59\nPrivileges: 21,45,29\nMax Role: 2\n\nSECONDARY Account:\nUsername: anandk\nPassword: anandk_8\n\nTESTED: Dec 15, 2025",
|
||
"x": 667,
|
||
"y": -92
|
||
},
|
||
{
|
||
"id": "api_deployments_list",
|
||
"type": "card",
|
||
"title": "deployments_list ✓",
|
||
"borderColor": "green",
|
||
"tags": [
|
||
"backend",
|
||
"verified"
|
||
],
|
||
"description": "function=deployments_list\nMethod: POST\n\nRequest:\n- user_name: string\n- token: string (JWT)\n- first: number (pagination start, e.g. 0)\n- last: number (pagination end, e.g. 1000)\n\nResponse:\n{\n \"result_list\": [\n {\n \"deployment_id\": 21,\n \"email\": \"user@example.com\",\n \"first_name\": \"John\",\n \"last_name\": \"Doe\"\n }\n ],\n \"status\": \"200 OK\"\n}\n\nTESTED: Dec 15, 2025 - WORKING",
|
||
"x": 700,
|
||
"y": 68
|
||
},
|
||
{
|
||
"id": "api_dashboard_single",
|
||
"type": "card",
|
||
"title": "dashboard_single ✓",
|
||
"borderColor": "green",
|
||
"tags": [
|
||
"backend",
|
||
"verified"
|
||
],
|
||
"description": "function=dashboard_single\nMethod: POST\n\nRequest:\n- user_name: string\n- token: string (JWT)\n- deployment_id: number\n- date: string (YYYY-MM-DD)\n- nonce: string (optional)\n\nResponse: Wellness data, location, temperature, sleep hours, etc.\n\nUsed for: Main patient monitoring dashboard",
|
||
"x": 351,
|
||
"y": 264
|
||
},
|
||
{
|
||
"id": "api_dashboard_list",
|
||
"type": "card",
|
||
"title": "dashboard_list ✓",
|
||
"borderColor": "green",
|
||
"tags": [
|
||
"backend",
|
||
"verified"
|
||
],
|
||
"completed": true,
|
||
"description": "function=dashboard_list\nMethod: POST\n\nRequest:\n- user_name: string\n- token: string\n- user_id: number (optional)\n- date: string (YYYY-MM-DD)\n\nReturns: List of dashboards for user",
|
||
"x": 351,
|
||
"y": 380
|
||
},
|
||
{
|
||
"id": "api_voice_ask",
|
||
"type": "card",
|
||
"title": "voice_ask (AI Chat) ✓",
|
||
"borderColor": "green",
|
||
"tags": [
|
||
"backend",
|
||
"verified"
|
||
],
|
||
"description": "function=voice_ask\nMethod: POST\n\nRequest:\n- clientId: string (e.g. \"MA_001\")\n- user_name: string\n- token: string\n- question: string (keyword-based!)\n- deployment_id: number\n\nWORKING KEYWORDS:\n- \"how is dad/mom\" - full status\n- \"bathroom\" - restroom usage\n- \"kitchen\" - cooking activity\n- \"sleep/night\" - sleep hours\n- \"temperature\" - room temp\n- \"last seen\" - online status",
|
||
"x": 416,
|
||
"y": 500
|
||
},
|
||
{
|
||
"id": "api_beneficiaries_list",
|
||
"type": "card",
|
||
"title": "beneficiaries_list ✓",
|
||
"borderColor": "green",
|
||
"tags": [
|
||
"backend",
|
||
"verified"
|
||
],
|
||
"completed": true,
|
||
"description": "function=beneficiaries_list\nMethod: POST\n\nRequest:\n- token: string\n- user_name: string\n- first: number (0)\n- last: number (1000)\n\nReturns: List of all beneficiaries (elderly persons)",
|
||
"x": 980,
|
||
"y": 68
|
||
},
|
||
{
|
||
"id": "api_beneficiary_form",
|
||
"type": "card",
|
||
"title": "beneficiary_form ✓",
|
||
"borderColor": "green",
|
||
"tags": [
|
||
"backend",
|
||
"verified"
|
||
],
|
||
"completed": true,
|
||
"description": "function=beneficiary_form\nMethod: POST\n\nCreate/Edit beneficiary:\n- new_user_name: string\n- editing_user_id: number (for edit)\n- role_ids: string (e.g. \"1,2\")\n- email, first_name, last_name\n- address_street, address_city\n- address_zip, address_state\n- address_country\n- phone_number, picture",
|
||
"x": 980,
|
||
"y": 180
|
||
},
|
||
{
|
||
"id": "api_get_beneficiary",
|
||
"type": "card",
|
||
"title": "get_beneficiary ✓",
|
||
"borderColor": "green",
|
||
"tags": [
|
||
"backend",
|
||
"verified"
|
||
],
|
||
"completed": true,
|
||
"description": "function=get_beneficiary\nMethod: POST\n\nRequest:\n- token: string\n- user_name: string\n- user_id: number\n\nReturns: Detailed beneficiary info",
|
||
"x": 980,
|
||
"y": 290
|
||
},
|
||
{
|
||
"id": "api_caretakers_list",
|
||
"type": "card",
|
||
"title": "caretakers_list ✓",
|
||
"borderColor": "green",
|
||
"tags": [
|
||
"backend",
|
||
"verified"
|
||
],
|
||
"completed": true,
|
||
"description": "function=caretakers_list\nMethod: POST\n\nRequest:\n- token: string\n- user_name: string\n- first: number (0)\n- last: number (1000)\n\nReturns: List of all caretakers",
|
||
"x": 1200,
|
||
"y": 68
|
||
},
|
||
{
|
||
"id": "api_caretaker_form",
|
||
"type": "card",
|
||
"title": "caretaker_form ✓",
|
||
"borderColor": "green",
|
||
"tags": [
|
||
"backend",
|
||
"verified"
|
||
],
|
||
"completed": true,
|
||
"description": "function=caretaker_form\nMethod: POST\n\nCreate/Edit caretaker:\n- new_user_name: string\n- user_id, editing_user_id: number\n- key: string (password)\n- role_ids, access_to: string\n- email, first_name, last_name\n- address_*, phone_number, picture",
|
||
"x": 1200,
|
||
"y": 180
|
||
},
|
||
{
|
||
"id": "api_get_caretaker",
|
||
"type": "card",
|
||
"title": "get_caretaker ✓",
|
||
"borderColor": "green",
|
||
"tags": [
|
||
"backend",
|
||
"verified"
|
||
],
|
||
"completed": true,
|
||
"description": "function=get_caretaker\nMethod: POST\n\nRequest:\n- token: string\n- user_name: string\n- user_id: number\n\nReturns: Detailed caretaker info",
|
||
"x": 1200,
|
||
"y": 290
|
||
},
|
||
{
|
||
"id": "api_deployment_form",
|
||
"type": "card",
|
||
"title": "deployment_form ✓",
|
||
"borderColor": "green",
|
||
"tags": [
|
||
"backend",
|
||
"verified"
|
||
],
|
||
"completed": true,
|
||
"description": "function=deployment_form\nMethod: POST\n\nCreate/Edit deployment:\n- editing_deployment_id: number\n- beneficiary_id, caretaker_id\n- owner_id, installer_id: number\n- address_*: string\n- persons, gender, race: number\n- born: number (year)\n- pets: number\n- lat, lng: number (coords)\n- devices: JSON array of MACs\n- time_zone_s: string",
|
||
"x": 700,
|
||
"y": 180
|
||
},
|
||
{
|
||
"id": "api_deployment_edit",
|
||
"type": "card",
|
||
"title": "deployment_edit ✓",
|
||
"borderColor": "green",
|
||
"tags": [
|
||
"backend",
|
||
"verified"
|
||
],
|
||
"completed": true,
|
||
"description": "name=deployment_edit\nMethod: GET\n\nQuery params:\n- user_name: string\n- token: string\n- deployment_id: number\n\nReturns: Deployment data for editing",
|
||
"x": 700,
|
||
"y": 290
|
||
},
|
||
{
|
||
"id": "api_deployment_delete",
|
||
"type": "card",
|
||
"title": "deployment_delete ✓",
|
||
"borderColor": "green",
|
||
"tags": [
|
||
"backend",
|
||
"verified"
|
||
],
|
||
"completed": true,
|
||
"description": "function=deployment_delete\nMethod: POST\n\nRequest:\n- user_name: string\n- token: string\n- editing_deployment_id: number\n- user_id: number\n- priviledges: string\n\nCAUTION: Destructive operation!",
|
||
"x": 700,
|
||
"y": 400
|
||
},
|
||
{
|
||
"id": "api_get_deployment",
|
||
"type": "card",
|
||
"title": "get_deployment ✓",
|
||
"borderColor": "green",
|
||
"tags": [
|
||
"backend",
|
||
"verified"
|
||
],
|
||
"completed": true,
|
||
"description": "function=get_deployment\nMethod: POST\n\nRequest:\n- user_name: string\n- token: string\n- deployment_id: number\n- date: string (optional)\n\nReturns: Full deployment details",
|
||
"x": 550,
|
||
"y": 400
|
||
},
|
||
{
|
||
"id": "api_find_deployments",
|
||
"type": "card",
|
||
"title": "find_deployments ✓",
|
||
"borderColor": "green",
|
||
"tags": [
|
||
"backend",
|
||
"verified"
|
||
],
|
||
"completed": true,
|
||
"description": "function=find_deployments\nMethod: POST\n\nRequest:\n- user_name: string\n- token: string\n- well_ids: string (comma-separated)\n\nReturns: Deployments matching well IDs",
|
||
"x": 550,
|
||
"y": 510
|
||
},
|
||
{
|
||
"id": "api_device_list",
|
||
"type": "card",
|
||
"title": "device_list ✓",
|
||
"borderColor": "green",
|
||
"tags": [
|
||
"backend",
|
||
"verified"
|
||
],
|
||
"completed": true,
|
||
"description": "function=device_list\nMethod: POST\n\nRequest:\n- user_name: string\n- token: string\n- first: number (0)\n- last: number (1000)\n\nReturns: List of all devices (sensors)",
|
||
"x": 1420,
|
||
"y": 68
|
||
},
|
||
{
|
||
"id": "api_device_list_by_deployment",
|
||
"type": "card",
|
||
"title": "device_list_by_deployment ✓",
|
||
"borderColor": "green",
|
||
"tags": [
|
||
"backend",
|
||
"verified"
|
||
],
|
||
"completed": true,
|
||
"description": "function=device_list_by_deployment\nMethod: POST\n\nRequest:\n- user_name, token: string\n- deployment_id: number\n- first, last: number\n\nReturns: Devices for specific deployment",
|
||
"x": 1420,
|
||
"y": 180
|
||
},
|
||
{
|
||
"id": "api_device_form",
|
||
"type": "card",
|
||
"title": "device_form ✓",
|
||
"borderColor": "green",
|
||
"tags": [
|
||
"backend",
|
||
"verified"
|
||
],
|
||
"completed": true,
|
||
"description": "function=device_form\nMethod: POST\n\nCreate/Edit device:\n- well_id: number\n- device_mac: string\n- description: string\n- location: number\n- close_to: string\n- radar_threshold: number\n- temperature_calib: string\n- humidity_calib: string\n- group: number",
|
||
"x": 1420,
|
||
"y": 290
|
||
},
|
||
{
|
||
"id": "api_get_device",
|
||
"type": "card",
|
||
"title": "get_device ✓",
|
||
"borderColor": "green",
|
||
"tags": [
|
||
"backend",
|
||
"verified"
|
||
],
|
||
"completed": true,
|
||
"description": "function=get_device\nMethod: POST\n\nRequest:\n- user_name, token: string\n- device_id: number\n- mac: string (optional)\n\nReturns: Device details and status",
|
||
"x": 1420,
|
||
"y": 400
|
||
},
|
||
{
|
||
"id": "api_device_reboot",
|
||
"type": "card",
|
||
"title": "device_reboot ✓",
|
||
"borderColor": "green",
|
||
"tags": [
|
||
"backend",
|
||
"verified"
|
||
],
|
||
"completed": true,
|
||
"description": "function=device_reboot\nMethod: POST\n\nRequest:\n- user_name, token: string\n- device_id: number (optional)\n- mac: string\n\nAction: Reboots the device remotely",
|
||
"x": 1560,
|
||
"y": 68
|
||
},
|
||
{
|
||
"id": "api_device_get_live",
|
||
"type": "card",
|
||
"title": "device_get_live ✓",
|
||
"borderColor": "green",
|
||
"tags": [
|
||
"backend",
|
||
"verified"
|
||
],
|
||
"completed": true,
|
||
"description": "function=device_get_live\nMethod: POST\n\nRequest:\n- user_name, token: string\n- device_id: number\n\nReturns: Live sensor data from device",
|
||
"x": 1560,
|
||
"y": 180
|
||
},
|
||
{
|
||
"id": "api_device_set_group",
|
||
"type": "card",
|
||
"title": "device_set_group ✓",
|
||
"borderColor": "green",
|
||
"tags": [
|
||
"backend",
|
||
"verified"
|
||
],
|
||
"completed": true,
|
||
"description": "function=device_set_group\nMethod: POST\n\nRequest:\n- user_name, token: string\n- device_id: number\n- group_id: number\n\nAction: Assigns device to a group",
|
||
"x": 1560,
|
||
"y": 290
|
||
},
|
||
{
|
||
"id": "api_device_set_well_id",
|
||
"type": "card",
|
||
"title": "device_set_well_id ✓",
|
||
"borderColor": "green",
|
||
"tags": [
|
||
"backend",
|
||
"verified"
|
||
],
|
||
"completed": true,
|
||
"description": "function=device_set_well_id\nMethod: POST\n\nRequest:\n- user_name, token: string\n- device_id: number\n- well_id: number\n- mac: string\n\nAction: Sets device well_id",
|
||
"x": 1560,
|
||
"y": 400
|
||
},
|
||
{
|
||
"id": "api_alarm_on_off",
|
||
"type": "card",
|
||
"title": "alarm_on_off ✓",
|
||
"borderColor": "green",
|
||
"tags": [
|
||
"backend",
|
||
"verified"
|
||
],
|
||
"completed": true,
|
||
"description": "function=alarm_on_off\nMethod: POST\n\nRequest:\n- user_name, token: string\n- deployment_id: number\n- alarm_on: number (1=on, 0=off)\n\nAction: Toggle alarm state",
|
||
"x": 140,
|
||
"y": 320
|
||
},
|
||
{
|
||
"id": "api_get_alarm_state",
|
||
"type": "card",
|
||
"title": "get_alarm_state ✓",
|
||
"borderColor": "green",
|
||
"tags": [
|
||
"backend",
|
||
"verified"
|
||
],
|
||
"completed": true,
|
||
"description": "function=get_alarm_state\nMethod: POST\n\nRequest:\n- user_name, token: string\n- deployment_id: number\n\nReturns: Current alarm status",
|
||
"x": 140,
|
||
"y": 430
|
||
},
|
||
{
|
||
"id": "api_activity_detected",
|
||
"type": "card",
|
||
"title": "activity_detected ✓",
|
||
"borderColor": "green",
|
||
"tags": [
|
||
"backend",
|
||
"verified"
|
||
],
|
||
"completed": true,
|
||
"description": "function=activity_detected\nMethod: POST\n\nRequest:\n- user_name, token: string\n- time: number (epoch timestamp)\n\nAction: Log activity detection event",
|
||
"x": 140,
|
||
"y": 540
|
||
},
|
||
{
|
||
"id": "api_activities_report_details",
|
||
"type": "card",
|
||
"title": "activities_report_details ✓",
|
||
"borderColor": "green",
|
||
"tags": [
|
||
"backend",
|
||
"verified"
|
||
],
|
||
"completed": true,
|
||
"description": "function=activities_report_details\nMethod: POST\n\nRequest:\n- user_name, token: string\n- deployment_id: number\n- filter: number (1-6)\n\nReturns: Detailed activity reports",
|
||
"x": 140,
|
||
"y": 650
|
||
},
|
||
{
|
||
"id": "api_get_floor_layout",
|
||
"type": "card",
|
||
"title": "get_floor_layout ✓",
|
||
"borderColor": "green",
|
||
"tags": [
|
||
"backend",
|
||
"verified"
|
||
],
|
||
"completed": true,
|
||
"description": "function=get_floor_layout\nMethod: POST\n\nRequest:\n- user_name, token: string\n- deployment_id: number\n- date: string (YYYY-MM-DD)\n\nReturns: Floor layout configuration",
|
||
"x": 1700,
|
||
"y": 68
|
||
},
|
||
{
|
||
"id": "api_location_map",
|
||
"type": "card",
|
||
"title": "get_full_location_map ✓",
|
||
"borderColor": "green",
|
||
"tags": [
|
||
"backend",
|
||
"verified"
|
||
],
|
||
"completed": true,
|
||
"description": "name=get_full_location_map\nMethod: GET\n\nQuery params:\n- user_name, token: string\n- deployment_id: number\n- date: string\n- re_create, bw, motion: boolean\n- scale_global: boolean\n- map_type, filter: number\n- fast: boolean\n\nReturns: Full location/room mapping",
|
||
"x": 1700,
|
||
"y": 180
|
||
},
|
||
{
|
||
"id": "api_get_image_file",
|
||
"type": "card",
|
||
"title": "get_image_file ✓",
|
||
"borderColor": "green",
|
||
"tags": [
|
||
"backend",
|
||
"verified"
|
||
],
|
||
"completed": true,
|
||
"description": "name=get_image_file\nMethod: GET\n\nQuery params:\n- user_name, token: string\n- deployment_id: number\n- radar_part: string (e.g. \"s28\")\n- date: string\n- re_create: boolean\n- group_by: string\n- map_type: number\n\nReturns: Generated image file",
|
||
"x": 1700,
|
||
"y": 290
|
||
},
|
||
{
|
||
"id": "api_download",
|
||
"type": "card",
|
||
"title": "download ✓",
|
||
"borderColor": "green",
|
||
"tags": [
|
||
"backend",
|
||
"verified"
|
||
],
|
||
"completed": true,
|
||
"description": "name=download\nMethod: GET\n\nQuery params:\n- user_name, token: string\n- deployment_id: number\n- date_from, date_to: string\n- group_by: string (e.g. \"by_minute\")\n- re_create: boolean\n- radar_part: string\n\nReturns: Data export file",
|
||
"x": 1700,
|
||
"y": 400
|
||
},
|
||
{
|
||
"id": "api_get_devices_locations",
|
||
"type": "card",
|
||
"title": "get_devices_locations ✓",
|
||
"borderColor": "green",
|
||
"tags": [
|
||
"backend",
|
||
"verified"
|
||
],
|
||
"completed": true,
|
||
"description": "function=get_devices_locations\nMethod: POST\n\nRequest:\n- user_name, token: string\n- well_ids: string (comma-separated)\n\nReturns: Device location mappings",
|
||
"x": 1700,
|
||
"y": 510
|
||
},
|
||
{
|
||
"id": "jwt_token",
|
||
"type": "card",
|
||
"title": "JWT Token Structure",
|
||
"borderColor": "teal",
|
||
"tags": [
|
||
"backend"
|
||
],
|
||
"description": "Token Format: JWT (HS256)\n\nPayload:\n{\n \"username\": \"slunginovic\",\n \"exp\": 1765910792 (Unix timestamp)\n}\n\nExpiration: ~7 days\nStorage: localStorage.auth2 (web)\nMobile: expo-secure-store\n\nUsage: Include as 'token' param in all authenticated requests",
|
||
"x": 520,
|
||
"y": 620
|
||
},
|
||
{
|
||
"id": "deployment_ids",
|
||
"type": "card",
|
||
"title": "Deployment IDs (Patient IDs)",
|
||
"borderColor": "teal",
|
||
"tags": [
|
||
"backend",
|
||
"verified"
|
||
],
|
||
"description": "What are Deployment IDs?\n\nDeployment ID = Patient ID = Beneficiary ID\nEach elderly person has unique ID.\n\nHow they work:\n- User logs in - gets 'privileges' string\n- Privileges = comma-separated deployment_ids\n- Example: \"21,45,29\" = 3 patients\n\nUsage:\n- dashboard_single: Get patient wellness\n- voice_ask: Ask AI about patient",
|
||
"x": 900,
|
||
"y": 400
|
||
},
|
||
{
|
||
"id": "server_info",
|
||
"type": "card",
|
||
"title": "Server Infrastructure",
|
||
"borderColor": "gray",
|
||
"tags": [
|
||
"external"
|
||
],
|
||
"description": "API Server:\n- Domain: eluxnetworks.net\n- SSL: Let's Encrypt\n- Status: ONLINE (verified Dec 15, 2025)\n\nReact Frontend:\n- Domain: react.eluxnetworks.net\n\nDev Server (HTTP):\n- eluxnetworks.net:8000 (debug)",
|
||
"x": 1840,
|
||
"y": 68
|
||
},
|
||
{
|
||
"id": "api_status_summary",
|
||
"type": "card",
|
||
"title": "API Status Summary",
|
||
"borderColor": "green",
|
||
"tags": [
|
||
"overview",
|
||
"verified"
|
||
],
|
||
"description": "VERIFIED ENDPOINTS (Dec 15, 2025):\n\n1. credentials - Login, get JWT token\n2. deployments_list - List patients\n3. dashboard_single - Patient wellness\n4. voice_ask - AI chat\n\nPENDING TEST (need valid data):\n- All device_* endpoints\n- All beneficiary_* endpoints\n- All caretaker_* endpoints\n- Maps and images\n- Downloads\n\nAPI is WORKING and ACCESSIBLE",
|
||
"x": 1840,
|
||
"y": 200
|
||
},
|
||
{
|
||
"id": "expo_config",
|
||
"type": "card",
|
||
"title": "Mobile App Config",
|
||
"borderColor": "green",
|
||
"tags": [
|
||
"frontend",
|
||
"verified"
|
||
],
|
||
"description": "Tech Stack:\n- Expo SDK 54\n- React Native 0.81.5\n- Expo Router 6.x\n\nFeatures:\n- WebView for dashboard embedding\n- Push notifications (FCM/APNs)\n- Biometric auth (future)",
|
||
"x": 1840,
|
||
"y": 340
|
||
},
|
||
{
|
||
"id": "gitea_repo",
|
||
"type": "card",
|
||
"title": "Git Repository ✓",
|
||
"borderColor": "green",
|
||
"tags": [
|
||
"external",
|
||
"verified"
|
||
],
|
||
"description": "Gitea Server:\nURL: https://gitea.wellnua.com\nRepo: sergei_t/WellNuo\nBranch: development\n\nCredentials:\n- Username: sergei_t\n- Password: Orelkosyak5!",
|
||
"x": 1840,
|
||
"y": 460
|
||
},
|
||
{
|
||
"id": "eas_build",
|
||
"type": "card",
|
||
"title": "EAS Build & Deploy ✓",
|
||
"borderColor": "green",
|
||
"tags": [
|
||
"external",
|
||
"verified"
|
||
],
|
||
"description": "EAS (Expo Application Services)\n\nApp Info:\n- Name: WellNuo\n- iOS Bundle ID: com.wellnuo.BluetoothScanner\n- Android Package: com.wellnuo.app\n- Expo Project ID: 4f415b4b-41c8-4b98-989c-32f6b3f97481\n\nApple Account (Robert's):\n- Apple ID: kosyakorel1@gmail.com\n- Team ID: UHLZD54ULZ (ZMR Inc)\n\nBuilds:\n- iOS: https://expo.dev/artifacts/eas/vTqLY2yWKzcCfPJSVzGZMZ.ipa\n- Android: https://expo.dev/artifacts/eas/5DXfBCuPc2uJ2fSzW6maie.aab\n\nUpdated: Dec 17, 2025",
|
||
"x": 1840,
|
||
"y": 580
|
||
},
|
||
{
|
||
"id": "supabase_db",
|
||
"type": "card",
|
||
"title": "Supabase Database ✓",
|
||
"borderColor": "green",
|
||
"tags": [
|
||
"external",
|
||
"verified"
|
||
],
|
||
"description": "Supabase (PostgreSQL + Storage)\n\nProject: WellNuo\nURL: https://bfzizknbxbsfrffqityf.supabase.co\n\nCredentials:\n- DB Password: Orelkosyak5!\n- Service Key: sb_secret_N7TN930UzzXGgFgrAaozqA_Y4b0DKlM\n\nTables (migrated from eluxnetworks.net):\n- deployments: 45 rows\n- devices: 455 rows\n- person_details: 8 rows (⚠️ users table!)\n- deployment_details: 23 rows\n\n⚠️ SECURITY: Passwords in plain text in 'key' field!\nSee: 05_Database_Schema.json for full details\n\nStorage Bucket: media (public)\n- /avatars/ - User avatars\n- /floor-plans/ - Deployment floor plans\n- /documents/ - PDFs, disclaimers\n- /reports/ - Generated reports\n\nStorage URL:\nhttps://bfzizknbxbsfrffqityf.supabase.co/storage/v1/object/public/media/{path}\n\nMigration: Dec 18, 2025\nStatus: VERIFIED",
|
||
"x": 1840,
|
||
"y": 720
|
||
},
|
||
{
|
||
"id": "brevo_email",
|
||
"type": "card",
|
||
"title": "Brevo Email Service",
|
||
"borderColor": "orange",
|
||
"tags": [
|
||
"external",
|
||
"pending"
|
||
],
|
||
"description": "Brevo (formerly Sendinblue)\nTransactional Email Service\n\n=== TO CONFIGURE ===\n\nAPI Key: [TBD - get from Brevo dashboard]\nSMTP Server: smtp-relay.brevo.com\nPort: 587\n\nUsage:\n- Password reset emails\n- Welcome emails\n- Alert notifications\n\nEndpoints needed:\n- POST /api/auth/forgot-password\n- POST /api/auth/reset-password\n\nTemplates:\n- password_reset\n- welcome_user\n- alert_notification\n\nDocs: https://developers.brevo.com/",
|
||
"x": 2060,
|
||
"y": 720
|
||
},
|
||
{
|
||
"id": "website_urls",
|
||
"type": "card",
|
||
"title": "Website & Domains",
|
||
"borderColor": "cyan",
|
||
"tags": [
|
||
"external"
|
||
],
|
||
"description": "WellNuo Domains\n\n=== CURRENT ===\nWebsite: https://wellnuo.smartlaunchhub.com\nAPI: https://wellnuo.smartlaunchhub.com/api\n\n=== FUTURE (when ready) ===\nWebsite: https://wellnuo.com\nAPI: https://api.wellnuo.com\n\n=== HOSTING ===\nServer: 91.98.205.156 (SmartLaunchHub)\nSSL: Let's Encrypt\nNginx: reverse proxy\n\nDeployment:\nrsync to /var/www/wellnuo/",
|
||
"x": 2060,
|
||
"y": 580
|
||
},
|
||
{
|
||
"id": "wellnuo_backend",
|
||
"type": "card",
|
||
"title": "WellNuo Backend (Node.js) ✓",
|
||
"borderColor": "green",
|
||
"tags": [
|
||
"backend",
|
||
"verified"
|
||
],
|
||
"description": "Custom Node.js Backend API (Hybrid)\n\n=== DEPLOYED ===\nURL: https://wellnuo.smartlaunchhub.com\nPath: /var/www/wellnuo-backend/\nPM2: wellnuo-api\nPort: 3010\n\nStack: Express + Supabase SDK\n\nAPI Format (same as old):\nPOST /function/well-api/api\nBody: function=<name>¶ms...\n\n=== МОЖНО НАПРЯМУЮ ===\nСтарый API всё ещё доступен:\nhttps://eluxnetworks.net/function/well-api/api\n\nМожно обращаться напрямую к нему\nдля любых запросов (нужен токен).\n\nConfig: .env file\nDeployed: Dec 18, 2025\nStatus: WORKING",
|
||
"x": 1840,
|
||
"y": 880
|
||
},
|
||
{
|
||
"id": "api_routing",
|
||
"type": "card",
|
||
"title": "API Routing (Hybrid) ✓",
|
||
"borderColor": "cyan",
|
||
"tags": [
|
||
"backend",
|
||
"overview"
|
||
],
|
||
"description": "=== НАШИ ENDPOINTS (Supabase) ===\n\nAuth:\n- credentials\n- new_user_form\n\nDashboard:\n- dashboard_list\n- dashboard_single\n\nDeployments:\n- deployments_list\n- get_deployment\n- deployment_form\n- deployment_delete\n- set_deployment\n- find_deployments\n- get_floor_layout\n- set_floor_layout\n- request_deployment_map_new\n- get_devices_locations\n\nDevices:\n- device_list\n- device_list_4_gui\n- device_list_by_deployment\n- get_device\n- device_form\n- device_set_group\n- device_get_live\n- device_reboot\n- device_set_well_id\n- device_set_network_id\n- request_devices\n\nBeneficiaries:\n- beneficiaries_list\n- get_beneficiary\n- beneficiary_form\n\nCaretakers:\n- caretakers_list\n- get_caretaker\n- caretaker_form\n\nAlarms:\n- alarm_on_off\n- get_alarm_state\n- store_alarms\n- send_walarm\n- activity_detected",
|
||
"x": 2060,
|
||
"y": 880
|
||
},
|
||
{
|
||
"id": "api_proxy_to_old",
|
||
"type": "card",
|
||
"title": "Proxy → Old API ✓",
|
||
"borderColor": "orange",
|
||
"tags": [
|
||
"backend",
|
||
"external"
|
||
],
|
||
"description": "=== ПРОКСИРУЕМ НА СТАРЫЙ API ===\n\nЭти endpoints идут на:\nhttps://eluxnetworks.net/function/well-api/api\n\nSensor Data (realtime):\n- get_presence_data\n- get_raw_data\n- get_sensor_data_by_deployment_id\n- get_sensor_bucketed_data_by_room_sensor\n- get_time_deltas\n- request_single_slice\n- request_single_radar_slice\n- request_proximity\n- activities_report_details\n\nVoice AI:\n- voice_ask (AI chatbot)\n\nMaps/Images/Downloads:\n- get_image_file\n- download\n- get_full_location_map\n- get_sensors_map\n- get_photo\n\n=== FALLBACK ===\nВсе неизвестные функции\nтоже проксируются на старый API.\n\n=== ПРЯМОЙ ДОСТУП ===\nМожно обращаться к старому API\nнапрямую без нашего backend.",
|
||
"x": 2280,
|
||
"y": 880
|
||
}
|
||
],
|
||
"connections": [
|
||
{
|
||
"from": "env_header",
|
||
"to": "api_auth"
|
||
},
|
||
{
|
||
"from": "env_header",
|
||
"to": "web_dashboard"
|
||
},
|
||
{
|
||
"from": "test_credentials",
|
||
"to": "api_auth"
|
||
},
|
||
{
|
||
"from": "api_auth",
|
||
"to": "api_deployments_list"
|
||
},
|
||
{
|
||
"from": "api_auth",
|
||
"to": "api_dashboard_single"
|
||
},
|
||
{
|
||
"from": "api_auth",
|
||
"to": "jwt_token"
|
||
},
|
||
{
|
||
"from": "api_dashboard_single",
|
||
"to": "api_dashboard_list"
|
||
},
|
||
{
|
||
"from": "api_dashboard_single",
|
||
"to": "api_voice_ask"
|
||
},
|
||
{
|
||
"from": "api_dashboard_single",
|
||
"to": "deployment_ids"
|
||
},
|
||
{
|
||
"from": "api_deployments_list",
|
||
"to": "api_deployment_form"
|
||
},
|
||
{
|
||
"from": "api_deployment_form",
|
||
"to": "api_deployment_edit"
|
||
},
|
||
{
|
||
"from": "api_deployment_edit",
|
||
"to": "api_deployment_delete"
|
||
},
|
||
{
|
||
"from": "api_deployment_edit",
|
||
"to": "api_get_deployment"
|
||
},
|
||
{
|
||
"from": "api_get_deployment",
|
||
"to": "api_find_deployments"
|
||
},
|
||
{
|
||
"from": "api_deployments_list",
|
||
"to": "api_beneficiaries_list"
|
||
},
|
||
{
|
||
"from": "api_beneficiaries_list",
|
||
"to": "api_beneficiary_form"
|
||
},
|
||
{
|
||
"from": "api_beneficiary_form",
|
||
"to": "api_get_beneficiary"
|
||
},
|
||
{
|
||
"from": "api_beneficiaries_list",
|
||
"to": "api_caretakers_list"
|
||
},
|
||
{
|
||
"from": "api_caretakers_list",
|
||
"to": "api_caretaker_form"
|
||
},
|
||
{
|
||
"from": "api_caretaker_form",
|
||
"to": "api_get_caretaker"
|
||
},
|
||
{
|
||
"from": "api_caretakers_list",
|
||
"to": "api_device_list"
|
||
},
|
||
{
|
||
"from": "api_device_list",
|
||
"to": "api_device_list_by_deployment"
|
||
},
|
||
{
|
||
"from": "api_device_list_by_deployment",
|
||
"to": "api_device_form"
|
||
},
|
||
{
|
||
"from": "api_device_form",
|
||
"to": "api_get_device"
|
||
},
|
||
{
|
||
"from": "api_device_list",
|
||
"to": "api_device_reboot"
|
||
},
|
||
{
|
||
"from": "api_device_reboot",
|
||
"to": "api_device_get_live"
|
||
},
|
||
{
|
||
"from": "api_device_get_live",
|
||
"to": "api_device_set_group"
|
||
},
|
||
{
|
||
"from": "api_device_set_group",
|
||
"to": "api_device_set_well_id"
|
||
},
|
||
{
|
||
"from": "web_dashboard",
|
||
"to": "api_alarm_on_off"
|
||
},
|
||
{
|
||
"from": "api_alarm_on_off",
|
||
"to": "api_get_alarm_state"
|
||
},
|
||
{
|
||
"from": "api_get_alarm_state",
|
||
"to": "api_activity_detected"
|
||
},
|
||
{
|
||
"from": "api_activity_detected",
|
||
"to": "api_activities_report_details"
|
||
},
|
||
{
|
||
"from": "api_device_set_well_id",
|
||
"to": "api_get_floor_layout"
|
||
},
|
||
{
|
||
"from": "api_get_floor_layout",
|
||
"to": "api_location_map"
|
||
},
|
||
{
|
||
"from": "api_location_map",
|
||
"to": "api_get_image_file"
|
||
},
|
||
{
|
||
"from": "api_get_image_file",
|
||
"to": "api_download"
|
||
},
|
||
{
|
||
"from": "api_download",
|
||
"to": "api_get_devices_locations"
|
||
},
|
||
{
|
||
"from": "api_get_floor_layout",
|
||
"to": "server_info"
|
||
},
|
||
{
|
||
"from": "server_info",
|
||
"to": "api_status_summary"
|
||
},
|
||
{
|
||
"from": "api_status_summary",
|
||
"to": "expo_config"
|
||
},
|
||
{
|
||
"from": "expo_config",
|
||
"to": "gitea_repo"
|
||
},
|
||
{
|
||
"from": "gitea_repo",
|
||
"to": "eas_build"
|
||
},
|
||
{
|
||
"from": "eas_build",
|
||
"to": "supabase_db"
|
||
},
|
||
{
|
||
"from": "supabase_db",
|
||
"to": "wellnuo_backend"
|
||
},
|
||
{
|
||
"from": "supabase_db",
|
||
"to": "brevo_email"
|
||
},
|
||
{
|
||
"from": "eas_build",
|
||
"to": "website_urls"
|
||
},
|
||
{
|
||
"from": "website_urls",
|
||
"to": "brevo_email"
|
||
},
|
||
{
|
||
"from": "deployment_ids",
|
||
"to": "api_get_beneficiary"
|
||
},
|
||
{
|
||
"from": "wellnuo_backend",
|
||
"to": "api_routing"
|
||
},
|
||
{
|
||
"from": "api_routing",
|
||
"to": "api_proxy_to_old"
|
||
},
|
||
{
|
||
"from": "api_proxy_to_old",
|
||
"to": "server_info"
|
||
}
|
||
],
|
||
"tagsDictionary": [
|
||
{
|
||
"id": "tag-frontend",
|
||
"name": "frontend",
|
||
"color": "green"
|
||
},
|
||
{
|
||
"id": "tag-backend",
|
||
"name": "backend",
|
||
"color": "blue"
|
||
},
|
||
{
|
||
"id": "tag-external",
|
||
"name": "external",
|
||
"color": "orange"
|
||
},
|
||
{
|
||
"id": "tag-verified",
|
||
"name": "verified",
|
||
"color": "lime"
|
||
},
|
||
{
|
||
"id": "tag-pending",
|
||
"name": "pending",
|
||
"color": "yellow"
|
||
},
|
||
{
|
||
"id": "tag-credentials",
|
||
"name": "credentials",
|
||
"color": "red"
|
||
},
|
||
{
|
||
"id": "tag-overview",
|
||
"name": "overview",
|
||
"color": "purple"
|
||
}
|
||
]
|
||
}
|