import fs from 'node:fs/promises' import Debug from 'debug' import { v4 as uuidv4 } from 'uuid' const debug = Debug('lot-occupancy-system:functions.api') const apiKeyPath = 'data/apiKeys.json' let apiKeys: Record async function loadApiKeys(): Promise { try { const fileData = await fs.readFile(apiKeyPath, 'utf8') apiKeys = JSON.parse(fileData) as Record } catch (error) { debug(error) apiKeys = {} } } async function saveApiKeys(): Promise { try { await fs.writeFile(apiKeyPath, JSON.stringify(apiKeys), 'utf8') } catch (error) { debug(error) } } function generateApiKey(apiKeyPrefix: string): string { return `${apiKeyPrefix}-${uuidv4()}-${Date.now().toString()}` } export async function regenerateApiKey(userName: string): Promise { apiKeys[userName] = generateApiKey(userName) await saveApiKeys() } export async function getApiKey(userName: string): Promise { if (apiKeys === undefined) { await loadApiKeys() } if (!Object.hasOwn(apiKeys, userName)) { await regenerateApiKey(userName) } return apiKeys[userName] } export async function getApiKeyFromUser(user: User): Promise { return await getApiKey(user.userName) } export async function getUserNameFromApiKey( apiKey: string ): Promise { if (apiKeys === undefined) { await loadApiKeys() } for (const [userName, currentApiKey] of Object.entries(apiKeys)) { if (apiKey === currentApiKey) { return userName } } return undefined }