Initial commit
This commit is contained in:
@@ -0,0 +1,12 @@
|
|||||||
|
DATABASE_URL="postgresql://user:password@db:5432/mydb?schema=public"
|
||||||
|
|
||||||
|
POSTGRES_DB=mydb
|
||||||
|
POSTGRES_USER=user
|
||||||
|
POSTGRES_PASS=password
|
||||||
|
POSTGRES_PORT=32676
|
||||||
|
|
||||||
|
NUXT_SESSION_PASSWORD=# openssl rand -base64 32
|
||||||
|
|
||||||
|
REDIS_PORT=6379
|
||||||
|
NUXT_REDIS_HOST=redis
|
||||||
|
NUXT_REDIS_PASSWORD=# openssl rand -base64 32
|
||||||
+26
@@ -0,0 +1,26 @@
|
|||||||
|
# Nuxt dev/build outputs
|
||||||
|
.output
|
||||||
|
.data
|
||||||
|
.nuxt
|
||||||
|
.nitro
|
||||||
|
.cache
|
||||||
|
dist
|
||||||
|
|
||||||
|
# Node dependencies
|
||||||
|
node_modules
|
||||||
|
|
||||||
|
# Logs
|
||||||
|
logs
|
||||||
|
*.log
|
||||||
|
|
||||||
|
# Misc
|
||||||
|
.DS_Store
|
||||||
|
.fleet
|
||||||
|
.idea
|
||||||
|
|
||||||
|
# Local env files
|
||||||
|
.env
|
||||||
|
.env.*
|
||||||
|
!.env.example
|
||||||
|
|
||||||
|
/app/generated/prisma
|
||||||
@@ -0,0 +1,5 @@
|
|||||||
|
.idea
|
||||||
|
.output
|
||||||
|
.nuxt
|
||||||
|
node_modules
|
||||||
|
prisma/migrations
|
||||||
@@ -0,0 +1,5 @@
|
|||||||
|
{
|
||||||
|
"trailingComma": "none",
|
||||||
|
"singleQuote": true,
|
||||||
|
"plugins": ["prettier-plugin-organize-imports", "prettier-plugin-tailwindcss"]
|
||||||
|
}
|
||||||
@@ -0,0 +1,75 @@
|
|||||||
|
# Nuxt Minimal Starter
|
||||||
|
|
||||||
|
Look at the [Nuxt documentation](https://nuxt.com/docs/getting-started/introduction) to learn more.
|
||||||
|
|
||||||
|
## Setup
|
||||||
|
|
||||||
|
Make sure to install dependencies:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# npm
|
||||||
|
npm install
|
||||||
|
|
||||||
|
# pnpm
|
||||||
|
pnpm install
|
||||||
|
|
||||||
|
# yarn
|
||||||
|
yarn install
|
||||||
|
|
||||||
|
# bun
|
||||||
|
bun install
|
||||||
|
```
|
||||||
|
|
||||||
|
## Development Server
|
||||||
|
|
||||||
|
Start the development server on `http://localhost:3000`:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# npm
|
||||||
|
npm run dev
|
||||||
|
|
||||||
|
# pnpm
|
||||||
|
pnpm dev
|
||||||
|
|
||||||
|
# yarn
|
||||||
|
yarn dev
|
||||||
|
|
||||||
|
# bun
|
||||||
|
bun run dev
|
||||||
|
```
|
||||||
|
|
||||||
|
## Production
|
||||||
|
|
||||||
|
Build the application for production:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# npm
|
||||||
|
npm run build
|
||||||
|
|
||||||
|
# pnpm
|
||||||
|
pnpm build
|
||||||
|
|
||||||
|
# yarn
|
||||||
|
yarn build
|
||||||
|
|
||||||
|
# bun
|
||||||
|
bun run build
|
||||||
|
```
|
||||||
|
|
||||||
|
Locally preview production build:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# npm
|
||||||
|
npm run preview
|
||||||
|
|
||||||
|
# pnpm
|
||||||
|
pnpm preview
|
||||||
|
|
||||||
|
# yarn
|
||||||
|
yarn preview
|
||||||
|
|
||||||
|
# bun
|
||||||
|
bun run preview
|
||||||
|
```
|
||||||
|
|
||||||
|
Check out the [deployment documentation](https://nuxt.com/docs/getting-started/deployment) for more information.
|
||||||
@@ -0,0 +1,6 @@
|
|||||||
|
<template>
|
||||||
|
<div>
|
||||||
|
<NuxtRouteAnnouncer />
|
||||||
|
<NuxtWelcome />
|
||||||
|
</div>
|
||||||
|
</template>
|
||||||
@@ -0,0 +1,3 @@
|
|||||||
|
{
|
||||||
|
"hello": "Hallo"
|
||||||
|
}
|
||||||
@@ -0,0 +1,3 @@
|
|||||||
|
{
|
||||||
|
"hello": "Hello"
|
||||||
|
}
|
||||||
@@ -0,0 +1,7 @@
|
|||||||
|
services:
|
||||||
|
db:
|
||||||
|
ports:
|
||||||
|
- '127.0.0.1:${POSTGRES_PORT}:5432'
|
||||||
|
redis:
|
||||||
|
ports:
|
||||||
|
- '127.0.0.1:${REDIS_PORT}:6379'
|
||||||
@@ -0,0 +1,17 @@
|
|||||||
|
services:
|
||||||
|
app:
|
||||||
|
build:
|
||||||
|
dockerfile: Dockerfile
|
||||||
|
context: .
|
||||||
|
networks:
|
||||||
|
- internal
|
||||||
|
depends_on:
|
||||||
|
- db
|
||||||
|
restart: always
|
||||||
|
env_file: .env
|
||||||
|
ports:
|
||||||
|
- '127.0.0.1:3001:3000'
|
||||||
|
environment:
|
||||||
|
- DATABASE_URL=postgresql://${POSTGRES_USER}:${POSTGRES_PASS}@db:5432/${POSTGRES_DB}?schema=public
|
||||||
|
- NUXT_REDIS_HOST=redis
|
||||||
|
- NUXT_REDIS_PASSWORD=${NUXT_REDIS_PASSWORD}
|
||||||
@@ -0,0 +1,33 @@
|
|||||||
|
version: '3.9'
|
||||||
|
|
||||||
|
volumes:
|
||||||
|
db:
|
||||||
|
redis:
|
||||||
|
|
||||||
|
networks:
|
||||||
|
internal:
|
||||||
|
|
||||||
|
services:
|
||||||
|
db:
|
||||||
|
image: postgres:17
|
||||||
|
volumes:
|
||||||
|
- db:/var/lib/postgresql/data
|
||||||
|
environment:
|
||||||
|
- POSTGRES_DB=${POSTGRES_DB}
|
||||||
|
- POSTGRES_USER=${POSTGRES_USER}
|
||||||
|
- POSTGRES_PASSWORD=${POSTGRES_PASS}
|
||||||
|
restart: always
|
||||||
|
networks:
|
||||||
|
- internal
|
||||||
|
healthcheck:
|
||||||
|
test: 'PGPASSWORD=${POSTGRES_PASS} pg_isready -h 127.0.0.1 -U ${POSTGRES_USER} -d ${POSTGRES_DB}'
|
||||||
|
redis:
|
||||||
|
image: redis:6.2-alpine
|
||||||
|
networks:
|
||||||
|
- internal
|
||||||
|
restart: always
|
||||||
|
command: redis-server --save 20 1 --loglevel warning --requirepass ${NUXT_REDIS_PASSWORD}
|
||||||
|
healthcheck:
|
||||||
|
test: redis-cli -a ${NUXT_REDIS_PASSWORD} ping || exit 1
|
||||||
|
volumes:
|
||||||
|
- redis:/data
|
||||||
@@ -0,0 +1,15 @@
|
|||||||
|
import { PrismaClient } from '@prisma/client';
|
||||||
|
|
||||||
|
const prismaClientSingleton = () => {
|
||||||
|
return new PrismaClient();
|
||||||
|
};
|
||||||
|
|
||||||
|
declare const globalThis: {
|
||||||
|
prismaGlobal: ReturnType<typeof prismaClientSingleton>;
|
||||||
|
} & typeof global;
|
||||||
|
|
||||||
|
const prisma = globalThis.prismaGlobal ?? prismaClientSingleton();
|
||||||
|
|
||||||
|
export default prisma;
|
||||||
|
|
||||||
|
if (process.env.NODE_ENV !== 'production') globalThis.prismaGlobal = prisma;
|
||||||
@@ -0,0 +1,31 @@
|
|||||||
|
// https://nuxt.com/docs/api/configuration/nuxt-config
|
||||||
|
export default defineNuxtConfig({
|
||||||
|
compatibilityDate: '2025-07-15',
|
||||||
|
devtools: { enabled: true },
|
||||||
|
devServer: { port: 3080 },
|
||||||
|
modules: [
|
||||||
|
'nuxt-auth-utils',
|
||||||
|
'@nuxtjs/i18n',
|
||||||
|
'@nuxtjs/tailwindcss',
|
||||||
|
'@prisma/nuxt'
|
||||||
|
],
|
||||||
|
i18n: {
|
||||||
|
locales: [
|
||||||
|
{
|
||||||
|
file: 'de.json',
|
||||||
|
code: 'de',
|
||||||
|
language: 'de-DE'
|
||||||
|
},
|
||||||
|
{
|
||||||
|
file: 'en.json',
|
||||||
|
code: 'en',
|
||||||
|
language: 'en-US'
|
||||||
|
}
|
||||||
|
],
|
||||||
|
customRoutes: 'page',
|
||||||
|
strategy: 'prefix_and_default',
|
||||||
|
defaultLocale: 'de',
|
||||||
|
langDir: 'lang',
|
||||||
|
lazy: true
|
||||||
|
}
|
||||||
|
});
|
||||||
@@ -0,0 +1,31 @@
|
|||||||
|
{
|
||||||
|
"name": "nuxt-app",
|
||||||
|
"private": true,
|
||||||
|
"type": "module",
|
||||||
|
"scripts": {
|
||||||
|
"build": "nuxt build",
|
||||||
|
"dev": "bunx --bun nuxt dev",
|
||||||
|
"generate": "nuxt generate",
|
||||||
|
"preview": "nuxt preview",
|
||||||
|
"postinstall": "nuxt prepare",
|
||||||
|
"format": "prettier --write .",
|
||||||
|
"check": "prettier --check ."
|
||||||
|
},
|
||||||
|
"dependencies": {
|
||||||
|
"@nuxtjs/i18n": "^10.0.3",
|
||||||
|
"@nuxtjs/tailwindcss": "^6.14.0",
|
||||||
|
"@prisma/nuxt": "^0.3.0",
|
||||||
|
"argon2": "^0.43.1",
|
||||||
|
"h3-zod": "^0.5.3",
|
||||||
|
"nuxt": "^4.0.1",
|
||||||
|
"nuxt-auth-utils": "^0.5.22",
|
||||||
|
"vue": "^3.5.18",
|
||||||
|
"vue-router": "^4.5.1"
|
||||||
|
},
|
||||||
|
"devDependencies": {
|
||||||
|
"prettier": "^3.6.2",
|
||||||
|
"prettier-plugin-organize-imports": "^4.2.0",
|
||||||
|
"prettier-plugin-tailwindcss": "^0.6.14",
|
||||||
|
"vue-tsc": "^3.0.4"
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,208 @@
|
|||||||
|
-- CreateEnum
|
||||||
|
CREATE TYPE "public"."UserRole" AS ENUM ('USER', 'CREATOR', 'ADMIN');
|
||||||
|
|
||||||
|
-- CreateEnum
|
||||||
|
CREATE TYPE "public"."TextType" AS ENUM ('TEXT', 'WORD', 'NUMBER', 'INTEGER');
|
||||||
|
|
||||||
|
-- CreateTable
|
||||||
|
CREATE TABLE "public"."User" (
|
||||||
|
"id" SERIAL NOT NULL,
|
||||||
|
"email" TEXT NOT NULL,
|
||||||
|
"name" TEXT NOT NULL,
|
||||||
|
"role" "public"."UserRole" NOT NULL,
|
||||||
|
"emailConfirmedAt" TIMESTAMPTZ(3),
|
||||||
|
"deactivated" BOOLEAN NOT NULL DEFAULT false,
|
||||||
|
"createdAt" TIMESTAMPTZ(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
||||||
|
"updatedAt" TIMESTAMPTZ(3) NOT NULL,
|
||||||
|
"deletedAt" TIMESTAMPTZ(3),
|
||||||
|
|
||||||
|
CONSTRAINT "User_pkey" PRIMARY KEY ("id")
|
||||||
|
);
|
||||||
|
|
||||||
|
-- CreateTable
|
||||||
|
CREATE TABLE "public"."UserLoginLinks" (
|
||||||
|
"id" SERIAL NOT NULL,
|
||||||
|
"secret" TEXT NOT NULL,
|
||||||
|
"used" BOOLEAN NOT NULL DEFAULT false,
|
||||||
|
"userId" INTEGER NOT NULL,
|
||||||
|
"createdAt" TIMESTAMPTZ(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
||||||
|
|
||||||
|
CONSTRAINT "UserLoginLinks_pkey" PRIMARY KEY ("id")
|
||||||
|
);
|
||||||
|
|
||||||
|
-- CreateTable
|
||||||
|
CREATE TABLE "public"."Hunt" (
|
||||||
|
"id" SERIAL NOT NULL,
|
||||||
|
"name" TEXT NOT NULL,
|
||||||
|
"description" TEXT NOT NULL,
|
||||||
|
"virtual" BOOLEAN NOT NULL DEFAULT false,
|
||||||
|
"start" TIMESTAMPTZ(3),
|
||||||
|
"end" TIMESTAMPTZ(3),
|
||||||
|
"allowJoin" BOOLEAN NOT NULL DEFAULT false,
|
||||||
|
"revealPictures" BOOLEAN NOT NULL DEFAULT false,
|
||||||
|
"revealAnswers" BOOLEAN NOT NULL DEFAULT false,
|
||||||
|
"creatorId" INTEGER NOT NULL,
|
||||||
|
"createdAt" TIMESTAMPTZ(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
||||||
|
"updatedAt" TIMESTAMPTZ(3) NOT NULL,
|
||||||
|
"deletedAt" TIMESTAMPTZ(3),
|
||||||
|
|
||||||
|
CONSTRAINT "Hunt_pkey" PRIMARY KEY ("id")
|
||||||
|
);
|
||||||
|
|
||||||
|
-- CreateTable
|
||||||
|
CREATE TABLE "public"."HuntMember" (
|
||||||
|
"huntId" INTEGER NOT NULL,
|
||||||
|
"memberId" INTEGER NOT NULL,
|
||||||
|
"createdAt" TIMESTAMPTZ(3) NOT NULL DEFAULT CURRENT_TIMESTAMP
|
||||||
|
);
|
||||||
|
|
||||||
|
-- CreateTable
|
||||||
|
CREATE TABLE "public"."HuntTeam" (
|
||||||
|
"id" SERIAL NOT NULL,
|
||||||
|
"name" TEXT NOT NULL,
|
||||||
|
"description" TEXT NOT NULL DEFAULT '',
|
||||||
|
"password" TEXT NOT NULL DEFAULT '',
|
||||||
|
"huntId" INTEGER NOT NULL,
|
||||||
|
"ownerId" INTEGER NOT NULL,
|
||||||
|
"createdAt" TIMESTAMPTZ(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
||||||
|
|
||||||
|
CONSTRAINT "HuntTeam_pkey" PRIMARY KEY ("id")
|
||||||
|
);
|
||||||
|
|
||||||
|
-- CreateTable
|
||||||
|
CREATE TABLE "public"."TeamMember" (
|
||||||
|
"teamId" INTEGER NOT NULL,
|
||||||
|
"memberId" INTEGER NOT NULL,
|
||||||
|
"createdAt" TIMESTAMPTZ(3) NOT NULL DEFAULT CURRENT_TIMESTAMP
|
||||||
|
);
|
||||||
|
|
||||||
|
-- CreateTable
|
||||||
|
CREATE TABLE "public"."HuntQuest" (
|
||||||
|
"id" SERIAL NOT NULL,
|
||||||
|
"title" TEXT NOT NULL,
|
||||||
|
"description" TEXT NOT NULL DEFAULT '',
|
||||||
|
"question" TEXT,
|
||||||
|
"image" TEXT,
|
||||||
|
"location" TEXT,
|
||||||
|
"locationLink" TEXT,
|
||||||
|
"order" INTEGER NOT NULL DEFAULT 0,
|
||||||
|
"optional" BOOLEAN NOT NULL DEFAULT true,
|
||||||
|
"pictureRequired" BOOLEAN NOT NULL DEFAULT false,
|
||||||
|
"textRequired" BOOLEAN NOT NULL DEFAULT false,
|
||||||
|
"textType" "public"."TextType" NOT NULL DEFAULT 'TEXT',
|
||||||
|
"textUnit" TEXT,
|
||||||
|
"textSolution" TEXT,
|
||||||
|
"points" SMALLINT NOT NULL DEFAULT 10,
|
||||||
|
"extraPoints" SMALLINT,
|
||||||
|
"extraText" TEXT,
|
||||||
|
"huntId" INTEGER NOT NULL,
|
||||||
|
|
||||||
|
CONSTRAINT "HuntQuest_pkey" PRIMARY KEY ("id")
|
||||||
|
);
|
||||||
|
|
||||||
|
-- CreateTable
|
||||||
|
CREATE TABLE "public"."QuestAnswer" (
|
||||||
|
"id" SERIAL NOT NULL,
|
||||||
|
"text" TEXT,
|
||||||
|
"picture" TEXT,
|
||||||
|
"location" TEXT,
|
||||||
|
"lat" DECIMAL(10,8),
|
||||||
|
"lon" DECIMAL(10,8),
|
||||||
|
"teamId" INTEGER NOT NULL,
|
||||||
|
"memberId" INTEGER NOT NULL,
|
||||||
|
"questId" INTEGER NOT NULL,
|
||||||
|
"createdAt" TIMESTAMPTZ(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
||||||
|
"updatedAt" TIMESTAMPTZ(3) NOT NULL,
|
||||||
|
"reviewerId" INTEGER,
|
||||||
|
"score" SMALLINT,
|
||||||
|
"review" TEXT,
|
||||||
|
|
||||||
|
CONSTRAINT "QuestAnswer_pkey" PRIMARY KEY ("id")
|
||||||
|
);
|
||||||
|
|
||||||
|
-- CreateIndex
|
||||||
|
CREATE UNIQUE INDEX "User_email_key" ON "public"."User"("email");
|
||||||
|
|
||||||
|
-- CreateIndex
|
||||||
|
CREATE INDEX "Hunt_creatorId_idx" ON "public"."Hunt"("creatorId");
|
||||||
|
|
||||||
|
-- CreateIndex
|
||||||
|
CREATE INDEX "HuntMember_memberId_huntId_idx" ON "public"."HuntMember"("memberId", "huntId");
|
||||||
|
|
||||||
|
-- CreateIndex
|
||||||
|
CREATE INDEX "HuntMember_memberId_idx" ON "public"."HuntMember"("memberId");
|
||||||
|
|
||||||
|
-- CreateIndex
|
||||||
|
CREATE INDEX "HuntMember_huntId_idx" ON "public"."HuntMember"("huntId");
|
||||||
|
|
||||||
|
-- CreateIndex
|
||||||
|
CREATE UNIQUE INDEX "HuntMember_memberId_huntId_key" ON "public"."HuntMember"("memberId", "huntId");
|
||||||
|
|
||||||
|
-- CreateIndex
|
||||||
|
CREATE INDEX "HuntTeam_ownerId_idx" ON "public"."HuntTeam"("ownerId");
|
||||||
|
|
||||||
|
-- CreateIndex
|
||||||
|
CREATE INDEX "HuntTeam_huntId_idx" ON "public"."HuntTeam"("huntId");
|
||||||
|
|
||||||
|
-- CreateIndex
|
||||||
|
CREATE INDEX "TeamMember_teamId_idx" ON "public"."TeamMember"("teamId");
|
||||||
|
|
||||||
|
-- CreateIndex
|
||||||
|
CREATE INDEX "TeamMember_memberId_idx" ON "public"."TeamMember"("memberId");
|
||||||
|
|
||||||
|
-- CreateIndex
|
||||||
|
CREATE INDEX "TeamMember_memberId_teamId_idx" ON "public"."TeamMember"("memberId", "teamId");
|
||||||
|
|
||||||
|
-- CreateIndex
|
||||||
|
CREATE UNIQUE INDEX "TeamMember_memberId_teamId_key" ON "public"."TeamMember"("memberId", "teamId");
|
||||||
|
|
||||||
|
-- CreateIndex
|
||||||
|
CREATE INDEX "HuntQuest_huntId_idx" ON "public"."HuntQuest"("huntId");
|
||||||
|
|
||||||
|
-- CreateIndex
|
||||||
|
CREATE INDEX "QuestAnswer_teamId_idx" ON "public"."QuestAnswer"("teamId");
|
||||||
|
|
||||||
|
-- CreateIndex
|
||||||
|
CREATE INDEX "QuestAnswer_memberId_idx" ON "public"."QuestAnswer"("memberId");
|
||||||
|
|
||||||
|
-- CreateIndex
|
||||||
|
CREATE INDEX "QuestAnswer_questId_idx" ON "public"."QuestAnswer"("questId");
|
||||||
|
|
||||||
|
-- AddForeignKey
|
||||||
|
ALTER TABLE "public"."UserLoginLinks" ADD CONSTRAINT "UserLoginLinks_userId_fkey" FOREIGN KEY ("userId") REFERENCES "public"."User"("id") ON DELETE CASCADE ON UPDATE CASCADE;
|
||||||
|
|
||||||
|
-- AddForeignKey
|
||||||
|
ALTER TABLE "public"."Hunt" ADD CONSTRAINT "Hunt_creatorId_fkey" FOREIGN KEY ("creatorId") REFERENCES "public"."User"("id") ON DELETE CASCADE ON UPDATE CASCADE;
|
||||||
|
|
||||||
|
-- AddForeignKey
|
||||||
|
ALTER TABLE "public"."HuntMember" ADD CONSTRAINT "HuntMember_huntId_fkey" FOREIGN KEY ("huntId") REFERENCES "public"."Hunt"("id") ON DELETE CASCADE ON UPDATE CASCADE;
|
||||||
|
|
||||||
|
-- AddForeignKey
|
||||||
|
ALTER TABLE "public"."HuntMember" ADD CONSTRAINT "HuntMember_memberId_fkey" FOREIGN KEY ("memberId") REFERENCES "public"."User"("id") ON DELETE CASCADE ON UPDATE CASCADE;
|
||||||
|
|
||||||
|
-- AddForeignKey
|
||||||
|
ALTER TABLE "public"."HuntTeam" ADD CONSTRAINT "HuntTeam_huntId_fkey" FOREIGN KEY ("huntId") REFERENCES "public"."Hunt"("id") ON DELETE CASCADE ON UPDATE CASCADE;
|
||||||
|
|
||||||
|
-- AddForeignKey
|
||||||
|
ALTER TABLE "public"."HuntTeam" ADD CONSTRAINT "HuntTeam_ownerId_fkey" FOREIGN KEY ("ownerId") REFERENCES "public"."User"("id") ON DELETE CASCADE ON UPDATE CASCADE;
|
||||||
|
|
||||||
|
-- AddForeignKey
|
||||||
|
ALTER TABLE "public"."TeamMember" ADD CONSTRAINT "TeamMember_teamId_fkey" FOREIGN KEY ("teamId") REFERENCES "public"."HuntTeam"("id") ON DELETE CASCADE ON UPDATE CASCADE;
|
||||||
|
|
||||||
|
-- AddForeignKey
|
||||||
|
ALTER TABLE "public"."TeamMember" ADD CONSTRAINT "TeamMember_memberId_fkey" FOREIGN KEY ("memberId") REFERENCES "public"."User"("id") ON DELETE CASCADE ON UPDATE CASCADE;
|
||||||
|
|
||||||
|
-- AddForeignKey
|
||||||
|
ALTER TABLE "public"."HuntQuest" ADD CONSTRAINT "HuntQuest_huntId_fkey" FOREIGN KEY ("huntId") REFERENCES "public"."Hunt"("id") ON DELETE CASCADE ON UPDATE CASCADE;
|
||||||
|
|
||||||
|
-- AddForeignKey
|
||||||
|
ALTER TABLE "public"."QuestAnswer" ADD CONSTRAINT "QuestAnswer_teamId_fkey" FOREIGN KEY ("teamId") REFERENCES "public"."HuntTeam"("id") ON DELETE CASCADE ON UPDATE CASCADE;
|
||||||
|
|
||||||
|
-- AddForeignKey
|
||||||
|
ALTER TABLE "public"."QuestAnswer" ADD CONSTRAINT "QuestAnswer_memberId_fkey" FOREIGN KEY ("memberId") REFERENCES "public"."User"("id") ON DELETE CASCADE ON UPDATE CASCADE;
|
||||||
|
|
||||||
|
-- AddForeignKey
|
||||||
|
ALTER TABLE "public"."QuestAnswer" ADD CONSTRAINT "QuestAnswer_questId_fkey" FOREIGN KEY ("questId") REFERENCES "public"."HuntQuest"("id") ON DELETE CASCADE ON UPDATE CASCADE;
|
||||||
|
|
||||||
|
-- AddForeignKey
|
||||||
|
ALTER TABLE "public"."QuestAnswer" ADD CONSTRAINT "QuestAnswer_reviewerId_fkey" FOREIGN KEY ("reviewerId") REFERENCES "public"."User"("id") ON DELETE CASCADE ON UPDATE CASCADE;
|
||||||
@@ -0,0 +1,3 @@
|
|||||||
|
# Please do not edit this file manually
|
||||||
|
# It should be added in your version-control system (e.g., Git)
|
||||||
|
provider = "postgresql"
|
||||||
@@ -0,0 +1,197 @@
|
|||||||
|
generator client {
|
||||||
|
provider = "prisma-client-js"
|
||||||
|
output = "../app/generated/prisma"
|
||||||
|
}
|
||||||
|
|
||||||
|
datasource db {
|
||||||
|
provider = "postgresql"
|
||||||
|
url = env("DATABASE_URL")
|
||||||
|
}
|
||||||
|
|
||||||
|
model User {
|
||||||
|
id Int @id @default(autoincrement())
|
||||||
|
email String @unique
|
||||||
|
name String
|
||||||
|
role UserRole
|
||||||
|
|
||||||
|
emailConfirmedAt DateTime? @db.Timestamptz(3)
|
||||||
|
|
||||||
|
loginLinks UserLoginLinks[]
|
||||||
|
|
||||||
|
deactivated Boolean @default(false)
|
||||||
|
|
||||||
|
createdAt DateTime @default(now()) @db.Timestamptz(3)
|
||||||
|
updatedAt DateTime @updatedAt @db.Timestamptz(3)
|
||||||
|
deletedAt DateTime? @db.Timestamptz(3)
|
||||||
|
|
||||||
|
huntsCreated Hunt[]
|
||||||
|
huntsMember HuntMember[]
|
||||||
|
|
||||||
|
teamsOwner HuntTeam[]
|
||||||
|
teamsMember TeamMember[]
|
||||||
|
answers QuestAnswer[] @relation("AnswerMember")
|
||||||
|
reviews QuestAnswer[] @relation("AnswerReview")
|
||||||
|
}
|
||||||
|
|
||||||
|
enum UserRole {
|
||||||
|
USER
|
||||||
|
CREATOR
|
||||||
|
ADMIN
|
||||||
|
}
|
||||||
|
|
||||||
|
model UserLoginLinks {
|
||||||
|
id Int @id @default(autoincrement())
|
||||||
|
|
||||||
|
secret String
|
||||||
|
used Boolean @default(false)
|
||||||
|
|
||||||
|
user User @relation(fields: [userId], references: [id], onUpdate: Cascade, onDelete: Cascade)
|
||||||
|
userId Int
|
||||||
|
|
||||||
|
createdAt DateTime @default(now()) @db.Timestamptz(3)
|
||||||
|
}
|
||||||
|
|
||||||
|
model Hunt {
|
||||||
|
id Int @id @default(autoincrement())
|
||||||
|
name String
|
||||||
|
description String
|
||||||
|
|
||||||
|
virtual Boolean @default(false)
|
||||||
|
start DateTime? @db.Timestamptz(3)
|
||||||
|
end DateTime? @db.Timestamptz(3)
|
||||||
|
allowJoin Boolean @default(false)
|
||||||
|
revealPictures Boolean @default(false)
|
||||||
|
revealAnswers Boolean @default(false)
|
||||||
|
|
||||||
|
creator User @relation(fields: [creatorId], references: [id], onUpdate: Cascade, onDelete: Cascade)
|
||||||
|
creatorId Int
|
||||||
|
|
||||||
|
createdAt DateTime @default(now()) @db.Timestamptz(3)
|
||||||
|
updatedAt DateTime @updatedAt @db.Timestamptz(3)
|
||||||
|
deletedAt DateTime? @db.Timestamptz(3)
|
||||||
|
|
||||||
|
teams HuntTeam[]
|
||||||
|
members HuntMember[]
|
||||||
|
|
||||||
|
quests HuntQuest[]
|
||||||
|
|
||||||
|
@@index([creatorId])
|
||||||
|
}
|
||||||
|
|
||||||
|
model HuntMember {
|
||||||
|
hunt Hunt @relation(fields: [huntId], references: [id], onUpdate: Cascade, onDelete: Cascade)
|
||||||
|
huntId Int
|
||||||
|
|
||||||
|
member User @relation(fields: [memberId], references: [id], onUpdate: Cascade, onDelete: Cascade)
|
||||||
|
memberId Int
|
||||||
|
|
||||||
|
createdAt DateTime @default(now()) @db.Timestamptz(3)
|
||||||
|
|
||||||
|
@@unique([memberId, huntId])
|
||||||
|
@@index([memberId, huntId])
|
||||||
|
@@index([memberId])
|
||||||
|
@@index([huntId])
|
||||||
|
}
|
||||||
|
|
||||||
|
model HuntTeam {
|
||||||
|
id Int @id @default(autoincrement())
|
||||||
|
name String
|
||||||
|
description String @default("")
|
||||||
|
password String @default("")
|
||||||
|
|
||||||
|
hunt Hunt @relation(fields: [huntId], references: [id], onUpdate: Cascade, onDelete: Cascade)
|
||||||
|
huntId Int
|
||||||
|
|
||||||
|
owner User @relation(fields: [ownerId], references: [id], onUpdate: Cascade, onDelete: Cascade)
|
||||||
|
ownerId Int
|
||||||
|
|
||||||
|
createdAt DateTime @default(now()) @db.Timestamptz(3)
|
||||||
|
|
||||||
|
members TeamMember[]
|
||||||
|
answers QuestAnswer[]
|
||||||
|
|
||||||
|
@@index([ownerId])
|
||||||
|
@@index([huntId])
|
||||||
|
}
|
||||||
|
|
||||||
|
model TeamMember {
|
||||||
|
team HuntTeam @relation(fields: [teamId], references: [id], onUpdate: Cascade, onDelete: Cascade)
|
||||||
|
teamId Int
|
||||||
|
|
||||||
|
member User @relation(fields: [memberId], references: [id], onUpdate: Cascade, onDelete: Cascade)
|
||||||
|
memberId Int
|
||||||
|
|
||||||
|
createdAt DateTime @default(now()) @db.Timestamptz(3)
|
||||||
|
|
||||||
|
@@unique([memberId, teamId])
|
||||||
|
@@index([teamId])
|
||||||
|
@@index([memberId])
|
||||||
|
@@index([memberId, teamId])
|
||||||
|
}
|
||||||
|
|
||||||
|
enum TextType {
|
||||||
|
TEXT
|
||||||
|
WORD
|
||||||
|
NUMBER
|
||||||
|
INTEGER
|
||||||
|
}
|
||||||
|
|
||||||
|
model HuntQuest {
|
||||||
|
id Int @id @default(autoincrement())
|
||||||
|
title String
|
||||||
|
description String @default("")
|
||||||
|
question String?
|
||||||
|
image String?
|
||||||
|
location String?
|
||||||
|
locationLink String?
|
||||||
|
|
||||||
|
order Int @default(0)
|
||||||
|
optional Boolean @default(true)
|
||||||
|
pictureRequired Boolean @default(false)
|
||||||
|
textRequired Boolean @default(false)
|
||||||
|
textType TextType @default(TEXT)
|
||||||
|
textUnit String?
|
||||||
|
textSolution String?
|
||||||
|
|
||||||
|
points Int @default(10) @db.SmallInt
|
||||||
|
extraPoints Int? @db.SmallInt
|
||||||
|
extraText String?
|
||||||
|
|
||||||
|
hunt Hunt @relation(fields: [huntId], references: [id], onUpdate: Cascade, onDelete: Cascade)
|
||||||
|
huntId Int
|
||||||
|
|
||||||
|
answers QuestAnswer[]
|
||||||
|
|
||||||
|
@@index([huntId])
|
||||||
|
}
|
||||||
|
|
||||||
|
model QuestAnswer {
|
||||||
|
id Int @id @default(autoincrement())
|
||||||
|
text String?
|
||||||
|
picture String?
|
||||||
|
location String?
|
||||||
|
lat Decimal? @db.Decimal(10, 8)
|
||||||
|
lon Decimal? @db.Decimal(10, 8)
|
||||||
|
|
||||||
|
team HuntTeam @relation(fields: [teamId], references: [id], onUpdate: Cascade, onDelete: Cascade)
|
||||||
|
teamId Int
|
||||||
|
|
||||||
|
member User @relation("AnswerMember", fields: [memberId], references: [id], onUpdate: Cascade, onDelete: Cascade)
|
||||||
|
memberId Int
|
||||||
|
|
||||||
|
quest HuntQuest @relation(fields: [questId], references: [id], onUpdate: Cascade, onDelete: Cascade)
|
||||||
|
questId Int
|
||||||
|
|
||||||
|
createdAt DateTime @default(now()) @db.Timestamptz(3)
|
||||||
|
updatedAt DateTime @updatedAt @db.Timestamptz(3)
|
||||||
|
|
||||||
|
reviewer User? @relation("AnswerReview", fields: [reviewerId], references: [id], onUpdate: Cascade, onDelete: Cascade)
|
||||||
|
reviewerId Int?
|
||||||
|
|
||||||
|
score Int? @db.SmallInt
|
||||||
|
review String?
|
||||||
|
|
||||||
|
@@index([teamId])
|
||||||
|
@@index([memberId])
|
||||||
|
@@index([questId])
|
||||||
|
}
|
||||||
Binary file not shown.
|
After Width: | Height: | Size: 4.2 KiB |
@@ -0,0 +1,2 @@
|
|||||||
|
User-Agent: *
|
||||||
|
Disallow:
|
||||||
@@ -0,0 +1,18 @@
|
|||||||
|
{
|
||||||
|
// https://nuxt.com/docs/guide/concepts/typescript
|
||||||
|
"files": [],
|
||||||
|
"references": [
|
||||||
|
{
|
||||||
|
"path": "./.nuxt/tsconfig.app.json"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"path": "./.nuxt/tsconfig.server.json"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"path": "./.nuxt/tsconfig.shared.json"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"path": "./.nuxt/tsconfig.node.json"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
Reference in New Issue
Block a user