github.com/status-im/status-go@v1.1.0/multiaccounts/settings_notifications/database.go (about)

     1  package notificationssettings
     2  
     3  import (
     4  	"database/sql"
     5  	"fmt"
     6  )
     7  
     8  type settingType int
     9  
    10  const (
    11  	stringType settingType = iota
    12  	integerType
    13  	boolType
    14  )
    15  
    16  // Columns' names
    17  type column string
    18  
    19  const (
    20  	columnTextValue          column = "text_value"
    21  	columnIntValue           column = "int_value"
    22  	columnBoolValue          column = "bool_value"
    23  	columnExMuteAllMessages  column = "ex_mute_all_messages"
    24  	columnExPersonalMentions column = "ex_personal_mentions"
    25  	columnExGlobalMentions   column = "ex_global_mentions"
    26  	columnExOtherMessages    column = "ex_other_messages"
    27  )
    28  
    29  // Static ids we use for notifications settings
    30  const (
    31  	keyAllowNotifications           = "AllowNotifications"
    32  	keyOneToOneChats                = "OneToOneChats"
    33  	keyGroupChats                   = "GroupChats"
    34  	keyPersonalMentions             = "PersonalMentions"
    35  	keyGlobalMentions               = "GlobalMentions"
    36  	keyAllMessages                  = "AllMessages"
    37  	keyContactRequests              = "ContactRequests"
    38  	keyIdentityVerificationRequests = "IdentityVerificationRequests"
    39  	keySoundEnabled                 = "SoundEnabled"
    40  	keyVolume                       = "Volume"
    41  	keyMessagePreview               = "MessagePreview"
    42  )
    43  
    44  // Possible values
    45  const (
    46  	valueSendAlerts = "SendAlerts"
    47  	//valueDeliverQuietly = "DeliverQuietly"  // currently unused
    48  	valueTurnOff = "TurnOff"
    49  )
    50  
    51  // Default values
    52  const (
    53  	defaultAllowNotificationsValue           = true
    54  	defaultOneToOneChatsValue                = valueSendAlerts
    55  	defaultGroupChatsValue                   = valueSendAlerts
    56  	defaultPersonalMentionsValue             = valueSendAlerts
    57  	defaultGlobalMentionsValue               = valueSendAlerts
    58  	defaultAllMessagesValue                  = valueTurnOff
    59  	defaultContactRequestsValue              = valueSendAlerts
    60  	defaultIdentityVerificationRequestsValue = valueSendAlerts
    61  	defaultSoundEnabledValue                 = true
    62  	defaultVolumeValue                       = 50
    63  	defaultMessagePreviewValue               = 2
    64  	defaultExMuteAllMessagesValue            = false
    65  	defaultExPersonalMentionsValue           = valueSendAlerts
    66  	defaultExGlobalMentionsValue             = valueSendAlerts
    67  	defaultExOtherMessagesValue              = valueTurnOff
    68  )
    69  
    70  type NotificationsSettings struct {
    71  	db *sql.DB
    72  }
    73  
    74  func NewNotificationsSettings(db *sql.DB) *NotificationsSettings {
    75  	return &NotificationsSettings{
    76  		db: db,
    77  	}
    78  }
    79  
    80  func (ns *NotificationsSettings) buildSelectQuery(column column) string {
    81  	return fmt.Sprintf("SELECT %s FROM notifications_settings WHERE id = ?", column)
    82  }
    83  
    84  func (ns *NotificationsSettings) buildInsertOrUpdateQuery(isExemption bool, settingType settingType) string {
    85  	var values string
    86  	if isExemption {
    87  		values = "VALUES(?, 1, NULL, NULL, NULL, ?, ?, ?, ?)"
    88  	} else {
    89  		switch settingType {
    90  		case stringType:
    91  			values = "VALUES(?, 0, ?, NULL, NULL, NULL, NULL, NULL, NULL)"
    92  		case integerType:
    93  			values = "VALUES(?, 0, NULL, ?, NULL, NULL, NULL, NULL, NULL)"
    94  		case boolType:
    95  			values = "VALUES(?, 0, NULL, NULL, ?, NULL, NULL, NULL, NULL)"
    96  		}
    97  	}
    98  
    99  	return fmt.Sprintf(`INSERT INTO notifications_settings (
   100  		id, 
   101  		exemption, 
   102  		text_value, 
   103  		int_value, 
   104  		bool_value, 
   105  		ex_mute_all_messages, 
   106  		ex_personal_mentions,
   107  		ex_global_mentions,
   108  		ex_other_messages) 
   109  		%s;`, values)
   110  }
   111  
   112  // Non exemption settings
   113  func (ns *NotificationsSettings) GetAllowNotifications() (result bool, err error) {
   114  	err = ns.db.QueryRow(ns.buildSelectQuery(columnBoolValue), keyAllowNotifications).Scan(&result)
   115  	if err != nil && err == sql.ErrNoRows {
   116  		return defaultAllowNotificationsValue, err
   117  	}
   118  	return result, err
   119  }
   120  
   121  func (ns *NotificationsSettings) SetAllowNotifications(value bool) error {
   122  	_, err := ns.db.Exec(ns.buildInsertOrUpdateQuery(false, boolType), keyAllowNotifications, value, value)
   123  	return err
   124  }
   125  
   126  func (ns *NotificationsSettings) GetOneToOneChats() (result string, err error) {
   127  	err = ns.db.QueryRow(ns.buildSelectQuery(columnTextValue), keyOneToOneChats).Scan(&result)
   128  	if err != nil && err == sql.ErrNoRows {
   129  		return defaultOneToOneChatsValue, err
   130  	}
   131  	return result, err
   132  }
   133  
   134  func (ns *NotificationsSettings) SetOneToOneChats(value string) error {
   135  	_, err := ns.db.Exec(ns.buildInsertOrUpdateQuery(false, stringType), keyOneToOneChats, value, value)
   136  	return err
   137  }
   138  
   139  func (ns *NotificationsSettings) GetGroupChats() (result string, err error) {
   140  	err = ns.db.QueryRow(ns.buildSelectQuery(columnTextValue), keyGroupChats).Scan(&result)
   141  	if err != nil && err == sql.ErrNoRows {
   142  		return defaultGroupChatsValue, err
   143  	}
   144  	return result, err
   145  }
   146  
   147  func (ns *NotificationsSettings) SetGroupChats(value string) error {
   148  	_, err := ns.db.Exec(ns.buildInsertOrUpdateQuery(false, stringType), keyGroupChats, value, value)
   149  	return err
   150  }
   151  
   152  func (ns *NotificationsSettings) GetPersonalMentions() (result string, err error) {
   153  	err = ns.db.QueryRow(ns.buildSelectQuery(columnTextValue), keyPersonalMentions).Scan(&result)
   154  	if err != nil && err == sql.ErrNoRows {
   155  		return defaultPersonalMentionsValue, err
   156  	}
   157  	return result, err
   158  }
   159  
   160  func (ns *NotificationsSettings) SetPersonalMentions(value string) error {
   161  	_, err := ns.db.Exec(ns.buildInsertOrUpdateQuery(false, stringType), keyPersonalMentions, value, value)
   162  	return err
   163  }
   164  
   165  func (ns *NotificationsSettings) GetGlobalMentions() (result string, err error) {
   166  	err = ns.db.QueryRow(ns.buildSelectQuery(columnTextValue), keyGlobalMentions).Scan(&result)
   167  	if err != nil && err == sql.ErrNoRows {
   168  		return defaultGlobalMentionsValue, err
   169  	}
   170  	return result, err
   171  }
   172  
   173  func (ns *NotificationsSettings) SetGlobalMentions(value string) error {
   174  	_, err := ns.db.Exec(ns.buildInsertOrUpdateQuery(false, stringType), keyGlobalMentions, value, value)
   175  	return err
   176  }
   177  
   178  func (ns *NotificationsSettings) GetAllMessages() (result string, err error) {
   179  	err = ns.db.QueryRow(ns.buildSelectQuery(columnTextValue), keyAllMessages).Scan(&result)
   180  	if err != nil && err == sql.ErrNoRows {
   181  		return defaultAllMessagesValue, err
   182  	}
   183  	return result, err
   184  }
   185  
   186  func (ns *NotificationsSettings) SetAllMessages(value string) error {
   187  	_, err := ns.db.Exec(ns.buildInsertOrUpdateQuery(false, stringType), keyAllMessages, value, value)
   188  	return err
   189  }
   190  
   191  func (ns *NotificationsSettings) GetContactRequests() (result string, err error) {
   192  	err = ns.db.QueryRow(ns.buildSelectQuery(columnTextValue), keyContactRequests).Scan(&result)
   193  	if err != nil && err == sql.ErrNoRows {
   194  		return defaultContactRequestsValue, err
   195  	}
   196  	return result, err
   197  }
   198  
   199  func (ns *NotificationsSettings) SetContactRequests(value string) error {
   200  	_, err := ns.db.Exec(ns.buildInsertOrUpdateQuery(false, stringType), keyContactRequests, value, value)
   201  	return err
   202  }
   203  
   204  func (ns *NotificationsSettings) GetIdentityVerificationRequests() (result string, err error) {
   205  	err = ns.db.QueryRow(ns.buildSelectQuery(columnTextValue), keyIdentityVerificationRequests).Scan(&result)
   206  	if err != nil && err == sql.ErrNoRows {
   207  		return defaultIdentityVerificationRequestsValue, err
   208  	}
   209  	return result, err
   210  }
   211  
   212  func (ns *NotificationsSettings) SetIdentityVerificationRequests(value string) error {
   213  	_, err := ns.db.Exec(ns.buildInsertOrUpdateQuery(false, stringType), keyIdentityVerificationRequests, value, value)
   214  	return err
   215  }
   216  
   217  func (ns *NotificationsSettings) GetSoundEnabled() (result bool, err error) {
   218  	err = ns.db.QueryRow(ns.buildSelectQuery(columnBoolValue), keySoundEnabled).Scan(&result)
   219  	if err != nil && err == sql.ErrNoRows {
   220  		return defaultSoundEnabledValue, err
   221  	}
   222  	return result, err
   223  }
   224  
   225  func (ns *NotificationsSettings) SetSoundEnabled(value bool) error {
   226  	_, err := ns.db.Exec(ns.buildInsertOrUpdateQuery(false, boolType), keySoundEnabled, value, value)
   227  	return err
   228  }
   229  
   230  func (ns *NotificationsSettings) GetVolume() (result int, err error) {
   231  	err = ns.db.QueryRow(ns.buildSelectQuery(columnIntValue), keyVolume).Scan(&result)
   232  	if err != nil && err == sql.ErrNoRows {
   233  		return defaultVolumeValue, err
   234  	}
   235  	return result, err
   236  }
   237  
   238  func (ns *NotificationsSettings) SetVolume(value int) error {
   239  	_, err := ns.db.Exec(ns.buildInsertOrUpdateQuery(false, integerType), keyVolume, value, value)
   240  	return err
   241  }
   242  
   243  func (ns *NotificationsSettings) GetMessagePreview() (result int, err error) {
   244  	err = ns.db.QueryRow(ns.buildSelectQuery(columnIntValue), keyMessagePreview).Scan(&result)
   245  	if err != nil && err == sql.ErrNoRows {
   246  		return defaultMessagePreviewValue, err
   247  	}
   248  	return result, err
   249  }
   250  
   251  func (ns *NotificationsSettings) SetMessagePreview(value int) error {
   252  	_, err := ns.db.Exec(ns.buildInsertOrUpdateQuery(false, integerType), keyMessagePreview, value, value)
   253  	return err
   254  }
   255  
   256  // Exemption settings
   257  func (ns *NotificationsSettings) GetExMuteAllMessages(id string) (result bool, err error) {
   258  	err = ns.db.QueryRow(ns.buildSelectQuery(columnExMuteAllMessages), id).Scan(&result)
   259  	if err != nil && err == sql.ErrNoRows {
   260  		return defaultExMuteAllMessagesValue, nil
   261  	}
   262  	return result, err
   263  }
   264  
   265  func (ns *NotificationsSettings) GetExPersonalMentions(id string) (result string, err error) {
   266  	err = ns.db.QueryRow(ns.buildSelectQuery(columnExPersonalMentions), id).Scan(&result)
   267  	if err != nil && err == sql.ErrNoRows {
   268  		return defaultExPersonalMentionsValue, nil
   269  	}
   270  	return result, err
   271  }
   272  
   273  func (ns *NotificationsSettings) GetExGlobalMentions(id string) (result string, err error) {
   274  	err = ns.db.QueryRow(ns.buildSelectQuery(columnExGlobalMentions), id).Scan(&result)
   275  	if err != nil && err == sql.ErrNoRows {
   276  		return defaultExGlobalMentionsValue, nil
   277  	}
   278  	return result, err
   279  }
   280  
   281  func (ns *NotificationsSettings) GetExOtherMessages(id string) (result string, err error) {
   282  	err = ns.db.QueryRow(ns.buildSelectQuery(columnExOtherMessages), id).Scan(&result)
   283  	if err != nil && err == sql.ErrNoRows {
   284  		return defaultExOtherMessagesValue, nil
   285  	}
   286  	return result, err
   287  }
   288  
   289  func (ns *NotificationsSettings) SetExemptions(id string, muteAllMessages bool, personalMentions string,
   290  	globalMentions string, otherMessages string) error {
   291  	_, err := ns.db.Exec(ns.buildInsertOrUpdateQuery(true, stringType), id, muteAllMessages, personalMentions, globalMentions,
   292  		otherMessages)
   293  	return err
   294  }
   295  
   296  func (ns *NotificationsSettings) DeleteExemptions(id string) error {
   297  	switch id {
   298  	case
   299  		keyAllowNotifications,
   300  		keyOneToOneChats,
   301  		keyGroupChats,
   302  		keyPersonalMentions,
   303  		keyGlobalMentions,
   304  		keyAllMessages,
   305  		keyContactRequests,
   306  		keyIdentityVerificationRequests,
   307  		keySoundEnabled,
   308  		keyVolume,
   309  		keyMessagePreview:
   310  		return fmt.Errorf("%s, static notifications settings cannot be deleted", id)
   311  	}
   312  
   313  	_, err := ns.db.Exec("DELETE FROM notifications_settings WHERE id = ?", id)
   314  	return err
   315  }