Skip to content
Merged
Show file tree
Hide file tree
Changes from 10 commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions changelog.d/5-internal/wpb-3915
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
Make sure cassandra updates do not re-introduce removed content (follow-up to #3504) (#3513)
6 changes: 3 additions & 3 deletions services/brig/src/Brig/API/OAuth.hs
Original file line number Diff line number Diff line change
Expand Up @@ -310,10 +310,10 @@ deleteOAuthClient' cid = retry x5 . write q $ params LocalQuorum (Identity cid)
q = "DELETE FROM oauth_client WHERE id = ?"

updateOAuthClient' :: (MonadClient m) => OAuthClientId -> OAuthApplicationName -> RedirectUrl -> m ()
updateOAuthClient' cid name uri = retry x5 . write q $ params LocalQuorum (name, uri, cid)
updateOAuthClient' cid name uri = retry x5 . void . trans q $ params LocalQuorum (name, uri, cid)
Comment thread
fisx marked this conversation as resolved.
Outdated
where
q :: PrepQuery W (OAuthApplicationName, RedirectUrl, OAuthClientId) ()
q = "UPDATE oauth_client SET name = ?, redirect_uri = ? WHERE id = ?"
q :: PrepQuery W (OAuthApplicationName, RedirectUrl, OAuthClientId) Row
q = "UPDATE oauth_client SET name = ?, redirect_uri = ? WHERE id = ? IF EXISTS"

insertOAuthClient :: (MonadClient m) => OAuthClientId -> OAuthApplicationName -> RedirectUrl -> Password -> m ()
insertOAuthClient cid name uri pw = retry x5 . write q $ params LocalQuorum (cid, name, uri, pw)
Expand Down
12 changes: 6 additions & 6 deletions services/brig/src/Brig/Data/Client.hs
Original file line number Diff line number Diff line change
Expand Up @@ -263,10 +263,10 @@ rmClient u c = do
unlessM (isJust <$> view randomPrekeyLocalLock) $ deleteOptLock u c

updateClientLabel :: MonadClient m => UserId -> ClientId -> Maybe Text -> m ()
updateClientLabel u c l = retry x5 $ write updateClientLabelQuery (params LocalQuorum (l, u, c))
updateClientLabel u c l = retry x5 . void $ trans updateClientLabelQuery (params LocalQuorum (l, u, c))

updateClientCapabilities :: MonadClient m => UserId -> ClientId -> Maybe (Imports.Set ClientCapability) -> m ()
updateClientCapabilities u c fs = retry x5 $ write updateClientCapabilitiesQuery (params LocalQuorum (C.Set . Set.toList <$> fs, u, c))
updateClientCapabilities u c fs = retry x5 . void $ trans updateClientCapabilitiesQuery (params LocalQuorum (C.Set . Set.toList <$> fs, u, c))

-- | If the update fails, which can happen if device does not exist, then ignore the error silently.
updateClientLastActive :: MonadClient m => UserId -> ClientId -> UTCTime -> m ()
Expand Down Expand Up @@ -381,11 +381,11 @@ addMLSPublicKey u c ss pk = do
insertClient :: PrepQuery W (UserId, ClientId, UTCTimeMillis, ClientType, Maybe Text, Maybe ClientClass, Maybe CookieLabel, Maybe Latitude, Maybe Longitude, Maybe Text, Maybe (C.Set ClientCapability)) ()
insertClient = "INSERT INTO clients (user, client, tstamp, type, label, class, cookie, lat, lon, model, capabilities) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)"

updateClientLabelQuery :: PrepQuery W (Maybe Text, UserId, ClientId) ()
updateClientLabelQuery = "UPDATE clients SET label = ? WHERE user = ? AND client = ?"
updateClientLabelQuery :: PrepQuery W (Maybe Text, UserId, ClientId) Row
updateClientLabelQuery = "UPDATE clients SET label = ? WHERE user = ? AND client = ? IF EXISTS"

updateClientCapabilitiesQuery :: PrepQuery W (Maybe (C.Set ClientCapability), UserId, ClientId) ()
updateClientCapabilitiesQuery = "UPDATE clients SET capabilities = ? WHERE user = ? AND client = ?"
updateClientCapabilitiesQuery :: PrepQuery W (Maybe (C.Set ClientCapability), UserId, ClientId) Row
updateClientCapabilitiesQuery = "UPDATE clients SET capabilities = ? WHERE user = ? AND client = ? IF EXISTS"

updateClientLastActiveQuery :: PrepQuery W (UTCTime, UserId, ClientId) Row
updateClientLastActiveQuery = "UPDATE clients SET last_active = ? WHERE user = ? AND client = ? IF EXISTS"
Expand Down
18 changes: 10 additions & 8 deletions services/brig/src/Brig/Data/Connection.hs
Original file line number Diff line number Diff line change
Expand Up @@ -109,11 +109,13 @@ updateConnectionStatus :: (MonadClient m) => Local UserId -> Qualified UserId ->
updateConnectionStatus self target status = do
now <- toUTCTimeMillis <$> liftIO getCurrentTime
let local (tUnqualified -> ltarget) =
write connectionUpdate $
params LocalQuorum (status, now, tUnqualified self, ltarget)
void $
trans connectionUpdate $
params LocalQuorum (status, now, tUnqualified self, ltarget)
let remote (tUntagged -> Qualified rtarget domain) =
write remoteConnectionUpdate $
params LocalQuorum (status, now, tUnqualified self, domain, rtarget)
void $
trans remoteConnectionUpdate $
params LocalQuorum (status, now, tUnqualified self, domain, rtarget)
retry x5 $ foldQualified self local remote target
pure now

Expand Down Expand Up @@ -339,8 +341,8 @@ deleteRemoteConnectionsDomain dom = do
connectionInsert :: PrepQuery W (UserId, UserId, RelationWithHistory, UTCTimeMillis, ConvId) ()
connectionInsert = "INSERT INTO connection (left, right, status, last_update, conv) VALUES (?, ?, ?, ?, ?)"

connectionUpdate :: PrepQuery W (RelationWithHistory, UTCTimeMillis, UserId, UserId) ()
connectionUpdate = "UPDATE connection SET status = ?, last_update = ? WHERE left = ? AND right = ?"
connectionUpdate :: PrepQuery W (RelationWithHistory, UTCTimeMillis, UserId, UserId) Row
Comment thread
fisx marked this conversation as resolved.
Outdated
connectionUpdate = "UPDATE connection SET status = ?, last_update = ? WHERE left = ? AND right = ? IF EXISTS"

connectionSelect :: PrepQuery R (UserId, UserId) (UserId, UserId, RelationWithHistory, UTCTimeMillis, Maybe ConvId)
connectionSelect = "SELECT left, right, status, last_update, conv FROM connection WHERE left = ? AND right = ?"
Expand Down Expand Up @@ -390,8 +392,8 @@ remoteConnectionSelect = "SELECT right_domain, right_user, status, last_update,
remoteConnectionSelectFrom :: PrepQuery R (UserId, Domain, UserId) (RelationWithHistory, UTCTimeMillis, Domain, ConvId)
remoteConnectionSelectFrom = "SELECT status, last_update, conv_domain, conv_id FROM connection_remote where left = ? AND right_domain = ? AND right_user = ?"

remoteConnectionUpdate :: PrepQuery W (RelationWithHistory, UTCTimeMillis, UserId, Domain, UserId) ()
remoteConnectionUpdate = "UPDATE connection_remote set status = ?, last_update = ? WHERE left = ? and right_domain = ? and right_user = ?"
remoteConnectionUpdate :: PrepQuery W (RelationWithHistory, UTCTimeMillis, UserId, Domain, UserId) Row
remoteConnectionUpdate = "UPDATE connection_remote set status = ?, last_update = ? WHERE left = ? and right_domain = ? and right_user = ? IF EXISTS"

remoteConnectionDelete :: PrepQuery W (UserId, Domain, UserId) ()
remoteConnectionDelete = "DELETE FROM connection_remote where left = ? AND right_domain = ? AND right_user = ?"
Expand Down
6 changes: 3 additions & 3 deletions services/brig/src/Brig/Data/MLS/KeyPackage.hs
Original file line number Diff line number Diff line change
Expand Up @@ -189,11 +189,11 @@ addKeyPackageRef :: MonadClient m => KeyPackageRef -> NewKeyPackageRef -> m ()
addKeyPackageRef ref nkpr = do
retry x5 $
write
q
upsertQuery
(params LocalQuorum (nkprClientId nkpr, qUnqualified (nkprConversation nkpr), qDomain (nkprConversation nkpr), qDomain (nkprUserId nkpr), qUnqualified (nkprUserId nkpr), ref))
where
q :: PrepQuery W (ClientId, ConvId, Domain, Domain, UserId, KeyPackageRef) x
q = "UPDATE mls_key_package_refs SET client = ?, conv = ?, conv_domain = ?, domain = ?, user = ? WHERE ref = ?"
upsertQuery :: PrepQuery W (ClientId, ConvId, Domain, Domain, UserId, KeyPackageRef) x
upsertQuery = "UPDATE mls_key_package_refs SET client = ?, conv = ?, conv_domain = ?, domain = ?, user = ? WHERE ref = ?"

-- | Update key package ref, used in Galley when commit reveals key package ref update for the sender.
-- Nothing is changed if the previous key package ref is not found in the table.
Expand Down
120 changes: 60 additions & 60 deletions services/brig/src/Brig/Data/User.hs
Original file line number Diff line number Diff line change
Expand Up @@ -281,7 +281,7 @@ insertAccount (UserAccount u status) mbConv password activated = retry x5 . batc
\VALUES (?, ?, ?, ?, ?)"

updateLocale :: MonadClient m => UserId -> Locale -> m ()
updateLocale u (Locale l c) = write userLocaleUpdate (params LocalQuorum (l, c, u))
updateLocale u (Locale l c) = void $ trans userLocaleUpdate (params LocalQuorum (l, c, u))

updateUser :: MonadClient m => UserId -> UserUpdate -> m ()
updateUser u UserUpdate {..} = retry x5 . batch $ do
Expand All @@ -293,59 +293,59 @@ updateUser u UserUpdate {..} = retry x5 . batch $ do
for_ uupAccentId $ \c -> addPrepQuery userAccentIdUpdate (c, u)

updateEmail :: MonadClient m => UserId -> Email -> m ()
updateEmail u e = retry x5 $ write userEmailUpdate (params LocalQuorum (e, u))
updateEmail u e = retry x5 . void $ trans userEmailUpdate (params LocalQuorum (e, u))

updateEmailUnvalidated :: MonadClient m => UserId -> Email -> m ()
updateEmailUnvalidated u e = retry x5 $ write userEmailUnvalidatedUpdate (params LocalQuorum (e, u))
updateEmailUnvalidated u e = retry x5 . void $ trans userEmailUnvalidatedUpdate (params LocalQuorum (e, u))

updatePhone :: MonadClient m => UserId -> Phone -> m ()
updatePhone u p = retry x5 $ write userPhoneUpdate (params LocalQuorum (p, u))
updatePhone u p = retry x5 . void $ trans userPhoneUpdate (params LocalQuorum (p, u))

updateSSOId :: MonadClient m => UserId -> Maybe UserSSOId -> m Bool
updateSSOId u ssoid = do
mteamid <- lookupUserTeam u
case mteamid of
Just _ -> do
retry x5 $ write userSSOIdUpdate (params LocalQuorum (ssoid, u))
retry x5 . void $ trans userSSOIdUpdate (params LocalQuorum (ssoid, u))
pure True
Nothing -> pure False

updateManagedBy :: MonadClient m => UserId -> ManagedBy -> m ()
updateManagedBy u h = retry x5 $ write userManagedByUpdate (params LocalQuorum (h, u))
updateManagedBy u h = retry x5 . void $ trans userManagedByUpdate (params LocalQuorum (h, u))

updateHandle :: MonadClient m => UserId -> Handle -> m ()
updateHandle u h = retry x5 $ write userHandleUpdate (params LocalQuorum (h, u))
updateHandle u h = retry x5 . void $ trans userHandleUpdate (params LocalQuorum (h, u))

updateSupportedProtocols :: MonadClient m => UserId -> Set BaseProtocolTag -> m ()
updateSupportedProtocols u prots =
retry x5 $
write userSupportedProtocolUpdate (params LocalQuorum (prots, u))
retry x5 . void $
trans userSupportedProtocolUpdate (params LocalQuorum (prots, u))

updatePassword :: MonadClient m => UserId -> PlainTextPassword8 -> m ()
updatePassword u t = do
p <- liftIO $ mkSafePassword t
retry x5 $ write userPasswordUpdate (params LocalQuorum (p, u))
retry x5 . void $ trans userPasswordUpdate (params LocalQuorum (p, u))

updateRichInfo :: MonadClient m => UserId -> RichInfoAssocList -> m ()
updateRichInfo u ri = retry x5 $ write userRichInfoUpdate (params LocalQuorum (ri, u))
updateRichInfo u ri = retry x5 . void $ trans userRichInfoUpdate (params LocalQuorum (ri, u))

updateFeatureConferenceCalling :: MonadClient m => UserId -> Maybe (ApiFt.WithStatusNoLock ApiFt.ConferenceCallingConfig) -> m (Maybe (ApiFt.WithStatusNoLock ApiFt.ConferenceCallingConfig))
updateFeatureConferenceCalling uid mbStatus = do
let flag = ApiFt.wssStatus <$> mbStatus
retry x5 $ write update (params LocalQuorum (flag, uid))
retry x5 . void $ trans update (params LocalQuorum (flag, uid))
pure mbStatus
where
update :: PrepQuery W (Maybe ApiFt.FeatureStatus, UserId) ()
update = fromString "update user set feature_conference_calling = ? where id = ?"
update :: PrepQuery W (Maybe ApiFt.FeatureStatus, UserId) Row
update = fromString "update user set feature_conference_calling = ? where id = ? if exists"

deleteEmail :: MonadClient m => UserId -> m ()
deleteEmail u = retry x5 $ write userEmailDelete (params LocalQuorum (Identity u))
deleteEmail u = retry x5 . void $ trans userEmailDelete (params LocalQuorum (Identity u))

deleteEmailUnvalidated :: MonadClient m => UserId -> m ()
deleteEmailUnvalidated u = retry x5 $ write userEmailUnvalidatedDelete (params LocalQuorum (Identity u))
deleteEmailUnvalidated u = retry x5 . void $ trans userEmailUnvalidatedDelete (params LocalQuorum (Identity u))

deletePhone :: MonadClient m => UserId -> m ()
deletePhone u = retry x5 $ write userPhoneDelete (params LocalQuorum (Identity u))
deletePhone u = retry x5 . void $ trans userPhoneDelete (params LocalQuorum (Identity u))

deleteServiceUser :: MonadClient m => ProviderId -> ServiceId -> BotId -> m ()
deleteServiceUser pid sid bid = do
Expand All @@ -369,7 +369,7 @@ deleteServiceUser pid sid bid = do

updateStatus :: MonadClient m => UserId -> AccountStatus -> m ()
updateStatus u s =
retry x5 $ write userStatusUpdate (params LocalQuorum (s, u))
retry x5 . void $ trans userStatusUpdate (params LocalQuorum (s, u))

userExists :: MonadClient m => UserId -> m Bool
userExists uid = isJust <$> retry x1 (query1 idSelect (params LocalQuorum (Identity uid)))
Expand Down Expand Up @@ -397,11 +397,11 @@ activateUser :: MonadClient m => UserId -> UserIdentity -> m ()
activateUser u ident = do
let email = emailIdentity ident
let phone = phoneIdentity ident
retry x5 $ write userActivatedUpdate (params LocalQuorum (email, phone, u))
retry x5 . void $ trans userActivatedUpdate (params LocalQuorum (email, phone, u))

deactivateUser :: MonadClient m => UserId -> m ()
deactivateUser u =
retry x5 $ write userDeactivatedUpdate (params LocalQuorum (Identity u))
retry x5 . void $ trans userDeactivatedUpdate (params LocalQuorum (Identity u))

lookupLocale :: (MonadClient m, MonadReader Env m) => UserId -> m (Maybe Locale)
lookupLocale u = do
Expand Down Expand Up @@ -621,65 +621,65 @@ userInsert =
\country, provider, service, handle, team, managed_by, supported_protocols) \
\VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)"

