From a4b1e9b392fde68ed678882aa9997f5771f21712 Mon Sep 17 00:00:00 2001 From: Mario Micklisch Date: Tue, 10 Sep 2024 12:17:14 +0200 Subject: [PATCH 1/5] Add quick start example --- .gitignore | 4 +++- QuickStart.md | 41 ++++++++++++++++++++++++++++++++ apps/backend/src/utils/logger.ts | 2 +- 3 files changed, 45 insertions(+), 2 deletions(-) create mode 100644 QuickStart.md diff --git a/.gitignore b/.gitignore index 83246e8..424b01a 100644 --- a/.gitignore +++ b/.gitignore @@ -9,4 +9,6 @@ dist-ssr .cache server/dist public/dist -.idea \ No newline at end of file +.idea +.yarn +.pnp.*js \ No newline at end of file diff --git a/QuickStart.md b/QuickStart.md new file mode 100644 index 0000000..3520d09 --- /dev/null +++ b/QuickStart.md @@ -0,0 +1,41 @@ +# Development Environment + +Get a local development environment up and running with as few steps as possible. + +## Required Variables + +- **OPENAI_API_KEY:** [Get your GPT-4 OpenAI key](https://platform.openai.com/api-keys) + +## Start + +```shell +yarn set version classic +yarn install +yarn contracts:solo-up +yarn contracts:deploy:solo + +PORT=3000 \ + ORIGIN="*" \ + OPENAI_API_KEY="sk-proj-.." \ + ADMIN_MNEMONIC="denial kitchen pet squirrel other broom bar gas better priority spoil cross" \ + NETWORK_URL=http://localhost:8669 \ + REWARD_AMOUNT=1 \ + yarn dev +``` + +## Result + +Link | Service +--- | --- +http://localhost:8082 | Frontend +http://localhost:3000 | Backend +http://localhost:8081 | Inspector +http://localhost:8669 | Solo Thor + +Deployed contracts documented in: [packages/config-contract/config.ts](packages/config-contract/config.ts) + +## Shutdown + +```shell +yarn contracts:solo-down +``` diff --git a/apps/backend/src/utils/logger.ts b/apps/backend/src/utils/logger.ts index d3c6dab..dc1f18d 100644 --- a/apps/backend/src/utils/logger.ts +++ b/apps/backend/src/utils/logger.ts @@ -5,7 +5,7 @@ import winstonDaily from 'winston-daily-rotate-file'; import { LOG_DIR } from '../config'; // logs dir -const logDir: string = join(__dirname, LOG_DIR); +const logDir: string = join(__dirname, LOG_DIR ?? '../logs'); if (!existsSync(logDir)) { mkdirSync(logDir); From 8264db41b8b19442afcddbc813c1b7ab931b7698 Mon Sep 17 00:00:00 2001 From: Mario Micklisch Date: Tue, 10 Sep 2024 12:28:42 +0200 Subject: [PATCH 2/5] Fix typo --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index f764bc5..c31bead 100644 --- a/README.md +++ b/README.md @@ -110,7 +110,7 @@ yarn contracts:deploy:solo Once the deployment is completed successfully you can go ahead and start the frontend and backend: > ⚠️ **Warning:** -> Remeber to set the OPENAI_API_KEY env variable in the backend .env.development.local file. Refer to the [Environment Variables](#environment-variables) section for more information. +> Remember to set the OPENAI_API_KEY env variable in the backend .env.development.local file. Refer to the [Environment Variables](#environment-variables) section for more information. ```bash yarn dev From 13902936f914a61ff4011430a18f91d6c0c394ee Mon Sep 17 00:00:00 2001 From: Mario Micklisch Date: Fri, 13 Sep 2024 09:07:41 +0200 Subject: [PATCH 3/5] Use validated env --- QuickStart.md | 8 ++------ apps/backend/src/config/index.ts | 16 ++++++++++------ apps/backend/src/server.ts | 3 --- apps/backend/src/utils/validateEnv.ts | 24 +++++++++++++++++++++--- 4 files changed, 33 insertions(+), 18 deletions(-) diff --git a/QuickStart.md b/QuickStart.md index 3520d09..547263c 100644 --- a/QuickStart.md +++ b/QuickStart.md @@ -4,7 +4,7 @@ Get a local development environment up and running with as few steps as possible ## Required Variables -- **OPENAI_API_KEY:** [Get your GPT-4 OpenAI key](https://platform.openai.com/api-keys) +- **OPENAI_API_KEY:** An OpenAI API key needs to be obtained manually from [OpenAI](https://platform.openai.com/api-keys): ## Start @@ -14,12 +14,8 @@ yarn install yarn contracts:solo-up yarn contracts:deploy:solo -PORT=3000 \ - ORIGIN="*" \ - OPENAI_API_KEY="sk-proj-.." \ +OPENAI_API_KEY="" \ ADMIN_MNEMONIC="denial kitchen pet squirrel other broom bar gas better priority spoil cross" \ - NETWORK_URL=http://localhost:8669 \ - REWARD_AMOUNT=1 \ yarn dev ``` diff --git a/apps/backend/src/config/index.ts b/apps/backend/src/config/index.ts index 616097f..824a0d6 100644 --- a/apps/backend/src/config/index.ts +++ b/apps/backend/src/config/index.ts @@ -1,13 +1,17 @@ import { config } from 'dotenv'; import { mnemonic } from '@vechain/sdk-core'; +import { ValidateEnv } from '@utils/validateEnv'; config({ path: `.env.${process.env.NODE_ENV || 'development'}.local` }); +const validatedEnv = ValidateEnv(); + export const CREDENTIALS = process.env.CREDENTIALS === 'true'; -export const { NODE_ENV, PORT, LOG_FORMAT, LOG_DIR, ORIGIN } = process.env; -export const { OPENAI_API_KEY } = process.env; -export const { MAX_FILE_SIZE } = process.env; -export const { ADMIN_MNEMONIC, ADMIN_ADDRESS } = process.env; -export const { NETWORK_URL, NETWORK_TYPE } = process.env; -export const { REWARD_AMOUNT } = process.env; +export const { NODE_ENV, PORT, LOG_FORMAT, LOG_DIR, ORIGIN } = validatedEnv; + +export const { OPENAI_API_KEY } = validatedEnv; +export const { MAX_FILE_SIZE } = validatedEnv; +export const { ADMIN_MNEMONIC, ADMIN_ADDRESS } = validatedEnv; +export const { NETWORK_URL, NETWORK_TYPE } = validatedEnv; +export const { REWARD_AMOUNT } = validatedEnv; export const ADMIN_PRIVATE_KEY = mnemonic.derivePrivateKey(ADMIN_MNEMONIC.split(' ')); diff --git a/apps/backend/src/server.ts b/apps/backend/src/server.ts index 782d2a1..4295d9e 100644 --- a/apps/backend/src/server.ts +++ b/apps/backend/src/server.ts @@ -1,10 +1,7 @@ import { App } from '@/app'; -import { ValidateEnv } from '@utils/validateEnv'; import { initializeOpenAI } from './utils/initializeOpenAI'; import { SubmissionRoute } from './routes/submission.route'; -ValidateEnv(); - export const openAIHelper = initializeOpenAI(); const app = new App([new SubmissionRoute()]); diff --git a/apps/backend/src/utils/validateEnv.ts b/apps/backend/src/utils/validateEnv.ts index a6f1904..6f68275 100644 --- a/apps/backend/src/utils/validateEnv.ts +++ b/apps/backend/src/utils/validateEnv.ts @@ -1,8 +1,26 @@ -import { cleanEnv, port, str } from 'envalid'; +import { makeValidator, cleanEnv, port, str } from 'envalid'; + +const openApiKey = makeValidator((apiKey: string) => { + if (/^sk-proj-.{100,}$/.test(apiKey)) { + return apiKey; + } else { + throw new Error('Please obtain a valid OpenAPI-Key from https://platform.openai.com/api-keys'); + } +}); export const ValidateEnv = () => { - cleanEnv(process.env, { + return cleanEnv(process.env, { NODE_ENV: str(), - PORT: port(), + PORT: port({ devDefault: 3000 }), + ORIGIN: str({ devDefault: '*' }), + LOG_FORMAT: str({ devDefault: 'prod' }), + LOG_DIR: str({ devDefault: '../logs' }), + REWARD_AMOUNT: str({ devDefault: '1' }), + ADMIN_MNEMONIC: str(), + NETWORK_URL: str({ devDefault: 'http://localhost:8669' }), + NETWORK_TYPE: str({ devDefault: 'solo' }), + OPENAI_API_KEY: openApiKey(), + MAX_FILE_SIZE: str({ devDefault: '10mb' }), + ADMIN_ADDRESS: str({ default: '' }), }); }; From b6686da60f7afd99a9f93c9f98f8c7b969800ca8 Mon Sep 17 00:00:00 2001 From: Mario Micklisch Date: Fri, 13 Sep 2024 09:11:29 +0200 Subject: [PATCH 4/5] Remove no longer needed default --- apps/backend/src/utils/logger.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/backend/src/utils/logger.ts b/apps/backend/src/utils/logger.ts index dc1f18d..d3c6dab 100644 --- a/apps/backend/src/utils/logger.ts +++ b/apps/backend/src/utils/logger.ts @@ -5,7 +5,7 @@ import winstonDaily from 'winston-daily-rotate-file'; import { LOG_DIR } from '../config'; // logs dir -const logDir: string = join(__dirname, LOG_DIR ?? '../logs'); +const logDir: string = join(__dirname, LOG_DIR); if (!existsSync(logDir)) { mkdirSync(logDir); From bae693abb2a5469e34799d4a5266c4a28e0725de Mon Sep 17 00:00:00 2001 From: Mario Micklisch Date: Fri, 13 Sep 2024 14:00:28 +0200 Subject: [PATCH 5/5] Add hint about quickstart in readme --- README.md | 3 +++ 1 file changed, 3 insertions(+) diff --git a/README.md b/README.md index c31bead..4326df9 100644 --- a/README.md +++ b/README.md @@ -21,6 +21,9 @@ ############## ######### +> [!TIP] +> Impatient? Check out the [QuickStart](./QuickStart.md) to instantly run the app template. + Unlock the potential of decentralized application development on Vechain with our X-App template for VeBetterDAO. Designed for the Vechain Thor blockchain, this template integrates cutting-edge technologies such as React, TypeScript, Hardhat, and Express, ensuring a seamless and efficient DApp development experience. 🌟 Read more about the implementation and key features of this template in our [Developer Docs](https://docs.vebetterdao.org/developer-guides/integration-examples/pattern-2-use-smart-contracts-and-backend).