diff --git a/serverless/.env.example b/serverless/.env.example new file mode 100644 index 0000000..99aa18b --- /dev/null +++ b/serverless/.env.example @@ -0,0 +1,7 @@ +# Environment variables declared in this file are automatically made available to Prisma. +# See the documentation for more detail: https://pris.ly/d/prisma-schema#accessing-environment-variables-from-the-schema + +# Prisma supports the native connection string format for PostgreSQL, MySQL, SQLite, SQL Server, MongoDB and CockroachDB. +# See the documentation for all the connection string options: https://pris.ly/d/connection-strings + +DATABASE_URL="mongodb+srv://root:randompassword@cluster0.ab1cd.mongodb.net/mydb?retryWrites=true&w=majority" \ No newline at end of file diff --git a/serverless/README.md b/serverless/README.md index f1fcee9..10c1fae 100644 --- a/serverless/README.md +++ b/serverless/README.md @@ -36,3 +36,15 @@ To deploy to development environment: To deploy to production environment: `yarn sls deploy --stage prd` + + +### Prisma configuration + +In order to use and integrate Prisma, both of the `prisma` and `@prisma/client` packages are needed. The `prisma` package reads the schema and generates a version of Prisma Client that is tailored to our modules. + +Run the following commands to install the packages and generate the customized Prisma Client version based on the schema: + +``` +yarn add prisma @prisma/client +yarn prisma:generate +``` \ No newline at end of file diff --git a/serverless/examples/client/index.ts b/serverless/examples/client/index.ts new file mode 100644 index 0000000..fd61fff --- /dev/null +++ b/serverless/examples/client/index.ts @@ -0,0 +1,32 @@ +import { PrismaClient } from '@prisma/client'; + +const prisma = new PrismaClient(); + +async function main() { + // Connect the client + await prisma.$connect(); + + // Query the total count of tokens + const allTokens = await prisma.tokens.findMany(); + console.log('Total tokens:'); + console.log(allTokens.length); + + // Query the token associated with tokenId 1 + const tokenOne = await prisma.tokens.findRaw({ + filter: { + tokenId: 1, + }, + }); + console.log('Token Id One:'); + console.log(tokenOne); +} + +main() + .then(async () => { + await prisma.$disconnect(); + }) + .catch(async (e) => { + console.error(e); + await prisma.$disconnect(); + process.exit(1); + }); diff --git a/serverless/package.json b/serverless/package.json index 7323d62..81315f6 100644 --- a/serverless/package.json +++ b/serverless/package.json @@ -5,7 +5,9 @@ "main": "index.js", "scripts": { "build": "yarn tsc", - "test": "echo \"Error: no test specified\" && exit 1" + "invoke:build": "yarn build && serverless invoke local --function submitBuildInfo", + "prisma:generate": "npx prisma generate", + "prisma:pull": "npx prisma db pull" }, "author": "fleek", "license": "MIT", @@ -27,8 +29,13 @@ "@middy/core": "^4.2.7", "@middy/http-json-body-parser": "^4.2.7", "@middy/http-response-serializer": "^4.2.8", + "@prisma/client": "^4.13.0", "aws-sdk": "^2.1342.0", + "prisma": "^4.13.0", "uuid": "^9.0.0", + "@types/node": "^18.15.11", + "ts-node": "^10.9.1", + "typescript": "^5.0.4" "web3": "^1.9.0" } } diff --git a/serverless/prisma/schema.prisma b/serverless/prisma/schema.prisma new file mode 100644 index 0000000..0a13b0b --- /dev/null +++ b/serverless/prisma/schema.prisma @@ -0,0 +1,16 @@ +generator client { + provider = "prisma-client-js" +} + +datasource db { + provider = "mongodb" + url = env("DATABASE_URL") +} + +model tokens { + id String @id @default(auto()) @map("_id") @db.ObjectId + commit_hash String + github_url String + owner String + tokenId Int +} diff --git a/serverless/serverless.yaml b/serverless/serverless.yaml index 30a05ab..2261f52 100644 --- a/serverless/serverless.yaml +++ b/serverless/serverless.yaml @@ -31,7 +31,7 @@ custom: functions: submitBuildInfo: - handler: src/functions/builds/handler.submitBuildInfo + handler: src/functions/builds/handler.submitBuildInfo # Change `src` to `dist` for deployment events: - http: path: build @@ -49,7 +49,7 @@ functions: tokenId: true submitMintInfo: - handler: dist/functions/mints/handler.submitMintInfo + handler: src/functions/mints/handler.submitMintInfo events: - http: path: mint diff --git a/serverless/src/libs/query-prisma.ts b/serverless/src/libs/query-prisma.ts new file mode 100644 index 0000000..66799e0 --- /dev/null +++ b/serverless/src/libs/query-prisma.ts @@ -0,0 +1,16 @@ +import { PrismaClient } from '@prisma/client'; + +export const prisma = new PrismaClient(); + +export async function initPrisma() { + // Connect the client + await prisma.$connect(); +} + +initPrisma() + .catch(async (e) => { + console.error(e); + }) + .finally(async () => { + await prisma.$disconnect(); + }); diff --git a/serverless/tsconfig.json b/serverless/tsconfig.json index 4f49e29..38f60c3 100644 --- a/serverless/tsconfig.json +++ b/serverless/tsconfig.json @@ -9,6 +9,12 @@ "noUnusedParameters": true, "removeComments": true, "outDir": "dist", + "target": "es2016", + "module": "commonjs", + "esModuleInterop": true, + "forceConsistentCasingInFileNames": true, + "strict": true, + "skipLibCheck": true, "baseUrl": ".", "paths": { "@functions/*": ["src/functions/*"], diff --git a/serverless/yarn.lock b/serverless/yarn.lock index 1ef210a..ca8ad81 100644 --- a/serverless/yarn.lock +++ b/serverless/yarn.lock @@ -1384,6 +1384,23 @@ "@nodelib/fs.scandir" "2.1.5" fastq "^1.6.0" +"@prisma/client@^4.13.0": + version "4.13.0" + resolved "https://registry.yarnpkg.com/@prisma/client/-/client-4.13.0.tgz#271d2b9756503ea17bbdb459c7995536cf2a6191" + integrity sha512-YaiiICcRB2hatxsbnfB66uWXjcRw3jsZdlAVxmx0cFcTc/Ad/sKdHCcWSnqyDX47vAewkjRFwiLwrOUjswVvmA== + dependencies: + "@prisma/engines-version" "4.13.0-50.1e7af066ee9cb95cf3a403c78d9aab3e6b04f37a" + +"@prisma/engines-version@4.13.0-50.1e7af066ee9cb95cf3a403c78d9aab3e6b04f37a": + version "4.13.0-50.1e7af066ee9cb95cf3a403c78d9aab3e6b04f37a" + resolved "https://registry.yarnpkg.com/@prisma/engines-version/-/engines-version-4.13.0-50.1e7af066ee9cb95cf3a403c78d9aab3e6b04f37a.tgz#ae338908d11685dee50e7683502d75442b955bf9" + integrity sha512-fsQlbkhPJf08JOzKoyoD9atdUijuGBekwoOPZC3YOygXEml1MTtgXVpnUNchQlRSY82OQ6pSGQ9PxUe4arcSLQ== + +"@prisma/engines@4.13.0": + version "4.13.0" + resolved "https://registry.yarnpkg.com/@prisma/engines/-/engines-4.13.0.tgz#582a6b90b6efeb0f465984f1fe0e72a4afaaa5ae" + integrity sha512-HrniowHRZXHuGT9XRgoXEaP2gJLXM5RMoItaY2PkjvuZ+iHc0Zjbm/302MB8YsPdWozAPHHn+jpFEcEn71OgPw== + "@serverless/dashboard-plugin@^6.2.3": version "6.2.3" resolved "https://registry.npmjs.org/@serverless/dashboard-plugin/-/dashboard-plugin-6.2.3.tgz" @@ -5140,6 +5157,13 @@ pinkie@^2.0.0: resolved "https://registry.npmjs.org/pinkie/-/pinkie-2.0.4.tgz" integrity sha512-MnUuEycAemtSaeFSjXKW/aroV7akBbY+Sv+RkyqFjgAe73F+MR0TBWKBRDkmfWq/HiFmdavfZ1G7h4SPZXaCSg== +prisma@^4.13.0: + version "4.13.0" + resolved "https://registry.yarnpkg.com/prisma/-/prisma-4.13.0.tgz#0b83f40acf50cd47d7463a135c4e9b275713e602" + integrity sha512-L9mqjnSmvWIRCYJ9mQkwCtj4+JDYYTdhoyo8hlsHNDXaZLh/b4hR0IoKIBbTKxZuyHQzLopb/+0Rvb69uGV7uA== + dependencies: + "@prisma/engines" "4.13.0" + process-nextick-args@~2.0.0: version "2.0.1" resolved "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz"