Auth
This commit is contained in:
1504
package-lock.json
generated
1504
package-lock.json
generated
File diff suppressed because it is too large
Load Diff
@@ -27,7 +27,7 @@
|
|||||||
"postcss": "^8.4.41",
|
"postcss": "^8.4.41",
|
||||||
"prettier": "^3.1.1",
|
"prettier": "^3.1.1",
|
||||||
"prettier-plugin-svelte": "^3.1.2",
|
"prettier-plugin-svelte": "^3.1.2",
|
||||||
"prisma": "^5.18.0",
|
"prisma": "^5.19.0",
|
||||||
"svelte": "^5.0.0-next.1",
|
"svelte": "^5.0.0-next.1",
|
||||||
"svelte-check": "^3.6.0",
|
"svelte-check": "^3.6.0",
|
||||||
"tailwindcss": "^3.4.10",
|
"tailwindcss": "^3.4.10",
|
||||||
@@ -37,5 +37,9 @@
|
|||||||
"vite": "^5.0.3",
|
"vite": "^5.0.3",
|
||||||
"vitest": "^2.0.0"
|
"vitest": "^2.0.0"
|
||||||
},
|
},
|
||||||
"type": "module"
|
"type": "module",
|
||||||
|
"dependencies": {
|
||||||
|
"@prisma/client": "^5.19.0",
|
||||||
|
"clerk-sveltekit": "^0.4.2"
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
169
prisma/migrations/20240831183734_init/migration.sql
Normal file
169
prisma/migrations/20240831183734_init/migration.sql
Normal file
@@ -0,0 +1,169 @@
|
|||||||
|
-- CreateEnum
|
||||||
|
CREATE TYPE "PhaseType" AS ENUM ('DOUBLE_ELIM', 'SINGLE_ELIM', 'ROUND_ROBIN');
|
||||||
|
|
||||||
|
-- CreateTable
|
||||||
|
CREATE TABLE "User" (
|
||||||
|
"id" TEXT NOT NULL,
|
||||||
|
"name" TEXT NOT NULL,
|
||||||
|
"created" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
||||||
|
|
||||||
|
CONSTRAINT "User_pkey" PRIMARY KEY ("id")
|
||||||
|
);
|
||||||
|
|
||||||
|
-- CreateTable
|
||||||
|
CREATE TABLE "UserRole" (
|
||||||
|
"userId" TEXT NOT NULL,
|
||||||
|
"roleId" INTEGER NOT NULL,
|
||||||
|
|
||||||
|
CONSTRAINT "UserRole_pkey" PRIMARY KEY ("userId","roleId")
|
||||||
|
);
|
||||||
|
|
||||||
|
-- CreateTable
|
||||||
|
CREATE TABLE "Role" (
|
||||||
|
"id" SERIAL NOT NULL,
|
||||||
|
"name" TEXT NOT NULL,
|
||||||
|
|
||||||
|
CONSTRAINT "Role_pkey" PRIMARY KEY ("id")
|
||||||
|
);
|
||||||
|
|
||||||
|
-- CreateTable
|
||||||
|
CREATE TABLE "Tournament" (
|
||||||
|
"id" TEXT NOT NULL,
|
||||||
|
"name" TEXT NOT NULL,
|
||||||
|
"slug" TEXT,
|
||||||
|
"creatorUserId" TEXT NOT NULL,
|
||||||
|
"created" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
||||||
|
|
||||||
|
CONSTRAINT "Tournament_pkey" PRIMARY KEY ("id")
|
||||||
|
);
|
||||||
|
|
||||||
|
-- CreateTable
|
||||||
|
CREATE TABLE "Event" (
|
||||||
|
"id" TEXT NOT NULL,
|
||||||
|
"gameId" INTEGER NOT NULL,
|
||||||
|
"title" TEXT NOT NULL,
|
||||||
|
"tournamentId" TEXT NOT NULL,
|
||||||
|
"created" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
||||||
|
|
||||||
|
CONSTRAINT "Event_pkey" PRIMARY KEY ("id")
|
||||||
|
);
|
||||||
|
|
||||||
|
-- CreateTable
|
||||||
|
CREATE TABLE "Phase" (
|
||||||
|
"id" TEXT NOT NULL,
|
||||||
|
"name" TEXT NOT NULL,
|
||||||
|
"type" "PhaseType" NOT NULL,
|
||||||
|
"bracketCount" INTEGER NOT NULL,
|
||||||
|
"phaseWinnerCount" INTEGER NOT NULL,
|
||||||
|
"eventId" TEXT NOT NULL,
|
||||||
|
"created" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
||||||
|
|
||||||
|
CONSTRAINT "Phase_pkey" PRIMARY KEY ("id")
|
||||||
|
);
|
||||||
|
|
||||||
|
-- CreateTable
|
||||||
|
CREATE TABLE "Bracket" (
|
||||||
|
"id" SERIAL NOT NULL,
|
||||||
|
"name" TEXT NOT NULL,
|
||||||
|
"created" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
||||||
|
"phaseId" TEXT,
|
||||||
|
|
||||||
|
CONSTRAINT "Bracket_pkey" PRIMARY KEY ("id")
|
||||||
|
);
|
||||||
|
|
||||||
|
-- CreateTable
|
||||||
|
CREATE TABLE "Player" (
|
||||||
|
"id" SERIAL NOT NULL,
|
||||||
|
"name" TEXT,
|
||||||
|
"userId" TEXT NOT NULL,
|
||||||
|
"created" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
||||||
|
"userConfirmed" BOOLEAN NOT NULL DEFAULT false,
|
||||||
|
|
||||||
|
CONSTRAINT "Player_pkey" PRIMARY KEY ("id")
|
||||||
|
);
|
||||||
|
|
||||||
|
-- CreateTable
|
||||||
|
CREATE TABLE "EventPlayer" (
|
||||||
|
"eventId" TEXT NOT NULL,
|
||||||
|
"playerId" INTEGER NOT NULL,
|
||||||
|
"seed" INTEGER NOT NULL,
|
||||||
|
"manuallySeeded" BOOLEAN NOT NULL DEFAULT false,
|
||||||
|
|
||||||
|
CONSTRAINT "EventPlayer_pkey" PRIMARY KEY ("eventId","playerId")
|
||||||
|
);
|
||||||
|
|
||||||
|
-- CreateTable
|
||||||
|
CREATE TABLE "Game" (
|
||||||
|
"id" SERIAL NOT NULL,
|
||||||
|
"title" TEXT NOT NULL,
|
||||||
|
"slug" TEXT,
|
||||||
|
"created" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
||||||
|
|
||||||
|
CONSTRAINT "Game_pkey" PRIMARY KEY ("id")
|
||||||
|
);
|
||||||
|
|
||||||
|
-- CreateTable
|
||||||
|
CREATE TABLE "_admins" (
|
||||||
|
"A" TEXT NOT NULL,
|
||||||
|
"B" TEXT NOT NULL
|
||||||
|
);
|
||||||
|
|
||||||
|
-- CreateTable
|
||||||
|
CREATE TABLE "_moderators" (
|
||||||
|
"A" TEXT NOT NULL,
|
||||||
|
"B" TEXT NOT NULL
|
||||||
|
);
|
||||||
|
|
||||||
|
-- CreateIndex
|
||||||
|
CREATE UNIQUE INDEX "_admins_AB_unique" ON "_admins"("A", "B");
|
||||||
|
|
||||||
|
-- CreateIndex
|
||||||
|
CREATE INDEX "_admins_B_index" ON "_admins"("B");
|
||||||
|
|
||||||
|
-- CreateIndex
|
||||||
|
CREATE UNIQUE INDEX "_moderators_AB_unique" ON "_moderators"("A", "B");
|
||||||
|
|
||||||
|
-- CreateIndex
|
||||||
|
CREATE INDEX "_moderators_B_index" ON "_moderators"("B");
|
||||||
|
|
||||||
|
-- AddForeignKey
|
||||||
|
ALTER TABLE "UserRole" ADD CONSTRAINT "UserRole_userId_fkey" FOREIGN KEY ("userId") REFERENCES "User"("id") ON DELETE RESTRICT ON UPDATE CASCADE;
|
||||||
|
|
||||||
|
-- AddForeignKey
|
||||||
|
ALTER TABLE "UserRole" ADD CONSTRAINT "UserRole_roleId_fkey" FOREIGN KEY ("roleId") REFERENCES "Role"("id") ON DELETE RESTRICT ON UPDATE CASCADE;
|
||||||
|
|
||||||
|
-- AddForeignKey
|
||||||
|
ALTER TABLE "Tournament" ADD CONSTRAINT "Tournament_creatorUserId_fkey" FOREIGN KEY ("creatorUserId") REFERENCES "User"("id") ON DELETE RESTRICT ON UPDATE CASCADE;
|
||||||
|
|
||||||
|
-- AddForeignKey
|
||||||
|
ALTER TABLE "Event" ADD CONSTRAINT "Event_gameId_fkey" FOREIGN KEY ("gameId") REFERENCES "Game"("id") ON DELETE RESTRICT ON UPDATE CASCADE;
|
||||||
|
|
||||||
|
-- AddForeignKey
|
||||||
|
ALTER TABLE "Event" ADD CONSTRAINT "Event_tournamentId_fkey" FOREIGN KEY ("tournamentId") REFERENCES "Tournament"("id") ON DELETE RESTRICT ON UPDATE CASCADE;
|
||||||
|
|
||||||
|
-- AddForeignKey
|
||||||
|
ALTER TABLE "Phase" ADD CONSTRAINT "Phase_eventId_fkey" FOREIGN KEY ("eventId") REFERENCES "Event"("id") ON DELETE RESTRICT ON UPDATE CASCADE;
|
||||||
|
|
||||||
|
-- AddForeignKey
|
||||||
|
ALTER TABLE "Bracket" ADD CONSTRAINT "Bracket_phaseId_fkey" FOREIGN KEY ("phaseId") REFERENCES "Phase"("id") ON DELETE SET NULL ON UPDATE CASCADE;
|
||||||
|
|
||||||
|
-- AddForeignKey
|
||||||
|
ALTER TABLE "Player" ADD CONSTRAINT "Player_userId_fkey" FOREIGN KEY ("userId") REFERENCES "User"("id") ON DELETE RESTRICT ON UPDATE CASCADE;
|
||||||
|
|
||||||
|
-- AddForeignKey
|
||||||
|
ALTER TABLE "EventPlayer" ADD CONSTRAINT "EventPlayer_eventId_fkey" FOREIGN KEY ("eventId") REFERENCES "Event"("id") ON DELETE RESTRICT ON UPDATE CASCADE;
|
||||||
|
|
||||||
|
-- AddForeignKey
|
||||||
|
ALTER TABLE "EventPlayer" ADD CONSTRAINT "EventPlayer_playerId_fkey" FOREIGN KEY ("playerId") REFERENCES "Player"("id") ON DELETE RESTRICT ON UPDATE CASCADE;
|
||||||
|
|
||||||
|
-- AddForeignKey
|
||||||
|
ALTER TABLE "_admins" ADD CONSTRAINT "_admins_A_fkey" FOREIGN KEY ("A") REFERENCES "Tournament"("id") ON DELETE CASCADE ON UPDATE CASCADE;
|
||||||
|
|
||||||
|
-- AddForeignKey
|
||||||
|
ALTER TABLE "_admins" ADD CONSTRAINT "_admins_B_fkey" FOREIGN KEY ("B") REFERENCES "User"("id") ON DELETE CASCADE ON UPDATE CASCADE;
|
||||||
|
|
||||||
|
-- AddForeignKey
|
||||||
|
ALTER TABLE "_moderators" ADD CONSTRAINT "_moderators_A_fkey" FOREIGN KEY ("A") REFERENCES "Tournament"("id") ON DELETE CASCADE ON UPDATE CASCADE;
|
||||||
|
|
||||||
|
-- AddForeignKey
|
||||||
|
ALTER TABLE "_moderators" ADD CONSTRAINT "_moderators_B_fkey" FOREIGN KEY ("B") REFERENCES "User"("id") ON DELETE CASCADE ON UPDATE CASCADE;
|
||||||
3
prisma/migrations/migration_lock.toml
Normal file
3
prisma/migrations/migration_lock.toml
Normal file
@@ -0,0 +1,3 @@
|
|||||||
|
# Please do not edit this file manually
|
||||||
|
# It should be added in your version-control system (i.e. Git)
|
||||||
|
provider = "postgresql"
|
||||||
@@ -14,18 +14,41 @@ model User {
|
|||||||
id String @id @default(uuid(7))
|
id String @id @default(uuid(7))
|
||||||
name String
|
name String
|
||||||
created DateTime @default(now())
|
created DateTime @default(now())
|
||||||
|
userRoles UserRole[]
|
||||||
|
auth UserAuth[]
|
||||||
|
tournamntsAdministrating Tournament[] @relation("admins")
|
||||||
|
tournamentsModerating Tournament[] @relation("moderators")
|
||||||
|
Tournament Tournament[]
|
||||||
|
Player Player[]
|
||||||
}
|
}
|
||||||
|
model UserAuth {
|
||||||
|
id Int @id @default(autoincrement())
|
||||||
|
user User @relation(fields: [userId], references: [id])
|
||||||
|
userId String
|
||||||
|
provider AuthProvider @relation(fields: [providerId], references: [id])
|
||||||
|
providerId Int
|
||||||
|
value String
|
||||||
|
}
|
||||||
|
model AuthProvider {
|
||||||
|
id Int @id @default(autoincrement())
|
||||||
|
name String
|
||||||
|
providerValue String
|
||||||
|
userAuth UserAuth[]
|
||||||
|
}
|
||||||
|
|
||||||
model UserRole {
|
model UserRole {
|
||||||
user User @relation(fields: [userId], references: [id])
|
user User @relation(fields: [userId], references: [id])
|
||||||
userId String
|
userId String
|
||||||
role Role @relation(fields: [roleId], references: [id])
|
role Role @relation(fields: [roleId], references: [id])
|
||||||
roleId Int
|
roleId Int
|
||||||
|
|
||||||
@@id([userId, roleId])
|
@@id([userId, roleId])
|
||||||
}
|
}
|
||||||
|
|
||||||
model Role {
|
model Role {
|
||||||
id Int @id @default(autoincrement())
|
id Int @id @default(autoincrement())
|
||||||
name String
|
name String
|
||||||
|
userRoles UserRole[]
|
||||||
}
|
}
|
||||||
|
|
||||||
model Tournament {
|
model Tournament {
|
||||||
@@ -35,8 +58,8 @@ model Tournament {
|
|||||||
creator User @relation(fields: [creatorUserId], references: [id])
|
creator User @relation(fields: [creatorUserId], references: [id])
|
||||||
creatorUserId String
|
creatorUserId String
|
||||||
created DateTime @default(now())
|
created DateTime @default(now())
|
||||||
admins User[]
|
admins User[] @relation("admins")
|
||||||
moderators User[]
|
moderators User[] @relation("moderators")
|
||||||
events Event[]
|
events Event[]
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -56,8 +79,8 @@ enum PhaseType {
|
|||||||
DOUBLE_ELIM
|
DOUBLE_ELIM
|
||||||
SINGLE_ELIM
|
SINGLE_ELIM
|
||||||
ROUND_ROBIN
|
ROUND_ROBIN
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
model Phase {
|
model Phase {
|
||||||
id String @id @default(uuid(7))
|
id String @id @default(uuid(7))
|
||||||
name String
|
name String
|
||||||
@@ -69,10 +92,13 @@ model Phase {
|
|||||||
created DateTime @default(now())
|
created DateTime @default(now())
|
||||||
brackets Bracket[]
|
brackets Bracket[]
|
||||||
}
|
}
|
||||||
|
|
||||||
model Bracket {
|
model Bracket {
|
||||||
id Int @id @default(autoincrement())
|
id Int @id @default(autoincrement())
|
||||||
name String
|
name String
|
||||||
created DateTime @default(now())
|
created DateTime @default(now())
|
||||||
|
Phase Phase? @relation(fields: [phaseId], references: [id])
|
||||||
|
phaseId String?
|
||||||
}
|
}
|
||||||
|
|
||||||
model Player {
|
model Player {
|
||||||
@@ -82,6 +108,7 @@ model Player {
|
|||||||
userId String
|
userId String
|
||||||
created DateTime @default(now())
|
created DateTime @default(now())
|
||||||
userConfirmed Boolean @default(false)
|
userConfirmed Boolean @default(false)
|
||||||
|
EventPlayer EventPlayer[]
|
||||||
}
|
}
|
||||||
|
|
||||||
model EventPlayer {
|
model EventPlayer {
|
||||||
@@ -91,7 +118,8 @@ model EventPlayer {
|
|||||||
playerId Int
|
playerId Int
|
||||||
seed Int
|
seed Int
|
||||||
manuallySeeded Boolean @default(false)
|
manuallySeeded Boolean @default(false)
|
||||||
@@id ([eventId, playerId])
|
|
||||||
|
@@id([eventId, playerId])
|
||||||
}
|
}
|
||||||
|
|
||||||
model Game {
|
model Game {
|
||||||
@@ -99,4 +127,5 @@ model Game {
|
|||||||
title String
|
title String
|
||||||
slug String?
|
slug String?
|
||||||
created DateTime @default(now())
|
created DateTime @default(now())
|
||||||
|
Event Event[]
|
||||||
}
|
}
|
||||||
|
|||||||
14
src/hooks.client.ts
Normal file
14
src/hooks.client.ts
Normal file
@@ -0,0 +1,14 @@
|
|||||||
|
import type { HandleClientError } from '@sveltejs/kit'
|
||||||
|
import { initializeClerkClient } from 'clerk-sveltekit/client'
|
||||||
|
import { PUBLIC_CLERK_PUBLISHABLE_KEY } from '$env/static/public'
|
||||||
|
|
||||||
|
initializeClerkClient(PUBLIC_CLERK_PUBLISHABLE_KEY, {
|
||||||
|
afterSignInUrl: '/admin/',
|
||||||
|
afterSignUpUrl: '/admin/',
|
||||||
|
signInUrl: '/sign-in',
|
||||||
|
signUpUrl: '/sign-up',
|
||||||
|
})
|
||||||
|
|
||||||
|
export const handleError: HandleClientError = async ({ error, event }) => {
|
||||||
|
console.error(error, event)
|
||||||
|
}
|
||||||
22
src/hooks.server.ts
Normal file
22
src/hooks.server.ts
Normal file
@@ -0,0 +1,22 @@
|
|||||||
|
import type { Handle } from '@sveltejs/kit'
|
||||||
|
import { sequence } from '@sveltejs/kit/hooks'
|
||||||
|
import { handleClerk } from 'clerk-sveltekit/server'
|
||||||
|
import { CLERK_SECRET_KEY } from '$env/static/private'
|
||||||
|
import prisma from '$lib/prisma';
|
||||||
|
|
||||||
|
const newUserHandle: Handle = async function({event, resolve}) {
|
||||||
|
prisma.user.findUnique(
|
||||||
|
const result = await resolve(event);
|
||||||
|
console.log(result);
|
||||||
|
return result;
|
||||||
|
};
|
||||||
|
|
||||||
|
export const handle: Handle = sequence(
|
||||||
|
handleClerk(CLERK_SECRET_KEY, {
|
||||||
|
debug: true,
|
||||||
|
protectedPaths: ['/admin'],
|
||||||
|
signInUrl: '/sign-in',
|
||||||
|
}),
|
||||||
|
newUserHandle
|
||||||
|
)
|
||||||
|
|
||||||
@@ -1,6 +0,0 @@
|
|||||||
<script lang="ts">
|
|
||||||
</script>
|
|
||||||
|
|
||||||
<div>
|
|
||||||
<slot />
|
|
||||||
</div>
|
|
||||||
@@ -1,27 +0,0 @@
|
|||||||
<script lang="ts">
|
|
||||||
import { OneOnOneBracket } from "$lib/match";
|
|
||||||
|
|
||||||
|
|
||||||
export let bracket: OneOnOneBracket;
|
|
||||||
</script>
|
|
||||||
<div>
|
|
||||||
Bracket: {bracket.id}
|
|
||||||
<div>
|
|
||||||
Configuration:
|
|
||||||
<div>
|
|
||||||
Type: {bracket.config.bracketType}
|
|
||||||
</div>
|
|
||||||
<div>
|
|
||||||
Games Per Set: {bracket.config.gamesPerSet}
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
<div>
|
|
||||||
{#each bracket.setLookup as round, i }
|
|
||||||
<div>
|
|
||||||
Round {i}
|
|
||||||
{#each round as set }
|
|
||||||
{/each}
|
|
||||||
</div>
|
|
||||||
{/each}
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
@@ -1,13 +0,0 @@
|
|||||||
<script lang="ts">
|
|
||||||
import type { OneOnOneSet } from "$lib/match";
|
|
||||||
let set: OneOnOneSet;
|
|
||||||
|
|
||||||
</script>
|
|
||||||
<div>
|
|
||||||
<div>
|
|
||||||
{set.p1.name}
|
|
||||||
</div>
|
|
||||||
<div>
|
|
||||||
{set.p2.name}
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
@@ -1,81 +0,0 @@
|
|||||||
export class User {
|
|
||||||
id?: string;
|
|
||||||
name: string;
|
|
||||||
sponsor?: string;
|
|
||||||
roles: Array<string>;
|
|
||||||
profile: UserProfile;
|
|
||||||
|
|
||||||
constructor(name: string) {
|
|
||||||
this.name = name;
|
|
||||||
this.roles = new Array<string>();
|
|
||||||
this.profile = {};
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
export class UserProfile {
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
export interface Tournament {
|
|
||||||
id: string;
|
|
||||||
title: string;
|
|
||||||
slug?: string;
|
|
||||||
tournamentCreator: User;
|
|
||||||
tournamentAdmins: Array<User>;
|
|
||||||
events: Array<Event>;
|
|
||||||
}
|
|
||||||
|
|
||||||
export interface Event {
|
|
||||||
}
|
|
||||||
|
|
||||||
export enum PhaseType {
|
|
||||||
DOUBLE_ELIM = "Double Elimination",
|
|
||||||
SINGLE_ELIM = "Single Elimination",
|
|
||||||
ROUND_ROBIN = "Round Robin",
|
|
||||||
LADDER = "Ladder",
|
|
||||||
SWISS = "Swiss",
|
|
||||||
}
|
|
||||||
|
|
||||||
export interface Phase {
|
|
||||||
id: string;
|
|
||||||
brackets: Array<Bracket>;
|
|
||||||
config: PhaseConfig;
|
|
||||||
}
|
|
||||||
|
|
||||||
export interface Bracket {
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
export class PhaseConfig {
|
|
||||||
phaseType: PhaseType;
|
|
||||||
winningSetCount: number;
|
|
||||||
numPhaseWinners: number;
|
|
||||||
|
|
||||||
constructor(phaseType?: PhaseType, winningSetCount?: number, numPhaseWinners?: number) {
|
|
||||||
if(phaseType)
|
|
||||||
this.phaseType = phaseType;
|
|
||||||
else
|
|
||||||
this.phaseType = PhaseType.DOUBLE_ELIM;
|
|
||||||
if(winningSetCount)
|
|
||||||
this.winningSetCount = winningSetCount;
|
|
||||||
else
|
|
||||||
this.winningSetCount = 2;
|
|
||||||
if(numPhaseWinners)
|
|
||||||
this.numPhaseWinners = numPhaseWinners;
|
|
||||||
else
|
|
||||||
this.numPhaseWinners = 1;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
export interface MatchIdentity {
|
|
||||||
name: string;
|
|
||||||
}
|
|
||||||
export interface Player extends MatchIdentity {
|
|
||||||
id: string;
|
|
||||||
}
|
|
||||||
|
|
||||||
export interface PlayerGroup extends MatchIdentity {
|
|
||||||
|
|
||||||
groupId: string;
|
|
||||||
players: Array<Player>;
|
|
||||||
}
|
|
||||||
6
src/lib/prisma.ts
Normal file
6
src/lib/prisma.ts
Normal file
@@ -0,0 +1,6 @@
|
|||||||
|
import { PrismaClient } from "@prisma/client";
|
||||||
|
|
||||||
|
const prisma = new PrismaClient();
|
||||||
|
|
||||||
|
export default prisma;
|
||||||
|
|
||||||
@@ -1,5 +1,32 @@
|
|||||||
<script lang="ts">
|
<script lang="ts">
|
||||||
import "../app.css";
|
import "../app.css";
|
||||||
|
import UserButton from 'clerk-sveltekit/client/UserButton.svelte'
|
||||||
|
import SignedIn from 'clerk-sveltekit/client/SignedIn.svelte'
|
||||||
|
import SignedOut from 'clerk-sveltekit/client/SignedOut.svelte'
|
||||||
</script>
|
</script>
|
||||||
|
|
||||||
<slot />
|
<nav class="fixed bg-slate-600 w-64 left-0 p-3 text-white h-screen z-20 flex flex-col">
|
||||||
|
<ul>
|
||||||
|
<li>Home</li>
|
||||||
|
<li>Events</li>
|
||||||
|
<li>Communities</li>
|
||||||
|
<li>Leagues</li>
|
||||||
|
<li class="relative end-0">
|
||||||
|
</li>
|
||||||
|
</ul>
|
||||||
|
<div class="mb-0">
|
||||||
|
<SignedIn>
|
||||||
|
<UserButton afterSignOutUrl="/" />
|
||||||
|
</SignedIn>
|
||||||
|
<SignedOut>
|
||||||
|
<a href="/sign-in">Sign in</a> <span>|</span> <a href="/sign-up">Sign up</a>
|
||||||
|
<!-- You could also use <SignInButton mode="modal" /> and <SignUpButton mode="modal" /> here -->
|
||||||
|
</SignedOut>
|
||||||
|
</div>
|
||||||
|
</nav>
|
||||||
|
|
||||||
|
<div class="ml-64 p-1">
|
||||||
|
<div class="container mx-auto">
|
||||||
|
<slot/>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|||||||
9
src/routes/+page.server.ts
Normal file
9
src/routes/+page.server.ts
Normal file
@@ -0,0 +1,9 @@
|
|||||||
|
|
||||||
|
import prisma from '$lib/prisma';
|
||||||
|
import type { PageServerLoad } from './$types';
|
||||||
|
|
||||||
|
export const load = (async () => {
|
||||||
|
const response = await prisma.event.count();
|
||||||
|
return { eventCount: response };
|
||||||
|
}) satisfies PageServerLoad;
|
||||||
|
|
||||||
@@ -1,2 +1,8 @@
|
|||||||
<h1>Welcome to SvelteKit</h1>
|
<script lang="ts">
|
||||||
<p>Visit <a href="https://kit.svelte.dev">kit.svelte.dev</a> to read the documentation</p>
|
import type { PageData } from "./$types";
|
||||||
|
|
||||||
|
export let data: PageData;
|
||||||
|
</script>
|
||||||
|
|
||||||
|
|
||||||
|
Event Count: {data.eventCount}
|
||||||
|
|||||||
1
src/routes/admin/+page.svelte
Normal file
1
src/routes/admin/+page.svelte
Normal file
@@ -0,0 +1 @@
|
|||||||
|
<p>Site Admin Dashboard</p>
|
||||||
@@ -1,3 +0,0 @@
|
|||||||
<script lang="ts">
|
|
||||||
|
|
||||||
</script>
|
|
||||||
7
src/routes/sign-in/+page.svelte
Normal file
7
src/routes/sign-in/+page.svelte
Normal file
@@ -0,0 +1,7 @@
|
|||||||
|
<script lang="ts">
|
||||||
|
import SignIn from 'clerk-sveltekit/client/SignIn.svelte'
|
||||||
|
</script>
|
||||||
|
|
||||||
|
<div>
|
||||||
|
<SignIn redirectUrl="/admin" />
|
||||||
|
</div>
|
||||||
7
src/routes/sign-up/+page.svelte
Normal file
7
src/routes/sign-up/+page.svelte
Normal file
@@ -0,0 +1,7 @@
|
|||||||
|
<script lang="ts">
|
||||||
|
import SignUp from 'clerk-sveltekit/client/SignUp.svelte'
|
||||||
|
</script>
|
||||||
|
|
||||||
|
<div>
|
||||||
|
<SignUp redirectUrl="/admin" />
|
||||||
|
</div>
|
||||||
7
src/routes/tournament/create/+page.svelte
Normal file
7
src/routes/tournament/create/+page.svelte
Normal file
@@ -0,0 +1,7 @@
|
|||||||
|
<script lang="ts">
|
||||||
|
|
||||||
|
</script>
|
||||||
|
|
||||||
|
<form action="POST">
|
||||||
|
|
||||||
|
</form>
|
||||||
12
src/routes/user/+page.svelte
Normal file
12
src/routes/user/+page.svelte
Normal file
@@ -0,0 +1,12 @@
|
|||||||
|
|
||||||
|
<script lang="ts">
|
||||||
|
import UserProfile from "clerk-sveltekit/client/UserProfile.svelte";
|
||||||
|
|
||||||
|
|
||||||
|
</script>
|
||||||
|
|
||||||
|
<div class="w-full">
|
||||||
|
<div class="mx-auto">
|
||||||
|
<UserProfile/>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
Reference in New Issue
Block a user