Initial import
This commit is contained in:
77
etc/servers/work-server/src/services/worklog-automation-service.ts
Executable file
77
etc/servers/work-server/src/services/worklog-automation-service.ts
Executable 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(),
|
||||
});
|
||||
}
|
||||
Reference in New Issue
Block a user