Refactored frontend directory
Some checks failed
Chore App Build, Test, and Push Docker Images / build-and-push (push) Failing after 2m46s

This commit is contained in:
2026-04-25 00:40:15 -04:00
parent db846f4e31
commit 127378797c
263 changed files with 88 additions and 79 deletions

View File

@@ -1,4 +1,4 @@
# vue-app
# frontend
This template should help get you started developing with Vue 3 in Vite.
@@ -9,7 +9,7 @@ This template should help get you started developing with Vue 3 in Vite.
## Recommended Browser Setup
- Chromium-based browsers (Chrome, Edge, Brave, etc.):
- [Vue.js devtools](https://chromewebstore.google.com/detail/vuejs-devtools/nhdogjmejiglipccpnnnanhbledajbpd)
- [Vue.js devtools](https://chromewebstore.google.com/detail/vuejs-devtools/nhdogjmejiglipccpnnnanhbledajbpd)
- [Turn on Custom Object Formatter in Chrome DevTools](http://bit.ly/object-formatters)
- Firefox:
- [Vue.js devtools](https://addons.mozilla.org/en-US/firefox/addon/vue-js-devtools/)

View File

Before

Width:  |  Height:  |  Size: 156 KiB

After

Width:  |  Height:  |  Size: 156 KiB

View File

Before

Width:  |  Height:  |  Size: 156 KiB

After

Width:  |  Height:  |  Size: 156 KiB

View File

@@ -2,20 +2,20 @@
"cookies": [
{
"name": "refresh_token",
"value": "yQZhoeeYUidDfolHE467zNEWguWXzMIinFT1LNLU5yM",
"value": "oh4sQB_Q1Se4xydZHTIolU6FhvlKPIlDPsxfd_qe4wQ",
"domain": "localhost",
"path": "/api/auth",
"expires": 1784509278.633774,
"expires": 1784867824.852037,
"httpOnly": true,
"secure": true,
"sameSite": "Strict"
},
{
"name": "access_token",
"value": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJlbWFpbCI6ImUyZS1jY0B0ZXN0LmNvbSIsInVzZXJfaWQiOiI4ZmZkYTMyNC01MDE1LTRiYjktODY3Yi1jZjFlNTU1NjBjMzciLCJ0b2tlbl92ZXJzaW9uIjowLCJleHAiOjE3NzY3MzQxNzh9.YvFGLV1bdoRpRb8z5YtO19dpD7vkC0p5XMhGJgSJol8",
"value": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJlbWFpbCI6ImUyZS1jY0B0ZXN0LmNvbSIsInVzZXJfaWQiOiI4NGY1Y2I3NS05NWU1LTRjMTItOTExOS02MzdkYjJlMWY1MGYiLCJ0b2tlbl92ZXJzaW9uIjowLCJleHAiOjE3NzcwOTI3MjR9.7-d4EvJEYtYSi_5ZFiU7tuxgc4ilVMBxhwzgAQZNTvY",
"domain": "localhost",
"path": "/",
"expires": 1776734178.633726,
"expires": 1777092724.851439,
"httpOnly": true,
"secure": true,
"sameSite": "Lax"
@@ -27,11 +27,11 @@
"localStorage": [
{
"name": "authSyncEvent",
"value": "{\"type\":\"logout\",\"at\":1776733278500}"
"value": "{\"type\":\"logout\",\"at\":1777091824594}"
},
{
"name": "parentAuth",
"value": "{\"expiresAt\":1776906078798}"
"value": "{\"expiresAt\":1777264625262}"
}
]
}

View File

@@ -2,20 +2,20 @@
"cookies": [
{
"name": "refresh_token",
"value": "j90QCKu8d9QvNG-k-m31G5PoxU0yBuz-wyx8NPYCOG8",
"value": "lIhurtvmo0oGcimN_8v59h9y3CrglEAloQO1QFw8RsQ",
"domain": "localhost",
"path": "/api/auth",
"expires": 1784509278.541961,
"expires": 1784867824.995155,
"httpOnly": true,
"secure": true,
"sameSite": "Strict"
},
{
"name": "access_token",
"value": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJlbWFpbCI6ImUyZS1kZWxldGVAdGVzdC5jb20iLCJ1c2VyX2lkIjoiNzA3ZGYwYmUtOWQxMy00MGVlLWI3M2QtYzYwZmFmNDg2NmU2IiwidG9rZW5fdmVyc2lvbiI6MCwiZXhwIjoxNzc2NzM0MTc4fQ.cEKtxo4zVTd7kBZzfjjI_uxqez32gUxmZYuUa8-RYdc",
"value": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJlbWFpbCI6ImUyZS1kZWxldGVAdGVzdC5jb20iLCJ1c2VyX2lkIjoiOWYzYTljNWMtM2IwMy00YTZlLTliNmUtYjE0MTQzZWNhMzNkIiwidG9rZW5fdmVyc2lvbiI6MCwiZXhwIjoxNzc3MDkyNzI0fQ.UB5MCIZ2PHbn3UyohNzmFbOCb3TR-KHxJPWB9qkWwCQ",
"domain": "localhost",
"path": "/",
"expires": 1776734178.541918,
"expires": 1777092724.99406,
"httpOnly": true,
"secure": true,
"sameSite": "Lax"
@@ -27,11 +27,11 @@
"localStorage": [
{
"name": "authSyncEvent",
"value": "{\"type\":\"logout\",\"at\":1776733278395}"
"value": "{\"type\":\"logout\",\"at\":1777091824687}"
},
{
"name": "parentAuth",
"value": "{\"expiresAt\":1776906078675}"
"value": "{\"expiresAt\":1777264625511}"
}
]
}

View File

@@ -2,20 +2,20 @@
"cookies": [
{
"name": "refresh_token",
"value": "RETiHvb_RUs2-0xb-klx8BwvSwr2TMtz1D-NmB5825Y",
"value": "uMExObHukEdFnlszorcDq2XlbRW0AeIV71x_vSovEF4",
"domain": "localhost",
"path": "/api/auth",
"expires": 1784509276.929905,
"expires": 1784867821.107956,
"httpOnly": true,
"secure": true,
"sameSite": "Strict"
},
{
"name": "access_token",
"value": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJlbWFpbCI6ImUyZUB0ZXN0LmNvbSIsInVzZXJfaWQiOiJhNjZmYjdjNy04ZDI5LTRkNjAtYmVjNi0zMmEzODg1MGI1OGIiLCJ0b2tlbl92ZXJzaW9uIjowLCJleHAiOjE3NzY3MzQxNzZ9.WSka-ZbN1ZKbD_Q4UpoP9qfN1i73G51nrx88F2TbbOE",
"value": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJlbWFpbCI6ImUyZUB0ZXN0LmNvbSIsInVzZXJfaWQiOiI2ZWE5YWZmZC1jMGExLTRkMzUtOGJmYS1mZDBkOWY5NzFmOWQiLCJ0b2tlbl92ZXJzaW9uIjowLCJleHAiOjE3NzcwOTI3MjF9.rb64zKqS6uXqkgX_4kke37Rc6om68elt4Qa24Fy9NPo",
"domain": "localhost",
"path": "/",
"expires": 1776734176.929863,
"expires": 1777092721.107403,
"httpOnly": true,
"secure": true,
"sameSite": "Lax"
@@ -27,11 +27,11 @@
"localStorage": [
{
"name": "authSyncEvent",
"value": "{\"type\":\"logout\",\"at\":1776733276784}"
"value": "{\"type\":\"logout\",\"at\":1777091820880}"
},
{
"name": "parentAuth",
"value": "{\"expiresAt\":1776906077058}"
"value": "{\"expiresAt\":1777264621275}"
}
]
}

View File

Before

Width:  |  Height:  |  Size: 409 KiB

After

Width:  |  Height:  |  Size: 409 KiB

View File

@@ -98,8 +98,9 @@ test.describe('Digest Action Token — Approve Chore', () => {
test('Approve-chore action is performed: points awarded and confirmation removed', async ({
request,
}) => {
// Wait for action to complete
await new Promise((r) => setTimeout(r, 300))
// Execute the action via authenticated POST (GET only redirects, POST consumes the token)
const execRes = await request.post(`/api/digest-action/${approveToken}`)
expect(execRes.status()).toBe(200)
const childRes = await request.get(`/api/child/list`)
const children = (await childRes.json()).children ?? []

View File

@@ -93,7 +93,9 @@ test.describe('Digest Action Token — Approve Reward', () => {
// 7.6 Approve-reward action: reward triggered, child points deducted
test('Approve-reward action: reward triggered and child points deducted', async ({ request }) => {
await new Promise((r) => setTimeout(r, 300))
// Execute the action via authenticated POST (GET only redirects, POST consumes the token)
const execRes = await request.post(`/api/digest-action/${approveToken}`)
expect(execRes.status()).toBe(200)
const childRes = await request.get('/api/child/list')
const children = (await childRes.json()).children ?? []

View File

@@ -87,7 +87,9 @@ test.describe('Digest Action Token — Deny Chore', () => {
test('Deny-chore action is performed: confirmation removed, points unchanged', async ({
request,
}) => {
await new Promise((r) => setTimeout(r, 300))
// Execute the action via authenticated POST (GET only redirects, POST consumes the token)
const execRes = await request.post(`/api/digest-action/${denyToken}`)
expect(execRes.status()).toBe(200)
const childRes = await request.get(`/api/child/list`)
const children = (await childRes.json()).children ?? []

View File

@@ -92,7 +92,9 @@ test.describe('Digest Action Token — Deny Reward', () => {
// 7.8 Deny-reward action: pending request removed, points unchanged
test('Deny-reward action: pending request removed and points unchanged', async ({ request }) => {
await new Promise((r) => setTimeout(r, 300))
// Execute the action via authenticated POST (GET only redirects, POST consumes the token)
const execRes = await request.post(`/api/digest-action/${denyToken}`)
expect(execRes.status()).toBe(200)
const childRes = await request.get('/api/child/list')
const children = (await childRes.json()).children ?? []

View File

@@ -94,11 +94,11 @@ test.describe('Digest Action Token — Error Paths', () => {
const unauthCtx = await getUnauthContext(playwright)
// First use — should succeed (302)
const first = await unauthCtx.get(`/api/digest-action/${token}`, { maxRedirects: 0 })
expect(first.status()).toBe(302)
// First use — authenticated POST executes and consumes the token
const first = await request.post(`/api/digest-action/${token}`)
expect(first.status()).toBe(200)
// Second use — token is consumed
// Second use — token is consumed, unauthenticated GET should return 400
const second = await unauthCtx.get(`/api/digest-action/${token}`, { maxRedirects: 0 })
expect(second.status()).toBe(400)
await unauthCtx.dispose()

Some files were not shown because too many files have changed in this diff Show More