mdjournal 1.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +209 -0
- package/dist/cli.d.ts +12 -0
- package/dist/cli.d.ts.map +1 -0
- package/dist/cli.js +601 -0
- package/dist/cli.js.map +1 -0
- package/dist/index.d.ts +8 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +100 -0
- package/dist/index.js.map +1 -0
- package/dist/routes/calendar.d.ts +8 -0
- package/dist/routes/calendar.d.ts.map +1 -0
- package/dist/routes/calendar.js +115 -0
- package/dist/routes/calendar.js.map +1 -0
- package/dist/routes/config.d.ts +9 -0
- package/dist/routes/config.d.ts.map +1 -0
- package/dist/routes/config.js +75 -0
- package/dist/routes/config.js.map +1 -0
- package/dist/routes/gcal.d.ts +10 -0
- package/dist/routes/gcal.d.ts.map +1 -0
- package/dist/routes/gcal.js +100 -0
- package/dist/routes/gcal.js.map +1 -0
- package/dist/routes/index.d.ts +8 -0
- package/dist/routes/index.d.ts.map +1 -0
- package/dist/routes/index.js +8 -0
- package/dist/routes/index.js.map +1 -0
- package/dist/routes/reports.d.ts +10 -0
- package/dist/routes/reports.d.ts.map +1 -0
- package/dist/routes/reports.js +175 -0
- package/dist/routes/reports.js.map +1 -0
- package/dist/types/index.d.ts +190 -0
- package/dist/types/index.d.ts.map +1 -0
- package/dist/types/index.js +5 -0
- package/dist/types/index.js.map +1 -0
- package/dist/utils/configValidator.d.ts +43 -0
- package/dist/utils/configValidator.d.ts.map +1 -0
- package/dist/utils/configValidator.js +435 -0
- package/dist/utils/configValidator.js.map +1 -0
- package/dist/utils/fileManager.d.ts +101 -0
- package/dist/utils/fileManager.d.ts.map +1 -0
- package/dist/utils/fileManager.js +295 -0
- package/dist/utils/fileManager.js.map +1 -0
- package/dist/utils/git.d.ts +42 -0
- package/dist/utils/git.d.ts.map +1 -0
- package/dist/utils/git.js +130 -0
- package/dist/utils/git.js.map +1 -0
- package/dist/utils/index.d.ts +8 -0
- package/dist/utils/index.d.ts.map +1 -0
- package/dist/utils/index.js +8 -0
- package/dist/utils/index.js.map +1 -0
- package/dist/utils/markdown.d.ts +23 -0
- package/dist/utils/markdown.d.ts.map +1 -0
- package/dist/utils/markdown.js +378 -0
- package/dist/utils/markdown.js.map +1 -0
- package/dist/utils/slack.d.ts +24 -0
- package/dist/utils/slack.d.ts.map +1 -0
- package/dist/utils/slack.js +90 -0
- package/dist/utils/slack.js.map +1 -0
- package/dist/utils/validator.d.ts +66 -0
- package/dist/utils/validator.d.ts.map +1 -0
- package/dist/utils/validator.js +359 -0
- package/dist/utils/validator.js.map +1 -0
- package/package.json +64 -0
package/dist/index.js
ADDED
|
@@ -0,0 +1,100 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* 日報管理ダッシュボード バックエンドサーバー
|
|
3
|
+
*
|
|
4
|
+
* Express.jsベースのREST APIサーバー
|
|
5
|
+
*/
|
|
6
|
+
import express from 'express';
|
|
7
|
+
import cors from 'cors';
|
|
8
|
+
import path from 'path';
|
|
9
|
+
import { fileURLToPath } from 'url';
|
|
10
|
+
import fs from 'fs';
|
|
11
|
+
import reportsRouter from './routes/reports.js';
|
|
12
|
+
import calendarRouter from './routes/calendar.js';
|
|
13
|
+
import configRouter from './routes/config.js';
|
|
14
|
+
import gcalRouter from './routes/gcal.js';
|
|
15
|
+
import { initConfigPaths, getConfigPaths } from './utils/fileManager.js';
|
|
16
|
+
const __filename = fileURLToPath(import.meta.url);
|
|
17
|
+
const __dirname = path.dirname(__filename);
|
|
18
|
+
// 設定パスを初期化(環境変数から読み込み)
|
|
19
|
+
initConfigPaths();
|
|
20
|
+
// 環境変数
|
|
21
|
+
const PORT = parseInt(process.env.PORT || '3001', 10);
|
|
22
|
+
// Express アプリケーション
|
|
23
|
+
const app = express();
|
|
24
|
+
// ミドルウェア
|
|
25
|
+
app.use(cors({
|
|
26
|
+
origin: process.env.CORS_ORIGIN || 'http://localhost:5173', // Vite default
|
|
27
|
+
credentials: true,
|
|
28
|
+
}));
|
|
29
|
+
app.use(express.json());
|
|
30
|
+
// リクエストログ
|
|
31
|
+
app.use((req, _res, next) => {
|
|
32
|
+
console.log(`[${new Date().toISOString()}] ${req.method} ${req.path}`);
|
|
33
|
+
next();
|
|
34
|
+
});
|
|
35
|
+
// ヘルスチェック
|
|
36
|
+
app.get('/api/health', (_req, res) => {
|
|
37
|
+
const paths = getConfigPaths();
|
|
38
|
+
res.json({
|
|
39
|
+
status: 'ok',
|
|
40
|
+
timestamp: new Date().toISOString(),
|
|
41
|
+
config: {
|
|
42
|
+
projects: paths.projects,
|
|
43
|
+
routines: paths.routines,
|
|
44
|
+
reports: paths.reports,
|
|
45
|
+
},
|
|
46
|
+
});
|
|
47
|
+
});
|
|
48
|
+
// APIルーター
|
|
49
|
+
app.use('/api/reports', reportsRouter);
|
|
50
|
+
app.use('/api/calendar', calendarRouter);
|
|
51
|
+
app.use('/api/config', configRouter);
|
|
52
|
+
app.use('/api/gcal', gcalRouter);
|
|
53
|
+
// 404ハンドラー (API)
|
|
54
|
+
app.use('/api/*', (_req, res) => {
|
|
55
|
+
const error = {
|
|
56
|
+
code: 'NOT_FOUND',
|
|
57
|
+
message: 'APIエンドポイントが見つかりません',
|
|
58
|
+
};
|
|
59
|
+
res.status(404).json(error);
|
|
60
|
+
});
|
|
61
|
+
// 静的ファイルの配信(クライアントビルド)
|
|
62
|
+
const clientDistPath = process.env.CLIENT_DIST || path.join(__dirname, '..', '..', 'client', 'dist');
|
|
63
|
+
if (fs.existsSync(clientDistPath)) {
|
|
64
|
+
console.log(`クライアント配信: ${clientDistPath}`);
|
|
65
|
+
app.use(express.static(clientDistPath));
|
|
66
|
+
// SPA対応: API以外のルートはindex.htmlを返す
|
|
67
|
+
app.get('*', (_req, res) => {
|
|
68
|
+
res.sendFile(path.join(clientDistPath, 'index.html'));
|
|
69
|
+
});
|
|
70
|
+
}
|
|
71
|
+
// エラーハンドラー
|
|
72
|
+
app.use((err, _req, res, _next) => {
|
|
73
|
+
console.error('Unhandled error:', err);
|
|
74
|
+
const error = {
|
|
75
|
+
code: 'INTERNAL_ERROR',
|
|
76
|
+
message: 'サーバー内部エラーが発生しました',
|
|
77
|
+
};
|
|
78
|
+
res.status(500).json(error);
|
|
79
|
+
});
|
|
80
|
+
// サーバー起動
|
|
81
|
+
const paths = getConfigPaths();
|
|
82
|
+
const hasClient = fs.existsSync(clientDistPath);
|
|
83
|
+
app.listen(PORT, () => {
|
|
84
|
+
console.log(`
|
|
85
|
+
╔═══════════════════════════════════════════════════════════╗
|
|
86
|
+
║ 日報管理ダッシュボード ║
|
|
87
|
+
╠═══════════════════════════════════════════════════════════╣
|
|
88
|
+
║ URL: http://localhost:${String(PORT).padEnd(27)}║
|
|
89
|
+
║ API: http://localhost:${PORT}/api ║
|
|
90
|
+
║ Client: ${hasClient ? '配信中'.padEnd(43) : '未ビルド(npm run build in client)'.padEnd(43)}║
|
|
91
|
+
╠═══════════════════════════════════════════════════════════╣
|
|
92
|
+
║ 設定ファイル: ║
|
|
93
|
+
║ projects: ${paths.projects.slice(-42).padEnd(42)}║
|
|
94
|
+
║ routines: ${paths.routines.slice(-42).padEnd(42)}║
|
|
95
|
+
║ reports: ${paths.reports.slice(-42).padEnd(42)}║
|
|
96
|
+
╚═══════════════════════════════════════════════════════════╝
|
|
97
|
+
`);
|
|
98
|
+
});
|
|
99
|
+
export default app;
|
|
100
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"calendar.d.ts","sourceRoot":"","sources":["../../src/routes/calendar.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAMH,QAAA,MAAM,MAAM,4CAAW,CAAC;AAsHxB,eAAe,MAAM,CAAC"}
|
|
@@ -0,0 +1,115 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* カレンダーAPI ルーター
|
|
3
|
+
*
|
|
4
|
+
* GET /api/calendar - カレンダー用集計データ取得
|
|
5
|
+
*/
|
|
6
|
+
import { Router } from 'express';
|
|
7
|
+
import { getMonthReportStats, getAvailableYearMonths } from '../utils/fileManager.js';
|
|
8
|
+
const router = Router();
|
|
9
|
+
/**
|
|
10
|
+
* 指定年月の日数を取得
|
|
11
|
+
*/
|
|
12
|
+
function getDaysInMonth(year, month) {
|
|
13
|
+
return new Date(year, month, 0).getDate();
|
|
14
|
+
}
|
|
15
|
+
/**
|
|
16
|
+
* GET /api/calendar - カレンダー用集計データ取得
|
|
17
|
+
*/
|
|
18
|
+
router.get('/', async (req, res) => {
|
|
19
|
+
const year = parseInt(req.query.year, 10);
|
|
20
|
+
const month = parseInt(req.query.month, 10);
|
|
21
|
+
// バリデーション
|
|
22
|
+
if (isNaN(year) || year < 2000 || year > 2100) {
|
|
23
|
+
const error = {
|
|
24
|
+
code: 'INVALID_YEAR',
|
|
25
|
+
message: 'yearは2000〜2100の範囲で指定してください',
|
|
26
|
+
};
|
|
27
|
+
return res.status(400).json(error);
|
|
28
|
+
}
|
|
29
|
+
if (isNaN(month) || month < 1 || month > 12) {
|
|
30
|
+
const error = {
|
|
31
|
+
code: 'INVALID_MONTH',
|
|
32
|
+
message: 'monthは1〜12の範囲で指定してください',
|
|
33
|
+
};
|
|
34
|
+
return res.status(400).json(error);
|
|
35
|
+
}
|
|
36
|
+
try {
|
|
37
|
+
// frontmatterから統計情報を取得
|
|
38
|
+
const reportStats = await getMonthReportStats(year, month);
|
|
39
|
+
// 日別データを生成
|
|
40
|
+
const daysInMonth = getDaysInMonth(year, month);
|
|
41
|
+
const days = [];
|
|
42
|
+
for (let day = 1; day <= daysInMonth; day++) {
|
|
43
|
+
const dateStr = `${year}-${month.toString().padStart(2, '0')}-${day.toString().padStart(2, '0')}`;
|
|
44
|
+
const stats = reportStats.get(dateStr);
|
|
45
|
+
if (stats) {
|
|
46
|
+
days.push({
|
|
47
|
+
date: dateStr,
|
|
48
|
+
hasReport: true,
|
|
49
|
+
planHours: stats.planHours,
|
|
50
|
+
resultHours: stats.resultHours,
|
|
51
|
+
todoCount: stats.todoCount,
|
|
52
|
+
todoCompleted: stats.todoCompleted,
|
|
53
|
+
});
|
|
54
|
+
}
|
|
55
|
+
else {
|
|
56
|
+
days.push({
|
|
57
|
+
date: dateStr,
|
|
58
|
+
hasReport: false,
|
|
59
|
+
});
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
// 月間サマリーを計算
|
|
63
|
+
const summary = {
|
|
64
|
+
totalPlanHours: 0,
|
|
65
|
+
totalResultHours: 0,
|
|
66
|
+
workDays: 0,
|
|
67
|
+
todoCompleted: 0,
|
|
68
|
+
projectHours: {},
|
|
69
|
+
};
|
|
70
|
+
for (const stats of reportStats.values()) {
|
|
71
|
+
summary.totalPlanHours += stats.planHours;
|
|
72
|
+
summary.totalResultHours += stats.resultHours;
|
|
73
|
+
summary.workDays += 1;
|
|
74
|
+
summary.todoCompleted += stats.todoCompleted;
|
|
75
|
+
// プロジェクト別時間を集計
|
|
76
|
+
for (const [project, hours] of Object.entries(stats.projectHours)) {
|
|
77
|
+
summary.projectHours[project] = (summary.projectHours[project] || 0) + hours;
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
const response = {
|
|
81
|
+
year,
|
|
82
|
+
month,
|
|
83
|
+
days,
|
|
84
|
+
summary,
|
|
85
|
+
};
|
|
86
|
+
res.json(response);
|
|
87
|
+
}
|
|
88
|
+
catch (error) {
|
|
89
|
+
console.error('Error getting calendar data:', error);
|
|
90
|
+
const apiError = {
|
|
91
|
+
code: 'INTERNAL_ERROR',
|
|
92
|
+
message: 'カレンダーデータの取得中にエラーが発生しました',
|
|
93
|
+
};
|
|
94
|
+
res.status(500).json(apiError);
|
|
95
|
+
}
|
|
96
|
+
});
|
|
97
|
+
/**
|
|
98
|
+
* GET /api/calendar/months - 日報が存在する年月リストを取得
|
|
99
|
+
*/
|
|
100
|
+
router.get('/months', async (_req, res) => {
|
|
101
|
+
try {
|
|
102
|
+
const yearMonths = await getAvailableYearMonths();
|
|
103
|
+
res.json({ yearMonths });
|
|
104
|
+
}
|
|
105
|
+
catch (error) {
|
|
106
|
+
console.error('Error getting available year months:', error);
|
|
107
|
+
const apiError = {
|
|
108
|
+
code: 'INTERNAL_ERROR',
|
|
109
|
+
message: '年月リストの取得中にエラーが発生しました',
|
|
110
|
+
};
|
|
111
|
+
res.status(500).json(apiError);
|
|
112
|
+
}
|
|
113
|
+
});
|
|
114
|
+
export default router;
|
|
115
|
+
//# sourceMappingURL=calendar.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"calendar.js","sourceRoot":"","sources":["../../src/routes/calendar.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../../src/routes/config.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAMH,QAAA,MAAM,MAAM,4CAAW,CAAC;AAsExB,eAAe,MAAM,CAAC"}
|
|
@@ -0,0 +1,75 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* 設定API ルーター
|
|
3
|
+
*
|
|
4
|
+
* GET /api/config - 設定取得
|
|
5
|
+
* PUT /api/config - 設定更新
|
|
6
|
+
*/
|
|
7
|
+
import { Router } from 'express';
|
|
8
|
+
import { readConfig, writeConfig } from '../utils/fileManager.js';
|
|
9
|
+
const router = Router();
|
|
10
|
+
/**
|
|
11
|
+
* GET /api/config - 設定取得
|
|
12
|
+
*/
|
|
13
|
+
router.get('/', async (_req, res) => {
|
|
14
|
+
try {
|
|
15
|
+
const config = await readConfig();
|
|
16
|
+
res.json(config);
|
|
17
|
+
}
|
|
18
|
+
catch (error) {
|
|
19
|
+
console.error('Error reading config:', error);
|
|
20
|
+
const apiError = {
|
|
21
|
+
code: 'INTERNAL_ERROR',
|
|
22
|
+
message: '設定の読み込み中にエラーが発生しました',
|
|
23
|
+
};
|
|
24
|
+
res.status(500).json(apiError);
|
|
25
|
+
}
|
|
26
|
+
});
|
|
27
|
+
/**
|
|
28
|
+
* PUT /api/config - 設定更新
|
|
29
|
+
*/
|
|
30
|
+
router.put('/', async (req, res) => {
|
|
31
|
+
const config = req.body;
|
|
32
|
+
// バリデーション
|
|
33
|
+
if (config.projects) {
|
|
34
|
+
for (const project of config.projects) {
|
|
35
|
+
if (!project.code || !project.name || !project.color || !project.category) {
|
|
36
|
+
const error = {
|
|
37
|
+
code: 'INVALID_PROJECT',
|
|
38
|
+
message: 'プロジェクトにはcode, name, color, categoryが必須です',
|
|
39
|
+
};
|
|
40
|
+
return res.status(400).json(error);
|
|
41
|
+
}
|
|
42
|
+
// カラーフォーマットチェック
|
|
43
|
+
if (!/^#[0-9A-Fa-f]{6}$/.test(project.color)) {
|
|
44
|
+
const error = {
|
|
45
|
+
code: 'INVALID_COLOR',
|
|
46
|
+
message: 'colorは#RRGGBB形式で指定してください',
|
|
47
|
+
};
|
|
48
|
+
return res.status(400).json(error);
|
|
49
|
+
}
|
|
50
|
+
// カテゴリチェック
|
|
51
|
+
if (!['internal', 'client', 'personal'].includes(project.category)) {
|
|
52
|
+
const error = {
|
|
53
|
+
code: 'INVALID_CATEGORY',
|
|
54
|
+
message: 'categoryはinternal, client, personalのいずれかを指定してください',
|
|
55
|
+
};
|
|
56
|
+
return res.status(400).json(error);
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
try {
|
|
61
|
+
await writeConfig(config);
|
|
62
|
+
const updatedConfig = await readConfig();
|
|
63
|
+
res.json(updatedConfig);
|
|
64
|
+
}
|
|
65
|
+
catch (error) {
|
|
66
|
+
console.error('Error updating config:', error);
|
|
67
|
+
const apiError = {
|
|
68
|
+
code: 'INTERNAL_ERROR',
|
|
69
|
+
message: '設定の更新中にエラーが発生しました',
|
|
70
|
+
};
|
|
71
|
+
res.status(500).json(apiError);
|
|
72
|
+
}
|
|
73
|
+
});
|
|
74
|
+
export default router;
|
|
75
|
+
//# sourceMappingURL=config.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"config.js","sourceRoot":"","sources":["../../src/routes/config.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Googleカレンダー連携API ルーター
|
|
3
|
+
*
|
|
4
|
+
* GET /api/gcal/events - Googleカレンダー予定取得
|
|
5
|
+
*
|
|
6
|
+
* 注: 現在はモック実装。実際のGoogle Calendar API連携は将来実装予定。
|
|
7
|
+
*/
|
|
8
|
+
declare const router: import("express-serve-static-core").Router;
|
|
9
|
+
export default router;
|
|
10
|
+
//# sourceMappingURL=gcal.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"gcal.d.ts","sourceRoot":"","sources":["../../src/routes/gcal.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAKH,QAAA,MAAM,MAAM,4CAAW,CAAC;AA2GxB,eAAe,MAAM,CAAC"}
|
|
@@ -0,0 +1,100 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Googleカレンダー連携API ルーター
|
|
3
|
+
*
|
|
4
|
+
* GET /api/gcal/events - Googleカレンダー予定取得
|
|
5
|
+
*
|
|
6
|
+
* 注: 現在はモック実装。実際のGoogle Calendar API連携は将来実装予定。
|
|
7
|
+
*/
|
|
8
|
+
import { Router } from 'express';
|
|
9
|
+
const router = Router();
|
|
10
|
+
/**
|
|
11
|
+
* 日付形式のバリデーション
|
|
12
|
+
*/
|
|
13
|
+
function isValidDate(date) {
|
|
14
|
+
return /^\d{4}-\d{2}-\d{2}$/.test(date);
|
|
15
|
+
}
|
|
16
|
+
/**
|
|
17
|
+
* GET /api/gcal/events - Googleカレンダー予定取得
|
|
18
|
+
*/
|
|
19
|
+
router.get('/events', async (req, res) => {
|
|
20
|
+
const date = req.query.date;
|
|
21
|
+
if (!date || !isValidDate(date)) {
|
|
22
|
+
const error = {
|
|
23
|
+
code: 'INVALID_DATE',
|
|
24
|
+
message: '日付形式が不正です(YYYY-MM-DD形式で指定してください)',
|
|
25
|
+
};
|
|
26
|
+
return res.status(400).json(error);
|
|
27
|
+
}
|
|
28
|
+
// TODO: Google Calendar API 連携の実装
|
|
29
|
+
// 現在はモックデータを返す
|
|
30
|
+
// 環境変数でGoogleカレンダー連携が設定されているかチェック
|
|
31
|
+
const isConfigured = !!process.env.GOOGLE_CLIENT_ID && !!process.env.GOOGLE_CLIENT_SECRET;
|
|
32
|
+
if (!isConfigured) {
|
|
33
|
+
// モックデータを返す
|
|
34
|
+
const mockEvents = generateMockEvents(date);
|
|
35
|
+
res.json({
|
|
36
|
+
date,
|
|
37
|
+
events: mockEvents,
|
|
38
|
+
});
|
|
39
|
+
return;
|
|
40
|
+
}
|
|
41
|
+
// 実際のGoogle Calendar API呼び出し(未実装)
|
|
42
|
+
const error = {
|
|
43
|
+
code: 'NOT_IMPLEMENTED',
|
|
44
|
+
message: 'Googleカレンダー連携は準備中です',
|
|
45
|
+
};
|
|
46
|
+
res.status(503).json(error);
|
|
47
|
+
});
|
|
48
|
+
/**
|
|
49
|
+
* モックイベントを生成
|
|
50
|
+
*/
|
|
51
|
+
function generateMockEvents(date) {
|
|
52
|
+
// 曜日に応じてモックイベントを生成
|
|
53
|
+
const dayOfWeek = new Date(date).getDay();
|
|
54
|
+
// 土日はイベントなし
|
|
55
|
+
if (dayOfWeek === 0 || dayOfWeek === 6) {
|
|
56
|
+
return [];
|
|
57
|
+
}
|
|
58
|
+
const events = [];
|
|
59
|
+
// 月曜日: 週次定例
|
|
60
|
+
if (dayOfWeek === 1) {
|
|
61
|
+
events.push({
|
|
62
|
+
id: `gcal-${date}-1`,
|
|
63
|
+
summary: '週次定例MTG',
|
|
64
|
+
description: 'チームの週次定例ミーティング',
|
|
65
|
+
start: `${date}T10:00:00+09:00`,
|
|
66
|
+
end: `${date}T11:00:00+09:00`,
|
|
67
|
+
meetingUrl: 'https://meet.google.com/xxx-yyyy-zzz',
|
|
68
|
+
});
|
|
69
|
+
}
|
|
70
|
+
// 毎日: 朝会(平日のみ)
|
|
71
|
+
events.push({
|
|
72
|
+
id: `gcal-${date}-2`,
|
|
73
|
+
summary: '朝会',
|
|
74
|
+
start: `${date}T09:00:00+09:00`,
|
|
75
|
+
end: `${date}T09:15:00+09:00`,
|
|
76
|
+
});
|
|
77
|
+
// 水曜日: 1on1
|
|
78
|
+
if (dayOfWeek === 3) {
|
|
79
|
+
events.push({
|
|
80
|
+
id: `gcal-${date}-3`,
|
|
81
|
+
summary: '1on1 マネージャー',
|
|
82
|
+
description: '週次1on1',
|
|
83
|
+
start: `${date}T14:00:00+09:00`,
|
|
84
|
+
end: `${date}T14:30:00+09:00`,
|
|
85
|
+
meetingUrl: 'https://meet.google.com/aaa-bbbb-ccc',
|
|
86
|
+
});
|
|
87
|
+
}
|
|
88
|
+
// 金曜日: 週報
|
|
89
|
+
if (dayOfWeek === 5) {
|
|
90
|
+
events.push({
|
|
91
|
+
id: `gcal-${date}-4`,
|
|
92
|
+
summary: '週報作成',
|
|
93
|
+
start: `${date}T17:00:00+09:00`,
|
|
94
|
+
end: `${date}T18:00:00+09:00`,
|
|
95
|
+
});
|
|
96
|
+
}
|
|
97
|
+
return events;
|
|
98
|
+
}
|
|
99
|
+
export default router;
|
|
100
|
+
//# sourceMappingURL=gcal.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"gcal.js","sourceRoot":"","sources":["../../src/routes/gcal.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* APIルーターのエクスポート
|
|
3
|
+
*/
|
|
4
|
+
export { default as reportsRouter } from './reports.js';
|
|
5
|
+
export { default as calendarRouter } from './calendar.js';
|
|
6
|
+
export { default as configRouter } from './config.js';
|
|
7
|
+
export { default as gcalRouter } from './gcal.js';
|
|
8
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/routes/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,OAAO,IAAI,aAAa,EAAE,MAAM,cAAc,CAAC;AACxD,OAAO,EAAE,OAAO,IAAI,cAAc,EAAE,MAAM,eAAe,CAAC;AAC1D,OAAO,EAAE,OAAO,IAAI,YAAY,EAAE,MAAM,aAAa,CAAC;AACtD,OAAO,EAAE,OAAO,IAAI,UAAU,EAAE,MAAM,WAAW,CAAC"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* APIルーターのエクスポート
|
|
3
|
+
*/
|
|
4
|
+
export { default as reportsRouter } from './reports.js';
|
|
5
|
+
export { default as calendarRouter } from './calendar.js';
|
|
6
|
+
export { default as configRouter } from './config.js';
|
|
7
|
+
export { default as gcalRouter } from './gcal.js';
|
|
8
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/routes/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,OAAO,IAAI,aAAa,EAAE,MAAM,cAAc,CAAC;AACxD,OAAO,EAAE,OAAO,IAAI,cAAc,EAAE,MAAM,eAAe,CAAC;AAC1D,OAAO,EAAE,OAAO,IAAI,YAAY,EAAE,MAAM,aAAa,CAAC;AACtD,OAAO,EAAE,OAAO,IAAI,UAAU,EAAE,MAAM,WAAW,CAAC"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* 日報API ルーター
|
|
3
|
+
*
|
|
4
|
+
* GET /api/reports/:date - 日報取得
|
|
5
|
+
* PUT /api/reports/:date - 日報保存
|
|
6
|
+
* DELETE /api/reports/:date - 日報削除
|
|
7
|
+
*/
|
|
8
|
+
declare const router: import("express-serve-static-core").Router;
|
|
9
|
+
export default router;
|
|
10
|
+
//# sourceMappingURL=reports.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"reports.d.ts","sourceRoot":"","sources":["../../src/routes/reports.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AASH,QAAA,MAAM,MAAM,4CAAW,CAAC;AAuLxB,eAAe,MAAM,CAAC"}
|