import _ from 'lodash'; import { createOrUpdatePairingAuthorisation, getPairingAuthorisationsFor, PairingAuthorisation, removePairingAuthorisationsFor, } from '../../../js/modules/data'; import { PrimaryPubKey, PubKey, SecondaryPubKey } from '../types'; // TODO: We should fetch mappings when we can and only fetch them once every 5 minutes or something /** * Save pairing authorisation to the database. * @param authorisation The pairing authorisation. */ export async function savePairingAuthorisation( authorisation: PairingAuthorisation ): Promise { return createOrUpdatePairingAuthorisation(authorisation); } /** * Get pairing authorisations for a given device. * @param device The device to get pairing authorisations for. */ export async function getPairingAuthorisations( device: PubKey ): Promise> { return getPairingAuthorisationsFor(device.key); } /** * Remove all pairing authorisations for a given device. * @param device The device to remove authorisation for. */ export async function removePairingAuthorisations( device: PubKey ): Promise { return removePairingAuthorisationsFor(device.key); } /** * Get all devices linked to a user. * * @param user The user to get all the devices from. */ export async function getAllDevices(user: PubKey): Promise> { const authorisations = await getPairingAuthorisations(user); const devices = _.flatMap( authorisations, ({ primaryDevicePubKey, secondaryDevicePubKey }) => [ primaryDevicePubKey, secondaryDevicePubKey, ] ); return [...new Set(devices)].map(p => new PubKey(p)); } /** * Get the primary device linked to a user. * * @param user The user to get primary device for. */ export async function getPrimaryDevice(user: PubKey): Promise { const authorisations = await getPairingAuthorisations(user); if (authorisations.length === 0) { return user; } const pubKey = PrimaryPubKey.from(authorisations[0].primaryDevicePubKey); if (!pubKey) { throw new Error(`Primary user public key is invalid for ${user.key}.`); } return pubKey; } /** * Get all the secondary devices linked to a user. * * @param user The user to get the devices from. */ export async function getSecondaryDevices( user: PubKey ): Promise> { const primary = await getPrimaryDevice(user); const authorisations = await getPairingAuthorisations(primary); return authorisations .map(a => a.secondaryDevicePubKey) .map(pubKey => new SecondaryPubKey(pubKey)); }