78 lines
2.7 KiB
TypeScript
78 lines
2.7 KiB
TypeScript
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(),
|
|
});
|
|
}
|