diff --git a/.gitignore b/.gitignore index 54f07af..8a74b8a 100644 --- a/.gitignore +++ b/.gitignore @@ -21,4 +21,6 @@ dist-ssr *.ntvs* *.njsproj *.sln -*.sw? \ No newline at end of file +*.sw? +application/src/lib/pocketbase.ts +Dockerfile diff --git a/Dockerfile b/Dockerfile deleted file mode 100644 index d3b1f84..0000000 --- a/Dockerfile +++ /dev/null @@ -1,39 +0,0 @@ -# Stage 1: Build the frontend -FROM node:18-alpine AS frontend-builder -WORKDIR /app -COPY application/package*.json ./ -RUN npm install -COPY application/ ./ -RUN npm run build - -# Stage 2: Download PocketBase binary -FROM alpine:3.17 AS pb-builder -WORKDIR /pb -ARG PB_VERSION=0.27.2 -RUN apk add --no-cache wget unzip \ - && wget https://github.com/pocketbase/pocketbase/releases/download/v${PB_VERSION}/pocketbase_${PB_VERSION}_linux_amd64.zip \ - && unzip pocketbase_${PB_VERSION}_linux_amd64.zip \ - && chmod +x /pb/pocketbase - -# Stage 3: Final runtime image -FROM alpine:3.17 -WORKDIR /app - -# Copy PocketBase binary -COPY --from=pb-builder /pb/pocketbase /app/pocketbase - -# Copy frontend build to PocketBase public directory -COPY --from=frontend-builder /app/dist /app/pb_public - -# Copy backend files -COPY server/pb_migrations /app/pb_migrations -COPY server/pb_data /app/pb_data - -# Mark pb_data as a volume for runtime persistence -VOLUME /app/pb_data - -# Expose default PocketBase port -EXPOSE 8090 - -# Launch PocketBase and bind to 0.0.0.0 for external access -CMD ["/app/pocketbase", "serve", "--http=0.0.0.0:8090", "--dir", "/app/pb_data"] diff --git a/application/src/lib/pocketbase.ts b/application/src/lib/pocketbase.ts index 8baea56..4ad1dfb 100644 --- a/application/src/lib/pocketbase.ts +++ b/application/src/lib/pocketbase.ts @@ -1,16 +1,17 @@ import PocketBase from 'pocketbase'; -// Auto-detect base URL from browser location +// Dynamically detect API base URL from current host (for use in browser) const dynamicBaseUrl = typeof window !== 'undefined' - ? window.location.origin + ? `${window.location.protocol}//${window.location.hostname}:8090` : 'http://localhost:8090'; -// Define API endpoints +// Define available API endpoints export const API_ENDPOINTS = { REMOTE: dynamicBaseUrl }; +// Get the current endpoint from localStorage or use remote as default export const getCurrentEndpoint = (): string => { if (typeof window !== 'undefined') { const savedEndpoint = localStorage.getItem('pocketbase_endpoint'); @@ -19,19 +20,26 @@ export const getCurrentEndpoint = (): string => { return API_ENDPOINTS.REMOTE; }; +// Set the API endpoint and reinitialize PocketBase export const setApiEndpoint = (endpoint: string): void => { if (typeof window !== 'undefined') { localStorage.setItem('pocketbase_endpoint', endpoint); - window.location.reload(); + window.location.reload(); // Reload to reinitialize PocketBase with new endpoint } }; +// Initialize the PocketBase client with the current API URL export const pb = new PocketBase(getCurrentEndpoint()); -export const isAuthenticated = () => pb.authStore.isValid; +// Helper to check if user is authenticated +export const isAuthenticated = () => { + return pb.authStore.isValid; +}; +// Export the auth store for use in components export const authStore = pb.authStore; +// Configure PocketBase to persist authentication between page reloads if (typeof window !== 'undefined') { const storedAuthData = localStorage.getItem('pocketbase_auth'); if (storedAuthData) { @@ -44,15 +52,13 @@ if (typeof window !== 'undefined') { } } + // Subscribe to authStore changes to persist authentication pb.authStore.onChange(() => { if (pb.authStore.isValid) { - localStorage.setItem( - 'pocketbase_auth', - JSON.stringify({ - token: pb.authStore.token, - model: pb.authStore.model - }) - ); + localStorage.setItem('pocketbase_auth', JSON.stringify({ + token: pb.authStore.token, + model: pb.authStore.model + })); } else { localStorage.removeItem('pocketbase_auth'); }