From 6668ee727ecf96ad68ed10c2182d253b4e40326d Mon Sep 17 00:00:00 2001 From: Bart Huijgen Date: Sat, 12 Mar 2022 22:10:20 +0100 Subject: [PATCH 1/5] Add cors for factorio.tools to gcp bucket --- apps/blueprints/gcp-storage-cors.json | 2 ++ apps/blueprints/src/pages/user/favorites.tsx | 1 - 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/apps/blueprints/gcp-storage-cors.json b/apps/blueprints/gcp-storage-cors.json index 6cda98f..1cb783e 100644 --- a/apps/blueprints/gcp-storage-cors.json +++ b/apps/blueprints/gcp-storage-cors.json @@ -1,6 +1,8 @@ [ { "origin": [ + "https://factorio.tools", + "https://dev.factorio.tools", "https://factorioblueprints.tech", "https://static.factorioblueprints.tech", "https://dev.factorioblueprints.tech" diff --git a/apps/blueprints/src/pages/user/favorites.tsx b/apps/blueprints/src/pages/user/favorites.tsx index e9444e1..f2676d2 100644 --- a/apps/blueprints/src/pages/user/favorites.tsx +++ b/apps/blueprints/src/pages/user/favorites.tsx @@ -1,4 +1,3 @@ -import React from "react"; import { NextPage } from "next"; import { SimpleGrid, Box, Text } from "@chakra-ui/react"; import { getUserFavoriteBlueprintPages } from "@factorio-sites/database"; From db60aac0663ac88840b823f3deb816c88cfcae38 Mon Sep 17 00:00:00 2001 From: Bart Huijgen Date: Sat, 12 Mar 2022 22:10:39 +0100 Subject: [PATCH 2/5] Add redirect to factorio.tools --- apps/blueprints/src/pages/_app.tsx | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/apps/blueprints/src/pages/_app.tsx b/apps/blueprints/src/pages/_app.tsx index bb2d1a0..35265aa 100644 --- a/apps/blueprints/src/pages/_app.tsx +++ b/apps/blueprints/src/pages/_app.tsx @@ -111,6 +111,11 @@ const BlueprintsApp = ({ }; BlueprintsApp.getInitialProps = ({ ctx }: AppContext) => { + if (ctx.req?.headers?.host === "factorioblueprints.tech" && ctx.res) { + ctx.res.statusCode = 302; + ctx.res.setHeader("Location", "https://factorio.tools" + ctx.req?.url); + } + const userToken = getSessionToken(ctx.req); return { authenticated: !!userToken }; }; From f445b9933e2496df1b4349e8684d23bfc09ea6f5 Mon Sep 17 00:00:00 2001 From: Bart Huijgen Date: Mon, 14 Nov 2022 11:49:08 +0100 Subject: [PATCH 3/5] fix: update github action dependencies to lastest versions --- .github/workflows/deploy_dev.yml | 18 +++++++++--------- .github/workflows/deploy_prd.yml | 8 ++++---- package.json | 6 +++--- yarn.lock | 6 +++--- 4 files changed, 19 insertions(+), 19 deletions(-) diff --git a/.github/workflows/deploy_dev.yml b/.github/workflows/deploy_dev.yml index bafcf9a..79248f1 100644 --- a/.github/workflows/deploy_dev.yml +++ b/.github/workflows/deploy_dev.yml @@ -10,14 +10,14 @@ jobs: environment: blueprints-dev runs-on: ubuntu-latest steps: - - uses: actions/checkout@v2 - - uses: actions/setup-node@v2 + - uses: actions/checkout@v3 + - uses: actions/setup-node@v3 with: - node-version: "14.x" + node-version: 14 - name: Get yarn cache directory path id: yarn-cache-dir-path run: echo "::set-output name=dir::$(yarn cache dir)" - - uses: actions/cache@v2 + - uses: actions/cache@v3 id: yarn-cache with: path: ${{ steps.yarn-cache-dir-path.outputs.dir }} @@ -28,15 +28,15 @@ jobs: - run: yarn nx build blueprints env: CF_WEB_ANALYTICS: 6c563c1e5db141129a5fc95d5c459722 + - name: Authenticate gcloud + uses: google-github-actions/auth@v1 + with: + credentials_json: "${{ secrets.GCP_SA_KEY }}" - name: Set up Cloud SDK uses: google-github-actions/setup-gcloud@v1 - with: - project_id: ${{ secrets.GCP_PROJECT_ID }} - service_account_key: ${{ secrets.GCP_SA_KEY }} - export_default_credentials: true - run: gcloud auth configure-docker --quiet - name: Build and push - uses: docker/build-push-action@v2 + uses: docker/build-push-action@v3 with: context: . file: blueprints.github.Dockerfile diff --git a/.github/workflows/deploy_prd.yml b/.github/workflows/deploy_prd.yml index 042b27a..2df15ef 100644 --- a/.github/workflows/deploy_prd.yml +++ b/.github/workflows/deploy_prd.yml @@ -10,14 +10,14 @@ jobs: environment: blueprints-prd runs-on: ubuntu-latest steps: - - uses: actions/checkout@v2 - - uses: actions/setup-node@v2 + - uses: actions/checkout@v3 + - uses: actions/setup-node@v3 with: - node-version: "14.x" + node-version: 14 - name: Get yarn cache directory path id: yarn-cache-dir-path run: echo "::set-output name=dir::$(yarn cache dir)" - - uses: actions/cache@v2 + - uses: actions/cache@v3 id: yarn-cache with: path: ${{ steps.yarn-cache-dir-path.outputs.dir }} diff --git a/package.json b/package.json index 74d1b71..5a6c7cb 100644 --- a/package.json +++ b/package.json @@ -85,6 +85,8 @@ "@nrwl/react": "13.2.1", "@nrwl/web": "13.2.1", "@nrwl/workspace": "13.2.1", + "@pulumi/gcp": "5.0.0", + "@pulumi/pulumi": "3.0.0", "@testing-library/react": "12.1.2", "@types/bcrypt": "5.0.0", "@types/cookie": "0.4.1", @@ -119,8 +121,6 @@ "ts-node": "10.4.0", "tslint": "6.1.3", "typescript": "4.5.2", - "wasm-loader": "1.3.0", - "@pulumi/pulumi": "3.0.0", - "@pulumi/gcp": "5.0.0" + "wasm-loader": "1.3.0" } } diff --git a/yarn.lock b/yarn.lock index 516b88b..c2457d3 100644 --- a/yarn.lock +++ b/yarn.lock @@ -6557,9 +6557,9 @@ caniuse-api@^3.0.0: lodash.uniq "^4.5.0" caniuse-lite@^1.0.0, caniuse-lite@^1.0.30001135, caniuse-lite@^1.0.30001173, caniuse-lite@^1.0.30001181, caniuse-lite@^1.0.30001196, caniuse-lite@^1.0.30001202, caniuse-lite@^1.0.30001219, caniuse-lite@^1.0.30001228, caniuse-lite@^1.0.30001251, caniuse-lite@^1.0.30001280: - version "1.0.30001282" - resolved "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001282.tgz" - integrity sha512-YhF/hG6nqBEllymSIjLtR2iWDDnChvhnVJqp+vloyt2tEHFG1yBR+ac2B/rOw0qOK0m0lEXU2dv4E/sMk5P9Kg== + version "1.0.30001431" + resolved "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001431.tgz" + integrity sha512-zBUoFU0ZcxpvSt9IU66dXVT/3ctO1cy4y9cscs1szkPlcWb6pasYM144GqrUygUbT+k7cmUCW61cvskjcv0enQ== caseless@~0.12.0: version "0.12.0" From 37d32bdfc8f77e7b0d479262b2b10887f1f18c3d Mon Sep 17 00:00:00 2001 From: Bart Huijgen Date: Mon, 14 Nov 2022 11:55:29 +0100 Subject: [PATCH 4/5] feat: upgrade to build in caching in actions and upgrade to node 18 --- .github/workflows/deploy_dev.yml | 15 +++------------ .github/workflows/deploy_prd.yml | 15 +++------------ .github/workflows/validate.yml | 17 ++++------------- blueprints.Dockerfile | 4 ++-- blueprints.github.Dockerfile | 2 +- 5 files changed, 13 insertions(+), 40 deletions(-) diff --git a/.github/workflows/deploy_dev.yml b/.github/workflows/deploy_dev.yml index 79248f1..9e5a383 100644 --- a/.github/workflows/deploy_dev.yml +++ b/.github/workflows/deploy_dev.yml @@ -13,18 +13,9 @@ jobs: - uses: actions/checkout@v3 - uses: actions/setup-node@v3 with: - node-version: 14 - - name: Get yarn cache directory path - id: yarn-cache-dir-path - run: echo "::set-output name=dir::$(yarn cache dir)" - - uses: actions/cache@v3 - id: yarn-cache - with: - path: ${{ steps.yarn-cache-dir-path.outputs.dir }} - key: ${{ runner.os }}-yarn-${{ hashFiles('**/yarn.lock') }} - restore-keys: | - ${{ runner.os }}-yarn- - - run: yarn + node-version: 18 + cache: "yarn" + - run: yarn --prefer-offline - run: yarn nx build blueprints env: CF_WEB_ANALYTICS: 6c563c1e5db141129a5fc95d5c459722 diff --git a/.github/workflows/deploy_prd.yml b/.github/workflows/deploy_prd.yml index 2df15ef..12b6e58 100644 --- a/.github/workflows/deploy_prd.yml +++ b/.github/workflows/deploy_prd.yml @@ -13,18 +13,9 @@ jobs: - uses: actions/checkout@v3 - uses: actions/setup-node@v3 with: - node-version: 14 - - name: Get yarn cache directory path - id: yarn-cache-dir-path - run: echo "::set-output name=dir::$(yarn cache dir)" - - uses: actions/cache@v3 - id: yarn-cache - with: - path: ${{ steps.yarn-cache-dir-path.outputs.dir }} - key: ${{ runner.os }}-yarn-${{ hashFiles('**/yarn.lock') }} - restore-keys: | - ${{ runner.os }}-yarn- - - run: yarn + node-version: 18 + cache: "yarn" + - run: yarn --prefer-offline - run: yarn nx build blueprints env: PUBLIC_URL: https://factorio-blueprints-assets.storage.googleapis.com/public diff --git a/.github/workflows/validate.yml b/.github/workflows/validate.yml index 5630e9d..c857a47 100644 --- a/.github/workflows/validate.yml +++ b/.github/workflows/validate.yml @@ -6,20 +6,11 @@ jobs: validate: runs-on: ubuntu-latest steps: - - uses: actions/checkout@v2 - - uses: actions/setup-node@v2 + - uses: actions/checkout@v3 + - uses: actions/setup-node@v3 with: - node-version: "14.x" - - name: Get yarn cache directory path - id: yarn-cache-dir-path - run: echo "::set-output name=dir::$(yarn cache dir)" - - uses: actions/cache@v1 - id: yarn-cache - with: - path: ${{ steps.yarn-cache-dir-path.outputs.dir }} - key: ${{ runner.os }}-yarn-${{ hashFiles('**/yarn.lock') }} - restore-keys: | - ${{ runner.os }}-yarn- + node-version: 18 + cache: "yarn" - run: yarn --prefer-offline - run: yarn nx run-many --all --target=lint - run: yarn nx run-many --all --target=test "--ci" diff --git a/blueprints.Dockerfile b/blueprints.Dockerfile index 6628613..e9b0e39 100644 --- a/blueprints.Dockerfile +++ b/blueprints.Dockerfile @@ -1,4 +1,4 @@ -FROM node:14-slim as builder +FROM node:18-slim as builder RUN apt-get -qy update && apt-get -qy install openssl @@ -15,7 +15,7 @@ COPY . . RUN yarn nx build blueprints --prod -FROM node:14-slim +FROM node:18-slim RUN apt-get -qy update && apt-get -qy install openssl diff --git a/blueprints.github.Dockerfile b/blueprints.github.Dockerfile index 2d90d71..16dc5fe 100644 --- a/blueprints.github.Dockerfile +++ b/blueprints.github.Dockerfile @@ -1,4 +1,4 @@ -FROM node:14-slim +FROM node:18-slim RUN apt-get -qy update && apt-get -qy install openssl From 3eded5e6938cc81ea491d1d11ded4ee25cfcccea Mon Sep 17 00:00:00 2001 From: Bart Huijgen Date: Mon, 14 Nov 2022 13:07:47 +0100 Subject: [PATCH 5/5] fix: disable auto redirect --- apps/blueprints/public/discord_logo.svg | 1 + apps/blueprints/public/github_logo.png | Bin 0 -> 5970 bytes apps/blueprints/src/pages/_app.tsx | 8 +++--- apps/blueprints/src/pages/about.tsx | 30 +++++++++++---------- libs/database/src/lib/postgres/database.ts | 2 +- 5 files changed, 22 insertions(+), 19 deletions(-) create mode 100644 apps/blueprints/public/discord_logo.svg create mode 100644 apps/blueprints/public/github_logo.png diff --git a/apps/blueprints/public/discord_logo.svg b/apps/blueprints/public/discord_logo.svg new file mode 100644 index 0000000..fcaa221 --- /dev/null +++ b/apps/blueprints/public/discord_logo.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/apps/blueprints/public/github_logo.png b/apps/blueprints/public/github_logo.png new file mode 100644 index 0000000000000000000000000000000000000000..e11df546d84b6fc1c2c487cbe5e291ba2ccbc1ce GIT binary patch literal 5970 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 om9ra!lb { - if (ctx.req?.headers?.host === "factorioblueprints.tech" && ctx.res) { - ctx.res.statusCode = 302; - ctx.res.setHeader("Location", "https://factorio.tools" + ctx.req?.url); - } + // if (ctx.req?.headers?.host === "factorioblueprints.tech" && ctx.res) { + // ctx.res.statusCode = 302; + // ctx.res.setHeader("Location", "https://factorio.tools" + ctx.req?.url); + // } const userToken = getSessionToken(ctx.req); return { authenticated: !!userToken }; diff --git a/apps/blueprints/src/pages/about.tsx b/apps/blueprints/src/pages/about.tsx index 7455f65..eb89501 100644 --- a/apps/blueprints/src/pages/about.tsx +++ b/apps/blueprints/src/pages/about.tsx @@ -26,21 +26,26 @@ export const Index: NextPage = () => {

Factorio Blueprints by Barry

- -

- Work in progress! -

-
+ + +

+ Factorio blueprints aims to be a feature complete blueprints library where you can + upload, organize and search for blueprints. It scans uploaded blueprints and blueprint + books to break down their contents allowing you to view and copy individual blueprints, + but also power the search where you can find any type of entity and recipe, even modded + once. +

+

+ If you have any suggestions or feedback please join our discord below or create an + github issue and get in touch! +

Join our discord server

- + @@ -52,10 +57,7 @@ export const Index: NextPage = () => { target="__blank" rel="noopener" > - + @@ -115,7 +117,7 @@ export const Index: NextPage = () => { target="__blank" css={{ textDecoration: "underline" }} > - Create an issue on GitHub! + Create an issue on GitHub diff --git a/libs/database/src/lib/postgres/database.ts b/libs/database/src/lib/postgres/database.ts index 25e705a..11fafc8 100644 --- a/libs/database/src/lib/postgres/database.ts +++ b/libs/database/src/lib/postgres/database.ts @@ -46,5 +46,5 @@ const promise = _init() export const init = async () => { await promise; - await prisma.$connect(); + // await prisma.$connect(); };