I work on a system, that reminds the user about some action with an alarm.
I need to make it work by triggering some functions that select data from a database (PostgreSQL) and notify the user via FCM.
The easiest solution is to make a repeatable task, with a minimal interval, but I need to notify at the exact time, not before and not after it.
How can I do it, if the reminder datetime is stored in the database and reminders can be repeatable (store type of repeat and interval. Without next datetime)?
The Reminder
model is the following:
class Reminder(Base):
__tablename__ = 'reminders'
...
date = Column(DateTime, nullable=False)
last_reminded_at = Column(DateTime, nullable=True)
repeat_end_date = Column(DateTime, nullable=True) # None - infinite.
category = Column(Enum(ReminderCategoryEnum), nullable=False)
repeat_type = Column(
Enum(ReminderRepeatTypeEnum),
default=ReminderRepeatTypeEnum.NEVER,
server_default=ReminderRepeatTypeEnum.NEVER.name,
nullable=False,
)
repeat_interval = Column(RelativeInterval(native=True), nullable=False) # Interval
is_finished = Column(Boolean, default=False, server_default=false(), nullable=False)
is_notified = Column(Boolean, default=False, server_default=false(), nullable=False)
def __init__(self, *args, **kwargs): # noqa: D107
repeat_type: Optional[ReminderRepeatTypeEnum] = kwargs.get('repeat_type')
if 'repeat_interval' not in kwargs:
if not repeat_type:
repeat_type = ReminderRepeatTypeEnum.NEVER
self.repeat_interval = repeat_type.timedelta
super().__init__(*args, **kwargs)
@property
def previous_date(self) -> Optional[datetime.datetime]:
...
@property
def next_date(self) -> Optional[datetime.datetime]:
...