d4628eb9a1
- 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
75 lines
2.2 KiB
TypeScript
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();
|