userDisplayNameUpdate :: PrepQuery W (Name, UserId) ()
userDisplayNameUpdate = "UPDATE user SET name = ? WHERE id = ?"
userDisplayNameUpdate :: PrepQuery W (Name, UserId) Row
userDisplayNameUpdate = "UPDATE user SET name = ? WHERE id = ? IF EXISTS"

userPictUpdate :: PrepQuery W (Pict, UserId) ()
userPictUpdate = "UPDATE user SET picture = ? WHERE id = ?"
userPictUpdate :: PrepQuery W (Pict, UserId) Row
userPictUpdate = "UPDATE user SET picture = ? WHERE id = ? IF EXISTS"

userAssetsUpdate :: PrepQuery W ([Asset], UserId) ()
userAssetsUpdate = "UPDATE user SET assets = ? WHERE id = ?"
userAssetsUpdate :: PrepQuery W ([Asset], UserId) Row
userAssetsUpdate = "UPDATE user SET assets = ? WHERE id = ? IF EXISTS"

userAccentIdUpdate :: PrepQuery W (ColourId, UserId) ()
userAccentIdUpdate = "UPDATE user SET accent_id = ? WHERE id = ?"
userAccentIdUpdate :: PrepQuery W (ColourId, UserId) Row
userAccentIdUpdate = "UPDATE user SET accent_id = ? WHERE id = ? IF EXISTS"

