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})
 |