maestro/src/bridge/cross-calendar-api.ts
oss-sync 29ccaf1e92
Some checks failed
CI / build-and-test (push) Has been cancelled
sync: update from private repo (dfadcd5f)
2026-06-23 06:38:48 +00:00

43 lines
1.6 KiB
TypeScript
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

import { Router } from 'express';
import type { Repository } from '../db/repository.js';
import { spaceViewerOf, parseTzOffset, monthBounds } from './space-api.js';
// 横断(全スペース)カレンダー API。
// spec: docs/superpowers/specs/2026-06-19-space-calendar-design.md §V2
//
// GET /api/calendar/cross?month=YYYY-MM&tz_offset=<min>
// → { days: {[date]: {[spaceId]: {taskCount,eventCount}}}, events, spaces }
//
// 可視性は Repository.getCrossSpaceCalendarMonth が listSpacesbuildVisibilityWhere
// 経由で絞るので、viewer が見られないスペースのカウント・イベントは一切返さない。
// 認可ミドルウェアrequireAuth / no-auth フォールバックはマウント側server.ts
// 他のトップレベル API と同じパターンを付与する。
export interface CrossCalendarApiDeps {
repo: Repository;
authActive: boolean;
}
export function createCrossCalendarApi(deps: CrossCalendarApiDeps): Router {
const router = Router();
const { repo } = deps;
router.get('/cross', async (req, res) => {
const viewer = spaceViewerOf(req, deps.authActive);
const month = String(req.query.month ?? '');
if (!/^\d{4}-\d{2}$/.test(month)) {
return res.status(400).json({ error: 'month must be YYYY-MM' });
}
const tzOffsetMin = parseTzOffset(req.query.tz_offset);
const { monthStart, monthEnd } = monthBounds(month);
const result = await repo.getCrossSpaceCalendarMonth(viewer, {
monthStart,
monthEnd,
tzOffsetMin,
});
res.json(result);
});
return router;
}