Files

70 lines
2.1 KiB
TypeScript

// This file was automatically generated by Astro PocketBase.
import type { LoaderContext } from 'astro/loaders'
import type Client from 'pocketbase'
import type { RecordAuthResponse } from 'pocketbase'
import Pocketbase from 'pocketbase'
import type { Collection, TypedPocketbase } from './schemas'
let pocketbase: TypedPocketbase
let auth: Promise<RecordAuthResponse<Client>>
let isAuthenticating = false
export function pocketbaseLoader({ collection }: PocketbaseLoaderOptions) {
return {
name: 'pocketbase-loader',
load: async ({ store, logger, meta, parseData }: LoaderContext) => {
const {
ASTRO_POCKETBASE_ADMIN_EMAIL,
ASTRO_POCKETBASE_ADMIN_PASSWORD,
PUBLIC_ASTRO_POCKETBASE_URL,
} = import.meta.env
if (
!ASTRO_POCKETBASE_ADMIN_EMAIL ||
!ASTRO_POCKETBASE_ADMIN_PASSWORD ||
!PUBLIC_ASTRO_POCKETBASE_URL
)
return logger.error('Environment variables not set')
logger.info(`Loading ${collection}`)
if (!pocketbase) pocketbase = new Pocketbase(PUBLIC_ASTRO_POCKETBASE_URL)
try {
if (!isAuthenticating && !pocketbase.authStore.isValid) {
isAuthenticating = true
auth = pocketbase
.collection('_superusers')
.authWithPassword(ASTRO_POCKETBASE_ADMIN_EMAIL, ASTRO_POCKETBASE_ADMIN_PASSWORD)
}
await auth
const lastUpdatedItems = await pocketbase
.collection(collection)
.getList(1, 1, { fields: 'updated', skipTotal: true, sort: 'updated', order: 'desc' })
const lastUpdated = lastUpdatedItems.items[0]?.updated
if (lastUpdated !== meta.get('last-updated')) {
logger.info(`Refreshing ${collection}`)
meta.set('last-updated', lastUpdated)
const items = await pocketbase.collection(collection).getFullList()
for (const { id, updated, ...rest } of items) {
const data = await parseData({ id, data: { id, updated, ...rest } })
store.set({ data, digest: updated, id })
}
}
logger.info(`Loaded ${collection}`)
} catch (error) {
logger.error(`Error fetching ${collection}: ${error}`)
return
}
},
}
}
export type PocketbaseLoaderOptions = {
collection: Collection
}