userEmailUpdate :: PrepQuery W (Email, UserId) ()
userEmailUpdate = "UPDATE user SET email = ? WHERE id = ?"
userEmailUpdate :: PrepQuery W (Email, UserId) Row
userEmailUpdate = "UPDATE user SET email = ? WHERE id = ? IF EXISTS"

userEmailUnvalidatedUpdate :: PrepQuery W (Email, UserId) ()
userEmailUnvalidatedUpdate = "UPDATE user SET email_unvalidated = ? WHERE id = ?"
userEmailUnvalidatedUpdate :: PrepQuery W (Email, UserId) Row
userEmailUnvalidatedUpdate = "UPDATE user SET email_unvalidated = ? WHERE id = ? IF EXISTS"

userEmailUnvalidatedDelete :: PrepQuery W (Identity UserId) ()
userEmailUnvalidatedDelete = "UPDATE user SET email_unvalidated = null WHERE id = ?"
userEmailUnvalidatedDelete :: PrepQuery W (Identity UserId) Row
userEmailUnvalidatedDelete = "UPDATE user SET email_unvalidated = null WHERE id = ? IF EXISTS"

userPhoneUpdate :: PrepQuery W (Phone, UserId) ()
userPhoneUpdate = "UPDATE user SET phone = ? WHERE id = ?"
userPhoneUpdate :: PrepQuery W (Phone, UserId) Row
userPhoneUpdate = "UPDATE user SET phone = ? WHERE id = ? IF EXISTS"

