diff --git a/.env.example b/.env.example
index a30a595..6a7ab76 100644
--- a/.env.example
+++ b/.env.example
@@ -1,4 +1,4 @@
PB_ADMIN_EMAIL=admin@example.com
PB_ADMIN_PASSWORD=secret-password
-PUBLIC_PB_URL=http://pb:8080
+PUBLIC_URL=http://your.domain.tld/
PB_DATA_DIR=/pb/pb_data
\ No newline at end of file
diff --git a/.gitignore b/.gitignore
index 8d5314c..df98fe6 100644
--- a/.gitignore
+++ b/.gitignore
@@ -9,7 +9,7 @@ node_modules
/dist
/build
/data
-
+/api/pb_data
# OS
.DS_Store
Thumbs.db
diff --git a/Dockerfile b/Dockerfile
index cc5c2e7..bc92931 100644
--- a/Dockerfile
+++ b/Dockerfile
@@ -4,8 +4,10 @@ COPY package*.json ./
RUN npm i
COPY . .
ENV PUBLIC_PB_URL=http://pb:8080
+ENV PUBLIC_URL=http://localhost:4321
RUN npm run build
EXPOSE 4321
-CMD ["npm", "run", "preview", "--", "--host"]
+CMD ["npm", "run", "dev", "--", "--host"]
+# CMD [ "node", "dist/sever/entry.mjs"]
diff --git a/api/docker-entrypoint.sh b/api/docker-entrypoint.sh
index d12a826..53334c0 100644
--- a/api/docker-entrypoint.sh
+++ b/api/docker-entrypoint.sh
@@ -12,6 +12,7 @@ set -e
# if there are no users yet, create the superuser
# we check the sqlite file for any existing record in the users table
+/pb/pocketbase superuser create "${PB_ADMIN_EMAIL}" "${PB_ADMIN_PASSWORD}"
if [ ! -f "${PB_DATA_DIR}/pb_data.db" ] \
! sqlite3 "${PB_DATA_DIR}/data.db" \
"SELECT id FROM _superusers WHERE email='${PB_ADMIN_EMAIL}' LIMIT 1;" \
diff --git a/api/pb_migrations/1754995770_created_images.js b/api/pb_migrations/1754995770_created_images.js
new file mode 100644
index 0000000..b073c9a
--- /dev/null
+++ b/api/pb_migrations/1754995770_created_images.js
@@ -0,0 +1,71 @@
+///
+migrate((app) => {
+ const collection = new Collection({
+ "createRule": null,
+ "deleteRule": null,
+ "fields": [
+ {
+ "autogeneratePattern": "[a-z0-9]{15}",
+ "hidden": false,
+ "id": "text3208210256",
+ "max": 15,
+ "min": 15,
+ "name": "id",
+ "pattern": "^[a-z0-9]+$",
+ "presentable": false,
+ "primaryKey": true,
+ "required": true,
+ "system": true,
+ "type": "text"
+ },
+ {
+ "hidden": false,
+ "id": "file3309110367",
+ "maxSelect": 1,
+ "maxSize": 0,
+ "mimeTypes": [],
+ "name": "image",
+ "presentable": false,
+ "protected": false,
+ "required": false,
+ "system": false,
+ "thumbs": [],
+ "type": "file"
+ },
+ {
+ "hidden": false,
+ "id": "autodate2990389176",
+ "name": "created",
+ "onCreate": true,
+ "onUpdate": false,
+ "presentable": false,
+ "system": false,
+ "type": "autodate"
+ },
+ {
+ "hidden": false,
+ "id": "autodate3332085495",
+ "name": "updated",
+ "onCreate": true,
+ "onUpdate": true,
+ "presentable": false,
+ "system": false,
+ "type": "autodate"
+ }
+ ],
+ "id": "pbc_3607937828",
+ "indexes": [],
+ "listRule": null,
+ "name": "images",
+ "system": false,
+ "type": "base",
+ "updateRule": null,
+ "viewRule": null
+ });
+
+ return app.save(collection);
+}, (app) => {
+ const collection = app.findCollectionByNameOrId("pbc_3607937828");
+
+ return app.delete(collection);
+})
diff --git a/api/pb_migrations/1754995772_created_recipes.js b/api/pb_migrations/1754995772_created_recipes.js
new file mode 100644
index 0000000..0900784
--- /dev/null
+++ b/api/pb_migrations/1754995772_created_recipes.js
@@ -0,0 +1,122 @@
+///
+migrate((app) => {
+ const collection = new Collection({
+ "createRule": null,
+ "deleteRule": null,
+ "fields": [
+ {
+ "autogeneratePattern": "[a-z0-9]{15}",
+ "hidden": false,
+ "id": "text3208210256",
+ "max": 15,
+ "min": 15,
+ "name": "id",
+ "pattern": "^[a-z0-9]+$",
+ "presentable": false,
+ "primaryKey": true,
+ "required": true,
+ "system": true,
+ "type": "text"
+ },
+ {
+ "autogeneratePattern": "",
+ "hidden": false,
+ "id": "text1579384326",
+ "max": 0,
+ "min": 0,
+ "name": "name",
+ "pattern": "",
+ "presentable": false,
+ "primaryKey": false,
+ "required": false,
+ "system": false,
+ "type": "text"
+ },
+ {
+ "autogeneratePattern": "",
+ "hidden": false,
+ "id": "text1843675174",
+ "max": 0,
+ "min": 0,
+ "name": "description",
+ "pattern": "",
+ "presentable": false,
+ "primaryKey": false,
+ "required": false,
+ "system": false,
+ "type": "text"
+ },
+ {
+ "hidden": false,
+ "id": "number1239158968",
+ "max": null,
+ "min": null,
+ "name": "servings",
+ "onlyInt": false,
+ "presentable": false,
+ "required": false,
+ "system": false,
+ "type": "number"
+ },
+ {
+ "hidden": false,
+ "id": "number3632866850",
+ "max": null,
+ "min": null,
+ "name": "rating",
+ "onlyInt": false,
+ "presentable": false,
+ "required": false,
+ "system": false,
+ "type": "number"
+ },
+ {
+ "cascadeDelete": false,
+ "collectionId": "pbc_3607937828",
+ "hidden": false,
+ "id": "relation3760176746",
+ "maxSelect": 1,
+ "minSelect": 0,
+ "name": "images",
+ "presentable": false,
+ "required": false,
+ "system": false,
+ "type": "relation"
+ },
+ {
+ "hidden": false,
+ "id": "autodate2990389176",
+ "name": "created",
+ "onCreate": true,
+ "onUpdate": false,
+ "presentable": false,
+ "system": false,
+ "type": "autodate"
+ },
+ {
+ "hidden": false,
+ "id": "autodate3332085495",
+ "name": "updated",
+ "onCreate": true,
+ "onUpdate": true,
+ "presentable": false,
+ "system": false,
+ "type": "autodate"
+ }
+ ],
+ "id": "pbc_842702175",
+ "indexes": [],
+ "listRule": null,
+ "name": "recipes",
+ "system": false,
+ "type": "base",
+ "updateRule": null,
+ "viewRule": null
+ });
+
+ return app.save(collection);
+}, (app) => {
+ const collection = app.findCollectionByNameOrId("pbc_842702175");
+
+ return app.delete(collection);
+})
diff --git a/api/pb_migrations/1754995890_updated_recipes.js b/api/pb_migrations/1754995890_updated_recipes.js
new file mode 100644
index 0000000..70643c7
--- /dev/null
+++ b/api/pb_migrations/1754995890_updated_recipes.js
@@ -0,0 +1,28 @@
+///
+migrate((app) => {
+ const collection = app.findCollectionByNameOrId("pbc_842702175")
+
+ // update collection data
+ unmarshal({
+ "createRule": "",
+ "deleteRule": "",
+ "listRule": "",
+ "updateRule": "",
+ "viewRule": ""
+ }, collection)
+
+ return app.save(collection)
+}, (app) => {
+ const collection = app.findCollectionByNameOrId("pbc_842702175")
+
+ // update collection data
+ unmarshal({
+ "createRule": null,
+ "deleteRule": null,
+ "listRule": null,
+ "updateRule": null,
+ "viewRule": null
+ }, collection)
+
+ return app.save(collection)
+})
diff --git a/api/pb_migrations/1754995898_updated_images.js b/api/pb_migrations/1754995898_updated_images.js
new file mode 100644
index 0000000..f08c83d
--- /dev/null
+++ b/api/pb_migrations/1754995898_updated_images.js
@@ -0,0 +1,28 @@
+///
+migrate((app) => {
+ const collection = app.findCollectionByNameOrId("pbc_3607937828")
+
+ // update collection data
+ unmarshal({
+ "createRule": "",
+ "deleteRule": "",
+ "listRule": "",
+ "updateRule": "",
+ "viewRule": ""
+ }, collection)
+
+ return app.save(collection)
+}, (app) => {
+ const collection = app.findCollectionByNameOrId("pbc_3607937828")
+
+ // update collection data
+ unmarshal({
+ "createRule": null,
+ "deleteRule": null,
+ "listRule": null,
+ "updateRule": null,
+ "viewRule": null
+ }, collection)
+
+ return app.save(collection)
+})
diff --git a/api/pb_migrations/1754996268_updated_recipes.js b/api/pb_migrations/1754996268_updated_recipes.js
new file mode 100644
index 0000000..d98cda1
--- /dev/null
+++ b/api/pb_migrations/1754996268_updated_recipes.js
@@ -0,0 +1,40 @@
+///
+migrate((app) => {
+ const collection = app.findCollectionByNameOrId("pbc_842702175")
+
+ // update field
+ collection.fields.addAt(5, new Field({
+ "cascadeDelete": false,
+ "collectionId": "pbc_3607937828",
+ "hidden": false,
+ "id": "relation3760176746",
+ "maxSelect": 999,
+ "minSelect": 0,
+ "name": "images",
+ "presentable": false,
+ "required": false,
+ "system": false,
+ "type": "relation"
+ }))
+
+ return app.save(collection)
+}, (app) => {
+ const collection = app.findCollectionByNameOrId("pbc_842702175")
+
+ // update field
+ collection.fields.addAt(5, new Field({
+ "cascadeDelete": false,
+ "collectionId": "pbc_3607937828",
+ "hidden": false,
+ "id": "relation3760176746",
+ "maxSelect": 1,
+ "minSelect": 0,
+ "name": "images",
+ "presentable": false,
+ "required": false,
+ "system": false,
+ "type": "relation"
+ }))
+
+ return app.save(collection)
+})
diff --git a/api/pb_migrations/1754996900_created_tags.js b/api/pb_migrations/1754996900_created_tags.js
new file mode 100644
index 0000000..a94197e
--- /dev/null
+++ b/api/pb_migrations/1754996900_created_tags.js
@@ -0,0 +1,71 @@
+///
+migrate((app) => {
+ const collection = new Collection({
+ "createRule": null,
+ "deleteRule": null,
+ "fields": [
+ {
+ "autogeneratePattern": "[a-z0-9]{15}",
+ "hidden": false,
+ "id": "text3208210256",
+ "max": 15,
+ "min": 15,
+ "name": "id",
+ "pattern": "^[a-z0-9]+$",
+ "presentable": false,
+ "primaryKey": true,
+ "required": true,
+ "system": true,
+ "type": "text"
+ },
+ {
+ "autogeneratePattern": "",
+ "hidden": false,
+ "id": "text1579384326",
+ "max": 0,
+ "min": 0,
+ "name": "name",
+ "pattern": "",
+ "presentable": false,
+ "primaryKey": false,
+ "required": false,
+ "system": false,
+ "type": "text"
+ },
+ {
+ "hidden": false,
+ "id": "autodate2990389176",
+ "name": "created",
+ "onCreate": true,
+ "onUpdate": false,
+ "presentable": false,
+ "system": false,
+ "type": "autodate"
+ },
+ {
+ "hidden": false,
+ "id": "autodate3332085495",
+ "name": "updated",
+ "onCreate": true,
+ "onUpdate": true,
+ "presentable": false,
+ "system": false,
+ "type": "autodate"
+ }
+ ],
+ "id": "pbc_1219621782",
+ "indexes": [],
+ "listRule": null,
+ "name": "tags",
+ "system": false,
+ "type": "base",
+ "updateRule": null,
+ "viewRule": null
+ });
+
+ return app.save(collection);
+}, (app) => {
+ const collection = app.findCollectionByNameOrId("pbc_1219621782");
+
+ return app.delete(collection);
+})
diff --git a/api/pb_migrations/1754996921_updated_recipes.js b/api/pb_migrations/1754996921_updated_recipes.js
new file mode 100644
index 0000000..e66c6ef
--- /dev/null
+++ b/api/pb_migrations/1754996921_updated_recipes.js
@@ -0,0 +1,28 @@
+///
+migrate((app) => {
+ const collection = app.findCollectionByNameOrId("pbc_842702175")
+
+ // add field
+ collection.fields.addAt(6, new Field({
+ "cascadeDelete": false,
+ "collectionId": "pbc_1219621782",
+ "hidden": false,
+ "id": "relation1874629670",
+ "maxSelect": 999,
+ "minSelect": 0,
+ "name": "tags",
+ "presentable": false,
+ "required": false,
+ "system": false,
+ "type": "relation"
+ }))
+
+ return app.save(collection)
+}, (app) => {
+ const collection = app.findCollectionByNameOrId("pbc_842702175")
+
+ // remove field
+ collection.fields.removeById("relation1874629670")
+
+ return app.save(collection)
+})
diff --git a/api/pb_migrations/1754997089_updated_tags.js b/api/pb_migrations/1754997089_updated_tags.js
new file mode 100644
index 0000000..17fd1ad
--- /dev/null
+++ b/api/pb_migrations/1754997089_updated_tags.js
@@ -0,0 +1,28 @@
+///
+migrate((app) => {
+ const collection = app.findCollectionByNameOrId("pbc_1219621782")
+
+ // update collection data
+ unmarshal({
+ "createRule": "",
+ "deleteRule": "",
+ "listRule": "",
+ "updateRule": "",
+ "viewRule": ""
+ }, collection)
+
+ return app.save(collection)
+}, (app) => {
+ const collection = app.findCollectionByNameOrId("pbc_1219621782")
+
+ // update collection data
+ unmarshal({
+ "createRule": null,
+ "deleteRule": null,
+ "listRule": null,
+ "updateRule": null,
+ "viewRule": null
+ }, collection)
+
+ return app.save(collection)
+})
diff --git a/astro.config.mjs b/astro.config.mjs
index 6d3c92c..60f2bfa 100644
--- a/astro.config.mjs
+++ b/astro.config.mjs
@@ -5,6 +5,10 @@ import node from '@astrojs/node';
import tailwindcss from '@tailwindcss/vite';
+import { loadEnv } from "vite";
+
+const { PUBLIC_PB_URL } = loadEnv(process.env.NODE_ENV, process.cwd(), "");
+
// https://astro.build/config
export default defineConfig({
output: 'server',
@@ -14,6 +18,17 @@ export default defineConfig({
}),
vite: {
- plugins: [tailwindcss()]
+ plugins: [tailwindcss()],
+ server: {
+ proxy: {
+ // The idea is to proxy the Pocketbase connection to the current domain so the user doesn't have to open two ports
+ // Currently works in dev (npm run dev -- --host) with the correct PUBLIC_URL var set but not through docker
+ '/api': {
+ target: PUBLIC_PB_URL,
+ changeOrigin: true,
+ rewrite: (path) => path.replace(/^\/api/, '/api'),
+ },
+ }
+ }
}
});
\ No newline at end of file
diff --git a/docker-compose.yml b/docker-compose.yml
index 45e6b62..a3d4d3b 100644
--- a/docker-compose.yml
+++ b/docker-compose.yml
@@ -2,6 +2,7 @@ services:
web:
build: .
env_file: .env
+ network_mode: host
ports:
- "4321:4321"
@@ -9,8 +10,8 @@ services:
build: api
env_file: .env
volumes:
- - ./data/data:/pb/pb_data
- - ./data/migrations:/pb/pb_migrations
- - ./data/hooks:/pb/pb_hooks
+ - ./api/pb_data:/pb/pb_data
+ - ./api/pb_migrations:/pb/pb_migrations
+ - ./api/pb_hooks:/pb/pb_hooks
ports:
- "8080:8080"
\ No newline at end of file
diff --git a/package.json b/package.json
index 7c2304a..773c395 100644
--- a/package.json
+++ b/package.json
@@ -3,7 +3,7 @@
"type": "module",
"version": "0.0.1",
"scripts": {
- "dev": "astro dev",
+ "dev": "docker compose up pb -d; astro dev --host",
"build": "astro build",
"preview": "astro preview",
"astro": "astro"
diff --git a/src/components/Card/OverviewCard.astro b/src/components/Card/OverviewCard.astro
new file mode 100644
index 0000000..84f2b0d
--- /dev/null
+++ b/src/components/Card/OverviewCard.astro
@@ -0,0 +1,27 @@
+---
+import client from "@/data/pocketbase"
+const { recipe } = Astro.props;
+
+const headerImage = await client.collection("images").getOne(recipe.images[0])
+const image = await client.files.getURL(headerImage, headerImage.image)
+---
+
+
+

+
+
+
{recipe.name}
+
{recipe.description}
+
+
+ {recipe.tags.map(async tag => (
+
{
+ (await client.collection("tags").getOne(tag)).name
+ }
+ ))}
+
+
+
\ No newline at end of file
diff --git a/src/components/Header.astro b/src/components/Header.astro
new file mode 100644
index 0000000..c582951
--- /dev/null
+++ b/src/components/Header.astro
@@ -0,0 +1,13 @@
+
+
\ No newline at end of file
diff --git a/src/data/pocketbase.ts b/src/data/pocketbase.ts
index 10a2a1b..0b05826 100644
--- a/src/data/pocketbase.ts
+++ b/src/data/pocketbase.ts
@@ -1,4 +1,5 @@
import Pocketbase from "pocketbase"
-export const client = new Pocketbase(import.meta.env.PUBLIC_PB_URL)
-// export const client = new Pocketbase("http://localhost:8080")
\ No newline at end of file
+const client = new Pocketbase(import.meta.env.PUBLIC_URL)
+client.autoCancellation(false)
+export default client;
\ No newline at end of file
diff --git a/src/layouts/base.astro b/src/layouts/base.astro
index 8ab02cb..42a0407 100644
--- a/src/layouts/base.astro
+++ b/src/layouts/base.astro
@@ -1,5 +1,6 @@
---
import BaseHead from "../components/BaseHead.astro";
+import Header from "@/components/Header";
---
@@ -8,6 +9,7 @@ import BaseHead from "../components/BaseHead.astro";
+
diff --git a/src/pages/index.astro b/src/pages/index.astro
index dcdb6d2..906caf3 100644
--- a/src/pages/index.astro
+++ b/src/pages/index.astro
@@ -1,16 +1,22 @@
---
import PageLayout from "@/layouts/base"
-import { client } from "@/data/pocketbase"
+import client from "@/data/pocketbase"
+import OverviewCard from "@/components/Card/OverviewCard"
-const reccies = await client.collection("recipes").getFullList()
+const recipies = await client.collection("recipes").getFullList()
---
-
- Recipie
-
- {
- reccies.map(rec => (
- {rec.name}
- ))
- }
+
+
+
+
+
+ {
+ recipies.map(r => (
+
+ ))
+ }
+
+
+
diff --git a/src/styles/global.css b/src/styles/global.css
index 3330e7e..bebe217 100644
--- a/src/styles/global.css
+++ b/src/styles/global.css
@@ -1,6 +1,7 @@
@import "tailwindcss";
html {
- @apply bg-[#fefefe];
- @apply p-5;
+ /* @apply bg-[#1d1f21]; */
+ @apply bg-[#fafafa];
+ @apply font-stretch-condensed;
}
\ No newline at end of file