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