feat: notification enhancement

This commit is contained in:
Krispire Admin
2026-06-11 00:31:35 +05:30
parent cb62adf2de
commit 187bcd1442
11 changed files with 441 additions and 79 deletions
+30 -4
View File
@@ -50,27 +50,53 @@ const (
type ReminderService struct {
repo *repository.ReminderRepo
prefs *repository.NotificationPrefsRepo
notif *NotificationService
logger *zap.Logger
sadhnaURL string
}
func NewReminderService(repo *repository.ReminderRepo, notif *NotificationService, logger *zap.Logger, frontendURL string) *ReminderService {
func NewReminderService(repo *repository.ReminderRepo, prefs *repository.NotificationPrefsRepo, notif *NotificationService, logger *zap.Logger, frontendURL string) *ReminderService {
return &ReminderService{
repo: repo,
prefs: prefs,
notif: notif,
logger: logger,
sadhnaURL: strings.TrimRight(frontendURL, "/") + "/sadhna-streak",
}
}
// Enabled / SetEnabled / SetTimezone back the settings + tz-capture endpoints.
// Enabled / SetEnabled back the legacy all-or-nothing reminder toggle — now a
// shim over the per-kind/channel prefs (dual-writing the legacy users column)
// so old clients and the new matrix stay consistent. "Enabled" means at least
// one reminder kind × channel cell is still on.
func (s *ReminderService) Enabled(ctx context.Context, userID string) (bool, error) {
return s.repo.GetEnabled(ctx, userID)
off, err := s.prefs.DisabledSet(ctx, userID)
if err != nil {
return false, err
}
for _, kind := range PrefCategories["sadhna_reminders"] {
for _, ch := range PrefChannels {
if _, disabled := off[repository.PrefKey(kind, ch)]; !disabled {
return true, nil
}
}
}
return false, nil
}
func (s *ReminderService) SetEnabled(ctx context.Context, userID string, enabled bool) error {
return s.repo.SetEnabled(ctx, userID, enabled)
kinds := PrefCategories["sadhna_reminders"]
var err error
if enabled {
err = s.prefs.Enable(ctx, userID, kinds, PrefChannels)
} else {
err = s.prefs.Disable(ctx, userID, kinds, PrefChannels)
}
if err != nil {
return err
}
return s.prefs.SyncLegacyColumns(ctx, userID)
}
// SetTimezone validates the IANA zone before storing so a bad value can never