notify: moved events, added steps, and the deadline tickers #101
No reviewers
Labels
No labels
adr
android
area/calendar
area/design-system
area/i18n
area/jobs
area/offline
area/server
area/testing
bug
ci
duplicate
enhancement
help wanted
invalid
notifications
question
reliability
security
severity/low
severity/medium
tracking
web
wontfix
No milestone
No project
No assignees
2 participants
Notifications
Due date
No due date set.
Dependencies
No dependencies set
Reference
eagraiclainne/app!101
Loading…
Reference in a new issue
No description provided.
Delete branch "feat/notify-kinds-and-reminders"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
Four backlog items from the #100 plan, shipped as one stack — the three notification kinds ride the PR #90 pattern, and the reminder-ticker seam lands under the job-deadline work that needed it.
EVENT_MOVED (closes #94).
EventService/Updatediffs the event's when — start, end, all-day, daily-times — inside the locked apply and rings the event's members only when that changed. Cosmetic edits (name, description, location, guests) stay silent. The new start is rendered in the request's zone: date and 24-hour clock, date alone for all-day events.STEP_ADDED (closes #93).
ItemService/Createwith aparent_uidrings the parent job's owner when someone else adds the step. One banner per step, no dedup window, as decided — at family scale the noise is the feature. The actor guard sits in the handler, so an owner adding their own steps never reaches the notifier or the webhook decorator.Reminder ticker seam (closes #97). The meal reminder's sleep/claim/fire loop moves to
internal/notify/ticker.go: the seam owns the pacing (one-hour sleep cap so zone edits and DST transitions are absorbed, one-minute floor, retry pause on a zero next-fire) and schedules on arbitrary instants, per the #98 decision. The claim stays with each consumer — a locked compare-and-set on its own row, bookkeeping without a mutation entry. The meal reminder is the first consumer, behavior unchanged, existing specs untouched.JOB_DUE + JOB_OVERDUE (closes #91, closes #99). The second ticker consumer scans open standalone jobs: the day-of nudge rings on the deadline's own local date (the RFC 3339 string carries its offset), and the overdue nag rings every day the job stays open after — separately mutable, so muting the nag keeps the day-of nudge. An owned job rings its owner; an unassigned job with a deadline rings everyone, so someone can pick it up. Firings are claimed per job per day on the new
Item.due_reminder_sentfield, the same bookkeeping shape asMealRota.reminder_last_sent.Every kind carries the full plumbing: proto enum, notify method, en+ga messages, webhook decorator, web push-preference checkbox +
PUSH_KINDSentry, Android channel + string catalogs.make checkand the Android unit tests are green on every commit, and each behavior was verified against the live deploy (moved/cosmetic split, step-added both directions, due broadcast and overdue nag on a booted ticker).Test report
Coverage: 27.8%
Updated by the check workflow · commit
977c3681d6Android test report
Updated by the android workflow · commit
977c3681d6