From 3eaffd86364b593b6752004365562449a8fa42c8 Mon Sep 17 00:00:00 2001 From: austinkelsay Date: Sat, 23 Dec 2023 17:21:42 -0600 Subject: [PATCH] Project setup, dockerized, prisma schema / migrations setup, component library added --- .gitignore | 1 + Dockerfile | 13 +++ docker-compose.yml | 28 +++++++ package-lock.json | 95 ++++++++++++++++++++-- package.json | 6 +- prisma/schema.prisma | 56 +++++++++++++ public/plebdevs-guy.jpg | Bin 0 -> 11751 bytes src/components/navbar/Navbar.js | 36 +++++++++ src/components/navbar/navbar.module.css | 17 ++++ src/pages/_app.js | 14 +++- src/pages/index.js | 100 +----------------------- src/styles/Home.module.css | 3 - src/styles/globals.css | 2 +- 13 files changed, 257 insertions(+), 114 deletions(-) create mode 100644 Dockerfile create mode 100644 docker-compose.yml create mode 100644 prisma/schema.prisma create mode 100644 public/plebdevs-guy.jpg create mode 100644 src/components/navbar/Navbar.js create mode 100644 src/components/navbar/navbar.module.css diff --git a/.gitignore b/.gitignore index fd3dbb5..7e43796 100644 --- a/.gitignore +++ b/.gitignore @@ -5,6 +5,7 @@ /.pnp .pnp.js .yarn/install-state.gz +.env # testing /coverage diff --git a/Dockerfile b/Dockerfile new file mode 100644 index 0000000..74fb772 --- /dev/null +++ b/Dockerfile @@ -0,0 +1,13 @@ +# syntax=docker/dockerfile:1 + +FROM node:18.17.0-bullseye + +WORKDIR /app + +EXPOSE 3000 + +COPY . . + +RUN npm install + +CMD ["npm", "run", "dev"] diff --git a/docker-compose.yml b/docker-compose.yml new file mode 100644 index 0000000..707c3fe --- /dev/null +++ b/docker-compose.yml @@ -0,0 +1,28 @@ +version: "3" +services: + db: + container_name: plebdevs-db + image: postgres:13.2 + restart: always + expose: + - "5432" + ports: + - "5432:5432" + env_file: + - .env + volumes: + - postgres_data:/var/lib/postgresql/data + app: + container_name: plebdevs + build: . + depends_on: + - db + env_file: + - .env + ports: + - "3000:3000" + links: + - db + +volumes: + postgres_data: diff --git a/package-lock.json b/package-lock.json index 966c3a3..005965a 100644 --- a/package-lock.json +++ b/package-lock.json @@ -9,6 +9,8 @@ "version": "0.1.0", "dependencies": { "next": "14.0.4", + "primeicons": "^6.0.1", + "primereact": "^10.2.1", "react": "^18", "react-dom": "^18" }, @@ -30,7 +32,6 @@ "version": "7.23.6", "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.23.6.tgz", "integrity": "sha512-zHd0eUrf5GZoOWVCXp6koAKQTfZV07eit6bGPmJgnZdnSAvvZee6zniW2XMF7Cmc4ISOOnPy3QaSiIJGJkVEDQ==", - "dev": true, "dependencies": { "regenerator-runtime": "^0.14.0" }, @@ -331,6 +332,34 @@ "integrity": "sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ==", "dev": true }, + "node_modules/@types/prop-types": { + "version": "15.7.11", + "resolved": "https://registry.npmjs.org/@types/prop-types/-/prop-types-15.7.11.tgz", + "integrity": "sha512-ga8y9v9uyeiLdpKddhxYQkxNDrfvuPrlFb0N1qnZZByvcElJaXthF1UhvCh9TLWJBEHeNtdnbysW7Y6Uq8CVng==" + }, + "node_modules/@types/react": { + "version": "18.2.45", + "resolved": "https://registry.npmjs.org/@types/react/-/react-18.2.45.tgz", + "integrity": "sha512-TtAxCNrlrBp8GoeEp1npd5g+d/OejJHFxS3OWmrPBMFaVQMSN0OFySozJio5BHxTuTeug00AVXVAjfDSfk+lUg==", + "dependencies": { + "@types/prop-types": "*", + "@types/scheduler": "*", + "csstype": "^3.0.2" + } + }, + "node_modules/@types/react-transition-group": { + "version": "4.4.10", + "resolved": "https://registry.npmjs.org/@types/react-transition-group/-/react-transition-group-4.4.10.tgz", + "integrity": "sha512-hT/+s0VQs2ojCX823m60m5f0sL5idt9SO6Tj6Dg+rdphGPIeJbJ6CxvBYkgkGKrYeDjvIpKTR38UzmtHJOGW3Q==", + "dependencies": { + "@types/react": "*" + } + }, + "node_modules/@types/scheduler": { + "version": "0.16.8", + "resolved": "https://registry.npmjs.org/@types/scheduler/-/scheduler-0.16.8.tgz", + "integrity": "sha512-WZLiwShhwLRmeV6zH+GkbOFT6Z6VklCItrDioxUnv+u4Ll+8vKeFySoFyK/0ctcRpOmwAicELfmys1sDc/Rw+A==" + }, "node_modules/@typescript-eslint/parser": { "version": "6.15.0", "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-6.15.0.tgz", @@ -830,6 +859,11 @@ "node": ">= 8" } }, + "node_modules/csstype": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.1.3.tgz", + "integrity": "sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==" + }, "node_modules/damerau-levenshtein": { "version": "1.0.8", "resolved": "https://registry.npmjs.org/damerau-levenshtein/-/damerau-levenshtein-1.0.8.tgz", @@ -923,6 +957,15 @@ "node": ">=6.0.0" } }, + "node_modules/dom-helpers": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/dom-helpers/-/dom-helpers-5.2.1.tgz", + "integrity": "sha512-nRCa7CK3VTrM2NmGkIy4cbK7IZlgBE/PYMn55rrXefr5xXDP0LdtfPnblFDoVdcAfslJ7or6iqAUnx0CCGIWQA==", + "dependencies": { + "@babel/runtime": "^7.8.7", + "csstype": "^3.0.2" + } + }, "node_modules/emoji-regex": { "version": "9.2.2", "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz", @@ -2550,7 +2593,6 @@ "version": "4.1.1", "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==", - "dev": true, "engines": { "node": ">=0.10.0" } @@ -2827,11 +2869,37 @@ "node": ">= 0.8.0" } }, + "node_modules/primeicons": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/primeicons/-/primeicons-6.0.1.tgz", + "integrity": "sha512-KDeO94CbWI4pKsPnYpA1FPjo79EsY9I+M8ywoPBSf9XMXoe/0crjbUK7jcQEDHuc0ZMRIZsxH3TYLv4TUtHmAA==" + }, + "node_modules/primereact": { + "version": "10.2.1", + "resolved": "https://registry.npmjs.org/primereact/-/primereact-10.2.1.tgz", + "integrity": "sha512-F25053E1z+fod6V7AJ1Ix/DwSPkFQotk2+Idm0XkFsN+gQEywH7DgtbvNKpUA+LEq48h2+/WVK3D0V8IAm1Npg==", + "dependencies": { + "@types/react-transition-group": "^4.4.1", + "react-transition-group": "^4.4.1" + }, + "engines": { + "node": ">=14.0.0" + }, + "peerDependencies": { + "@types/react": "^17.0.0 || ^18.0.0", + "react": "^17.0.0 || ^18.0.0", + "react-dom": "^17.0.0 || ^18.0.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, "node_modules/prop-types": { "version": "15.8.1", "resolved": "https://registry.npmjs.org/prop-types/-/prop-types-15.8.1.tgz", "integrity": "sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg==", - "dev": true, "dependencies": { "loose-envify": "^1.4.0", "object-assign": "^4.1.1", @@ -2893,8 +2961,22 @@ "node_modules/react-is": { "version": "16.13.1", "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz", - "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==", - "dev": true + "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==" + }, + "node_modules/react-transition-group": { + "version": "4.4.5", + "resolved": "https://registry.npmjs.org/react-transition-group/-/react-transition-group-4.4.5.tgz", + "integrity": "sha512-pZcd1MCJoiKiBR2NRxeCRg13uCXbydPnmB4EOeRrY7480qNWO8IIgQG6zlDkm6uRMsURXPuKq0GWtiM59a5Q6g==", + "dependencies": { + "@babel/runtime": "^7.5.5", + "dom-helpers": "^5.0.1", + "loose-envify": "^1.4.0", + "prop-types": "^15.6.2" + }, + "peerDependencies": { + "react": ">=16.6.0", + "react-dom": ">=16.6.0" + } }, "node_modules/reflect.getprototypeof": { "version": "1.0.4", @@ -2919,8 +3001,7 @@ "node_modules/regenerator-runtime": { "version": "0.14.1", "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.14.1.tgz", - "integrity": "sha512-dYnhHh0nJoMfnkZs6GmmhFknAGRrLznOu5nc9ML+EJxGvrx6H7teuevqVqCuPcPK//3eDrrjQhehXVx9cnkGdw==", - "dev": true + "integrity": "sha512-dYnhHh0nJoMfnkZs6GmmhFknAGRrLznOu5nc9ML+EJxGvrx6H7teuevqVqCuPcPK//3eDrrjQhehXVx9cnkGdw==" }, "node_modules/regexp.prototype.flags": { "version": "1.5.1", diff --git a/package.json b/package.json index c3ba939..afbbcbd 100644 --- a/package.json +++ b/package.json @@ -9,9 +9,11 @@ "lint": "next lint" }, "dependencies": { + "next": "14.0.4", + "primeicons": "^6.0.1", + "primereact": "^10.2.1", "react": "^18", - "react-dom": "^18", - "next": "14.0.4" + "react-dom": "^18" }, "devDependencies": { "eslint": "^8", diff --git a/prisma/schema.prisma b/prisma/schema.prisma new file mode 100644 index 0000000..85733f7 --- /dev/null +++ b/prisma/schema.prisma @@ -0,0 +1,56 @@ +datasource db { + provider = "postgresql" + url = env("DATABASE_URL") +} + +model User { + id Int @id @default(autoincrement()) + npub String @unique + username String? @unique + purchased Purchase[] + role Role? @relation(fields: [roleId], references: [id]) + roleId Int? + createdAt DateTime @default(now()) + updatedAt DateTime @updatedAt +} + +model Role { + id Int @id @default(autoincrement()) + name String @unique + users User[] +} + +model Course { + id Int @id @default(autoincrement()) + title String + description String + isFree Boolean @default(false) + resources Resource[] + purchases Purchase[] + noteId String? @unique + createdAt DateTime @default(now()) + updatedAt DateTime @updatedAt +} + +model Resource { + id Int @id @default(autoincrement()) + title String + content String // Markdown content + course Course? @relation(fields: [courseId], references: [id]) + noteId String? @unique + courseId Int? + createdAt DateTime @default(now()) + updatedAt DateTime @updatedAt +} + +model Purchase { + id Int @id @default(autoincrement()) + user User @relation(fields: [userId], references: [id]) + userId Int + course Course @relation(fields: [courseId], references: [id]) + courseId Int + amountPaid Int // in satoshis + paymentType String // Webln or NWC + createdAt DateTime @default(now()) + updatedAt DateTime @updatedAt +} \ No newline at end of file diff --git a/public/plebdevs-guy.jpg b/public/plebdevs-guy.jpg new file mode 100644 index 0000000000000000000000000000000000000000..a846e32bf5fb4dd0e9b8b9d8f4dbc86f0858d2f0 GIT binary patch literal 11751 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 literal 0 HcmV?d00001 diff --git a/src/components/navbar/Navbar.js b/src/components/navbar/Navbar.js new file mode 100644 index 0000000..b407bcb --- /dev/null +++ b/src/components/navbar/Navbar.js @@ -0,0 +1,36 @@ +import React from 'react'; +import Image from 'next/image'; +import { Button } from 'primereact/button'; +import { Menubar } from 'primereact/menubar'; +import 'primereact/resources/primereact.min.css'; // core css +import 'primeicons/primeicons.css'; // icons +import styles from './navbar.module.css'; + +const end = ( +