diff --git a/.github/specs/bugs-1.0.6-01/bugs-1.0.6-set01.md b/.github/specs/archive/bugs-1.0.6-01/bugs-1.0.6-set01.md similarity index 100% rename from .github/specs/bugs-1.0.6-01/bugs-1.0.6-set01.md rename to .github/specs/archive/bugs-1.0.6-01/bugs-1.0.6-set01.md diff --git a/.github/specs/bugs-1.0.6-01/image-1.png b/.github/specs/archive/bugs-1.0.6-01/image-1.png similarity index 100% rename from .github/specs/bugs-1.0.6-01/image-1.png rename to .github/specs/archive/bugs-1.0.6-01/image-1.png diff --git a/.github/specs/bugs-1.0.6-01/image.png b/.github/specs/archive/bugs-1.0.6-01/image.png similarity index 100% rename from .github/specs/bugs-1.0.6-01/image.png rename to .github/specs/archive/bugs-1.0.6-01/image.png diff --git a/.github/specs/bugs-1.0.6-02/bugs-1.0.6-set02.md b/.github/specs/archive/bugs-1.0.6-02/bugs-1.0.6-set02.md similarity index 100% rename from .github/specs/bugs-1.0.6-02/bugs-1.0.6-set02.md rename to .github/specs/archive/bugs-1.0.6-02/bugs-1.0.6-set02.md diff --git a/.github/specs/bugs-1.0.6-02/image.png b/.github/specs/archive/bugs-1.0.6-02/image.png similarity index 100% rename from .github/specs/bugs-1.0.6-02/image.png rename to .github/specs/archive/bugs-1.0.6-02/image.png diff --git a/.gitignore b/.gitignore index b17a22f..ea75d07 100644 --- a/.gitignore +++ b/.gitignore @@ -5,3 +5,4 @@ resources/ frontend/vue-app/playwright-report/ frontend/vue-app/test-results/ backend/test-results/ +.vscode/keybindings.json diff --git a/backend/config/version.py b/backend/config/version.py index 5a00f96..5ac0a37 100644 --- a/backend/config/version.py +++ b/backend/config/version.py @@ -2,7 +2,7 @@ # file: config/version.py import os -BASE_VERSION = "1.0.7" # update manually when releasing features +BASE_VERSION = "1.0.8" # update manually when releasing features def get_full_version() -> str: """ diff --git a/backend/data/db/tasks.json.bak.20260228_104347 b/backend/data/db/tasks.json.bak.20260228_104347 deleted file mode 100644 index d6ffcc4..0000000 --- a/backend/data/db/tasks.json.bak.20260228_104347 +++ /dev/null @@ -1,144 +0,0 @@ -{ - "_default": { - "1": { - "id": "57c21328-637e-4df3-be5b-7f619cbf4076", - "created_at": 1771343995.1881204, - "updated_at": 1771343995.188121, - "name": "Take out trash", - "points": 20, - "is_good": true, - "image_id": "trash-can", - "user_id": null - }, - "2": { - "id": "70316500-e4ce-4399-8e4b-86a4046fafcb", - "created_at": 1771343995.1881304, - "updated_at": 1771343995.1881304, - "name": "Make your bed", - "points": 25, - "is_good": true, - "image_id": "make-the-bed", - "user_id": null - }, - "3": { - "id": "71afb2e5-18de-4f99-9e1e-2f4e391e6c2c", - "created_at": 1771343995.1881359, - "updated_at": 1771343995.1881359, - "name": "Sweep and clean kitchen", - "points": 15, - "is_good": true, - "image_id": "vacuum", - "user_id": null - }, - "4": { - "id": "e0aae53d-d4b6-4203-b910-004917db6003", - "created_at": 1771343995.1881409, - "updated_at": 1771343995.188141, - "name": "Do homework early", - "points": 30, - "is_good": true, - "image_id": "homework", - "user_id": null - }, - "5": { - "id": "0ba544f6-2d61-4009-af8f-bcb4e94b7a11", - "created_at": 1771343995.188146, - "updated_at": 1771343995.188146, - "name": "Be good for the day", - "points": 15, - "is_good": true, - "image_id": "good", - "user_id": null - }, - "6": { - "id": "8b5750d4-5a58-40cb-a31b-667569069d34", - "created_at": 1771343995.1881511, - "updated_at": 1771343995.1881511, - "name": "Clean your mess", - "points": 20, - "is_good": true, - "image_id": "broom", - "user_id": null - }, - "7": { - "id": "aec5fb49-06d0-43c4-aa09-9583064b7275", - "created_at": 1771343995.1881557, - "updated_at": 1771343995.1881557, - "name": "Fighting", - "points": 10, - "is_good": false, - "image_id": "fighting", - "user_id": null - }, - "8": { - "id": "0221ab72-c6c0-429f-a5f1-bc3d843fce9e", - "created_at": 1771343995.1881602, - "updated_at": 1771343995.1881602, - "name": "Yelling at parents", - "points": 10, - "is_good": false, - "image_id": "yelling", - "user_id": null - }, - "9": { - "id": "672bfc74-4b85-4e8e-a2d0-74f14ab966cc", - "created_at": 1771343995.1881647, - "updated_at": 1771343995.1881647, - "name": "Lying", - "points": 10, - "is_good": false, - "image_id": "lying", - "user_id": null - }, - "10": { - "id": "d8cc254f-922b-4dc2-ac4c-32fc3bbda584", - "created_at": 1771343995.1881692, - "updated_at": 1771343995.1881695, - "name": "Not doing what told", - "points": 5, - "is_good": false, - "image_id": "ignore", - "user_id": null - }, - "11": { - "id": "8be18d9a-48e6-402b-a0ba-630a2d50e325", - "created_at": 1771343995.188174, - "updated_at": 1771343995.188174, - "name": "Not flushing toilet", - "points": 5, - "is_good": false, - "image_id": "toilet", - "user_id": null - }, - "12": { - "id": "b3b44115-529b-4eb3-9f8b-686dd24547a1", - "created_at": 1771345063.4665146, - "updated_at": 1771345063.4665148, - "name": "Take out trash", - "points": 21, - "is_good": true, - "image_id": "trash-can", - "user_id": "a5f05d38-7f7c-4663-b00f-3d6138e0e246" - }, - "13": { - "id": "c74fc8c7-5af1-4d40-afbb-6da2647ca18b", - "created_at": 1771345069.1633172, - "updated_at": 1771345069.1633174, - "name": "aaa", - "points": 1, - "is_good": true, - "image_id": "computer-game", - "user_id": "a5f05d38-7f7c-4663-b00f-3d6138e0e246" - }, - "14": { - "id": "65e79bbd-6cdf-4636-9e9d-f608206dbd80", - "created_at": 1772251855.4823341, - "updated_at": 1772251855.4823341, - "name": "Be Cool \ud83d\ude0e", - "points": 5, - "type": "kindness", - "image_id": "58d4adb9-3cee-4d7c-8e90-d81173716ce5", - "user_id": "6da06108-0db8-46be-b4cb-60ce7b54564d" - } - } -} \ No newline at end of file diff --git a/backend/data/db/tracking_events.json.bak.20260228_104347 b/backend/data/db/tracking_events.json.bak.20260228_104347 deleted file mode 100644 index fcedad4..0000000 --- a/backend/data/db/tracking_events.json.bak.20260228_104347 +++ /dev/null @@ -1,2615 +0,0 @@ -{ - "_default": { - "1": { - "id": "db45b4a7-5227-4db2-b544-fb83e73a6b06", - "created_at": 1770667537.1304371, - "updated_at": 1770667537.1304371, - "user_id": "965cd681-e59b-4989-a1e4-a54161a86e8a", - "child_id": "6baee348-4ac8-41ad-9897-f98cc1d55cf1", - "entity_type": "task", - "entity_id": "8d2fdfa9-1a7a-496f-8efb-b575817168aa", - "action": "activated", - "points_before": 0, - "points_after": 5, - "delta": 5, - "occurred_at": "2026-02-09T20:05:37.130437+00:00", - "metadata": { - "task_name": "Something!", - "is_good": true - } - }, - "2": { - "id": "f14c4a59-5707-4f9f-93b2-8acc9e715993", - "created_at": 1770667538.988825, - "updated_at": 1770667538.988825, - "user_id": "965cd681-e59b-4989-a1e4-a54161a86e8a", - "child_id": "6baee348-4ac8-41ad-9897-f98cc1d55cf1", - "entity_type": "task", - "entity_id": "8d2fdfa9-1a7a-496f-8efb-b575817168aa", - "action": "activated", - "points_before": 5, - "points_after": 10, - "delta": 5, - "occurred_at": "2026-02-09T20:05:38.988825+00:00", - "metadata": { - "task_name": "Something!", - "is_good": true - } - }, - "3": { - "id": "218d83dc-ca17-454c-8278-53c5790d755a", - "created_at": 1770667543.042699, - "updated_at": 1770667543.042699, - "user_id": "965cd681-e59b-4989-a1e4-a54161a86e8a", - "child_id": "6baee348-4ac8-41ad-9897-f98cc1d55cf1", - "entity_type": "penalty", - "entity_id": "8ddfb5d3-5bab-480b-8b22-bde0d96aeb7b", - "action": "activated", - "points_before": 10, - "points_after": 7, - "delta": -3, - "occurred_at": "2026-02-09T20:05:43.042699+00:00", - "metadata": { - "task_name": "BAD KID", - "is_good": false - } - }, - "4": { - "id": "c4ffd250-f3c1-4f0d-97e7-5e93cf9cb602", - "created_at": 1770667551.23383, - "updated_at": 1770667551.23383, - "user_id": "965cd681-e59b-4989-a1e4-a54161a86e8a", - "child_id": "6baee348-4ac8-41ad-9897-f98cc1d55cf1", - "entity_type": "reward", - "entity_id": "d70f0923-3de2-4fa1-b6a8-ca274f440783", - "action": "requested", - "points_before": 7, - "points_after": 7, - "delta": 0, - "occurred_at": "2026-02-09T20:05:51.233829+00:00", - "metadata": { - "reward_name": "Yay!", - "reward_cost": 5 - } - }, - "5": { - "id": "eddadcf7-e84c-4523-81c3-a1d9740949d7", - "created_at": 1770667557.2226722, - "updated_at": 1770667557.2226722, - "user_id": "965cd681-e59b-4989-a1e4-a54161a86e8a", - "child_id": "6baee348-4ac8-41ad-9897-f98cc1d55cf1", - "entity_type": "reward", - "entity_id": "d70f0923-3de2-4fa1-b6a8-ca274f440783", - "action": "cancelled", - "points_before": 7, - "points_after": 7, - "delta": 0, - "occurred_at": "2026-02-09T20:05:57.222672+00:00", - "metadata": { - "reward_name": "Yay!", - "reward_cost": 5 - } - }, - "6": { - "id": "50407d95-d903-4b5e-b324-aba8580f75d5", - "created_at": 1770667559.1435432, - "updated_at": 1770667559.1435432, - "user_id": "965cd681-e59b-4989-a1e4-a54161a86e8a", - "child_id": "6baee348-4ac8-41ad-9897-f98cc1d55cf1", - "entity_type": "reward", - "entity_id": "d70f0923-3de2-4fa1-b6a8-ca274f440783", - "action": "requested", - "points_before": 7, - "points_after": 7, - "delta": 0, - "occurred_at": "2026-02-09T20:05:59.143543+00:00", - "metadata": { - "reward_name": "Yay!", - "reward_cost": 5 - } - }, - "7": { - "id": "9a5668bb-e3e6-4b30-8af5-d614aa8bf87e", - "created_at": 1770667569.1408224, - "updated_at": 1770667569.1408224, - "user_id": "965cd681-e59b-4989-a1e4-a54161a86e8a", - "child_id": "6baee348-4ac8-41ad-9897-f98cc1d55cf1", - "entity_type": "reward", - "entity_id": "d70f0923-3de2-4fa1-b6a8-ca274f440783", - "action": "redeemed", - "points_before": 7, - "points_after": 2, - "delta": -5, - "occurred_at": "2026-02-09T20:06:09.140822+00:00", - "metadata": { - "reward_name": "Yay!", - "reward_cost": 5 - } - }, - "8": { - "id": "88e82331-2961-4ed6-ae4e-368a76bbf815", - "created_at": 1770694931.5858757, - "updated_at": 1770694931.5858757, - "user_id": "965cd681-e59b-4989-a1e4-a54161a86e8a", - "child_id": "6baee348-4ac8-41ad-9897-f98cc1d55cf1", - "entity_type": "penalty", - "entity_id": "8ddfb5d3-5bab-480b-8b22-bde0d96aeb7b", - "action": "activated", - "points_before": 2, - "points_after": 0, - "delta": -2, - "occurred_at": "2026-02-10T03:42:11.585875+00:00", - "metadata": { - "task_name": "BAD KID", - "is_good": false, - "default_points": 3, - "custom_points": 444, - "has_override": true - } - }, - "9": { - "id": "cf447588-352d-4246-9db8-97818d427e42", - "created_at": 1770694934.6895225, - "updated_at": 1770694934.6895225, - "user_id": "965cd681-e59b-4989-a1e4-a54161a86e8a", - "child_id": "6baee348-4ac8-41ad-9897-f98cc1d55cf1", - "entity_type": "task", - "entity_id": "8d2fdfa9-1a7a-496f-8efb-b575817168aa", - "action": "activated", - "points_before": 0, - "points_after": 16, - "delta": 16, - "occurred_at": "2026-02-10T03:42:14.689522+00:00", - "metadata": { - "task_name": "Something!", - "is_good": true, - "default_points": 5, - "custom_points": 16, - "has_override": true - } - }, - "10": { - "id": "a5efe2b0-1443-406a-a21e-69a42c05e235", - "created_at": 1770694936.812026, - "updated_at": 1770694936.812026, - "user_id": "965cd681-e59b-4989-a1e4-a54161a86e8a", - "child_id": "6baee348-4ac8-41ad-9897-f98cc1d55cf1", - "entity_type": "penalty", - "entity_id": "8ddfb5d3-5bab-480b-8b22-bde0d96aeb7b", - "action": "activated", - "points_before": 16, - "points_after": 0, - "delta": -16, - "occurred_at": "2026-02-10T03:42:16.812026+00:00", - "metadata": { - "task_name": "BAD KID", - "is_good": false, - "default_points": 3, - "custom_points": 444, - "has_override": true - } - }, - "11": { - "id": "73f2d27e-6542-4dd0-8a7f-155afbf2760b", - "created_at": 1770754891.5660706, - "updated_at": 1770754891.5660706, - "user_id": "965cd681-e59b-4989-a1e4-a54161a86e8a", - "child_id": "6baee348-4ac8-41ad-9897-f98cc1d55cf1", - "entity_type": "task", - "entity_id": "8d2fdfa9-1a7a-496f-8efb-b575817168aa", - "action": "activated", - "points_before": 0, - "points_after": 16, - "delta": 16, - "occurred_at": "2026-02-10T20:21:31.566070+00:00", - "metadata": { - "task_name": "Something!", - "is_good": true, - "default_points": 5, - "custom_points": 16, - "has_override": true - } - }, - "12": { - "id": "f1eb9af1-4270-40f1-9542-07598a65b43a", - "created_at": 1770756716.8001635, - "updated_at": 1770756716.8001635, - "user_id": "965cd681-e59b-4989-a1e4-a54161a86e8a", - "child_id": "6baee348-4ac8-41ad-9897-f98cc1d55cf1", - "entity_type": "penalty", - "entity_id": "8ddfb5d3-5bab-480b-8b22-bde0d96aeb7b", - "action": "activated", - "points_before": 16, - "points_after": 0, - "delta": -16, - "occurred_at": "2026-02-10T20:51:56.799161+00:00", - "metadata": { - "task_name": "BAD KID", - "is_good": false, - "default_points": 3, - "custom_points": 441, - "has_override": true - } - }, - "13": { - "id": "a9abde6c-4d6f-4b0f-becf-6d5c231a2822", - "created_at": 1770758961.4656804, - "updated_at": 1770758961.4656804, - "user_id": "965cd681-e59b-4989-a1e4-a54161a86e8a", - "child_id": "6baee348-4ac8-41ad-9897-f98cc1d55cf1", - "entity_type": "task", - "entity_id": "8d2fdfa9-1a7a-496f-8efb-b575817168aa", - "action": "activated", - "points_before": 0, - "points_after": 17, - "delta": 17, - "occurred_at": "2026-02-10T21:29:21.464679+00:00", - "metadata": { - "task_name": "Something!", - "is_good": true, - "default_points": 5, - "custom_points": 17, - "has_override": true - } - }, - "14": { - "id": "3b95917e-b996-4097-a423-624961cdf770", - "created_at": 1770758985.4546168, - "updated_at": 1770758985.4546168, - "user_id": "965cd681-e59b-4989-a1e4-a54161a86e8a", - "child_id": "6baee348-4ac8-41ad-9897-f98cc1d55cf1", - "entity_type": "task", - "entity_id": "a3286d8f-f97d-410a-9f67-feea2cd19614", - "action": "activated", - "points_before": 17, - "points_after": 21, - "delta": 4, - "occurred_at": "2026-02-10T21:29:45.454616+00:00", - "metadata": { - "task_name": "Yay!", - "is_good": true, - "default_points": 1, - "custom_points": 4, - "has_override": true - } - }, - "15": { - "id": "92c201a2-42ff-4e1c-8379-86acf466281f", - "created_at": 1770759462.603392, - "updated_at": 1770759462.603392, - "user_id": "965cd681-e59b-4989-a1e4-a54161a86e8a", - "child_id": "6baee348-4ac8-41ad-9897-f98cc1d55cf1", - "entity_type": "task", - "entity_id": "8d2fdfa9-1a7a-496f-8efb-b575817168aa", - "action": "activated", - "points_before": 21, - "points_after": 38, - "delta": 17, - "occurred_at": "2026-02-10T21:37:42.603392+00:00", - "metadata": { - "task_name": "Something!", - "is_good": true, - "default_points": 5, - "custom_points": 17, - "has_override": true - } - }, - "16": { - "id": "1b1b7262-d20e-4f9b-9422-9b2300621d85", - "created_at": 1770759493.5032387, - "updated_at": 1770759493.5032387, - "user_id": "965cd681-e59b-4989-a1e4-a54161a86e8a", - "child_id": "6baee348-4ac8-41ad-9897-f98cc1d55cf1", - "entity_type": "task", - "entity_id": "8d2fdfa9-1a7a-496f-8efb-b575817168aa", - "action": "activated", - "points_before": 38, - "points_after": 55, - "delta": 17, - "occurred_at": "2026-02-10T21:38:13.503238+00:00", - "metadata": { - "task_name": "Something!", - "is_good": true, - "default_points": 5, - "custom_points": 17, - "has_override": true - } - }, - "17": { - "id": "6d36cd32-9353-43d9-8b8f-2d6b636aad34", - "created_at": 1770759639.4620554, - "updated_at": 1770759639.4620554, - "user_id": "965cd681-e59b-4989-a1e4-a54161a86e8a", - "child_id": "6baee348-4ac8-41ad-9897-f98cc1d55cf1", - "entity_type": "penalty", - "entity_id": "8ddfb5d3-5bab-480b-8b22-bde0d96aeb7b", - "action": "activated", - "points_before": 55, - "points_after": 0, - "delta": -55, - "occurred_at": "2026-02-10T21:40:39.462055+00:00", - "metadata": { - "task_name": "BAD KID", - "is_good": false, - "default_points": 3, - "custom_points": 448, - "has_override": true - } - }, - "18": { - "id": "c95d0a2d-8725-4d61-b746-967dc59bc7ff", - "created_at": 1770759649.0091274, - "updated_at": 1770759649.0091274, - "user_id": "965cd681-e59b-4989-a1e4-a54161a86e8a", - "child_id": "6baee348-4ac8-41ad-9897-f98cc1d55cf1", - "entity_type": "task", - "entity_id": "8d2fdfa9-1a7a-496f-8efb-b575817168aa", - "action": "activated", - "points_before": 0, - "points_after": 17, - "delta": 17, - "occurred_at": "2026-02-10T21:40:49.009127+00:00", - "metadata": { - "task_name": "Something!", - "is_good": true, - "default_points": 5, - "custom_points": 17, - "has_override": true - } - }, - "19": { - "id": "715442e5-b925-4c53-a5f0-ca2526e14897", - "created_at": 1770759727.982654, - "updated_at": 1770759727.982654, - "user_id": "965cd681-e59b-4989-a1e4-a54161a86e8a", - "child_id": "6baee348-4ac8-41ad-9897-f98cc1d55cf1", - "entity_type": "task", - "entity_id": "8d2fdfa9-1a7a-496f-8efb-b575817168aa", - "action": "activated", - "points_before": 17, - "points_after": 34, - "delta": 17, - "occurred_at": "2026-02-10T21:42:07.982654+00:00", - "metadata": { - "task_name": "Something!", - "is_good": true, - "default_points": 5, - "custom_points": 17, - "has_override": true - } - }, - "20": { - "id": "4ce80078-b78a-4e24-9211-93529d6c0e56", - "created_at": 1770759747.9955525, - "updated_at": 1770759747.9955525, - "user_id": "965cd681-e59b-4989-a1e4-a54161a86e8a", - "child_id": "6baee348-4ac8-41ad-9897-f98cc1d55cf1", - "entity_type": "task", - "entity_id": "8d2fdfa9-1a7a-496f-8efb-b575817168aa", - "action": "activated", - "points_before": 34, - "points_after": 51, - "delta": 17, - "occurred_at": "2026-02-10T21:42:27.995552+00:00", - "metadata": { - "task_name": "Something!", - "is_good": true, - "default_points": 5, - "custom_points": 17, - "has_override": true - } - }, - "21": { - "id": "a1ef86c9-30a3-4b85-8044-0565080dd435", - "created_at": 1770759754.9552932, - "updated_at": 1770759754.9552932, - "user_id": "965cd681-e59b-4989-a1e4-a54161a86e8a", - "child_id": "6baee348-4ac8-41ad-9897-f98cc1d55cf1", - "entity_type": "penalty", - "entity_id": "8ddfb5d3-5bab-480b-8b22-bde0d96aeb7b", - "action": "activated", - "points_before": 51, - "points_after": 0, - "delta": -51, - "occurred_at": "2026-02-10T21:42:34.955293+00:00", - "metadata": { - "task_name": "BAD KID", - "is_good": false, - "default_points": 3, - "custom_points": 448, - "has_override": true - } - }, - "22": { - "id": "66d8ad96-ec09-472e-828e-e22dcdae0889", - "created_at": 1770759759.5374327, - "updated_at": 1770759759.5374327, - "user_id": "965cd681-e59b-4989-a1e4-a54161a86e8a", - "child_id": "6baee348-4ac8-41ad-9897-f98cc1d55cf1", - "entity_type": "task", - "entity_id": "8d2fdfa9-1a7a-496f-8efb-b575817168aa", - "action": "activated", - "points_before": 0, - "points_after": 17, - "delta": 17, - "occurred_at": "2026-02-10T21:42:39.537432+00:00", - "metadata": { - "task_name": "Something!", - "is_good": true, - "default_points": 5, - "custom_points": 17, - "has_override": true - } - }, - "23": { - "id": "09715660-87af-44c2-bbfc-58a89009c1a5", - "created_at": 1770759771.0459328, - "updated_at": 1770759771.0459328, - "user_id": "965cd681-e59b-4989-a1e4-a54161a86e8a", - "child_id": "6baee348-4ac8-41ad-9897-f98cc1d55cf1", - "entity_type": "penalty", - "entity_id": "8ddfb5d3-5bab-480b-8b22-bde0d96aeb7b", - "action": "activated", - "points_before": 17, - "points_after": 0, - "delta": -17, - "occurred_at": "2026-02-10T21:42:51.045932+00:00", - "metadata": { - "task_name": "BAD KID", - "is_good": false, - "default_points": 3, - "custom_points": 448, - "has_override": true - } - }, - "24": { - "id": "c2d05931-6bc9-48a5-b9f5-d4411f46b3d8", - "created_at": 1770759775.6446013, - "updated_at": 1770759775.6446013, - "user_id": "965cd681-e59b-4989-a1e4-a54161a86e8a", - "child_id": "6baee348-4ac8-41ad-9897-f98cc1d55cf1", - "entity_type": "task", - "entity_id": "8d2fdfa9-1a7a-496f-8efb-b575817168aa", - "action": "activated", - "points_before": 0, - "points_after": 17, - "delta": 17, - "occurred_at": "2026-02-10T21:42:55.644601+00:00", - "metadata": { - "task_name": "Something!", - "is_good": true, - "default_points": 5, - "custom_points": 17, - "has_override": true - } - }, - "25": { - "id": "61495276-ed88-4670-a7f7-795dd2f2857f", - "created_at": 1770759778.6789894, - "updated_at": 1770759778.6789894, - "user_id": "965cd681-e59b-4989-a1e4-a54161a86e8a", - "child_id": "6baee348-4ac8-41ad-9897-f98cc1d55cf1", - "entity_type": "penalty", - "entity_id": "8ddfb5d3-5bab-480b-8b22-bde0d96aeb7b", - "action": "activated", - "points_before": 17, - "points_after": 0, - "delta": -17, - "occurred_at": "2026-02-10T21:42:58.678989+00:00", - "metadata": { - "task_name": "BAD KID", - "is_good": false, - "default_points": 3, - "custom_points": 448, - "has_override": true - } - }, - "26": { - "id": "e954a59f-bbe6-4a99-8d23-a2431f3634e2", - "created_at": 1770759781.2557397, - "updated_at": 1770759781.2557397, - "user_id": "965cd681-e59b-4989-a1e4-a54161a86e8a", - "child_id": "6baee348-4ac8-41ad-9897-f98cc1d55cf1", - "entity_type": "task", - "entity_id": "a3286d8f-f97d-410a-9f67-feea2cd19614", - "action": "activated", - "points_before": 0, - "points_after": 4, - "delta": 4, - "occurred_at": "2026-02-10T21:43:01.255739+00:00", - "metadata": { - "task_name": "Yay!", - "is_good": true, - "default_points": 1, - "custom_points": 4, - "has_override": true - } - }, - "27": { - "id": "dd0059ce-dd4c-4b40-9ed4-1c45e42704bb", - "created_at": 1770759783.6527722, - "updated_at": 1770759783.6527722, - "user_id": "965cd681-e59b-4989-a1e4-a54161a86e8a", - "child_id": "6baee348-4ac8-41ad-9897-f98cc1d55cf1", - "entity_type": "task", - "entity_id": "8d2fdfa9-1a7a-496f-8efb-b575817168aa", - "action": "activated", - "points_before": 4, - "points_after": 21, - "delta": 17, - "occurred_at": "2026-02-10T21:43:03.652772+00:00", - "metadata": { - "task_name": "Something!", - "is_good": true, - "default_points": 5, - "custom_points": 17, - "has_override": true - } - }, - "28": { - "id": "27303be2-1ead-4470-a103-eda41ef45f82", - "created_at": 1770759791.1557002, - "updated_at": 1770759791.1557002, - "user_id": "965cd681-e59b-4989-a1e4-a54161a86e8a", - "child_id": "6baee348-4ac8-41ad-9897-f98cc1d55cf1", - "entity_type": "penalty", - "entity_id": "8ddfb5d3-5bab-480b-8b22-bde0d96aeb7b", - "action": "activated", - "points_before": 21, - "points_after": 0, - "delta": -21, - "occurred_at": "2026-02-10T21:43:11.155700+00:00", - "metadata": { - "task_name": "BAD KID", - "is_good": false, - "default_points": 3, - "custom_points": 448, - "has_override": true - } - }, - "29": { - "id": "af379660-d727-4a99-babd-17859f3e9c3d", - "created_at": 1770760059.2161124, - "updated_at": 1770760059.2161124, - "user_id": "965cd681-e59b-4989-a1e4-a54161a86e8a", - "child_id": "6baee348-4ac8-41ad-9897-f98cc1d55cf1", - "entity_type": "task", - "entity_id": "8d2fdfa9-1a7a-496f-8efb-b575817168aa", - "action": "activated", - "points_before": 0, - "points_after": 10, - "delta": 10, - "occurred_at": "2026-02-10T21:47:39.216112+00:00", - "metadata": { - "task_name": "Something!", - "is_good": true, - "default_points": 5, - "custom_points": 10, - "has_override": true - } - }, - "30": { - "id": "d4dbd9f9-b601-4f4f-8278-71c653e5c0d1", - "created_at": 1770760099.7214267, - "updated_at": 1770760099.7214267, - "user_id": "965cd681-e59b-4989-a1e4-a54161a86e8a", - "child_id": "6baee348-4ac8-41ad-9897-f98cc1d55cf1", - "entity_type": "penalty", - "entity_id": "8ddfb5d3-5bab-480b-8b22-bde0d96aeb7b", - "action": "activated", - "points_before": 10, - "points_after": 0, - "delta": -10, - "occurred_at": "2026-02-10T21:48:19.721426+00:00", - "metadata": { - "task_name": "BAD KID", - "is_good": false, - "default_points": 3, - "custom_points": 435, - "has_override": true - } - }, - "31": { - "id": "0dd26a51-f93f-49bd-9cbc-c462897cf952", - "created_at": 1771033433.4030366, - "updated_at": 1771033433.4030366, - "user_id": "965cd681-e59b-4989-a1e4-a54161a86e8a", - "child_id": null, - "entity_type": "user", - "entity_id": "965cd681-e59b-4989-a1e4-a54161a86e8a", - "action": "updated", - "points_before": 0, - "points_after": 0, - "delta": 0, - "occurred_at": "2026-02-14T01:43:53.403036+00:00", - "metadata": { - "first_name_updated": true, - "last_name_updated": true, - "image_updated": true - } - }, - "32": { - "id": "4e322f7f-39eb-4e38-a560-62eb0e6feafd", - "created_at": 1771033438.9587145, - "updated_at": 1771033438.9587145, - "user_id": "965cd681-e59b-4989-a1e4-a54161a86e8a", - "child_id": null, - "entity_type": "user", - "entity_id": "965cd681-e59b-4989-a1e4-a54161a86e8a", - "action": "updated", - "points_before": 0, - "points_after": 0, - "delta": 0, - "occurred_at": "2026-02-14T01:43:58.957714+00:00", - "metadata": { - "first_name_updated": true, - "last_name_updated": true, - "image_updated": true - } - }, - "33": { - "id": "2999612a-d3c7-481d-ab7d-9db0599fbc13", - "created_at": 1771034263.564902, - "updated_at": 1771034263.564902, - "user_id": "965cd681-e59b-4989-a1e4-a54161a86e8a", - "child_id": null, - "entity_type": "user", - "entity_id": "965cd681-e59b-4989-a1e4-a54161a86e8a", - "action": "updated", - "points_before": 0, - "points_after": 0, - "delta": 0, - "occurred_at": "2026-02-14T01:57:43.564902+00:00", - "metadata": { - "first_name_updated": true, - "last_name_updated": true, - "image_updated": true - } - }, - "34": { - "id": "61608888-5850-45b7-b235-e5b9df9853ab", - "created_at": 1771034266.251231, - "updated_at": 1771034266.251231, - "user_id": "965cd681-e59b-4989-a1e4-a54161a86e8a", - "child_id": null, - "entity_type": "user", - "entity_id": "965cd681-e59b-4989-a1e4-a54161a86e8a", - "action": "updated", - "points_before": 0, - "points_after": 0, - "delta": 0, - "occurred_at": "2026-02-14T01:57:46.251231+00:00", - "metadata": { - "first_name_updated": true, - "last_name_updated": true, - "image_updated": true - } - }, - "35": { - "id": "2ac764c7-3d54-4da1-8caa-2a17e5588d9a", - "created_at": 1771034319.2688167, - "updated_at": 1771034319.2688167, - "user_id": "965cd681-e59b-4989-a1e4-a54161a86e8a", - "child_id": null, - "entity_type": "user", - "entity_id": "965cd681-e59b-4989-a1e4-a54161a86e8a", - "action": "updated", - "points_before": 0, - "points_after": 0, - "delta": 0, - "occurred_at": "2026-02-14T01:58:39.268816+00:00", - "metadata": { - "first_name_updated": true, - "last_name_updated": true, - "image_updated": true - } - }, - "36": { - "id": "474e7eb9-dc8b-4165-a586-32daf4d65e80", - "created_at": 1771034329.4619715, - "updated_at": 1771034329.4619715, - "user_id": "965cd681-e59b-4989-a1e4-a54161a86e8a", - "child_id": null, - "entity_type": "user", - "entity_id": "965cd681-e59b-4989-a1e4-a54161a86e8a", - "action": "updated", - "points_before": 0, - "points_after": 0, - "delta": 0, - "occurred_at": "2026-02-14T01:58:49.461971+00:00", - "metadata": { - "first_name_updated": true, - "last_name_updated": true, - "image_updated": true - } - }, - "37": { - "id": "142ae289-cff4-4ca3-aba8-6e03cc1670a5", - "created_at": 1771034335.9931302, - "updated_at": 1771034335.9931302, - "user_id": "965cd681-e59b-4989-a1e4-a54161a86e8a", - "child_id": null, - "entity_type": "user", - "entity_id": "965cd681-e59b-4989-a1e4-a54161a86e8a", - "action": "updated", - "points_before": 0, - "points_after": 0, - "delta": 0, - "occurred_at": "2026-02-14T01:58:55.993130+00:00", - "metadata": { - "first_name_updated": true, - "last_name_updated": true, - "image_updated": true - } - }, - "38": { - "id": "7c93cda5-d6f8-49a4-a3df-d14dc16ce373", - "created_at": 1771034338.949154, - "updated_at": 1771034338.949154, - "user_id": "965cd681-e59b-4989-a1e4-a54161a86e8a", - "child_id": null, - "entity_type": "user", - "entity_id": "965cd681-e59b-4989-a1e4-a54161a86e8a", - "action": "updated", - "points_before": 0, - "points_after": 0, - "delta": 0, - "occurred_at": "2026-02-14T01:58:58.949153+00:00", - "metadata": { - "first_name_updated": true, - "last_name_updated": true, - "image_updated": true - } - }, - "39": { - "id": "bd6906ae-7e5a-4de7-ac66-4a5206b15905", - "created_at": 1771034343.5791094, - "updated_at": 1771034343.5791094, - "user_id": "965cd681-e59b-4989-a1e4-a54161a86e8a", - "child_id": null, - "entity_type": "user", - "entity_id": "965cd681-e59b-4989-a1e4-a54161a86e8a", - "action": "updated", - "points_before": 0, - "points_after": 0, - "delta": 0, - "occurred_at": "2026-02-14T01:59:03.579109+00:00", - "metadata": { - "first_name_updated": true, - "last_name_updated": true, - "image_updated": true - } - }, - "40": { - "id": "510c6ed7-e16d-47e3-91f3-36c8976b2de4", - "created_at": 1771034583.3587265, - "updated_at": 1771034583.3587265, - "user_id": "965cd681-e59b-4989-a1e4-a54161a86e8a", - "child_id": null, - "entity_type": "user", - "entity_id": "965cd681-e59b-4989-a1e4-a54161a86e8a", - "action": "updated", - "points_before": 0, - "points_after": 0, - "delta": 0, - "occurred_at": "2026-02-14T02:03:03.358726+00:00", - "metadata": { - "first_name_updated": true, - "last_name_updated": true, - "image_updated": true - } - }, - "41": { - "id": "25b899a9-4ebb-4cbc-b205-6430dfa4fde0", - "created_at": 1771037223.2644377, - "updated_at": 1771037223.2644377, - "user_id": "965cd681-e59b-4989-a1e4-a54161a86e8a", - "child_id": null, - "entity_type": "user", - "entity_id": "965cd681-e59b-4989-a1e4-a54161a86e8a", - "action": "updated", - "points_before": 0, - "points_after": 0, - "delta": 0, - "occurred_at": "2026-02-14T02:47:03.263437+00:00", - "metadata": { - "first_name_updated": true, - "last_name_updated": true, - "image_updated": true - } - }, - "42": { - "id": "9d50970e-994f-43a9-9fcc-d3281b7755d3", - "created_at": 1771037381.865174, - "updated_at": 1771037381.865174, - "user_id": "965cd681-e59b-4989-a1e4-a54161a86e8a", - "child_id": null, - "entity_type": "user", - "entity_id": "965cd681-e59b-4989-a1e4-a54161a86e8a", - "action": "updated", - "points_before": 0, - "points_after": 0, - "delta": 0, - "occurred_at": "2026-02-14T02:49:41.865173+00:00", - "metadata": { - "first_name_updated": true, - "last_name_updated": true, - "image_updated": true - } - }, - "43": { - "id": "c71bb9b2-bbd6-466a-8c62-df9f4a03358f", - "created_at": 1771039901.8020499, - "updated_at": 1771039901.8020499, - "user_id": "965cd681-e59b-4989-a1e4-a54161a86e8a", - "child_id": null, - "entity_type": "user", - "entity_id": "965cd681-e59b-4989-a1e4-a54161a86e8a", - "action": "updated", - "points_before": 0, - "points_after": 0, - "delta": 0, - "occurred_at": "2026-02-14T03:31:41.802049+00:00", - "metadata": { - "first_name_updated": true, - "last_name_updated": true, - "image_updated": true - } - }, - "44": { - "id": "74db58da-3acb-4b3c-8ab0-075519524a2b", - "created_at": 1771039919.839071, - "updated_at": 1771039919.839071, - "user_id": "965cd681-e59b-4989-a1e4-a54161a86e8a", - "child_id": null, - "entity_type": "user", - "entity_id": "965cd681-e59b-4989-a1e4-a54161a86e8a", - "action": "updated", - "points_before": 0, - "points_after": 0, - "delta": 0, - "occurred_at": "2026-02-14T03:31:59.839071+00:00", - "metadata": { - "first_name_updated": true, - "last_name_updated": true, - "image_updated": true - } - }, - "45": { - "id": "b0b81fc8-e2b7-4f8c-895a-9840f3ca3fd1", - "created_at": 1771041539.238546, - "updated_at": 1771041539.238546, - "user_id": "965cd681-e59b-4989-a1e4-a54161a86e8a", - "child_id": null, - "entity_type": "user", - "entity_id": "965cd681-e59b-4989-a1e4-a54161a86e8a", - "action": "updated", - "points_before": 0, - "points_after": 0, - "delta": 0, - "occurred_at": "2026-02-14T03:58:59.238545+00:00", - "metadata": { - "first_name_updated": true, - "last_name_updated": true, - "image_updated": true - } - }, - "46": { - "id": "9418397f-e3d6-46c7-86e4-061cae237331", - "created_at": 1771041551.7608516, - "updated_at": 1771041551.7608516, - "user_id": "965cd681-e59b-4989-a1e4-a54161a86e8a", - "child_id": null, - "entity_type": "user", - "entity_id": "965cd681-e59b-4989-a1e4-a54161a86e8a", - "action": "updated", - "points_before": 0, - "points_after": 0, - "delta": 0, - "occurred_at": "2026-02-14T03:59:11.759850+00:00", - "metadata": { - "first_name_updated": true, - "last_name_updated": true, - "image_updated": true - } - }, - "47": { - "id": "960c2a5a-ec6a-4681-a480-ed0e41310499", - "created_at": 1771041562.2377994, - "updated_at": 1771041562.2377994, - "user_id": "965cd681-e59b-4989-a1e4-a54161a86e8a", - "child_id": null, - "entity_type": "user", - "entity_id": "965cd681-e59b-4989-a1e4-a54161a86e8a", - "action": "updated", - "points_before": 0, - "points_after": 0, - "delta": 0, - "occurred_at": "2026-02-14T03:59:22.237799+00:00", - "metadata": { - "first_name_updated": true, - "last_name_updated": true, - "image_updated": true - } - }, - "48": { - "id": "448336b9-05c4-4207-b27f-ec455920d589", - "created_at": 1771041566.7536688, - "updated_at": 1771041566.7536688, - "user_id": "965cd681-e59b-4989-a1e4-a54161a86e8a", - "child_id": null, - "entity_type": "user", - "entity_id": "965cd681-e59b-4989-a1e4-a54161a86e8a", - "action": "updated", - "points_before": 0, - "points_after": 0, - "delta": 0, - "occurred_at": "2026-02-14T03:59:26.753668+00:00", - "metadata": { - "first_name_updated": true, - "last_name_updated": true, - "image_updated": true - } - }, - "49": { - "id": "f82b7b3c-1084-415e-82b1-55b240404998", - "created_at": 1771041585.746837, - "updated_at": 1771041585.746837, - "user_id": "965cd681-e59b-4989-a1e4-a54161a86e8a", - "child_id": null, - "entity_type": "user", - "entity_id": "965cd681-e59b-4989-a1e4-a54161a86e8a", - "action": "updated", - "points_before": 0, - "points_after": 0, - "delta": 0, - "occurred_at": "2026-02-14T03:59:45.746836+00:00", - "metadata": { - "first_name_updated": true, - "last_name_updated": true, - "image_updated": true - } - }, - "50": { - "id": "84fae25c-8eb1-4032-9a98-d55a24597ea5", - "created_at": 1771277065.2358286, - "updated_at": 1771277065.2358286, - "user_id": "965cd681-e59b-4989-a1e4-a54161a86e8a", - "child_id": null, - "entity_type": "user", - "entity_id": "965cd681-e59b-4989-a1e4-a54161a86e8a", - "action": "updated", - "points_before": 0, - "points_after": 0, - "delta": 0, - "occurred_at": "2026-02-16T21:24:25.235828+00:00", - "metadata": { - "first_name_updated": true, - "last_name_updated": true, - "image_updated": true - } - }, - "51": { - "id": "95436203-aef3-4cc9-b4df-021e6f71a740", - "created_at": 1771277074.832329, - "updated_at": 1771277074.832329, - "user_id": "965cd681-e59b-4989-a1e4-a54161a86e8a", - "child_id": null, - "entity_type": "user", - "entity_id": "965cd681-e59b-4989-a1e4-a54161a86e8a", - "action": "updated", - "points_before": 0, - "points_after": 0, - "delta": 0, - "occurred_at": "2026-02-16T21:24:34.832328+00:00", - "metadata": { - "first_name_updated": true, - "last_name_updated": true, - "image_updated": true - } - }, - "52": { - "id": "101711f6-c89d-4d95-91c7-d1dcbaac6c79", - "created_at": 1771277081.5148609, - "updated_at": 1771277081.5148609, - "user_id": "965cd681-e59b-4989-a1e4-a54161a86e8a", - "child_id": null, - "entity_type": "user", - "entity_id": "965cd681-e59b-4989-a1e4-a54161a86e8a", - "action": "updated", - "points_before": 0, - "points_after": 0, - "delta": 0, - "occurred_at": "2026-02-16T21:24:41.514860+00:00", - "metadata": { - "first_name_updated": true, - "last_name_updated": true, - "image_updated": true - } - }, - "53": { - "id": "5dc540ff-9535-461f-beda-82848eefac8b", - "created_at": 1771277087.0518806, - "updated_at": 1771277087.0518806, - "user_id": "965cd681-e59b-4989-a1e4-a54161a86e8a", - "child_id": null, - "entity_type": "user", - "entity_id": "965cd681-e59b-4989-a1e4-a54161a86e8a", - "action": "updated", - "points_before": 0, - "points_after": 0, - "delta": 0, - "occurred_at": "2026-02-16T21:24:47.051880+00:00", - "metadata": { - "first_name_updated": true, - "last_name_updated": true, - "image_updated": true - } - }, - "54": { - "id": "d53c1f0f-2984-4520-bddb-5efd74e4f89f", - "created_at": 1771277092.1434364, - "updated_at": 1771277092.1434364, - "user_id": "965cd681-e59b-4989-a1e4-a54161a86e8a", - "child_id": null, - "entity_type": "user", - "entity_id": "965cd681-e59b-4989-a1e4-a54161a86e8a", - "action": "updated", - "points_before": 0, - "points_after": 0, - "delta": 0, - "occurred_at": "2026-02-16T21:24:52.143436+00:00", - "metadata": { - "first_name_updated": true, - "last_name_updated": true, - "image_updated": true - } - }, - "55": { - "id": "96032e48-a3b8-43d6-b615-e908d695d7ef", - "created_at": 1771277113.7664163, - "updated_at": 1771277113.7664163, - "user_id": "965cd681-e59b-4989-a1e4-a54161a86e8a", - "child_id": null, - "entity_type": "user", - "entity_id": "965cd681-e59b-4989-a1e4-a54161a86e8a", - "action": "updated", - "points_before": 0, - "points_after": 0, - "delta": 0, - "occurred_at": "2026-02-16T21:25:13.766416+00:00", - "metadata": { - "first_name_updated": true, - "last_name_updated": true, - "image_updated": true - } - }, - "56": { - "id": "8cdde5a4-6d2b-459b-bc8f-53ead7e25620", - "created_at": 1771277118.4119937, - "updated_at": 1771277118.4119937, - "user_id": "965cd681-e59b-4989-a1e4-a54161a86e8a", - "child_id": null, - "entity_type": "user", - "entity_id": "965cd681-e59b-4989-a1e4-a54161a86e8a", - "action": "updated", - "points_before": 0, - "points_after": 0, - "delta": 0, - "occurred_at": "2026-02-16T21:25:18.411993+00:00", - "metadata": { - "first_name_updated": true, - "last_name_updated": true, - "image_updated": true - } - }, - "57": { - "id": "493d80d9-b809-4a95-8a6a-490f64942aab", - "created_at": 1771277130.4909177, - "updated_at": 1771277130.4909177, - "user_id": "965cd681-e59b-4989-a1e4-a54161a86e8a", - "child_id": null, - "entity_type": "user", - "entity_id": "965cd681-e59b-4989-a1e4-a54161a86e8a", - "action": "updated", - "points_before": 0, - "points_after": 0, - "delta": 0, - "occurred_at": "2026-02-16T21:25:30.490917+00:00", - "metadata": { - "first_name_updated": true, - "last_name_updated": true, - "image_updated": true - } - }, - "58": { - "id": "e2c113f1-1790-4e39-869d-6d7da6b64fe9", - "created_at": 1771277150.8469846, - "updated_at": 1771277150.8469846, - "user_id": "965cd681-e59b-4989-a1e4-a54161a86e8a", - "child_id": null, - "entity_type": "user", - "entity_id": "965cd681-e59b-4989-a1e4-a54161a86e8a", - "action": "updated", - "points_before": 0, - "points_after": 0, - "delta": 0, - "occurred_at": "2026-02-16T21:25:50.846984+00:00", - "metadata": { - "first_name_updated": true, - "last_name_updated": true, - "image_updated": true - } - }, - "59": { - "id": "e78d33cf-6df2-4230-8b8f-85a4b520c729", - "created_at": 1771277158.732253, - "updated_at": 1771277158.732253, - "user_id": "965cd681-e59b-4989-a1e4-a54161a86e8a", - "child_id": null, - "entity_type": "user", - "entity_id": "965cd681-e59b-4989-a1e4-a54161a86e8a", - "action": "updated", - "points_before": 0, - "points_after": 0, - "delta": 0, - "occurred_at": "2026-02-16T21:25:58.732253+00:00", - "metadata": { - "first_name_updated": true, - "last_name_updated": true, - "image_updated": true - } - }, - "60": { - "id": "44f7132b-5e22-48db-b6d1-76a78824f48d", - "created_at": 1771277163.998916, - "updated_at": 1771277163.998916, - "user_id": "965cd681-e59b-4989-a1e4-a54161a86e8a", - "child_id": null, - "entity_type": "user", - "entity_id": "965cd681-e59b-4989-a1e4-a54161a86e8a", - "action": "updated", - "points_before": 0, - "points_after": 0, - "delta": 0, - "occurred_at": "2026-02-16T21:26:03.998915+00:00", - "metadata": { - "first_name_updated": true, - "last_name_updated": true, - "image_updated": true - } - }, - "61": { - "id": "e47c9017-a311-4369-8c10-23d4bba8e98b", - "created_at": 1771277166.2835467, - "updated_at": 1771277166.2835467, - "user_id": "965cd681-e59b-4989-a1e4-a54161a86e8a", - "child_id": null, - "entity_type": "user", - "entity_id": "965cd681-e59b-4989-a1e4-a54161a86e8a", - "action": "updated", - "points_before": 0, - "points_after": 0, - "delta": 0, - "occurred_at": "2026-02-16T21:26:06.283546+00:00", - "metadata": { - "first_name_updated": true, - "last_name_updated": true, - "image_updated": true - } - }, - "62": { - "id": "3dcdf30c-6c4c-4eab-8acd-7945302ea312", - "created_at": 1771277423.5567417, - "updated_at": 1771277423.5567417, - "user_id": "965cd681-e59b-4989-a1e4-a54161a86e8a", - "child_id": null, - "entity_type": "user", - "entity_id": "965cd681-e59b-4989-a1e4-a54161a86e8a", - "action": "updated", - "points_before": 0, - "points_after": 0, - "delta": 0, - "occurred_at": "2026-02-16T21:30:23.556741+00:00", - "metadata": { - "first_name_updated": true, - "last_name_updated": true, - "image_updated": true - } - }, - "63": { - "id": "385ac48c-7fc8-4303-be4c-dcca099d1bd4", - "created_at": 1771277431.6593883, - "updated_at": 1771277431.6593883, - "user_id": "965cd681-e59b-4989-a1e4-a54161a86e8a", - "child_id": null, - "entity_type": "user", - "entity_id": "965cd681-e59b-4989-a1e4-a54161a86e8a", - "action": "updated", - "points_before": 0, - "points_after": 0, - "delta": 0, - "occurred_at": "2026-02-16T21:30:31.659388+00:00", - "metadata": { - "first_name_updated": true, - "last_name_updated": true, - "image_updated": true - } - }, - "64": { - "id": "3dbea7d6-c43a-4e65-aa4f-debce0940f9b", - "created_at": 1771277441.9338663, - "updated_at": 1771277441.9338663, - "user_id": "965cd681-e59b-4989-a1e4-a54161a86e8a", - "child_id": null, - "entity_type": "user", - "entity_id": "965cd681-e59b-4989-a1e4-a54161a86e8a", - "action": "updated", - "points_before": 0, - "points_after": 0, - "delta": 0, - "occurred_at": "2026-02-16T21:30:41.933866+00:00", - "metadata": { - "first_name_updated": true, - "last_name_updated": true, - "image_updated": true - } - }, - "65": { - "id": "701f41ab-b24b-44ef-aa84-85fceb0fda4c", - "created_at": 1771277698.4460948, - "updated_at": 1771277698.4470959, - "user_id": "965cd681-e59b-4989-a1e4-a54161a86e8a", - "child_id": null, - "entity_type": "user", - "entity_id": "965cd681-e59b-4989-a1e4-a54161a86e8a", - "action": "updated", - "points_before": 0, - "points_after": 0, - "delta": 0, - "occurred_at": "2026-02-16T21:34:58.446094+00:00", - "metadata": { - "first_name_updated": true, - "last_name_updated": true, - "image_updated": true - } - }, - "66": { - "id": "5099f7ea-c1a9-4c93-99a1-bc32c0dfb3d1", - "created_at": 1771277703.8058004, - "updated_at": 1771277703.8058004, - "user_id": "965cd681-e59b-4989-a1e4-a54161a86e8a", - "child_id": null, - "entity_type": "user", - "entity_id": "965cd681-e59b-4989-a1e4-a54161a86e8a", - "action": "updated", - "points_before": 0, - "points_after": 0, - "delta": 0, - "occurred_at": "2026-02-16T21:35:03.805800+00:00", - "metadata": { - "first_name_updated": true, - "last_name_updated": true, - "image_updated": true - } - }, - "67": { - "id": "a95698de-ec50-4ce1-8e2e-f5c750cfcddd", - "created_at": 1771277710.9951723, - "updated_at": 1771277710.9951723, - "user_id": "965cd681-e59b-4989-a1e4-a54161a86e8a", - "child_id": null, - "entity_type": "user", - "entity_id": "965cd681-e59b-4989-a1e4-a54161a86e8a", - "action": "updated", - "points_before": 0, - "points_after": 0, - "delta": 0, - "occurred_at": "2026-02-16T21:35:10.995172+00:00", - "metadata": { - "first_name_updated": true, - "last_name_updated": true, - "image_updated": true - } - }, - "68": { - "id": "26e5bbed-f213-4bb5-9607-e3ae61a2d714", - "created_at": 1771277715.2101293, - "updated_at": 1771277715.2101293, - "user_id": "965cd681-e59b-4989-a1e4-a54161a86e8a", - "child_id": null, - "entity_type": "user", - "entity_id": "965cd681-e59b-4989-a1e4-a54161a86e8a", - "action": "updated", - "points_before": 0, - "points_after": 0, - "delta": 0, - "occurred_at": "2026-02-16T21:35:15.209128+00:00", - "metadata": { - "first_name_updated": true, - "last_name_updated": true, - "image_updated": true - } - }, - "69": { - "id": "4d1cb9c8-c4ba-45ca-aec8-09b4cfe8bc15", - "created_at": 1771277717.5750105, - "updated_at": 1771277717.5750105, - "user_id": "965cd681-e59b-4989-a1e4-a54161a86e8a", - "child_id": null, - "entity_type": "user", - "entity_id": "965cd681-e59b-4989-a1e4-a54161a86e8a", - "action": "updated", - "points_before": 0, - "points_after": 0, - "delta": 0, - "occurred_at": "2026-02-16T21:35:17.575010+00:00", - "metadata": { - "first_name_updated": true, - "last_name_updated": true, - "image_updated": true - } - }, - "70": { - "id": "afc1ec67-015e-45b0-998e-99129d44fde2", - "created_at": 1771277721.6180563, - "updated_at": 1771277721.6180563, - "user_id": "965cd681-e59b-4989-a1e4-a54161a86e8a", - "child_id": null, - "entity_type": "user", - "entity_id": "965cd681-e59b-4989-a1e4-a54161a86e8a", - "action": "updated", - "points_before": 0, - "points_after": 0, - "delta": 0, - "occurred_at": "2026-02-16T21:35:21.618056+00:00", - "metadata": { - "first_name_updated": true, - "last_name_updated": true, - "image_updated": true - } - }, - "71": { - "id": "c2293a08-b477-48dd-aba5-f19bf989fc5b", - "created_at": 1771277724.6077926, - "updated_at": 1771277724.6077926, - "user_id": "965cd681-e59b-4989-a1e4-a54161a86e8a", - "child_id": null, - "entity_type": "user", - "entity_id": "965cd681-e59b-4989-a1e4-a54161a86e8a", - "action": "updated", - "points_before": 0, - "points_after": 0, - "delta": 0, - "occurred_at": "2026-02-16T21:35:24.607792+00:00", - "metadata": { - "first_name_updated": true, - "last_name_updated": true, - "image_updated": true - } - }, - "72": { - "id": "59a8f12b-1017-4261-8cbf-67ac169aaf93", - "created_at": 1771278107.3005638, - "updated_at": 1771278107.3005638, - "user_id": "965cd681-e59b-4989-a1e4-a54161a86e8a", - "child_id": null, - "entity_type": "user", - "entity_id": "965cd681-e59b-4989-a1e4-a54161a86e8a", - "action": "updated", - "points_before": 0, - "points_after": 0, - "delta": 0, - "occurred_at": "2026-02-16T21:41:47.300563+00:00", - "metadata": { - "first_name_updated": true, - "last_name_updated": true, - "image_updated": true - } - }, - "73": { - "id": "77f0ca74-db7c-42c6-8c4b-f66a38fb6ec6", - "created_at": 1771278113.0728266, - "updated_at": 1771278113.0728266, - "user_id": "965cd681-e59b-4989-a1e4-a54161a86e8a", - "child_id": null, - "entity_type": "user", - "entity_id": "965cd681-e59b-4989-a1e4-a54161a86e8a", - "action": "updated", - "points_before": 0, - "points_after": 0, - "delta": 0, - "occurred_at": "2026-02-16T21:41:53.072826+00:00", - "metadata": { - "first_name_updated": true, - "last_name_updated": true, - "image_updated": true - } - }, - "74": { - "id": "7f31ddce-ac2b-4ebc-aa92-cf6c8f35eca6", - "created_at": 1771280375.6230762, - "updated_at": 1771280375.6230762, - "user_id": "965cd681-e59b-4989-a1e4-a54161a86e8a", - "child_id": "6baee348-4ac8-41ad-9897-f98cc1d55cf1", - "entity_type": "reward", - "entity_id": "d70f0923-3de2-4fa1-b6a8-ca274f440783", - "action": "redeemed", - "points_before": 0, - "points_after": 0, - "delta": 0, - "occurred_at": "2026-02-16T22:19:35.623076+00:00", - "metadata": { - "reward_name": "Yay!", - "reward_cost": 6, - "default_cost": 6, - "custom_cost": 0, - "has_override": true - } - }, - "75": { - "id": "1a926877-62be-40c9-84a0-da6857c2e20e", - "created_at": 1771354506.2420099, - "updated_at": 1771354506.2420099, - "user_id": "6da06108-0db8-46be-b4cb-60ce7b54564d", - "child_id": "4c4217a3-dfc0-4b88-99f3-19c93d9ff7d2", - "entity_type": "task", - "entity_id": "8b5750d4-5a58-40cb-a31b-667569069d34", - "action": "activated", - "points_before": 0, - "points_after": 20, - "delta": 20, - "occurred_at": "2026-02-17T18:55:06.242009+00:00", - "metadata": { - "task_name": "Clean your mess", - "is_good": true, - "default_points": 20 - } - }, - "76": { - "id": "76f5e37a-3747-4ab7-9408-9a6ac567aacb", - "created_at": 1771354513.1727414, - "updated_at": 1771354513.1727414, - "user_id": "6da06108-0db8-46be-b4cb-60ce7b54564d", - "child_id": "4c4217a3-dfc0-4b88-99f3-19c93d9ff7d2", - "entity_type": "penalty", - "entity_id": "8be18d9a-48e6-402b-a0ba-630a2d50e325", - "action": "activated", - "points_before": 20, - "points_after": 15, - "delta": -5, - "occurred_at": "2026-02-17T18:55:13.172741+00:00", - "metadata": { - "task_name": "Not flushing toilet", - "is_good": false, - "default_points": 5 - } - }, - "77": { - "id": "7666b8ef-9c3f-4941-b590-5fc3cd23aa23", - "created_at": 1771354520.2278466, - "updated_at": 1771354520.2278466, - "user_id": "6da06108-0db8-46be-b4cb-60ce7b54564d", - "child_id": "4c4217a3-dfc0-4b88-99f3-19c93d9ff7d2", - "entity_type": "task", - "entity_id": "8b5750d4-5a58-40cb-a31b-667569069d34", - "action": "activated", - "points_before": 15, - "points_after": 35, - "delta": 20, - "occurred_at": "2026-02-17T18:55:20.227846+00:00", - "metadata": { - "task_name": "Clean your mess", - "is_good": true, - "default_points": 20 - } - }, - "78": { - "id": "b3411dbd-8b31-44f4-87a5-76bdaddb4866", - "created_at": 1771354944.0281186, - "updated_at": 1771354944.0281186, - "user_id": "6da06108-0db8-46be-b4cb-60ce7b54564d", - "child_id": "4c4217a3-dfc0-4b88-99f3-19c93d9ff7d2", - "entity_type": "task", - "entity_id": "8b5750d4-5a58-40cb-a31b-667569069d34", - "action": "activated", - "points_before": 35, - "points_after": 55, - "delta": 20, - "occurred_at": "2026-02-17T19:02:24.028118+00:00", - "metadata": { - "task_name": "Clean your mess", - "is_good": true, - "default_points": 20 - } - }, - "79": { - "id": "c426d02a-2340-463b-9297-45fe0bba12d7", - "created_at": 1771354945.7935014, - "updated_at": 1771354945.7935014, - "user_id": "6da06108-0db8-46be-b4cb-60ce7b54564d", - "child_id": "4c4217a3-dfc0-4b88-99f3-19c93d9ff7d2", - "entity_type": "penalty", - "entity_id": "8be18d9a-48e6-402b-a0ba-630a2d50e325", - "action": "activated", - "points_before": 55, - "points_after": 50, - "delta": -5, - "occurred_at": "2026-02-17T19:02:25.793501+00:00", - "metadata": { - "task_name": "Not flushing toilet", - "is_good": false, - "default_points": 5 - } - }, - "80": { - "id": "fe3543a5-8bb3-46e3-ae6d-8eff85124a02", - "created_at": 1771354947.8204334, - "updated_at": 1771354947.8204334, - "user_id": "6da06108-0db8-46be-b4cb-60ce7b54564d", - "child_id": "4c4217a3-dfc0-4b88-99f3-19c93d9ff7d2", - "entity_type": "reward", - "entity_id": "1a0ec798-516e-448d-9684-9935d87d62bf", - "action": "redeemed", - "points_before": 50, - "points_after": 34, - "delta": -16, - "occurred_at": "2026-02-17T19:02:27.820433+00:00", - "metadata": { - "reward_name": "Reward2", - "reward_cost": 16, - "default_cost": 16 - } - }, - "81": { - "id": "d12cf673-ea2b-40fc-93b4-6c501cb517c0", - "created_at": 1771362278.2112825, - "updated_at": 1771362278.2112825, - "user_id": "6da06108-0db8-46be-b4cb-60ce7b54564d", - "child_id": null, - "entity_type": "user", - "entity_id": "6da06108-0db8-46be-b4cb-60ce7b54564d", - "action": "updated", - "points_before": 0, - "points_after": 0, - "delta": 0, - "occurred_at": "2026-02-17T21:04:38.211282+00:00", - "metadata": { - "first_name_updated": true, - "last_name_updated": true, - "image_updated": true - } - }, - "82": { - "id": "136926e3-5253-4458-a17b-3988235ddd9e", - "created_at": 1771362526.2150152, - "updated_at": 1771362526.2150152, - "user_id": "6da06108-0db8-46be-b4cb-60ce7b54564d", - "child_id": null, - "entity_type": "user", - "entity_id": "6da06108-0db8-46be-b4cb-60ce7b54564d", - "action": "updated", - "points_before": 0, - "points_after": 0, - "delta": 0, - "occurred_at": "2026-02-17T21:08:46.215015+00:00", - "metadata": { - "first_name_updated": true, - "last_name_updated": true, - "image_updated": true - } - }, - "83": { - "id": "234e5f25-2138-4aac-a35b-dea7c03f4018", - "created_at": 1771362570.4153075, - "updated_at": 1771362570.4153075, - "user_id": "6da06108-0db8-46be-b4cb-60ce7b54564d", - "child_id": null, - "entity_type": "user", - "entity_id": "6da06108-0db8-46be-b4cb-60ce7b54564d", - "action": "updated", - "points_before": 0, - "points_after": 0, - "delta": 0, - "occurred_at": "2026-02-17T21:09:30.415307+00:00", - "metadata": { - "first_name_updated": true, - "last_name_updated": true, - "image_updated": true - } - }, - "84": { - "id": "0086688c-ec23-4cd0-b9a7-95b4d4126836", - "created_at": 1771362643.5340343, - "updated_at": 1771362643.5340343, - "user_id": "6da06108-0db8-46be-b4cb-60ce7b54564d", - "child_id": null, - "entity_type": "user", - "entity_id": "6da06108-0db8-46be-b4cb-60ce7b54564d", - "action": "updated", - "points_before": 0, - "points_after": 0, - "delta": 0, - "occurred_at": "2026-02-17T21:10:43.534034+00:00", - "metadata": { - "first_name_updated": true, - "last_name_updated": true, - "image_updated": true - } - }, - "85": { - "id": "742cade1-05b5-427a-aeb4-0aa183b56392", - "created_at": 1771363424.1411645, - "updated_at": 1771363424.1411645, - "user_id": "6da06108-0db8-46be-b4cb-60ce7b54564d", - "child_id": null, - "entity_type": "user", - "entity_id": "6da06108-0db8-46be-b4cb-60ce7b54564d", - "action": "updated", - "points_before": 0, - "points_after": 0, - "delta": 0, - "occurred_at": "2026-02-17T21:23:44.140164+00:00", - "metadata": { - "first_name_updated": true, - "last_name_updated": true, - "image_updated": true - } - }, - "86": { - "id": "6567b854-b865-4d6c-aa8c-5c3cd730721f", - "created_at": 1771363531.927834, - "updated_at": 1771363531.927834, - "user_id": "6da06108-0db8-46be-b4cb-60ce7b54564d", - "child_id": null, - "entity_type": "user", - "entity_id": "6da06108-0db8-46be-b4cb-60ce7b54564d", - "action": "updated", - "points_before": 0, - "points_after": 0, - "delta": 0, - "occurred_at": "2026-02-17T21:25:31.927834+00:00", - "metadata": { - "first_name_updated": true, - "last_name_updated": true, - "image_updated": true - } - }, - "87": { - "id": "fd8fcfac-b11e-4eaf-a559-290296574d8d", - "created_at": 1771363537.3987541, - "updated_at": 1771363537.3987541, - "user_id": "6da06108-0db8-46be-b4cb-60ce7b54564d", - "child_id": null, - "entity_type": "user", - "entity_id": "6da06108-0db8-46be-b4cb-60ce7b54564d", - "action": "updated", - "points_before": 0, - "points_after": 0, - "delta": 0, - "occurred_at": "2026-02-17T21:25:37.398754+00:00", - "metadata": { - "first_name_updated": true, - "last_name_updated": true, - "image_updated": true - } - }, - "88": { - "id": "4b5deee3-b457-4942-a779-f2752549b9f8", - "created_at": 1771363541.9387205, - "updated_at": 1771363541.9387205, - "user_id": "6da06108-0db8-46be-b4cb-60ce7b54564d", - "child_id": null, - "entity_type": "user", - "entity_id": "6da06108-0db8-46be-b4cb-60ce7b54564d", - "action": "updated", - "points_before": 0, - "points_after": 0, - "delta": 0, - "occurred_at": "2026-02-17T21:25:41.937719+00:00", - "metadata": { - "first_name_updated": true, - "last_name_updated": true, - "image_updated": true - } - }, - "89": { - "id": "ed370b03-567c-4d02-bb73-66d32a64424f", - "created_at": 1771363546.621036, - "updated_at": 1771363546.621036, - "user_id": "6da06108-0db8-46be-b4cb-60ce7b54564d", - "child_id": null, - "entity_type": "user", - "entity_id": "6da06108-0db8-46be-b4cb-60ce7b54564d", - "action": "updated", - "points_before": 0, - "points_after": 0, - "delta": 0, - "occurred_at": "2026-02-17T21:25:46.621036+00:00", - "metadata": { - "first_name_updated": true, - "last_name_updated": true, - "image_updated": true - } - }, - "90": { - "id": "3ab88b6c-c8ec-43ea-b9cb-3852772a86cf", - "created_at": 1771363553.8799405, - "updated_at": 1771363553.8799405, - "user_id": "6da06108-0db8-46be-b4cb-60ce7b54564d", - "child_id": null, - "entity_type": "user", - "entity_id": "6da06108-0db8-46be-b4cb-60ce7b54564d", - "action": "updated", - "points_before": 0, - "points_after": 0, - "delta": 0, - "occurred_at": "2026-02-17T21:25:53.879940+00:00", - "metadata": { - "first_name_updated": true, - "last_name_updated": true, - "image_updated": true - } - }, - "91": { - "id": "e87bd58b-cb31-4eaa-ab56-a91bb00e52f8", - "created_at": 1771363570.2317348, - "updated_at": 1771363570.2317348, - "user_id": "6da06108-0db8-46be-b4cb-60ce7b54564d", - "child_id": null, - "entity_type": "user", - "entity_id": "6da06108-0db8-46be-b4cb-60ce7b54564d", - "action": "updated", - "points_before": 0, - "points_after": 0, - "delta": 0, - "occurred_at": "2026-02-17T21:26:10.231734+00:00", - "metadata": { - "first_name_updated": true, - "last_name_updated": true, - "image_updated": true - } - }, - "92": { - "id": "f9cf8892-9a1f-49c8-8a27-e6e15c4856d4", - "created_at": 1771363589.744401, - "updated_at": 1771363589.744401, - "user_id": "6da06108-0db8-46be-b4cb-60ce7b54564d", - "child_id": null, - "entity_type": "user", - "entity_id": "6da06108-0db8-46be-b4cb-60ce7b54564d", - "action": "updated", - "points_before": 0, - "points_after": 0, - "delta": 0, - "occurred_at": "2026-02-17T21:26:29.744400+00:00", - "metadata": { - "first_name_updated": true, - "last_name_updated": true, - "image_updated": true - } - }, - "93": { - "id": "a1ad7b4d-3af8-4968-808f-db7f90555d88", - "created_at": 1771363608.701112, - "updated_at": 1771363608.701112, - "user_id": "6da06108-0db8-46be-b4cb-60ce7b54564d", - "child_id": null, - "entity_type": "user", - "entity_id": "6da06108-0db8-46be-b4cb-60ce7b54564d", - "action": "updated", - "points_before": 0, - "points_after": 0, - "delta": 0, - "occurred_at": "2026-02-17T21:26:48.701112+00:00", - "metadata": { - "first_name_updated": true, - "last_name_updated": true, - "image_updated": true - } - }, - "94": { - "id": "1c089f9c-5de7-48da-b1aa-ca49c5bf153c", - "created_at": 1771363617.3852348, - "updated_at": 1771363617.3852348, - "user_id": "6da06108-0db8-46be-b4cb-60ce7b54564d", - "child_id": null, - "entity_type": "user", - "entity_id": "6da06108-0db8-46be-b4cb-60ce7b54564d", - "action": "updated", - "points_before": 0, - "points_after": 0, - "delta": 0, - "occurred_at": "2026-02-17T21:26:57.385234+00:00", - "metadata": { - "first_name_updated": true, - "last_name_updated": true, - "image_updated": true - } - }, - "95": { - "id": "823e4e4f-2690-4356-bc60-5fd8488bc1ff", - "created_at": 1771363626.94656, - "updated_at": 1771363626.94656, - "user_id": "6da06108-0db8-46be-b4cb-60ce7b54564d", - "child_id": null, - "entity_type": "user", - "entity_id": "6da06108-0db8-46be-b4cb-60ce7b54564d", - "action": "updated", - "points_before": 0, - "points_after": 0, - "delta": 0, - "occurred_at": "2026-02-17T21:27:06.946560+00:00", - "metadata": { - "first_name_updated": true, - "last_name_updated": true, - "image_updated": true - } - }, - "96": { - "id": "defc09f1-98a6-4100-bd6a-7753513c8cd2", - "created_at": 1771363643.5360947, - "updated_at": 1771363643.5360947, - "user_id": "6da06108-0db8-46be-b4cb-60ce7b54564d", - "child_id": null, - "entity_type": "user", - "entity_id": "6da06108-0db8-46be-b4cb-60ce7b54564d", - "action": "updated", - "points_before": 0, - "points_after": 0, - "delta": 0, - "occurred_at": "2026-02-17T21:27:23.536094+00:00", - "metadata": { - "first_name_updated": true, - "last_name_updated": true, - "image_updated": true - } - }, - "97": { - "id": "6c1ce3af-2626-4a47-8ef0-9790875faa0b", - "created_at": 1771363937.3232472, - "updated_at": 1771363937.3232472, - "user_id": "6da06108-0db8-46be-b4cb-60ce7b54564d", - "child_id": null, - "entity_type": "user", - "entity_id": "6da06108-0db8-46be-b4cb-60ce7b54564d", - "action": "updated", - "points_before": 0, - "points_after": 0, - "delta": 0, - "occurred_at": "2026-02-17T21:32:17.323247+00:00", - "metadata": { - "first_name_updated": true, - "last_name_updated": true, - "image_updated": true - } - }, - "98": { - "id": "768a2500-4afc-44bd-9ed8-7a7920aaabe6", - "created_at": 1771452138.3594375, - "updated_at": 1771452138.3594375, - "user_id": "6da06108-0db8-46be-b4cb-60ce7b54564d", - "child_id": "040e59f9-e019-49f1-9ef6-37829bb5e018", - "entity_type": "task", - "entity_id": "57c21328-637e-4df3-be5b-7f619cbf4076", - "action": "activated", - "points_before": 0, - "points_after": 20, - "delta": 20, - "occurred_at": "2026-02-18T22:02:18.359437+00:00", - "metadata": { - "task_name": "Take out trash", - "is_good": true, - "default_points": 20 - } - }, - "99": { - "id": "69889ffc-cfc0-431b-b24c-ea79efad7511", - "created_at": 1771474320.751986, - "updated_at": 1771474320.751986, - "user_id": "6da06108-0db8-46be-b4cb-60ce7b54564d", - "child_id": "040e59f9-e019-49f1-9ef6-37829bb5e018", - "entity_type": "reward", - "entity_id": "b79882bc-09ac-4174-8d30-43840c8e59d1", - "action": "requested", - "points_before": 20, - "points_after": 20, - "delta": 0, - "occurred_at": "2026-02-19T04:12:00.751986+00:00", - "metadata": { - "reward_name": "test", - "reward_cost": 3 - } - }, - "100": { - "id": "4dea1030-5560-43db-a538-64d07beac296", - "created_at": 1771474327.3478558, - "updated_at": 1771474327.3478558, - "user_id": "6da06108-0db8-46be-b4cb-60ce7b54564d", - "child_id": "040e59f9-e019-49f1-9ef6-37829bb5e018", - "entity_type": "reward", - "entity_id": "b79882bc-09ac-4174-8d30-43840c8e59d1", - "action": "cancelled", - "points_before": 20, - "points_after": 20, - "delta": 0, - "occurred_at": "2026-02-19T04:12:07.347856+00:00", - "metadata": { - "reward_name": "test", - "reward_cost": 3 - } - }, - "101": { - "id": "7d554d66-c17b-4db8-a4ef-492ce8b04326", - "created_at": 1771474329.2722824, - "updated_at": 1771474329.2722824, - "user_id": "6da06108-0db8-46be-b4cb-60ce7b54564d", - "child_id": "040e59f9-e019-49f1-9ef6-37829bb5e018", - "entity_type": "reward", - "entity_id": "b79882bc-09ac-4174-8d30-43840c8e59d1", - "action": "requested", - "points_before": 20, - "points_after": 20, - "delta": 0, - "occurred_at": "2026-02-19T04:12:09.272282+00:00", - "metadata": { - "reward_name": "test", - "reward_cost": 3 - } - }, - "102": { - "id": "b3695577-b10f-49ef-9bb7-fa9e0028c6bb", - "created_at": 1771474780.5221603, - "updated_at": 1771474780.5221603, - "user_id": "6da06108-0db8-46be-b4cb-60ce7b54564d", - "child_id": "040e59f9-e019-49f1-9ef6-37829bb5e018", - "entity_type": "reward", - "entity_id": "b79882bc-09ac-4174-8d30-43840c8e59d1", - "action": "cancelled", - "points_before": 20, - "points_after": 20, - "delta": 0, - "occurred_at": "2026-02-19T04:19:40.522160+00:00", - "metadata": { - "reward_name": "test", - "reward_cost": 3 - } - }, - "103": { - "id": "de4794b2-daa1-4607-a85a-5f350c5e8096", - "created_at": 1771474801.6226425, - "updated_at": 1771474801.6226425, - "user_id": "6da06108-0db8-46be-b4cb-60ce7b54564d", - "child_id": "040e59f9-e019-49f1-9ef6-37829bb5e018", - "entity_type": "reward", - "entity_id": "b79882bc-09ac-4174-8d30-43840c8e59d1", - "action": "requested", - "points_before": 20, - "points_after": 20, - "delta": 0, - "occurred_at": "2026-02-19T04:20:01.622642+00:00", - "metadata": { - "reward_name": "test", - "reward_cost": 3 - } - }, - "104": { - "id": "1e273f23-1da6-4624-baa5-3f5089268e8e", - "created_at": 1771474808.4760501, - "updated_at": 1771474808.4760501, - "user_id": "6da06108-0db8-46be-b4cb-60ce7b54564d", - "child_id": "040e59f9-e019-49f1-9ef6-37829bb5e018", - "entity_type": "reward", - "entity_id": "b79882bc-09ac-4174-8d30-43840c8e59d1", - "action": "cancelled", - "points_before": 20, - "points_after": 20, - "delta": 0, - "occurred_at": "2026-02-19T04:20:08.476050+00:00", - "metadata": { - "reward_name": "test", - "reward_cost": 3 - } - }, - "105": { - "id": "e72786cb-558e-4c85-885b-179dddde1d4e", - "created_at": 1771474891.473705, - "updated_at": 1771474891.473705, - "user_id": "6da06108-0db8-46be-b4cb-60ce7b54564d", - "child_id": "040e59f9-e019-49f1-9ef6-37829bb5e018", - "entity_type": "reward", - "entity_id": "b79882bc-09ac-4174-8d30-43840c8e59d1", - "action": "requested", - "points_before": 20, - "points_after": 20, - "delta": 0, - "occurred_at": "2026-02-19T04:21:31.473705+00:00", - "metadata": { - "reward_name": "test", - "reward_cost": 3 - } - }, - "106": { - "id": "3bfc7dea-0213-44a1-8867-0932efecd953", - "created_at": 1771474899.5975208, - "updated_at": 1771474899.5975208, - "user_id": "6da06108-0db8-46be-b4cb-60ce7b54564d", - "child_id": "040e59f9-e019-49f1-9ef6-37829bb5e018", - "entity_type": "reward", - "entity_id": "b79882bc-09ac-4174-8d30-43840c8e59d1", - "action": "cancelled", - "points_before": 20, - "points_after": 20, - "delta": 0, - "occurred_at": "2026-02-19T04:21:39.596519+00:00", - "metadata": { - "reward_name": "test", - "reward_cost": 3 - } - }, - "107": { - "id": "4785d22f-eda7-46e3-8f1b-3ac2cf4181f3", - "created_at": 1771474908.7623906, - "updated_at": 1771474908.7623906, - "user_id": "6da06108-0db8-46be-b4cb-60ce7b54564d", - "child_id": "040e59f9-e019-49f1-9ef6-37829bb5e018", - "entity_type": "reward", - "entity_id": "b79882bc-09ac-4174-8d30-43840c8e59d1", - "action": "requested", - "points_before": 20, - "points_after": 20, - "delta": 0, - "occurred_at": "2026-02-19T04:21:48.762390+00:00", - "metadata": { - "reward_name": "test", - "reward_cost": 3 - } - }, - "108": { - "id": "86d17b70-c00b-42b5-9256-a37738a17519", - "created_at": 1771474944.5820282, - "updated_at": 1771474944.5820282, - "user_id": "6da06108-0db8-46be-b4cb-60ce7b54564d", - "child_id": "040e59f9-e019-49f1-9ef6-37829bb5e018", - "entity_type": "reward", - "entity_id": "b79882bc-09ac-4174-8d30-43840c8e59d1", - "action": "cancelled", - "points_before": 20, - "points_after": 20, - "delta": 0, - "occurred_at": "2026-02-19T04:22:24.582028+00:00", - "metadata": { - "reward_name": "test", - "reward_cost": 3 - } - }, - "109": { - "id": "536a54ff-436d-44c9-aeb0-7691d18d300b", - "created_at": 1771474986.5370867, - "updated_at": 1771474986.5370867, - "user_id": "6da06108-0db8-46be-b4cb-60ce7b54564d", - "child_id": "040e59f9-e019-49f1-9ef6-37829bb5e018", - "entity_type": "reward", - "entity_id": "b79882bc-09ac-4174-8d30-43840c8e59d1", - "action": "requested", - "points_before": 20, - "points_after": 20, - "delta": 0, - "occurred_at": "2026-02-19T04:23:06.537086+00:00", - "metadata": { - "reward_name": "test", - "reward_cost": 3 - } - }, - "110": { - "id": "f4850b1c-9e64-415e-bff1-dc2690215efb", - "created_at": 1771515588.3207414, - "updated_at": 1771515588.3207414, - "user_id": "6da06108-0db8-46be-b4cb-60ce7b54564d", - "child_id": "040e59f9-e019-49f1-9ef6-37829bb5e018", - "entity_type": "reward", - "entity_id": "b79882bc-09ac-4174-8d30-43840c8e59d1", - "action": "cancelled", - "points_before": 20, - "points_after": 20, - "delta": 0, - "occurred_at": "2026-02-19T15:39:48.320741+00:00", - "metadata": { - "reward_name": "test", - "reward_cost": 3 - } - }, - "111": { - "id": "b51f4ec1-6774-4c4a-925d-814db346f3ad", - "created_at": 1771515601.2986414, - "updated_at": 1771515601.2986414, - "user_id": "6da06108-0db8-46be-b4cb-60ce7b54564d", - "child_id": "040e59f9-e019-49f1-9ef6-37829bb5e018", - "entity_type": "reward", - "entity_id": "b79882bc-09ac-4174-8d30-43840c8e59d1", - "action": "requested", - "points_before": 20, - "points_after": 20, - "delta": 0, - "occurred_at": "2026-02-19T15:40:01.298641+00:00", - "metadata": { - "reward_name": "test", - "reward_cost": 3 - } - }, - "112": { - "id": "00d4579d-7ba3-414c-ae86-4cb13ba8ecea", - "created_at": 1771516501.2795212, - "updated_at": 1771516501.2795212, - "user_id": "6da06108-0db8-46be-b4cb-60ce7b54564d", - "child_id": "040e59f9-e019-49f1-9ef6-37829bb5e018", - "entity_type": "reward", - "entity_id": "b79882bc-09ac-4174-8d30-43840c8e59d1", - "action": "cancelled", - "points_before": 20, - "points_after": 20, - "delta": 0, - "occurred_at": "2026-02-19T15:55:01.278520+00:00", - "metadata": { - "reward_name": "test", - "reward_cost": 3 - } - }, - "113": { - "id": "23ce7732-3cf1-44f1-be87-5a2f3f270ecb", - "created_at": 1771516506.1805122, - "updated_at": 1771516506.1805122, - "user_id": "6da06108-0db8-46be-b4cb-60ce7b54564d", - "child_id": "040e59f9-e019-49f1-9ef6-37829bb5e018", - "entity_type": "reward", - "entity_id": "b79882bc-09ac-4174-8d30-43840c8e59d1", - "action": "requested", - "points_before": 20, - "points_after": 20, - "delta": 0, - "occurred_at": "2026-02-19T15:55:06.180512+00:00", - "metadata": { - "reward_name": "test", - "reward_cost": 3 - } - }, - "114": { - "id": "23b11e79-1975-4d8e-8046-f1bfab2e27a8", - "created_at": 1771516509.267931, - "updated_at": 1771516509.267931, - "user_id": "6da06108-0db8-46be-b4cb-60ce7b54564d", - "child_id": "040e59f9-e019-49f1-9ef6-37829bb5e018", - "entity_type": "reward", - "entity_id": "b79882bc-09ac-4174-8d30-43840c8e59d1", - "action": "cancelled", - "points_before": 20, - "points_after": 20, - "delta": 0, - "occurred_at": "2026-02-19T15:55:09.267930+00:00", - "metadata": { - "reward_name": "test", - "reward_cost": 3 - } - }, - "115": { - "id": "f4d95305-eccd-4737-8d01-bdfbf2e1e5d9", - "created_at": 1771516518.4790373, - "updated_at": 1771516518.4790373, - "user_id": "6da06108-0db8-46be-b4cb-60ce7b54564d", - "child_id": "040e59f9-e019-49f1-9ef6-37829bb5e018", - "entity_type": "reward", - "entity_id": "b79882bc-09ac-4174-8d30-43840c8e59d1", - "action": "requested", - "points_before": 20, - "points_after": 20, - "delta": 0, - "occurred_at": "2026-02-19T15:55:18.479037+00:00", - "metadata": { - "reward_name": "test", - "reward_cost": 3 - } - }, - "116": { - "id": "9afaa5cf-966f-46f0-8eca-79b409301d04", - "created_at": 1771516522.4230947, - "updated_at": 1771516522.4230947, - "user_id": "6da06108-0db8-46be-b4cb-60ce7b54564d", - "child_id": "040e59f9-e019-49f1-9ef6-37829bb5e018", - "entity_type": "reward", - "entity_id": "b79882bc-09ac-4174-8d30-43840c8e59d1", - "action": "cancelled", - "points_before": 20, - "points_after": 20, - "delta": 0, - "occurred_at": "2026-02-19T15:55:22.423094+00:00", - "metadata": { - "reward_name": "test", - "reward_cost": 3 - } - }, - "117": { - "id": "9c671279-4a4e-467d-9eca-710850223f01", - "created_at": 1771516532.6118965, - "updated_at": 1771516532.6118965, - "user_id": "6da06108-0db8-46be-b4cb-60ce7b54564d", - "child_id": "040e59f9-e019-49f1-9ef6-37829bb5e018", - "entity_type": "reward", - "entity_id": "b79882bc-09ac-4174-8d30-43840c8e59d1", - "action": "requested", - "points_before": 20, - "points_after": 20, - "delta": 0, - "occurred_at": "2026-02-19T15:55:32.611896+00:00", - "metadata": { - "reward_name": "test", - "reward_cost": 3 - } - }, - "118": { - "id": "7d628f48-dc78-45cf-9a67-3b5490d1e51a", - "created_at": 1771516542.1554346, - "updated_at": 1771516542.1554346, - "user_id": "6da06108-0db8-46be-b4cb-60ce7b54564d", - "child_id": "040e59f9-e019-49f1-9ef6-37829bb5e018", - "entity_type": "reward", - "entity_id": "b79882bc-09ac-4174-8d30-43840c8e59d1", - "action": "cancelled", - "points_before": 20, - "points_after": 20, - "delta": 0, - "occurred_at": "2026-02-19T15:55:42.155434+00:00", - "metadata": { - "reward_name": "test", - "reward_cost": 3 - } - }, - "119": { - "id": "584cc38c-a18a-4719-ad30-df0f6bbc6a63", - "created_at": 1771516556.4102314, - "updated_at": 1771516556.4102314, - "user_id": "6da06108-0db8-46be-b4cb-60ce7b54564d", - "child_id": "040e59f9-e019-49f1-9ef6-37829bb5e018", - "entity_type": "reward", - "entity_id": "b79882bc-09ac-4174-8d30-43840c8e59d1", - "action": "requested", - "points_before": 20, - "points_after": 20, - "delta": 0, - "occurred_at": "2026-02-19T15:55:56.410231+00:00", - "metadata": { - "reward_name": "test", - "reward_cost": 3 - } - }, - "120": { - "id": "e066f072-d36f-44cb-b587-4bb070c96ebf", - "created_at": 1771516559.9880385, - "updated_at": 1771516559.9880385, - "user_id": "6da06108-0db8-46be-b4cb-60ce7b54564d", - "child_id": "040e59f9-e019-49f1-9ef6-37829bb5e018", - "entity_type": "reward", - "entity_id": "b79882bc-09ac-4174-8d30-43840c8e59d1", - "action": "cancelled", - "points_before": 20, - "points_after": 20, - "delta": 0, - "occurred_at": "2026-02-19T15:55:59.988038+00:00", - "metadata": { - "reward_name": "test", - "reward_cost": 3 - } - }, - "121": { - "id": "21bddcf4-dfdd-40f9-900b-580c3fc1dade", - "created_at": 1771516678.929796, - "updated_at": 1771516678.929796, - "user_id": "6da06108-0db8-46be-b4cb-60ce7b54564d", - "child_id": "040e59f9-e019-49f1-9ef6-37829bb5e018", - "entity_type": "reward", - "entity_id": "b79882bc-09ac-4174-8d30-43840c8e59d1", - "action": "requested", - "points_before": 20, - "points_after": 20, - "delta": 0, - "occurred_at": "2026-02-19T15:57:58.929796+00:00", - "metadata": { - "reward_name": "test", - "reward_cost": 3 - } - }, - "122": { - "id": "b28f0bfd-e48e-4f08-b47f-eb1b8c666856", - "created_at": 1771516682.7285793, - "updated_at": 1771516682.7285793, - "user_id": "6da06108-0db8-46be-b4cb-60ce7b54564d", - "child_id": "040e59f9-e019-49f1-9ef6-37829bb5e018", - "entity_type": "reward", - "entity_id": "b79882bc-09ac-4174-8d30-43840c8e59d1", - "action": "cancelled", - "points_before": 20, - "points_after": 20, - "delta": 0, - "occurred_at": "2026-02-19T15:58:02.728579+00:00", - "metadata": { - "reward_name": "test", - "reward_cost": 3 - } - }, - "123": { - "id": "dafa2072-09ab-4322-9243-7f5e874897dd", - "created_at": 1771516686.1288366, - "updated_at": 1771516686.1288366, - "user_id": "6da06108-0db8-46be-b4cb-60ce7b54564d", - "child_id": "040e59f9-e019-49f1-9ef6-37829bb5e018", - "entity_type": "reward", - "entity_id": "b79882bc-09ac-4174-8d30-43840c8e59d1", - "action": "requested", - "points_before": 20, - "points_after": 20, - "delta": 0, - "occurred_at": "2026-02-19T15:58:06.128836+00:00", - "metadata": { - "reward_name": "test", - "reward_cost": 3 - } - }, - "124": { - "id": "d8654444-1dcb-463b-a933-1dcb29998c73", - "created_at": 1771516689.6522863, - "updated_at": 1771516689.6522863, - "user_id": "6da06108-0db8-46be-b4cb-60ce7b54564d", - "child_id": "040e59f9-e019-49f1-9ef6-37829bb5e018", - "entity_type": "reward", - "entity_id": "b79882bc-09ac-4174-8d30-43840c8e59d1", - "action": "cancelled", - "points_before": 20, - "points_after": 20, - "delta": 0, - "occurred_at": "2026-02-19T15:58:09.652286+00:00", - "metadata": { - "reward_name": "test", - "reward_cost": 3 - } - }, - "125": { - "id": "4716d1e3-cf65-4690-a5a3-dd8e0f9709ee", - "created_at": 1772217365.3814855, - "updated_at": 1772217365.3814855, - "user_id": "6da06108-0db8-46be-b4cb-60ce7b54564d", - "child_id": "040e59f9-e019-49f1-9ef6-37829bb5e018", - "entity_type": "task", - "entity_id": "70316500-e4ce-4399-8e4b-86a4046fafcb", - "action": "activated", - "points_before": 20, - "points_after": 45, - "delta": 25, - "occurred_at": "2026-02-27T18:36:05.381485+00:00", - "metadata": { - "task_name": "Make your bed", - "is_good": true, - "default_points": 25 - } - }, - "126": { - "id": "3dd4b1d0-e2cb-4f67-901b-ba1977289fca", - "created_at": 1772217368.0669053, - "updated_at": 1772217368.0669053, - "user_id": "6da06108-0db8-46be-b4cb-60ce7b54564d", - "child_id": "040e59f9-e019-49f1-9ef6-37829bb5e018", - "entity_type": "penalty", - "entity_id": "8be18d9a-48e6-402b-a0ba-630a2d50e325", - "action": "activated", - "points_before": 45, - "points_after": 40, - "delta": -5, - "occurred_at": "2026-02-27T18:36:08.066905+00:00", - "metadata": { - "task_name": "Not flushing toilet", - "is_good": false, - "default_points": 5 - } - }, - "127": { - "id": "496e8b77-94ea-4376-80f8-0309a172c095", - "created_at": 1772217371.77779, - "updated_at": 1772217371.77779, - "user_id": "6da06108-0db8-46be-b4cb-60ce7b54564d", - "child_id": "040e59f9-e019-49f1-9ef6-37829bb5e018", - "entity_type": "penalty", - "entity_id": "8be18d9a-48e6-402b-a0ba-630a2d50e325", - "action": "activated", - "points_before": 40, - "points_after": 35, - "delta": -5, - "occurred_at": "2026-02-27T18:36:11.777789+00:00", - "metadata": { - "task_name": "Not flushing toilet", - "is_good": false, - "default_points": 5 - } - }, - "128": { - "id": "db9ad738-24ae-4092-bece-7d3e5d901a22", - "created_at": 1772251930.9958174, - "updated_at": 1772251930.9958174, - "user_id": "6da06108-0db8-46be-b4cb-60ce7b54564d", - "child_id": "040e59f9-e019-49f1-9ef6-37829bb5e018", - "entity_type": "kindness", - "entity_id": "65e79bbd-6cdf-4636-9e9d-f608206dbd80", - "action": "activated", - "points_before": 35, - "points_after": 40, - "delta": 5, - "occurred_at": "2026-02-28T04:12:10.995817+00:00", - "metadata": { - "task_name": "Be Cool \ud83d\ude0e", - "task_type": "kindness", - "default_points": 5 - } - }, - "129": { - "id": "c8c060ff-0639-47ec-9f85-1db4f0b78bc0", - "created_at": 1772251933.5963702, - "updated_at": 1772251933.5963702, - "user_id": "6da06108-0db8-46be-b4cb-60ce7b54564d", - "child_id": "040e59f9-e019-49f1-9ef6-37829bb5e018", - "entity_type": "kindness", - "entity_id": "65e79bbd-6cdf-4636-9e9d-f608206dbd80", - "action": "activated", - "points_before": 40, - "points_after": 45, - "delta": 5, - "occurred_at": "2026-02-28T04:12:13.596370+00:00", - "metadata": { - "task_name": "Be Cool \ud83d\ude0e", - "task_type": "kindness", - "default_points": 5 - } - }, - "130": { - "id": "8c4a87d5-9c80-4e72-bc46-d3d7d8bdefd2", - "created_at": 1772251937.3509393, - "updated_at": 1772251937.3509393, - "user_id": "6da06108-0db8-46be-b4cb-60ce7b54564d", - "child_id": "040e59f9-e019-49f1-9ef6-37829bb5e018", - "entity_type": "penalty", - "entity_id": "8be18d9a-48e6-402b-a0ba-630a2d50e325", - "action": "activated", - "points_before": 45, - "points_after": 40, - "delta": -5, - "occurred_at": "2026-02-28T04:12:17.350939+00:00", - "metadata": { - "task_name": "Not flushing toilet", - "task_type": "penalty", - "default_points": 5 - } - }, - "131": { - "id": "e6a917c4-83af-40ca-be92-3d58eb1b6cb7", - "created_at": 1772251992.0992663, - "updated_at": 1772251992.0992663, - "user_id": "6da06108-0db8-46be-b4cb-60ce7b54564d", - "child_id": "040e59f9-e019-49f1-9ef6-37829bb5e018", - "entity_type": "chore", - "entity_id": "70316500-e4ce-4399-8e4b-86a4046fafcb", - "action": "confirmed", - "points_before": 40, - "points_after": 40, - "delta": 0, - "occurred_at": "2026-02-28T04:13:12.099266+00:00", - "metadata": { - "task_name": "Make your bed", - "task_type": "chore" - } - }, - "132": { - "id": "564a6354-0e96-479d-8c85-b5efd2af7f2d", - "created_at": 1772252001.408349, - "updated_at": 1772252001.408349, - "user_id": "6da06108-0db8-46be-b4cb-60ce7b54564d", - "child_id": "040e59f9-e019-49f1-9ef6-37829bb5e018", - "entity_type": "chore", - "entity_id": "70316500-e4ce-4399-8e4b-86a4046fafcb", - "action": "cancelled", - "points_before": 40, - "points_after": 40, - "delta": 0, - "occurred_at": "2026-02-28T04:13:21.408348+00:00", - "metadata": { - "task_name": "Make your bed" - } - }, - "133": { - "id": "0dfb6e33-2c12-4aea-ad66-e89e82afe572", - "created_at": 1772252003.5179667, - "updated_at": 1772252003.5179667, - "user_id": "6da06108-0db8-46be-b4cb-60ce7b54564d", - "child_id": "040e59f9-e019-49f1-9ef6-37829bb5e018", - "entity_type": "chore", - "entity_id": "70316500-e4ce-4399-8e4b-86a4046fafcb", - "action": "confirmed", - "points_before": 40, - "points_after": 40, - "delta": 0, - "occurred_at": "2026-02-28T04:13:23.517966+00:00", - "metadata": { - "task_name": "Make your bed", - "task_type": "chore" - } - }, - "134": { - "id": "71ec1266-785a-4644-9831-7e239a881d26", - "created_at": 1772252027.6866477, - "updated_at": 1772252027.6866477, - "user_id": "6da06108-0db8-46be-b4cb-60ce7b54564d", - "child_id": "040e59f9-e019-49f1-9ef6-37829bb5e018", - "entity_type": "chore", - "entity_id": "70316500-e4ce-4399-8e4b-86a4046fafcb", - "action": "approved", - "points_before": 40, - "points_after": 65, - "delta": 25, - "occurred_at": "2026-02-28T04:13:47.686647+00:00", - "metadata": { - "task_name": "Make your bed", - "task_type": "chore", - "default_points": 25 - } - }, - "135": { - "id": "544c05ba-ac12-48d0-866a-68d0f5f71af6", - "created_at": 1772252092.0160515, - "updated_at": 1772252092.0160515, - "user_id": "6da06108-0db8-46be-b4cb-60ce7b54564d", - "child_id": "040e59f9-e019-49f1-9ef6-37829bb5e018", - "entity_type": "chore", - "entity_id": "70316500-e4ce-4399-8e4b-86a4046fafcb", - "action": "reset", - "points_before": 65, - "points_after": 65, - "delta": 0, - "occurred_at": "2026-02-28T04:14:52.016051+00:00", - "metadata": { - "task_name": "Make your bed" - } - }, - "136": { - "id": "1f8f922f-71ae-432f-a04a-9b1bc236375b", - "created_at": 1772252099.2162547, - "updated_at": 1772252099.2162547, - "user_id": "6da06108-0db8-46be-b4cb-60ce7b54564d", - "child_id": "040e59f9-e019-49f1-9ef6-37829bb5e018", - "entity_type": "chore", - "entity_id": "70316500-e4ce-4399-8e4b-86a4046fafcb", - "action": "confirmed", - "points_before": 65, - "points_after": 65, - "delta": 0, - "occurred_at": "2026-02-28T04:14:59.216254+00:00", - "metadata": { - "task_name": "Make your bed", - "task_type": "chore" - } - }, - "137": { - "id": "e0dc497d-ae09-40c7-a97e-b1577fcd2d6e", - "created_at": 1772252106.8427596, - "updated_at": 1772252106.8427596, - "user_id": "6da06108-0db8-46be-b4cb-60ce7b54564d", - "child_id": "040e59f9-e019-49f1-9ef6-37829bb5e018", - "entity_type": "chore", - "entity_id": "70316500-e4ce-4399-8e4b-86a4046fafcb", - "action": "approved", - "points_before": 65, - "points_after": 90, - "delta": 25, - "occurred_at": "2026-02-28T04:15:06.842759+00:00", - "metadata": { - "task_name": "Make your bed", - "task_type": "chore", - "default_points": 25 - } - } - } -} \ No newline at end of file diff --git a/frontend/vue-app/e2e/.auth/user-cc.json b/frontend/vue-app/e2e/.auth/user-cc.json index e70c63c..250aa51 100644 --- a/frontend/vue-app/e2e/.auth/user-cc.json +++ b/frontend/vue-app/e2e/.auth/user-cc.json @@ -2,23 +2,23 @@ "cookies": [ { "name": "refresh_token", - "value": "oQxjeMmAW3v4aoI_hBdjpMXThVDzKZTG_6bQGPJBokc", + "value": "pjakYk7dm_bGf-VXaBpRXFNNq08FH0csnh3nBhCqWGw", "domain": "localhost", "path": "/api/auth", - "expires": 1782271329.747941, + "expires": 1783633314.818346, "httpOnly": true, "secure": true, "sameSite": "Strict" }, { "name": "access_token", - "value": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJlbWFpbCI6ImUyZS1jY0B0ZXN0LmNvbSIsInVzZXJfaWQiOiIyYjQ1MmRiNi1lYTRmLTQyMDItODIzYi0zNjllN2E3YTQ5MjYiLCJ0b2tlbl92ZXJzaW9uIjowLCJleHAiOjE3NzQ0OTYyMjl9.docokOZYHgPtNNqirbfLSRABQHHsmTj-9_txuR8NHOM", + "value": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJlbWFpbCI6ImUyZS1jY0B0ZXN0LmNvbSIsInVzZXJfaWQiOiI3NWQ3NGU4OC1jMjY0LTQ3MGMtOThiNC02ZTQ0YTBkYzkyOTMiLCJ0b2tlbl92ZXJzaW9uIjowLCJleHAiOjE3NzU4NTgyMTR9.lXWnj-O3MszrJ_GIwp6ViN0W5-5XEpSDVlAQIQSll-Q", "domain": "localhost", "path": "/", - "expires": -1, + "expires": 1775858214.818293, "httpOnly": true, "secure": true, - "sameSite": "Strict" + "sameSite": "Lax" } ], "origins": [ @@ -27,11 +27,11 @@ "localStorage": [ { "name": "authSyncEvent", - "value": "{\"type\":\"logout\",\"at\":1774495329388}" + "value": "{\"type\":\"logout\",\"at\":1775857314645}" }, { "name": "parentAuth", - "value": "{\"expiresAt\":1774668130069}" + "value": "{\"expiresAt\":1776030114975}" } ] } diff --git a/frontend/vue-app/e2e/.auth/user-delete.json b/frontend/vue-app/e2e/.auth/user-delete.json index 8848650..ad05edd 100644 --- a/frontend/vue-app/e2e/.auth/user-delete.json +++ b/frontend/vue-app/e2e/.auth/user-delete.json @@ -2,23 +2,23 @@ "cookies": [ { "name": "refresh_token", - "value": "PcQvgm3e7SXL3CHGNXYGXhRrU7erXomAQDbOzVAUrCQ", + "value": "sTFHvjZ5hJxJrlNHoxdWkNJ6vxdDzrZwTRFz55JxWKs", "domain": "localhost", "path": "/api/auth", - "expires": 1782271328.966396, + "expires": 1783633314.820088, "httpOnly": true, "secure": true, "sameSite": "Strict" }, { "name": "access_token", - "value": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJlbWFpbCI6ImUyZS1kZWxldGVAdGVzdC5jb20iLCJ1c2VyX2lkIjoiOWM4ODk0MWUtMjhiMy00YzFmLWJhNDctMDNkMTU0MTc2ODA5IiwidG9rZW5fdmVyc2lvbiI6MCwiZXhwIjoxNzc0NDk2MjI4fQ.xxzCNQEX6y07hFJzEdumbYbhm_52VWM90tHsTPDfSKs", + "value": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJlbWFpbCI6ImUyZS1kZWxldGVAdGVzdC5jb20iLCJ1c2VyX2lkIjoiY2U4MmI2MzMtMDUwMy00MmMxLWFlNjMtZmEzNzcxMmMxODZiIiwidG9rZW5fdmVyc2lvbiI6MCwiZXhwIjoxNzc1ODU4MjE0fQ.meuVUYIk9NFuo66KDhLPZHoXgHRLWmRDGyR23doTLIw", "domain": "localhost", "path": "/", - "expires": -1, + "expires": 1775858214.820046, "httpOnly": true, "secure": true, - "sameSite": "Strict" + "sameSite": "Lax" } ], "origins": [ @@ -27,11 +27,11 @@ "localStorage": [ { "name": "authSyncEvent", - "value": "{\"type\":\"logout\",\"at\":1774495328432}" + "value": "{\"type\":\"logout\",\"at\":1775857314657}" }, { "name": "parentAuth", - "value": "{\"expiresAt\":1774668129476}" + "value": "{\"expiresAt\":1776030114992}" } ] } diff --git a/frontend/vue-app/e2e/.auth/user.json b/frontend/vue-app/e2e/.auth/user.json index 4d8f132..7517cfe 100644 --- a/frontend/vue-app/e2e/.auth/user.json +++ b/frontend/vue-app/e2e/.auth/user.json @@ -2,23 +2,23 @@ "cookies": [ { "name": "refresh_token", - "value": "K9dRbu3607bZL23pmoMCD8qGM697tnpfY-dYVJ7qXPU", + "value": "nbOCYWuMXIGNyjN2uc6uohUFqkl-Bv1d01YjAOirGi8", "domain": "localhost", "path": "/api/auth", - "expires": 1782271324.066253, + "expires": 1783633312.982067, "httpOnly": true, "secure": true, "sameSite": "Strict" }, { "name": "access_token", - "value": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJlbWFpbCI6ImUyZUB0ZXN0LmNvbSIsInVzZXJfaWQiOiJiMGFhNDczMC05ZDI4LTQ3NzQtODE3NC1kZTZmZWJkMjZjMmIiLCJ0b2tlbl92ZXJzaW9uIjowLCJleHAiOjE3NzQ0OTYyMjR9.3RoSBnOU30YFn61lbfKo_ZMF2LQcsKb7qO31CK4AOl8", + "value": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJlbWFpbCI6ImUyZUB0ZXN0LmNvbSIsInVzZXJfaWQiOiJlNjM1MjRiOS03NmIzLTRiMmQtODc1Ni05ZmNkNTk0MDRhYTkiLCJ0b2tlbl92ZXJzaW9uIjowLCJleHAiOjE3NzU4NTgyMTJ9.ztnqGJFbFDSze0GvK-2G37v5HaDdWRK392T7vsUpnhw", "domain": "localhost", "path": "/", - "expires": -1, + "expires": 1775858212.982022, "httpOnly": true, "secure": true, - "sameSite": "Strict" + "sameSite": "Lax" } ], "origins": [ @@ -27,11 +27,11 @@ "localStorage": [ { "name": "authSyncEvent", - "value": "{\"type\":\"logout\",\"at\":1774495323817}" + "value": "{\"type\":\"logout\",\"at\":1775857312837}" }, { "name": "parentAuth", - "value": "{\"expiresAt\":1774668124255}" + "value": "{\"expiresAt\":1776030113109}" } ] } diff --git a/frontend/vue-app/public/children.png b/frontend/vue-app/public/children.png new file mode 100644 index 0000000..fddd3a3 Binary files /dev/null and b/frontend/vue-app/public/children.png differ diff --git a/frontend/vue-app/public/chores.png b/frontend/vue-app/public/chores.png new file mode 100644 index 0000000..f4939a6 Binary files /dev/null and b/frontend/vue-app/public/chores.png differ diff --git a/frontend/vue-app/public/notifications.png b/frontend/vue-app/public/notifications.png new file mode 100644 index 0000000..314dcab Binary files /dev/null and b/frontend/vue-app/public/notifications.png differ diff --git a/frontend/vue-app/public/rewards.png b/frontend/vue-app/public/rewards.png new file mode 100644 index 0000000..6c5e77a Binary files /dev/null and b/frontend/vue-app/public/rewards.png differ diff --git a/frontend/vue-app/src/router/__tests__/authGuard.spec.ts b/frontend/vue-app/src/router/__tests__/authGuard.spec.ts index eab508f..1784d45 100644 --- a/frontend/vue-app/src/router/__tests__/authGuard.spec.ts +++ b/frontend/vue-app/src/router/__tests__/authGuard.spec.ts @@ -12,7 +12,6 @@ vi.mock('@/stores/auth', () => ({ isAuthReady: isAuthReadyMock, isUserLoggedIn: isUserLoggedInMock, isParentAuthenticated: isParentAuthenticatedMock, - logoutParent: vi.fn(), enforceParentExpiry: vi.fn(), })) diff --git a/frontend/vue-app/src/router/index.ts b/frontend/vue-app/src/router/index.ts index 6a57674..1fbbbd8 100644 --- a/frontend/vue-app/src/router/index.ts +++ b/frontend/vue-app/src/router/index.ts @@ -28,7 +28,6 @@ import { isUserLoggedIn, isParentAuthenticated, isAuthReady, - logoutParent, enforceParentExpiry, } from '../stores/auth' import ParentPinSetup from '@/components/auth/ParentPinSetup.vue' @@ -304,8 +303,6 @@ router.beforeEach(async (to, from, next) => { if (isParentAuthenticated.value) { return next('/parent') } else { - // Ensure parent auth is fully cleared when redirecting away from /parent - logoutParent() return next('/child') } }) diff --git a/frontend/vue-app/src/stores/auth.ts b/frontend/vue-app/src/stores/auth.ts index a0031a0..a4e4c63 100644 --- a/frontend/vue-app/src/stores/auth.ts +++ b/frontend/vue-app/src/stores/auth.ts @@ -12,6 +12,31 @@ export const isParentAuthenticated = ref(false) export const isParentPersistent = ref(false) export const parentAuthExpiresAt = ref(null) +// --- Background expiry watcher --- +// Declared before the init block so startParentExpiryWatcher is safe to call during restore. +let expiryWatcherIntervalId: ReturnType | null = null + +function runExpiryCheck() { + if (parentAuthExpiresAt.value !== null && Date.now() >= parentAuthExpiresAt.value) { + applyParentLoggedOutState() + if (typeof window !== 'undefined') { + window.location.href = '/child' + } + } +} + +export function startParentExpiryWatcher() { + stopParentExpiryWatcher() + expiryWatcherIntervalId = setInterval(runExpiryCheck, 15_000) +} + +export function stopParentExpiryWatcher() { + if (expiryWatcherIntervalId !== null) { + clearInterval(expiryWatcherIntervalId) + expiryWatcherIntervalId = null + } +} + // Restore persistent parent auth from localStorage on store init if (hasLocalStorage) { try { @@ -38,30 +63,6 @@ export const currentUserId = ref('') export const suppressForceLogout = ref(false) let authSyncInitialized = false -// --- Background expiry watcher --- -let expiryWatcherIntervalId: ReturnType | null = null - -function runExpiryCheck() { - if (parentAuthExpiresAt.value !== null && Date.now() >= parentAuthExpiresAt.value) { - applyParentLoggedOutState() - if (typeof window !== 'undefined') { - window.location.href = '/child' - } - } -} - -export function startParentExpiryWatcher() { - stopParentExpiryWatcher() - expiryWatcherIntervalId = setInterval(runExpiryCheck, 15_000) -} - -export function stopParentExpiryWatcher() { - if (expiryWatcherIntervalId !== null) { - clearInterval(expiryWatcherIntervalId) - expiryWatcherIntervalId = null - } -} - /** * Explicitly checks whether parent auth has expired and clears it if so. * Called by the router guard before allowing /parent routes. @@ -163,10 +164,12 @@ export async function checkAuth() { currentUserId.value = data.id isUserLoggedIn.value = true } else { - logoutUser() + isUserLoggedIn.value = false + currentUserId.value = '' } } catch { - logoutUser() + isUserLoggedIn.value = false + currentUserId.value = '' } isAuthReady.value = true }