package service // NotificationSettingService provides business logic for notification settings. // Reference: Chatwoot NotificationSettingsController — show + update import ( "context" "github.com/gochat/gochat/internal/model" "github.com/gochat/gochat/internal/repository" ) // NotificationSettingService handles notification setting operations. type NotificationSettingService struct { repo *repository.NotificationSettingRepo } // NewNotificationSettingService creates a new service instance. func NewNotificationSettingService(repo *repository.NotificationSettingRepo) *NotificationSettingService { return &NotificationSettingService{repo: repo} } // UpdateNotificationSettingRequest is the DTO for updating notification settings. // Reference: Chatwoot `params.require(:notification_settings).permit(selected_email_flags: [], selected_push_flags: [])` type UpdateNotificationSettingRequest struct { SelectedEmailFlags []string `json:"selected_email_flags"` SelectedPushFlags []string `json:"selected_push_flags"` } // Get retrieves the notification setting for a user in an account. // Reference: Chatwoot show action — loads setting via find_by(account_id, user_id) func (s *NotificationSettingService) Get(ctx context.Context, accountID, userID uint) (*model.NotificationSetting, error) { ns, err := s.repo.FindByAccountAndUser(accountID, userID) if err != nil { // If no setting exists, return default (all flags enabled) return &model.NotificationSetting{ AccountID: accountID, UserID: userID, EmailFlags: model.AllEmailFlags(), PushFlags: model.AllPushFlags(), }, nil } return ns, nil } // Update modifies notification settings for a user in an account. // Reference: Chatwoot update action — updates email_flags and push_flags bitmask from selected flags func (s *NotificationSettingService) Update(ctx context.Context, accountID, userID uint, req UpdateNotificationSettingRequest) (*model.NotificationSetting, error) { // Find existing or create default ns, err := s.repo.FindByAccountAndUser(accountID, userID) if err != nil { // Create new setting ns = &model.NotificationSetting{ AccountID: accountID, UserID: userID, } } // Update flags from request ns.SetEmailFlagsFromNames(req.SelectedEmailFlags) ns.SetPushFlagsFromNames(req.SelectedPushFlags) if ns.ID == 0 { return s.repo.Create(ns) } return s.repo.Update(ns) }