@@ -98,10 +98,13 @@ func (gdb *GormDB) AutoMigrate() error {
9898 & models.Acknowledgment {},
9999 & models.ResolvedAlert {},
100100 & mainmodels.UserColorPreference {},
101- & mainmodels.UserNotificationPreference {},
101+ // Browser notifications
102+ & models.NotificationPreference {},
102103 // Hidden alerts tables
103104 & models.UserHiddenAlert {},
104105 & models.UserHiddenRule {},
106+ // Filter presets
107+ & models.FilterPreset {},
105108 // OAuth tables
106109 & models.UserGroup {},
107110 & models.OAuthToken {},
@@ -449,56 +452,6 @@ func (gdb *GormDB) DeleteUserColorPreference(userID, preferenceID string) error
449452 return nil
450453}
451454
452- // GetUserNotificationPreference gets the notification preference for a user
453- func (gdb * GormDB ) GetUserNotificationPreference (userID string ) (* mainmodels.UserNotificationPreference , error ) {
454- var preference mainmodels.UserNotificationPreference
455- err := gdb .db .Where ("user_id = ?" , userID ).First (& preference ).Error
456-
457- if err != nil {
458- if err == gorm .ErrRecordNotFound {
459- // Return nil, nil to indicate no preference exists (not an error)
460- return nil , nil
461- }
462- return nil , fmt .Errorf ("failed to get user notification preference: %w" , err )
463- }
464-
465- return & preference , nil
466- }
467-
468- // SaveUserNotificationPreference saves or updates a user's notification preference
469- func (gdb * GormDB ) SaveUserNotificationPreference (userID string , pref * mainmodels.UserNotificationPreference ) error {
470- // Set the user ID
471- pref .UserID = userID
472-
473- // Generate ID if not set
474- if pref .ID == "" {
475- pref .ID = generateUUID ()
476- }
477-
478- // Try to find existing preference
479- var existing mainmodels.UserNotificationPreference
480- err := gdb .db .Where ("user_id = ?" , userID ).First (& existing ).Error
481-
482- if err == gorm .ErrRecordNotFound {
483- // Create new preference
484- if err := gdb .db .Create (pref ).Error ; err != nil {
485- return fmt .Errorf ("failed to create user notification preference: %w" , err )
486- }
487- log .Printf ("Created new notification preference for user %s" , userID )
488- } else if err != nil {
489- return fmt .Errorf ("failed to query existing preference: %w" , err )
490- } else {
491- // Update existing preference (keep the original ID)
492- pref .ID = existing .ID
493- if err := gdb .db .Where ("user_id = ?" , userID ).Updates (pref ).Error ; err != nil {
494- return fmt .Errorf ("failed to update user notification preference: %w" , err )
495- }
496- log .Printf ("Updated notification preference for user %s" , userID )
497- }
498-
499- return nil
500- }
501-
502455// generateUUID generates a simple UUID for database records
503456func generateUUID () string {
504457 bytes := make ([]byte , 16 )
@@ -673,3 +626,110 @@ func (gdb *GormDB) ClearUserHiddenAlerts(userID string) (int64, error) {
673626 }
674627 return result .RowsAffected , nil
675628}
629+
630+ // Filter Presets Methods
631+
632+ // CreateFilterPreset creates a new filter preset for a user
633+ func (gdb * GormDB ) CreateFilterPreset (preset * models.FilterPreset ) (* models.FilterPreset , error ) {
634+ if err := gdb .db .Create (preset ).Error ; err != nil {
635+ return nil , fmt .Errorf ("failed to create filter preset: %w" , err )
636+ }
637+ return preset , nil
638+ }
639+
640+ // GetFilterPresets gets all filter presets for a user (private + shared)
641+ func (gdb * GormDB ) GetFilterPresets (userID string , includeShared bool ) ([]models.FilterPreset , error ) {
642+ var presets []models.FilterPreset
643+
644+ query := gdb .db .Where ("user_id = ?" , userID )
645+
646+ if includeShared {
647+ // Get user's own presets + shared presets from others
648+ query = gdb .db .Where ("user_id = ? OR is_shared = ?" , userID , true )
649+ }
650+
651+ err := query .Order ("is_default DESC, created_at DESC" ).Find (& presets ).Error
652+ if err != nil {
653+ return nil , fmt .Errorf ("failed to get filter presets: %w" , err )
654+ }
655+
656+ return presets , nil
657+ }
658+
659+ // GetFilterPresetByID gets a specific filter preset by ID
660+ func (gdb * GormDB ) GetFilterPresetByID (id string ) (* models.FilterPreset , error ) {
661+ var preset models.FilterPreset
662+ err := gdb .db .Where ("id = ?" , id ).First (& preset ).Error
663+ if err != nil {
664+ return nil , err
665+ }
666+ return & preset , nil
667+ }
668+
669+ // UpdateFilterPreset updates an existing filter preset
670+ func (gdb * GormDB ) UpdateFilterPreset (preset * models.FilterPreset ) error {
671+ if err := gdb .db .Save (preset ).Error ; err != nil {
672+ return fmt .Errorf ("failed to update filter preset: %w" , err )
673+ }
674+ return nil
675+ }
676+
677+ // DeleteFilterPreset deletes a filter preset (with ownership check)
678+ func (gdb * GormDB ) DeleteFilterPreset (id , userID string ) error {
679+ result := gdb .db .Where ("id = ? AND user_id = ?" , id , userID ).Delete (& models.FilterPreset {})
680+ if result .Error != nil {
681+ return result .Error
682+ }
683+ if result .RowsAffected == 0 {
684+ return fmt .Errorf ("filter preset not found or not authorized" )
685+ }
686+ return nil
687+ }
688+
689+ // SetDefaultFilterPreset sets a filter preset as default (and unsets others)
690+ func (gdb * GormDB ) SetDefaultFilterPreset (id , userID string ) error {
691+ tx := gdb .db .Begin ()
692+ if tx .Error != nil {
693+ return tx .Error
694+ }
695+ defer func () {
696+ if r := recover (); r != nil {
697+ tx .Rollback ()
698+ }
699+ }()
700+
701+ // Unset all defaults for this user
702+ if err := tx .Model (& models.FilterPreset {}).
703+ Where ("user_id = ?" , userID ).
704+ Update ("is_default" , false ).Error ; err != nil {
705+ tx .Rollback ()
706+ return fmt .Errorf ("failed to unset existing defaults: %w" , err )
707+ }
708+
709+ // Set the new default (with ownership check)
710+ result := tx .Model (& models.FilterPreset {}).
711+ Where ("id = ? AND user_id = ?" , id , userID ).
712+ Update ("is_default" , true )
713+
714+ if result .Error != nil {
715+ tx .Rollback ()
716+ return result .Error
717+ }
718+
719+ if result .RowsAffected == 0 {
720+ tx .Rollback ()
721+ return fmt .Errorf ("filter preset not found or not authorized" )
722+ }
723+
724+ return tx .Commit ().Error
725+ }
726+
727+ // GetDefaultFilterPreset gets the default filter preset for a user
728+ func (gdb * GormDB ) GetDefaultFilterPreset (userID string ) (* models.FilterPreset , error ) {
729+ var preset models.FilterPreset
730+ err := gdb .db .Where ("user_id = ? AND is_default = ?" , userID , true ).First (& preset ).Error
731+ if err != nil {
732+ return nil , err
733+ }
734+ return & preset , nil
735+ }
0 commit comments