Initial import

This commit is contained in:
how2ice
2026-04-21 03:33:23 +09:00
commit 9e4b70f1f1
495 changed files with 94680 additions and 0 deletions

View File

@@ -0,0 +1,77 @@
import { db } from '../db/client.js';
export {
DEFAULT_DAILY_CREATE_TIME,
ensureDailyWorklogFile,
getKstNowParts,
isValidDailyCreateTime,
isWorklogCreationDue,
normalizeDailyCreateTime,
renderWorklogTemplate,
} from './worklog-automation-utils.js';
import { DEFAULT_DAILY_CREATE_TIME, normalizeDailyCreateTime } from './worklog-automation-utils.js';
export const WORKLOG_AUTOMATION_RUN_TABLE = 'worklog_automation_runs';
async function ensureWorklogAutomationRunTable() {
const hasTable = await db.schema.hasTable(WORKLOG_AUTOMATION_RUN_TABLE);
if (!hasTable) {
await db.schema.createTable(WORKLOG_AUTOMATION_RUN_TABLE, (table) => {
table.increments('id').primary();
table.string('run_date', 10).notNullable().unique();
table.string('scheduled_time', 5).notNullable();
table.string('worklog_path').notNullable();
table.timestamp('executed_at', { useTz: true }).notNullable().defaultTo(db.fn.now());
});
return;
}
const requiredColumns: Array<[string, (table: any) => void]> = [
['run_date', (table) => table.string('run_date', 10).notNullable().unique()],
['scheduled_time', (table) => table.string('scheduled_time', 5).notNullable().defaultTo(DEFAULT_DAILY_CREATE_TIME)],
['worklog_path', (table) => table.string('worklog_path').notNullable().defaultTo('')],
['executed_at', (table) => table.timestamp('executed_at', { useTz: true }).notNullable().defaultTo(db.fn.now())],
];
for (const [columnName, createColumn] of requiredColumns) {
const hasColumn = await db.schema.hasColumn(WORKLOG_AUTOMATION_RUN_TABLE, columnName);
if (!hasColumn) {
await db.schema.alterTable(WORKLOG_AUTOMATION_RUN_TABLE, (table) => {
createColumn(table);
});
}
}
}
export async function hasWorklogAutomationRunForDate(runDate: string) {
await ensureWorklogAutomationRunTable();
const row = await db(WORKLOG_AUTOMATION_RUN_TABLE).where({ run_date: runDate }).first();
return Boolean(row);
}
export async function markWorklogAutomationRun(args: {
runDate: string;
scheduledTime: string;
worklogPath: string;
}) {
await ensureWorklogAutomationRunTable();
const existing = await db(WORKLOG_AUTOMATION_RUN_TABLE).where({ run_date: args.runDate }).first();
if (existing) {
await db(WORKLOG_AUTOMATION_RUN_TABLE)
.where({ run_date: args.runDate })
.update({
scheduled_time: args.scheduledTime,
worklog_path: args.worklogPath,
executed_at: db.fn.now(),
});
return;
}
await db(WORKLOG_AUTOMATION_RUN_TABLE).insert({
run_date: args.runDate,
scheduled_time: args.scheduledTime,
worklog_path: args.worklogPath,
executed_at: db.fn.now(),
});
}