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 }