Compare commits
2 Commits
1dbfc76969
...
af0601b1c4
| Author | SHA1 | Date |
|---|---|---|
|
|
af0601b1c4 | |
|
|
934e6112cb |
|
|
@ -1 +1 @@
|
|||
Subproject commit 0c38e33cc1920bd577c2d84a417a18690f1eda53
|
||||
Subproject commit 6ab7939676e2ef9bb9ab07089e99b815023e92af
|
||||
55
server.js
55
server.js
|
|
@ -2021,6 +2021,53 @@ ${excerpt}
|
|||
}
|
||||
});
|
||||
|
||||
// GET /chronicle/activity — GitHub push イベントから期間内のコミット一覧を返す
|
||||
r.get('/chronicle/activity', authMiddleware, async (req, res) => {
|
||||
const token = process.env.CHRONICLE_GITHUB_TOKEN || '';
|
||||
if (!token) return res.status(503).json({ error: 'CHRONICLE_GITHUB_TOKEN not configured' });
|
||||
|
||||
const daysNum = Math.min(Math.max(parseInt(req.query.days) || 7, 1), 30);
|
||||
const since = new Date(Date.now() - daysNum * 86400000);
|
||||
|
||||
try {
|
||||
const ghHeaders = {
|
||||
'Authorization': `Bearer ${token}`,
|
||||
'Accept': 'application/vnd.github+json',
|
||||
'X-GitHub-Api-Version': '2022-11-28',
|
||||
'User-Agent': 'posimai-chronicle/1.0'
|
||||
};
|
||||
|
||||
const eventsResp = await fetch(
|
||||
'https://api.github.com/orgs/posimai/events?per_page=100',
|
||||
{ headers: ghHeaders }
|
||||
);
|
||||
if (!eventsResp.ok) throw new Error(`GitHub API ${eventsResp.status}`);
|
||||
|
||||
const events = await eventsResp.json();
|
||||
const commits = [];
|
||||
const repos = new Set();
|
||||
|
||||
for (const ev of events) {
|
||||
if (ev.type !== 'PushEvent') continue;
|
||||
if (new Date(ev.created_at) < since) continue;
|
||||
|
||||
const repoName = ev.repo.name.replace('posimai/', '');
|
||||
repos.add(repoName);
|
||||
|
||||
for (const c of ev.payload?.commits || []) {
|
||||
const msg = c.message.split('\n')[0];
|
||||
if (/^Merge\b/i.test(msg)) continue;
|
||||
commits.push({ repo: repoName, message: msg, date: ev.created_at });
|
||||
}
|
||||
}
|
||||
|
||||
res.json({ commits, repos: [...repos], since: since.toISOString() });
|
||||
} catch (e) {
|
||||
console.error('[chronicle/activity]', e.message);
|
||||
res.status(500).json({ error: e.message });
|
||||
}
|
||||
});
|
||||
|
||||
r.post('/journal/upload', authMiddleware, (req, res) => {
|
||||
try {
|
||||
const { base64 } = req.body || {};
|
||||
|
|
@ -2677,9 +2724,11 @@ ${excerpt}
|
|||
}
|
||||
}
|
||||
|
||||
// summary が取れなかった場合は failed にする(done+nullのまま再試行不能になるのを防ぐ)
|
||||
const finalStatus = summary ? 'done' : 'failed';
|
||||
await pool.query(
|
||||
`UPDATE together_shares SET summary=$1, tags=$2, archive_status='done' WHERE id=$3`,
|
||||
[summary, tags, shareId]
|
||||
`UPDATE together_shares SET summary=$1, tags=$2, archive_status=$3 WHERE id=$4`,
|
||||
[summary || null, tags, finalStatus, shareId]
|
||||
);
|
||||
} catch (e) {
|
||||
console.error('[together archive]', shareId, e.message);
|
||||
|
|
@ -2730,7 +2779,7 @@ ${excerpt}
|
|||
}
|
||||
}
|
||||
if (!rearchiveDone) {
|
||||
await pool.query(`UPDATE together_shares SET archive_status='done' WHERE id=$1`, [shareId]);
|
||||
await pool.query(`UPDATE together_shares SET archive_status='failed' WHERE id=$1`, [shareId]);
|
||||
}
|
||||
} else {
|
||||
// failed / skipped — フル再アーカイブ
|
||||
|
|
|
|||
Loading…
Reference in New Issue