// scripts/bridge/update-queue-status.js // ๐ŸŒ‰ ๆกฅๆŽฅยทๆ›ดๆ–ฐ่ฐƒๅบฆ้˜Ÿๅˆ—็Šถๆ€ // // ๅฐ†ๅทฒๅค„็†็š„่ฐƒๅบฆ้˜Ÿๅˆ—ไปปๅŠก็Šถๆ€ๆ›ดๆ–ฐไธบใ€ŒๅทฒๅฎŒๆˆใ€ // // ็Žฏๅขƒๅ˜้‡๏ผš // NOTION_TOKEN Notion API token // BRIDGE_QUEUE_DB_ID ๆกฅๆŽฅ่ฐƒๅบฆ้˜Ÿๅˆ—ๆ•ฐๆฎๅบ“ ID // QUEUE_FILE check-queue.js ่พ“ๅ‡บ็š„ไปปๅŠกๅˆ—่กจๆ–‡ไปถ่ทฏๅพ„ 'use strict'; const https = require('https'); const fs = require('fs'); const path = require('path'); const NOTION_VERSION = '2022-06-28'; const NOTION_API_HOSTNAME = 'api.notion.com'; // โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ• // Notion API // โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ• function notionPatch(endpoint, body, token) { return new Promise((resolve, reject) => { const payload = JSON.stringify(body); const opts = { hostname: NOTION_API_HOSTNAME, port: 443, path: endpoint, method: 'PATCH', headers: { 'Authorization': 'Bearer ' + token, 'Content-Type': 'application/json', 'Notion-Version': NOTION_VERSION, 'Content-Length': Buffer.byteLength(payload), }, }; const req = https.request(opts, res => { let data = ''; res.on('data', chunk => data += chunk); res.on('end', () => { try { const parsed = JSON.parse(data); if (res.statusCode >= 200 && res.statusCode < 300) { resolve(parsed); } else { reject(new Error(`Notion API ${res.statusCode}: ${parsed.message || data}`)); } } catch (e) { reject(new Error(`Notion API parse error: ${data}`)); } }); }); req.on('error', reject); req.write(payload); req.end(); }); } // โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ• // ไธป้€ป่พ‘ // โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ• async function main() { const token = process.env.NOTION_TOKEN; const queueFile = process.env.QUEUE_FILE; if (!token) { console.log('โš ๏ธ ็ผบๅฐ‘ NOTION_TOKEN๏ผŒ่ทณ่ฟ‡็Šถๆ€ๆ›ดๆ–ฐ'); process.exit(0); } if (!queueFile || !fs.existsSync(queueFile)) { console.log('๐Ÿ“ญ ๆ— ๅพ…ๆ›ดๆ–ฐ็š„ไปปๅŠก๏ผŒ่ทณ่ฟ‡'); process.exit(0); } const tasks = JSON.parse(fs.readFileSync(queueFile, 'utf8')); if (tasks.length === 0) { console.log('๐Ÿ“ญ ไปปๅŠกๅˆ—่กจไธบ็ฉบ๏ผŒ่ทณ่ฟ‡'); process.exit(0); } console.log(`โœ๏ธ ๆ›ดๆ–ฐ ${tasks.length} ๆกไปปๅŠก็Šถๆ€ไธบใ€ŒๅทฒๅฎŒๆˆใ€โ€ฆ`); let ok = 0, failed = 0; for (const task of tasks) { try { await notionPatch(`/v1/pages/${task.id}`, { properties: { 'ๅค„็†็Šถๆ€': { status: { name: 'ๅทฒๅฎŒๆˆ' } }, }, }, token); console.log(` โœ… ${task.task_name} โ†’ ๅทฒๅฎŒๆˆ`); ok++; } catch (e) { console.error(` โŒ ${task.task_name} ๆ›ดๆ–ฐๅคฑ่ดฅ: ${e.message}`); failed++; } } console.log(`\nโœ… ็Šถๆ€ๆ›ดๆ–ฐๅฎŒๆˆ ยท ๆˆๅŠŸ ${ok} ๆก ยท ๅคฑ่ดฅ ${failed} ๆก`); if (process.env.GITHUB_OUTPUT) { fs.appendFileSync(process.env.GITHUB_OUTPUT, `updated_count=${ok}\n` ); } if (failed > 0) process.exit(1); } main().catch(e => { console.error(e); process.exit(1); });