Files
CTM-Document-Builder/electron/main/pocketbase.js
T
2026-07-17 13:28:28 -04:00

79 lines
2.0 KiB
JavaScript

import PocketBase from 'pocketbase'
import { POCKETBASE_URL, PB_ADMIN_EMAIL, PB_ADMIN_PASSWORD } from './pocketbase-config.js'
const COLLECTION = 'instructions'
let pb = null
let authPromise = null
function getClient() {
if (!pb) {
pb = new PocketBase(POCKETBASE_URL)
// Main process may receive overlapping IPC calls (e.g. React Strict Mode).
// Default auto-cancel would abort duplicate in-flight PocketBase requests.
pb.autoCancellation(false)
}
return pb
}
function parseEntry(r) {
return {
id: r.id,
vaccine: r.vaccine ?? '',
instruction: r.instruction ?? '',
created: r.created,
updated: r.updated,
}
}
export async function ensureAuth() {
const client = getClient()
if (client.authStore.isValid) return
if (authPromise) {
await authPromise
return
}
// PocketBase v0.23+ removed /api/admins/*; superusers authenticate as a collection.
authPromise = client
.collection('_superusers')
.authWithPassword(PB_ADMIN_EMAIL, PB_ADMIN_PASSWORD)
try {
await authPromise
} catch (err) {
authPromise = null
throw err
}
}
export async function fetchEntries() {
await ensureAuth()
const list = await getClient().collection(COLLECTION).getFullList({ sort: '-created' })
return list.map(parseEntry)
}
export async function createEntry({ vaccine, instruction }) {
await ensureAuth()
const record = await getClient().collection(COLLECTION).create({
vaccine: vaccine.trim(),
instruction: instruction.trim(),
})
return parseEntry(record)
}
export async function updateEntry(id, { instruction, vaccine, includeVaccine }) {
await ensureAuth()
const body = { instruction: instruction.trim() }
if (includeVaccine && vaccine != null) {
body.vaccine = vaccine.trim()
}
const record = await getClient().collection(COLLECTION).update(id, body)
return parseEntry(record)
}
export async function deleteEntry(id) {
await ensureAuth()
await getClient().collection(COLLECTION).delete(id)
}