userSSOIdUpdate :: PrepQuery W (Maybe UserSSOId, UserId) ()
userSSOIdUpdate = "UPDATE user SET sso_id = ? WHERE id = ?"
userSSOIdUpdate :: PrepQuery W (Maybe UserSSOId, UserId) Row
userSSOIdUpdate = "UPDATE user SET sso_id = ? WHERE id = ? IF EXISTS"

userManagedByUpdate :: PrepQuery W (ManagedBy, UserId) ()
userManagedByUpdate = "UPDATE user SET managed_by = ? WHERE id = ?"
userManagedByUpdate :: PrepQuery W (ManagedBy, UserId) Row
userManagedByUpdate = "UPDATE user SET managed_by = ? WHERE id = ? IF EXISTS"

userHandleUpdate :: PrepQuery W (Handle, UserId) ()
userHandleUpdate = "UPDATE user SET handle = ? WHERE id = ?"
userHandleUpdate :: PrepQuery W (Handle, UserId) Row
userHandleUpdate = "UPDATE user SET handle = ? WHERE id = ? IF EXISTS"

userSupportedProtocolUpdate :: PrepQuery W (Set BaseProtocolTag, UserId) ()
userSupportedProtocolUpdate = "UPDATE user SET supported_protocols = ? WHERE id = ?"
userSupportedProtocolUpdate :: PrepQuery W (Set BaseProtocolTag, UserId) Row
userSupportedProtocolUpdate = "UPDATE user SET supported_protocols = ? WHERE id = ? IF EXISTS"

