79 lines
2.0 KiB
JavaScript
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)
|
|
}
|