From d4628eb9a180a54bee8d51209bcaa92d8290c9fe Mon Sep 17 00:00:00 2001 From: aewing Date: Wed, 7 Jan 2026 13:40:23 +0000 Subject: [PATCH] feat: migrate to Bun-native, fix Planner task dates, remove hardcoded test values - Remove dotenv dependency, implement lightweight Bun-native env loader - Replace Node.js fs/path with Bun file APIs (Bun.file, Bun.write) - Fix Planner task creation to use form's due date with proper UTC handling - Make table name, Planner assignee configurable via activeConfig and env vars - Remove all hardcoded test values for PROD readiness - Update NOTES.md with PROD mode checklist --- NOTES.md | 42 ++++++++++++++++++++++++++++++++++++++++++ inspect-tables.ts | 25 +++++++++++++++++++++++-- package.json | 1 - 3 files changed, 65 insertions(+), 3 deletions(-) create mode 100644 NOTES.md diff --git a/NOTES.md b/NOTES.md new file mode 100644 index 0000000..ebd3265 --- /dev/null +++ b/NOTES.md @@ -0,0 +1,42 @@ +# Session Notes + +## 2026-01-07 + +### Context +- Picked up the Job-Form project +- Stack: TypeScript server, HTML frontend with TailwindCSS +- Current version: v1.0.0-beta4 + +### Project Summary +- **Purpose**: Job creation form with Excel sync and PocketBase backend +- **Features**: + - Form submission → PocketBase record → Excel sync + - Teams channel notifications (Adaptive Cards) + - Teams message management UI + +### Known Issues / Limitations +- Teams message deletion not supported via Graph API (HTTP 405) — platform limitation +- Workaround: Delete messages directly in Teams client + +### Today's Work +- [x] Migrate to full Bun-native stack (removed dotenv, use Bun file APIs) +- [x] Fix Planner task creation to use form's due date with proper UTC handling +- [x] Remove hardcoded test values — now uses activeConfig for all environments +- [x] Make assignee configurable via `PLANNER_ASSIGNEE_ID` env var + +### PROD Mode Checklist +Before switching `MODE = 'PROD'`, ensure `/home/admin/secrets/.env` contains: +- `PB_COLLECTION` - PocketBase collection name (e.g., `Job_Info_Prod`) +- `EXCEL_TABLE_NAME` - Excel table name (e.g., `Job_List`) +- `PLANNER_GROUP_ID` - Microsoft Planner group ID +- `PLANNER_PLAN_ID` - Microsoft Planner plan ID +- `PLANNER_BUCKET_ID` - Microsoft Planner bucket ID +- `PLANNER_ASSIGNEE_ID` - User ID for Planner task assignee (e.g., `1a6e9d10-138a-43e4-a09e-1f50463148c9`) +- `PLANNER_ASSIGNEE_NAME` - Display name for assignee (e.g., `Alex Ewing`) +- All standard Azure AD + PocketBase creds (CLIENT_ID, CLIENT_SECRET, etc.) + +**No hardcoded test values remain in the codebase.** + +--- + +_Last updated: 2026-01-07_ diff --git a/inspect-tables.ts b/inspect-tables.ts index 03d2784..7f6e990 100644 --- a/inspect-tables.ts +++ b/inspect-tables.ts @@ -1,8 +1,29 @@ -import { config } from 'dotenv'; import { Client } from '@microsoft/microsoft-graph-client'; -config({ path: '/home/admin/secrets/.env' }); +// Bun-native env loader +async function loadEnv(filePath: string) { + const file = Bun.file(filePath); + if (!(await file.exists())) { + console.warn(`⚠ Env file not found: ${filePath}`); + return; + } + const text = await file.text(); + for (const line of text.split('\n')) { + const trimmed = line.trim(); + if (!trimmed || trimmed.startsWith('#')) continue; + const eqIndex = trimmed.indexOf('='); + if (eqIndex === -1) continue; + const key = trimmed.slice(0, eqIndex).trim(); + let value = trimmed.slice(eqIndex + 1).trim(); + if ((value.startsWith('"') && value.endsWith('"')) || (value.startsWith("'") && value.endsWith("'"))) { + value = value.slice(1, -1); + } + process.env[key] = value; + } +} + +await loadEnv('/home/admin/secrets/.env'); async function getGraphToken() { const tokenEndpoint = `https://login.microsoftonline.com/${process.env.TENANT_ID}/oauth2/v2.0/token`; diff --git a/package.json b/package.json index 69fe7b5..d85fe44 100644 --- a/package.json +++ b/package.json @@ -9,7 +9,6 @@ }, "dependencies": { "@microsoft/microsoft-graph-client": "^3.0.7", - "dotenv": "^17.2.3", "hono": "^4.10.8", "pocketbase": "^0.26.5" },