fix(habits): preserve task state and original occurrence expiry
This commit is contained in:
17
drizzle/0003_finalize_occurrence_deadlines.sql
Normal file
17
drizzle/0003_finalize_occurrence_deadlines.sql
Normal file
@@ -0,0 +1,17 @@
|
||||
ALTER TABLE `task_occurrences` ADD `closed_at` integer;--> statement-breakpoint
|
||||
-- Recover the state at the deadline from the first correction after it, when present.
|
||||
-- This also repairs expiry previously inferred from an uncheck made after completion.
|
||||
UPDATE task_occurrences
|
||||
SET closed_at = (SELECT ends_at FROM habit_days WHERE id = task_occurrences.day_id),
|
||||
expired_at = CASE WHEN COALESCE(
|
||||
(SELECT json_extract(e.before, '$.done') FROM progress_events e
|
||||
WHERE e.occurrence_id = task_occurrences.id
|
||||
AND e.created_at >= (SELECT ends_at FROM habit_days WHERE id = task_occurrences.day_id)
|
||||
ORDER BY e.created_at, e.id LIMIT 1), done) = 0
|
||||
THEN (SELECT ends_at FROM habit_days WHERE id = task_occurrences.day_id)
|
||||
ELSE NULL END
|
||||
WHERE day_id IN (
|
||||
SELECT d.id FROM habit_days d
|
||||
WHERE d.ends_at <= CAST(unixepoch('subsec') * 1000 AS INTEGER)
|
||||
AND d.id = (SELECT MAX(d2.id) FROM habit_days d2 WHERE d2.habit_id = d.habit_id AND d2.date = d.date)
|
||||
);
|
||||
Reference in New Issue
Block a user