import { ACCOUNTS_STORE, RELATIONSHIPS_STORE, USERNAME_LOWERCASE } from './constants' import { accountsCache, relationshipsCache } from './cache' import { cloneForStorage, getGenericEntityWithId, setGenericEntityWithId } from './helpers' import { dbPromise, getDatabase } from './databaseLifecycle' import { createAccountUsernamePrefixKeyRange } from './keys' export async function getAccount (instanceName, accountId) { return getGenericEntityWithId(ACCOUNTS_STORE, accountsCache, instanceName, accountId) } export async function setAccount (instanceName, account) { return setGenericEntityWithId(ACCOUNTS_STORE, accountsCache, instanceName, cloneForStorage(account)) } export async function getRelationship (instanceName, accountId) { return getGenericEntityWithId(RELATIONSHIPS_STORE, relationshipsCache, instanceName, accountId) } export async function setRelationship (instanceName, relationship) { return setGenericEntityWithId(RELATIONSHIPS_STORE, relationshipsCache, instanceName, cloneForStorage(relationship)) } export async function searchAccountsByUsername (instanceName, usernamePrefix, limit = 20) { const db = await getDatabase(instanceName) return dbPromise(db, ACCOUNTS_STORE, 'readonly', (accountsStore, callback) => { let keyRange = createAccountUsernamePrefixKeyRange(usernamePrefix.toLowerCase()) accountsStore.index(USERNAME_LOWERCASE).getAll(keyRange, limit).onsuccess = e => { let results = e.target.result results = results.sort((a, b) => { // accounts you're following go first if (a.following !== b.following) { return a.following ? -1 : 1 } // after that, just sort by username if (a[USERNAME_LOWERCASE] !== b[USERNAME_LOWERCASE]) { return a[USERNAME_LOWERCASE] < b[USERNAME_LOWERCASE] ? -1 : 1 } return 0 // eslint-disable-line }) callback(results) } }) }