From 0f2b22941ca0baf98af473a52cb4a6929b2aa924 Mon Sep 17 00:00:00 2001 From: "Mohamad.Elsena" Date: Thu, 2 Jan 2025 15:49:22 +0100 Subject: [PATCH 01/13] basic styling init --- frontend/src/app.css | 188 ++++++++++++++++++ .../src/routes/(auth)/create/+page.svelte | 68 +++---- .../src/routes/(auth)/form/[id]/+page.svelte | 70 +++---- frontend/src/routes/(auth)/main/+page.svelte | 22 +- 4 files changed, 268 insertions(+), 80 deletions(-) diff --git a/frontend/src/app.css b/frontend/src/app.css index e69de29..1435e65 100644 --- a/frontend/src/app.css +++ b/frontend/src/app.css @@ -0,0 +1,188 @@ +/* Reset and base styles */ +:root { + --primary-color: #4a90e2; + --secondary-color: #f5f5f5; + --border-color: #ddd; + --text-color: #333; + --error-color: #e74c3c; + --success-color: #2ecc71; + --shadow: 0 2px 4px rgba(0, 0, 0, 0.1); +} + +* { + box-sizing: border-box; + margin: 0; + padding: 0; +} + +body { + font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, Oxygen, Ubuntu, Cantarell, + sans-serif; + line-height: 1.6; + color: var(--text-color); + background-color: #fff; + padding: 2rem; +} + +/* Typography */ +h1 { + font-size: 2rem; + margin-bottom: 1.5rem; + color: var(--text-color); +} + +h2 { + font-size: 1.5rem; + margin: 1.5rem 0 1rem; +} + +/* Links */ +a { + color: var(--primary-color); + text-decoration: none; + transition: color 0.2s; +} + +a:hover { + color: #357abd; + text-decoration: underline; +} + +/* Lists */ +ul { + list-style: none; + margin: 1rem 0; +} + +li { + padding: 0.75rem; + border-bottom: 1px solid var(--border-color); +} + +li:last-child { + border-bottom: none; +} + +/* Forms */ +form { + max-width: 800px; + margin: 2rem 0; +} + +.form-group { + margin-bottom: 1.5rem; +} + +label { + display: block; + margin-bottom: 0.5rem; + font-weight: 500; +} + +input[type='text'], +input[type='number'], +input[type='date'], +select, +textarea { + width: 100%; + padding: 0.75rem; + border: 1px solid var(--border-color); + border-radius: 4px; + font-size: 1rem; + margin-bottom: 1rem; + transition: border-color 0.2s; +} + +input:focus, +select:focus, +textarea:focus { + outline: none; + border-color: var(--primary-color); + box-shadow: 0 0 0 2px rgba(74, 144, 226, 0.2); +} + +textarea { + min-height: 100px; + resize: vertical; +} + +/* Buttons */ +button { + background-color: var(--primary-color); + color: white; + border: none; + padding: 0.75rem 1.5rem; + border-radius: 4px; + cursor: pointer; + font-size: 1rem; + transition: background-color 0.2s; +} + +button:hover:not(:disabled) { + background-color: #357abd; +} + +button:disabled { + background-color: #ccc; + cursor: not-allowed; +} + +button.secondary { + background-color: var(--secondary-color); + color: var(--text-color); + border: 1px solid var(--border-color); +} + +button.secondary:hover:not(:disabled) { + background-color: #e8e8e8; +} + +button + button { + margin-left: 1rem; +} + +/* Field management */ +.field-container { + background-color: var(--secondary-color); + padding: 1rem; + border-radius: 4px; + margin-bottom: 1rem; +} + +/* Submissions */ +.submissions-list { + background-color: var(--secondary-color); + padding: 1rem; + border-radius: 4px; +} + +.submission-item { + background-color: white; + padding: 1rem; + margin-bottom: 0.5rem; + border-radius: 4px; + box-shadow: var(--shadow); +} + +/* Utility classes */ +.container { + max-width: 1200px; + margin: 0 auto; + padding: 0 1rem; +} + +.loading { + text-align: center; + padding: 2rem; + color: #666; +} + +.error { + color: var(--error-color); + margin: 1rem 0; +} + +.success { + color: var(--success-color); + margin: 1rem 0; +} diff --git a/frontend/src/routes/(auth)/create/+page.svelte b/frontend/src/routes/(auth)/create/+page.svelte index 0a260d0..89f713d 100644 --- a/frontend/src/routes/(auth)/create/+page.svelte +++ b/frontend/src/routes/(auth)/create/+page.svelte @@ -6,12 +6,10 @@ let fields: FormField[] = []; function addField() { - // Use a new array assignment to trigger reactivity fields = [...fields, { label: '', name: '', field_type: 'text' }]; } function removeField(index: number) { - // Reassign to trigger reactivity fields = fields.filter((_, i) => i !== index); } @@ -27,36 +25,38 @@ } -

Create Form

+
+

Create Form

+
+
+ + +
- - -

Fields

-{#each fields as field, i} -
- - - - -
-{/each} - - - +

Fields

+ {#each fields as field, i} +
+
+ + +
+
+ + +
+
+ + +
+ +
+ {/each} + + +
+
diff --git a/frontend/src/routes/(auth)/form/[id]/+page.svelte b/frontend/src/routes/(auth)/form/[id]/+page.svelte index 5b4105a..f9ddcd4 100644 --- a/frontend/src/routes/(auth)/form/[id]/+page.svelte +++ b/frontend/src/routes/(auth)/form/[id]/+page.svelte @@ -5,13 +5,12 @@ import { page } from '$app/stores'; export let params: { id: string }; - console.log('params.id:', params); let form: any | null = null; let submissions: any[] = []; let responseData: Record = {}; onMount(async () => { - const { id } = $page.params; // Use $page.params to access route parameters + const { id } = $page.params; if (id) { form = await getForms().then((forms) => forms.find((f: any) => f.id === id) || null); submissions = await getSubmissions(id); @@ -21,41 +20,42 @@ }); async function submitResponse() { - const { id } = $page.params; // Use $page.params to access route parameters + const { id } = $page.params; await submitForm(id, responseData); alert('Response submitted successfully!'); - submissions = await getSubmissions(params.id); // Refresh submissions + submissions = await getSubmissions(params.id); } -

{form?.name}

- -{#if form} -
- {#each form.fields as field} -
- - - {#if field.field_type === 'text'} - - {:else if field.field_type === 'number'} - - {:else if field.field_type === 'date'} - - {:else if field.field_type === 'textarea'} - - {/if} -
- {/each} - -
- -

Submissions

- -{:else} -

Loading...

-{/if} +
+

{form?.name}

+ {#if form} +
+ {#each form.fields as field} +
+ + {#if field.field_type === 'text'} + + {:else if field.field_type === 'number'} + + {:else if field.field_type === 'date'} + + {:else if field.field_type === 'textarea'} + + {/if} +
+ {/each} + +
+

Submissions

+
+ {#each submissions as submission} +
+ {JSON.stringify(submission.data)} +
+ {/each} +
+ {:else} +

Loading...

+ {/if} +
diff --git a/frontend/src/routes/(auth)/main/+page.svelte b/frontend/src/routes/(auth)/main/+page.svelte index 4b87cc5..42fc2a8 100644 --- a/frontend/src/routes/(auth)/main/+page.svelte +++ b/frontend/src/routes/(auth)/main/+page.svelte @@ -10,14 +10,14 @@ }); -

Form Management Tool

- -Create a New Form - - +
+

Formies

+ Create a New Form +
    + {#each forms as form} +
  • + {form.name} +
  • + {/each} +
+
From 2436036d9204adfacc6ab1544a47fb59a2af6b57 Mon Sep 17 00:00:00 2001 From: "Mohamad.Elsena" Date: Thu, 2 Jan 2025 15:49:33 +0100 Subject: [PATCH 02/13] test db --- backend/form_data.db | Bin 45056 -> 45056 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/backend/form_data.db b/backend/form_data.db index a6446aa6e2ea2e281fea1054b06af824e0ee49ae..1aa21ec615a284ab33e9f09db31c18d23eec7363 100644 GIT binary patch delta 357 zcmZp8z|`=7X@WGP;6xc`M!}5L|1T From 98afc28773806e05a846742a434fd5d0cbadede9 Mon Sep 17 00:00:00 2001 From: "Mohamad.Elsena" Date: Thu, 2 Jan 2025 15:53:08 +0100 Subject: [PATCH 03/13] added basic navbar --- frontend/src/lib/components/Navbar.svelte | 11 +++++++++++ frontend/src/routes/(auth)/+layout.svelte | 7 +++++++ frontend/src/routes/(auth)/main/+page.svelte | 1 - 3 files changed, 18 insertions(+), 1 deletion(-) create mode 100644 frontend/src/lib/components/Navbar.svelte create mode 100644 frontend/src/routes/(auth)/+layout.svelte diff --git a/frontend/src/lib/components/Navbar.svelte b/frontend/src/lib/components/Navbar.svelte new file mode 100644 index 0000000..7036c68 --- /dev/null +++ b/frontend/src/lib/components/Navbar.svelte @@ -0,0 +1,11 @@ + + + diff --git a/frontend/src/routes/(auth)/+layout.svelte b/frontend/src/routes/(auth)/+layout.svelte new file mode 100644 index 0000000..d6bb38e --- /dev/null +++ b/frontend/src/routes/(auth)/+layout.svelte @@ -0,0 +1,7 @@ + + + +{@render children()} diff --git a/frontend/src/routes/(auth)/main/+page.svelte b/frontend/src/routes/(auth)/main/+page.svelte index 42fc2a8..6680062 100644 --- a/frontend/src/routes/(auth)/main/+page.svelte +++ b/frontend/src/routes/(auth)/main/+page.svelte @@ -11,7 +11,6 @@
-

Formies

Create a New Form
    {#each forms as form} From 14c2a123cf108a53480231bc5e6114b1ad2e2ee6 Mon Sep 17 00:00:00 2001 From: "Mohamad.Elsena" Date: Fri, 3 Jan 2025 10:26:04 +0100 Subject: [PATCH 04/13] gitea workflow --- .gitea/workflows/build_and_deploy.yml | 34 ------------------ .gitea/workflows/docker-build.yml | 31 ++++++++++++++++ Dockerfile | 51 ++++++--------------------- 3 files changed, 41 insertions(+), 75 deletions(-) delete mode 100644 .gitea/workflows/build_and_deploy.yml create mode 100644 .gitea/workflows/docker-build.yml diff --git a/.gitea/workflows/build_and_deploy.yml b/.gitea/workflows/build_and_deploy.yml deleted file mode 100644 index aa40d8d..0000000 --- a/.gitea/workflows/build_and_deploy.yml +++ /dev/null @@ -1,34 +0,0 @@ -name: Build and Deploy - -on: - push: - branches: - - main - -jobs: - build: - runs-on: ubuntu-latest - steps: - - name: Clone the repository - uses: actions/checkout@v3 - - - name: Set up Docker - uses: docker/setup-buildx-action@v2 - - - name: Log in to Docker Hub - run: echo "${{ secrets.DOCKER_PASSWORD }}" | docker login -u "${{ secrets.DOCKER_USERNAME }}" --password-stdin - - - name: Build and Push Docker Image - run: | - docker build -t your-dockerhub-username/formies-combined . - docker tag your-dockerhub-username/formies-combined:latest - docker push your-dockerhub-username/formies-combined:latest - - - name: Deploy to Server (optional) - run: | - ssh -o StrictHostKeyChecking=no ${{ secrets.SERVER_USER }}@${{ secrets.SERVER_IP }} << 'EOF' - docker pull your-dockerhub-username/formies-combined:latest - docker stop formies || true - docker rm formies || true - docker run -d --name formies -p 8080:8080 your-dockerhub-username/formies-combined:latest - EOF diff --git a/.gitea/workflows/docker-build.yml b/.gitea/workflows/docker-build.yml new file mode 100644 index 0000000..fa8633f --- /dev/null +++ b/.gitea/workflows/docker-build.yml @@ -0,0 +1,31 @@ +name: Build and Push Docker Image + +on: + push: + branches: + - prod + +jobs: + build_and_push: + runs-on: ubuntu-latest + + steps: + - name: Checkout code + uses: actions/checkout@v3 + + - name: Install Docker + run: | + sudo apt-get update + sudo apt-get install -y docker.io + + - name: Build Docker image + run: | + docker build -t git.vinylnostalgia.com/${{ secrets.GITEA_USERNAME }}/formies:latest . + + - name: Push Docker image to Gitea Registry + env: + GITEA_USERNAME: ${{ secrets.RUNNER_USERNAME }} + GITEA_PASSWORD: ${{ secrets.GITEA_PASSWORD }} + run: | + echo $GITEA_PASSWORD | docker login gitea.example.com -u $GITEA_USERNAME --password-stdin + docker push git.vinylnostalgia.com/$GITEA_USERNAME/formies:latest diff --git a/Dockerfile b/Dockerfile index e6eeabc..54882e1 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,51 +1,20 @@ -# Stage 1: Build Frontend +# Stage 1: Build the Svelte frontend FROM node:18 as frontend-builder - -WORKDIR /frontend - -# Copy frontend package files -COPY frontend/package.json frontend/package-lock.json ./ +WORKDIR /app/frontend +COPY frontend/ . RUN npm install - -# Copy the rest of the frontend source code -COPY frontend ./ - -# Build the frontend RUN npm run build -# Stage 2: Build Backend -FROM rust:1.72 as backend-builder - -WORKDIR /backend - -# Copy backend files -COPY backend/Cargo.toml backend/Cargo.lock ./ -RUN mkdir src && echo "fn main() {}" > src/main.rs +# Stage 2: Build the Rust backend +FROM rust:1.73 as backend-builder +WORKDIR /app/backend +COPY backend/ . RUN cargo build --release -# Copy the actual backend source code -COPY backend/src ./src -RUN cargo build --release - -# Stage 3: Combine and Serve +# Final Stage: Combine frontend and backend FROM debian:bullseye-slim - -# Install dependencies for running Rust binaries -RUN apt-get update && apt-get install -y libssl-dev && rm -rf /var/lib/apt/lists/* - WORKDIR /app - -# Copy backend binary -COPY --from=backend-builder /backend/target/release/backend . - -# Copy frontend static files -COPY --from=frontend-builder /frontend/public ./frontend/public - -# Expose port +COPY --from=frontend-builder /app/frontend/build ./frontend/dist +COPY --from=backend-builder /app/backend/target/release/backend ./backend EXPOSE 8080 - -# Run the backend (serving static files and API) CMD ["./backend"] - -#docker build -t your-dockerhub-username/formies-combined . -#docker push your-dockerhub-username/formies-combined:latest From d26b4c39aae41405877c8b5ec921fd920b0153c1 Mon Sep 17 00:00:00 2001 From: Mohamad Date: Fri, 3 Jan 2025 10:28:57 +0100 Subject: [PATCH 05/13] typo --- .gitea/workflows/docker-build.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.gitea/workflows/docker-build.yml b/.gitea/workflows/docker-build.yml index fa8633f..af49f2a 100644 --- a/.gitea/workflows/docker-build.yml +++ b/.gitea/workflows/docker-build.yml @@ -20,7 +20,7 @@ jobs: - name: Build Docker image run: | - docker build -t git.vinylnostalgia.com/${{ secrets.GITEA_USERNAME }}/formies:latest . + docker build -t git.vinylnostalgia.com/${{ secrets.GITEA_USERNAME }}formies:latest . - name: Push Docker image to Gitea Registry env: From efd11a39b95588f7a93785a4c7b605d6c8d1a995 Mon Sep 17 00:00:00 2001 From: "Mohamad.Elsena" Date: Fri, 3 Jan 2025 10:34:31 +0100 Subject: [PATCH 06/13] added node adapter --- frontend/package-lock.json | 233 ++++++++++++++++++++++++++++++++++++- frontend/package.json | 1 + frontend/svelte.config.js | 2 +- 3 files changed, 233 insertions(+), 3 deletions(-) diff --git a/frontend/package-lock.json b/frontend/package-lock.json index 2a7900a..fed880a 100644 --- a/frontend/package-lock.json +++ b/frontend/package-lock.json @@ -14,6 +14,7 @@ "devDependencies": { "@eslint/compat": "^1.2.3", "@sveltejs/adapter-auto": "^3.0.0", + "@sveltejs/adapter-node": "^5.2.11", "@sveltejs/kit": "^2.0.0", "@sveltejs/vite-plugin-svelte": "^4.0.0", "eslint": "^9.7.0", @@ -756,6 +757,112 @@ "dev": true, "license": "MIT" }, + "node_modules/@rollup/plugin-commonjs": { + "version": "28.0.2", + "resolved": "https://registry.npmjs.org/@rollup/plugin-commonjs/-/plugin-commonjs-28.0.2.tgz", + "integrity": "sha512-BEFI2EDqzl+vA1rl97IDRZ61AIwGH093d9nz8+dThxJNH8oSoB7MjWvPCX3dkaK1/RCJ/1v/R1XB15FuSs0fQw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@rollup/pluginutils": "^5.0.1", + "commondir": "^1.0.1", + "estree-walker": "^2.0.2", + "fdir": "^6.2.0", + "is-reference": "1.2.1", + "magic-string": "^0.30.3", + "picomatch": "^4.0.2" + }, + "engines": { + "node": ">=16.0.0 || 14 >= 14.17" + }, + "peerDependencies": { + "rollup": "^2.68.0||^3.0.0||^4.0.0" + }, + "peerDependenciesMeta": { + "rollup": { + "optional": true + } + } + }, + "node_modules/@rollup/plugin-commonjs/node_modules/is-reference": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/is-reference/-/is-reference-1.2.1.tgz", + "integrity": "sha512-U82MsXXiFIrjCK4otLT+o2NA2Cd2g5MLoOVXUZjIOhLurrRxpEXzI8O0KZHr3IjLvlAH1kTPYSuqer5T9ZVBKQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/estree": "*" + } + }, + "node_modules/@rollup/plugin-json": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/@rollup/plugin-json/-/plugin-json-6.1.0.tgz", + "integrity": "sha512-EGI2te5ENk1coGeADSIwZ7G2Q8CJS2sF120T7jLw4xFw9n7wIOXHo+kIYRAoVpJAN+kmqZSoO3Fp4JtoNF4ReA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@rollup/pluginutils": "^5.1.0" + }, + "engines": { + "node": ">=14.0.0" + }, + "peerDependencies": { + "rollup": "^1.20.0||^2.0.0||^3.0.0||^4.0.0" + }, + "peerDependenciesMeta": { + "rollup": { + "optional": true + } + } + }, + "node_modules/@rollup/plugin-node-resolve": { + "version": "16.0.0", + "resolved": "https://registry.npmjs.org/@rollup/plugin-node-resolve/-/plugin-node-resolve-16.0.0.tgz", + "integrity": "sha512-0FPvAeVUT/zdWoO0jnb/V5BlBsUSNfkIOtFHzMO4H9MOklrmQFY6FduVHKucNb/aTFxvnGhj4MNj/T1oNdDfNg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@rollup/pluginutils": "^5.0.1", + "@types/resolve": "1.20.2", + "deepmerge": "^4.2.2", + "is-module": "^1.0.0", + "resolve": "^1.22.1" + }, + "engines": { + "node": ">=14.0.0" + }, + "peerDependencies": { + "rollup": "^2.78.0||^3.0.0||^4.0.0" + }, + "peerDependenciesMeta": { + "rollup": { + "optional": true + } + } + }, + "node_modules/@rollup/pluginutils": { + "version": "5.1.4", + "resolved": "https://registry.npmjs.org/@rollup/pluginutils/-/pluginutils-5.1.4.tgz", + "integrity": "sha512-USm05zrsFxYLPdWWq+K3STlWiT/3ELn3RcV5hJMghpeAIhxfsUIg6mt12CBJBInWMV4VneoV7SfGv8xIwo2qNQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/estree": "^1.0.0", + "estree-walker": "^2.0.2", + "picomatch": "^4.0.2" + }, + "engines": { + "node": ">=14.0.0" + }, + "peerDependencies": { + "rollup": "^1.20.0||^2.0.0||^3.0.0||^4.0.0" + }, + "peerDependenciesMeta": { + "rollup": { + "optional": true + } + } + }, "node_modules/@rollup/rollup-android-arm-eabi": { "version": "4.29.1", "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.29.1.tgz", @@ -1035,6 +1142,22 @@ "@sveltejs/kit": "^2.0.0" } }, + "node_modules/@sveltejs/adapter-node": { + "version": "5.2.11", + "resolved": "https://registry.npmjs.org/@sveltejs/adapter-node/-/adapter-node-5.2.11.tgz", + "integrity": "sha512-lR7/dfUaKFf3aI408KRDy/BVDYoqUws7zNOJz2Hl4JoshlTnMgdha3brXBRFXB+cWtYvJjjPhvmq3xqpbioi4w==", + "dev": true, + "license": "MIT", + "dependencies": { + "@rollup/plugin-commonjs": "^28.0.1", + "@rollup/plugin-json": "^6.1.0", + "@rollup/plugin-node-resolve": "^16.0.0", + "rollup": "^4.9.5" + }, + "peerDependencies": { + "@sveltejs/kit": "^2.4.0" + } + }, "node_modules/@sveltejs/kit": { "version": "2.15.1", "resolved": "https://registry.npmjs.org/@sveltejs/kit/-/kit-2.15.1.tgz", @@ -1129,6 +1252,13 @@ "dev": true, "license": "MIT" }, + "node_modules/@types/resolve": { + "version": "1.20.2", + "resolved": "https://registry.npmjs.org/@types/resolve/-/resolve-1.20.2.tgz", + "integrity": "sha512-60BCwRFOZCQhDncwQdxxeOEEkbc5dIMccYLwbxsS4TUNeVECQ/pBJ0j09mrHOl/JJvpRPGwO9SvE4nR2Nb/a4Q==", + "dev": true, + "license": "MIT" + }, "node_modules/@types/uuid": { "version": "10.0.0", "resolved": "https://registry.npmjs.org/@types/uuid/-/uuid-10.0.0.tgz", @@ -1567,6 +1697,13 @@ "node": ">= 0.8" } }, + "node_modules/commondir": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/commondir/-/commondir-1.0.1.tgz", + "integrity": "sha512-W9pAhw0ja1Edb5GVdIF1mjZw/ASI0AlShXM83UUGe2DVr5TdAPEA1OA8m/g8zWp9x6On7gqufY+FatDbC3MDQg==", + "dev": true, + "license": "MIT" + }, "node_modules/concat-map": { "version": "0.0.1", "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", @@ -1940,6 +2077,13 @@ "node": ">=4.0" } }, + "node_modules/estree-walker": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-2.0.2.tgz", + "integrity": "sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==", + "dev": true, + "license": "MIT" + }, "node_modules/esutils": { "version": "2.0.3", "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", @@ -2139,6 +2283,16 @@ "node": "^8.16.0 || ^10.6.0 || >=11.0.0" } }, + "node_modules/function-bind": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", + "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", + "dev": true, + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/glob-parent": { "version": "6.0.2", "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", @@ -2196,6 +2350,19 @@ "node": ">=8" } }, + "node_modules/hasown": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz", + "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "function-bind": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" + } + }, "node_modules/ignore": { "version": "5.3.2", "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.2.tgz", @@ -2244,6 +2411,22 @@ "node": ">=0.8.19" } }, + "node_modules/is-core-module": { + "version": "2.16.1", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.16.1.tgz", + "integrity": "sha512-UfoeMA6fIJ8wTYFEUjelnaGI67v6+N7qXJEvQuIGa99l4xsCruSYOVSQ0uPANn4dAzm8lkYPaKLrrijLq7x23w==", + "dev": true, + "license": "MIT", + "dependencies": { + "hasown": "^2.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/is-extglob": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", @@ -2267,6 +2450,13 @@ "node": ">=0.10.0" } }, + "node_modules/is-module": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-module/-/is-module-1.0.0.tgz", + "integrity": "sha512-51ypPSPCoTEIN9dy5Oy+h4pShgJmPCygKfyRCISBI+JoWT/2oJvK8QPxmwv7b/p239jXrm9M1mlQbyKJ5A152g==", + "dev": true, + "license": "MIT" + }, "node_modules/is-number": { "version": "7.0.0", "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", @@ -2626,6 +2816,13 @@ "node": ">=8" } }, + "node_modules/path-parse": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", + "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", + "dev": true, + "license": "MIT" + }, "node_modules/picocolors": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", @@ -2639,8 +2836,6 @@ "integrity": "sha512-M7BAV6Rlcy5u+m6oPhAPFgJTzAioX/6B0DxyvDlo9l8+T3nLKbrczg2WLUyzd45L8RqfUMyGPzekbMvX2Ldkwg==", "dev": true, "license": "MIT", - "optional": true, - "peer": true, "engines": { "node": ">=12" }, @@ -2853,6 +3048,27 @@ "url": "https://paulmillr.com/funding/" } }, + "node_modules/resolve": { + "version": "1.22.10", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.10.tgz", + "integrity": "sha512-NPRy+/ncIMeDlTAsuqwKIiferiawhefFJtkNSW0qZJEqMEb+qBt/77B/jGeeek+F0uOeN05CDa6HXbbIgtVX4w==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-core-module": "^2.16.0", + "path-parse": "^1.0.7", + "supports-preserve-symlinks-flag": "^1.0.0" + }, + "bin": { + "resolve": "bin/resolve" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/resolve-from": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", @@ -3044,6 +3260,19 @@ "node": ">=8" } }, + "node_modules/supports-preserve-symlinks-flag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", + "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/svelte": { "version": "5.16.0", "resolved": "https://registry.npmjs.org/svelte/-/svelte-5.16.0.tgz", diff --git a/frontend/package.json b/frontend/package.json index f44fb0f..b1ef6c7 100644 --- a/frontend/package.json +++ b/frontend/package.json @@ -15,6 +15,7 @@ "devDependencies": { "@eslint/compat": "^1.2.3", "@sveltejs/adapter-auto": "^3.0.0", + "@sveltejs/adapter-node": "^5.2.11", "@sveltejs/kit": "^2.0.0", "@sveltejs/vite-plugin-svelte": "^4.0.0", "eslint": "^9.7.0", diff --git a/frontend/svelte.config.js b/frontend/svelte.config.js index 1295460..e0a641e 100644 --- a/frontend/svelte.config.js +++ b/frontend/svelte.config.js @@ -1,4 +1,4 @@ -import adapter from '@sveltejs/adapter-auto'; +import adapter from '@sveltejs/adapter-node'; import { vitePreprocess } from '@sveltejs/vite-plugin-svelte'; /** @type {import('@sveltejs/kit').Config} */ From df4808bf383b817dfba3ef786a71aedaca1ec735 Mon Sep 17 00:00:00 2001 From: Mohamad Date: Fri, 3 Jan 2025 10:43:38 +0100 Subject: [PATCH 07/13] Serve Frontend with Actix --- backend/src/main.rs | 2 ++ 1 file changed, 2 insertions(+) diff --git a/backend/src/main.rs b/backend/src/main.rs index f42dc39..2870335 100644 --- a/backend/src/main.rs +++ b/backend/src/main.rs @@ -1,4 +1,5 @@ use actix_cors::Cors; +use actix_files as fs; use actix_web::{web, App, HttpServer}; use std::sync::{Arc, Mutex}; @@ -23,6 +24,7 @@ async fn main() -> std::io::Result<()> { .allow_any_method(), ) .app_data(web::Data::new(db.clone())) + .service(fs::Files::new("/", "./frontend/dist").index_file("index.html")) .route("/login", web::post().to(handlers::login)) // Public: Login .route( "/forms/{id}/submissions", From 7d374b93c5a7501616f460a9044ef4580b8800d4 Mon Sep 17 00:00:00 2001 From: Mohamad Date: Fri, 3 Jan 2025 10:45:33 +0100 Subject: [PATCH 08/13] rust version update --- Dockerfile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Dockerfile b/Dockerfile index 54882e1..65bb82b 100644 --- a/Dockerfile +++ b/Dockerfile @@ -6,7 +6,7 @@ RUN npm install RUN npm run build # Stage 2: Build the Rust backend -FROM rust:1.73 as backend-builder +FROM rust:1.83 as backend-builder WORKDIR /app/backend COPY backend/ . RUN cargo build --release From 482aa13e769d05299fc415e6e423b614c0168c92 Mon Sep 17 00:00:00 2001 From: "Mohamad.Elsena" Date: Fri, 3 Jan 2025 11:40:16 +0100 Subject: [PATCH 09/13] binary name fix --- Dockerfile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Dockerfile b/Dockerfile index 65bb82b..f008b07 100644 --- a/Dockerfile +++ b/Dockerfile @@ -15,6 +15,6 @@ RUN cargo build --release FROM debian:bullseye-slim WORKDIR /app COPY --from=frontend-builder /app/frontend/build ./frontend/dist -COPY --from=backend-builder /app/backend/target/release/backend ./backend +COPY --from=backend-builder /app/backend/target/release/formies_be ./formies_be EXPOSE 8080 CMD ["./backend"] From 189a24b230992bad623b7e2eb5ecee679f036e1c Mon Sep 17 00:00:00 2001 From: Mohamad Date: Fri, 3 Jan 2025 11:43:21 +0100 Subject: [PATCH 10/13] dockerfile bugfix (kill me) --- .gitea/workflows/docker-build.yml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/.gitea/workflows/docker-build.yml b/.gitea/workflows/docker-build.yml index af49f2a..390e9d8 100644 --- a/.gitea/workflows/docker-build.yml +++ b/.gitea/workflows/docker-build.yml @@ -20,12 +20,12 @@ jobs: - name: Build Docker image run: | - docker build -t git.vinylnostalgia.com/${{ secrets.GITEA_USERNAME }}formies:latest . + docker build -t git.vinylnostalgia.com/${{ secrets.GITEA_USERNAME }}/formies:latest . - name: Push Docker image to Gitea Registry env: - GITEA_USERNAME: ${{ secrets.RUNNER_USERNAME }} + GITEA_USERNAME: ${{ secrets.GITEA_USERNAME }} GITEA_PASSWORD: ${{ secrets.GITEA_PASSWORD }} run: | - echo $GITEA_PASSWORD | docker login gitea.example.com -u $GITEA_USERNAME --password-stdin + echo $GITEA_PASSWORD | docker login git.vinylnostalgia.com -u $GITEA_USERNAME --password-stdin docker push git.vinylnostalgia.com/$GITEA_USERNAME/formies:latest From 7ecd92a06c4b393848b595dff4349d1cddc9c92b Mon Sep 17 00:00:00 2001 From: Mohamad Date: Fri, 3 Jan 2025 11:44:09 +0100 Subject: [PATCH 11/13] kill me pt2 (typo) --- .gitea/workflows/docker-build.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.gitea/workflows/docker-build.yml b/.gitea/workflows/docker-build.yml index 390e9d8..c73ff23 100644 --- a/.gitea/workflows/docker-build.yml +++ b/.gitea/workflows/docker-build.yml @@ -20,7 +20,7 @@ jobs: - name: Build Docker image run: | - docker build -t git.vinylnostalgia.com/${{ secrets.GITEA_USERNAME }}/formies:latest . + docker build -t git.vinylnostalgia.com/${{ secrets.GITEA_USERNAME }}formies:latest . - name: Push Docker image to Gitea Registry env: From 32fa7f7782174019d6986373235c6a2e2d76c861 Mon Sep 17 00:00:00 2001 From: Mohamad Date: Fri, 3 Jan 2025 11:47:03 +0100 Subject: [PATCH 12/13] smth --- .gitea/workflows/docker-build.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/.gitea/workflows/docker-build.yml b/.gitea/workflows/docker-build.yml index c73ff23..9ec7736 100644 --- a/.gitea/workflows/docker-build.yml +++ b/.gitea/workflows/docker-build.yml @@ -4,6 +4,7 @@ on: push: branches: - prod + - test jobs: build_and_push: From 9aeea66f2258182024fddc628c5169dc983f3200 Mon Sep 17 00:00:00 2001 From: Mohamad Date: Fri, 3 Jan 2025 12:44:39 +0100 Subject: [PATCH 13/13] build yml --- .gitea/workflows/docker-build.yml | 13 ++++++------- 1 file changed, 6 insertions(+), 7 deletions(-) diff --git a/.gitea/workflows/docker-build.yml b/.gitea/workflows/docker-build.yml index 9ec7736..2928f82 100644 --- a/.gitea/workflows/docker-build.yml +++ b/.gitea/workflows/docker-build.yml @@ -3,8 +3,7 @@ name: Build and Push Docker Image on: push: branches: - - prod - - test + - build jobs: build_and_push: @@ -21,12 +20,12 @@ jobs: - name: Build Docker image run: | - docker build -t git.vinylnostalgia.com/${{ secrets.GITEA_USERNAME }}formies:latest . + docker build -t git.vinylnostalgia.com/mo/formies:latest . - - name: Push Docker image to Gitea Registry + - name: Push Docker image to Gitea env: - GITEA_USERNAME: ${{ secrets.GITEA_USERNAME }} - GITEA_PASSWORD: ${{ secrets.GITEA_PASSWORD }} + GITEA_USERNAME: ${{ secrets.ME_USERNAME }} + GITEA_PASSWORD: ${{ secrets.ME_PASSWORD }} run: | echo $GITEA_PASSWORD | docker login git.vinylnostalgia.com -u $GITEA_USERNAME --password-stdin - docker push git.vinylnostalgia.com/$GITEA_USERNAME/formies:latest + docker push git.vinylnostalgia.com/mo/formies:latest