userPasswordUpdate :: PrepQuery W (Password, UserId) ()
userPasswordUpdate = "UPDATE user SET password = ? WHERE id = ?"
userPasswordUpdate :: PrepQuery W (Password, UserId) Row
userPasswordUpdate = "UPDATE user SET password = ? WHERE id = ? IF EXISTS"

userStatusUpdate :: PrepQuery W (AccountStatus, UserId) ()
userStatusUpdate = "UPDATE user SET status = ? WHERE id = ?"
userStatusUpdate :: PrepQuery W (AccountStatus, UserId) Row
userStatusUpdate = "UPDATE user SET status = ? WHERE id = ? IF EXISTS"

userDeactivatedUpdate :: PrepQuery W (Identity UserId) ()
userDeactivatedUpdate = "UPDATE user SET activated = false WHERE id = ?"
userDeactivatedUpdate :: PrepQuery W (Identity UserId) Row
userDeactivatedUpdate = "UPDATE user SET activated = false WHERE id = ? IF EXISTS"

userActivatedUpdate :: PrepQuery W (Maybe Email, Maybe Phone, UserId) ()
userActivatedUpdate = "UPDATE user SET activated = true, email = ?, phone = ? WHERE id = ?"
userActivatedUpdate :: PrepQuery W (Maybe Email, Maybe Phone, UserId) Row
userActivatedUpdate = "UPDATE user SET activated = true, email = ?, phone = ? WHERE id = ? IF EXISTS"

