fix(chat): keep stored rectification titles on open
Independent Staging Quality Gate / validate (push) Successful in 11m43s
Independent Staging Quality Gate / publish (push) Successful in 2m3s

Opening a saved birth-time session no longer restamps the title or updatedAt from the wall clock. Occupies BUG-699, recurrence of BUG-553.
This commit is contained in:
jesse-ux
2026-09-15 14:48:03 +08:00
parent 224244c014
commit 2d7698ead3
13 changed files with 397 additions and 10 deletions
@@ -0,0 +1,63 @@
import pg from "pg";
const { Client } = pg;
const MATCH_SQL = `
session_type = 'birth_time_rectification'
and title ~ '^[0-9]{1,2}月[0-9]{1,2}日[[:space:]]*·[[:space:]]*生时校正([[:space:]]+[0-9]{2}:[0-9]{2})?$'
and (
created_at is null
or (substring(title from '^([0-9]{1,2})月'))::int
is distinct from extract(month from created_at at time zone 'Asia/Shanghai')::int
or (substring(title from '月([0-9]{1,2})日'))::int
is distinct from extract(day from created_at at time zone 'Asia/Shanghai')::int
)
`;
const COUNT_SQL = `select count(*)::int as n from public.chat_sessions where ${MATCH_SQL}`;
const APPLY_SQL = `
update public.chat_sessions
set title = case
when created_at is null then '生时校正'
else to_char(created_at at time zone 'Asia/Shanghai', 'FMMM')
|| '月'
|| to_char(created_at at time zone 'Asia/Shanghai', 'FMDD')
|| '日 · 生时校正'
end
where ${MATCH_SQL}
`;
function connectionString() {
const value = process.env.SCHEMA_DATABASE_URL?.trim();
if (!value) {
throw new Error("SCHEMA_DATABASE_URL is required");
}
if (!/^postgres(ql)?:\/\//.test(value)) {
throw new Error("SCHEMA_DATABASE_URL must be a PostgreSQL URL");
}
return value;
}
async function main() {
const apply = process.argv.includes("--apply");
const client = new Client({ connectionString: connectionString() });
await client.connect();
try {
const before = await client.query(COUNT_SQL);
const n = before.rows[0]?.n ?? 0;
console.log(`mismatched_dated_rectification_titles=${n}`);
if (!apply) return;
const updated = await client.query(APPLY_SQL);
const after = await client.query(COUNT_SQL);
console.log(`updated_rows=${updated.rowCount ?? 0}`);
console.log(`mismatched_after=${after.rows[0]?.n ?? 0}`);
} finally {
await client.end();
}
}
main().catch((error) => {
console.error(error instanceof Error ? error.message : error);
process.exit(1);
});