138 lines
		
	
	
		
			4.6 KiB
		
	
	
	
		
			Python
		
	
	
			
		
		
	
	
			138 lines
		
	
	
		
			4.6 KiB
		
	
	
	
		
			Python
		
	
	
| # -*- coding: utf-8 -*-
 | |
| # Copyright 2016 OpenMarket Ltd
 | |
| #
 | |
| # 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.
 | |
| import logging
 | |
| 
 | |
| from twisted.internet import defer
 | |
| 
 | |
| from synapse.api.errors import StoreError
 | |
| from ._base import SQLBaseStore
 | |
| 
 | |
| logger = logging.getLogger(__name__)
 | |
| 
 | |
| 
 | |
| class DeviceStore(SQLBaseStore):
 | |
|     @defer.inlineCallbacks
 | |
|     def store_device(self, user_id, device_id,
 | |
|                      initial_device_display_name,
 | |
|                      ignore_if_known=True):
 | |
|         """Ensure the given device is known; add it to the store if not
 | |
| 
 | |
|         Args:
 | |
|             user_id (str): id of user associated with the device
 | |
|             device_id (str): id of device
 | |
|             initial_device_display_name (str): initial displayname of the
 | |
|                device
 | |
|             ignore_if_known (bool): ignore integrity errors which mean the
 | |
|                device is already known
 | |
|         Returns:
 | |
|             defer.Deferred
 | |
|         Raises:
 | |
|             StoreError: if ignore_if_known is False and the device was already
 | |
|                known
 | |
|         """
 | |
|         try:
 | |
|             yield self._simple_insert(
 | |
|                 "devices",
 | |
|                 values={
 | |
|                     "user_id": user_id,
 | |
|                     "device_id": device_id,
 | |
|                     "display_name": initial_device_display_name
 | |
|                 },
 | |
|                 desc="store_device",
 | |
|                 or_ignore=ignore_if_known,
 | |
|             )
 | |
|         except Exception as e:
 | |
|             logger.error("store_device with device_id=%s failed: %s",
 | |
|                          device_id, e)
 | |
|             raise StoreError(500, "Problem storing device.")
 | |
| 
 | |
|     def get_device(self, user_id, device_id):
 | |
|         """Retrieve a device.
 | |
| 
 | |
|         Args:
 | |
|             user_id (str): The ID of the user which owns the device
 | |
|             device_id (str): The ID of the device to retrieve
 | |
|         Returns:
 | |
|             defer.Deferred for a dict containing the device information
 | |
|         Raises:
 | |
|             StoreError: if the device is not found
 | |
|         """
 | |
|         return self._simple_select_one(
 | |
|             table="devices",
 | |
|             keyvalues={"user_id": user_id, "device_id": device_id},
 | |
|             retcols=("user_id", "device_id", "display_name"),
 | |
|             desc="get_device",
 | |
|         )
 | |
| 
 | |
|     def delete_device(self, user_id, device_id):
 | |
|         """Delete a device.
 | |
| 
 | |
|         Args:
 | |
|             user_id (str): The ID of the user which owns the device
 | |
|             device_id (str): The ID of the device to delete
 | |
|         Returns:
 | |
|             defer.Deferred
 | |
|         """
 | |
|         return self._simple_delete_one(
 | |
|             table="devices",
 | |
|             keyvalues={"user_id": user_id, "device_id": device_id},
 | |
|             desc="delete_device",
 | |
|         )
 | |
| 
 | |
|     def update_device(self, user_id, device_id, new_display_name=None):
 | |
|         """Update a device.
 | |
| 
 | |
|         Args:
 | |
|             user_id (str): The ID of the user which owns the device
 | |
|             device_id (str): The ID of the device to update
 | |
|             new_display_name (str|None): new displayname for device; None
 | |
|                to leave unchanged
 | |
|         Raises:
 | |
|             StoreError: if the device is not found
 | |
|         Returns:
 | |
|             defer.Deferred
 | |
|         """
 | |
|         updates = {}
 | |
|         if new_display_name is not None:
 | |
|             updates["display_name"] = new_display_name
 | |
|         if not updates:
 | |
|             return defer.succeed(None)
 | |
|         return self._simple_update_one(
 | |
|             table="devices",
 | |
|             keyvalues={"user_id": user_id, "device_id": device_id},
 | |
|             updatevalues=updates,
 | |
|             desc="update_device",
 | |
|         )
 | |
| 
 | |
|     @defer.inlineCallbacks
 | |
|     def get_devices_by_user(self, user_id):
 | |
|         """Retrieve all of a user's registered devices.
 | |
| 
 | |
|         Args:
 | |
|             user_id (str):
 | |
|         Returns:
 | |
|             defer.Deferred: resolves to a dict from device_id to a dict
 | |
|             containing "device_id", "user_id" and "display_name" for each
 | |
|             device.
 | |
|         """
 | |
|         devices = yield self._simple_select_list(
 | |
|             table="devices",
 | |
|             keyvalues={"user_id": user_id},
 | |
|             retcols=("user_id", "device_id", "display_name"),
 | |
|             desc="get_devices_by_user"
 | |
|         )
 | |
| 
 | |
|         defer.returnValue({d["device_id"]: d for d in devices})
 |