70 lines
2.1 KiB
TypeScript
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
|
|
}
|