Files
Job-Form/inspect-tables.ts
T
aewing d4628eb9a1 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
2026-01-07 13:40:23 +00:00

75 lines
2.2 KiB
TypeScript

import { Client } from '@microsoft/microsoft-graph-client';
// 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`;
const params = new URLSearchParams();
params.append('client_id', process.env.CLIENT_ID!);
params.append('client_secret', process.env.CLIENT_SECRET!);
params.append('scope', 'https://graph.microsoft.com/.default');
params.append('grant_type', 'client_credentials');
const response = await fetch(tokenEndpoint, {
method: 'POST',
headers: { 'Content-Type': 'application/x-www-form-urlencoded' },
body: params,
});
const data = await response.json();
return data.access_token;
}
async function inspectTables() {
const token = await getGraphToken();
const client = Client.init({
authProvider: (done) => {
done(null, token);
},
});
const driveId = process.env.DRIVE_ID;
const itemId = process.env.ITEM_ID;
const baseUrl = `/drives/${driveId}/items/${itemId}/workbook/tables`;
console.log(`Inspecting tables in file: ${itemId}`);
try {
const res = await client.api(baseUrl).get();
const tables = res.value;
for (const table of tables) {
console.log(`\nTable: ${table.name}`);
const cols = await client.api(`${baseUrl}/${table.name}/columns`).get();
console.log(`- Column count: ${cols.value.length}`);
}
} catch (err) {
console.error('Error:', err.message);
}
}
inspectTables();