chore: update init scripts, dev script, and remove stale HAR file

Ultraworked with [Sisyphus](https://github.com/code-yeongyu/oh-my-openagent)

Co-authored-by: Sisyphus <clio-agent@sisyphuslabs.ai>
This commit is contained in:
2026-05-28 16:34:13 +01:00
co-authored by Sisyphus
parent 91d20d474b
commit d23ed1831a
3 changed files with 124 additions and 186 deletions
+99
View File
@@ -1385,6 +1385,105 @@ CREATE TABLE square_deposits (
CREATE INDEX idx_square_deposits_deposited ON square_deposits(deposited_at); CREATE INDEX idx_square_deposits_deposited ON square_deposits(deposited_at);
-- =======================================
-- CARDDAV / CALDAV TABLES (used by SabreDAV sync in Go backend)
-- =======================================
CREATE TABLE IF NOT EXISTS dav_principals (
id SERIAL PRIMARY KEY,
uri VARCHAR(255) NOT NULL UNIQUE,
email VARCHAR(255),
displayname VARCHAR(255)
);
CREATE TABLE IF NOT EXISTS dav_calendars (
id SERIAL PRIMARY KEY,
principaluri VARCHAR(255) NOT NULL,
displayname VARCHAR(255),
uri VARCHAR(255) NOT NULL,
description TEXT,
calendarorder INT DEFAULT 0,
calendarcolor VARCHAR(10),
timezone TEXT,
components VARCHAR(255),
transparent BOOLEAN DEFAULT FALSE,
UNIQUE(principaluri, uri)
);
CREATE TABLE IF NOT EXISTS dav_calendarobjects (
id SERIAL PRIMARY KEY,
calendardata TEXT,
uri VARCHAR(255) NOT NULL,
calendarid INTEGER NOT NULL REFERENCES dav_calendars(id) ON DELETE CASCADE,
lastmodified INTEGER,
etag VARCHAR(32),
size INTEGER,
componenttype VARCHAR(8),
firstoccurence INTEGER,
lastoccurence INTEGER,
uid VARCHAR(255),
UNIQUE(calendarid, uri)
);
CREATE TABLE IF NOT EXISTS dav_addressbooks (
id SERIAL PRIMARY KEY,
principaluri VARCHAR(255) NOT NULL,
displayname VARCHAR(255),
uri VARCHAR(255) NOT NULL,
description TEXT,
synctoken INTEGER DEFAULT 1,
UNIQUE(principaluri, uri)
);
CREATE TABLE IF NOT EXISTS dav_cards (
id SERIAL PRIMARY KEY,
addressbookid INTEGER NOT NULL REFERENCES dav_addressbooks(id) ON DELETE CASCADE,
carddata TEXT,
uri VARCHAR(255) NOT NULL,
lastmodified INTEGER,
etag VARCHAR(32),
size INTEGER,
UNIQUE(addressbookid, uri)
);
CREATE TABLE IF NOT EXISTS dav_addressbookchanges (
id SERIAL PRIMARY KEY,
uri VARCHAR(255) NOT NULL,
synctoken INTEGER NOT NULL,
addressbookid INTEGER NOT NULL REFERENCES dav_addressbooks(id) ON DELETE CASCADE,
operation SMALLINT NOT NULL
);
CREATE TABLE IF NOT EXISTS dav_calendarchanges (
id SERIAL PRIMARY KEY,
uri VARCHAR(255) NOT NULL,
synctoken INTEGER NOT NULL,
calendarid INTEGER NOT NULL REFERENCES dav_calendars(id) ON DELETE CASCADE,
operation SMALLINT NOT NULL
);
CREATE TABLE IF NOT EXISTS dav_users (
id SERIAL PRIMARY KEY,
username VARCHAR(255) NOT NULL UNIQUE,
digesta1 VARCHAR(32) NOT NULL
);
CREATE INDEX IF NOT EXISTS idx_calendarobjects_calendarid ON dav_calendarobjects(calendarid);
CREATE INDEX IF NOT EXISTS idx_cards_addressbookid ON dav_cards(addressbookid);
-- Seed default principal, addressbook, and calendar for CardDAV/CalDAV sync
INSERT INTO dav_principals (uri, email, displayname)
SELECT 'principals/default', 'admin@example.com', 'Default User'
WHERE NOT EXISTS (SELECT 1 FROM dav_principals WHERE uri = 'principals/default');
INSERT INTO dav_addressbooks (principaluri, displayname, uri, description, synctoken)
SELECT 'principals/default', 'Contacts', 'default', 'Default address book', 1
WHERE NOT EXISTS (SELECT 1 FROM dav_addressbooks WHERE uri = 'default');
INSERT INTO dav_calendars (principaluri, displayname, uri, description, components, transparent)
SELECT 'principals/default', 'Default Calendar', 'default', 'Default calendar', 'VEVENT,VTODO', false
WHERE NOT EXISTS (SELECT 1 FROM dav_calendars WHERE uri = 'default');
-- ======================================= -- =======================================
-- FUNCTION USAGE SUMMARY -- FUNCTION USAGE SUMMARY
-- ======================================= -- =======================================
+24 -9
View File
@@ -398,14 +398,15 @@ get_svc() { echo "${SERVICE_IDS[$1]}"; }
# =========================================================================== # ===========================================================================
echo -e "\n${C_BLUE}🧪 Creating Patch Tests...${C_RESET}" echo -e "\n${C_BLUE}🧪 Creating Patch Tests...${C_RESET}"
# Gel Allergy Test covers: Gel Polish Full Set (idx 6), Luxury Gel Manicure (idx 7) # Gel Allergy Test covers: Gel Manicure BIAB (idx 1), Gel Polish Full Set (idx 6), Luxury Gel Manicure (idx 7)
GEL_SVC_1="${SERVICE_IDS[6]}" GEL_SVC_1="${SERVICE_IDS[1]}"
GEL_SVC_2="${SERVICE_IDS[7]}" GEL_SVC_6="${SERVICE_IDS[6]}"
GEL_SVC_7="${SERVICE_IDS[7]}"
# Insert patch test directly via SQL (no creation API endpoint exists) # Insert patch test directly via SQL (no creation API endpoint exists)
# service_ids cast explicitly to uuid[] to handle typed columns # service_ids cast explicitly to uuid[] to handle typed columns
PATCH_TEST_RESULT=$(docker exec postgres psql -U myuser -d mydb -tAc \ PATCH_TEST_RESULT=$(docker exec postgres psql -U myuser -d mydb -tAc \
"INSERT INTO patch_tests (name, description, notice_duration_hours, expiry_months, service_ids) VALUES ('Gel Allergy Test', 'Mandatory patch test for all gel polish services. Must be completed at least 24 hours before your first gel appointment.', 24, 6, ARRAY['${GEL_SVC_1}','${GEL_SVC_2}']) RETURNING id;" 2>&1) "INSERT INTO patch_tests (name, description, notice_duration_hours, expiry_months, service_ids) VALUES ('Gel Allergy Test', 'Mandatory patch test for all gel polish services. Must be completed at least 24 hours before your first gel appointment.', 24, 6, ARRAY['${GEL_SVC_1}','${GEL_SVC_6}','${GEL_SVC_7}']) RETURNING id;" 2>&1)
PATCH_TEST_ID=$(echo "$PATCH_TEST_RESULT" | head -1 | tr -d '\r\t ') PATCH_TEST_ID=$(echo "$PATCH_TEST_RESULT" | head -1 | tr -d '\r\t ')
# Validate it looks like a UUID; print raw output if not to help diagnose # Validate it looks like a UUID; print raw output if not to help diagnose
@@ -414,12 +415,26 @@ if [[ -z "$PATCH_TEST_ID" || ! "$PATCH_TEST_ID" =~ ^[0-9a-f-]{8,}$ ]]; then
PATCH_TEST_ID="" PATCH_TEST_ID=""
fi fi
# Record that Grace has already completed her patch test via the API # Record patch tests for ALL users who book gel services so no booking gets 400'd
if [[ -n "$PATCH_TEST_ID" && -n "$GRACE_ID" ]]; then PATCH_TEST_USERS=(
api_post "$BASE_URL/admin/users/$GRACE_ID/patch-tests" \ "$GRACE_ID:Grace Fletcher" # Luxury Gel Manicure / Gel Full Set
"$EMMA_ID:Emma Johnson" # Gel Manicure (BIAB) — regular gel client
"$ISLA_ID:Isla Davies" # Gel Manicure (BIAB) + Nail Art
"$LILY_ID:Lily Wilson" # Gel Manicure (BIAB) + Nail Art
)
patch_recorded=0
if [[ -n "$PATCH_TEST_ID" ]]; then
for entry in "${PATCH_TEST_USERS[@]}"; do
uid="${entry%%:*}"
name="${entry#*:}"
if [[ -n "$uid" ]]; then
api_post "$BASE_URL/admin/users/$uid/patch-tests" \
"{\"patch_test_id\":\"$PATCH_TEST_ID\"}" \ "{\"patch_test_id\":\"$PATCH_TEST_ID\"}" \
"Record patch test for Grace" "$ADMIN_TOKEN" > /dev/null "Record patch test for $name" "$ADMIN_TOKEN" > /dev/null \
echo "${C_GREEN}✅ Patch test seeded (SQL) and recorded for Grace Fletcher${C_RESET}" && patch_recorded=$((patch_recorded + 1))
fi
done
echo "${C_GREEN}✅ Patch test seeded (SQL) and recorded for $patch_recorded users${C_RESET}"
else else
echo "${C_YELLOW}⚠️ Patch test seeding failed (check DB connection or patch_tests table)${C_RESET}" echo "${C_YELLOW}⚠️ Patch test seeding failed (check DB connection or patch_tests table)${C_RESET}"
fi fi
-176
View File
@@ -1,176 +0,0 @@
{
"log": {
"version": "1.2",
"creator": {
"name": "Zen",
"version": "1.19.12b"
},
"browser": {
"name": "Zen",
"version": "1.19.12b"
},
"pages": [
{
"id": "page_1",
"pageTimings": {
"onContentLoad": -82849,
"onLoad": -82148
},
"startedDateTime": "2026-05-17T17:55:39.809+01:00",
"title": "http://192.168.1.135:5173/book"
}
],
"entries": [
{
"startedDateTime": "2026-05-17T17:55:39.809+01:00",
"request": {
"bodySize": 87,
"method": "POST",
"url": "http://192.168.1.135:5173/api/bookings/reserve",
"httpVersion": "HTTP/1.1",
"headers": [
{
"name": "Host",
"value": "192.168.1.135:5173"
},
{
"name": "User-Agent",
"value": "Mozilla/5.0 (X11; Linux x86_64; rv:150.0) Gecko/20100101 Firefox/150.0"
},
{
"name": "Accept",
"value": "*/*"
},
{
"name": "Accept-Language",
"value": "en-US,en;q=0.9"
},
{
"name": "Accept-Encoding",
"value": "gzip, deflate"
},
{
"name": "Referer",
"value": "http://192.168.1.135:5173/book"
},
{
"name": "Content-Type",
"value": "application/json"
},
{
"name": "Content-Length",
"value": "87"
},
{
"name": "Origin",
"value": "http://192.168.1.135:5173"
},
{
"name": "Sec-GPC",
"value": "1"
},
{
"name": "Connection",
"value": "keep-alive"
},
{
"name": "Priority",
"value": "u=4"
},
{
"name": "Pragma",
"value": "no-cache"
},
{
"name": "Cache-Control",
"value": "no-cache"
}
],
"cookies": [],
"queryString": [],
"headersSize": 449,
"postData": {
"mimeType": "application/json",
"params": [],
"text": "{\"start_time\":\"2026-05-21T16:00:00.000Z\",\"service_ids\":[\"cf628115690e\",\"543de40e5079\"]}"
}
},
"response": {
"status": 400,
"statusText": "Bad Request",
"httpVersion": "HTTP/1.1",
"headers": [
{
"name": "Vary",
"value": "Origin"
},
{
"name": "content-length",
"value": "67"
},
{
"name": "content-type",
"value": "text/plain; charset=utf-8"
},
{
"name": "date",
"value": "Sun, 17 May 2026 16:55:39 GMT"
},
{
"name": "referrer-policy",
"value": "strict-origin-when-cross-origin"
},
{
"name": "strict-transport-security",
"value": "max-age=31536000; includeSubDomains"
},
{
"name": "x-content-type-options",
"value": "nosniff"
},
{
"name": "x-frame-options",
"value": "DENY"
},
{
"name": "x-xss-protection",
"value": "1; mode=block"
},
{
"name": "Connection",
"value": "keep-alive"
},
{
"name": "Keep-Alive",
"value": "timeout=5"
}
],
"cookies": [],
"content": {
"mimeType": "text/plain; charset=utf-8",
"size": 67,
"text": "Cannot book this time - services would extend beyond closing hours\n"
},
"redirectURL": "",
"headersSize": 390,
"bodySize": 457
},
"cache": {},
"timings": {
"blocked": -1,
"dns": 0,
"connect": 0,
"ssl": 0,
"send": 0,
"wait": 7,
"receive": 0
},
"time": 7,
"_securityState": "insecure",
"serverIPAddress": "192.168.1.135",
"connection": "5173",
"pageref": "page_1"
}
]
}
}