userLocaleUpdate :: PrepQuery W (Language, Maybe Country, UserId) ()
userLocaleUpdate = "UPDATE user SET language = ?, country = ? WHERE id = ?"
userLocaleUpdate :: PrepQuery W (Language, Maybe Country, UserId) Row
userLocaleUpdate = "UPDATE user SET language = ?, country = ? WHERE id = ? IF EXISTS"

userEmailDelete :: PrepQuery W (Identity UserId) ()
userEmailDelete = "UPDATE user SET email = null WHERE id = ?"
userEmailDelete :: PrepQuery W (Identity UserId) Row
userEmailDelete = "UPDATE user SET email = null WHERE id = ? IF EXISTS"

userPhoneDelete :: PrepQuery W (Identity UserId) ()
userPhoneDelete = "UPDATE user SET phone = null WHERE id = ?"
userPhoneDelete :: PrepQuery W (Identity UserId) Row
userPhoneDelete = "UPDATE user SET phone = null WHERE id = ? IF EXISTS"

userRichInfoUpdate :: PrepQuery W (RichInfoAssocList, UserId) ()
userRichInfoUpdate = "UPDATE rich_info SET json = ? WHERE user = ?"
userRichInfoUpdate :: PrepQuery W (RichInfoAssocList, UserId) Row
userRichInfoUpdate = "UPDATE rich_info SET json = ? WHERE user = ? IF EXISTS"

-------------------------------------------------------------------------------
-- Conversions
Expand Down
Loading