mirror of
https://github.com/element-hq/synapse.git
synced 2024-11-24 10:35:46 +03:00
Kill the 'state' presence key in DB, name it 'presence' instead to match the over-the-wire API
This commit is contained in:
parent
cda31fb755
commit
b8906b0ea8
8 changed files with 59 additions and 28 deletions
|
@ -57,7 +57,7 @@ SCHEMAS = [
|
||||||
|
|
||||||
# Remember to update this number every time an incompatible change is made to
|
# Remember to update this number every time an incompatible change is made to
|
||||||
# database schema files, so the users will be informed on server restarts.
|
# database schema files, so the users will be informed on server restarts.
|
||||||
SCHEMA_VERSION = 2
|
SCHEMA_VERSION = 3
|
||||||
|
|
||||||
|
|
||||||
class SynapseHomeServer(HomeServer):
|
class SynapseHomeServer(HomeServer):
|
||||||
|
|
|
@ -180,7 +180,6 @@ class PresenceHandler(BaseHandler):
|
||||||
state = yield self.store.get_presence_state(target_user.localpart)
|
state = yield self.store.get_presence_state(target_user.localpart)
|
||||||
if "mtime" in state:
|
if "mtime" in state:
|
||||||
del state["mtime"]
|
del state["mtime"]
|
||||||
state["presence"] = state.pop("state")
|
|
||||||
|
|
||||||
if target_user in self._user_cachemap:
|
if target_user in self._user_cachemap:
|
||||||
state["last_active"] = (
|
state["last_active"] = (
|
||||||
|
@ -227,7 +226,6 @@ class PresenceHandler(BaseHandler):
|
||||||
target_user.localpart, state["presence"])
|
target_user.localpart, state["presence"])
|
||||||
|
|
||||||
state_to_store = dict(state)
|
state_to_store = dict(state)
|
||||||
state_to_store["state"] = state_to_store.pop("presence")
|
|
||||||
|
|
||||||
statuscache=self._get_or_offline_usercache(target_user)
|
statuscache=self._get_or_offline_usercache(target_user)
|
||||||
was_level = self.STATE_LEVELS[statuscache.get_state()["presence"]]
|
was_level = self.STATE_LEVELS[statuscache.get_state()["presence"]]
|
||||||
|
@ -596,7 +594,6 @@ class PresenceHandler(BaseHandler):
|
||||||
if state is None:
|
if state is None:
|
||||||
state = yield self.store.get_presence_state(user.localpart)
|
state = yield self.store.get_presence_state(user.localpart)
|
||||||
del state["mtime"]
|
del state["mtime"]
|
||||||
state["presence"] = state.pop("state")
|
|
||||||
|
|
||||||
if user in self._user_cachemap:
|
if user in self._user_cachemap:
|
||||||
state["last_active"] = (
|
state["last_active"] = (
|
||||||
|
|
|
@ -35,17 +35,17 @@ class PresenceStore(SQLBaseStore):
|
||||||
return self._simple_select_one(
|
return self._simple_select_one(
|
||||||
table="presence",
|
table="presence",
|
||||||
keyvalues={"user_id": user_localpart},
|
keyvalues={"user_id": user_localpart},
|
||||||
retcols=["state", "status_msg", "mtime"],
|
retcols=["presence", "status_msg", "mtime"],
|
||||||
)
|
)
|
||||||
|
|
||||||
def set_presence_state(self, user_localpart, new_state):
|
def set_presence_state(self, user_localpart, new_state):
|
||||||
return self._simple_update_one(
|
return self._simple_update_one(
|
||||||
table="presence",
|
table="presence",
|
||||||
keyvalues={"user_id": user_localpart},
|
keyvalues={"user_id": user_localpart},
|
||||||
updatevalues={"state": new_state["state"],
|
updatevalues={"presence": new_state["presence"],
|
||||||
"status_msg": new_state["status_msg"],
|
"status_msg": new_state["status_msg"],
|
||||||
"mtime": self._clock.time_msec()},
|
"mtime": self._clock.time_msec()},
|
||||||
retcols=["state"],
|
retcols=["presence"],
|
||||||
)
|
)
|
||||||
|
|
||||||
def allow_presence_visible(self, observed_localpart, observer_userid):
|
def allow_presence_visible(self, observed_localpart, observer_userid):
|
||||||
|
|
34
synapse/storage/schema/delta/v3.sql
Normal file
34
synapse/storage/schema/delta/v3.sql
Normal file
|
@ -0,0 +1,34 @@
|
||||||
|
/* Copyright 2014 matrix.org
|
||||||
|
*
|
||||||
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
* you may not use this file except in compliance with the License.
|
||||||
|
* You may obtain a copy of the License at
|
||||||
|
*
|
||||||
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
*
|
||||||
|
* Unless required by applicable law or agreed to in writing, software
|
||||||
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
* See the License for the specific language governing permissions and
|
||||||
|
* limitations under the License.
|
||||||
|
*/
|
||||||
|
|
||||||
|
-- SQLite3 doesn't support renaming or dropping columns. We'll have to go the
|
||||||
|
-- long way round
|
||||||
|
|
||||||
|
CREATE TABLE NEW_presence(
|
||||||
|
user_id INTEGER NOT NULL,
|
||||||
|
presence INTEGER,
|
||||||
|
status_msg TEXT,
|
||||||
|
mtime INTEGER,
|
||||||
|
FOREIGN KEY(user_id) REFERENCES users(id)
|
||||||
|
);
|
||||||
|
|
||||||
|
-- rename the 'state' field to 'presence'
|
||||||
|
INSERT INTO NEW_presence (user_id, presence, status_msg, mtime)
|
||||||
|
SELECT user_id, state, status_msg, mtime FROM presence;
|
||||||
|
|
||||||
|
DROP TABLE presence;
|
||||||
|
ALTER TABLE NEW_presence RENAME TO presence;
|
||||||
|
|
||||||
|
PRAGMA user_version = 3;
|
|
@ -14,7 +14,7 @@
|
||||||
*/
|
*/
|
||||||
CREATE TABLE IF NOT EXISTS presence(
|
CREATE TABLE IF NOT EXISTS presence(
|
||||||
user_id INTEGER NOT NULL,
|
user_id INTEGER NOT NULL,
|
||||||
state INTEGER,
|
presence INTEGER,
|
||||||
status_msg TEXT,
|
status_msg TEXT,
|
||||||
mtime INTEGER, -- miliseconds since last state change
|
mtime INTEGER, -- miliseconds since last state change
|
||||||
FOREIGN KEY(user_id) REFERENCES users(id)
|
FOREIGN KEY(user_id) REFERENCES users(id)
|
||||||
|
|
|
@ -134,7 +134,7 @@ class PresenceStateTestCase(unittest.TestCase):
|
||||||
def test_get_my_state(self):
|
def test_get_my_state(self):
|
||||||
mocked_get = self.datastore.get_presence_state
|
mocked_get = self.datastore.get_presence_state
|
||||||
mocked_get.return_value = defer.succeed(
|
mocked_get.return_value = defer.succeed(
|
||||||
{"state": ONLINE, "status_msg": "Online"}
|
{"presence": ONLINE, "status_msg": "Online"}
|
||||||
)
|
)
|
||||||
|
|
||||||
state = yield self.handler.get_state(
|
state = yield self.handler.get_state(
|
||||||
|
@ -151,7 +151,7 @@ class PresenceStateTestCase(unittest.TestCase):
|
||||||
def test_get_allowed_state(self):
|
def test_get_allowed_state(self):
|
||||||
mocked_get = self.datastore.get_presence_state
|
mocked_get = self.datastore.get_presence_state
|
||||||
mocked_get.return_value = defer.succeed(
|
mocked_get.return_value = defer.succeed(
|
||||||
{"state": ONLINE, "status_msg": "Online"}
|
{"presence": ONLINE, "status_msg": "Online"}
|
||||||
)
|
)
|
||||||
|
|
||||||
state = yield self.handler.get_state(
|
state = yield self.handler.get_state(
|
||||||
|
@ -168,7 +168,7 @@ class PresenceStateTestCase(unittest.TestCase):
|
||||||
def test_get_same_room_state(self):
|
def test_get_same_room_state(self):
|
||||||
mocked_get = self.datastore.get_presence_state
|
mocked_get = self.datastore.get_presence_state
|
||||||
mocked_get.return_value = defer.succeed(
|
mocked_get.return_value = defer.succeed(
|
||||||
{"state": ONLINE, "status_msg": "Online"}
|
{"presence": ONLINE, "status_msg": "Online"}
|
||||||
)
|
)
|
||||||
|
|
||||||
self.room_members = [self.u_apple, self.u_clementine]
|
self.room_members = [self.u_apple, self.u_clementine]
|
||||||
|
@ -186,7 +186,7 @@ class PresenceStateTestCase(unittest.TestCase):
|
||||||
def test_get_disallowed_state(self):
|
def test_get_disallowed_state(self):
|
||||||
mocked_get = self.datastore.get_presence_state
|
mocked_get = self.datastore.get_presence_state
|
||||||
mocked_get.return_value = defer.succeed(
|
mocked_get.return_value = defer.succeed(
|
||||||
{"state": ONLINE, "status_msg": "Online"}
|
{"presence": ONLINE, "status_msg": "Online"}
|
||||||
)
|
)
|
||||||
|
|
||||||
self.room_members = []
|
self.room_members = []
|
||||||
|
@ -201,14 +201,14 @@ class PresenceStateTestCase(unittest.TestCase):
|
||||||
@defer.inlineCallbacks
|
@defer.inlineCallbacks
|
||||||
def test_set_my_state(self):
|
def test_set_my_state(self):
|
||||||
mocked_set = self.datastore.set_presence_state
|
mocked_set = self.datastore.set_presence_state
|
||||||
mocked_set.return_value = defer.succeed({"state": OFFLINE})
|
mocked_set.return_value = defer.succeed({"presence": OFFLINE})
|
||||||
|
|
||||||
yield self.handler.set_state(
|
yield self.handler.set_state(
|
||||||
target_user=self.u_apple, auth_user=self.u_apple,
|
target_user=self.u_apple, auth_user=self.u_apple,
|
||||||
state={"presence": UNAVAILABLE, "status_msg": "Away"})
|
state={"presence": UNAVAILABLE, "status_msg": "Away"})
|
||||||
|
|
||||||
mocked_set.assert_called_with("apple",
|
mocked_set.assert_called_with("apple",
|
||||||
{"state": UNAVAILABLE, "status_msg": "Away"}
|
{"presence": UNAVAILABLE, "status_msg": "Away"}
|
||||||
)
|
)
|
||||||
self.mock_start.assert_called_with(self.u_apple,
|
self.mock_start.assert_called_with(self.u_apple,
|
||||||
state={
|
state={
|
||||||
|
@ -624,7 +624,7 @@ class PresencePushTestCase(unittest.TestCase):
|
||||||
self.room_members = [self.u_apple, self.u_elderberry]
|
self.room_members = [self.u_apple, self.u_elderberry]
|
||||||
|
|
||||||
self.datastore.set_presence_state.return_value = defer.succeed(
|
self.datastore.set_presence_state.return_value = defer.succeed(
|
||||||
{"state": ONLINE}
|
{"presence": ONLINE}
|
||||||
)
|
)
|
||||||
|
|
||||||
# TODO(paul): Gut-wrenching
|
# TODO(paul): Gut-wrenching
|
||||||
|
@ -793,7 +793,7 @@ class PresencePushTestCase(unittest.TestCase):
|
||||||
self.room_members = [self.u_apple, self.u_onion]
|
self.room_members = [self.u_apple, self.u_onion]
|
||||||
|
|
||||||
self.datastore.set_presence_state.return_value = defer.succeed(
|
self.datastore.set_presence_state.return_value = defer.succeed(
|
||||||
{"state": ONLINE}
|
{"presence": ONLINE}
|
||||||
)
|
)
|
||||||
|
|
||||||
# TODO(paul): Gut-wrenching
|
# TODO(paul): Gut-wrenching
|
||||||
|
@ -1043,7 +1043,7 @@ class PresencePollingTestCase(unittest.TestCase):
|
||||||
|
|
||||||
def get_presence_state(user_localpart):
|
def get_presence_state(user_localpart):
|
||||||
return defer.succeed(
|
return defer.succeed(
|
||||||
{"state": self.current_user_state[user_localpart],
|
{"presence": self.current_user_state[user_localpart],
|
||||||
"status_msg": None,
|
"status_msg": None,
|
||||||
"mtime": 123456000}
|
"mtime": 123456000}
|
||||||
)
|
)
|
||||||
|
@ -1051,8 +1051,8 @@ class PresencePollingTestCase(unittest.TestCase):
|
||||||
|
|
||||||
def set_presence_state(user_localpart, new_state):
|
def set_presence_state(user_localpart, new_state):
|
||||||
was = self.current_user_state[user_localpart]
|
was = self.current_user_state[user_localpart]
|
||||||
self.current_user_state[user_localpart] = new_state["state"]
|
self.current_user_state[user_localpart] = new_state["presence"]
|
||||||
return defer.succeed({"state": was})
|
return defer.succeed({"presence": was})
|
||||||
self.datastore.set_presence_state = set_presence_state
|
self.datastore.set_presence_state = set_presence_state
|
||||||
|
|
||||||
def get_presence_list(user_localpart, accepted):
|
def get_presence_list(user_localpart, accepted):
|
||||||
|
|
|
@ -144,14 +144,14 @@ class PresenceProfilelikeDataTestCase(unittest.TestCase):
|
||||||
]
|
]
|
||||||
|
|
||||||
mocked_set = self.datastore.set_presence_state
|
mocked_set = self.datastore.set_presence_state
|
||||||
mocked_set.return_value = defer.succeed({"state": OFFLINE})
|
mocked_set.return_value = defer.succeed({"presence": OFFLINE})
|
||||||
|
|
||||||
yield self.handlers.presence_handler.set_state(
|
yield self.handlers.presence_handler.set_state(
|
||||||
target_user=self.u_apple, auth_user=self.u_apple,
|
target_user=self.u_apple, auth_user=self.u_apple,
|
||||||
state={"presence": UNAVAILABLE, "status_msg": "Away"})
|
state={"presence": UNAVAILABLE, "status_msg": "Away"})
|
||||||
|
|
||||||
mocked_set.assert_called_with("apple",
|
mocked_set.assert_called_with("apple",
|
||||||
{"state": UNAVAILABLE, "status_msg": "Away"}
|
{"presence": UNAVAILABLE, "status_msg": "Away"}
|
||||||
)
|
)
|
||||||
|
|
||||||
@defer.inlineCallbacks
|
@defer.inlineCallbacks
|
||||||
|
@ -162,7 +162,7 @@ class PresenceProfilelikeDataTestCase(unittest.TestCase):
|
||||||
]
|
]
|
||||||
|
|
||||||
self.datastore.set_presence_state.return_value = defer.succeed(
|
self.datastore.set_presence_state.return_value = defer.succeed(
|
||||||
{"state": ONLINE}
|
{"presence": ONLINE}
|
||||||
)
|
)
|
||||||
|
|
||||||
# TODO(paul): Gut-wrenching
|
# TODO(paul): Gut-wrenching
|
||||||
|
@ -244,7 +244,7 @@ class PresenceProfilelikeDataTestCase(unittest.TestCase):
|
||||||
]
|
]
|
||||||
|
|
||||||
self.datastore.set_presence_state.return_value = defer.succeed(
|
self.datastore.set_presence_state.return_value = defer.succeed(
|
||||||
{"state": ONLINE}
|
{"presence": ONLINE}
|
||||||
)
|
)
|
||||||
|
|
||||||
# TODO(paul): Gut-wrenching
|
# TODO(paul): Gut-wrenching
|
||||||
|
|
|
@ -91,7 +91,7 @@ class PresenceStateTestCase(unittest.TestCase):
|
||||||
def test_get_my_status(self):
|
def test_get_my_status(self):
|
||||||
mocked_get = self.datastore.get_presence_state
|
mocked_get = self.datastore.get_presence_state
|
||||||
mocked_get.return_value = defer.succeed(
|
mocked_get.return_value = defer.succeed(
|
||||||
{"state": ONLINE, "status_msg": "Available"}
|
{"presence": ONLINE, "status_msg": "Available"}
|
||||||
)
|
)
|
||||||
|
|
||||||
(code, response) = yield self.mock_resource.trigger("GET",
|
(code, response) = yield self.mock_resource.trigger("GET",
|
||||||
|
@ -107,7 +107,7 @@ class PresenceStateTestCase(unittest.TestCase):
|
||||||
@defer.inlineCallbacks
|
@defer.inlineCallbacks
|
||||||
def test_set_my_status(self):
|
def test_set_my_status(self):
|
||||||
mocked_set = self.datastore.set_presence_state
|
mocked_set = self.datastore.set_presence_state
|
||||||
mocked_set.return_value = defer.succeed({"state": OFFLINE})
|
mocked_set.return_value = defer.succeed({"presence": OFFLINE})
|
||||||
|
|
||||||
(code, response) = yield self.mock_resource.trigger("PUT",
|
(code, response) = yield self.mock_resource.trigger("PUT",
|
||||||
"/presence/%s/status" % (myid),
|
"/presence/%s/status" % (myid),
|
||||||
|
@ -115,7 +115,7 @@ class PresenceStateTestCase(unittest.TestCase):
|
||||||
|
|
||||||
self.assertEquals(200, code)
|
self.assertEquals(200, code)
|
||||||
mocked_set.assert_called_with("apple",
|
mocked_set.assert_called_with("apple",
|
||||||
{"state": UNAVAILABLE, "status_msg": "Away"}
|
{"presence": UNAVAILABLE, "status_msg": "Away"}
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
||||||
|
@ -312,7 +312,7 @@ class PresenceEventStreamTestCase(unittest.TestCase):
|
||||||
self.room_members = [self.u_apple, self.u_banana]
|
self.room_members = [self.u_apple, self.u_banana]
|
||||||
|
|
||||||
self.mock_datastore.set_presence_state.return_value = defer.succeed(
|
self.mock_datastore.set_presence_state.return_value = defer.succeed(
|
||||||
{"state": ONLINE}
|
{"presence": ONLINE}
|
||||||
)
|
)
|
||||||
self.mock_datastore.get_presence_list.return_value = defer.succeed(
|
self.mock_datastore.get_presence_list.return_value = defer.succeed(
|
||||||
[]
|
[]
|
||||||
|
@ -332,7 +332,7 @@ class PresenceEventStreamTestCase(unittest.TestCase):
|
||||||
)
|
)
|
||||||
|
|
||||||
self.mock_datastore.set_presence_state.return_value = defer.succeed(
|
self.mock_datastore.set_presence_state.return_value = defer.succeed(
|
||||||
{"state": ONLINE}
|
{"presence": ONLINE}
|
||||||
)
|
)
|
||||||
self.mock_datastore.get_presence_list.return_value = defer.succeed(
|
self.mock_datastore.get_presence_list.return_value = defer.succeed(
|
||||||
[]
|
[]
|
||||||
|
|
Loading…
Reference in a new issue