diff --git a/.env b/.env index 3492633..d8fcfbf 100644 --- a/.env +++ b/.env @@ -15,4 +15,11 @@ STEAMCMD_PATH=C:\Users\Rother\Desktop\dev\ironie\steamcmd\steamcmd.exe NEXTAUTH_SECRET=ironieopen NEXTAUTH_URL=http://localhost:3000 AUTH_SECRET="57AUHXa+UmFrlnIEKxtrk8fLo+aZMtsa/oV6fklXkcE=" # Added by `npx auth`. Read more: https://cli.authjs.dev -ALLSTAR_TOKEN=ed033ac0-5df7-482e-a322-e2b4601955d3 \ No newline at end of file +ALLSTAR_TOKEN=ed033ac0-5df7-482e-a322-e2b4601955d3 +PTERODACTYL_APP_API=ptla_O6Je82OvlCBFITDRgB1ZJ95AIyUSXYnVGgwRF6pO6d9 +PTERODACTYL_CLIENT_API=ptlc_6NXqjxieIekaULga2jmuTPyPwdziigT82PRbrg3G4S7 +PTERO_PANEL_URL=https://panel.ironieopen.de +PTERO_SERVER_SFTP_URL=sftp://panel.ironieopen.de:2022 +PTERO_SERVER_SFTP_USER=army.37a11489 +PTERO_SERVER_SFTP_PASSWORD=IJHoYHTXQvJkCxkycTYM +PTERO_SERVER_ID=37a11489 \ No newline at end of file diff --git a/next.config.ts b/next.config.ts index f66f8bf..93e1f23 100644 --- a/next.config.ts +++ b/next.config.ts @@ -1,4 +1,4 @@ -import type { NextConfig } from "next"; +import type { NextConfig } from 'next' const nextConfig: NextConfig = { images: { @@ -11,6 +11,20 @@ const nextConfig: NextConfig = { }, ], }, -}; -export default nextConfig; + serverExternalPackages: ['ssh2', 'ssh2-sftp-client'], + + webpack: (config, { isServer }) => { + if (isServer) { + const externals = Array.isArray(config.externals) ? config.externals : [] + externals.push({ + ssh2: 'commonjs ssh2', + 'ssh2-sftp-client': 'commonjs ssh2-sftp-client', + } as any) + ;(config as any).externals = externals + } + return config + }, +} + +export default nextConfig diff --git a/package-lock.json b/package-lock.json index 2ab7f0e..28b4051 100644 --- a/package-lock.json +++ b/package-lock.json @@ -30,6 +30,7 @@ "ky": "^1.8.2", "lodash": "^4.17.21", "lzma-native": "^8.0.6", + "nanoid": "^5.1.5", "next": "15.3.0", "next-auth-steam": "^0.4.0", "next-intl": "^4.3.4", @@ -43,6 +44,7 @@ "react": "^19.0.0", "react-chartjs-2": "^5.3.0", "react-dom": "^19.0.0", + "ssh2-sftp-client": "^12.0.1", "vanilla-calendar-pro": "^3.0.4", "zustand": "^5.0.3" }, @@ -54,6 +56,7 @@ "@types/node-cron": "^3.0.11", "@types/react": "^19", "@types/react-dom": "^19", + "@types/ssh2-sftp-client": "^9.0.5", "@types/ws": "^8.18.1", "eslint": "^9", "eslint-config-next": "15.3.0", @@ -2096,6 +2099,43 @@ "@types/react": "^19.0.0" } }, + "node_modules/@types/ssh2": { + "version": "1.15.5", + "resolved": "https://registry.npmjs.org/@types/ssh2/-/ssh2-1.15.5.tgz", + "integrity": "sha512-N1ASjp/nXH3ovBHddRJpli4ozpk6UdDYIX4RJWFa9L1YKnzdhTlVmiGHm4DZnj/jLbqZpes4aeR30EFGQtvhQQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/node": "^18.11.18" + } + }, + "node_modules/@types/ssh2-sftp-client": { + "version": "9.0.5", + "resolved": "https://registry.npmjs.org/@types/ssh2-sftp-client/-/ssh2-sftp-client-9.0.5.tgz", + "integrity": "sha512-cpUO6okDusnfLw2hnmaBiomlSchIWNVcCdpywLRsg/h9Q1TTiUSrzhkn5sJeeyTM8h6xRbZEZZjgWtUXFDogHg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/ssh2": "^1.0.0" + } + }, + "node_modules/@types/ssh2/node_modules/@types/node": { + "version": "18.19.123", + "resolved": "https://registry.npmjs.org/@types/node/-/node-18.19.123.tgz", + "integrity": "sha512-K7DIaHnh0mzVxreCR9qwgNxp3MH9dltPNIEddW9MYUlcKAzm+3grKNSTe2vCJHI1FaLpvpL5JGJrz1UZDKYvDg==", + "dev": true, + "license": "MIT", + "dependencies": { + "undici-types": "~5.26.4" + } + }, + "node_modules/@types/ssh2/node_modules/undici-types": { + "version": "5.26.5", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-5.26.5.tgz", + "integrity": "sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==", + "dev": true, + "license": "MIT" + }, "node_modules/@types/ws": { "version": "8.18.1", "resolved": "https://registry.npmjs.org/@types/ws/-/ws-8.18.1.tgz", @@ -2820,6 +2860,15 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/asn1": { + "version": "0.2.6", + "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.6.tgz", + "integrity": "sha512-ix/FxPn0MDjeyJ7i/yoHGFt/EX6LyNbxSEhPPXODPL+KB0VPk86UYfL0lMdy+KCnv+fmvIzySwaK5COwqVbWTQ==", + "license": "MIT", + "dependencies": { + "safer-buffer": "~2.1.0" + } + }, "node_modules/ast-types-flow": { "version": "0.0.8", "resolved": "https://registry.npmjs.org/ast-types-flow/-/ast-types-flow-0.0.8.tgz", @@ -2897,6 +2946,15 @@ "dev": true, "license": "MIT" }, + "node_modules/bcrypt-pbkdf": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz", + "integrity": "sha512-qeFIXtP4MSoi6NLqO12WfqARWWuCKi2Rn/9hJLEmtB5yTNr9DqFWkJRCf2qShWzPeAMRnOgCrq0sg/KLv5ES9w==", + "license": "BSD-3-Clause", + "dependencies": { + "tweetnacl": "^0.14.3" + } + }, "node_modules/brace-expansion": { "version": "1.1.11", "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", @@ -2921,6 +2979,21 @@ "node": ">=8" } }, + "node_modules/buffer-from": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", + "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==", + "license": "MIT" + }, + "node_modules/buildcheck": { + "version": "0.0.6", + "resolved": "https://registry.npmjs.org/buildcheck/-/buildcheck-0.0.6.tgz", + "integrity": "sha512-8f9ZJCUXyT1M35Jx7MkBgmBMo3oHTTBIPLiY9xyL0pl3T5RwcPEY8cUHr5LBNfu/fk6c2T4DJZuVM/8ZZT2D2A==", + "optional": true, + "engines": { + "node": ">=10.0.0" + } + }, "node_modules/busboy": { "version": "1.6.0", "resolved": "https://registry.npmjs.org/busboy/-/busboy-1.6.0.tgz", @@ -3173,6 +3246,21 @@ "dev": true, "license": "MIT" }, + "node_modules/concat-stream": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-2.0.0.tgz", + "integrity": "sha512-MWufYdFw53ccGjCA+Ol7XJYpAlW6/prSMzuPOTRnJGcGzuhLn4Scrz7qf6o8bROZ514ltazcIFJZevcfbo0x7A==", + "engines": [ + "node >= 6.0" + ], + "license": "MIT", + "dependencies": { + "buffer-from": "^1.0.0", + "inherits": "^2.0.3", + "readable-stream": "^3.0.2", + "typedarray": "^0.0.6" + } + }, "node_modules/confbox": { "version": "0.2.2", "resolved": "https://registry.npmjs.org/confbox/-/confbox-0.2.2.tgz", @@ -3200,6 +3288,20 @@ "node": ">= 0.6" } }, + "node_modules/cpu-features": { + "version": "0.0.10", + "resolved": "https://registry.npmjs.org/cpu-features/-/cpu-features-0.0.10.tgz", + "integrity": "sha512-9IkYqtX3YHPCzoVg1Py+o9057a3i0fp7S530UWokCSaFVTc7CwXPRiOjRjBQQ18ZCNafx78YfnG+HALxtVmOGA==", + "hasInstallScript": true, + "optional": true, + "dependencies": { + "buildcheck": "~0.0.6", + "nan": "^2.19.0" + }, + "engines": { + "node": ">=10.0.0" + } + }, "node_modules/create-require": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/create-require/-/create-require-1.1.1.tgz", @@ -5871,10 +5973,17 @@ "dev": true, "license": "MIT" }, + "node_modules/nan": { + "version": "2.23.0", + "resolved": "https://registry.npmjs.org/nan/-/nan-2.23.0.tgz", + "integrity": "sha512-1UxuyYGdoQHcGg87Lkqm3FzefucTa0NAiOcuRsDmysep3c1LVCRK2krrUDafMWtjSG04htvAmvg96+SDknOmgQ==", + "license": "MIT", + "optional": true + }, "node_modules/nanoid": { - "version": "3.3.11", - "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.11.tgz", - "integrity": "sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w==", + "version": "5.1.5", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-5.1.5.tgz", + "integrity": "sha512-Ir/+ZpE9fDsNH0hQ3C68uyThDXzYcim2EqcZ8zn8Chtt1iylPT9xXJB0kPCnqzgcEGikO9RxSrh63MsmVCU7Fw==", "funding": [ { "type": "github", @@ -5883,10 +5992,10 @@ ], "license": "MIT", "bin": { - "nanoid": "bin/nanoid.cjs" + "nanoid": "bin/nanoid.js" }, "engines": { - "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" + "node": "^18 || >=20" } }, "node_modules/natural-compare": { @@ -6052,6 +6161,24 @@ "tslib": "^2.8.0" } }, + "node_modules/next/node_modules/nanoid": { + "version": "3.3.11", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.11.tgz", + "integrity": "sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "bin": { + "nanoid": "bin/nanoid.cjs" + }, + "engines": { + "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" + } + }, "node_modules/next/node_modules/postcss": { "version": "8.4.31", "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.31.tgz", @@ -6584,6 +6711,24 @@ "node": "^10 || ^12 || >=14" } }, + "node_modules/postcss/node_modules/nanoid": { + "version": "3.3.11", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.11.tgz", + "integrity": "sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "bin": { + "nanoid": "bin/nanoid.cjs" + }, + "engines": { + "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" + } + }, "node_modules/preact": { "version": "10.26.5", "resolved": "https://registry.npmjs.org/preact/-/preact-10.26.5.tgz", @@ -7020,6 +7165,12 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/safer-buffer": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", + "license": "MIT" + }, "node_modules/scheduler": { "version": "0.26.0", "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.26.0.tgz", @@ -7243,6 +7394,40 @@ "node": ">=0.10.0" } }, + "node_modules/ssh2": { + "version": "1.16.0", + "resolved": "https://registry.npmjs.org/ssh2/-/ssh2-1.16.0.tgz", + "integrity": "sha512-r1X4KsBGedJqo7h8F5c4Ybpcr5RjyP+aWIG007uBPRjmdQWfEiVLzSK71Zji1B9sKxwaCvD8y8cwSkYrlLiRRg==", + "hasInstallScript": true, + "dependencies": { + "asn1": "^0.2.6", + "bcrypt-pbkdf": "^1.0.2" + }, + "engines": { + "node": ">=10.16.0" + }, + "optionalDependencies": { + "cpu-features": "~0.0.10", + "nan": "^2.20.0" + } + }, + "node_modules/ssh2-sftp-client": { + "version": "12.0.1", + "resolved": "https://registry.npmjs.org/ssh2-sftp-client/-/ssh2-sftp-client-12.0.1.tgz", + "integrity": "sha512-ICJ1L2PmBel2Q2ctbyxzTFZCPKSHYYD6s2TFZv7NXmZDrDNGk8lHBb/SK2WgXLMXNANH78qoumeJzxlWZqSqWg==", + "license": "Apache-2.0", + "dependencies": { + "concat-stream": "^2.0.0", + "ssh2": "^1.16.0" + }, + "engines": { + "node": ">=18.20.4" + }, + "funding": { + "type": "individual", + "url": "https://square.link/u/4g7sPflL" + } + }, "node_modules/stable-hash": { "version": "0.0.5", "resolved": "https://registry.npmjs.org/stable-hash/-/stable-hash-0.0.5.tgz", @@ -7636,6 +7821,12 @@ "fsevents": "~2.3.3" } }, + "node_modules/tweetnacl": { + "version": "0.14.5", + "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz", + "integrity": "sha512-KXXFFdAbFXY4geFIwoyNK+f5Z1b7swfXABfL7HXCmoIWMKU3dmS26672A4EeQtDzLKy7SXmfBu51JolvEKwtGA==", + "license": "Unlicense" + }, "node_modules/type-check": { "version": "0.4.0", "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", @@ -7727,6 +7918,12 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/typedarray": { + "version": "0.0.6", + "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz", + "integrity": "sha512-/aCDEGatGvZ2BIk+HmLf4ifCJFwvKFNb9/JeZPMulfgFracn9QFcAf5GO8B/mweUjSoblS5In0cWhqpfs/5PQA==", + "license": "MIT" + }, "node_modules/typescript": { "version": "5.8.3", "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.8.3.tgz", diff --git a/package.json b/package.json index 85f28fa..48ad5c9 100644 --- a/package.json +++ b/package.json @@ -34,6 +34,7 @@ "ky": "^1.8.2", "lodash": "^4.17.21", "lzma-native": "^8.0.6", + "nanoid": "^5.1.5", "next": "15.3.0", "next-auth-steam": "^0.4.0", "next-intl": "^4.3.4", @@ -47,6 +48,7 @@ "react": "^19.0.0", "react-chartjs-2": "^5.3.0", "react-dom": "^19.0.0", + "ssh2-sftp-client": "^12.0.1", "vanilla-calendar-pro": "^3.0.4", "zustand": "^5.0.3" }, @@ -58,6 +60,7 @@ "@types/node-cron": "^3.0.11", "@types/react": "^19", "@types/react-dom": "^19", + "@types/ssh2-sftp-client": "^9.0.5", "@types/ws": "^8.18.1", "eslint": "^9", "eslint-config-next": "15.3.0", diff --git a/prisma/schema.prisma b/prisma/schema.prisma index 5318693..216f872 100644 --- a/prisma/schema.prisma +++ b/prisma/schema.prisma @@ -45,8 +45,18 @@ model User { confirmedSchedules Schedule[] @relation("ConfirmedSchedules") mapVoteChoices MapVoteStep[] @relation("VoteStepChooser") + + status UserStatus @default(offline) // 👈 neu + lastActiveAt DateTime? // optional: wann zuletzt aktiv } +enum UserStatus { + online + away + offline +} + + model Team { id String @id @default(uuid()) name String @unique diff --git a/public/assets/img/logos/cf35a79d-00ea-40a2-87f5-20878f550b42.webp b/public/assets/img/logos/cf35a79d-00ea-40a2-87f5-20878f550b42.webp new file mode 100644 index 0000000..b313882 Binary files /dev/null and b/public/assets/img/logos/cf35a79d-00ea-40a2-87f5-20878f550b42.webp differ diff --git a/public/assets/img/maps/de_ancient/1.webp b/public/assets/img/maps/de_ancient/1.webp new file mode 100644 index 0000000..37d68d1 Binary files /dev/null and b/public/assets/img/maps/de_ancient/1.webp differ diff --git a/public/assets/img/maps/de_ancient/2.webp b/public/assets/img/maps/de_ancient/2.webp new file mode 100644 index 0000000..80c1914 Binary files /dev/null and b/public/assets/img/maps/de_ancient/2.webp differ diff --git a/public/assets/img/maps/de_ancient/3.webp b/public/assets/img/maps/de_ancient/3.webp new file mode 100644 index 0000000..2b54673 Binary files /dev/null and b/public/assets/img/maps/de_ancient/3.webp differ diff --git a/public/assets/img/maps/de_ancient/4.webp b/public/assets/img/maps/de_ancient/4.webp new file mode 100644 index 0000000..d47d688 Binary files /dev/null and b/public/assets/img/maps/de_ancient/4.webp differ diff --git a/public/assets/img/maps/de_ancient/5.webp b/public/assets/img/maps/de_ancient/5.webp new file mode 100644 index 0000000..9bb93d9 Binary files /dev/null and b/public/assets/img/maps/de_ancient/5.webp differ diff --git a/public/assets/img/maps/de_ancient/6.webp b/public/assets/img/maps/de_ancient/6.webp new file mode 100644 index 0000000..9a797d9 Binary files /dev/null and b/public/assets/img/maps/de_ancient/6.webp differ diff --git a/public/assets/img/maps/de_anubis/1.webp b/public/assets/img/maps/de_anubis/1.webp new file mode 100644 index 0000000..a2c9950 Binary files /dev/null and b/public/assets/img/maps/de_anubis/1.webp differ diff --git a/public/assets/img/maps/de_anubis/2.webp b/public/assets/img/maps/de_anubis/2.webp new file mode 100644 index 0000000..8654751 Binary files /dev/null and b/public/assets/img/maps/de_anubis/2.webp differ diff --git a/public/assets/img/maps/de_anubis/3.webp b/public/assets/img/maps/de_anubis/3.webp new file mode 100644 index 0000000..55d4d77 Binary files /dev/null and b/public/assets/img/maps/de_anubis/3.webp differ diff --git a/public/assets/img/maps/de_anubis/4.webp b/public/assets/img/maps/de_anubis/4.webp new file mode 100644 index 0000000..7ca5f82 Binary files /dev/null and b/public/assets/img/maps/de_anubis/4.webp differ diff --git a/public/assets/img/maps/de_anubis/5.webp b/public/assets/img/maps/de_anubis/5.webp new file mode 100644 index 0000000..7aa0743 Binary files /dev/null and b/public/assets/img/maps/de_anubis/5.webp differ diff --git a/public/assets/img/maps/de_anubis/6.webp b/public/assets/img/maps/de_anubis/6.webp new file mode 100644 index 0000000..6dac34a Binary files /dev/null and b/public/assets/img/maps/de_anubis/6.webp differ diff --git a/public/assets/img/maps/de_dust2/1.webp b/public/assets/img/maps/de_dust2/1.webp new file mode 100644 index 0000000..0d1efcc Binary files /dev/null and b/public/assets/img/maps/de_dust2/1.webp differ diff --git a/public/assets/img/maps/de_dust2/2.webp b/public/assets/img/maps/de_dust2/2.webp new file mode 100644 index 0000000..57845c9 Binary files /dev/null and b/public/assets/img/maps/de_dust2/2.webp differ diff --git a/public/assets/img/maps/de_dust2/3.webp b/public/assets/img/maps/de_dust2/3.webp new file mode 100644 index 0000000..4b34804 Binary files /dev/null and b/public/assets/img/maps/de_dust2/3.webp differ diff --git a/public/assets/img/maps/de_dust2/4.webp b/public/assets/img/maps/de_dust2/4.webp new file mode 100644 index 0000000..ff205e3 Binary files /dev/null and b/public/assets/img/maps/de_dust2/4.webp differ diff --git a/public/assets/img/maps/de_grail/1.webp b/public/assets/img/maps/de_grail/1.webp new file mode 100644 index 0000000..a0a4c64 Binary files /dev/null and b/public/assets/img/maps/de_grail/1.webp differ diff --git a/public/assets/img/maps/de_grail/2.webp b/public/assets/img/maps/de_grail/2.webp new file mode 100644 index 0000000..c3a5dac Binary files /dev/null and b/public/assets/img/maps/de_grail/2.webp differ diff --git a/public/assets/img/maps/de_grail/3.webp b/public/assets/img/maps/de_grail/3.webp new file mode 100644 index 0000000..3ebee45 Binary files /dev/null and b/public/assets/img/maps/de_grail/3.webp differ diff --git a/public/assets/img/maps/de_grail/4.webp b/public/assets/img/maps/de_grail/4.webp new file mode 100644 index 0000000..b8a384d Binary files /dev/null and b/public/assets/img/maps/de_grail/4.webp differ diff --git a/public/assets/img/maps/de_grail/5.webp b/public/assets/img/maps/de_grail/5.webp new file mode 100644 index 0000000..7d0cec1 Binary files /dev/null and b/public/assets/img/maps/de_grail/5.webp differ diff --git a/public/assets/img/maps/de_grail/6.webp b/public/assets/img/maps/de_grail/6.webp new file mode 100644 index 0000000..8a8f026 Binary files /dev/null and b/public/assets/img/maps/de_grail/6.webp differ diff --git a/public/assets/img/maps/de_inferno/1.webp b/public/assets/img/maps/de_inferno/1.webp new file mode 100644 index 0000000..046aebd Binary files /dev/null and b/public/assets/img/maps/de_inferno/1.webp differ diff --git a/public/assets/img/maps/de_inferno/2.webp b/public/assets/img/maps/de_inferno/2.webp new file mode 100644 index 0000000..40a5b8a Binary files /dev/null and b/public/assets/img/maps/de_inferno/2.webp differ diff --git a/public/assets/img/maps/de_inferno/3.webp b/public/assets/img/maps/de_inferno/3.webp new file mode 100644 index 0000000..b0b832d Binary files /dev/null and b/public/assets/img/maps/de_inferno/3.webp differ diff --git a/public/assets/img/maps/de_inferno/4.webp b/public/assets/img/maps/de_inferno/4.webp new file mode 100644 index 0000000..530a940 Binary files /dev/null and b/public/assets/img/maps/de_inferno/4.webp differ diff --git a/public/assets/img/maps/de_inferno/5.webp b/public/assets/img/maps/de_inferno/5.webp new file mode 100644 index 0000000..80ec9bd Binary files /dev/null and b/public/assets/img/maps/de_inferno/5.webp differ diff --git a/public/assets/img/maps/de_inferno/6.webp b/public/assets/img/maps/de_inferno/6.webp new file mode 100644 index 0000000..90e4a57 Binary files /dev/null and b/public/assets/img/maps/de_inferno/6.webp differ diff --git a/public/assets/img/maps/de_jura/1.webp b/public/assets/img/maps/de_jura/1.webp new file mode 100644 index 0000000..7f09d50 Binary files /dev/null and b/public/assets/img/maps/de_jura/1.webp differ diff --git a/public/assets/img/maps/de_jura/2.webp b/public/assets/img/maps/de_jura/2.webp new file mode 100644 index 0000000..3676640 Binary files /dev/null and b/public/assets/img/maps/de_jura/2.webp differ diff --git a/public/assets/img/maps/de_jura/3.webp b/public/assets/img/maps/de_jura/3.webp new file mode 100644 index 0000000..90b86b0 Binary files /dev/null and b/public/assets/img/maps/de_jura/3.webp differ diff --git a/public/assets/img/maps/de_jura/4.webp b/public/assets/img/maps/de_jura/4.webp new file mode 100644 index 0000000..f5fb7a3 Binary files /dev/null and b/public/assets/img/maps/de_jura/4.webp differ diff --git a/public/assets/img/maps/de_jura/5.webp b/public/assets/img/maps/de_jura/5.webp new file mode 100644 index 0000000..781e29a Binary files /dev/null and b/public/assets/img/maps/de_jura/5.webp differ diff --git a/public/assets/img/maps/de_jura/6.webp b/public/assets/img/maps/de_jura/6.webp new file mode 100644 index 0000000..54ece11 Binary files /dev/null and b/public/assets/img/maps/de_jura/6.webp differ diff --git a/public/assets/img/maps/de_jura/7.webp b/public/assets/img/maps/de_jura/7.webp new file mode 100644 index 0000000..02367d2 Binary files /dev/null and b/public/assets/img/maps/de_jura/7.webp differ diff --git a/public/assets/img/maps/de_jura/8.webp b/public/assets/img/maps/de_jura/8.webp new file mode 100644 index 0000000..a287318 Binary files /dev/null and b/public/assets/img/maps/de_jura/8.webp differ diff --git a/public/assets/img/maps/de_mirage/1.webp b/public/assets/img/maps/de_mirage/1.webp new file mode 100644 index 0000000..93ef305 Binary files /dev/null and b/public/assets/img/maps/de_mirage/1.webp differ diff --git a/public/assets/img/maps/de_mirage/2.webp b/public/assets/img/maps/de_mirage/2.webp new file mode 100644 index 0000000..b7565bb Binary files /dev/null and b/public/assets/img/maps/de_mirage/2.webp differ diff --git a/public/assets/img/maps/de_mirage/3.webp b/public/assets/img/maps/de_mirage/3.webp new file mode 100644 index 0000000..df18a8c Binary files /dev/null and b/public/assets/img/maps/de_mirage/3.webp differ diff --git a/public/assets/img/maps/de_mirage/4.webp b/public/assets/img/maps/de_mirage/4.webp new file mode 100644 index 0000000..ab0392e Binary files /dev/null and b/public/assets/img/maps/de_mirage/4.webp differ diff --git a/public/assets/img/maps/de_mirage/5.webp b/public/assets/img/maps/de_mirage/5.webp new file mode 100644 index 0000000..cf7a750 Binary files /dev/null and b/public/assets/img/maps/de_mirage/5.webp differ diff --git a/public/assets/img/maps/de_mirage/6.webp b/public/assets/img/maps/de_mirage/6.webp new file mode 100644 index 0000000..f50b585 Binary files /dev/null and b/public/assets/img/maps/de_mirage/6.webp differ diff --git a/public/assets/img/maps/de_nuke/1.jpg b/public/assets/img/maps/de_nuke/1.jpg deleted file mode 100644 index 92327ed..0000000 Binary files a/public/assets/img/maps/de_nuke/1.jpg and /dev/null differ diff --git a/public/assets/img/maps/de_nuke/1.webp b/public/assets/img/maps/de_nuke/1.webp new file mode 100644 index 0000000..fa5dfda Binary files /dev/null and b/public/assets/img/maps/de_nuke/1.webp differ diff --git a/public/assets/img/maps/de_nuke/2.webp b/public/assets/img/maps/de_nuke/2.webp new file mode 100644 index 0000000..c29aa2d Binary files /dev/null and b/public/assets/img/maps/de_nuke/2.webp differ diff --git a/public/assets/img/maps/de_nuke/3.webp b/public/assets/img/maps/de_nuke/3.webp new file mode 100644 index 0000000..c886a87 Binary files /dev/null and b/public/assets/img/maps/de_nuke/3.webp differ diff --git a/public/assets/img/maps/de_nuke/4.webp b/public/assets/img/maps/de_nuke/4.webp new file mode 100644 index 0000000..9aaef8d Binary files /dev/null and b/public/assets/img/maps/de_nuke/4.webp differ diff --git a/public/assets/img/maps/de_nuke/5.webp b/public/assets/img/maps/de_nuke/5.webp new file mode 100644 index 0000000..17cb3b9 Binary files /dev/null and b/public/assets/img/maps/de_nuke/5.webp differ diff --git a/public/assets/img/maps/de_nuke/6.webp b/public/assets/img/maps/de_nuke/6.webp new file mode 100644 index 0000000..b44ccbc Binary files /dev/null and b/public/assets/img/maps/de_nuke/6.webp differ diff --git a/public/assets/img/maps/de_overpass/1.webp b/public/assets/img/maps/de_overpass/1.webp new file mode 100644 index 0000000..fe5c2bc Binary files /dev/null and b/public/assets/img/maps/de_overpass/1.webp differ diff --git a/public/assets/img/maps/de_overpass/2.webp b/public/assets/img/maps/de_overpass/2.webp new file mode 100644 index 0000000..cf6da9a Binary files /dev/null and b/public/assets/img/maps/de_overpass/2.webp differ diff --git a/public/assets/img/maps/de_overpass/3.webp b/public/assets/img/maps/de_overpass/3.webp new file mode 100644 index 0000000..6bbbd34 Binary files /dev/null and b/public/assets/img/maps/de_overpass/3.webp differ diff --git a/public/assets/img/maps/de_overpass/4.webp b/public/assets/img/maps/de_overpass/4.webp new file mode 100644 index 0000000..4dc6dd2 Binary files /dev/null and b/public/assets/img/maps/de_overpass/4.webp differ diff --git a/public/assets/img/maps/de_overpass/5.webp b/public/assets/img/maps/de_overpass/5.webp new file mode 100644 index 0000000..025951a Binary files /dev/null and b/public/assets/img/maps/de_overpass/5.webp differ diff --git a/public/assets/img/maps/de_overpass/6.webp b/public/assets/img/maps/de_overpass/6.webp new file mode 100644 index 0000000..bc87aa6 Binary files /dev/null and b/public/assets/img/maps/de_overpass/6.webp differ diff --git a/public/assets/img/maps/de_overpass/7.webp b/public/assets/img/maps/de_overpass/7.webp new file mode 100644 index 0000000..068d5c5 Binary files /dev/null and b/public/assets/img/maps/de_overpass/7.webp differ diff --git a/public/assets/img/maps/de_overpass/8.webp b/public/assets/img/maps/de_overpass/8.webp new file mode 100644 index 0000000..9b7585e Binary files /dev/null and b/public/assets/img/maps/de_overpass/8.webp differ diff --git a/public/assets/img/maps/de_train/1.webp b/public/assets/img/maps/de_train/1.webp new file mode 100644 index 0000000..875a4a8 Binary files /dev/null and b/public/assets/img/maps/de_train/1.webp differ diff --git a/public/assets/img/maps/de_train/2.webp b/public/assets/img/maps/de_train/2.webp new file mode 100644 index 0000000..8d946cd Binary files /dev/null and b/public/assets/img/maps/de_train/2.webp differ diff --git a/public/assets/img/maps/de_train/3.webp b/public/assets/img/maps/de_train/3.webp new file mode 100644 index 0000000..66b3b31 Binary files /dev/null and b/public/assets/img/maps/de_train/3.webp differ diff --git a/public/assets/img/maps/de_train/4.webp b/public/assets/img/maps/de_train/4.webp new file mode 100644 index 0000000..bba7277 Binary files /dev/null and b/public/assets/img/maps/de_train/4.webp differ diff --git a/public/assets/img/maps/de_train/5.webp b/public/assets/img/maps/de_train/5.webp new file mode 100644 index 0000000..e6f7e51 Binary files /dev/null and b/public/assets/img/maps/de_train/5.webp differ diff --git a/public/assets/img/maps/de_train/6.webp b/public/assets/img/maps/de_train/6.webp new file mode 100644 index 0000000..f96fab9 Binary files /dev/null and b/public/assets/img/maps/de_train/6.webp differ diff --git a/public/assets/img/maps/de_vertigo/1.webp b/public/assets/img/maps/de_vertigo/1.webp new file mode 100644 index 0000000..c881b22 Binary files /dev/null and b/public/assets/img/maps/de_vertigo/1.webp differ diff --git a/public/assets/img/maps/de_vertigo/2.webp b/public/assets/img/maps/de_vertigo/2.webp new file mode 100644 index 0000000..b800476 Binary files /dev/null and b/public/assets/img/maps/de_vertigo/2.webp differ diff --git a/public/assets/img/maps/de_vertigo/3.webp b/public/assets/img/maps/de_vertigo/3.webp new file mode 100644 index 0000000..075a58f Binary files /dev/null and b/public/assets/img/maps/de_vertigo/3.webp differ diff --git a/public/assets/img/maps/de_vertigo/4.webp b/public/assets/img/maps/de_vertigo/4.webp new file mode 100644 index 0000000..5dcd125 Binary files /dev/null and b/public/assets/img/maps/de_vertigo/4.webp differ diff --git a/public/assets/img/maps/de_vertigo/5.webp b/public/assets/img/maps/de_vertigo/5.webp new file mode 100644 index 0000000..8f2b6d6 Binary files /dev/null and b/public/assets/img/maps/de_vertigo/5.webp differ diff --git a/public/assets/img/maps/de_vertigo/6.webp b/public/assets/img/maps/de_vertigo/6.webp new file mode 100644 index 0000000..01541e6 Binary files /dev/null and b/public/assets/img/maps/de_vertigo/6.webp differ diff --git a/public/assets/sounds/accept.wav b/public/assets/sounds/accept.wav new file mode 100644 index 0000000..0dabae0 Binary files /dev/null and b/public/assets/sounds/accept.wav differ diff --git a/public/assets/sounds/beep.wav b/public/assets/sounds/beep.wav new file mode 100644 index 0000000..dc4aff2 Binary files /dev/null and b/public/assets/sounds/beep.wav differ diff --git a/public/assets/sounds/cs2_game_ready.wav b/public/assets/sounds/cs2_game_ready.wav new file mode 100644 index 0000000..50bc066 Binary files /dev/null and b/public/assets/sounds/cs2_game_ready.wav differ diff --git a/public/assets/vids/ffmpeg.exe b/public/assets/vids/ffmpeg.exe new file mode 100644 index 0000000..90f0162 Binary files /dev/null and b/public/assets/vids/ffmpeg.exe differ diff --git a/public/assets/vids/overlay_cs2_accept.webm b/public/assets/vids/overlay_cs2_accept.webm new file mode 100644 index 0000000..f6ed031 Binary files /dev/null and b/public/assets/vids/overlay_cs2_accept.webm differ diff --git a/public/assets/vids/overlay_cs2_accept.webp b/public/assets/vids/overlay_cs2_accept.webp new file mode 100644 index 0000000..940bb19 Binary files /dev/null and b/public/assets/vids/overlay_cs2_accept.webp differ diff --git a/src/app/api/admin/teams/route.ts b/src/app/api/admin/team/route.ts similarity index 100% rename from src/app/api/admin/teams/route.ts rename to src/app/api/admin/team/route.ts diff --git a/src/app/api/matches/[matchId]/export-to-sftp/route.ts b/src/app/api/matches/[matchId]/export-to-sftp/route.ts new file mode 100644 index 0000000..66168be --- /dev/null +++ b/src/app/api/matches/[matchId]/export-to-sftp/route.ts @@ -0,0 +1,151 @@ +// /app/api/matches/[id]/export-to-sftp/route.ts +import { NextResponse } from 'next/server' +import { randomBytes } from 'crypto' + +export const runtime = 'nodejs' // KEIN edge +export const dynamic = 'force-dynamic' + +type MapVoteStep = { + action: 'ban' | 'pick' | 'decider' + map?: string | null + teamId?: string | null +} +type MapVoteState = { + bestOf?: number + steps: MapVoteStep[] + mapVisuals?: Record + teams?: { + teamA?: { id?: string | null, name?: string | null, players?: Array<{ steamId: string, name?: string | null }> } + teamB?: { id?: string | null, name?: string | null, players?: Array<{ steamId: string, name?: string | null }> } + } + locked?: boolean +} + +type PlayerLike = { user?: { steamId: string, name?: string | null }, steamId?: string, name?: string | null } +type MatchLike = { + id: string | number + bestOf?: number + teamA?: { name?: string | null, players?: PlayerLike[] | any[] } + teamB?: { name?: string | null, players?: PlayerLike[] | any[] } +} + +function sanitizeFilePart(s?: string | null) { + return (s ?? 'team').toLowerCase().replace(/[^a-z0-9]+/g, '_').replace(/^_+|_+$/g, '') +} + +function playersMapFromList(list: PlayerLike[] | any[] | undefined) { + const out: Record = {} + for (const p of list ?? []) { + const sid = (p?.user?.steamId ?? (p as any)?.steamId) as string | undefined + if (!sid) continue + const name = (p?.user?.name ?? p?.name ?? 'Player') as string + out[sid] = name + } + return out +} + +function toDeMapName(key: string) { + if (key.startsWith('de_')) return key + return `de_${key}` +} + +function buildMatchJson(match: MatchLike, state: MapVoteState) { + const bestOf = match.bestOf ?? state.bestOf ?? 3 + // Nur Picks + Decider in Reihenfolge (ohne Lücken) + const chosen = (state.steps ?? []).filter(s => (s.action === 'pick' || s.action === 'decider') && s.map) + + // maplist + const maplist = chosen.slice(0, bestOf).map(s => toDeMapName(s.map!)) + + // einfache Sides-Logik (Beispiel): first two maps start CT for Team1/Team2, last knife + const map_sides = maplist.map((_, i) => { + if (i === maplist.length - 1) return 'knife' + return i % 2 === 0 ? 'team1_ct' : 'team2_ct' + }) + + const team1Name = match.teamA?.name ?? 'Team_1' + const team2Name = match.teamB?.name ?? 'Team_2' + + const team1Players = playersMapFromList(match.teamA?.players) + const team2Players = playersMapFromList(match.teamB?.players) + + const payload = { + matchid: Number(match.id) || 0, + team1: { name: team1Name, players: team1Players }, + team2: { name: team2Name, players: team2Players }, + num_maps: bestOf, + maplist, + map_sides, + spectators: { players: {} as Record }, // optional + clinch_series: true, + players_per_team: 5, + cvars: { + hostname: `Iron:e Open 4 | ${team1Name} vs ${team2Name}`, + mp_friendlyfire: '1', + }, + } + + return payload +} + +export async function POST(req: Request, { params }: { params: { matchId: string } }) { + try { + const SFTPClient = (await import('ssh2-sftp-client')).default // dyn. import + const { match, state } = (await req.json()) as { match: MatchLike, state: MapVoteState } + if (!match || !state?.locked) { + return NextResponse.json({ error: 'Ungültige Daten oder Voting nicht abgeschlossen.' }, { status: 400 }) + } + + const bestOf = match.bestOf ?? state.bestOf ?? 3 + const chosen = (state.steps ?? []).filter(s => (s.action === 'pick' || s.action === 'decider') && s.map) + if (chosen.length < bestOf) { + return NextResponse.json({ error: 'Es sind noch nicht alle Maps gewählt.' }, { status: 400 }) + } + + // JSON bauen + const json = buildMatchJson(match, state) + const jsonStr = JSON.stringify(json, null, 2) + + // Dateiname (wie gewünscht) + const team1 = sanitizeFilePart(match.teamA?.name) + const team2 = sanitizeFilePart(match.teamB?.name) + const rid = randomBytes(3).toString('hex') // 6 hex chars + const filename = `team_${team1}_vs_team_${team2}_${rid}.json` + + // SFTP Credentials + const url = process.env.PTERO_SERVER_SFTP_URL || '' // z.B. "sftp://your.host:22" oder "your.host:22" oder nur Host + const user = process.env.PTERO_SERVER_SFTP_USER + const pass = process.env.PTERO_SERVER_SFTP_PASSWORD + + if (!url || !user || !pass) { + return NextResponse.json({ error: 'SFTP-Umgebungsvariablen fehlen.' }, { status: 500 }) + } + + // host/port extrahieren + let host = url + let port = 22 + try { + const u = new URL(url.includes('://') ? url : `sftp://${url}`) + host = u.hostname + port = Number(u.port) || 22 + } catch { + // Fallback: "host:port" oder nur host + const [h, p] = url.split(':') + host = h ?? url + port = p ? Number(p) : 22 + } + + // Upload + const sftp = new SFTPClient() + await sftp.connect({ host, port, username: user, password: pass }) + + const remotePath = `/game/csgo/${filename}` + await sftp.put(Buffer.from(jsonStr, 'utf8'), remotePath) + await sftp.end() + + return NextResponse.json({ ok: true, remotePath, filename }) + } catch (err: any) { + console.error('[export-to-sftp] error:', err) + return NextResponse.json({ error: err?.message ?? 'Upload fehlgeschlagen' }, { status: 500 }) + } +} diff --git a/src/app/api/matches/[matchId]/mapvote/reset/route.ts b/src/app/api/matches/[matchId]/mapvote/reset/route.ts index 08d17ad..904df52 100644 --- a/src/app/api/matches/[matchId]/mapvote/reset/route.ts +++ b/src/app/api/matches/[matchId]/mapvote/reset/route.ts @@ -1,106 +1,133 @@ -// /app/api/matches/[matchId]/mapvote/reset/route.ts +// /app/api/matches/[id]/mapvote/reset/route.ts import { NextRequest, NextResponse } from 'next/server' import { getServerSession } from 'next-auth' import { authOptions } from '@/app/lib/auth' import { prisma } from '@/app/lib/prisma' -import { MapVoteAction } from '@/generated/prisma' import { sendServerSSEMessage } from '@/app/lib/sse-server-client' import { MAP_OPTIONS } from '@/app/lib/mapOptions' +import { createHash } from 'crypto' -// ---- Pool aus MAP_OPTIONS ableiten (nur "de_*", ohne Sonderkarten) ---- -const MAP_POOL: string[] = MAP_OPTIONS - .filter(m => m.key.startsWith('de_') && m.key !== 'lobby_mapvote') - .map(m => m.key) +export const runtime = 'nodejs' +export const dynamic = 'force-dynamic' -// identisch zu mapvote-Route -function voteOpensAt(match: { matchDate: Date | null, demoDate: Date | null }) { - const base = match.matchDate ?? match.demoDate ?? new Date() - return new Date(base.getTime() - 60 * 60 * 1000) +function shapeState(vote: any) { + const ACTION_MAP = { BAN: 'ban', PICK: 'pick', DECIDER: 'decider' } as const + const steps = [...vote.steps] + .sort((a, b) => a.order - b.order) + .map((s: any) => ({ + order : s.order, + action : ACTION_MAP[s.action as keyof typeof ACTION_MAP], + teamId : s.teamId, + map : s.map, + chosenAt: s.chosenAt ? s.chosenAt.toISOString() : null, + chosenBy: s.chosenBy ?? null, + })) + + return { + bestOf : vote.bestOf, + mapPool : vote.mapPool as string[], + currentIndex: vote.currentIdx, + locked : vote.locked as boolean, + opensAt : vote.opensAt ? new Date(vote.opensAt).toISOString() : null, + steps, + adminEdit: vote.adminEditingBy + ? { + enabled: true, + by: vote.adminEditingBy as string, + since: vote.adminEditingSince ? new Date(vote.adminEditingSince).toISOString() : null, + } + : { enabled: false, by: null, since: null }, + } } -// buildSteps so umbauen, dass die Reihenfolge (Startteam) variabel ist -function buildSteps(bestOf: number, firstId: string, secondId: string) { - if (bestOf === 3) { - return [ - { order: 0, action: MapVoteAction.BAN, teamId: firstId }, - { order: 1, action: MapVoteAction.BAN, teamId: secondId }, - { order: 2, action: MapVoteAction.PICK, teamId: firstId }, - { order: 3, action: MapVoteAction.PICK, teamId: secondId }, - { order: 4, action: MapVoteAction.BAN, teamId: firstId }, - { order: 5, action: MapVoteAction.BAN, teamId: secondId }, - { order: 6, action: MapVoteAction.DECIDER, teamId: null }, - ] as const +function buildMapVisuals(matchId: string, mapPool: string[]) { + const visuals: Record = {} + for (const key of mapPool) { + const opt = MAP_OPTIONS.find(o => o.key === key) + const label = opt?.label ?? key + const imgs = opt?.images ?? [] + let bg = `/assets/img/maps/${key}/1.jpg` + + if (imgs.length > 0) { + const h = createHash('sha256').update(`${matchId}:${key}`).digest('hex') + const n = parseInt(h.slice(0, 8), 16) + const idx = n % imgs.length + bg = imgs[idx] + } + + visuals[key] = { label, bg } } - // BO5 - return [ - { order: 0, action: MapVoteAction.BAN, teamId: firstId }, - { order: 1, action: MapVoteAction.BAN, teamId: secondId }, - { order: 2, action: MapVoteAction.PICK, teamId: firstId }, - { order: 3, action: MapVoteAction.PICK, teamId: secondId }, - { order: 4, action: MapVoteAction.PICK, teamId: firstId }, - { order: 5, action: MapVoteAction.PICK, teamId: secondId }, - { order: 6, action: MapVoteAction.PICK, teamId: firstId }, - ] as const + return visuals } export async function POST(req: NextRequest, { params }: { params: { matchId: string } }) { const session = await getServerSession(authOptions(req)) - if (!session?.user?.isAdmin) { - return NextResponse.json({ message: 'Nicht autorisiert' }, { status: 403 }) - } + const me = session?.user as { steamId: string; isAdmin?: boolean } | undefined + if (!me?.steamId) return NextResponse.json({ message: 'Nicht eingeloggt' }, { status: 401 }) const matchId = params.matchId - if (!matchId) return NextResponse.json({ message: 'Missing matchId' }, { status: 400 }) + if (!matchId) return NextResponse.json({ message: 'Missing id' }, { status: 400 }) - const match = await prisma.match.findUnique({ - where: { id: matchId }, - select: { - id: true, - bestOf: true, - matchDate: true, - demoDate: true, - teamA: { select: { id: true } }, - teamB: { select: { id: true } }, - mapVote: { select: { id: true } }, - }, - }) - if (!match?.teamA?.id || !match?.teamB?.id) { - return NextResponse.json({ message: 'Match/Teams nicht gefunden' }, { status: 404 }) - } - - const bestOf = match.bestOf ?? 3 - // ---- Zufälliges Startteam bestimmen ---- - const firstId = Math.random() < 0.5 ? match.teamA.id : match.teamB.id - const secondId = firstId === match.teamA.id ? match.teamB.id : match.teamA.id - const stepsDef = buildSteps(bestOf, firstId, secondId) - - const opensAt = voteOpensAt({ matchDate: match.matchDate ?? null, demoDate: match.demoDate ?? null }) - - await prisma.$transaction(async (tx) => { - if (match.mapVote?.id) { - await tx.mapVoteStep.deleteMany({ where: { voteId: match.mapVote.id } }) - await tx.mapVote.delete({ where: { matchId } }) + try { + const match = await prisma.match.findUnique({ + where: { id: matchId }, + include: { mapVote: { include: { steps: true } } }, + }) + if (!match?.mapVote) { + return NextResponse.json({ message: 'Map-Vote nicht gefunden' }, { status: 404 }) } - await tx.mapVote.create({ - data: { - matchId, - bestOf, - mapPool: MAP_POOL, // <- aus MAP_OPTIONS - currentIdx: 0, - locked: false, - opensAt, - steps: { - create: stepsDef.map(s => ({ - order: s.order, - action: s.action, - teamId: s.teamId, - })), - }, - }, - }) - }) + // optional: nur Admins erlauben – falls gewünscht: + // if (!me.isAdmin) return NextResponse.json({ message: 'Nur Admins dürfen resetten' }, { status: 403 }) - await sendServerSSEMessage({ type: 'map-vote-updated', matchId }) - return NextResponse.json({ ok: true }) + const vote = match.mapVote + + // Reset in einer Transaktion + await prisma.$transaction(async (tx) => { + // alle Steps zurücksetzen + await Promise.all( + vote.steps.map(s => + tx.mapVoteStep.update({ + where: { id: s.id }, + data : { map: null, chosenAt: null, chosenBy: null }, + }) + ) + ) + + // Vote Zustand zurücksetzen + await tx.mapVote.update({ + where: { id: vote.id }, + data : { + currentIdx: 0, + locked: false, + adminEditingBy: null, + adminEditingSince: null, + }, + }) + }) + + const updated = await prisma.mapVote.findUnique({ + where: { id: vote.id }, + include: { steps: true }, + }) + if (!updated) { + return NextResponse.json({ message: 'Reset fehlgeschlagen' }, { status: 500 }) + } + + // Events: zuerst map-vote-updated (UI neu laden) + await sendServerSSEMessage({ type: 'map-vote-updated', matchId }) + + // dann map-vote-reset (globale Overlays schließen, lokale Flags löschen) + await sendServerSSEMessage({ type: 'map-vote-reset', matchId }) + + const mapVisuals = buildMapVisuals(match.id, updated.mapPool) + + return NextResponse.json( + { ...shapeState(updated), mapVisuals }, + { headers: { 'Cache-Control': 'no-store' } }, + ) + } catch (e) { + console.error('[map-vote-reset][POST] error', e) + return NextResponse.json({ message: 'Reset fehlgeschlagen' }, { status: 500 }) + } } diff --git a/src/app/api/matches/[matchId]/mapvote/route.ts b/src/app/api/matches/[matchId]/mapvote/route.ts index f8b68b1..c89f905 100644 --- a/src/app/api/matches/[matchId]/mapvote/route.ts +++ b/src/app/api/matches/[matchId]/mapvote/route.ts @@ -5,9 +5,11 @@ import { authOptions } from '@/app/lib/auth' import { prisma } from '@/app/lib/prisma' import { MapVoteAction } from '@/generated/prisma' import { sendServerSSEMessage } from '@/app/lib/sse-server-client' -import { randomInt } from 'crypto' +import { randomInt, createHash, randomBytes } from 'crypto' import { MAP_OPTIONS } from '@/app/lib/mapOptions' -import { createHash } from 'crypto' + +export const runtime = 'nodejs' +export const dynamic = 'force-dynamic' /* -------------------- Konstanten -------------------- */ @@ -118,122 +120,74 @@ function shapePlayer(p: any) { } } -// Base-URL aus Request ableiten (lokal/proxy-fähig) -function getBaseUrl(req: NextRequest | NextResponse) { - const proto = (req.headers.get('x-forwarded-proto') || 'http').split(',')[0].trim() - const host = (req.headers.get('x-forwarded-host') || req.headers.get('host') || '').split(',')[0].trim() - return `${proto}://${host}` -} - -async function fetchTeamApi(teamId: string | null | undefined, req: NextRequest) { - if (!teamId) return null - const base = getBaseUrl(req) - const url = `${base}/api/team/${teamId}` - - try { - const r = await fetch(url, { - cache: 'no-store', - headers: { - 'x-forwarded-proto': req.headers.get('x-forwarded-proto') || '', - 'x-forwarded-host' : req.headers.get('x-forwarded-host') || '', - } - }) - if (!r.ok) return null - const json = await r.json() - return json as { - id: string - name?: string | null - logo?: string | null - leader?: string | null - activePlayers: any[] - inactivePlayers: any[] - invitedPlayers: any[] - } - } catch { - return null +// Teams-Payload (mit Spielern) zusammenbauen +function shapeUser(u: any) { + if (!u) return null + return { + steamId : u.steamId, + name : u.name ?? '', + avatar : u.avatar ?? '', + location : u.location ?? undefined, + premierRank: u.premierRank ?? undefined, + isAdmin : u.isAdmin ?? undefined, } } -// Teams-Payload (mit Spielern) zusammenbauen -async function buildTeamsPayload(match: any, req: NextRequest) { - const [teamAApi, teamBApi] = await Promise.all([ - fetchTeamApi(match.teamA?.id, req), - fetchTeamApi(match.teamB?.id, req), - ]) - - const teamAPlayers = (teamAApi?.activePlayers ?? []).map(shapePlayer).filter(Boolean) - const teamBPlayers = (teamBApi?.activePlayers ?? []).map(shapePlayer).filter(Boolean) +function buildTeamsPayloadFromMatch(match: any) { + const teamAPlayers = (match.teamAUsers ?? []).map(shapeUser).filter(Boolean) + const teamBPlayers = (match.teamBUsers ?? []).map(shapeUser).filter(Boolean) return { teamA: { id : match.teamA?.id ?? null, name : match.teamA?.name ?? null, logo : match.teamA?.logo ?? null, - leader : resolveLeaderPlayer(match.teamA, teamAApi), + leader : shapeLeader(match.teamA?.leader ?? null), players: teamAPlayers, }, teamB: { id : match.teamB?.id ?? null, name : match.teamB?.name ?? null, logo : match.teamB?.logo ?? null, - leader : resolveLeaderPlayer(match.teamB, teamBApi), + leader : shapeLeader(match.teamB?.leader ?? null), players: teamBPlayers, }, } } -// Leader bevorzugt aus Match-Relation; Fallback über Team-API -function resolveLeaderPlayer(matchTeam: any | null | undefined, teamApi: any | null) { - const leaderFromMatch = shapeLeader(matchTeam?.leader ?? null) - if (leaderFromMatch) return leaderFromMatch - - const leaderId: string | null = teamApi?.leader ?? null - if (!leaderId) return null - - const pool: any[] = [ - ...(teamApi?.activePlayers ?? []), - ...(teamApi?.inactivePlayers ?? []), - ...(teamApi?.invitedPlayers ?? []), - ] - const found = pool.find(p => p?.steamId === leaderId) - return shapePlayer(found) ?? { steamId: leaderId, name: '', avatar: '' } -} - async function ensureVote(matchId: string) { const match = await prisma.match.findUnique({ where: { id: matchId }, include: { - teamA : { + teamA: { include: { leader: { select: { - steamId: true, - name: true, - avatar: true, - location: true, - premierRank: true, - isAdmin: true, + steamId: true, name: true, avatar: true, location: true, + premierRank: true, isAdmin: true, } } } }, - teamB : { + teamB: { include: { leader: { select: { - steamId: true, - name: true, - avatar: true, - location: true, - premierRank: true, - isAdmin: true, + steamId: true, name: true, avatar: true, location: true, + premierRank: true, isAdmin: true, } } } }, + // 👉 Spieler direkt am Match laden: + teamAUsers: true, + teamBUsers: true, + // optional zusätzlich: + players: { include: { user: true } }, // falls du MatchPlayer brauchst mapVote: { include: { steps: true } }, }, }) + if (!match) return { match: null, vote: null } // Bereits vorhanden? @@ -241,7 +195,7 @@ async function ensureVote(matchId: string) { // Neu anlegen const bestOf = match.bestOf ?? 3 - const mapPool = MAP_OPTIONS.map(m => m.key) + const mapPool = MAP_OPTIONS.filter(m => m.active).map(m => m.key) const opensAt = voteOpensAt({ matchDate: match.matchDate ?? null, demoDate: match.demoDate ?? null }) const firstIsA = (typeof randomInt === 'function') ? randomInt(0, 2) === 0 : Math.random() < 0.5 @@ -294,11 +248,169 @@ function buildMapVisuals(matchId: string, mapPool: string[]) { bg = imgs[idx] } - visuals[key] = { label, bg } // images optional mitgeben: { label, bg, images: imgs } + visuals[key] = { label, bg } } return visuals } +function uniq(arr: T[]) { + return Array.from(new Set(arr)) +} + +function collectParticipants(match: any): string[] { + const fromMatchPlayers = + (match.players ?? []) + .map((mp: any) => mp?.user?.steamId) + .filter(Boolean) + + const fromTeamUsersA = (match.teamAUsers ?? []).map((u: any) => u?.steamId).filter(Boolean) + const fromTeamUsersB = (match.teamBUsers ?? []).map((u: any) => u?.steamId).filter(Boolean) + + const fromActiveA = Array.isArray(match.teamA?.activePlayers) ? match.teamA.activePlayers : [] + const fromActiveB = Array.isArray(match.teamB?.activePlayers) ? match.teamB.activePlayers : [] + + const leaderA = match.teamA?.leader?.steamId ? [match.teamA.leader.steamId] : [] + const leaderB = match.teamB?.leader?.steamId ? [match.teamB.leader.steamId] : [] + + return uniq([ + ...fromMatchPlayers, + ...fromTeamUsersA, ...fromTeamUsersB, + ...fromActiveA, ...fromActiveB, + ...leaderA, ...leaderB, + ]) +} + + +/* ---------- Export-Helfer ---------- */ + +type PlayerLike = { user?: { steamId: string, name?: string | null }, steamId?: string, name?: string | null } +type MatchLike = { + id: string | number + bestOf?: number + teamA?: { name?: string | null, players?: PlayerLike[] | any[] } + teamB?: { name?: string | null, players?: PlayerLike[] | any[] } +} +type MapVoteStep = { action: 'ban' | 'pick' | 'decider', map?: string | null, teamId?: string | null } +type MapVoteStateForExport = { bestOf?: number, steps: MapVoteStep[], locked?: boolean } + +function sanitizeFilePart(s?: string | null) { + return (s ?? 'team').toLowerCase().replace(/[^a-z0-9]+/g, '_').replace(/^_+|_+$/g, '') +} +function playersMapFromList(list: PlayerLike[] | any[] | undefined) { + const out: Record = {} + for (const p of list ?? []) { + const sid = (p?.user?.steamId ?? (p as any)?.steamId) as string | undefined + if (!sid) continue + const name = (p?.user?.name ?? p?.name ?? 'Player') as string + out[sid] = name + } + return out +} +function toDeMapName(key: string) { + if (key.startsWith('de_')) return key + return `de_${key}` +} +function buildMatchJson(match: MatchLike, state: MapVoteStateForExport) { + const bestOf = match.bestOf ?? state.bestOf ?? 3 + const chosen = (state.steps ?? []).filter(s => (s.action === 'pick' || s.action === 'decider') && s.map) + + const maplist = chosen.slice(0, bestOf).map(s => toDeMapName(s.map!)) + + const map_sides = maplist.map((_, i) => { + if (i === maplist.length - 1) return 'knife' + return i % 2 === 0 ? 'team1_ct' : 'team2_ct' + }) + + const team1Name = match.teamA?.name ?? 'Team_1' + const team2Name = match.teamB?.name ?? 'Team_2' + + const team1Players = playersMapFromList(match.teamA?.players) + const team2Players = playersMapFromList(match.teamB?.players) + + return { + matchid: "", + team1: { name: team1Name, players: team1Players }, + team2: { name: team2Name, players: team2Players }, + num_maps: bestOf, + maplist, + map_sides, + spectators: { players: {} as Record }, + clinch_series: true, + players_per_team: 5, + cvars: { + hostname: `Iron:e Open 4 | ${team1Name} vs ${team2Name}`, + mp_friendlyfire: '1', + }, + } +} + +async function exportMatchToSftpDirect(match: any, vote: any) { + try { + const SFTPClient = (await import('ssh2-sftp-client')).default // dyn. import + const mLike: MatchLike = { + id: match.id, + bestOf: match.bestOf ?? vote.bestOf ?? 3, + teamA: { name: match.teamA?.name ?? 'Team_1', players: match.teamAUsers ?? [] }, + teamB: { name: match.teamB?.name ?? 'Team_2', players: match.teamBUsers ?? [] }, + } + const sLike: MapVoteStateForExport = { + bestOf: vote.bestOf, + steps: [...vote.steps] + .sort((a: any, b: any) => a.order - b.order) + .map((s: any) => ({ action: mapActionToApi(s.action), map: s.map, teamId: s.teamId })), + locked: vote.locked, + } + + if (!sLike.locked) return // nur exportieren, wenn locked + + const bestOf = mLike.bestOf ?? sLike.bestOf ?? 3 + const chosen = (sLike.steps ?? []).filter(s => (s.action === 'pick' || s.action === 'decider') && s.map) + if (chosen.length < bestOf) return // vollständig sicherstellen + + const json = buildMatchJson(mLike, sLike) + const jsonStr = JSON.stringify(json, null, 2) + + const filename = `${match.id}.json` + + const url = process.env.PTERO_SERVER_SFTP_URL || '' + const user = process.env.PTERO_SERVER_SFTP_USER + const pass = process.env.PTERO_SERVER_SFTP_PASSWORD + if (!url || !user || !pass) { + throw new Error('SFTP-Umgebungsvariablen fehlen (PTERO_SERVER_SFTP_URL, _USER, _PASSWORD).') + } + + let host = url + let port = 22 + try { + const u = new URL(url.includes('://') ? url : `sftp://${url}`) + host = u.hostname + port = Number(u.port) || 22 + } catch { + const [h, p] = url.split(':') + host = h ?? url + port = p ? Number(p) : 22 + } + + const sftp = new SFTPClient() + await sftp.connect({ host, port, username: user, password: pass }) + + const remotePath = `/game/csgo/${filename}` + await sftp.put(Buffer.from(jsonStr, 'utf8'), remotePath) + await sftp.end() + + console.log(`[mapvote] Export OK → ${remotePath}`) + } catch (err) { + console.error('[mapvote] Export fehlgeschlagen:', err) + } +} + +/* ---------- kleine Helfer für match-ready Payload ---------- */ + +function deriveChosenSteps(vote: any) { + const steps = [...vote.steps].sort((a: any, b: any) => a.order - b.order) + return steps.filter((s: any) => (s.action === 'PICK' || s.action === 'DECIDER') && s.map) +} + /* -------------------- GET -------------------- */ export async function GET(req: NextRequest, { params }: { params: { matchId: string } }) { @@ -309,7 +421,7 @@ export async function GET(req: NextRequest, { params }: { params: { matchId: str const { match, vote } = await ensureVote(matchId) if (!match || !vote) return NextResponse.json({ message: 'Match nicht gefunden' }, { status: 404 }) - const teams = await buildTeamsPayload(match, req) + const teams = buildTeamsPayloadFromMatch(match) const mapVisuals = buildMapVisuals(match.id, vote.mapPool) return NextResponse.json( @@ -350,7 +462,7 @@ export async function POST(req: NextRequest, { params }: { params: { matchId: st await sendServerSSEMessage({ type: 'map-vote-updated', matchId }) - const teams = await buildTeamsPayload(match, req) + const teams = buildTeamsPayloadFromMatch(match) const mapVisuals = buildMapVisuals(match.id, updated.mapPool) return NextResponse.json({ ...shapeState(updated), mapVisuals, teams }) @@ -380,9 +492,30 @@ export async function POST(req: NextRequest, { params }: { params: { matchId: st await sendServerSSEMessage({ type: 'map-vote-updated', matchId }) - const teams = await buildTeamsPayload(match, req) + const teams = buildTeamsPayloadFromMatch(match) const mapVisuals = buildMapVisuals(match.id, updated!.mapPool) + // ➕ match-ready senden (erste Map + Teilnehmer) + if (updated?.locked) { + const chosen = deriveChosenSteps(updated) + const first = chosen[0] + const key = first?.map ?? null + const label = key ? (mapVisuals?.[key]?.label ?? key) : '?' + const bg = key ? (mapVisuals?.[key]?.bg ?? `/assets/img/maps/${key}/1.jpg`) : '/assets/img/maps/cs2.webp' + + const participants = collectParticipants(match) + + await sendServerSSEMessage({ + type: 'match-ready', + matchId, + firstMap: { key, label, bg }, + participants, + }); + + // Export serverseitig + await exportMatchToSftpDirect(match, updated) + } + return NextResponse.json({ ...shapeState(updated), mapVisuals, teams }) } @@ -412,9 +545,30 @@ export async function POST(req: NextRequest, { params }: { params: { matchId: st await sendServerSSEMessage({ type: 'map-vote-updated', matchId }) - const teams = await buildTeamsPayload(match, req) + const teams = buildTeamsPayloadFromMatch(match) const mapVisuals = buildMapVisuals(match.id, updated!.mapPool) + // ➕ match-ready senden + if (updated?.locked) { + const chosen = deriveChosenSteps(updated) + const first = chosen[0] + const key = first?.map ?? null + const label = key ? (mapVisuals?.[key]?.label ?? key) : '?' + const bg = key ? (mapVisuals?.[key]?.bg ?? `/assets/img/maps/${key}/1.jpg`) : '/assets/img/maps/cs2.webp' + + const participants = collectParticipants(match) + + await sendServerSSEMessage({ + type: 'match-ready', + matchId, + firstMap: { key, label, bg }, + participants, + }); + + // Export serverseitig + await exportMatchToSftpDirect(match, updated) + } + return NextResponse.json({ ...shapeState(updated), mapVisuals, teams }) } @@ -483,9 +637,29 @@ export async function POST(req: NextRequest, { params }: { params: { matchId: st await sendServerSSEMessage({ type: 'map-vote-updated', matchId }) - const teams = await buildTeamsPayload(match, req) + const teams = buildTeamsPayloadFromMatch(match) const mapVisuals = buildMapVisuals(match.id, updated!.mapPool) + // Falls durch diesen Schritt locked wurde → Export & match-ready + if (updated?.locked) { + const chosen = deriveChosenSteps(updated) + const first = chosen[0] + const key = first?.map ?? null + const label = key ? (mapVisuals?.[key]?.label ?? key) : '?' + const bg = key ? (mapVisuals?.[key]?.bg ?? `/assets/img/maps/${key}/1.jpg`) : '/assets/img/maps/cs2.webp' + + const participants = collectParticipants(match) + + await sendServerSSEMessage({ + type: 'match-ready', + matchId, + firstMap: { key, label, bg }, + participants, + }); + + await exportMatchToSftpDirect(match, updated) + } + return NextResponse.json({ ...shapeState(updated), mapVisuals, teams }) } catch (e) { console.error('[map-vote][POST] error', e) diff --git a/src/app/api/ptero/send-command/route.ts b/src/app/api/ptero/send-command/route.ts new file mode 100644 index 0000000..c37d1ac --- /dev/null +++ b/src/app/api/ptero/send-command/route.ts @@ -0,0 +1,39 @@ +import { NextResponse } from 'next/server' + +const PANEL = process.env.PTERO_PANEL_URL! +const KEY = process.env.PTERODACTYL_CLIENT_API! +const SID = process.env.PTERO_SERVER_ID! + +export async function POST(req: Request) { + if (!PANEL || !KEY || !SID) { + return NextResponse.json({ error: 'Pterodactyl env missing' }, { status: 500 }) + } + + try { + const { command } = await req.json() as { command?: string } + if (!command || typeof command !== 'string') { + return NextResponse.json({ error: 'command required' }, { status: 400 }) + } + + const r = await fetch(`${PANEL}/api/client/servers/${SID}/command`, { + method: 'POST', + headers: { + 'Authorization': `Bearer ${KEY}`, + 'Content-Type': 'application/json', + 'Accept': 'application/json', + }, + body: JSON.stringify({ command }), + // wichtig: keine Caching-Probleme + cache: 'no-store', + }) + + if (!r.ok) { + const msg = await r.text().catch(() => '') + return NextResponse.json({ error: 'Pterodactyl error', details: msg }, { status: r.status }) + } + + return NextResponse.json({ ok: true }) + } catch (e: any) { + return NextResponse.json({ error: e?.message ?? 'unknown error' }, { status: 500 }) + } +} diff --git a/src/app/api/team/create/route.ts b/src/app/api/team/create/route.ts index cb0fe4b..d18aded 100644 --- a/src/app/api/team/create/route.ts +++ b/src/app/api/team/create/route.ts @@ -7,20 +7,16 @@ export const dynamic = 'force-dynamic' export async function POST(req: NextRequest) { try { - /* ───── Request-Body ───── */ const { teamname, leader }: { teamname?: string; leader?: string } = await req.json() - if (!teamname?.trim()) { return NextResponse.json({ message: 'Teamname fehlt.' }, { status: 400 }) } - // Optionaler Vorab-Check (Unique-Constraint sollte zusätzlich auf DB-Ebene existieren) const dup = await prisma.team.findFirst({ where: { name: teamname } }) if (dup) { return NextResponse.json({ message: 'Teamname bereits vergeben.' }, { status: 400 }) } - /* ───── Team anlegen ───── */ const newTeam = await prisma.team.create({ data: { name: teamname, @@ -30,22 +26,20 @@ export async function POST(req: NextRequest) { }, }) - /* ───── Leader verknüpfen + Notification ───── */ if (leader) { const user = await prisma.user.findUnique({ where: { steamId: leader } }) if (!user) { - // Rollback Team und Fehler await prisma.team.delete({ where: { id: newTeam.id } }) return NextResponse.json({ message: 'Leader-Benutzer nicht gefunden.' }, { status: 404 }) } - // User an Team hängen + // user dem Team zuordnen await prisma.user.update({ where: { steamId: leader }, data: { teamId: newTeam.id }, }) - // Persistente Notification + // 🔔 (optional) persistente Notification const note = await prisma.notification.create({ data: { steamId: leader, @@ -56,9 +50,9 @@ export async function POST(req: NextRequest) { }, }) - // ➜ Sofortige Live-Zustellung an den Leader + // ➜ Sofort an Notification-Center await sendServerSSEMessage({ - type: 'notification', // wichtig fürs NotificationCenter + type: 'notification', targetUserIds: [leader], message: note.message, id: note.id, @@ -66,9 +60,15 @@ export async function POST(req: NextRequest) { actionData: note.actionData ?? undefined, createdAt: note.createdAt.toISOString(), }) + + // ✅ ➜ HIER: Self-Refresh für den Ersteller + await sendServerSSEMessage({ + type: 'self-updated', // <— stelle sicher, dass dein Client darauf hört + targetUserIds: [leader], + }) } - /* ───── Optionale Info: Broadcast (falls du den Eventtyp nutzt) ───── */ + // (Optional) Broadcasts await sendServerSSEMessage({ type: 'team-created', title: 'Team erstellt', @@ -76,9 +76,8 @@ export async function POST(req: NextRequest) { teamId: newTeam.id, }) - /* ───── Failsafe/Listen-Refresh für alle Clients ───── */ await sendServerSSEMessage({ - type: 'team-updated', // von deinen Views bereits beobachtet + type: 'team-updated', teamId: newTeam.id, }) @@ -87,7 +86,6 @@ export async function POST(req: NextRequest) { { headers: { 'Cache-Control': 'no-store' } }, ) } catch (error: any) { - // Unique-Constraint sauber abfangen (falls zwei Requests gleichzeitig kommen) if (error?.code === 'P2002') { return NextResponse.json({ message: 'Teamname bereits vergeben.' }, { status: 400 }) } diff --git a/src/app/api/teams/route.ts b/src/app/api/teams/route.ts index 41f6633..8395c65 100644 --- a/src/app/api/teams/route.ts +++ b/src/app/api/teams/route.ts @@ -1,4 +1,4 @@ -// src/app/api/team/list/route.ts +// src/app/api/teams/route.ts import { NextResponse } from 'next/server' import { prisma } from '@/app/lib/prisma' import type { Player } from '@/app/types/team' @@ -71,7 +71,7 @@ export async function GET() { return NextResponse.json({ teams: result }) } catch (err) { - console.error('GET /api/team/list failed:', err) + console.error('GET /api/teams failed:', err) return NextResponse.json( { message: 'Interner Serverfehler' }, { status: 500 }, diff --git a/src/app/api/user/[steamId]/route.ts b/src/app/api/user/[steamId]/route.ts index 6fdb6cb..63ccd1c 100644 --- a/src/app/api/user/[steamId]/route.ts +++ b/src/app/api/user/[steamId]/route.ts @@ -1,4 +1,4 @@ -// /app/api/user/[steamId]/route.ts +// /src/app/api/user/[steamId]/route.ts import { NextResponse } from 'next/server' import { prisma } from '@/app/lib/prisma' @@ -7,7 +7,6 @@ export async function GET( { params }: { params: { steamId: string } } ) { const steamId = params.steamId - if (!steamId) { return NextResponse.json({ error: 'Steam-ID fehlt' }, { status: 400 }) } @@ -19,6 +18,8 @@ export async function GET( steamId: true, name: true, avatar: true, + status: true, // ✅ WICHTIG + lastActiveAt: true, // (optional) falls vorhanden }, }) @@ -26,12 +27,11 @@ export async function GET( return NextResponse.json({ error: 'User nicht gefunden' }, { status: 404 }) } - // Beispielhaft auch "stats" zurückgeben, falls gewünscht - const stats = await prisma.matchPlayer.findMany({ - where: { steamId }, - }) + // (optional) wenn du weiterhin stats mitsenden willst: + // const stats = await prisma.matchPlayer.findMany({ where: { steamId } }) - return NextResponse.json({ user, stats }, { status: 200 }) + return NextResponse.json({ user }, { status: 200 }) + // oder: return NextResponse.json({ user, stats }, { status: 200 }) } catch (error) { console.error('[API] Fehler beim Laden des Users:', error) return NextResponse.json({ error: 'Interner Serverfehler' }, { status: 500 }) diff --git a/src/app/api/user/activity/route.ts b/src/app/api/user/activity/route.ts new file mode 100644 index 0000000..27888b9 --- /dev/null +++ b/src/app/api/user/activity/route.ts @@ -0,0 +1,32 @@ +// /src/app/api/user/activity/route.ts +import { NextResponse, NextRequest } from 'next/server' +import { getServerSession } from 'next-auth' +import { authOptions } from '@/app/lib/auth' +import { prisma } from '@/app/lib/prisma' +import { sendServerSSEMessage } from '@/app/lib/sse-server-client' + +export async function POST(req: NextRequest) { + const session = await getServerSession(authOptions(req)) + const steamId = session?.user?.steamId // <-- hier definieren + + if (!steamId) { + return NextResponse.json({ error: 'Not authenticated' }, { status: 401 }) + } + + await prisma.user.update({ + where: { steamId }, + data: { status: 'online', lastActiveAt: new Date() }, + }) + + // ➜ Broadcast an alle verbundenen Clients + await sendServerSSEMessage({ + type: 'user-status-updated', + payload: { + steamId, + status: 'online', + updatedAt: new Date().toISOString(), + }, + }) + + return NextResponse.json({ ok: true }) +} diff --git a/src/app/api/user/away/route.ts b/src/app/api/user/away/route.ts new file mode 100644 index 0000000..b03b988 --- /dev/null +++ b/src/app/api/user/away/route.ts @@ -0,0 +1,32 @@ +// /src/app/api/user/away/route.ts +import { NextResponse, NextRequest } from 'next/server' +import { getServerSession } from 'next-auth' +import { authOptions } from '@/app/lib/auth' +import { prisma } from '@/app/lib/prisma' +import { sendServerSSEMessage } from '@/app/lib/sse-server-client' + +export async function POST(req: NextRequest) { + const session = await getServerSession(authOptions(req)) + const steamId = session?.user?.steamId + + if (!steamId) { + return NextResponse.json({ error: 'Not authenticated' }, { status: 401 }) + } + + await prisma.user.update({ + where: { steamId }, + data: { status: 'away' }, + }) + + // ➜ Broadcast an alle verbundenen Clients (wie bei activity) + await sendServerSSEMessage({ + type: 'user-status-updated', + payload: { + steamId, + status: 'away', + updatedAt: new Date().toISOString(), + }, + }) + + return NextResponse.json({ ok: true }, { headers: { 'Cache-Control': 'no-store' } }) +} diff --git a/src/app/api/user/offline/route.ts b/src/app/api/user/offline/route.ts new file mode 100644 index 0000000..c554781 --- /dev/null +++ b/src/app/api/user/offline/route.ts @@ -0,0 +1,30 @@ +// /src/app/api/user/offline/route.ts +import { NextResponse, NextRequest } from 'next/server' +import { getServerSession } from 'next-auth' +import { authOptions } from '@/app/lib/auth' +import { prisma } from '@/app/lib/prisma' +import { sendServerSSEMessage } from '@/app/lib/sse-server-client' + +export async function POST(req: NextRequest) { + const session = await getServerSession(authOptions(req)) + const steamId = session?.user?.steamId + + if (!steamId) return NextResponse.json({ ok: true }, { status: 200 }) // still return 200 for beacon + + await prisma.user.update({ + where: { steamId }, + data: { status: 'offline', lastActiveAt: new Date() }, + }) + + // ➜ Broadcast an alle verbundenen Clients + await sendServerSSEMessage({ + type: 'user-status-updated', + payload: { + steamId, + status: 'offline', + updatedAt: new Date().toISOString(), + }, + }) + + return NextResponse.json({ ok: true }, { headers: { 'Cache-Control': 'no-store' } }) +} diff --git a/src/app/api/user/route.ts b/src/app/api/user/route.ts index b065f02..74eaef1 100644 --- a/src/app/api/user/route.ts +++ b/src/app/api/user/route.ts @@ -1,33 +1,95 @@ // src/app/api/user/route.ts - import { NextResponse, type NextRequest } from 'next/server' import { getServerSession } from 'next-auth' import { authOptions } from '@/app/lib/auth' import { prisma } from '@/app/lib/prisma' export async function GET(req: NextRequest) { - const session = await getServerSession(authOptions(req)) - + const session = await getServerSession(authOptions(req)) const steamId = session?.user?.steamId + if (!steamId) { return NextResponse.json({ error: 'Nicht eingeloggt' }, { status: 401 }) } - const user = await prisma.user.findUnique({ + // 1) User + Team (nur skalare Felder + Leader-Relation laden) + const userRaw = await prisma.user.findUnique({ where: { steamId }, select: { name: true, steamId: true, avatar: true, - team: true, premierRank: true, isAdmin: true, + status: true, + team: { + select: { + id: true, + name: true, + logo: true, + leaderId: true, + leader: { + select: { + steamId: true, + name: true, + avatar: true, + }, + }, + activePlayers: true, + inactivePlayers: true, + }, + }, }, }) - if (!user) { + if (!userRaw) { return NextResponse.json({ error: 'User nicht gefunden' }, { status: 404 }) } - return NextResponse.json(user) + // 2) Falls Team vorhanden: active/inactive IDs in User-Objekte auflösen + let teamResolved: any = null + if (userRaw.team) { + const activeIds = userRaw.team.activePlayers ?? [] + const inactiveIds = userRaw.team.inactivePlayers ?? [] + + // findMany mit leeren Arrays ist ok und liefert [] + const [activeUsers, inactiveUsers] = await Promise.all([ + prisma.user.findMany({ + where: { steamId: { in: activeIds } }, + select: { steamId: true, name: true, avatar: true, premierRank: true }, + }), + prisma.user.findMany({ + where: { steamId: { in: inactiveIds } }, + select: { steamId: true, name: true, avatar: true, premierRank: true }, + }), + ]) + + // Optional: Reihenfolge gemäß IDs beibehalten + const byId = (ids: string[], users: any[]) => { + const map = new Map(users.map((u) => [u.steamId, u])) + return ids.map((id) => map.get(id)).filter(Boolean) + } + + teamResolved = { + id: userRaw.team.id, + name: userRaw.team.name, + logo: userRaw.team.logo, + leader: userRaw.team.leader ?? null, + activePlayers: byId(activeIds, activeUsers), + inactivePlayers: byId(inactiveIds, inactiveUsers), + } + } + + // 3) Antwort formen (Team ersetzt durch aufgelöste Struktur) + const response = { + name: userRaw.name, + steamId: userRaw.steamId, + avatar: userRaw.avatar, + premierRank: userRaw.premierRank, + isAdmin: userRaw.isAdmin, + status: userRaw.status ?? 'offline', + team: teamResolved, + } + + return NextResponse.json(response, { headers: { 'Cache-Control': 'no-store' } }) } diff --git a/src/app/components/AudioPrimer.tsx b/src/app/components/AudioPrimer.tsx new file mode 100644 index 0000000..7cf7765 --- /dev/null +++ b/src/app/components/AudioPrimer.tsx @@ -0,0 +1,34 @@ +'use client' +import { useEffect } from 'react' +import { sound } from '@/app/lib/soundManager' + +export default function AudioPrimer() { + useEffect(() => { + // Beim ersten User-Gesture: AudioContext entsperren & Sounds vorladen + const onFirstGesture = async () => { + await sound.prime(); + if (sound.isPrimed()) { + await Promise.all([ + sound.load('ready', '/assets/sounds/cs2_game_ready.wav'), + sound.load('beep', '/assets/sounds/beep.wav'), + sound.load('accept', '/assets/sounds/accept.wav'), + ]); + } + window.removeEventListener('pointerdown', onFirstGesture); + window.removeEventListener('keydown', onFirstGesture); + window.removeEventListener('touchstart', onFirstGesture); + }; + + window.addEventListener('pointerdown', onFirstGesture, { once: true }); + window.addEventListener('keydown', onFirstGesture, { once: true }); + window.addEventListener('touchstart', onFirstGesture, { once: true }); + + return () => { + window.removeEventListener('pointerdown', onFirstGesture); + window.removeEventListener('keydown', onFirstGesture); + window.removeEventListener('touchstart', onFirstGesture); + }; + }, []); + + return null; +} diff --git a/src/app/components/Button.tsx b/src/app/components/Button.tsx index 5eaa394..f69dad2 100644 --- a/src/app/components/Button.tsx +++ b/src/app/components/Button.tsx @@ -14,6 +14,7 @@ type ButtonProps = { className?: string dropDirection?: 'up' | 'down' | 'auto' disabled?: boolean + loading?: boolean } & ButtonHTMLAttributes const Button = forwardRef(function Button( @@ -29,6 +30,7 @@ const Button = forwardRef(function Button( className, dropDirection = 'down', disabled = false, + loading = false, ...rest }, ref @@ -115,14 +117,14 @@ const Button = forwardRef(function Button( const variantClasses = variants[variant]?.[color] || variants.solid.blue - // Entfernt alle Hover/Focus/Active Tokens (inkl. dark:hover:..., sm:focus:..., etc.) const stripInteractive = (cls: string) => cls .split(/\s+/) .filter(c => c && !c.includes('hover:') && !c.includes('focus:') && !c.includes('active:')) .join(' ') - const safeVariantClasses = disabled ? stripInteractive(variantClasses) : variantClasses + const safeVariantClasses = + disabled || loading ? stripInteractive(variantClasses) : variantClasses const classes = ` ${base} @@ -160,11 +162,18 @@ const Button = forwardRef(function Button( type="button" className={classes} onClick={toggle} - disabled={disabled} + disabled={disabled || loading} {...modalAttributes} {...rest} > - {children ?? title} + {loading && ( + + )} + {loading ? 'Lädt' : (children ?? title)} ) }) diff --git a/src/app/components/ComboBox.tsx b/src/app/components/ComboBox.tsx index a601254..934d115 100644 --- a/src/app/components/ComboBox.tsx +++ b/src/app/components/ComboBox.tsx @@ -1,12 +1,16 @@ 'use client' +type ComboItem = { id: string; label: string } + type ComboBoxProps = { - value: string - items?: string[] - onSelect: (value: string) => void + value: string // ausgewählte ID + items: ComboItem[] // { id, label } + onSelect: (id: string) => void } export default function ComboBox({ value, items, onSelect }: ComboBoxProps) { + const selected = items.find(i => i.id === value) + return (
@@ -15,7 +19,7 @@ export default function ComboBox({ value, items, onSelect }: ComboBoxProps) { type="text" role="combobox" aria-expanded="false" - value={value} + value={selected?.label ?? ''} data-hs-combo-box-input="" readOnly /> @@ -33,8 +37,8 @@ export default function ComboBox({ value, items, onSelect }: ComboBoxProps) { stroke="currentColor" strokeWidth="2" > - - + +
@@ -45,27 +49,36 @@ export default function ComboBox({ value, items, onSelect }: ComboBoxProps) { role="listbox" data-hs-combo-box-output="" > - {items?.map((item, idx) => ( + {items.map((item) => (
onSelect(item)} data-hs-combo-box-output-item="" - data-hs-combo-box-item-stored-data={JSON.stringify({ id: idx, name: item })} + data-hs-combo-box-item-stored-data={JSON.stringify({ id: item.id, name: item.label })} + onClick={() => onSelect(item.id)} >
- {item} - {item === value && ( - + + {item.label} + + {item.id === value && ( + diff --git a/src/app/components/CommunityMatchList.tsx b/src/app/components/CommunityMatchList.tsx index c75b9fd..2b94695 100644 --- a/src/app/components/CommunityMatchList.tsx +++ b/src/app/components/CommunityMatchList.tsx @@ -130,14 +130,14 @@ export default function CommunityMatchList({ matchType }: Props) { ;(async () => { setLoadingTeams(true) try { - const res = await fetch('/api/team/list', { cache: 'no-store' }) + const res = await fetch('/api/teams', { cache: 'no-store' }) const json = await res.json() const opts: TeamOption[] = (json.teams ?? []).map((t: any) => ({ id: t.id, name: t.name, logo: t.logo, })) setTeams(opts) } catch (e) { - console.error('[MatchList] /api/team/list fehlgeschlagen:', e) + console.error('[MatchList] /api/teams fehlgeschlagen:', e) setTeams([]) } finally { setLoadingTeams(false) diff --git a/src/app/components/CreateTeamButton.tsx b/src/app/components/CreateTeamButton.tsx index 1e94b18..0a6c2b1 100644 --- a/src/app/components/CreateTeamButton.tsx +++ b/src/app/components/CreateTeamButton.tsx @@ -1,163 +1,164 @@ 'use client' -import { useEffect, useState, useImperativeHandle, forwardRef } from 'react' +import { useState, forwardRef } from 'react' import { useSession } from 'next-auth/react' import Modal from './Modal' import Button from './Button' type CreateTeamButtonProps = { - setRefetchKey: (key: string) => void + /** Optional: Parent kann damit eine Liste refreshen */ + setRefetchKey?: (key: string) => void } -const CreateTeamButton = forwardRef(({ setRefetchKey }, ref) => { - const { data: session } = useSession() +const CreateTeamButton = forwardRef( + ({ setRefetchKey }, ref) => { + const { data: session } = useSession() - const [teamname, setTeamname] = useState('') - const [showModal, setShowModal] = useState(false) - const [status, setStatus] = useState<'idle' | 'success' | 'error'>('idle') - const [message, setMessage] = useState('') + const [teamname, setTeamname] = useState('') + const [showModal, setShowModal] = useState(false) + const [status, setStatus] = useState<'idle' | 'success' | 'error'>('idle') + const [message, setMessage] = useState('') - // ⬇️ Helfer: Modal schließen + Backdrop sicher entfernen - const closeCreateModalAndCleanup = () => { - const modalEl = document.getElementById('modal-create-team') + // Modal schließen + Backdrop sicher entfernen + const closeCreateModalAndCleanup = () => { + const modalEl = document.getElementById('modal-create-team') - // 1) HSOverlay schließen (falls vorhanden) - if (modalEl && (window as any).HSOverlay?.close) { - ;(window as any).HSOverlay.close(modalEl) - } + if (modalEl && (window as any).HSOverlay?.close) { + ;(window as any).HSOverlay.close(modalEl) + } - // 2) React-State schließen (sorgt dafür, dass unser Modal unmounted) - setShowModal(false) + setShowModal(false) - // 3) HARTE Aufräumaktion: evtl. übrig gebliebene Backdrops/Overlays deaktivieren/entfernen - requestAnimationFrame(() => { - // alle Backdrops entfernen - document.querySelectorAll('.hs-overlay-backdrop').forEach(el => el.remove()) - // sicherheitshalber versteckte Overlays un-klickbar machen - document.querySelectorAll('.hs-overlay[aria-hidden="true"]').forEach(el => { - (el as HTMLElement).style.pointerEvents = 'none' - ;(el as HTMLElement).style.display = 'none' + requestAnimationFrame(() => { + document.querySelectorAll('.hs-overlay-backdrop').forEach(el => el.remove()) + document.querySelectorAll('.hs-overlay[aria-hidden="true"]').forEach(el => { + (el as HTMLElement).style.pointerEvents = 'none' + ;(el as HTMLElement).style.display = 'none' + }) + document.body.classList.remove('overflow-hidden') }) - // falls HSOverlay Klassen am Body gesetzt hat - document.body.classList.remove('overflow-hidden') - }) - } - - const handleSubmit = async () => { - setStatus('idle') - setMessage('') - - if (!teamname.trim()) { - setStatus('error') - setMessage('Bitte gib einen Teamnamen ein.') - return } - try { - const res = await fetch('/api/team/create', { - method: 'POST', - headers: { 'Content-Type': 'application/json' }, - body: JSON.stringify({ teamname, leader: session?.user?.steamId }), - }) + const handleSubmit = async () => { + setStatus('idle') + setMessage('') - const result = await res.json() - if (!res.ok) throw new Error(result.message || 'Fehler beim Erstellen') + if (!teamname.trim()) { + setStatus('error') + setMessage('Bitte gib einen Teamnamen ein.') + return + } - setStatus('success') - setMessage(`Team "${result.team.name}" wurde erfolgreich erstellt!`) - setTeamname('') + try { + const res = await fetch('/api/team/create', { + method: 'POST', + headers: { 'Content-Type': 'application/json' }, + body: JSON.stringify({ teamname, leader: session?.user?.steamId }), + }) - // 🔒 Nach kurzer Bestätigung Modal schließen, Backdrop bereinigen und Liste refreshen - setTimeout(() => { - closeCreateModalAndCleanup() - // einen Tick warten, bis DOM frei ist - requestAnimationFrame(() => setRefetchKey(Date.now().toString())) - }, 800) // kürzer reicht idR, 800ms für Feedback - } catch (err: any) { - setStatus('error') - setMessage(err.message || 'Fehler beim Erstellen des Teams') - } - } + const result = await res.json() + if (!res.ok) throw new Error(result.message || 'Fehler beim Erstellen') - return ( -
- + setStatus('success') + setMessage(`Team "${result.team.name}" wurde erfolgreich erstellt!`) + setTeamname('') - { - setShowModal(false) - // Falls Benutzer per X schließt – auch dann cleanen + // Nach kurzer Bestätigung Modal schließen, aufräumen und optional Parent refreshen + setTimeout(() => { closeCreateModalAndCleanup() - }} - onSave={handleSubmit} - closeButtonTitle="Team erstellen" - > -
- + requestAnimationFrame(() => { + // Nur aufrufen, wenn vom Parent übergeben + setRefetchKey?.(Date.now().toString()) + }) + }, 800) + } catch (err: any) { + setStatus('error') + setMessage(err.message || 'Fehler beim Erstellen des Teams') + } + } - { - setTeamname(e.target.value) - setStatus('idle') - setMessage('') - }} - placeholder="Gebe einen Teamnamen ein..." - className={` - py-2.5 sm:py-3 px-4 block w-full rounded-lg sm:text-sm - dark:bg-neutral-900 dark:border-neutral-700 dark:text-neutral-400 dark:placeholder-neutral-500 dark:focus:ring-neutral-600 - ${status === 'error' - ? 'border-red-500 focus:border-red-500 focus:ring-red-500' - : status === 'success' - ? 'border-teal-500 focus:border-teal-500 focus:ring-teal-500' - : 'border-gray-300 focus:border-blue-500 focus:ring-blue-500'} - `} - required - name="teamname" - aria-describedby="teamname-feedback" - /> + return ( +
+ - {status !== 'idle' && ( -
- - {status === 'error' ? ( - <> - - - - - ) : ( - - )} - -
- )} + { + setShowModal(false) + closeCreateModalAndCleanup() + }} + onSave={handleSubmit} + closeButtonTitle="Team erstellen" + > +
+ - {message && ( -

- {message} -

- )} -
-
-
- ) -}) + { + setTeamname(e.target.value) + setStatus('idle') + setMessage('') + }} + placeholder="Gebe einen Teamnamen ein..." + className={` + py-2.5 sm:py-3 px-4 block w-full rounded-lg sm:text-sm + dark:bg-neutral-900 dark:border-neutral-700 dark:text-neutral-400 dark:placeholder-neutral-500 dark:focus:ring-neutral-600 + ${ + status === 'error' + ? 'border-red-500 focus:border-red-500 focus:ring-red-500' + : status === 'success' + ? 'border-teal-500 focus:border-teal-500 focus:ring-teal-500' + : 'border-gray-300 focus:border-blue-500 focus:ring-blue-500' + } + `} + required + name="teamname" + aria-describedby="teamname-feedback" + /> + + {status !== 'idle' && ( +
+ + {status === 'error' ? ( + <> + + + + + ) : ( + + )} + +
+ )} + + {message && ( +

+ {message} +

+ )} +
+
+
+ ) + } +) CreateTeamButton.displayName = 'CreateTeamButton' export default CreateTeamButton diff --git a/src/app/components/InvitePlayersModal.tsx b/src/app/components/InvitePlayersModal.tsx index 8947d1b..99ca609 100644 --- a/src/app/components/InvitePlayersModal.tsx +++ b/src/app/components/InvitePlayersModal.tsx @@ -1,6 +1,6 @@ 'use client' -import { useState, useEffect } from 'react' +import { useState, useEffect, useRef, useCallback } from 'react' import Modal from './Modal' import MiniCard from './MiniCard' import { useSession } from 'next-auth/react' @@ -30,10 +30,20 @@ export default function InvitePlayersModal({ show, onClose, onSuccess, team, dir const [isSuccess, setIsSuccess] = useState(false) const [sentCount, setSentCount] = useState(0) const [searchTerm, setSearchTerm] = useState('') - const usersPerPage = 9 + + // Dynamisch berechnete Items pro Seite + const [usersPerPage, setUsersPerPage] = useState(9) const [currentPage, setCurrentPage] = useState(1) const [invitedStatus, setInvitedStatus] = useState>({}) + // Refs für die Messung des verfügbaren Platzes + const descRef = useRef(null) + const selectedWrapRef = useRef(null) + const searchRef = useRef(null) + const successRef = useRef(null) + const gridRef = useRef(null) + const firstCardRef = useRef(null) + useEffect(() => { if (show) { fetchUsersNotInTeam() @@ -43,6 +53,22 @@ export default function InvitePlayersModal({ show, onClose, onSuccess, team, dir } }, [show]) + useEffect(() => { + if (!gridRef.current) return; + + const observer = new ResizeObserver(() => { + if (!gridRef.current) return; + const gridHeight = gridRef.current.clientHeight; + const cardHeight = gridRef.current.querySelector('div')?.clientHeight || 0; + const rows = cardHeight > 0 ? Math.floor(gridHeight / cardHeight) : 1; + const cols = window.innerWidth >= 640 ? 3 : 2; // sm:grid-cols-3 vs grid-cols-2 + setUsersPerPage(rows * cols); + }); + + observer.observe(gridRef.current); + return () => observer.disconnect(); + }, []); + const fetchUsersNotInTeam = async () => { try { setIsLoading(true) @@ -55,10 +81,8 @@ export default function InvitePlayersModal({ show, onClose, onSuccess, team, dir } const handleSelect = (steamId: string) => { - setSelectedIds((prev) => - prev.includes(steamId) - ? prev.filter((id) => id !== steamId) - : [...prev, steamId] + setSelectedIds(prev => + prev.includes(steamId) ? prev.filter(id => id !== steamId) : [...prev, steamId] ) } @@ -78,19 +102,14 @@ export default function InvitePlayersModal({ show, onClose, onSuccess, team, dir body: JSON.stringify(body), }) - // Versuch: partielle Resultate lesen let detail: any = null try { detail = await res.clone().json() } catch {} if (res.ok) { const okStatus: InviteStatus = directAdd ? 'added' : 'sent' - setInvitedStatus(prev => ({ - ...prev, - ...Object.fromEntries(ids.map(id => [id, okStatus])) - })) + setInvitedStatus(prev => ({ ...prev, ...Object.fromEntries(ids.map(id => [id, okStatus])) })) setSentCount(ids.length) } else if (detail?.results && Array.isArray(detail.results)) { - // erwartetes Schema: [{ steamId, ok }] let okCount = 0 const next: Record = {} for (const r of detail.results) { @@ -101,11 +120,7 @@ export default function InvitePlayersModal({ show, onClose, onSuccess, team, dir setInvitedStatus(prev => ({ ...prev, ...next })) setSentCount(okCount) } else { - // alles fehlgeschlagen - setInvitedStatus(prev => ({ - ...prev, - ...Object.fromEntries(ids.map(id => [id, 'failed' as InviteStatus])) - })) + setInvitedStatus(prev => ({ ...prev, ...Object.fromEntries(ids.map(id => [id, 'failed'])) })) setSentCount(0) } @@ -115,10 +130,7 @@ export default function InvitePlayersModal({ show, onClose, onSuccess, team, dir onSuccess() } catch (err) { console.error('Fehler beim Einladen:', err) - setInvitedStatus(prev => ({ - ...prev, - ...Object.fromEntries(selectedIds.map(id => [id, 'failed' as InviteStatus])) - })) + setInvitedStatus(prev => ({ ...prev, ...Object.fromEntries(selectedIds.map(id => [id, 'failed'])) })) setInvitedIds(selectedIds) setSentCount(0) setIsSuccess(true) @@ -129,38 +141,130 @@ export default function InvitePlayersModal({ show, onClose, onSuccess, team, dir if (isSuccess) { const timeout = setTimeout(() => { const modalEl = document.getElementById('invite-members-modal') - if (modalEl && window.HSOverlay?.close) { - window.HSOverlay.close(modalEl) + if (modalEl && (window as any).HSOverlay?.close) { + (window as any).HSOverlay.close(modalEl) } onClose() }, 2000) - return () => clearTimeout(timeout) } }, [isSuccess, onClose]) useEffect(() => { setCurrentPage(1) - }, [selectedIds, searchTerm]) + }, [searchTerm]) const filteredUsers = allUsers.filter(user => user.name?.toLowerCase().includes(searchTerm.toLowerCase()) ) + // Sortierung: ausgewählte nach vorne (nur für Anzeige der Selected-List) const sortedUsers = [...filteredUsers].sort((a, b) => { const aSelected = selectedIds.includes(a.steamId) ? -1 : 0 const bSelected = selectedIds.includes(b.steamId) ? -1 : 0 return aSelected - bSelected }) - const unselectedUsers = filteredUsers.filter((user) => + const unselectedUsers = filteredUsers.filter(user => !selectedIds.includes(user.steamId) && (!isSuccess || !invitedIds.includes(user.steamId)) ) - const totalPages = Math.ceil(unselectedUsers.length / usersPerPage) - const startIdx = (currentPage - 1) * usersPerPage - const paginatedUsers = unselectedUsers.slice(startIdx, startIdx + usersPerPage) + const totalPages = Math.ceil(unselectedUsers.length / Math.max(1, usersPerPage)) + const startIdx = (currentPage - 1) * Math.max(1, usersPerPage) + const paginatedUsers = unselectedUsers.slice(startIdx, startIdx + Math.max(1, usersPerPage)) + + // Seite einklemmen, wenn PerPage / Anzahl sich ändern + useEffect(() => { + if (totalPages === 0 && currentPage !== 1) setCurrentPage(1) + else if (currentPage > totalPages) setCurrentPage(totalPages || 1) + }, [totalPages, currentPage]) + + // ---- Dynamische Berechnung von usersPerPage (keine Scrollbars im Modal) ---- + const recalcUsersPerPage = useCallback(() => { + const gridEl = gridRef.current + if (!gridEl) return + + // Modal-Body ist der Parent des Grids + const bodyEl = gridEl.parentElement as HTMLElement | null + if (!bodyEl) return + + // bereits genutzte Höhe "oberhalb" des Grids + const outer = (el: HTMLElement | null) => { + if (!el) return 0 + const cs = getComputedStyle(el) + return el.offsetHeight + parseFloat(cs.marginTop || '0') + parseFloat(cs.marginBottom || '0') + } + + // Abstand des Grids selbst (z.B. mt-4) + const gridMT = parseFloat(getComputedStyle(gridEl).marginTop || '0') + + const usedAbove = + outer(descRef.current) + + outer(selectedWrapRef.current) + + outer(searchRef.current) + + outer(successRef.current) + + gridMT + + // Optional etwas Platz für Pagination reservieren (wenn sie sichtbar wäre) + const reserveForPagination = (!isLoading && !isSuccess && totalPages > 1) ? 48 : 0 + + const availableHeight = Math.max(0, bodyEl.clientHeight - usedAbove - reserveForPagination) + + // Ermittel Spalten und Zeilenabstand aus dem Grid + const csGrid = getComputedStyle(gridEl) + const cols = Math.max( + 1, + csGrid.gridTemplateColumns.split(' ').filter(Boolean).length + ) + const rowGap = parseFloat(csGrid.rowGap || '0') + + // Kartenhöhe messen: nimm die erste echte Karte, sonst Fallback + const cardEl = firstCardRef.current + let cardHeight = cardEl?.offsetHeight || 0 + if (!cardHeight) { + // vorsichtiger Fallback (angepasst an typische MiniCard) + cardHeight = 140 + } + + // rows * cardHeight + (rows - 1) * rowGap <= availableHeight + // => rows <= (availableHeight + rowGap) / (cardHeight + rowGap) + const rows = Math.max(1, Math.floor((availableHeight + rowGap) / (cardHeight + rowGap))) + const nextPerPage = Math.max(1, rows * cols) + + if (nextPerPage !== usersPerPage) { + setUsersPerPage(nextPerPage) + } + }, [isLoading, isSuccess, totalPages, usersPerPage]) + + // Recalc auf Resize/Content-Änderungen + useEffect(() => { + // Direkt versuchen + recalcUsersPerPage() + + const gridEl = gridRef.current + if (!gridEl) return + + const bodyEl = gridEl.parentElement as HTMLElement | null + const cardEl = firstCardRef.current + + const ro = new ResizeObserver(() => recalcUsersPerPage()) + ro.observe(gridEl) + if (bodyEl) ro.observe(bodyEl) + if (cardEl) ro.observe(cardEl) + + const onResize = () => recalcUsersPerPage() + window.addEventListener('resize', onResize) + + // bei Show/Hide leichter Delay, bis Layout stabil ist + const id = window.setTimeout(recalcUsersPerPage, 60) + + return () => { + window.clearTimeout(id) + ro.disconnect() + window.removeEventListener('resize', onResize) + } + }, [recalcUsersPerPage, show, filteredUsers.length, isSuccess]) return ( -

+

{directAdd ? 'Wähle Spieler aus, die du direkt zum Team hinzufügen möchtest:' : 'Wähle Spieler aus, die du in dein Team einladen möchtest:'} @@ -184,7 +289,7 @@ export default function InvitePlayersModal({ show, onClose, onSuccess, team, dir {/* Ausgewählte Benutzer anzeigen */} {selectedIds.length > 0 && ( -

+

Ausgewählte Spieler:

@@ -211,7 +316,7 @@ export default function InvitePlayersModal({ show, onClose, onSuccess, team, dir onSelect={handleSelect} draggable={false} currentUserSteamId={steamId!} - teamLeaderSteamId={team.leader} + teamLeaderSteamId={(team as any).leader?.steamId ?? (team as any).leader} hideActions={true} rank={user.premierRank} /> @@ -223,23 +328,29 @@ export default function InvitePlayersModal({ show, onClose, onSuccess, team, dir
)} - setSearchTerm(e.target.value)} - className="mt-2 w-full rounded border px-3 py-2 text-sm focus:outline-none focus:ring focus:ring-blue-400 dark:bg-neutral-800 dark:border-neutral-600 dark:text-neutral-100" - /> +
+ setSearchTerm(e.target.value)} + className="mt-2 w-full rounded border px-3 py-2 text-sm focus:outline-none focus:ring focus:ring-blue-400 dark:bg-neutral-800 dark:border-neutral-600 dark:text-neutral-100" + /> +
{isSuccess && ( -
+
{directAdd ? `${sentCount} Mitglied${sentCount === 1 ? '' : 'er'} hinzugefügt!` : `${sentCount} Einladung${sentCount === 1 ? '' : 'en'} versendet!`}
)} -
+ {/* Grid der MiniCards — Höhe/Anzahl wird dynamisch berechnet */} +
{isLoading ? ( ) : filteredUsers.length === 0 ? ( @@ -252,7 +363,7 @@ export default function InvitePlayersModal({ show, onClose, onSuccess, team, dir
) : ( - {!isSuccess && paginatedUsers.map((user) => ( + {!isSuccess && paginatedUsers.map((user, idx) => ( ))} - {isSuccess && invitedIds.map((id) => { + {isSuccess && invitedIds.map((id, idx) => { const user = allUsers.find((u) => u.steamId === id) if (!user) return null return ( @@ -288,6 +401,7 @@ export default function InvitePlayersModal({ show, onClose, onSuccess, team, dir animate={{ opacity: 1, y: 0 }} exit={{ opacity: 0, y: -10 }} transition={{ duration: 0.2 }} + ref={idx === 0 ? firstCardRef : undefined} > )}
+ + {/* Pagination */} + {!isLoading && !isSuccess && totalPages > 1 && ( +
+ { + const next = Math.max(1, Math.min(totalPages, p)) + setCurrentPage(next) + // nach Page-Wechsel neu kalkulieren (Layout kann „springen“) + setTimeout(() => recalcUsersPerPage(), 0) + }} + /> +
+ )} ) } diff --git a/src/app/components/MapVoteBanner.tsx b/src/app/components/MapVoteBanner.tsx index aca1c22..b6632fc 100644 --- a/src/app/components/MapVoteBanner.tsx +++ b/src/app/components/MapVoteBanner.tsx @@ -5,6 +5,7 @@ import { useRouter } from 'next/navigation' import { useSession } from 'next-auth/react' import { useSSEStore } from '@/app/lib/useSSEStore' import type { MapVoteState } from '../types/mapvote' +import { MATCH_EVENTS } from '@/app/lib/sseEvents' type Props = { match: any; initialNow: number } @@ -46,8 +47,13 @@ export default function MapVoteBanner({ match, initialNow }: Props) { // Live-Refresh via SSE useEffect(() => { - if (!lastEvent || lastEvent.type !== 'map-vote-updated') return - if (lastEvent.payload?.matchId !== match.id) return + if (!lastEvent) return + // ⬇️ reagiert auf alle match-bezogenen Events: vote-updated, admin-edit, reset, ready, lineup, ... + if (!MATCH_EVENTS.has(lastEvent.type)) return + + const matchId = lastEvent.payload?.matchId + if (matchId !== match.id) return + load() }, [lastEvent, match.id, load]) @@ -85,7 +91,7 @@ export default function MapVoteBanner({ match, initialNow }: Props) { 'relative overflow-hidden rounded-xl border bg-white/90 dark:bg-neutral-800/90 ' + 'dark:border-neutral-700 shadow-sm transition cursor-pointer focus:outline-none ' + (isOpen - ? 'ring-1 ring-blue-500/20 hover:ring-blue-500/30 hover:shadow-md' + ? 'ring-1 ring-green-500/15 hover:ring-green-500/25 hover:shadow-md' : 'ring-1 ring-neutral-500/10 hover:ring-neutral-500/20 hover:shadow-md') return ( @@ -101,7 +107,7 @@ export default function MapVoteBanner({ match, initialNow }: Props) {
-
+
@@ -133,7 +139,7 @@ export default function MapVoteBanner({ match, initialNow }: Props) { Voting abgeschlossen ) : isOpen ? ( - + {iCanAct ? 'Jetzt wählen' : 'Map-Vote offen'} ) : ( @@ -152,9 +158,9 @@ export default function MapVoteBanner({ match, initialNow }: Props) { .mapVoteGradient { background-image: repeating-linear-gradient( 90deg, - rgba(37, 99, 235, 0.20) 0%, - rgba(37, 99, 235, 0.05) 50%, - rgba(37, 99, 235, 0.20) 100% + rgba(16, 168, 54, 0.20) 0%, + rgba(16, 168, 54, 0.04) 50%, + rgba(16, 168, 54, 0.20) 100% ); background-size: 200% 100%; background-repeat: repeat-x; @@ -163,9 +169,9 @@ export default function MapVoteBanner({ match, initialNow }: Props) { :global(.dark) .mapVoteGradient { background-image: repeating-linear-gradient( 90deg, - rgba(37, 99, 235, 0.30) 0%, - rgba(37, 99, 235, 0.10) 50%, - rgba(37, 99, 235, 0.30) 100% + rgba(16, 168, 54, 0.28) 0%, + rgba(16, 168, 54, 0.08) 50%, + rgba(16, 168, 54, 0.28) 100% ); } @media (prefers-reduced-motion: reduce) { diff --git a/src/app/components/MapVotePanel.tsx b/src/app/components/MapVotePanel.tsx index c1d18c5..638c886 100644 --- a/src/app/components/MapVotePanel.tsx +++ b/src/app/components/MapVotePanel.tsx @@ -4,6 +4,7 @@ import { useEffect, useMemo, useState, useCallback, useRef } from 'react' import { useRouter } from 'next/navigation' import type React from 'react' +import { AnimatePresence, motion } from 'framer-motion' import { useSession } from 'next-auth/react' import { useSSEStore } from '@/app/lib/useSSEStore' import MapVoteProfileCard from './MapVoteProfileCard' @@ -13,6 +14,7 @@ import TeamPremierRankBadge from './TeamPremierRankBadge' import Button from './Button' import Image from 'next/image' import LoadingSpinner from './LoadingSpinner' +import { MATCH_EVENTS } from '@/app/lib/sseEvents' type Props = { match: Match } @@ -24,6 +26,7 @@ const COMPLETE_THRESHOLD = 1.0 export default function MapVotePanel({ match }: Props) { const { data: session } = useSession() + const mySteamId = session?.user?.steamId const { lastEvent } = useSSEStore() const router = useRouter() @@ -40,10 +43,12 @@ export default function MapVotePanel({ match }: Props) { // „Jetzt offen“-Trigger const [nowTs, setNowTs] = useState(() => Date.now()) + useEffect(() => { const t = setInterval(() => setNowTs(Date.now()), 1000) return () => clearInterval(t) }, []) + const isOpenFromMatch = nowTs >= opensAtTs // --- Rollen --- @@ -96,9 +101,11 @@ export default function MapVotePanel({ match }: Props) { // --- SSE: live nachladen --- useEffect(() => { if (!lastEvent) return - if (lastEvent.type !== 'map-vote-updated' && lastEvent.type !== 'map-vote-admin-edit') return + if (!MATCH_EVENTS.has(lastEvent.type)) return + const matchId = lastEvent.payload?.matchId if (matchId !== match.id) return + load() }, [lastEvent, match.id, load]) @@ -125,8 +132,6 @@ export default function MapVotePanel({ match }: Props) { (canActForTeamId(currentStep.teamId) || (isAdmin && adminEditMode)) ) - const mapPool = state?.mapPool ?? [] - // Map -> (action, teamId) wenn bereits entschieden const decisionByMap = useMemo(() => { const map = new Map() @@ -171,10 +176,10 @@ export default function MapVotePanel({ match }: Props) { // --- Admin-Edit global toggeln --- async function postAdminEdit(enabled: boolean) { - const r = await fetch(`/api/matches/${match.id}/mapvote/admin-edit`, { + const r = await fetch(`/api/matches/${match.id}/mapvote`, { method: 'POST', headers: { 'Content-Type': 'application/json' }, - body: JSON.stringify({ enabled }), + body: JSON.stringify({ adminEdit: enabled }), }) if (!r.ok) { const j = await r.json().catch(() => ({})) @@ -377,6 +382,33 @@ export default function MapVotePanel({ match }: Props) { ) }, [state?.mapPool, state?.mapVisuals]) + + let teamLeftKey: 'teamA' | 'teamB' = 'teamA' + let teamRightKey: 'teamA' | 'teamB' = 'teamB' + + // Prüfen, ob ich in playersB bin + if (mySteamId && playersB.some(p => p.user?.steamId === mySteamId)) { + teamLeftKey = 'teamB' + teamRightKey = 'teamA' + } + + let teamLeft = match[teamLeftKey] + let teamRight = match[teamRightKey] + let playersLeft = teamLeftKey === 'teamA' ? playersA : playersB + let playersRight = teamRightKey === 'teamA' ? playersA : playersB + let rankLeft = teamLeftKey === 'teamA' ? teamAPlayersForRank : teamBPlayersForRank + let rankRight = teamRightKey === 'teamA' ? teamAPlayersForRank : teamBPlayersForRank + + const leftIsActiveTurn = + !!currentStep?.teamId && + currentStep.teamId === (state?.teams?.[teamLeftKey]?.id ?? teamLeft?.id) && + !state?.locked + + const rightIsActiveTurn = + !!currentStep?.teamId && + currentStep.teamId === (state?.teams?.[teamRightKey]?.id ?? teamRight?.id) && + !state?.locked + // --- UI --- return (
@@ -411,7 +443,7 @@ export default function MapVotePanel({ match }: Props) { Modus: BO{match.bestOf ?? state?.bestOf ?? 3}
- {isAdmin && ( + {isAdmin && isOpen && ( <> {/* rechter Slot */} - {pickedByB ? ( + {pickedByRight ? ( {match.teamB?.name ) : (
@@ -778,27 +796,34 @@ export default function MapVotePanel({ match }: Props) { - {/* Rechte Spalte – Team B */} -
+ {/* Rechte Spalte */} +
{/* Teamkopf B */}
- +
-
{match.teamB?.name ?? 'Team B'}
+
{teamRight?.name ?? 'Team'}
{match.teamB?.name
- {/* Spieler B */} - {playersB.map((p: MatchPlayer) => ( + {/* Spieler */} + {playersRight.map((p: MatchPlayer) => ( router.push(`/profile/${p.user.steamId}`)} isLeader={ - (state?.teams?.teamB?.leader?.steamId ?? match.teamB?.leader?.steamId) === + (state?.teams?.[teamRightKey]?.leader?.steamId ?? teamRight?.leader?.steamId) === p.user.steamId } isActiveTurn={ !!currentStep?.teamId && - currentStep.teamId === (state?.teams?.teamB?.id ?? match.teamB?.id) && + currentStep.teamId === (state?.teams?.[teamRightKey]?.id ?? teamRight?.id) && !state.locked } /> @@ -819,6 +844,120 @@ export default function MapVotePanel({ match }: Props) {
)} + + {/* Footer */} + {state && isOpen && ( +
+

Gewählte Maps

+ + {(() => { + const bestOf = match.bestOf ?? state.bestOf ?? 3 + const cols = bestOf === 5 ? 5 : 3 + + // nur Picks + Decider in Anzeige-Reihenfolge + const chosenSteps = (state.steps ?? []).filter( + (s) => (s.action === 'pick' || s.action === 'decider') && s.map + ) + + // Team, das vor dem Decider zuletzt gebannt hat (Chooser) + const decIdx = (state.steps ?? []).findIndex((s) => s.action === 'decider') + let chooserTeamId: string | null = null + if (decIdx >= 0) { + for (let i = decIdx - 1; i >= 0; i--) { + const s = state.steps![i] + if (s.action === 'ban' && s.teamId) { chooserTeamId = s.teamId; break } + } + } + + const fmt = (k: string) => state?.mapVisuals?.[k]?.label ?? k + const teamLeftLogo = getTeamLogo(teamLeft?.logo) + const teamRightLogo = getTeamLogo(teamRight?.logo) + + return ( + +
+ {Array.from({ length: cols }).map((_, idx) => { + const step = chosenSteps[idx] + const action = step?.action as ('pick' | 'decider') | undefined + const mapKey = step?.map + const label = mapKey ? fmt(mapKey) : '?' + const bg = mapKey + ? (state.mapVisuals?.[mapKey]?.bg ?? `/assets/img/maps/${mapKey}/1.jpg`) + : null + + // Logo neben der Pill + const pickTeamId = + action === 'pick' ? (step?.teamId ?? null) + : action === 'decider' ? chooserTeamId + : null + + const pickedByLeft = pickTeamId && pickTeamId === teamLeft?.id + const pickedByRight = pickTeamId && pickTeamId === teamRight?.id + const sideLogo = + pickedByLeft ? teamLeftLogo + : pickedByRight ? teamRightLogo + : null + + const frameClasses = + action === 'pick' + ? 'ring-2 ring-green-500' + : action === 'decider' + ? 'ring-2 ring-blue-500' + : 'ring-1 ring-neutral-300 dark:ring-neutral-700' + + return ( + + {bg && ( + {label} + )} +
+ +
+ {/* etwas kleinere Typo */} + + {label} + + + {sideLogo && ( + Team + )} +
+ + ) + })} +
+ + ) + })()} +
+ )} )}
diff --git a/src/app/components/MapVoteProfileCard.tsx b/src/app/components/MapVoteProfileCard.tsx index b121656..b73ef5b 100644 --- a/src/app/components/MapVoteProfileCard.tsx +++ b/src/app/components/MapVoteProfileCard.tsx @@ -1,10 +1,13 @@ +// src/app/components/MapVoteProfileCard.tsx 'use client' import PremierRankBadge from './PremierRankBadge' +import UserAvatarWithStatus from './UserAvatarWithStatus' type Side = 'A' | 'B' type Props = { + steamId: string side: Side name: string avatar?: string | null @@ -16,6 +19,7 @@ type Props = { } export default function MapVoteProfileCard({ + steamId, side, name, avatar, @@ -33,58 +37,34 @@ export default function MapVoteProfileCard({ className={[ 'group relative w-full rounded-xl shadow-md', isRight ? 'ml-auto text-right' : 'mr-auto text-left', - ] - .filter(Boolean) - .join(' ')} + ].join(' ')} title={isLeader ? `${name} (Leader)` : name} >
- {/* Avatar */} + {/* Avatar mit Live-Status & Leader-Krone */}
- {name} - {isLeader && ( - - - - - - )}
- {/* Name + Status */} + {/* Name + Status-Text */}
diff --git a/src/app/components/MatchReadyOverlay.tsx b/src/app/components/MatchReadyOverlay.tsx new file mode 100644 index 0000000..d9e997b --- /dev/null +++ b/src/app/components/MatchReadyOverlay.tsx @@ -0,0 +1,284 @@ +'use client' + +import { useEffect, useMemo, useRef, useState } from 'react' +import { sound } from '@/app/lib/soundManager' + +type Props = { + open: boolean + mapLabel: string + mapBg: string + onAccept: () => void | Promise + deadlineAt?: number + onTimeout?: () => void + forceGif?: boolean +} + +function fmt(ms: number) { + const sec = Math.max(0, Math.ceil(ms / 1000)) + const m = Math.floor(sec / 60) + const s = sec % 60 + return `${m}:${String(s).padStart(2, '0')}` +} + +export default function MatchReadyOverlay({ + open, + mapLabel, + mapBg, + onAccept, + deadlineAt, + onTimeout, + forceGif, +}: Props) { + const [now, setNow] = useState(() => Date.now()) + const [startedAt] = useState(() => Date.now()) + const fallbackDeadline = useMemo(() => startedAt + 30_000, [startedAt]) + const effectiveDeadline = deadlineAt ?? fallbackDeadline + const rest = Math.max(0, effectiveDeadline - now) + + // ----- simple mount animation flags ----- + const [fadeIn, setFadeIn] = useState(false) + useEffect(() => { + if (!open) { setFadeIn(false); return } + const id = requestAnimationFrame(() => setFadeIn(true)) + return () => cancelAnimationFrame(id) + }, [open]) + + // ----- motion layer (video/gif) ----- + const prefersReducedMotion = useMemo( + () => typeof window !== 'undefined' && window.matchMedia?.('(prefers-reduced-motion: reduce)').matches, + [] + ) + const videoRef = useRef(null) + const [useGif, setUseGif] = useState(!!forceGif || !!prefersReducedMotion) + + useEffect(() => { + if (!open) return + if (forceGif || prefersReducedMotion) { setUseGif(true); return } + const tryPlay = async () => { + const v = videoRef.current + if (!v) return + try { + await v.play() + setUseGif(false) + } catch { + setUseGif(true) + const once = async () => { + try { await v.play(); setUseGif(false) } catch {} + window.removeEventListener('pointerdown', once) + window.removeEventListener('keydown', once) + } + window.addEventListener('pointerdown', once, { once: true }) + window.addEventListener('keydown', once, { once: true }) + } + } + const id = setTimeout(tryPlay, 0) + return () => clearTimeout(id) + }, [open, forceGif, prefersReducedMotion]) + + useEffect(() => { + if (!open) { + const v = videoRef.current + if (v) { + try { v.pause() } catch {} + v.removeAttribute('src') + while (v.firstChild) v.removeChild(v.firstChild) + } + } + }, [open]) + + // ----- AUDIO ----- + const beepsRef = useRef | null>(null) + const audioStartedRef = useRef(false) + + const stopBeeps = () => { + if (beepsRef.current) { + clearInterval(beepsRef.current) + beepsRef.current = null + } + } + + // Versuche den AudioContext zu entsperren – robust gegen unterschiedliche soundManager-Implementationen + const ensureAudioUnlocked = async () => { + try { + // bevorzugt eigene API des soundManagers + if (typeof (sound as any).ensureUnlocked === 'function') { + await (sound as any).ensureUnlocked() + return true + } + if (typeof (sound as any).unlock === 'function') { + await (sound as any).unlock() + return true + } + // generischer Fallback + const ctx = (sound as any).ctx || (sound as any).audioContext + if (ctx && typeof ctx.resume === 'function' && ctx.state !== 'running') { + await ctx.resume() + } + return !ctx || ctx.state === 'running' + } catch { + return false + } + } + + // Beeps starten (1x ready + Intervall) + const startBeeps = () => { + try { sound.play('ready') } catch {} + stopBeeps() + beepsRef.current = setInterval(() => { + try { sound.play('beep') } catch {} + }, 1000) + } + + useEffect(() => { + if (!open) { + stopBeeps() + audioStartedRef.current = false + return + } + if (audioStartedRef.current) return + + let cleanupListener = () => {} + + ;(async () => { + const ok = await ensureAudioUnlocked() + if (ok) { + audioStartedRef.current = true + startBeeps() + return + } + // Fallback: auf erste Geste warten und dann starten + const onFirstGesture = async () => { + const ok2 = await ensureAudioUnlocked() + if (ok2) { + audioStartedRef.current = true + startBeeps() + } + window.removeEventListener('pointerdown', onFirstGesture) + window.removeEventListener('keydown', onFirstGesture) + } + window.addEventListener('pointerdown', onFirstGesture, { once: true }) + window.addEventListener('keydown', onFirstGesture, { once: true }) + cleanupListener = () => { + window.removeEventListener('pointerdown', onFirstGesture) + window.removeEventListener('keydown', onFirstGesture) + } + })() + + return () => { cleanupListener(); stopBeeps() } + }, [open]) + + // ----- countdown / timeout ----- + const rafRef = useRef(null) + useEffect(() => { + if (!open) return + const step = () => { + const t = Date.now() + setNow(t) + if (effectiveDeadline - t <= 0) { + stopBeeps() + onTimeout?.() + return + } + rafRef.current = requestAnimationFrame(step) + } + rafRef.current = requestAnimationFrame(step) + return () => { if (rafRef.current) cancelAnimationFrame(rafRef.current) } + }, [open, effectiveDeadline, onTimeout]) + + if (!open) return null + + return ( +
+ {/* Backdrop mit Fade-In */} +
+ + {/* Content-Frame mit kleinem Scale/Fade */} +
+ {/* Map im Frame */} + {mapLabel} + + {/* Deko-Layer: Video oder GIF */} + {useGif ? ( +
+ +
+
+ ) : ( + + )} + + {/* Inhalt */} +
+
+ IHR SPIEL IST BEREIT! + +
+ +
+ + + {mapLabel} + +
+ + + +
+ {fmt(rest)} +
+
+
+
+ ) +} diff --git a/src/app/components/MiniCard.tsx b/src/app/components/MiniCard.tsx index bd9227b..b616829 100644 --- a/src/app/components/MiniCard.tsx +++ b/src/app/components/MiniCard.tsx @@ -5,6 +5,7 @@ import Button from './Button' import Image from 'next/image' import PremierRankBadge from './PremierRankBadge' import { motion, AnimatePresence } from 'framer-motion' +import UserAvatarWithStatus from './UserAvatarWithStatus' type InviteStatus = 'sent' | 'failed' | 'added' | 'pending' @@ -142,22 +143,14 @@ export default function MiniCard({
- {title} - {isLeader && ( -
- - - -
- )}
diff --git a/src/app/components/Modal.tsx b/src/app/components/Modal.tsx index 2403eaf..a1b7f87 100644 --- a/src/app/components/Modal.tsx +++ b/src/app/components/Modal.tsx @@ -22,6 +22,8 @@ type ModalProps = { closeButtonTitle?: string disableSave?: boolean maxWidth?: Width + /** Wenn false, wird der Body nicht gescrollt (wir paginieren stattdessen) */ + scrollBody?: boolean } export default function Modal({ @@ -36,15 +38,13 @@ export default function Modal({ closeButtonTitle = 'Speichern', disableSave, maxWidth = 'sm:max-w-lg', + scrollBody = true, }: ModalProps) { - /* ───────── Overlay-Lifecycle ───────── */ useEffect(() => { const modalEl = document.getElementById(id) const hs = (window as any).HSOverlay if (!modalEl || !hs) return - /* ► Collection kann undefined oder ein Objekt sein. - ► Wir sichern uns ab und behandeln nur echte Arrays. */ const getCollection = (): any[] => Array.isArray(hs.collection) ? hs.collection : [] @@ -69,7 +69,6 @@ export default function Modal({ destroyIfExists() } } catch (err) { - // eslint-disable-next-line no-console console.error('[Modal] HSOverlay Fehler:', err) } @@ -79,7 +78,6 @@ export default function Modal({ } }, [show, id, onClose]) - /* ───────── Render ───────── */ return (
{/* Dialog */} -
+ {/* Panel */} +
-
- {/* Header */} + {/* Header (fixe Höhe) */}

{title} @@ -133,10 +143,17 @@ export default function Modal({ )}

- {/* Body */} -
{children}
+ {/* Body -> nimmt den restlichen Platz ein */} +
+ {children} +
- {/* Footer */} + {/* Footer (fixe Höhe) */}
{!hideCloseButton && ( +
+ )} +
) } diff --git a/src/app/components/profile/[steamId]/stats/UserProfile.tsx b/src/app/components/profile/[steamId]/stats/UserProfile.tsx index 8ab3a87..3f4d1e2 100644 --- a/src/app/components/profile/[steamId]/stats/UserProfile.tsx +++ b/src/app/components/profile/[steamId]/stats/UserProfile.tsx @@ -84,12 +84,14 @@ export default function UserProfile({ stats }: MatchStatsProps) { {/* ► Allstar-Clips des aktuellen Users -------------------------- */} + {/* {steamId && (

Highlights

)} + */}
{/* Breite Diagramme */} diff --git a/src/app/dashboard/page.tsx b/src/app/dashboard/page.tsx index 5dd220a..8775ffc 100644 --- a/src/app/dashboard/page.tsx +++ b/src/app/dashboard/page.tsx @@ -39,7 +39,7 @@ export default function Dashboard() { useEffect(() => { const fetchTeams = async () => { try { - const res = await fetch('/api/team/list') + const res = await fetch('/api/teams') const data = await res.json() setTeams(data.teams.map((t: { teamname: string }) => t.teamname)) } catch (error) { diff --git a/src/app/globals.css b/src/app/globals.css index 99375bf..e2eaca8 100644 --- a/src/app/globals.css +++ b/src/app/globals.css @@ -16,11 +16,6 @@ 100% { transform: rotate(0deg); } } -.animate-shake { - animation: shake 0.4s ease-in-out; -} - - /* Adds pointer cursor to buttons */ @layer base { button:not(:disabled), @@ -32,10 +27,6 @@ /* Defaults hover styles on all devices */ @custom-variant hover (&:hover); -:root { - --background: #ffffff; - --foreground: #171717; -} @theme inline { --color-background: var(--background); @@ -44,25 +35,32 @@ --font-mono: var(--font-geist-mono); } -@media (prefers-color-scheme: dark) { - :root { - --background: #0a0a0a; - --foreground: #ededed; - } -} - @font-face { font-family: 'Roboto-Regular'; src: url('/assets/fonts/Roboto-Regular.ttf') format('truetype'); font-style: normal; } -body { +:root { + --background: #ffffff; + --foreground: #171717; +} + +html, body { + min-height: 100%; background: var(--background); - color: var(--foreground); font-family: ui-sans-serif,-apple-system,system-ui,Segoe UI,Helvetica,Apple Color Emoji,Arial,sans-serif,Segoe UI Emoji,Segoe UI Symbol; } +.dark { + --background: #0a0a0a; + --foreground: #ededed; +} + +.animate-shake { + animation: shake 0.4s ease-in-out; +} + .premier-rank-wrapper { display: flex; align-items: center; @@ -96,3 +94,34 @@ body { transform: skewX(-5deg); font-family: 'Roboto-Regular', Helvetica, sans-serif; } + +/* --- Tabelle/Load-More Integration ohne extra Props (nutzt :has) --- */ + +/* Standard: Tabellen-Shell hat volle Rundung */ +.matches-card .table-shell { + border-radius: 0.75rem; /* = rounded-xl */ +} + +.matches-card:has(.load-more) .table-shell { + border-bottom-left-radius: 0; + border-bottom-right-radius: 0; +} + +.matches-card:has(.load-more) .table-divider { + display: block; +} + +.matches-card:not(:has(.load-more)) tbody > tr:last-child > td:first-child { + overflow: hidden; +} +.matches-card:not(:has(.load-more)) tbody > tr:last-child > td:last-child { + overflow: hidden; +} + + +@media (prefers-color-scheme: dark) { + :root { + --background: #0a0a0a; + --foreground: #ededed; + } +} diff --git a/src/app/layout.tsx b/src/app/layout.tsx index 0ad0ff2..999feeb 100644 --- a/src/app/layout.tsx +++ b/src/app/layout.tsx @@ -1,3 +1,5 @@ +// /src/app/layout.tsx + import type { Metadata } from "next"; import { Geist, Geist_Mono } from "next/font/google"; import "./globals.css"; @@ -9,6 +11,9 @@ import Script from "next/script"; import NotificationCenter from './components/NotificationCenter' import Navbar from "./components/Navbar"; import SSEHandler from "./lib/SSEHandler"; +import UserActivityTracker from "./components/UserActivityTracker"; +import AudioPrimer from "./components/AudioPrimer"; +import ReadyOverlayHost from "./components/ReadyOverlayHost"; const geistSans = Geist({ variable: "--font-geist-sans", @@ -41,6 +46,9 @@ export default function RootLayout({ > + + + {/* Sidebar und Content direkt nebeneinander */} {children} diff --git a/src/app/lib/mapOptions.ts b/src/app/lib/mapOptions.ts index 402adf1..bbd29b9 100644 --- a/src/app/lib/mapOptions.ts +++ b/src/app/lib/mapOptions.ts @@ -2,6 +2,7 @@ export type MapOption = { key: string label: string + active: boolean images: string[] } @@ -9,65 +10,155 @@ export const MAP_OPTIONS: MapOption[] = [ { key: 'de_train', label: 'Train', + active: true, images: [ - '/assets/img/maps/de_train/1.jpg', - '/assets/img/maps/de_train/2.jpg', + '/assets/img/maps/de_train/1.webp', + '/assets/img/maps/de_train/2.webp', + '/assets/img/maps/de_train/3.webp', + '/assets/img/maps/de_train/4.webp', + '/assets/img/maps/de_train/5.webp', + '/assets/img/maps/de_train/6.webp', ], }, { key: 'de_dust2', label: 'Dust 2', + active: true, images: [ - '/assets/img/maps/de_dust2/1.jpg', - '/assets/img/maps/de_dust2/2.jpg', + '/assets/img/maps/de_dust2/1.webp', + '/assets/img/maps/de_dust2/2.webp', + '/assets/img/maps/de_dust2/3.webp', + '/assets/img/maps/de_dust2/4.webp', ], }, { key: 'de_mirage', label: 'Mirage', + active: true, images: [ - '/assets/img/maps/de_mirage/1.jpg', - '/assets/img/maps/de_mirage/2.jpg', + '/assets/img/maps/de_mirage/1.webp', + '/assets/img/maps/de_mirage/2.webp', + '/assets/img/maps/de_mirage/3.webp', + '/assets/img/maps/de_mirage/4.webp', + '/assets/img/maps/de_mirage/5.webp', + '/assets/img/maps/de_mirage/6.webp', ], }, { key: 'de_nuke', label: 'Nuke', + active: true, images: [ - '/assets/img/maps/de_nuke/1.jpg', - '/assets/img/maps/de_nuke/2.jpg', + '/assets/img/maps/de_nuke/1.webp', + '/assets/img/maps/de_nuke/2.webp', + '/assets/img/maps/de_nuke/3.webp', + '/assets/img/maps/de_nuke/4.webp', + '/assets/img/maps/de_nuke/5.webp', + '/assets/img/maps/de_nuke/6.webp', ], }, { key: 'de_ancient', label: 'Ancient', + active: true, images: [ - '/assets/img/maps/de_ancient/1.jpg', - '/assets/img/maps/de_ancient/2.jpg', + '/assets/img/maps/de_ancient/1.webp', + '/assets/img/maps/de_ancient/2.webp', + '/assets/img/maps/de_ancient/3.webp', + '/assets/img/maps/de_ancient/4.webp', + '/assets/img/maps/de_ancient/5.webp', + '/assets/img/maps/de_ancient/6.webp', ], }, { key: 'de_inferno', label: 'Inferno', + active: true, images: [ - '/assets/img/maps/de_inferno/1.jpg', - '/assets/img/maps/de_inferno/2.jpg', + '/assets/img/maps/de_inferno/1.webp', + '/assets/img/maps/de_inferno/2.webp', + '/assets/img/maps/de_inferno/3.webp', + '/assets/img/maps/de_inferno/4.webp', + '/assets/img/maps/de_inferno/5.webp', + '/assets/img/maps/de_inferno/6.webp', ], }, { key: 'de_overpass', label: 'Overpass', + active: true, images: [ - '/assets/img/maps/de_overpass/1.jpg', - '/assets/img/maps/de_overpass/2.jpg', + '/assets/img/maps/de_overpass/1.webp', + '/assets/img/maps/de_overpass/2.webp', + '/assets/img/maps/de_overpass/3.webp', + '/assets/img/maps/de_overpass/4.webp', + '/assets/img/maps/de_overpass/5.webp', + '/assets/img/maps/de_overpass/6.webp', + '/assets/img/maps/de_overpass/7.webp', + '/assets/img/maps/de_overpass/8.webp', + ], + }, + { + key: 'de_anubis', + label: 'Anubis', + active: false, + images: [ + '/assets/img/maps/de_anubis/1.webp', + '/assets/img/maps/de_anubis/2.webp', + '/assets/img/maps/de_anubis/3.webp', + '/assets/img/maps/de_anubis/4.webp', + '/assets/img/maps/de_anubis/5.webp', + '/assets/img/maps/de_anubis/6.webp', + ], + }, + { + key: 'de_grail', + label: 'Grail', + active: false, + images: [ + '/assets/img/maps/de_grail/1.webp', + '/assets/img/maps/de_grail/2.webp', + '/assets/img/maps/de_grail/3.webp', + '/assets/img/maps/de_grail/4.webp', + '/assets/img/maps/de_grail/5.webp', + '/assets/img/maps/de_grail/6.webp', + ], + }, + { + key: 'de_jura', + label: 'Jura', + active: false, + images: [ + '/assets/img/maps/de_jura/1.webp', + '/assets/img/maps/de_jura/2.webp', + '/assets/img/maps/de_jura/3.webp', + '/assets/img/maps/de_jura/4.webp', + '/assets/img/maps/de_jura/5.webp', + '/assets/img/maps/de_jura/6.webp', + '/assets/img/maps/de_jura/7.webp', + '/assets/img/maps/de_jura/8.webp', + ], + }, + { + key: 'de_vertigo', + label: 'Vertigo', + active: false, + images: [ + '/assets/img/maps/de_vertigo/1.webp', + '/assets/img/maps/de_vertigo/2.webp', + '/assets/img/maps/de_vertigo/3.webp', + '/assets/img/maps/de_vertigo/4.webp', + '/assets/img/maps/de_vertigo/5.webp', + '/assets/img/maps/de_vertigo/6.webp', ], }, { key: 'lobby_mapvote', label: 'Pick/Ban', + active: true, images: [ - '/assets/img/maps/lobby_mapvote/1.jpg', - '/assets/img/maps/lobby_mapvote/2.jpg', + '/assets/img/maps/lobby_mapvote/1.webp', + '/assets/img/maps/lobby_mapvote/2.webp', ], }, ] diff --git a/src/app/lib/signOutWithStatus.ts b/src/app/lib/signOutWithStatus.ts new file mode 100644 index 0000000..de7c16b --- /dev/null +++ b/src/app/lib/signOutWithStatus.ts @@ -0,0 +1,13 @@ +// src/app/lib/signOutWithStatus.ts +'use client' + +import { signOut } from 'next-auth/react' + +export async function signOutWithStatus() { + try { + await fetch('/api/user/offline', { method: 'POST' }) + } catch (err) { + console.error('[signOutWithStatus] konnte OFFLINE nicht setzen:', err) + } + return signOut({ callbackUrl: '/' }) +} diff --git a/src/app/lib/soundManager.ts b/src/app/lib/soundManager.ts new file mode 100644 index 0000000..f92a988 --- /dev/null +++ b/src/app/lib/soundManager.ts @@ -0,0 +1,40 @@ +// 'use client' +class SoundManager { + private ctx: AudioContext | null = null; + private buffers = new Map(); + private primed = false; + + isPrimed() { return this.primed && this.ctx?.state === 'running'; } + + async prime() { + if (!this.ctx) this.ctx = new (window.AudioContext || (window as any).webkitAudioContext)(); + try { + await this.ctx.resume(); + this.primed = this.ctx.state === 'running'; + } catch { + this.primed = false; + } + } + + async load(name: string, url: string) { + if (!this.ctx) return; + const res = await fetch(url); + const arr = await res.arrayBuffer(); + const buf = await new Promise((resolve, reject) => + this.ctx!.decodeAudioData(arr, resolve, reject) + ); + this.buffers.set(name, buf); + } + + async play(name: string) { + if (!this.isPrimed()) throw new Error('Audio not primed'); + const buf = this.buffers.get(name); + if (!buf) throw new Error(`buffer "${name}" missing`); + const src = this.ctx!.createBufferSource(); + src.buffer = buf; + src.connect(this.ctx!.destination); + src.start(0); + } +} + +export const sound = new SoundManager(); diff --git a/src/app/lib/sseEvents.ts b/src/app/lib/sseEvents.ts index 4a53dcb..d853f3c 100644 --- a/src/app/lib/sseEvents.ts +++ b/src/app/lib/sseEvents.ts @@ -1,6 +1,9 @@ // sseEvents.ts + export const SSE_EVENT_TYPES = [ // Kanonisch + 'self-updated', + 'team-created', 'team-updated', 'team-leader-changed', 'team-leader-self', @@ -26,6 +29,9 @@ export const SSE_EVENT_TYPES = [ 'match-deleted', 'match-updated', 'match-lineup-updated', + 'user-status-updated', + 'match-ready', + 'map-vote-reset', ] as const; export type SSEEventType = typeof SSE_EVENT_TYPES[number]; @@ -35,8 +41,16 @@ export function isSseEventType(x: unknown): x is SSEEventType { return typeof x === 'string' && (SSE_EVENT_TYPES as readonly string[]).includes(x as any); } +/** kleine Helper-Funktion für typsichere Sets */ +function makeEventSet( + arr: A +): ReadonlySet { + return new Set(arr) as ReadonlySet; +} + /** Sinnvolle Gruppen */ -export const TEAM_EVENTS: ReadonlySet = new Set([ +export const TEAM_EVENTS = makeEventSet([ + 'team-created', 'team-updated', 'team-leader-changed', 'team-renamed', @@ -44,23 +58,25 @@ export const TEAM_EVENTS: ReadonlySet = new Set([ 'team-member-joined', 'team-member-left', 'team-member-kicked', -]); +] as const); -export const INVITE_EVENTS: ReadonlySet = new Set([ +export const INVITE_EVENTS = makeEventSet([ 'team-invite', 'team-join-request', 'team-invite-revoked', -]); +] as const); -export const SELF_EVENTS: ReadonlySet = new Set([ +export const SELF_EVENTS = makeEventSet([ + 'self-updated', + 'team-created', 'team-kick-self', 'team-left-self', 'user-team-cleared', 'team-leader-self', -]); +] as const); -// ➕ neu: Match-bezogene Events als Gruppe -export const MATCH_EVENTS: ReadonlySet = new Set([ +// ➕ Match-bezogene Events als Gruppe +export const MATCH_EVENTS = makeEventSet([ 'match-created', 'matches-updated', 'match-deleted', @@ -68,10 +84,12 @@ export const MATCH_EVENTS: ReadonlySet = new Set([ 'match-updated', 'map-vote-updated', 'map-vote-admin-edit', -]); + 'match-ready', + 'map-vote-reset', +] as const); -// Event-Typen, die das NotificationCenter betreffen -export const NOTIFICATION_EVENTS: ReadonlySet = new Set([ +// Events, die das NotificationCenter betreffen +export const NOTIFICATION_EVENTS = makeEventSet([ 'notification', 'invitation', 'team-invite', @@ -80,7 +98,7 @@ export const NOTIFICATION_EVENTS: ReadonlySet = new Set([ 'team-leader-changed', 'team-leader-self', 'expired-sharecode', -]); +] as const); /** Nur noch: akzeptiere kanonische Typen, sonst null */ export function normalizeEventType(incoming: string): SSEEventType | null { diff --git a/src/app/lib/useReadyOverlayStore.ts b/src/app/lib/useReadyOverlayStore.ts new file mode 100644 index 0000000..18fd278 --- /dev/null +++ b/src/app/lib/useReadyOverlayStore.ts @@ -0,0 +1,38 @@ +'use client' + +import { create } from 'zustand' + +type ReadyOverlayData = { + matchId: string + mapLabel: string + mapBg: string +} + +type State = { + open: boolean + data: ReadyOverlayData | null + showAt?: number | null // für 3s Delay + showWithDelay: (data: ReadyOverlayData, delayMs: number) => void + hide: () => void +} + +export const useReadyOverlayStore = create((set) => ({ + open: false, + data: null, + showAt: null, + showWithDelay: (data, delayMs) => { + const showAt = Date.now() + Math.max(0, delayMs) + set({ data, showAt }) + // kleiner Ticker um nach delayMs zu öffnen (ohne extra setTimeout-Leak) + const step = () => { + const t = Date.now() + if (t >= showAt) { + set({ open: true, showAt: null }) + } else { + requestAnimationFrame(step) + } + } + requestAnimationFrame(step) + }, + hide: () => set({ open: false, data: null, showAt: null }), +})) diff --git a/src/app/lib/useSSEStore.ts b/src/app/lib/useSSEStore.ts index aca01a1..2bc1fd0 100644 --- a/src/app/lib/useSSEStore.ts +++ b/src/app/lib/useSSEStore.ts @@ -1,11 +1,9 @@ -// useSSEStore.ts 'use client'; import { create } from 'zustand'; import { SSE_EVENT_TYPES, SSEEventType, - isSseEventType, normalizeEventType, } from '@/app/lib/sseEvents'; @@ -26,6 +24,7 @@ type SSEState = { export const useSSEStore = create((set, get) => { let reconnectTimeout: ReturnType | null = null; + let lastPresenceSent: 'online' | 'offline' | null = null; const clearReconnect = () => { if (reconnectTimeout) { @@ -34,7 +33,29 @@ export const useSSEStore = create((set, get) => { } }; + // ---- kleine Helper zum robusten Senden (Beacon + Fallback) ---- + const sendPresence = (kind: 'online' | 'offline') => { + // debouncen, um Spam zu vermeiden + if (lastPresenceSent === kind) return; + lastPresenceSent = kind; + + const path = kind === 'online' ? '/api/user/activity' : '/api/user/offline'; + const url = new URL(path, location.href).toString(); + const blob = new Blob([JSON.stringify({ t: Date.now() })], { type: 'application/json' }); + + try { + if (navigator.sendBeacon(url, blob)) return; + } catch { + // ignore + } + // Fallback – keepalive lässt Request beim Unload zu Ende laufen + fetch(url, { method: 'POST', keepalive: true, headers: { 'Content-Type': 'application/json' }, body: JSON.stringify({ t: Date.now() }) }) + .catch(() => {}); + }; + const disconnect = () => { + // beim aktiven Disconnect auch offline melden + sendPresence('offline'); try { get().source?.close(); } catch {} clearReconnect(); set({ source: null, isConnected: false, steamId: null }); @@ -55,27 +76,20 @@ export const useSSEStore = create((set, get) => { const pushEvent = (rawType: string, data: any) => { if (data?.type === 'heartbeat') return; - - // Kanonisieren - const canonical = normalizeEventType(rawType, data, get().steamId); + const canonical = normalizeEventType(rawType); if (!canonical) return; - set({ lastEvent: { type: canonical, payload: data, ts: Date.now() } }); }; - // Named Events (nur kanonische registrieren; Legacy kommt über onmessage oder wird - // vom Server ggf. trotzdem als named geschickt → wir normalisieren in pushEvent) + // Named Events for (const type of SSE_EVENT_TYPES) { source.addEventListener(type, (ev) => { - try { - pushEvent(type, JSON.parse((ev as MessageEvent).data)); - } catch (e) { - console.error(`[SSE] parse ${type}:`, e); - } + try { pushEvent(type, JSON.parse((ev as MessageEvent).data)); } + catch (e) { console.error(`[SSE] parse ${type}:`, e); } }); } - // Fallback: Events ohne "event:"-Header → onmessage + // Fallback: onmessage source.onmessage = (ev) => { try { const data = JSON.parse(ev.data); @@ -87,8 +101,11 @@ export const useSSEStore = create((set, get) => { } }; + // Wichtig: bei Fehler → offline markieren und Reconnect planen source.onerror = () => { console.warn('[SSE] Fehler, reconnect…'); + // Offline melden, *bevor* wir die Quelle schließen + sendPresence('offline'); try { source.close(); } catch {} set({ source: null, isConnected: false }); clearReconnect(); @@ -98,9 +115,13 @@ export const useSSEStore = create((set, get) => { }, 1500 + Math.floor(Math.random() * 500)); }; - source.onopen = () => set({ source, isConnected: true, steamId }); + // Bei erfolgreichem Open → online markieren + source.onopen = () => { + set({ source, isConnected: true, steamId }); + sendPresence('online'); + }; - // sofort setzen, onopen kommt ggf. später + // sofort setzen; onopen kommt ggf. später set({ source, steamId }); }; diff --git a/src/app/profile/[steamId]/matches/page.tsx b/src/app/profile/[steamId]/matches/page.tsx index a7af4eb..501487d 100644 --- a/src/app/profile/[steamId]/matches/page.tsx +++ b/src/app/profile/[steamId]/matches/page.tsx @@ -4,8 +4,6 @@ import UserMatchesList from '@/app/components/profile/[steamId]/matches/UserMatc export default function MatchesPage({ params }: { params: { steamId: string } }) { return ( - - - + ) } diff --git a/src/app/team/[teamId]/page.tsx b/src/app/team/[teamId]/page.tsx new file mode 100644 index 0000000..98a47b1 --- /dev/null +++ b/src/app/team/[teamId]/page.tsx @@ -0,0 +1,172 @@ +// src/app/team/[teamId]/page.tsx +'use client' + +import { useEffect, useState } from 'react' +import { useRouter } from 'next/navigation' +import LoadingSpinner from '@/app/components/LoadingSpinner' +import Card from '@/app/components/Card' + +type Player = { + steamId: string + name: string + avatar: string + location?: string + premierRank?: number + isAdmin?: boolean +} + +type TeamResponse = { + id: string + name: string + logo?: string | null + leader?: Player | null + activePlayers: Player[] + inactivePlayers: Player[] + invitedPlayers: Array<{ + invitationId: string + steamId: string + name: string + avatar: string + location?: string + premierRank?: number + isAdmin?: boolean + }> +} + +export default function TeamDetailPage({ params }: { params: { teamId: string } }) { + const router = useRouter() + const [team, setTeam] = useState(null) + const [loading, setLoading] = useState(true) + const [error, setError] = useState(null) + + useEffect(() => { + let isMounted = true + + async function loadTeam() { + try { + setLoading(true) + setError(null) + const res = await fetch(`/api/team/${params.teamId}`, { cache: 'no-store' }) + if (res.status === 404) { + router.replace('/404') + return + } + if (!res.ok) throw new Error('Team konnte nicht geladen werden') + const data: TeamResponse = await res.json() + if (isMounted) setTeam(data) + } catch (e: any) { + if (isMounted) setError(e?.message ?? 'Unbekannter Fehler') + } finally { + if (isMounted) setLoading(false) + } + } + + loadTeam() + return () => { + isMounted = false + } + }, [params.teamId, router]) + + if (loading) { + return
+ } + + if (error) { + return
{error}
+ } + + if (!team) { + return null + } + + // --- Mitglieder zusammenstellen (ohne invited) --- + const byId = new Map() + const pushUnique = (p?: Player | null) => { + if (!p) return + if (!byId.has(p.steamId)) byId.set(p.steamId, p) + } + + pushUnique(team.leader ?? undefined) + team.activePlayers.forEach(pushUnique) + team.inactivePlayers.forEach(pushUnique) + + const members = Array.from(byId.values()) + + const isLeader = (p: Player) => team.leader?.steamId === p.steamId + const isActive = (p: Player) => + team.activePlayers.some(a => a.steamId === p.steamId) + + return ( + + {/* Header */} +
+ {team.name} +
+

+ {team.name} +

+

+ {members.length} Mitglied{members.length === 1 ? '' : 'er'} +

+
+
+ + {/* Mitglieder-Grid */} + {members.length === 0 ? ( +
+ Dieses Team hat noch keine Mitglieder. +
+ ) : ( +
+ {members.map((m) => ( +
+ {m.name} +
+
+ + {m.name} + + {isLeader(m) && ( + + Leader + + )} + + {isActive(m) ? 'Aktiv' : 'Inaktiv'} + +
+ + {m.location && ( +
+ {m.location} +
+ )} +
+
+ ))} +
+ )} +
+ ) +} diff --git a/src/app/team/layout.tsx b/src/app/team/layout.tsx deleted file mode 100644 index 342960e..0000000 --- a/src/app/team/layout.tsx +++ /dev/null @@ -1,10 +0,0 @@ -import { Tabs } from '@/app/components/Tabs' -import Tab from '@/app/components/Tab' - -export default function TeamLayout({ children }: { children: React.ReactNode }) { - return ( -
- {children} -
- ) -} diff --git a/src/app/team/page.tsx b/src/app/team/page.tsx index 448dfaf..34b51db 100644 --- a/src/app/team/page.tsx +++ b/src/app/team/page.tsx @@ -1,11 +1,72 @@ -import Card from "../components/Card"; -import TeamCardComponent from "../components/TeamCardComponent"; +'use client'; + +import { useEffect, useState } from "react"; +import TeamCardComponent from "../components/TeamCardComponent"; +import Card from "../components/Card"; + +type TeamsResponse = { teams?: any[] } | undefined; +type InvitesResponse = { invitations?: any[] } | undefined; + +export default function TeamPageClient() { + const [loading, setLoading] = useState(true); + const [teams, setTeams] = useState([]); + const [invites, setInvites] = useState([]); + const [invitationMap, setInvitationMap] = useState>({}); + + useEffect(() => { + let alive = true; + + async function load() { + try { + setLoading(true); + + // genau EINMAL laden + const [teamsRes, invitesRes] = await Promise.all([ + fetch("/api/teams", { cache: "no-store" }).then(r => r.json()) as Promise, + fetch("/api/user/invitations", { cache: "no-store" }).then(r => r.json()) as Promise, + ]); + + if (!alive) return; + + const nextTeams = teamsRes?.teams ?? []; + const nextInvites = invitesRes?.invitations ?? []; + + // Map: teamId -> invitationId (nur Join-Requests des aktuellen Users) + const map: Record = {}; + for (const inv of nextInvites) { + if (inv?.type === "team-join-request" && inv?.teamId && inv?.id) { + map[inv.teamId] = inv.id; + } + } + + setTeams(nextTeams); + setInvites(nextInvites); + setInvitationMap(map); + } catch (e) { + console.error("[TeamPageClient] initial fetch failed:", e); + setTeams([]); + setInvites([]); + setInvitationMap({}); + } finally { + if (alive) setLoading(false); + } + } + + load(); + return () => { alive = false; }; + }, []); + + if (loading) { + return

Lade Teams …

; + } -export default function Team() { return ( - - + + ); } - diff --git a/src/app/types/invitation.ts b/src/app/types/invitation.ts index b114e4c..19af485 100644 --- a/src/app/types/invitation.ts +++ b/src/app/types/invitation.ts @@ -3,6 +3,7 @@ import { Team } from "./team" export interface Invitation { id: string + type: string; team: Team } \ No newline at end of file diff --git a/src/generated/prisma/edge.js b/src/generated/prisma/edge.js index fda550f..c54ba13 100644 --- a/src/generated/prisma/edge.js +++ b/src/generated/prisma/edge.js @@ -103,7 +103,9 @@ exports.Prisma.UserScalarFieldEnum = { authCode: 'authCode', lastKnownShareCode: 'lastKnownShareCode', lastKnownShareCodeDate: 'lastKnownShareCodeDate', - createdAt: 'createdAt' + createdAt: 'createdAt', + status: 'status', + lastActiveAt: 'lastActiveAt' }; exports.Prisma.TeamScalarFieldEnum = { @@ -298,6 +300,12 @@ exports.Prisma.JsonNullValueFilter = { JsonNull: Prisma.JsonNull, AnyNull: Prisma.AnyNull }; +exports.UserStatus = exports.$Enums.UserStatus = { + online: 'online', + away: 'away', + offline: 'offline' +}; + exports.ScheduleStatus = exports.$Enums.ScheduleStatus = { PENDING: 'PENDING', CONFIRMED: 'CONFIRMED', @@ -338,7 +346,7 @@ const config = { "value": "prisma-client-js" }, "output": { - "value": "C:\\Users\\Rother\\fork\\ironie-nextjs\\src\\generated\\prisma", + "value": "C:\\Users\\Chris\\fork\\ironie-nextjs\\src\\generated\\prisma", "fromEnvVar": null }, "config": { @@ -352,7 +360,7 @@ const config = { } ], "previewFeatures": [], - "sourceFilePath": "C:\\Users\\Rother\\fork\\ironie-nextjs\\prisma\\schema.prisma", + "sourceFilePath": "C:\\Users\\Chris\\fork\\ironie-nextjs\\prisma\\schema.prisma", "isCustomOutput": true }, "relativeEnvPaths": { @@ -374,13 +382,13 @@ const config = { } } }, - "inlineSchema": "generator client {\n provider = \"prisma-client-js\"\n output = \"../src/generated/prisma\"\n}\n\ndatasource db {\n provider = \"postgresql\"\n url = env(\"DATABASE_URL\")\n}\n\n//\n// ──────────────────────────────────────────────\n// 🧑 Benutzer, Teams & Verwaltung\n// ──────────────────────────────────────────────\n//\n\nmodel User {\n steamId String @id\n name String?\n avatar String?\n location String?\n isAdmin Boolean @default(false)\n\n teamId String?\n team Team? @relation(\"UserTeam\", fields: [teamId], references: [id])\n ledTeam Team? @relation(\"TeamLeader\")\n\n matchesAsTeamA Match[] @relation(\"TeamAPlayers\")\n matchesAsTeamB Match[] @relation(\"TeamBPlayers\")\n\n premierRank Int?\n authCode String?\n lastKnownShareCode String?\n lastKnownShareCodeDate DateTime?\n createdAt DateTime @default(now())\n\n invites TeamInvite[] @relation(\"UserInvitations\")\n notifications Notification[]\n matchPlayers MatchPlayer[]\n serverRequests ServerRequest[] @relation(\"MatchRequests\")\n rankHistory RankHistory[] @relation(\"UserRankHistory\")\n demoFiles DemoFile[]\n\n createdSchedules Schedule[] @relation(\"CreatedSchedules\")\n confirmedSchedules Schedule[] @relation(\"ConfirmedSchedules\")\n\n mapVoteChoices MapVoteStep[] @relation(\"VoteStepChooser\")\n}\n\nmodel Team {\n id String @id @default(uuid())\n name String @unique\n logo String?\n leaderId String? @unique\n createdAt DateTime @default(now())\n\n activePlayers String[]\n inactivePlayers String[]\n\n leader User? @relation(\"TeamLeader\", fields: [leaderId], references: [steamId])\n members User[] @relation(\"UserTeam\")\n invites TeamInvite[]\n matchPlayers MatchPlayer[]\n\n matchesAsTeamA Match[] @relation(\"MatchTeamA\")\n matchesAsTeamB Match[] @relation(\"MatchTeamB\")\n\n schedulesAsTeamA Schedule[] @relation(\"ScheduleTeamA\")\n schedulesAsTeamB Schedule[] @relation(\"ScheduleTeamB\")\n\n mapVoteSteps MapVoteStep[] @relation(\"VoteStepTeam\")\n}\n\nmodel TeamInvite {\n id String @id @default(uuid())\n steamId String\n teamId String\n type String\n createdAt DateTime @default(now())\n\n user User @relation(\"UserInvitations\", fields: [steamId], references: [steamId])\n team Team @relation(fields: [teamId], references: [id])\n}\n\nmodel Notification {\n id String @id @default(uuid())\n steamId String\n title String?\n message String\n read Boolean @default(false)\n persistent Boolean @default(false)\n actionType String?\n actionData String?\n createdAt DateTime @default(now())\n\n user User @relation(fields: [steamId], references: [steamId])\n}\n\n//\n// ──────────────────────────────────────────────\n// 🎮 Matches & Spieler\n// ──────────────────────────────────────────────\n//\n\n// ──────────────────────────────────────────────\n// 🎮 Matches\n// ──────────────────────────────────────────────\n\nmodel Match {\n id String @id @default(uuid())\n title String\n matchType String @default(\"community\")\n map String?\n description String?\n scoreA Int?\n scoreB Int?\n\n teamAId String?\n teamA Team? @relation(\"MatchTeamA\", fields: [teamAId], references: [id])\n\n teamBId String?\n teamB Team? @relation(\"MatchTeamB\", fields: [teamBId], references: [id])\n\n teamAUsers User[] @relation(\"TeamAPlayers\")\n teamBUsers User[] @relation(\"TeamBPlayers\")\n\n filePath String?\n demoFile DemoFile?\n demoDate DateTime?\n demoData Json?\n\n players MatchPlayer[]\n rankUpdates RankHistory[] @relation(\"MatchRankHistory\")\n\n roundCount Int?\n roundHistory Json?\n winnerTeam String?\n\n bestOf Int @default(3) // 1 | 3 | 5 – app-seitig validieren\n matchDate DateTime? // geplante Startzeit (separat von demoDate)\n mapVote MapVote?\n\n createdAt DateTime @default(now())\n updatedAt DateTime @updatedAt\n\n schedule Schedule?\n}\n\nmodel MatchPlayer {\n id String @id @default(uuid())\n steamId String\n matchId String\n teamId String?\n team Team? @relation(fields: [teamId], references: [id])\n\n match Match @relation(fields: [matchId], references: [id])\n user User @relation(fields: [steamId], references: [steamId])\n\n stats PlayerStats?\n\n createdAt DateTime @default(now())\n\n @@unique([matchId, steamId])\n}\n\nmodel PlayerStats {\n id String @id @default(uuid())\n matchId String\n steamId String\n\n kills Int\n assists Int\n deaths Int\n headshotPct Float\n\n totalDamage Float @default(0)\n utilityDamage Int @default(0)\n flashAssists Int @default(0)\n mvps Int @default(0)\n mvpEliminations Int @default(0)\n mvpDefuse Int @default(0)\n mvpPlant Int @default(0)\n knifeKills Int @default(0)\n zeusKills Int @default(0)\n wallbangKills Int @default(0)\n smokeKills Int @default(0)\n headshots Int @default(0)\n noScopes Int @default(0)\n blindKills Int @default(0)\n\n aim Int @default(0)\n\n oneK Int @default(0)\n twoK Int @default(0)\n threeK Int @default(0)\n fourK Int @default(0)\n fiveK Int @default(0)\n\n rankOld Int?\n rankNew Int?\n rankChange Int?\n winCount Int?\n\n matchPlayer MatchPlayer @relation(fields: [matchId, steamId], references: [matchId, steamId])\n\n @@unique([matchId, steamId])\n}\n\nmodel RankHistory {\n id String @id @default(uuid())\n steamId String\n matchId String?\n\n rankOld Int\n rankNew Int\n delta Int\n winCount Int\n\n createdAt DateTime @default(now())\n\n user User @relation(\"UserRankHistory\", fields: [steamId], references: [steamId])\n match Match? @relation(\"MatchRankHistory\", fields: [matchId], references: [id])\n}\n\nmodel Schedule {\n id String @id @default(uuid())\n title String\n description String?\n map String?\n date DateTime\n status ScheduleStatus @default(PENDING)\n\n teamAId String?\n teamA Team? @relation(\"ScheduleTeamA\", fields: [teamAId], references: [id])\n\n teamBId String?\n teamB Team? @relation(\"ScheduleTeamB\", fields: [teamBId], references: [id])\n\n createdById String\n createdBy User @relation(\"CreatedSchedules\", fields: [createdById], references: [steamId])\n\n confirmedById String?\n confirmedBy User? @relation(\"ConfirmedSchedules\", fields: [confirmedById], references: [steamId])\n\n linkedMatchId String? @unique\n linkedMatch Match? @relation(fields: [linkedMatchId], references: [id])\n\n createdAt DateTime @default(now())\n updatedAt DateTime @updatedAt\n}\n\nenum ScheduleStatus {\n PENDING\n CONFIRMED\n DECLINED\n CANCELLED\n COMPLETED\n}\n\n//\n// ──────────────────────────────────────────────\n// 📦 Demo-Dateien & CS2 Requests\n// ──────────────────────────────────────────────\n//\n\nmodel DemoFile {\n id String @id @default(uuid())\n matchId String @unique\n steamId String\n fileName String @unique\n filePath String\n parsed Boolean @default(false)\n\n createdAt DateTime @default(now())\n\n match Match @relation(fields: [matchId], references: [id])\n user User @relation(fields: [steamId], references: [steamId])\n}\n\nmodel ServerRequest {\n id String @id @default(uuid())\n steamId String\n matchId String\n reservationId BigInt\n tvPort BigInt\n processed Boolean @default(false)\n failed Boolean @default(false)\n\n createdAt DateTime @default(now())\n\n user User @relation(\"MatchRequests\", fields: [steamId], references: [steamId])\n\n @@unique([steamId, matchId])\n}\n\n// ──────────────────────────────────────────────\n// 🗺️ Map-Vote\n// ──────────────────────────────────────────────\n\nenum MapVoteAction {\n BAN\n PICK\n DECIDER\n}\n\nmodel MapVote {\n id String @id @default(uuid())\n matchId String @unique\n match Match @relation(fields: [matchId], references: [id])\n\n bestOf Int @default(3)\n mapPool String[]\n currentIdx Int @default(0)\n locked Boolean @default(false)\n opensAt DateTime?\n\n adminEditingBy String?\n adminEditingSince DateTime?\n\n steps MapVoteStep[]\n\n createdAt DateTime @default(now())\n updatedAt DateTime @updatedAt\n}\n\nmodel MapVoteStep {\n id String @id @default(uuid())\n voteId String\n order Int\n action MapVoteAction\n\n teamId String?\n team Team? @relation(\"VoteStepTeam\", fields: [teamId], references: [id])\n\n map String?\n chosenAt DateTime?\n chosenBy String?\n chooser User? @relation(\"VoteStepChooser\", fields: [chosenBy], references: [steamId])\n\n vote MapVote @relation(fields: [voteId], references: [id])\n\n @@unique([voteId, order])\n @@index([teamId])\n @@index([chosenBy])\n}\n", - "inlineSchemaHash": "6a3173f8873b8732ce0374e908c46c28a2f778a9616d63160597fb24c88535e2", + "inlineSchema": "generator client {\n provider = \"prisma-client-js\"\n output = \"../src/generated/prisma\"\n}\n\ndatasource db {\n provider = \"postgresql\"\n url = env(\"DATABASE_URL\")\n}\n\n//\n// ──────────────────────────────────────────────\n// 🧑 Benutzer, Teams & Verwaltung\n// ──────────────────────────────────────────────\n//\n\nmodel User {\n steamId String @id\n name String?\n avatar String?\n location String?\n isAdmin Boolean @default(false)\n\n teamId String?\n team Team? @relation(\"UserTeam\", fields: [teamId], references: [id])\n ledTeam Team? @relation(\"TeamLeader\")\n\n matchesAsTeamA Match[] @relation(\"TeamAPlayers\")\n matchesAsTeamB Match[] @relation(\"TeamBPlayers\")\n\n premierRank Int?\n authCode String?\n lastKnownShareCode String?\n lastKnownShareCodeDate DateTime?\n createdAt DateTime @default(now())\n\n invites TeamInvite[] @relation(\"UserInvitations\")\n notifications Notification[]\n matchPlayers MatchPlayer[]\n serverRequests ServerRequest[] @relation(\"MatchRequests\")\n rankHistory RankHistory[] @relation(\"UserRankHistory\")\n demoFiles DemoFile[]\n\n createdSchedules Schedule[] @relation(\"CreatedSchedules\")\n confirmedSchedules Schedule[] @relation(\"ConfirmedSchedules\")\n\n mapVoteChoices MapVoteStep[] @relation(\"VoteStepChooser\")\n\n status UserStatus @default(offline) // 👈 neu\n lastActiveAt DateTime? // optional: wann zuletzt aktiv\n}\n\nenum UserStatus {\n online\n away\n offline\n}\n\nmodel Team {\n id String @id @default(uuid())\n name String @unique\n logo String?\n leaderId String? @unique\n createdAt DateTime @default(now())\n\n activePlayers String[]\n inactivePlayers String[]\n\n leader User? @relation(\"TeamLeader\", fields: [leaderId], references: [steamId])\n members User[] @relation(\"UserTeam\")\n invites TeamInvite[]\n matchPlayers MatchPlayer[]\n\n matchesAsTeamA Match[] @relation(\"MatchTeamA\")\n matchesAsTeamB Match[] @relation(\"MatchTeamB\")\n\n schedulesAsTeamA Schedule[] @relation(\"ScheduleTeamA\")\n schedulesAsTeamB Schedule[] @relation(\"ScheduleTeamB\")\n\n mapVoteSteps MapVoteStep[] @relation(\"VoteStepTeam\")\n}\n\nmodel TeamInvite {\n id String @id @default(uuid())\n steamId String\n teamId String\n type String\n createdAt DateTime @default(now())\n\n user User @relation(\"UserInvitations\", fields: [steamId], references: [steamId])\n team Team @relation(fields: [teamId], references: [id])\n}\n\nmodel Notification {\n id String @id @default(uuid())\n steamId String\n title String?\n message String\n read Boolean @default(false)\n persistent Boolean @default(false)\n actionType String?\n actionData String?\n createdAt DateTime @default(now())\n\n user User @relation(fields: [steamId], references: [steamId])\n}\n\n//\n// ──────────────────────────────────────────────\n// 🎮 Matches & Spieler\n// ──────────────────────────────────────────────\n//\n\n// ──────────────────────────────────────────────\n// 🎮 Matches\n// ──────────────────────────────────────────────\n\nmodel Match {\n id String @id @default(uuid())\n title String\n matchType String @default(\"community\")\n map String?\n description String?\n scoreA Int?\n scoreB Int?\n\n teamAId String?\n teamA Team? @relation(\"MatchTeamA\", fields: [teamAId], references: [id])\n\n teamBId String?\n teamB Team? @relation(\"MatchTeamB\", fields: [teamBId], references: [id])\n\n teamAUsers User[] @relation(\"TeamAPlayers\")\n teamBUsers User[] @relation(\"TeamBPlayers\")\n\n filePath String?\n demoFile DemoFile?\n demoDate DateTime?\n demoData Json?\n\n players MatchPlayer[]\n rankUpdates RankHistory[] @relation(\"MatchRankHistory\")\n\n roundCount Int?\n roundHistory Json?\n winnerTeam String?\n\n bestOf Int @default(3) // 1 | 3 | 5 – app-seitig validieren\n matchDate DateTime? // geplante Startzeit (separat von demoDate)\n mapVote MapVote?\n\n createdAt DateTime @default(now())\n updatedAt DateTime @updatedAt\n\n schedule Schedule?\n}\n\nmodel MatchPlayer {\n id String @id @default(uuid())\n steamId String\n matchId String\n teamId String?\n team Team? @relation(fields: [teamId], references: [id])\n\n match Match @relation(fields: [matchId], references: [id])\n user User @relation(fields: [steamId], references: [steamId])\n\n stats PlayerStats?\n\n createdAt DateTime @default(now())\n\n @@unique([matchId, steamId])\n}\n\nmodel PlayerStats {\n id String @id @default(uuid())\n matchId String\n steamId String\n\n kills Int\n assists Int\n deaths Int\n headshotPct Float\n\n totalDamage Float @default(0)\n utilityDamage Int @default(0)\n flashAssists Int @default(0)\n mvps Int @default(0)\n mvpEliminations Int @default(0)\n mvpDefuse Int @default(0)\n mvpPlant Int @default(0)\n knifeKills Int @default(0)\n zeusKills Int @default(0)\n wallbangKills Int @default(0)\n smokeKills Int @default(0)\n headshots Int @default(0)\n noScopes Int @default(0)\n blindKills Int @default(0)\n\n aim Int @default(0)\n\n oneK Int @default(0)\n twoK Int @default(0)\n threeK Int @default(0)\n fourK Int @default(0)\n fiveK Int @default(0)\n\n rankOld Int?\n rankNew Int?\n rankChange Int?\n winCount Int?\n\n matchPlayer MatchPlayer @relation(fields: [matchId, steamId], references: [matchId, steamId])\n\n @@unique([matchId, steamId])\n}\n\nmodel RankHistory {\n id String @id @default(uuid())\n steamId String\n matchId String?\n\n rankOld Int\n rankNew Int\n delta Int\n winCount Int\n\n createdAt DateTime @default(now())\n\n user User @relation(\"UserRankHistory\", fields: [steamId], references: [steamId])\n match Match? @relation(\"MatchRankHistory\", fields: [matchId], references: [id])\n}\n\nmodel Schedule {\n id String @id @default(uuid())\n title String\n description String?\n map String?\n date DateTime\n status ScheduleStatus @default(PENDING)\n\n teamAId String?\n teamA Team? @relation(\"ScheduleTeamA\", fields: [teamAId], references: [id])\n\n teamBId String?\n teamB Team? @relation(\"ScheduleTeamB\", fields: [teamBId], references: [id])\n\n createdById String\n createdBy User @relation(\"CreatedSchedules\", fields: [createdById], references: [steamId])\n\n confirmedById String?\n confirmedBy User? @relation(\"ConfirmedSchedules\", fields: [confirmedById], references: [steamId])\n\n linkedMatchId String? @unique\n linkedMatch Match? @relation(fields: [linkedMatchId], references: [id])\n\n createdAt DateTime @default(now())\n updatedAt DateTime @updatedAt\n}\n\nenum ScheduleStatus {\n PENDING\n CONFIRMED\n DECLINED\n CANCELLED\n COMPLETED\n}\n\n//\n// ──────────────────────────────────────────────\n// 📦 Demo-Dateien & CS2 Requests\n// ──────────────────────────────────────────────\n//\n\nmodel DemoFile {\n id String @id @default(uuid())\n matchId String @unique\n steamId String\n fileName String @unique\n filePath String\n parsed Boolean @default(false)\n\n createdAt DateTime @default(now())\n\n match Match @relation(fields: [matchId], references: [id])\n user User @relation(fields: [steamId], references: [steamId])\n}\n\nmodel ServerRequest {\n id String @id @default(uuid())\n steamId String\n matchId String\n reservationId BigInt\n tvPort BigInt\n processed Boolean @default(false)\n failed Boolean @default(false)\n\n createdAt DateTime @default(now())\n\n user User @relation(\"MatchRequests\", fields: [steamId], references: [steamId])\n\n @@unique([steamId, matchId])\n}\n\n// ──────────────────────────────────────────────\n// 🗺️ Map-Vote\n// ──────────────────────────────────────────────\n\nenum MapVoteAction {\n BAN\n PICK\n DECIDER\n}\n\nmodel MapVote {\n id String @id @default(uuid())\n matchId String @unique\n match Match @relation(fields: [matchId], references: [id])\n\n bestOf Int @default(3)\n mapPool String[]\n currentIdx Int @default(0)\n locked Boolean @default(false)\n opensAt DateTime?\n\n adminEditingBy String?\n adminEditingSince DateTime?\n\n steps MapVoteStep[]\n\n createdAt DateTime @default(now())\n updatedAt DateTime @updatedAt\n}\n\nmodel MapVoteStep {\n id String @id @default(uuid())\n voteId String\n order Int\n action MapVoteAction\n\n teamId String?\n team Team? @relation(\"VoteStepTeam\", fields: [teamId], references: [id])\n\n map String?\n chosenAt DateTime?\n chosenBy String?\n chooser User? @relation(\"VoteStepChooser\", fields: [chosenBy], references: [steamId])\n\n vote MapVote @relation(fields: [voteId], references: [id])\n\n @@unique([voteId, order])\n @@index([teamId])\n @@index([chosenBy])\n}\n", + "inlineSchemaHash": "8a515788915caf6a9807424781c3f79de8f69f7d4971b7e0d4fbdd71cf03d57e", "copyEngine": true } config.dirname = '/' -config.runtimeDataModel = JSON.parse("{\"models\":{\"User\":{\"dbName\":null,\"schema\":null,\"fields\":[{\"name\":\"steamId\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":true,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"name\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"avatar\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"location\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"isAdmin\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"Boolean\",\"nativeType\":null,\"default\":false,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"teamId\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":true,\"hasDefaultValue\":false,\"type\":\"String\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"team\",\"kind\":\"object\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"Team\",\"nativeType\":null,\"relationName\":\"UserTeam\",\"relationFromFields\":[\"teamId\"],\"relationToFields\":[\"id\"],\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"ledTeam\",\"kind\":\"object\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"Team\",\"nativeType\":null,\"relationName\":\"TeamLeader\",\"relationFromFields\":[],\"relationToFields\":[],\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"matchesAsTeamA\",\"kind\":\"object\",\"isList\":true,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"Match\",\"nativeType\":null,\"relationName\":\"TeamAPlayers\",\"relationFromFields\":[],\"relationToFields\":[],\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"matchesAsTeamB\",\"kind\":\"object\",\"isList\":true,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"Match\",\"nativeType\":null,\"relationName\":\"TeamBPlayers\",\"relationFromFields\":[],\"relationToFields\":[],\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"premierRank\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"Int\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"authCode\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"lastKnownShareCode\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"lastKnownShareCodeDate\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"DateTime\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"createdAt\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"DateTime\",\"nativeType\":null,\"default\":{\"name\":\"now\",\"args\":[]},\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"invites\",\"kind\":\"object\",\"isList\":true,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"TeamInvite\",\"nativeType\":null,\"relationName\":\"UserInvitations\",\"relationFromFields\":[],\"relationToFields\":[],\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"notifications\",\"kind\":\"object\",\"isList\":true,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"Notification\",\"nativeType\":null,\"relationName\":\"NotificationToUser\",\"relationFromFields\":[],\"relationToFields\":[],\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"matchPlayers\",\"kind\":\"object\",\"isList\":true,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"MatchPlayer\",\"nativeType\":null,\"relationName\":\"MatchPlayerToUser\",\"relationFromFields\":[],\"relationToFields\":[],\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"serverRequests\",\"kind\":\"object\",\"isList\":true,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"ServerRequest\",\"nativeType\":null,\"relationName\":\"MatchRequests\",\"relationFromFields\":[],\"relationToFields\":[],\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"rankHistory\",\"kind\":\"object\",\"isList\":true,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"RankHistory\",\"nativeType\":null,\"relationName\":\"UserRankHistory\",\"relationFromFields\":[],\"relationToFields\":[],\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"demoFiles\",\"kind\":\"object\",\"isList\":true,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"DemoFile\",\"nativeType\":null,\"relationName\":\"DemoFileToUser\",\"relationFromFields\":[],\"relationToFields\":[],\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"createdSchedules\",\"kind\":\"object\",\"isList\":true,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"Schedule\",\"nativeType\":null,\"relationName\":\"CreatedSchedules\",\"relationFromFields\":[],\"relationToFields\":[],\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"confirmedSchedules\",\"kind\":\"object\",\"isList\":true,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"Schedule\",\"nativeType\":null,\"relationName\":\"ConfirmedSchedules\",\"relationFromFields\":[],\"relationToFields\":[],\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"mapVoteChoices\",\"kind\":\"object\",\"isList\":true,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"MapVoteStep\",\"nativeType\":null,\"relationName\":\"VoteStepChooser\",\"relationFromFields\":[],\"relationToFields\":[],\"isGenerated\":false,\"isUpdatedAt\":false}],\"primaryKey\":null,\"uniqueFields\":[],\"uniqueIndexes\":[],\"isGenerated\":false},\"Team\":{\"dbName\":null,\"schema\":null,\"fields\":[{\"name\":\"id\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":true,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"String\",\"nativeType\":null,\"default\":{\"name\":\"uuid\",\"args\":[4]},\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"name\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":true,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"logo\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"leaderId\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":true,\"isId\":false,\"isReadOnly\":true,\"hasDefaultValue\":false,\"type\":\"String\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"createdAt\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"DateTime\",\"nativeType\":null,\"default\":{\"name\":\"now\",\"args\":[]},\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"activePlayers\",\"kind\":\"scalar\",\"isList\":true,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"inactivePlayers\",\"kind\":\"scalar\",\"isList\":true,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"leader\",\"kind\":\"object\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"User\",\"nativeType\":null,\"relationName\":\"TeamLeader\",\"relationFromFields\":[\"leaderId\"],\"relationToFields\":[\"steamId\"],\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"members\",\"kind\":\"object\",\"isList\":true,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"User\",\"nativeType\":null,\"relationName\":\"UserTeam\",\"relationFromFields\":[],\"relationToFields\":[],\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"invites\",\"kind\":\"object\",\"isList\":true,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"TeamInvite\",\"nativeType\":null,\"relationName\":\"TeamToTeamInvite\",\"relationFromFields\":[],\"relationToFields\":[],\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"matchPlayers\",\"kind\":\"object\",\"isList\":true,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"MatchPlayer\",\"nativeType\":null,\"relationName\":\"MatchPlayerToTeam\",\"relationFromFields\":[],\"relationToFields\":[],\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"matchesAsTeamA\",\"kind\":\"object\",\"isList\":true,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"Match\",\"nativeType\":null,\"relationName\":\"MatchTeamA\",\"relationFromFields\":[],\"relationToFields\":[],\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"matchesAsTeamB\",\"kind\":\"object\",\"isList\":true,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"Match\",\"nativeType\":null,\"relationName\":\"MatchTeamB\",\"relationFromFields\":[],\"relationToFields\":[],\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"schedulesAsTeamA\",\"kind\":\"object\",\"isList\":true,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"Schedule\",\"nativeType\":null,\"relationName\":\"ScheduleTeamA\",\"relationFromFields\":[],\"relationToFields\":[],\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"schedulesAsTeamB\",\"kind\":\"object\",\"isList\":true,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"Schedule\",\"nativeType\":null,\"relationName\":\"ScheduleTeamB\",\"relationFromFields\":[],\"relationToFields\":[],\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"mapVoteSteps\",\"kind\":\"object\",\"isList\":true,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"MapVoteStep\",\"nativeType\":null,\"relationName\":\"VoteStepTeam\",\"relationFromFields\":[],\"relationToFields\":[],\"isGenerated\":false,\"isUpdatedAt\":false}],\"primaryKey\":null,\"uniqueFields\":[],\"uniqueIndexes\":[],\"isGenerated\":false},\"TeamInvite\":{\"dbName\":null,\"schema\":null,\"fields\":[{\"name\":\"id\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":true,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"String\",\"nativeType\":null,\"default\":{\"name\":\"uuid\",\"args\":[4]},\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"steamId\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":true,\"hasDefaultValue\":false,\"type\":\"String\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"teamId\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":true,\"hasDefaultValue\":false,\"type\":\"String\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"type\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"createdAt\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"DateTime\",\"nativeType\":null,\"default\":{\"name\":\"now\",\"args\":[]},\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"user\",\"kind\":\"object\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"User\",\"nativeType\":null,\"relationName\":\"UserInvitations\",\"relationFromFields\":[\"steamId\"],\"relationToFields\":[\"steamId\"],\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"team\",\"kind\":\"object\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"Team\",\"nativeType\":null,\"relationName\":\"TeamToTeamInvite\",\"relationFromFields\":[\"teamId\"],\"relationToFields\":[\"id\"],\"isGenerated\":false,\"isUpdatedAt\":false}],\"primaryKey\":null,\"uniqueFields\":[],\"uniqueIndexes\":[],\"isGenerated\":false},\"Notification\":{\"dbName\":null,\"schema\":null,\"fields\":[{\"name\":\"id\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":true,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"String\",\"nativeType\":null,\"default\":{\"name\":\"uuid\",\"args\":[4]},\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"steamId\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":true,\"hasDefaultValue\":false,\"type\":\"String\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"title\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"message\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"read\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"Boolean\",\"nativeType\":null,\"default\":false,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"persistent\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"Boolean\",\"nativeType\":null,\"default\":false,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"actionType\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"actionData\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"createdAt\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"DateTime\",\"nativeType\":null,\"default\":{\"name\":\"now\",\"args\":[]},\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"user\",\"kind\":\"object\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"User\",\"nativeType\":null,\"relationName\":\"NotificationToUser\",\"relationFromFields\":[\"steamId\"],\"relationToFields\":[\"steamId\"],\"isGenerated\":false,\"isUpdatedAt\":false}],\"primaryKey\":null,\"uniqueFields\":[],\"uniqueIndexes\":[],\"isGenerated\":false},\"Match\":{\"dbName\":null,\"schema\":null,\"fields\":[{\"name\":\"id\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":true,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"String\",\"nativeType\":null,\"default\":{\"name\":\"uuid\",\"args\":[4]},\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"title\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"matchType\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"String\",\"nativeType\":null,\"default\":\"community\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"map\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"description\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"scoreA\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"Int\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"scoreB\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"Int\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"teamAId\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":true,\"hasDefaultValue\":false,\"type\":\"String\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"teamA\",\"kind\":\"object\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"Team\",\"nativeType\":null,\"relationName\":\"MatchTeamA\",\"relationFromFields\":[\"teamAId\"],\"relationToFields\":[\"id\"],\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"teamBId\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":true,\"hasDefaultValue\":false,\"type\":\"String\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"teamB\",\"kind\":\"object\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"Team\",\"nativeType\":null,\"relationName\":\"MatchTeamB\",\"relationFromFields\":[\"teamBId\"],\"relationToFields\":[\"id\"],\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"teamAUsers\",\"kind\":\"object\",\"isList\":true,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"User\",\"nativeType\":null,\"relationName\":\"TeamAPlayers\",\"relationFromFields\":[],\"relationToFields\":[],\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"teamBUsers\",\"kind\":\"object\",\"isList\":true,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"User\",\"nativeType\":null,\"relationName\":\"TeamBPlayers\",\"relationFromFields\":[],\"relationToFields\":[],\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"filePath\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"demoFile\",\"kind\":\"object\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"DemoFile\",\"nativeType\":null,\"relationName\":\"DemoFileToMatch\",\"relationFromFields\":[],\"relationToFields\":[],\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"demoDate\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"DateTime\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"demoData\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"Json\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"players\",\"kind\":\"object\",\"isList\":true,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"MatchPlayer\",\"nativeType\":null,\"relationName\":\"MatchToMatchPlayer\",\"relationFromFields\":[],\"relationToFields\":[],\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"rankUpdates\",\"kind\":\"object\",\"isList\":true,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"RankHistory\",\"nativeType\":null,\"relationName\":\"MatchRankHistory\",\"relationFromFields\":[],\"relationToFields\":[],\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"roundCount\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"Int\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"roundHistory\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"Json\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"winnerTeam\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"bestOf\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"Int\",\"nativeType\":null,\"default\":3,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"matchDate\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"DateTime\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"mapVote\",\"kind\":\"object\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"MapVote\",\"nativeType\":null,\"relationName\":\"MapVoteToMatch\",\"relationFromFields\":[],\"relationToFields\":[],\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"createdAt\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"DateTime\",\"nativeType\":null,\"default\":{\"name\":\"now\",\"args\":[]},\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"updatedAt\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"DateTime\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":true},{\"name\":\"schedule\",\"kind\":\"object\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"Schedule\",\"nativeType\":null,\"relationName\":\"MatchToSchedule\",\"relationFromFields\":[],\"relationToFields\":[],\"isGenerated\":false,\"isUpdatedAt\":false}],\"primaryKey\":null,\"uniqueFields\":[],\"uniqueIndexes\":[],\"isGenerated\":false},\"MatchPlayer\":{\"dbName\":null,\"schema\":null,\"fields\":[{\"name\":\"id\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":true,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"String\",\"nativeType\":null,\"default\":{\"name\":\"uuid\",\"args\":[4]},\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"steamId\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":true,\"hasDefaultValue\":false,\"type\":\"String\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"matchId\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":true,\"hasDefaultValue\":false,\"type\":\"String\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"teamId\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":true,\"hasDefaultValue\":false,\"type\":\"String\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"team\",\"kind\":\"object\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"Team\",\"nativeType\":null,\"relationName\":\"MatchPlayerToTeam\",\"relationFromFields\":[\"teamId\"],\"relationToFields\":[\"id\"],\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"match\",\"kind\":\"object\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"Match\",\"nativeType\":null,\"relationName\":\"MatchToMatchPlayer\",\"relationFromFields\":[\"matchId\"],\"relationToFields\":[\"id\"],\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"user\",\"kind\":\"object\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"User\",\"nativeType\":null,\"relationName\":\"MatchPlayerToUser\",\"relationFromFields\":[\"steamId\"],\"relationToFields\":[\"steamId\"],\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"stats\",\"kind\":\"object\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"PlayerStats\",\"nativeType\":null,\"relationName\":\"MatchPlayerToPlayerStats\",\"relationFromFields\":[],\"relationToFields\":[],\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"createdAt\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"DateTime\",\"nativeType\":null,\"default\":{\"name\":\"now\",\"args\":[]},\"isGenerated\":false,\"isUpdatedAt\":false}],\"primaryKey\":null,\"uniqueFields\":[[\"matchId\",\"steamId\"]],\"uniqueIndexes\":[{\"name\":null,\"fields\":[\"matchId\",\"steamId\"]}],\"isGenerated\":false},\"PlayerStats\":{\"dbName\":null,\"schema\":null,\"fields\":[{\"name\":\"id\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":true,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"String\",\"nativeType\":null,\"default\":{\"name\":\"uuid\",\"args\":[4]},\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"matchId\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":true,\"hasDefaultValue\":false,\"type\":\"String\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"steamId\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":true,\"hasDefaultValue\":false,\"type\":\"String\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"kills\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"Int\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"assists\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"Int\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"deaths\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"Int\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"headshotPct\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"Float\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"totalDamage\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"Float\",\"nativeType\":null,\"default\":0,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"utilityDamage\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"Int\",\"nativeType\":null,\"default\":0,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"flashAssists\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"Int\",\"nativeType\":null,\"default\":0,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"mvps\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"Int\",\"nativeType\":null,\"default\":0,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"mvpEliminations\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"Int\",\"nativeType\":null,\"default\":0,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"mvpDefuse\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"Int\",\"nativeType\":null,\"default\":0,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"mvpPlant\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"Int\",\"nativeType\":null,\"default\":0,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"knifeKills\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"Int\",\"nativeType\":null,\"default\":0,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"zeusKills\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"Int\",\"nativeType\":null,\"default\":0,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"wallbangKills\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"Int\",\"nativeType\":null,\"default\":0,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"smokeKills\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"Int\",\"nativeType\":null,\"default\":0,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"headshots\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"Int\",\"nativeType\":null,\"default\":0,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"noScopes\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"Int\",\"nativeType\":null,\"default\":0,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"blindKills\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"Int\",\"nativeType\":null,\"default\":0,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"aim\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"Int\",\"nativeType\":null,\"default\":0,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"oneK\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"Int\",\"nativeType\":null,\"default\":0,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"twoK\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"Int\",\"nativeType\":null,\"default\":0,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"threeK\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"Int\",\"nativeType\":null,\"default\":0,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"fourK\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"Int\",\"nativeType\":null,\"default\":0,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"fiveK\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"Int\",\"nativeType\":null,\"default\":0,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"rankOld\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"Int\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"rankNew\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"Int\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"rankChange\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"Int\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"winCount\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"Int\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"matchPlayer\",\"kind\":\"object\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"MatchPlayer\",\"nativeType\":null,\"relationName\":\"MatchPlayerToPlayerStats\",\"relationFromFields\":[\"matchId\",\"steamId\"],\"relationToFields\":[\"matchId\",\"steamId\"],\"isGenerated\":false,\"isUpdatedAt\":false}],\"primaryKey\":null,\"uniqueFields\":[[\"matchId\",\"steamId\"]],\"uniqueIndexes\":[{\"name\":null,\"fields\":[\"matchId\",\"steamId\"]}],\"isGenerated\":false},\"RankHistory\":{\"dbName\":null,\"schema\":null,\"fields\":[{\"name\":\"id\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":true,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"String\",\"nativeType\":null,\"default\":{\"name\":\"uuid\",\"args\":[4]},\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"steamId\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":true,\"hasDefaultValue\":false,\"type\":\"String\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"matchId\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":true,\"hasDefaultValue\":false,\"type\":\"String\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"rankOld\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"Int\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"rankNew\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"Int\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"delta\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"Int\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"winCount\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"Int\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"createdAt\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"DateTime\",\"nativeType\":null,\"default\":{\"name\":\"now\",\"args\":[]},\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"user\",\"kind\":\"object\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"User\",\"nativeType\":null,\"relationName\":\"UserRankHistory\",\"relationFromFields\":[\"steamId\"],\"relationToFields\":[\"steamId\"],\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"match\",\"kind\":\"object\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"Match\",\"nativeType\":null,\"relationName\":\"MatchRankHistory\",\"relationFromFields\":[\"matchId\"],\"relationToFields\":[\"id\"],\"isGenerated\":false,\"isUpdatedAt\":false}],\"primaryKey\":null,\"uniqueFields\":[],\"uniqueIndexes\":[],\"isGenerated\":false},\"Schedule\":{\"dbName\":null,\"schema\":null,\"fields\":[{\"name\":\"id\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":true,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"String\",\"nativeType\":null,\"default\":{\"name\":\"uuid\",\"args\":[4]},\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"title\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"description\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"map\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"date\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"DateTime\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"status\",\"kind\":\"enum\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"ScheduleStatus\",\"nativeType\":null,\"default\":\"PENDING\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"teamAId\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":true,\"hasDefaultValue\":false,\"type\":\"String\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"teamA\",\"kind\":\"object\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"Team\",\"nativeType\":null,\"relationName\":\"ScheduleTeamA\",\"relationFromFields\":[\"teamAId\"],\"relationToFields\":[\"id\"],\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"teamBId\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":true,\"hasDefaultValue\":false,\"type\":\"String\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"teamB\",\"kind\":\"object\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"Team\",\"nativeType\":null,\"relationName\":\"ScheduleTeamB\",\"relationFromFields\":[\"teamBId\"],\"relationToFields\":[\"id\"],\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"createdById\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":true,\"hasDefaultValue\":false,\"type\":\"String\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"createdBy\",\"kind\":\"object\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"User\",\"nativeType\":null,\"relationName\":\"CreatedSchedules\",\"relationFromFields\":[\"createdById\"],\"relationToFields\":[\"steamId\"],\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"confirmedById\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":true,\"hasDefaultValue\":false,\"type\":\"String\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"confirmedBy\",\"kind\":\"object\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"User\",\"nativeType\":null,\"relationName\":\"ConfirmedSchedules\",\"relationFromFields\":[\"confirmedById\"],\"relationToFields\":[\"steamId\"],\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"linkedMatchId\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":true,\"isId\":false,\"isReadOnly\":true,\"hasDefaultValue\":false,\"type\":\"String\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"linkedMatch\",\"kind\":\"object\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"Match\",\"nativeType\":null,\"relationName\":\"MatchToSchedule\",\"relationFromFields\":[\"linkedMatchId\"],\"relationToFields\":[\"id\"],\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"createdAt\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"DateTime\",\"nativeType\":null,\"default\":{\"name\":\"now\",\"args\":[]},\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"updatedAt\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"DateTime\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":true}],\"primaryKey\":null,\"uniqueFields\":[],\"uniqueIndexes\":[],\"isGenerated\":false},\"DemoFile\":{\"dbName\":null,\"schema\":null,\"fields\":[{\"name\":\"id\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":true,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"String\",\"nativeType\":null,\"default\":{\"name\":\"uuid\",\"args\":[4]},\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"matchId\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":true,\"isId\":false,\"isReadOnly\":true,\"hasDefaultValue\":false,\"type\":\"String\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"steamId\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":true,\"hasDefaultValue\":false,\"type\":\"String\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"fileName\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":true,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"filePath\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"parsed\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"Boolean\",\"nativeType\":null,\"default\":false,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"createdAt\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"DateTime\",\"nativeType\":null,\"default\":{\"name\":\"now\",\"args\":[]},\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"match\",\"kind\":\"object\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"Match\",\"nativeType\":null,\"relationName\":\"DemoFileToMatch\",\"relationFromFields\":[\"matchId\"],\"relationToFields\":[\"id\"],\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"user\",\"kind\":\"object\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"User\",\"nativeType\":null,\"relationName\":\"DemoFileToUser\",\"relationFromFields\":[\"steamId\"],\"relationToFields\":[\"steamId\"],\"isGenerated\":false,\"isUpdatedAt\":false}],\"primaryKey\":null,\"uniqueFields\":[],\"uniqueIndexes\":[],\"isGenerated\":false},\"ServerRequest\":{\"dbName\":null,\"schema\":null,\"fields\":[{\"name\":\"id\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":true,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"String\",\"nativeType\":null,\"default\":{\"name\":\"uuid\",\"args\":[4]},\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"steamId\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":true,\"hasDefaultValue\":false,\"type\":\"String\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"matchId\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"reservationId\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"BigInt\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"tvPort\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"BigInt\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"processed\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"Boolean\",\"nativeType\":null,\"default\":false,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"failed\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"Boolean\",\"nativeType\":null,\"default\":false,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"createdAt\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"DateTime\",\"nativeType\":null,\"default\":{\"name\":\"now\",\"args\":[]},\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"user\",\"kind\":\"object\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"User\",\"nativeType\":null,\"relationName\":\"MatchRequests\",\"relationFromFields\":[\"steamId\"],\"relationToFields\":[\"steamId\"],\"isGenerated\":false,\"isUpdatedAt\":false}],\"primaryKey\":null,\"uniqueFields\":[[\"steamId\",\"matchId\"]],\"uniqueIndexes\":[{\"name\":null,\"fields\":[\"steamId\",\"matchId\"]}],\"isGenerated\":false},\"MapVote\":{\"dbName\":null,\"schema\":null,\"fields\":[{\"name\":\"id\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":true,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"String\",\"nativeType\":null,\"default\":{\"name\":\"uuid\",\"args\":[4]},\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"matchId\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":true,\"isId\":false,\"isReadOnly\":true,\"hasDefaultValue\":false,\"type\":\"String\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"match\",\"kind\":\"object\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"Match\",\"nativeType\":null,\"relationName\":\"MapVoteToMatch\",\"relationFromFields\":[\"matchId\"],\"relationToFields\":[\"id\"],\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"bestOf\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"Int\",\"nativeType\":null,\"default\":3,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"mapPool\",\"kind\":\"scalar\",\"isList\":true,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"currentIdx\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"Int\",\"nativeType\":null,\"default\":0,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"locked\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"Boolean\",\"nativeType\":null,\"default\":false,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"opensAt\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"DateTime\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"adminEditingBy\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"adminEditingSince\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"DateTime\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"steps\",\"kind\":\"object\",\"isList\":true,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"MapVoteStep\",\"nativeType\":null,\"relationName\":\"MapVoteToMapVoteStep\",\"relationFromFields\":[],\"relationToFields\":[],\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"createdAt\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"DateTime\",\"nativeType\":null,\"default\":{\"name\":\"now\",\"args\":[]},\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"updatedAt\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"DateTime\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":true}],\"primaryKey\":null,\"uniqueFields\":[],\"uniqueIndexes\":[],\"isGenerated\":false},\"MapVoteStep\":{\"dbName\":null,\"schema\":null,\"fields\":[{\"name\":\"id\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":true,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"String\",\"nativeType\":null,\"default\":{\"name\":\"uuid\",\"args\":[4]},\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"voteId\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":true,\"hasDefaultValue\":false,\"type\":\"String\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"order\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"Int\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"action\",\"kind\":\"enum\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"MapVoteAction\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"teamId\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":true,\"hasDefaultValue\":false,\"type\":\"String\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"team\",\"kind\":\"object\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"Team\",\"nativeType\":null,\"relationName\":\"VoteStepTeam\",\"relationFromFields\":[\"teamId\"],\"relationToFields\":[\"id\"],\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"map\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"chosenAt\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"DateTime\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"chosenBy\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":true,\"hasDefaultValue\":false,\"type\":\"String\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"chooser\",\"kind\":\"object\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"User\",\"nativeType\":null,\"relationName\":\"VoteStepChooser\",\"relationFromFields\":[\"chosenBy\"],\"relationToFields\":[\"steamId\"],\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"vote\",\"kind\":\"object\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"MapVote\",\"nativeType\":null,\"relationName\":\"MapVoteToMapVoteStep\",\"relationFromFields\":[\"voteId\"],\"relationToFields\":[\"id\"],\"isGenerated\":false,\"isUpdatedAt\":false}],\"primaryKey\":null,\"uniqueFields\":[[\"voteId\",\"order\"]],\"uniqueIndexes\":[{\"name\":null,\"fields\":[\"voteId\",\"order\"]}],\"isGenerated\":false}},\"enums\":{\"ScheduleStatus\":{\"values\":[{\"name\":\"PENDING\",\"dbName\":null},{\"name\":\"CONFIRMED\",\"dbName\":null},{\"name\":\"DECLINED\",\"dbName\":null},{\"name\":\"CANCELLED\",\"dbName\":null},{\"name\":\"COMPLETED\",\"dbName\":null}],\"dbName\":null},\"MapVoteAction\":{\"values\":[{\"name\":\"BAN\",\"dbName\":null},{\"name\":\"PICK\",\"dbName\":null},{\"name\":\"DECIDER\",\"dbName\":null}],\"dbName\":null}},\"types\":{}}") +config.runtimeDataModel = JSON.parse("{\"models\":{\"User\":{\"dbName\":null,\"schema\":null,\"fields\":[{\"name\":\"steamId\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":true,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"name\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"avatar\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"location\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"isAdmin\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"Boolean\",\"nativeType\":null,\"default\":false,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"teamId\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":true,\"hasDefaultValue\":false,\"type\":\"String\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"team\",\"kind\":\"object\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"Team\",\"nativeType\":null,\"relationName\":\"UserTeam\",\"relationFromFields\":[\"teamId\"],\"relationToFields\":[\"id\"],\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"ledTeam\",\"kind\":\"object\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"Team\",\"nativeType\":null,\"relationName\":\"TeamLeader\",\"relationFromFields\":[],\"relationToFields\":[],\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"matchesAsTeamA\",\"kind\":\"object\",\"isList\":true,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"Match\",\"nativeType\":null,\"relationName\":\"TeamAPlayers\",\"relationFromFields\":[],\"relationToFields\":[],\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"matchesAsTeamB\",\"kind\":\"object\",\"isList\":true,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"Match\",\"nativeType\":null,\"relationName\":\"TeamBPlayers\",\"relationFromFields\":[],\"relationToFields\":[],\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"premierRank\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"Int\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"authCode\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"lastKnownShareCode\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"lastKnownShareCodeDate\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"DateTime\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"createdAt\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"DateTime\",\"nativeType\":null,\"default\":{\"name\":\"now\",\"args\":[]},\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"invites\",\"kind\":\"object\",\"isList\":true,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"TeamInvite\",\"nativeType\":null,\"relationName\":\"UserInvitations\",\"relationFromFields\":[],\"relationToFields\":[],\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"notifications\",\"kind\":\"object\",\"isList\":true,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"Notification\",\"nativeType\":null,\"relationName\":\"NotificationToUser\",\"relationFromFields\":[],\"relationToFields\":[],\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"matchPlayers\",\"kind\":\"object\",\"isList\":true,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"MatchPlayer\",\"nativeType\":null,\"relationName\":\"MatchPlayerToUser\",\"relationFromFields\":[],\"relationToFields\":[],\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"serverRequests\",\"kind\":\"object\",\"isList\":true,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"ServerRequest\",\"nativeType\":null,\"relationName\":\"MatchRequests\",\"relationFromFields\":[],\"relationToFields\":[],\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"rankHistory\",\"kind\":\"object\",\"isList\":true,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"RankHistory\",\"nativeType\":null,\"relationName\":\"UserRankHistory\",\"relationFromFields\":[],\"relationToFields\":[],\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"demoFiles\",\"kind\":\"object\",\"isList\":true,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"DemoFile\",\"nativeType\":null,\"relationName\":\"DemoFileToUser\",\"relationFromFields\":[],\"relationToFields\":[],\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"createdSchedules\",\"kind\":\"object\",\"isList\":true,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"Schedule\",\"nativeType\":null,\"relationName\":\"CreatedSchedules\",\"relationFromFields\":[],\"relationToFields\":[],\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"confirmedSchedules\",\"kind\":\"object\",\"isList\":true,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"Schedule\",\"nativeType\":null,\"relationName\":\"ConfirmedSchedules\",\"relationFromFields\":[],\"relationToFields\":[],\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"mapVoteChoices\",\"kind\":\"object\",\"isList\":true,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"MapVoteStep\",\"nativeType\":null,\"relationName\":\"VoteStepChooser\",\"relationFromFields\":[],\"relationToFields\":[],\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"status\",\"kind\":\"enum\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"UserStatus\",\"nativeType\":null,\"default\":\"offline\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"lastActiveAt\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"DateTime\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false}],\"primaryKey\":null,\"uniqueFields\":[],\"uniqueIndexes\":[],\"isGenerated\":false},\"Team\":{\"dbName\":null,\"schema\":null,\"fields\":[{\"name\":\"id\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":true,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"String\",\"nativeType\":null,\"default\":{\"name\":\"uuid\",\"args\":[4]},\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"name\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":true,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"logo\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"leaderId\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":true,\"isId\":false,\"isReadOnly\":true,\"hasDefaultValue\":false,\"type\":\"String\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"createdAt\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"DateTime\",\"nativeType\":null,\"default\":{\"name\":\"now\",\"args\":[]},\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"activePlayers\",\"kind\":\"scalar\",\"isList\":true,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"inactivePlayers\",\"kind\":\"scalar\",\"isList\":true,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"leader\",\"kind\":\"object\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"User\",\"nativeType\":null,\"relationName\":\"TeamLeader\",\"relationFromFields\":[\"leaderId\"],\"relationToFields\":[\"steamId\"],\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"members\",\"kind\":\"object\",\"isList\":true,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"User\",\"nativeType\":null,\"relationName\":\"UserTeam\",\"relationFromFields\":[],\"relationToFields\":[],\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"invites\",\"kind\":\"object\",\"isList\":true,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"TeamInvite\",\"nativeType\":null,\"relationName\":\"TeamToTeamInvite\",\"relationFromFields\":[],\"relationToFields\":[],\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"matchPlayers\",\"kind\":\"object\",\"isList\":true,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"MatchPlayer\",\"nativeType\":null,\"relationName\":\"MatchPlayerToTeam\",\"relationFromFields\":[],\"relationToFields\":[],\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"matchesAsTeamA\",\"kind\":\"object\",\"isList\":true,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"Match\",\"nativeType\":null,\"relationName\":\"MatchTeamA\",\"relationFromFields\":[],\"relationToFields\":[],\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"matchesAsTeamB\",\"kind\":\"object\",\"isList\":true,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"Match\",\"nativeType\":null,\"relationName\":\"MatchTeamB\",\"relationFromFields\":[],\"relationToFields\":[],\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"schedulesAsTeamA\",\"kind\":\"object\",\"isList\":true,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"Schedule\",\"nativeType\":null,\"relationName\":\"ScheduleTeamA\",\"relationFromFields\":[],\"relationToFields\":[],\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"schedulesAsTeamB\",\"kind\":\"object\",\"isList\":true,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"Schedule\",\"nativeType\":null,\"relationName\":\"ScheduleTeamB\",\"relationFromFields\":[],\"relationToFields\":[],\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"mapVoteSteps\",\"kind\":\"object\",\"isList\":true,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"MapVoteStep\",\"nativeType\":null,\"relationName\":\"VoteStepTeam\",\"relationFromFields\":[],\"relationToFields\":[],\"isGenerated\":false,\"isUpdatedAt\":false}],\"primaryKey\":null,\"uniqueFields\":[],\"uniqueIndexes\":[],\"isGenerated\":false},\"TeamInvite\":{\"dbName\":null,\"schema\":null,\"fields\":[{\"name\":\"id\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":true,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"String\",\"nativeType\":null,\"default\":{\"name\":\"uuid\",\"args\":[4]},\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"steamId\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":true,\"hasDefaultValue\":false,\"type\":\"String\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"teamId\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":true,\"hasDefaultValue\":false,\"type\":\"String\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"type\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"createdAt\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"DateTime\",\"nativeType\":null,\"default\":{\"name\":\"now\",\"args\":[]},\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"user\",\"kind\":\"object\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"User\",\"nativeType\":null,\"relationName\":\"UserInvitations\",\"relationFromFields\":[\"steamId\"],\"relationToFields\":[\"steamId\"],\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"team\",\"kind\":\"object\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"Team\",\"nativeType\":null,\"relationName\":\"TeamToTeamInvite\",\"relationFromFields\":[\"teamId\"],\"relationToFields\":[\"id\"],\"isGenerated\":false,\"isUpdatedAt\":false}],\"primaryKey\":null,\"uniqueFields\":[],\"uniqueIndexes\":[],\"isGenerated\":false},\"Notification\":{\"dbName\":null,\"schema\":null,\"fields\":[{\"name\":\"id\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":true,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"String\",\"nativeType\":null,\"default\":{\"name\":\"uuid\",\"args\":[4]},\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"steamId\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":true,\"hasDefaultValue\":false,\"type\":\"String\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"title\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"message\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"read\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"Boolean\",\"nativeType\":null,\"default\":false,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"persistent\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"Boolean\",\"nativeType\":null,\"default\":false,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"actionType\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"actionData\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"createdAt\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"DateTime\",\"nativeType\":null,\"default\":{\"name\":\"now\",\"args\":[]},\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"user\",\"kind\":\"object\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"User\",\"nativeType\":null,\"relationName\":\"NotificationToUser\",\"relationFromFields\":[\"steamId\"],\"relationToFields\":[\"steamId\"],\"isGenerated\":false,\"isUpdatedAt\":false}],\"primaryKey\":null,\"uniqueFields\":[],\"uniqueIndexes\":[],\"isGenerated\":false},\"Match\":{\"dbName\":null,\"schema\":null,\"fields\":[{\"name\":\"id\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":true,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"String\",\"nativeType\":null,\"default\":{\"name\":\"uuid\",\"args\":[4]},\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"title\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"matchType\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"String\",\"nativeType\":null,\"default\":\"community\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"map\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"description\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"scoreA\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"Int\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"scoreB\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"Int\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"teamAId\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":true,\"hasDefaultValue\":false,\"type\":\"String\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"teamA\",\"kind\":\"object\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"Team\",\"nativeType\":null,\"relationName\":\"MatchTeamA\",\"relationFromFields\":[\"teamAId\"],\"relationToFields\":[\"id\"],\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"teamBId\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":true,\"hasDefaultValue\":false,\"type\":\"String\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"teamB\",\"kind\":\"object\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"Team\",\"nativeType\":null,\"relationName\":\"MatchTeamB\",\"relationFromFields\":[\"teamBId\"],\"relationToFields\":[\"id\"],\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"teamAUsers\",\"kind\":\"object\",\"isList\":true,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"User\",\"nativeType\":null,\"relationName\":\"TeamAPlayers\",\"relationFromFields\":[],\"relationToFields\":[],\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"teamBUsers\",\"kind\":\"object\",\"isList\":true,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"User\",\"nativeType\":null,\"relationName\":\"TeamBPlayers\",\"relationFromFields\":[],\"relationToFields\":[],\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"filePath\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"demoFile\",\"kind\":\"object\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"DemoFile\",\"nativeType\":null,\"relationName\":\"DemoFileToMatch\",\"relationFromFields\":[],\"relationToFields\":[],\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"demoDate\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"DateTime\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"demoData\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"Json\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"players\",\"kind\":\"object\",\"isList\":true,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"MatchPlayer\",\"nativeType\":null,\"relationName\":\"MatchToMatchPlayer\",\"relationFromFields\":[],\"relationToFields\":[],\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"rankUpdates\",\"kind\":\"object\",\"isList\":true,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"RankHistory\",\"nativeType\":null,\"relationName\":\"MatchRankHistory\",\"relationFromFields\":[],\"relationToFields\":[],\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"roundCount\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"Int\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"roundHistory\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"Json\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"winnerTeam\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"bestOf\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"Int\",\"nativeType\":null,\"default\":3,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"matchDate\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"DateTime\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"mapVote\",\"kind\":\"object\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"MapVote\",\"nativeType\":null,\"relationName\":\"MapVoteToMatch\",\"relationFromFields\":[],\"relationToFields\":[],\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"createdAt\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"DateTime\",\"nativeType\":null,\"default\":{\"name\":\"now\",\"args\":[]},\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"updatedAt\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"DateTime\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":true},{\"name\":\"schedule\",\"kind\":\"object\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"Schedule\",\"nativeType\":null,\"relationName\":\"MatchToSchedule\",\"relationFromFields\":[],\"relationToFields\":[],\"isGenerated\":false,\"isUpdatedAt\":false}],\"primaryKey\":null,\"uniqueFields\":[],\"uniqueIndexes\":[],\"isGenerated\":false},\"MatchPlayer\":{\"dbName\":null,\"schema\":null,\"fields\":[{\"name\":\"id\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":true,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"String\",\"nativeType\":null,\"default\":{\"name\":\"uuid\",\"args\":[4]},\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"steamId\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":true,\"hasDefaultValue\":false,\"type\":\"String\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"matchId\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":true,\"hasDefaultValue\":false,\"type\":\"String\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"teamId\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":true,\"hasDefaultValue\":false,\"type\":\"String\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"team\",\"kind\":\"object\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"Team\",\"nativeType\":null,\"relationName\":\"MatchPlayerToTeam\",\"relationFromFields\":[\"teamId\"],\"relationToFields\":[\"id\"],\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"match\",\"kind\":\"object\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"Match\",\"nativeType\":null,\"relationName\":\"MatchToMatchPlayer\",\"relationFromFields\":[\"matchId\"],\"relationToFields\":[\"id\"],\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"user\",\"kind\":\"object\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"User\",\"nativeType\":null,\"relationName\":\"MatchPlayerToUser\",\"relationFromFields\":[\"steamId\"],\"relationToFields\":[\"steamId\"],\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"stats\",\"kind\":\"object\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"PlayerStats\",\"nativeType\":null,\"relationName\":\"MatchPlayerToPlayerStats\",\"relationFromFields\":[],\"relationToFields\":[],\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"createdAt\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"DateTime\",\"nativeType\":null,\"default\":{\"name\":\"now\",\"args\":[]},\"isGenerated\":false,\"isUpdatedAt\":false}],\"primaryKey\":null,\"uniqueFields\":[[\"matchId\",\"steamId\"]],\"uniqueIndexes\":[{\"name\":null,\"fields\":[\"matchId\",\"steamId\"]}],\"isGenerated\":false},\"PlayerStats\":{\"dbName\":null,\"schema\":null,\"fields\":[{\"name\":\"id\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":true,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"String\",\"nativeType\":null,\"default\":{\"name\":\"uuid\",\"args\":[4]},\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"matchId\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":true,\"hasDefaultValue\":false,\"type\":\"String\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"steamId\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":true,\"hasDefaultValue\":false,\"type\":\"String\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"kills\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"Int\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"assists\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"Int\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"deaths\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"Int\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"headshotPct\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"Float\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"totalDamage\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"Float\",\"nativeType\":null,\"default\":0,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"utilityDamage\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"Int\",\"nativeType\":null,\"default\":0,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"flashAssists\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"Int\",\"nativeType\":null,\"default\":0,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"mvps\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"Int\",\"nativeType\":null,\"default\":0,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"mvpEliminations\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"Int\",\"nativeType\":null,\"default\":0,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"mvpDefuse\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"Int\",\"nativeType\":null,\"default\":0,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"mvpPlant\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"Int\",\"nativeType\":null,\"default\":0,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"knifeKills\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"Int\",\"nativeType\":null,\"default\":0,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"zeusKills\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"Int\",\"nativeType\":null,\"default\":0,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"wallbangKills\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"Int\",\"nativeType\":null,\"default\":0,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"smokeKills\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"Int\",\"nativeType\":null,\"default\":0,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"headshots\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"Int\",\"nativeType\":null,\"default\":0,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"noScopes\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"Int\",\"nativeType\":null,\"default\":0,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"blindKills\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"Int\",\"nativeType\":null,\"default\":0,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"aim\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"Int\",\"nativeType\":null,\"default\":0,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"oneK\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"Int\",\"nativeType\":null,\"default\":0,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"twoK\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"Int\",\"nativeType\":null,\"default\":0,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"threeK\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"Int\",\"nativeType\":null,\"default\":0,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"fourK\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"Int\",\"nativeType\":null,\"default\":0,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"fiveK\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"Int\",\"nativeType\":null,\"default\":0,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"rankOld\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"Int\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"rankNew\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"Int\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"rankChange\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"Int\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"winCount\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"Int\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"matchPlayer\",\"kind\":\"object\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"MatchPlayer\",\"nativeType\":null,\"relationName\":\"MatchPlayerToPlayerStats\",\"relationFromFields\":[\"matchId\",\"steamId\"],\"relationToFields\":[\"matchId\",\"steamId\"],\"isGenerated\":false,\"isUpdatedAt\":false}],\"primaryKey\":null,\"uniqueFields\":[[\"matchId\",\"steamId\"]],\"uniqueIndexes\":[{\"name\":null,\"fields\":[\"matchId\",\"steamId\"]}],\"isGenerated\":false},\"RankHistory\":{\"dbName\":null,\"schema\":null,\"fields\":[{\"name\":\"id\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":true,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"String\",\"nativeType\":null,\"default\":{\"name\":\"uuid\",\"args\":[4]},\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"steamId\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":true,\"hasDefaultValue\":false,\"type\":\"String\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"matchId\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":true,\"hasDefaultValue\":false,\"type\":\"String\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"rankOld\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"Int\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"rankNew\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"Int\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"delta\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"Int\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"winCount\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"Int\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"createdAt\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"DateTime\",\"nativeType\":null,\"default\":{\"name\":\"now\",\"args\":[]},\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"user\",\"kind\":\"object\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"User\",\"nativeType\":null,\"relationName\":\"UserRankHistory\",\"relationFromFields\":[\"steamId\"],\"relationToFields\":[\"steamId\"],\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"match\",\"kind\":\"object\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"Match\",\"nativeType\":null,\"relationName\":\"MatchRankHistory\",\"relationFromFields\":[\"matchId\"],\"relationToFields\":[\"id\"],\"isGenerated\":false,\"isUpdatedAt\":false}],\"primaryKey\":null,\"uniqueFields\":[],\"uniqueIndexes\":[],\"isGenerated\":false},\"Schedule\":{\"dbName\":null,\"schema\":null,\"fields\":[{\"name\":\"id\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":true,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"String\",\"nativeType\":null,\"default\":{\"name\":\"uuid\",\"args\":[4]},\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"title\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"description\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"map\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"date\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"DateTime\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"status\",\"kind\":\"enum\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"ScheduleStatus\",\"nativeType\":null,\"default\":\"PENDING\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"teamAId\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":true,\"hasDefaultValue\":false,\"type\":\"String\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"teamA\",\"kind\":\"object\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"Team\",\"nativeType\":null,\"relationName\":\"ScheduleTeamA\",\"relationFromFields\":[\"teamAId\"],\"relationToFields\":[\"id\"],\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"teamBId\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":true,\"hasDefaultValue\":false,\"type\":\"String\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"teamB\",\"kind\":\"object\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"Team\",\"nativeType\":null,\"relationName\":\"ScheduleTeamB\",\"relationFromFields\":[\"teamBId\"],\"relationToFields\":[\"id\"],\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"createdById\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":true,\"hasDefaultValue\":false,\"type\":\"String\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"createdBy\",\"kind\":\"object\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"User\",\"nativeType\":null,\"relationName\":\"CreatedSchedules\",\"relationFromFields\":[\"createdById\"],\"relationToFields\":[\"steamId\"],\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"confirmedById\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":true,\"hasDefaultValue\":false,\"type\":\"String\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"confirmedBy\",\"kind\":\"object\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"User\",\"nativeType\":null,\"relationName\":\"ConfirmedSchedules\",\"relationFromFields\":[\"confirmedById\"],\"relationToFields\":[\"steamId\"],\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"linkedMatchId\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":true,\"isId\":false,\"isReadOnly\":true,\"hasDefaultValue\":false,\"type\":\"String\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"linkedMatch\",\"kind\":\"object\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"Match\",\"nativeType\":null,\"relationName\":\"MatchToSchedule\",\"relationFromFields\":[\"linkedMatchId\"],\"relationToFields\":[\"id\"],\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"createdAt\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"DateTime\",\"nativeType\":null,\"default\":{\"name\":\"now\",\"args\":[]},\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"updatedAt\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"DateTime\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":true}],\"primaryKey\":null,\"uniqueFields\":[],\"uniqueIndexes\":[],\"isGenerated\":false},\"DemoFile\":{\"dbName\":null,\"schema\":null,\"fields\":[{\"name\":\"id\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":true,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"String\",\"nativeType\":null,\"default\":{\"name\":\"uuid\",\"args\":[4]},\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"matchId\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":true,\"isId\":false,\"isReadOnly\":true,\"hasDefaultValue\":false,\"type\":\"String\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"steamId\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":true,\"hasDefaultValue\":false,\"type\":\"String\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"fileName\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":true,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"filePath\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"parsed\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"Boolean\",\"nativeType\":null,\"default\":false,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"createdAt\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"DateTime\",\"nativeType\":null,\"default\":{\"name\":\"now\",\"args\":[]},\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"match\",\"kind\":\"object\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"Match\",\"nativeType\":null,\"relationName\":\"DemoFileToMatch\",\"relationFromFields\":[\"matchId\"],\"relationToFields\":[\"id\"],\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"user\",\"kind\":\"object\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"User\",\"nativeType\":null,\"relationName\":\"DemoFileToUser\",\"relationFromFields\":[\"steamId\"],\"relationToFields\":[\"steamId\"],\"isGenerated\":false,\"isUpdatedAt\":false}],\"primaryKey\":null,\"uniqueFields\":[],\"uniqueIndexes\":[],\"isGenerated\":false},\"ServerRequest\":{\"dbName\":null,\"schema\":null,\"fields\":[{\"name\":\"id\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":true,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"String\",\"nativeType\":null,\"default\":{\"name\":\"uuid\",\"args\":[4]},\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"steamId\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":true,\"hasDefaultValue\":false,\"type\":\"String\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"matchId\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"reservationId\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"BigInt\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"tvPort\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"BigInt\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"processed\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"Boolean\",\"nativeType\":null,\"default\":false,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"failed\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"Boolean\",\"nativeType\":null,\"default\":false,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"createdAt\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"DateTime\",\"nativeType\":null,\"default\":{\"name\":\"now\",\"args\":[]},\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"user\",\"kind\":\"object\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"User\",\"nativeType\":null,\"relationName\":\"MatchRequests\",\"relationFromFields\":[\"steamId\"],\"relationToFields\":[\"steamId\"],\"isGenerated\":false,\"isUpdatedAt\":false}],\"primaryKey\":null,\"uniqueFields\":[[\"steamId\",\"matchId\"]],\"uniqueIndexes\":[{\"name\":null,\"fields\":[\"steamId\",\"matchId\"]}],\"isGenerated\":false},\"MapVote\":{\"dbName\":null,\"schema\":null,\"fields\":[{\"name\":\"id\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":true,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"String\",\"nativeType\":null,\"default\":{\"name\":\"uuid\",\"args\":[4]},\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"matchId\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":true,\"isId\":false,\"isReadOnly\":true,\"hasDefaultValue\":false,\"type\":\"String\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"match\",\"kind\":\"object\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"Match\",\"nativeType\":null,\"relationName\":\"MapVoteToMatch\",\"relationFromFields\":[\"matchId\"],\"relationToFields\":[\"id\"],\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"bestOf\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"Int\",\"nativeType\":null,\"default\":3,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"mapPool\",\"kind\":\"scalar\",\"isList\":true,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"currentIdx\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"Int\",\"nativeType\":null,\"default\":0,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"locked\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"Boolean\",\"nativeType\":null,\"default\":false,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"opensAt\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"DateTime\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"adminEditingBy\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"adminEditingSince\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"DateTime\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"steps\",\"kind\":\"object\",\"isList\":true,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"MapVoteStep\",\"nativeType\":null,\"relationName\":\"MapVoteToMapVoteStep\",\"relationFromFields\":[],\"relationToFields\":[],\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"createdAt\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"DateTime\",\"nativeType\":null,\"default\":{\"name\":\"now\",\"args\":[]},\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"updatedAt\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"DateTime\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":true}],\"primaryKey\":null,\"uniqueFields\":[],\"uniqueIndexes\":[],\"isGenerated\":false},\"MapVoteStep\":{\"dbName\":null,\"schema\":null,\"fields\":[{\"name\":\"id\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":true,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"String\",\"nativeType\":null,\"default\":{\"name\":\"uuid\",\"args\":[4]},\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"voteId\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":true,\"hasDefaultValue\":false,\"type\":\"String\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"order\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"Int\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"action\",\"kind\":\"enum\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"MapVoteAction\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"teamId\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":true,\"hasDefaultValue\":false,\"type\":\"String\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"team\",\"kind\":\"object\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"Team\",\"nativeType\":null,\"relationName\":\"VoteStepTeam\",\"relationFromFields\":[\"teamId\"],\"relationToFields\":[\"id\"],\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"map\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"chosenAt\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"DateTime\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"chosenBy\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":true,\"hasDefaultValue\":false,\"type\":\"String\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"chooser\",\"kind\":\"object\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"User\",\"nativeType\":null,\"relationName\":\"VoteStepChooser\",\"relationFromFields\":[\"chosenBy\"],\"relationToFields\":[\"steamId\"],\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"vote\",\"kind\":\"object\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"MapVote\",\"nativeType\":null,\"relationName\":\"MapVoteToMapVoteStep\",\"relationFromFields\":[\"voteId\"],\"relationToFields\":[\"id\"],\"isGenerated\":false,\"isUpdatedAt\":false}],\"primaryKey\":null,\"uniqueFields\":[[\"voteId\",\"order\"]],\"uniqueIndexes\":[{\"name\":null,\"fields\":[\"voteId\",\"order\"]}],\"isGenerated\":false}},\"enums\":{\"UserStatus\":{\"values\":[{\"name\":\"online\",\"dbName\":null},{\"name\":\"away\",\"dbName\":null},{\"name\":\"offline\",\"dbName\":null}],\"dbName\":null},\"ScheduleStatus\":{\"values\":[{\"name\":\"PENDING\",\"dbName\":null},{\"name\":\"CONFIRMED\",\"dbName\":null},{\"name\":\"DECLINED\",\"dbName\":null},{\"name\":\"CANCELLED\",\"dbName\":null},{\"name\":\"COMPLETED\",\"dbName\":null}],\"dbName\":null},\"MapVoteAction\":{\"values\":[{\"name\":\"BAN\",\"dbName\":null},{\"name\":\"PICK\",\"dbName\":null},{\"name\":\"DECIDER\",\"dbName\":null}],\"dbName\":null}},\"types\":{}}") defineDmmfProperty(exports.Prisma, config.runtimeDataModel) config.engineWasm = undefined config.compilerWasm = undefined diff --git a/src/generated/prisma/index-browser.js b/src/generated/prisma/index-browser.js index 39bc898..055eb86 100644 --- a/src/generated/prisma/index-browser.js +++ b/src/generated/prisma/index-browser.js @@ -131,7 +131,9 @@ exports.Prisma.UserScalarFieldEnum = { authCode: 'authCode', lastKnownShareCode: 'lastKnownShareCode', lastKnownShareCodeDate: 'lastKnownShareCodeDate', - createdAt: 'createdAt' + createdAt: 'createdAt', + status: 'status', + lastActiveAt: 'lastActiveAt' }; exports.Prisma.TeamScalarFieldEnum = { @@ -326,6 +328,12 @@ exports.Prisma.JsonNullValueFilter = { JsonNull: Prisma.JsonNull, AnyNull: Prisma.AnyNull }; +exports.UserStatus = exports.$Enums.UserStatus = { + online: 'online', + away: 'away', + offline: 'offline' +}; + exports.ScheduleStatus = exports.$Enums.ScheduleStatus = { PENDING: 'PENDING', CONFIRMED: 'CONFIRMED', diff --git a/src/generated/prisma/index.d.ts b/src/generated/prisma/index.d.ts index d7c4ff7..56101e7 100644 --- a/src/generated/prisma/index.d.ts +++ b/src/generated/prisma/index.d.ts @@ -83,7 +83,16 @@ export type MapVoteStep = $Result.DefaultSelection * Enums */ export namespace $Enums { - export const ScheduleStatus: { + export const UserStatus: { + online: 'online', + away: 'away', + offline: 'offline' +}; + +export type UserStatus = (typeof UserStatus)[keyof typeof UserStatus] + + +export const ScheduleStatus: { PENDING: 'PENDING', CONFIRMED: 'CONFIRMED', DECLINED: 'DECLINED', @@ -104,6 +113,10 @@ export type MapVoteAction = (typeof MapVoteAction)[keyof typeof MapVoteAction] } +export type UserStatus = $Enums.UserStatus + +export const UserStatus: typeof $Enums.UserStatus + export type ScheduleStatus = $Enums.ScheduleStatus export const ScheduleStatus: typeof $Enums.ScheduleStatus @@ -2316,6 +2329,8 @@ export namespace Prisma { lastKnownShareCode: string | null lastKnownShareCodeDate: Date | null createdAt: Date | null + status: $Enums.UserStatus | null + lastActiveAt: Date | null } export type UserMaxAggregateOutputType = { @@ -2330,6 +2345,8 @@ export namespace Prisma { lastKnownShareCode: string | null lastKnownShareCodeDate: Date | null createdAt: Date | null + status: $Enums.UserStatus | null + lastActiveAt: Date | null } export type UserCountAggregateOutputType = { @@ -2344,6 +2361,8 @@ export namespace Prisma { lastKnownShareCode: number lastKnownShareCodeDate: number createdAt: number + status: number + lastActiveAt: number _all: number } @@ -2368,6 +2387,8 @@ export namespace Prisma { lastKnownShareCode?: true lastKnownShareCodeDate?: true createdAt?: true + status?: true + lastActiveAt?: true } export type UserMaxAggregateInputType = { @@ -2382,6 +2403,8 @@ export namespace Prisma { lastKnownShareCode?: true lastKnownShareCodeDate?: true createdAt?: true + status?: true + lastActiveAt?: true } export type UserCountAggregateInputType = { @@ -2396,6 +2419,8 @@ export namespace Prisma { lastKnownShareCode?: true lastKnownShareCodeDate?: true createdAt?: true + status?: true + lastActiveAt?: true _all?: true } @@ -2497,6 +2522,8 @@ export namespace Prisma { lastKnownShareCode: string | null lastKnownShareCodeDate: Date | null createdAt: Date + status: $Enums.UserStatus + lastActiveAt: Date | null _count: UserCountAggregateOutputType | null _avg: UserAvgAggregateOutputType | null _sum: UserSumAggregateOutputType | null @@ -2530,6 +2557,8 @@ export namespace Prisma { lastKnownShareCode?: boolean lastKnownShareCodeDate?: boolean createdAt?: boolean + status?: boolean + lastActiveAt?: boolean team?: boolean | User$teamArgs ledTeam?: boolean | User$ledTeamArgs matchesAsTeamA?: boolean | User$matchesAsTeamAArgs @@ -2558,6 +2587,8 @@ export namespace Prisma { lastKnownShareCode?: boolean lastKnownShareCodeDate?: boolean createdAt?: boolean + status?: boolean + lastActiveAt?: boolean team?: boolean | User$teamArgs }, ExtArgs["result"]["user"]> @@ -2573,6 +2604,8 @@ export namespace Prisma { lastKnownShareCode?: boolean lastKnownShareCodeDate?: boolean createdAt?: boolean + status?: boolean + lastActiveAt?: boolean team?: boolean | User$teamArgs }, ExtArgs["result"]["user"]> @@ -2588,9 +2621,11 @@ export namespace Prisma { lastKnownShareCode?: boolean lastKnownShareCodeDate?: boolean createdAt?: boolean + status?: boolean + lastActiveAt?: boolean } - export type UserOmit = $Extensions.GetOmit<"steamId" | "name" | "avatar" | "location" | "isAdmin" | "teamId" | "premierRank" | "authCode" | "lastKnownShareCode" | "lastKnownShareCodeDate" | "createdAt", ExtArgs["result"]["user"]> + export type UserOmit = $Extensions.GetOmit<"steamId" | "name" | "avatar" | "location" | "isAdmin" | "teamId" | "premierRank" | "authCode" | "lastKnownShareCode" | "lastKnownShareCodeDate" | "createdAt" | "status" | "lastActiveAt", ExtArgs["result"]["user"]> export type UserInclude = { team?: boolean | User$teamArgs ledTeam?: boolean | User$ledTeamArgs @@ -2643,6 +2678,8 @@ export namespace Prisma { lastKnownShareCode: string | null lastKnownShareCodeDate: Date | null createdAt: Date + status: $Enums.UserStatus + lastActiveAt: Date | null }, ExtArgs["result"]["user"]> composites: {} } @@ -3090,6 +3127,8 @@ export namespace Prisma { readonly lastKnownShareCode: FieldRef<"User", 'String'> readonly lastKnownShareCodeDate: FieldRef<"User", 'DateTime'> readonly createdAt: FieldRef<"User", 'DateTime'> + readonly status: FieldRef<"User", 'UserStatus'> + readonly lastActiveAt: FieldRef<"User", 'DateTime'> } @@ -18541,7 +18580,9 @@ export namespace Prisma { authCode: 'authCode', lastKnownShareCode: 'lastKnownShareCode', lastKnownShareCodeDate: 'lastKnownShareCodeDate', - createdAt: 'createdAt' + createdAt: 'createdAt', + status: 'status', + lastActiveAt: 'lastActiveAt' }; export type UserScalarFieldEnum = (typeof UserScalarFieldEnum)[keyof typeof UserScalarFieldEnum] @@ -18845,6 +18886,20 @@ export namespace Prisma { + /** + * Reference to a field of type 'UserStatus' + */ + export type EnumUserStatusFieldRefInput<$PrismaModel> = FieldRefInputType<$PrismaModel, 'UserStatus'> + + + + /** + * Reference to a field of type 'UserStatus[]' + */ + export type ListEnumUserStatusFieldRefInput<$PrismaModel> = FieldRefInputType<$PrismaModel, 'UserStatus[]'> + + + /** * Reference to a field of type 'Json' */ @@ -18933,6 +18988,8 @@ export namespace Prisma { lastKnownShareCode?: StringNullableFilter<"User"> | string | null lastKnownShareCodeDate?: DateTimeNullableFilter<"User"> | Date | string | null createdAt?: DateTimeFilter<"User"> | Date | string + status?: EnumUserStatusFilter<"User"> | $Enums.UserStatus + lastActiveAt?: DateTimeNullableFilter<"User"> | Date | string | null team?: XOR | null ledTeam?: XOR | null matchesAsTeamA?: MatchListRelationFilter @@ -18960,6 +19017,8 @@ export namespace Prisma { lastKnownShareCode?: SortOrderInput | SortOrder lastKnownShareCodeDate?: SortOrderInput | SortOrder createdAt?: SortOrder + status?: SortOrder + lastActiveAt?: SortOrderInput | SortOrder team?: TeamOrderByWithRelationInput ledTeam?: TeamOrderByWithRelationInput matchesAsTeamA?: MatchOrderByRelationAggregateInput @@ -18990,6 +19049,8 @@ export namespace Prisma { lastKnownShareCode?: StringNullableFilter<"User"> | string | null lastKnownShareCodeDate?: DateTimeNullableFilter<"User"> | Date | string | null createdAt?: DateTimeFilter<"User"> | Date | string + status?: EnumUserStatusFilter<"User"> | $Enums.UserStatus + lastActiveAt?: DateTimeNullableFilter<"User"> | Date | string | null team?: XOR | null ledTeam?: XOR | null matchesAsTeamA?: MatchListRelationFilter @@ -19017,6 +19078,8 @@ export namespace Prisma { lastKnownShareCode?: SortOrderInput | SortOrder lastKnownShareCodeDate?: SortOrderInput | SortOrder createdAt?: SortOrder + status?: SortOrder + lastActiveAt?: SortOrderInput | SortOrder _count?: UserCountOrderByAggregateInput _avg?: UserAvgOrderByAggregateInput _max?: UserMaxOrderByAggregateInput @@ -19039,6 +19102,8 @@ export namespace Prisma { lastKnownShareCode?: StringNullableWithAggregatesFilter<"User"> | string | null lastKnownShareCodeDate?: DateTimeNullableWithAggregatesFilter<"User"> | Date | string | null createdAt?: DateTimeWithAggregatesFilter<"User"> | Date | string + status?: EnumUserStatusWithAggregatesFilter<"User"> | $Enums.UserStatus + lastActiveAt?: DateTimeNullableWithAggregatesFilter<"User"> | Date | string | null } export type TeamWhereInput = { @@ -20170,6 +20235,8 @@ export namespace Prisma { lastKnownShareCode?: string | null lastKnownShareCodeDate?: Date | string | null createdAt?: Date | string + status?: $Enums.UserStatus + lastActiveAt?: Date | string | null team?: TeamCreateNestedOneWithoutMembersInput ledTeam?: TeamCreateNestedOneWithoutLeaderInput matchesAsTeamA?: MatchCreateNestedManyWithoutTeamAUsersInput @@ -20197,6 +20264,8 @@ export namespace Prisma { lastKnownShareCode?: string | null lastKnownShareCodeDate?: Date | string | null createdAt?: Date | string + status?: $Enums.UserStatus + lastActiveAt?: Date | string | null ledTeam?: TeamUncheckedCreateNestedOneWithoutLeaderInput matchesAsTeamA?: MatchUncheckedCreateNestedManyWithoutTeamAUsersInput matchesAsTeamB?: MatchUncheckedCreateNestedManyWithoutTeamBUsersInput @@ -20222,6 +20291,8 @@ export namespace Prisma { lastKnownShareCode?: NullableStringFieldUpdateOperationsInput | string | null lastKnownShareCodeDate?: NullableDateTimeFieldUpdateOperationsInput | Date | string | null createdAt?: DateTimeFieldUpdateOperationsInput | Date | string + status?: EnumUserStatusFieldUpdateOperationsInput | $Enums.UserStatus + lastActiveAt?: NullableDateTimeFieldUpdateOperationsInput | Date | string | null team?: TeamUpdateOneWithoutMembersNestedInput ledTeam?: TeamUpdateOneWithoutLeaderNestedInput matchesAsTeamA?: MatchUpdateManyWithoutTeamAUsersNestedInput @@ -20249,6 +20320,8 @@ export namespace Prisma { lastKnownShareCode?: NullableStringFieldUpdateOperationsInput | string | null lastKnownShareCodeDate?: NullableDateTimeFieldUpdateOperationsInput | Date | string | null createdAt?: DateTimeFieldUpdateOperationsInput | Date | string + status?: EnumUserStatusFieldUpdateOperationsInput | $Enums.UserStatus + lastActiveAt?: NullableDateTimeFieldUpdateOperationsInput | Date | string | null ledTeam?: TeamUncheckedUpdateOneWithoutLeaderNestedInput matchesAsTeamA?: MatchUncheckedUpdateManyWithoutTeamAUsersNestedInput matchesAsTeamB?: MatchUncheckedUpdateManyWithoutTeamBUsersNestedInput @@ -20275,6 +20348,8 @@ export namespace Prisma { lastKnownShareCode?: string | null lastKnownShareCodeDate?: Date | string | null createdAt?: Date | string + status?: $Enums.UserStatus + lastActiveAt?: Date | string | null } export type UserUpdateManyMutationInput = { @@ -20288,6 +20363,8 @@ export namespace Prisma { lastKnownShareCode?: NullableStringFieldUpdateOperationsInput | string | null lastKnownShareCodeDate?: NullableDateTimeFieldUpdateOperationsInput | Date | string | null createdAt?: DateTimeFieldUpdateOperationsInput | Date | string + status?: EnumUserStatusFieldUpdateOperationsInput | $Enums.UserStatus + lastActiveAt?: NullableDateTimeFieldUpdateOperationsInput | Date | string | null } export type UserUncheckedUpdateManyInput = { @@ -20302,6 +20379,8 @@ export namespace Prisma { lastKnownShareCode?: NullableStringFieldUpdateOperationsInput | string | null lastKnownShareCodeDate?: NullableDateTimeFieldUpdateOperationsInput | Date | string | null createdAt?: DateTimeFieldUpdateOperationsInput | Date | string + status?: EnumUserStatusFieldUpdateOperationsInput | $Enums.UserStatus + lastActiveAt?: NullableDateTimeFieldUpdateOperationsInput | Date | string | null } export type TeamCreateInput = { @@ -21582,6 +21661,13 @@ export namespace Prisma { not?: NestedDateTimeFilter<$PrismaModel> | Date | string } + export type EnumUserStatusFilter<$PrismaModel = never> = { + equals?: $Enums.UserStatus | EnumUserStatusFieldRefInput<$PrismaModel> + in?: $Enums.UserStatus[] | ListEnumUserStatusFieldRefInput<$PrismaModel> + notIn?: $Enums.UserStatus[] | ListEnumUserStatusFieldRefInput<$PrismaModel> + not?: NestedEnumUserStatusFilter<$PrismaModel> | $Enums.UserStatus + } + export type TeamNullableScalarRelationFilter = { is?: TeamWhereInput | null isNot?: TeamWhereInput | null @@ -21694,6 +21780,8 @@ export namespace Prisma { lastKnownShareCode?: SortOrder lastKnownShareCodeDate?: SortOrder createdAt?: SortOrder + status?: SortOrder + lastActiveAt?: SortOrder } export type UserAvgOrderByAggregateInput = { @@ -21712,6 +21800,8 @@ export namespace Prisma { lastKnownShareCode?: SortOrder lastKnownShareCodeDate?: SortOrder createdAt?: SortOrder + status?: SortOrder + lastActiveAt?: SortOrder } export type UserMinOrderByAggregateInput = { @@ -21726,6 +21816,8 @@ export namespace Prisma { lastKnownShareCode?: SortOrder lastKnownShareCodeDate?: SortOrder createdAt?: SortOrder + status?: SortOrder + lastActiveAt?: SortOrder } export type UserSumOrderByAggregateInput = { @@ -21820,6 +21912,16 @@ export namespace Prisma { _max?: NestedDateTimeFilter<$PrismaModel> } + export type EnumUserStatusWithAggregatesFilter<$PrismaModel = never> = { + equals?: $Enums.UserStatus | EnumUserStatusFieldRefInput<$PrismaModel> + in?: $Enums.UserStatus[] | ListEnumUserStatusFieldRefInput<$PrismaModel> + notIn?: $Enums.UserStatus[] | ListEnumUserStatusFieldRefInput<$PrismaModel> + not?: NestedEnumUserStatusWithAggregatesFilter<$PrismaModel> | $Enums.UserStatus + _count?: NestedIntFilter<$PrismaModel> + _min?: NestedEnumUserStatusFilter<$PrismaModel> + _max?: NestedEnumUserStatusFilter<$PrismaModel> + } + export type StringNullableListFilter<$PrismaModel = never> = { equals?: string[] | ListStringFieldRefInput<$PrismaModel> | null has?: string | StringFieldRefInput<$PrismaModel> | null @@ -22882,6 +22984,10 @@ export namespace Prisma { set?: Date | string } + export type EnumUserStatusFieldUpdateOperationsInput = { + set?: $Enums.UserStatus + } + export type TeamUpdateOneWithoutMembersNestedInput = { create?: XOR connectOrCreate?: TeamCreateOrConnectWithoutMembersInput @@ -24365,6 +24471,13 @@ export namespace Prisma { not?: NestedDateTimeFilter<$PrismaModel> | Date | string } + export type NestedEnumUserStatusFilter<$PrismaModel = never> = { + equals?: $Enums.UserStatus | EnumUserStatusFieldRefInput<$PrismaModel> + in?: $Enums.UserStatus[] | ListEnumUserStatusFieldRefInput<$PrismaModel> + notIn?: $Enums.UserStatus[] | ListEnumUserStatusFieldRefInput<$PrismaModel> + not?: NestedEnumUserStatusFilter<$PrismaModel> | $Enums.UserStatus + } + export type NestedStringWithAggregatesFilter<$PrismaModel = never> = { equals?: string | StringFieldRefInput<$PrismaModel> in?: string[] | ListStringFieldRefInput<$PrismaModel> @@ -24472,6 +24585,16 @@ export namespace Prisma { _min?: NestedDateTimeFilter<$PrismaModel> _max?: NestedDateTimeFilter<$PrismaModel> } + + export type NestedEnumUserStatusWithAggregatesFilter<$PrismaModel = never> = { + equals?: $Enums.UserStatus | EnumUserStatusFieldRefInput<$PrismaModel> + in?: $Enums.UserStatus[] | ListEnumUserStatusFieldRefInput<$PrismaModel> + notIn?: $Enums.UserStatus[] | ListEnumUserStatusFieldRefInput<$PrismaModel> + not?: NestedEnumUserStatusWithAggregatesFilter<$PrismaModel> | $Enums.UserStatus + _count?: NestedIntFilter<$PrismaModel> + _min?: NestedEnumUserStatusFilter<$PrismaModel> + _max?: NestedEnumUserStatusFilter<$PrismaModel> + } export type NestedJsonNullableFilter<$PrismaModel = never> = | PatchUndefined< Either>, Exclude>, 'path'>>, @@ -25493,6 +25616,8 @@ export namespace Prisma { lastKnownShareCode?: string | null lastKnownShareCodeDate?: Date | string | null createdAt?: Date | string + status?: $Enums.UserStatus + lastActiveAt?: Date | string | null team?: TeamCreateNestedOneWithoutMembersInput matchesAsTeamA?: MatchCreateNestedManyWithoutTeamAUsersInput matchesAsTeamB?: MatchCreateNestedManyWithoutTeamBUsersInput @@ -25519,6 +25644,8 @@ export namespace Prisma { lastKnownShareCode?: string | null lastKnownShareCodeDate?: Date | string | null createdAt?: Date | string + status?: $Enums.UserStatus + lastActiveAt?: Date | string | null matchesAsTeamA?: MatchUncheckedCreateNestedManyWithoutTeamAUsersInput matchesAsTeamB?: MatchUncheckedCreateNestedManyWithoutTeamBUsersInput invites?: TeamInviteUncheckedCreateNestedManyWithoutUserInput @@ -25548,6 +25675,8 @@ export namespace Prisma { lastKnownShareCode?: string | null lastKnownShareCodeDate?: Date | string | null createdAt?: Date | string + status?: $Enums.UserStatus + lastActiveAt?: Date | string | null ledTeam?: TeamCreateNestedOneWithoutLeaderInput matchesAsTeamA?: MatchCreateNestedManyWithoutTeamAUsersInput matchesAsTeamB?: MatchCreateNestedManyWithoutTeamBUsersInput @@ -25573,6 +25702,8 @@ export namespace Prisma { lastKnownShareCode?: string | null lastKnownShareCodeDate?: Date | string | null createdAt?: Date | string + status?: $Enums.UserStatus + lastActiveAt?: Date | string | null ledTeam?: TeamUncheckedCreateNestedOneWithoutLeaderInput matchesAsTeamA?: MatchUncheckedCreateNestedManyWithoutTeamAUsersInput matchesAsTeamB?: MatchUncheckedCreateNestedManyWithoutTeamBUsersInput @@ -25911,6 +26042,8 @@ export namespace Prisma { lastKnownShareCode?: NullableStringFieldUpdateOperationsInput | string | null lastKnownShareCodeDate?: NullableDateTimeFieldUpdateOperationsInput | Date | string | null createdAt?: DateTimeFieldUpdateOperationsInput | Date | string + status?: EnumUserStatusFieldUpdateOperationsInput | $Enums.UserStatus + lastActiveAt?: NullableDateTimeFieldUpdateOperationsInput | Date | string | null team?: TeamUpdateOneWithoutMembersNestedInput matchesAsTeamA?: MatchUpdateManyWithoutTeamAUsersNestedInput matchesAsTeamB?: MatchUpdateManyWithoutTeamBUsersNestedInput @@ -25937,6 +26070,8 @@ export namespace Prisma { lastKnownShareCode?: NullableStringFieldUpdateOperationsInput | string | null lastKnownShareCodeDate?: NullableDateTimeFieldUpdateOperationsInput | Date | string | null createdAt?: DateTimeFieldUpdateOperationsInput | Date | string + status?: EnumUserStatusFieldUpdateOperationsInput | $Enums.UserStatus + lastActiveAt?: NullableDateTimeFieldUpdateOperationsInput | Date | string | null matchesAsTeamA?: MatchUncheckedUpdateManyWithoutTeamAUsersNestedInput matchesAsTeamB?: MatchUncheckedUpdateManyWithoutTeamBUsersNestedInput invites?: TeamInviteUncheckedUpdateManyWithoutUserNestedInput @@ -25981,6 +26116,8 @@ export namespace Prisma { lastKnownShareCode?: StringNullableFilter<"User"> | string | null lastKnownShareCodeDate?: DateTimeNullableFilter<"User"> | Date | string | null createdAt?: DateTimeFilter<"User"> | Date | string + status?: EnumUserStatusFilter<"User"> | $Enums.UserStatus + lastActiveAt?: DateTimeNullableFilter<"User"> | Date | string | null } export type TeamInviteUpsertWithWhereUniqueWithoutTeamInput = { @@ -26106,6 +26243,8 @@ export namespace Prisma { lastKnownShareCode?: string | null lastKnownShareCodeDate?: Date | string | null createdAt?: Date | string + status?: $Enums.UserStatus + lastActiveAt?: Date | string | null team?: TeamCreateNestedOneWithoutMembersInput ledTeam?: TeamCreateNestedOneWithoutLeaderInput matchesAsTeamA?: MatchCreateNestedManyWithoutTeamAUsersInput @@ -26132,6 +26271,8 @@ export namespace Prisma { lastKnownShareCode?: string | null lastKnownShareCodeDate?: Date | string | null createdAt?: Date | string + status?: $Enums.UserStatus + lastActiveAt?: Date | string | null ledTeam?: TeamUncheckedCreateNestedOneWithoutLeaderInput matchesAsTeamA?: MatchUncheckedCreateNestedManyWithoutTeamAUsersInput matchesAsTeamB?: MatchUncheckedCreateNestedManyWithoutTeamBUsersInput @@ -26211,6 +26352,8 @@ export namespace Prisma { lastKnownShareCode?: NullableStringFieldUpdateOperationsInput | string | null lastKnownShareCodeDate?: NullableDateTimeFieldUpdateOperationsInput | Date | string | null createdAt?: DateTimeFieldUpdateOperationsInput | Date | string + status?: EnumUserStatusFieldUpdateOperationsInput | $Enums.UserStatus + lastActiveAt?: NullableDateTimeFieldUpdateOperationsInput | Date | string | null team?: TeamUpdateOneWithoutMembersNestedInput ledTeam?: TeamUpdateOneWithoutLeaderNestedInput matchesAsTeamA?: MatchUpdateManyWithoutTeamAUsersNestedInput @@ -26237,6 +26380,8 @@ export namespace Prisma { lastKnownShareCode?: NullableStringFieldUpdateOperationsInput | string | null lastKnownShareCodeDate?: NullableDateTimeFieldUpdateOperationsInput | Date | string | null createdAt?: DateTimeFieldUpdateOperationsInput | Date | string + status?: EnumUserStatusFieldUpdateOperationsInput | $Enums.UserStatus + lastActiveAt?: NullableDateTimeFieldUpdateOperationsInput | Date | string | null ledTeam?: TeamUncheckedUpdateOneWithoutLeaderNestedInput matchesAsTeamA?: MatchUncheckedUpdateManyWithoutTeamAUsersNestedInput matchesAsTeamB?: MatchUncheckedUpdateManyWithoutTeamBUsersNestedInput @@ -26306,6 +26451,8 @@ export namespace Prisma { lastKnownShareCode?: string | null lastKnownShareCodeDate?: Date | string | null createdAt?: Date | string + status?: $Enums.UserStatus + lastActiveAt?: Date | string | null team?: TeamCreateNestedOneWithoutMembersInput ledTeam?: TeamCreateNestedOneWithoutLeaderInput matchesAsTeamA?: MatchCreateNestedManyWithoutTeamAUsersInput @@ -26332,6 +26479,8 @@ export namespace Prisma { lastKnownShareCode?: string | null lastKnownShareCodeDate?: Date | string | null createdAt?: Date | string + status?: $Enums.UserStatus + lastActiveAt?: Date | string | null ledTeam?: TeamUncheckedCreateNestedOneWithoutLeaderInput matchesAsTeamA?: MatchUncheckedCreateNestedManyWithoutTeamAUsersInput matchesAsTeamB?: MatchUncheckedCreateNestedManyWithoutTeamBUsersInput @@ -26372,6 +26521,8 @@ export namespace Prisma { lastKnownShareCode?: NullableStringFieldUpdateOperationsInput | string | null lastKnownShareCodeDate?: NullableDateTimeFieldUpdateOperationsInput | Date | string | null createdAt?: DateTimeFieldUpdateOperationsInput | Date | string + status?: EnumUserStatusFieldUpdateOperationsInput | $Enums.UserStatus + lastActiveAt?: NullableDateTimeFieldUpdateOperationsInput | Date | string | null team?: TeamUpdateOneWithoutMembersNestedInput ledTeam?: TeamUpdateOneWithoutLeaderNestedInput matchesAsTeamA?: MatchUpdateManyWithoutTeamAUsersNestedInput @@ -26398,6 +26549,8 @@ export namespace Prisma { lastKnownShareCode?: NullableStringFieldUpdateOperationsInput | string | null lastKnownShareCodeDate?: NullableDateTimeFieldUpdateOperationsInput | Date | string | null createdAt?: DateTimeFieldUpdateOperationsInput | Date | string + status?: EnumUserStatusFieldUpdateOperationsInput | $Enums.UserStatus + lastActiveAt?: NullableDateTimeFieldUpdateOperationsInput | Date | string | null ledTeam?: TeamUncheckedUpdateOneWithoutLeaderNestedInput matchesAsTeamA?: MatchUncheckedUpdateManyWithoutTeamAUsersNestedInput matchesAsTeamB?: MatchUncheckedUpdateManyWithoutTeamBUsersNestedInput @@ -26500,6 +26653,8 @@ export namespace Prisma { lastKnownShareCode?: string | null lastKnownShareCodeDate?: Date | string | null createdAt?: Date | string + status?: $Enums.UserStatus + lastActiveAt?: Date | string | null team?: TeamCreateNestedOneWithoutMembersInput ledTeam?: TeamCreateNestedOneWithoutLeaderInput matchesAsTeamB?: MatchCreateNestedManyWithoutTeamBUsersInput @@ -26526,6 +26681,8 @@ export namespace Prisma { lastKnownShareCode?: string | null lastKnownShareCodeDate?: Date | string | null createdAt?: Date | string + status?: $Enums.UserStatus + lastActiveAt?: Date | string | null ledTeam?: TeamUncheckedCreateNestedOneWithoutLeaderInput matchesAsTeamB?: MatchUncheckedCreateNestedManyWithoutTeamBUsersInput invites?: TeamInviteUncheckedCreateNestedManyWithoutUserInput @@ -26555,6 +26712,8 @@ export namespace Prisma { lastKnownShareCode?: string | null lastKnownShareCodeDate?: Date | string | null createdAt?: Date | string + status?: $Enums.UserStatus + lastActiveAt?: Date | string | null team?: TeamCreateNestedOneWithoutMembersInput ledTeam?: TeamCreateNestedOneWithoutLeaderInput matchesAsTeamA?: MatchCreateNestedManyWithoutTeamAUsersInput @@ -26581,6 +26740,8 @@ export namespace Prisma { lastKnownShareCode?: string | null lastKnownShareCodeDate?: Date | string | null createdAt?: Date | string + status?: $Enums.UserStatus + lastActiveAt?: Date | string | null ledTeam?: TeamUncheckedCreateNestedOneWithoutLeaderInput matchesAsTeamA?: MatchUncheckedCreateNestedManyWithoutTeamAUsersInput invites?: TeamInviteUncheckedCreateNestedManyWithoutUserInput @@ -27120,6 +27281,8 @@ export namespace Prisma { lastKnownShareCode?: string | null lastKnownShareCodeDate?: Date | string | null createdAt?: Date | string + status?: $Enums.UserStatus + lastActiveAt?: Date | string | null team?: TeamCreateNestedOneWithoutMembersInput ledTeam?: TeamCreateNestedOneWithoutLeaderInput matchesAsTeamA?: MatchCreateNestedManyWithoutTeamAUsersInput @@ -27146,6 +27309,8 @@ export namespace Prisma { lastKnownShareCode?: string | null lastKnownShareCodeDate?: Date | string | null createdAt?: Date | string + status?: $Enums.UserStatus + lastActiveAt?: Date | string | null ledTeam?: TeamUncheckedCreateNestedOneWithoutLeaderInput matchesAsTeamA?: MatchUncheckedCreateNestedManyWithoutTeamAUsersInput matchesAsTeamB?: MatchUncheckedCreateNestedManyWithoutTeamBUsersInput @@ -27367,6 +27532,8 @@ export namespace Prisma { lastKnownShareCode?: NullableStringFieldUpdateOperationsInput | string | null lastKnownShareCodeDate?: NullableDateTimeFieldUpdateOperationsInput | Date | string | null createdAt?: DateTimeFieldUpdateOperationsInput | Date | string + status?: EnumUserStatusFieldUpdateOperationsInput | $Enums.UserStatus + lastActiveAt?: NullableDateTimeFieldUpdateOperationsInput | Date | string | null team?: TeamUpdateOneWithoutMembersNestedInput ledTeam?: TeamUpdateOneWithoutLeaderNestedInput matchesAsTeamA?: MatchUpdateManyWithoutTeamAUsersNestedInput @@ -27393,6 +27560,8 @@ export namespace Prisma { lastKnownShareCode?: NullableStringFieldUpdateOperationsInput | string | null lastKnownShareCodeDate?: NullableDateTimeFieldUpdateOperationsInput | Date | string | null createdAt?: DateTimeFieldUpdateOperationsInput | Date | string + status?: EnumUserStatusFieldUpdateOperationsInput | $Enums.UserStatus + lastActiveAt?: NullableDateTimeFieldUpdateOperationsInput | Date | string | null ledTeam?: TeamUncheckedUpdateOneWithoutLeaderNestedInput matchesAsTeamA?: MatchUncheckedUpdateManyWithoutTeamAUsersNestedInput matchesAsTeamB?: MatchUncheckedUpdateManyWithoutTeamBUsersNestedInput @@ -27540,6 +27709,8 @@ export namespace Prisma { lastKnownShareCode?: string | null lastKnownShareCodeDate?: Date | string | null createdAt?: Date | string + status?: $Enums.UserStatus + lastActiveAt?: Date | string | null team?: TeamCreateNestedOneWithoutMembersInput ledTeam?: TeamCreateNestedOneWithoutLeaderInput matchesAsTeamA?: MatchCreateNestedManyWithoutTeamAUsersInput @@ -27566,6 +27737,8 @@ export namespace Prisma { lastKnownShareCode?: string | null lastKnownShareCodeDate?: Date | string | null createdAt?: Date | string + status?: $Enums.UserStatus + lastActiveAt?: Date | string | null ledTeam?: TeamUncheckedCreateNestedOneWithoutLeaderInput matchesAsTeamA?: MatchUncheckedCreateNestedManyWithoutTeamAUsersInput matchesAsTeamB?: MatchUncheckedCreateNestedManyWithoutTeamBUsersInput @@ -27667,6 +27840,8 @@ export namespace Prisma { lastKnownShareCode?: NullableStringFieldUpdateOperationsInput | string | null lastKnownShareCodeDate?: NullableDateTimeFieldUpdateOperationsInput | Date | string | null createdAt?: DateTimeFieldUpdateOperationsInput | Date | string + status?: EnumUserStatusFieldUpdateOperationsInput | $Enums.UserStatus + lastActiveAt?: NullableDateTimeFieldUpdateOperationsInput | Date | string | null team?: TeamUpdateOneWithoutMembersNestedInput ledTeam?: TeamUpdateOneWithoutLeaderNestedInput matchesAsTeamA?: MatchUpdateManyWithoutTeamAUsersNestedInput @@ -27693,6 +27868,8 @@ export namespace Prisma { lastKnownShareCode?: NullableStringFieldUpdateOperationsInput | string | null lastKnownShareCodeDate?: NullableDateTimeFieldUpdateOperationsInput | Date | string | null createdAt?: DateTimeFieldUpdateOperationsInput | Date | string + status?: EnumUserStatusFieldUpdateOperationsInput | $Enums.UserStatus + lastActiveAt?: NullableDateTimeFieldUpdateOperationsInput | Date | string | null ledTeam?: TeamUncheckedUpdateOneWithoutLeaderNestedInput matchesAsTeamA?: MatchUncheckedUpdateManyWithoutTeamAUsersNestedInput matchesAsTeamB?: MatchUncheckedUpdateManyWithoutTeamBUsersNestedInput @@ -27862,6 +28039,8 @@ export namespace Prisma { lastKnownShareCode?: string | null lastKnownShareCodeDate?: Date | string | null createdAt?: Date | string + status?: $Enums.UserStatus + lastActiveAt?: Date | string | null team?: TeamCreateNestedOneWithoutMembersInput ledTeam?: TeamCreateNestedOneWithoutLeaderInput matchesAsTeamA?: MatchCreateNestedManyWithoutTeamAUsersInput @@ -27888,6 +28067,8 @@ export namespace Prisma { lastKnownShareCode?: string | null lastKnownShareCodeDate?: Date | string | null createdAt?: Date | string + status?: $Enums.UserStatus + lastActiveAt?: Date | string | null ledTeam?: TeamUncheckedCreateNestedOneWithoutLeaderInput matchesAsTeamA?: MatchUncheckedCreateNestedManyWithoutTeamAUsersInput matchesAsTeamB?: MatchUncheckedCreateNestedManyWithoutTeamBUsersInput @@ -27917,6 +28098,8 @@ export namespace Prisma { lastKnownShareCode?: string | null lastKnownShareCodeDate?: Date | string | null createdAt?: Date | string + status?: $Enums.UserStatus + lastActiveAt?: Date | string | null team?: TeamCreateNestedOneWithoutMembersInput ledTeam?: TeamCreateNestedOneWithoutLeaderInput matchesAsTeamA?: MatchCreateNestedManyWithoutTeamAUsersInput @@ -27943,6 +28126,8 @@ export namespace Prisma { lastKnownShareCode?: string | null lastKnownShareCodeDate?: Date | string | null createdAt?: Date | string + status?: $Enums.UserStatus + lastActiveAt?: Date | string | null ledTeam?: TeamUncheckedCreateNestedOneWithoutLeaderInput matchesAsTeamA?: MatchUncheckedCreateNestedManyWithoutTeamAUsersInput matchesAsTeamB?: MatchUncheckedCreateNestedManyWithoutTeamBUsersInput @@ -28134,6 +28319,8 @@ export namespace Prisma { lastKnownShareCode?: NullableStringFieldUpdateOperationsInput | string | null lastKnownShareCodeDate?: NullableDateTimeFieldUpdateOperationsInput | Date | string | null createdAt?: DateTimeFieldUpdateOperationsInput | Date | string + status?: EnumUserStatusFieldUpdateOperationsInput | $Enums.UserStatus + lastActiveAt?: NullableDateTimeFieldUpdateOperationsInput | Date | string | null team?: TeamUpdateOneWithoutMembersNestedInput ledTeam?: TeamUpdateOneWithoutLeaderNestedInput matchesAsTeamA?: MatchUpdateManyWithoutTeamAUsersNestedInput @@ -28160,6 +28347,8 @@ export namespace Prisma { lastKnownShareCode?: NullableStringFieldUpdateOperationsInput | string | null lastKnownShareCodeDate?: NullableDateTimeFieldUpdateOperationsInput | Date | string | null createdAt?: DateTimeFieldUpdateOperationsInput | Date | string + status?: EnumUserStatusFieldUpdateOperationsInput | $Enums.UserStatus + lastActiveAt?: NullableDateTimeFieldUpdateOperationsInput | Date | string | null ledTeam?: TeamUncheckedUpdateOneWithoutLeaderNestedInput matchesAsTeamA?: MatchUncheckedUpdateManyWithoutTeamAUsersNestedInput matchesAsTeamB?: MatchUncheckedUpdateManyWithoutTeamBUsersNestedInput @@ -28195,6 +28384,8 @@ export namespace Prisma { lastKnownShareCode?: NullableStringFieldUpdateOperationsInput | string | null lastKnownShareCodeDate?: NullableDateTimeFieldUpdateOperationsInput | Date | string | null createdAt?: DateTimeFieldUpdateOperationsInput | Date | string + status?: EnumUserStatusFieldUpdateOperationsInput | $Enums.UserStatus + lastActiveAt?: NullableDateTimeFieldUpdateOperationsInput | Date | string | null team?: TeamUpdateOneWithoutMembersNestedInput ledTeam?: TeamUpdateOneWithoutLeaderNestedInput matchesAsTeamA?: MatchUpdateManyWithoutTeamAUsersNestedInput @@ -28221,6 +28412,8 @@ export namespace Prisma { lastKnownShareCode?: NullableStringFieldUpdateOperationsInput | string | null lastKnownShareCodeDate?: NullableDateTimeFieldUpdateOperationsInput | Date | string | null createdAt?: DateTimeFieldUpdateOperationsInput | Date | string + status?: EnumUserStatusFieldUpdateOperationsInput | $Enums.UserStatus + lastActiveAt?: NullableDateTimeFieldUpdateOperationsInput | Date | string | null ledTeam?: TeamUncheckedUpdateOneWithoutLeaderNestedInput matchesAsTeamA?: MatchUncheckedUpdateManyWithoutTeamAUsersNestedInput matchesAsTeamB?: MatchUncheckedUpdateManyWithoutTeamBUsersNestedInput @@ -28373,6 +28566,8 @@ export namespace Prisma { lastKnownShareCode?: string | null lastKnownShareCodeDate?: Date | string | null createdAt?: Date | string + status?: $Enums.UserStatus + lastActiveAt?: Date | string | null team?: TeamCreateNestedOneWithoutMembersInput ledTeam?: TeamCreateNestedOneWithoutLeaderInput matchesAsTeamA?: MatchCreateNestedManyWithoutTeamAUsersInput @@ -28399,6 +28594,8 @@ export namespace Prisma { lastKnownShareCode?: string | null lastKnownShareCodeDate?: Date | string | null createdAt?: Date | string + status?: $Enums.UserStatus + lastActiveAt?: Date | string | null ledTeam?: TeamUncheckedCreateNestedOneWithoutLeaderInput matchesAsTeamA?: MatchUncheckedCreateNestedManyWithoutTeamAUsersInput matchesAsTeamB?: MatchUncheckedCreateNestedManyWithoutTeamBUsersInput @@ -28506,6 +28703,8 @@ export namespace Prisma { lastKnownShareCode?: NullableStringFieldUpdateOperationsInput | string | null lastKnownShareCodeDate?: NullableDateTimeFieldUpdateOperationsInput | Date | string | null createdAt?: DateTimeFieldUpdateOperationsInput | Date | string + status?: EnumUserStatusFieldUpdateOperationsInput | $Enums.UserStatus + lastActiveAt?: NullableDateTimeFieldUpdateOperationsInput | Date | string | null team?: TeamUpdateOneWithoutMembersNestedInput ledTeam?: TeamUpdateOneWithoutLeaderNestedInput matchesAsTeamA?: MatchUpdateManyWithoutTeamAUsersNestedInput @@ -28532,6 +28731,8 @@ export namespace Prisma { lastKnownShareCode?: NullableStringFieldUpdateOperationsInput | string | null lastKnownShareCodeDate?: NullableDateTimeFieldUpdateOperationsInput | Date | string | null createdAt?: DateTimeFieldUpdateOperationsInput | Date | string + status?: EnumUserStatusFieldUpdateOperationsInput | $Enums.UserStatus + lastActiveAt?: NullableDateTimeFieldUpdateOperationsInput | Date | string | null ledTeam?: TeamUncheckedUpdateOneWithoutLeaderNestedInput matchesAsTeamA?: MatchUncheckedUpdateManyWithoutTeamAUsersNestedInput matchesAsTeamB?: MatchUncheckedUpdateManyWithoutTeamBUsersNestedInput @@ -28556,6 +28757,8 @@ export namespace Prisma { lastKnownShareCode?: string | null lastKnownShareCodeDate?: Date | string | null createdAt?: Date | string + status?: $Enums.UserStatus + lastActiveAt?: Date | string | null team?: TeamCreateNestedOneWithoutMembersInput ledTeam?: TeamCreateNestedOneWithoutLeaderInput matchesAsTeamA?: MatchCreateNestedManyWithoutTeamAUsersInput @@ -28582,6 +28785,8 @@ export namespace Prisma { lastKnownShareCode?: string | null lastKnownShareCodeDate?: Date | string | null createdAt?: Date | string + status?: $Enums.UserStatus + lastActiveAt?: Date | string | null ledTeam?: TeamUncheckedCreateNestedOneWithoutLeaderInput matchesAsTeamA?: MatchUncheckedCreateNestedManyWithoutTeamAUsersInput matchesAsTeamB?: MatchUncheckedCreateNestedManyWithoutTeamBUsersInput @@ -28622,6 +28827,8 @@ export namespace Prisma { lastKnownShareCode?: NullableStringFieldUpdateOperationsInput | string | null lastKnownShareCodeDate?: NullableDateTimeFieldUpdateOperationsInput | Date | string | null createdAt?: DateTimeFieldUpdateOperationsInput | Date | string + status?: EnumUserStatusFieldUpdateOperationsInput | $Enums.UserStatus + lastActiveAt?: NullableDateTimeFieldUpdateOperationsInput | Date | string | null team?: TeamUpdateOneWithoutMembersNestedInput ledTeam?: TeamUpdateOneWithoutLeaderNestedInput matchesAsTeamA?: MatchUpdateManyWithoutTeamAUsersNestedInput @@ -28648,6 +28855,8 @@ export namespace Prisma { lastKnownShareCode?: NullableStringFieldUpdateOperationsInput | string | null lastKnownShareCodeDate?: NullableDateTimeFieldUpdateOperationsInput | Date | string | null createdAt?: DateTimeFieldUpdateOperationsInput | Date | string + status?: EnumUserStatusFieldUpdateOperationsInput | $Enums.UserStatus + lastActiveAt?: NullableDateTimeFieldUpdateOperationsInput | Date | string | null ledTeam?: TeamUncheckedUpdateOneWithoutLeaderNestedInput matchesAsTeamA?: MatchUncheckedUpdateManyWithoutTeamAUsersNestedInput matchesAsTeamB?: MatchUncheckedUpdateManyWithoutTeamBUsersNestedInput @@ -28885,6 +29094,8 @@ export namespace Prisma { lastKnownShareCode?: string | null lastKnownShareCodeDate?: Date | string | null createdAt?: Date | string + status?: $Enums.UserStatus + lastActiveAt?: Date | string | null team?: TeamCreateNestedOneWithoutMembersInput ledTeam?: TeamCreateNestedOneWithoutLeaderInput matchesAsTeamA?: MatchCreateNestedManyWithoutTeamAUsersInput @@ -28911,6 +29122,8 @@ export namespace Prisma { lastKnownShareCode?: string | null lastKnownShareCodeDate?: Date | string | null createdAt?: Date | string + status?: $Enums.UserStatus + lastActiveAt?: Date | string | null ledTeam?: TeamUncheckedCreateNestedOneWithoutLeaderInput matchesAsTeamA?: MatchUncheckedCreateNestedManyWithoutTeamAUsersInput matchesAsTeamB?: MatchUncheckedCreateNestedManyWithoutTeamBUsersInput @@ -29029,6 +29242,8 @@ export namespace Prisma { lastKnownShareCode?: NullableStringFieldUpdateOperationsInput | string | null lastKnownShareCodeDate?: NullableDateTimeFieldUpdateOperationsInput | Date | string | null createdAt?: DateTimeFieldUpdateOperationsInput | Date | string + status?: EnumUserStatusFieldUpdateOperationsInput | $Enums.UserStatus + lastActiveAt?: NullableDateTimeFieldUpdateOperationsInput | Date | string | null team?: TeamUpdateOneWithoutMembersNestedInput ledTeam?: TeamUpdateOneWithoutLeaderNestedInput matchesAsTeamA?: MatchUpdateManyWithoutTeamAUsersNestedInput @@ -29055,6 +29270,8 @@ export namespace Prisma { lastKnownShareCode?: NullableStringFieldUpdateOperationsInput | string | null lastKnownShareCodeDate?: NullableDateTimeFieldUpdateOperationsInput | Date | string | null createdAt?: DateTimeFieldUpdateOperationsInput | Date | string + status?: EnumUserStatusFieldUpdateOperationsInput | $Enums.UserStatus + lastActiveAt?: NullableDateTimeFieldUpdateOperationsInput | Date | string | null ledTeam?: TeamUncheckedUpdateOneWithoutLeaderNestedInput matchesAsTeamA?: MatchUncheckedUpdateManyWithoutTeamAUsersNestedInput matchesAsTeamB?: MatchUncheckedUpdateManyWithoutTeamBUsersNestedInput @@ -29652,6 +29869,8 @@ export namespace Prisma { lastKnownShareCode?: string | null lastKnownShareCodeDate?: Date | string | null createdAt?: Date | string + status?: $Enums.UserStatus + lastActiveAt?: Date | string | null } export type TeamInviteCreateManyTeamInput = { @@ -29761,6 +29980,8 @@ export namespace Prisma { lastKnownShareCode?: NullableStringFieldUpdateOperationsInput | string | null lastKnownShareCodeDate?: NullableDateTimeFieldUpdateOperationsInput | Date | string | null createdAt?: DateTimeFieldUpdateOperationsInput | Date | string + status?: EnumUserStatusFieldUpdateOperationsInput | $Enums.UserStatus + lastActiveAt?: NullableDateTimeFieldUpdateOperationsInput | Date | string | null ledTeam?: TeamUpdateOneWithoutLeaderNestedInput matchesAsTeamA?: MatchUpdateManyWithoutTeamAUsersNestedInput matchesAsTeamB?: MatchUpdateManyWithoutTeamBUsersNestedInput @@ -29786,6 +30007,8 @@ export namespace Prisma { lastKnownShareCode?: NullableStringFieldUpdateOperationsInput | string | null lastKnownShareCodeDate?: NullableDateTimeFieldUpdateOperationsInput | Date | string | null createdAt?: DateTimeFieldUpdateOperationsInput | Date | string + status?: EnumUserStatusFieldUpdateOperationsInput | $Enums.UserStatus + lastActiveAt?: NullableDateTimeFieldUpdateOperationsInput | Date | string | null ledTeam?: TeamUncheckedUpdateOneWithoutLeaderNestedInput matchesAsTeamA?: MatchUncheckedUpdateManyWithoutTeamAUsersNestedInput matchesAsTeamB?: MatchUncheckedUpdateManyWithoutTeamBUsersNestedInput @@ -29811,6 +30034,8 @@ export namespace Prisma { lastKnownShareCode?: NullableStringFieldUpdateOperationsInput | string | null lastKnownShareCodeDate?: NullableDateTimeFieldUpdateOperationsInput | Date | string | null createdAt?: DateTimeFieldUpdateOperationsInput | Date | string + status?: EnumUserStatusFieldUpdateOperationsInput | $Enums.UserStatus + lastActiveAt?: NullableDateTimeFieldUpdateOperationsInput | Date | string | null } export type TeamInviteUpdateWithoutTeamInput = { @@ -30159,6 +30384,8 @@ export namespace Prisma { lastKnownShareCode?: NullableStringFieldUpdateOperationsInput | string | null lastKnownShareCodeDate?: NullableDateTimeFieldUpdateOperationsInput | Date | string | null createdAt?: DateTimeFieldUpdateOperationsInput | Date | string + status?: EnumUserStatusFieldUpdateOperationsInput | $Enums.UserStatus + lastActiveAt?: NullableDateTimeFieldUpdateOperationsInput | Date | string | null team?: TeamUpdateOneWithoutMembersNestedInput ledTeam?: TeamUpdateOneWithoutLeaderNestedInput matchesAsTeamB?: MatchUpdateManyWithoutTeamBUsersNestedInput @@ -30185,6 +30412,8 @@ export namespace Prisma { lastKnownShareCode?: NullableStringFieldUpdateOperationsInput | string | null lastKnownShareCodeDate?: NullableDateTimeFieldUpdateOperationsInput | Date | string | null createdAt?: DateTimeFieldUpdateOperationsInput | Date | string + status?: EnumUserStatusFieldUpdateOperationsInput | $Enums.UserStatus + lastActiveAt?: NullableDateTimeFieldUpdateOperationsInput | Date | string | null ledTeam?: TeamUncheckedUpdateOneWithoutLeaderNestedInput matchesAsTeamB?: MatchUncheckedUpdateManyWithoutTeamBUsersNestedInput invites?: TeamInviteUncheckedUpdateManyWithoutUserNestedInput @@ -30210,6 +30439,8 @@ export namespace Prisma { lastKnownShareCode?: NullableStringFieldUpdateOperationsInput | string | null lastKnownShareCodeDate?: NullableDateTimeFieldUpdateOperationsInput | Date | string | null createdAt?: DateTimeFieldUpdateOperationsInput | Date | string + status?: EnumUserStatusFieldUpdateOperationsInput | $Enums.UserStatus + lastActiveAt?: NullableDateTimeFieldUpdateOperationsInput | Date | string | null } export type UserUpdateWithoutMatchesAsTeamBInput = { @@ -30223,6 +30454,8 @@ export namespace Prisma { lastKnownShareCode?: NullableStringFieldUpdateOperationsInput | string | null lastKnownShareCodeDate?: NullableDateTimeFieldUpdateOperationsInput | Date | string | null createdAt?: DateTimeFieldUpdateOperationsInput | Date | string + status?: EnumUserStatusFieldUpdateOperationsInput | $Enums.UserStatus + lastActiveAt?: NullableDateTimeFieldUpdateOperationsInput | Date | string | null team?: TeamUpdateOneWithoutMembersNestedInput ledTeam?: TeamUpdateOneWithoutLeaderNestedInput matchesAsTeamA?: MatchUpdateManyWithoutTeamAUsersNestedInput @@ -30249,6 +30482,8 @@ export namespace Prisma { lastKnownShareCode?: NullableStringFieldUpdateOperationsInput | string | null lastKnownShareCodeDate?: NullableDateTimeFieldUpdateOperationsInput | Date | string | null createdAt?: DateTimeFieldUpdateOperationsInput | Date | string + status?: EnumUserStatusFieldUpdateOperationsInput | $Enums.UserStatus + lastActiveAt?: NullableDateTimeFieldUpdateOperationsInput | Date | string | null ledTeam?: TeamUncheckedUpdateOneWithoutLeaderNestedInput matchesAsTeamA?: MatchUncheckedUpdateManyWithoutTeamAUsersNestedInput invites?: TeamInviteUncheckedUpdateManyWithoutUserNestedInput @@ -30274,6 +30509,8 @@ export namespace Prisma { lastKnownShareCode?: NullableStringFieldUpdateOperationsInput | string | null lastKnownShareCodeDate?: NullableDateTimeFieldUpdateOperationsInput | Date | string | null createdAt?: DateTimeFieldUpdateOperationsInput | Date | string + status?: EnumUserStatusFieldUpdateOperationsInput | $Enums.UserStatus + lastActiveAt?: NullableDateTimeFieldUpdateOperationsInput | Date | string | null } export type MatchPlayerUpdateWithoutMatchInput = { diff --git a/src/generated/prisma/index.js b/src/generated/prisma/index.js index 04e0183..a9c4901 100644 --- a/src/generated/prisma/index.js +++ b/src/generated/prisma/index.js @@ -104,7 +104,9 @@ exports.Prisma.UserScalarFieldEnum = { authCode: 'authCode', lastKnownShareCode: 'lastKnownShareCode', lastKnownShareCodeDate: 'lastKnownShareCodeDate', - createdAt: 'createdAt' + createdAt: 'createdAt', + status: 'status', + lastActiveAt: 'lastActiveAt' }; exports.Prisma.TeamScalarFieldEnum = { @@ -299,6 +301,12 @@ exports.Prisma.JsonNullValueFilter = { JsonNull: Prisma.JsonNull, AnyNull: Prisma.AnyNull }; +exports.UserStatus = exports.$Enums.UserStatus = { + online: 'online', + away: 'away', + offline: 'offline' +}; + exports.ScheduleStatus = exports.$Enums.ScheduleStatus = { PENDING: 'PENDING', CONFIRMED: 'CONFIRMED', @@ -339,7 +347,7 @@ const config = { "value": "prisma-client-js" }, "output": { - "value": "C:\\Users\\Rother\\fork\\ironie-nextjs\\src\\generated\\prisma", + "value": "C:\\Users\\Chris\\fork\\ironie-nextjs\\src\\generated\\prisma", "fromEnvVar": null }, "config": { @@ -353,7 +361,7 @@ const config = { } ], "previewFeatures": [], - "sourceFilePath": "C:\\Users\\Rother\\fork\\ironie-nextjs\\prisma\\schema.prisma", + "sourceFilePath": "C:\\Users\\Chris\\fork\\ironie-nextjs\\prisma\\schema.prisma", "isCustomOutput": true }, "relativeEnvPaths": { @@ -375,8 +383,8 @@ const config = { } } }, - "inlineSchema": "generator client {\n provider = \"prisma-client-js\"\n output = \"../src/generated/prisma\"\n}\n\ndatasource db {\n provider = \"postgresql\"\n url = env(\"DATABASE_URL\")\n}\n\n//\n// ──────────────────────────────────────────────\n// 🧑 Benutzer, Teams & Verwaltung\n// ──────────────────────────────────────────────\n//\n\nmodel User {\n steamId String @id\n name String?\n avatar String?\n location String?\n isAdmin Boolean @default(false)\n\n teamId String?\n team Team? @relation(\"UserTeam\", fields: [teamId], references: [id])\n ledTeam Team? @relation(\"TeamLeader\")\n\n matchesAsTeamA Match[] @relation(\"TeamAPlayers\")\n matchesAsTeamB Match[] @relation(\"TeamBPlayers\")\n\n premierRank Int?\n authCode String?\n lastKnownShareCode String?\n lastKnownShareCodeDate DateTime?\n createdAt DateTime @default(now())\n\n invites TeamInvite[] @relation(\"UserInvitations\")\n notifications Notification[]\n matchPlayers MatchPlayer[]\n serverRequests ServerRequest[] @relation(\"MatchRequests\")\n rankHistory RankHistory[] @relation(\"UserRankHistory\")\n demoFiles DemoFile[]\n\n createdSchedules Schedule[] @relation(\"CreatedSchedules\")\n confirmedSchedules Schedule[] @relation(\"ConfirmedSchedules\")\n\n mapVoteChoices MapVoteStep[] @relation(\"VoteStepChooser\")\n}\n\nmodel Team {\n id String @id @default(uuid())\n name String @unique\n logo String?\n leaderId String? @unique\n createdAt DateTime @default(now())\n\n activePlayers String[]\n inactivePlayers String[]\n\n leader User? @relation(\"TeamLeader\", fields: [leaderId], references: [steamId])\n members User[] @relation(\"UserTeam\")\n invites TeamInvite[]\n matchPlayers MatchPlayer[]\n\n matchesAsTeamA Match[] @relation(\"MatchTeamA\")\n matchesAsTeamB Match[] @relation(\"MatchTeamB\")\n\n schedulesAsTeamA Schedule[] @relation(\"ScheduleTeamA\")\n schedulesAsTeamB Schedule[] @relation(\"ScheduleTeamB\")\n\n mapVoteSteps MapVoteStep[] @relation(\"VoteStepTeam\")\n}\n\nmodel TeamInvite {\n id String @id @default(uuid())\n steamId String\n teamId String\n type String\n createdAt DateTime @default(now())\n\n user User @relation(\"UserInvitations\", fields: [steamId], references: [steamId])\n team Team @relation(fields: [teamId], references: [id])\n}\n\nmodel Notification {\n id String @id @default(uuid())\n steamId String\n title String?\n message String\n read Boolean @default(false)\n persistent Boolean @default(false)\n actionType String?\n actionData String?\n createdAt DateTime @default(now())\n\n user User @relation(fields: [steamId], references: [steamId])\n}\n\n//\n// ──────────────────────────────────────────────\n// 🎮 Matches & Spieler\n// ──────────────────────────────────────────────\n//\n\n// ──────────────────────────────────────────────\n// 🎮 Matches\n// ──────────────────────────────────────────────\n\nmodel Match {\n id String @id @default(uuid())\n title String\n matchType String @default(\"community\")\n map String?\n description String?\n scoreA Int?\n scoreB Int?\n\n teamAId String?\n teamA Team? @relation(\"MatchTeamA\", fields: [teamAId], references: [id])\n\n teamBId String?\n teamB Team? @relation(\"MatchTeamB\", fields: [teamBId], references: [id])\n\n teamAUsers User[] @relation(\"TeamAPlayers\")\n teamBUsers User[] @relation(\"TeamBPlayers\")\n\n filePath String?\n demoFile DemoFile?\n demoDate DateTime?\n demoData Json?\n\n players MatchPlayer[]\n rankUpdates RankHistory[] @relation(\"MatchRankHistory\")\n\n roundCount Int?\n roundHistory Json?\n winnerTeam String?\n\n bestOf Int @default(3) // 1 | 3 | 5 – app-seitig validieren\n matchDate DateTime? // geplante Startzeit (separat von demoDate)\n mapVote MapVote?\n\n createdAt DateTime @default(now())\n updatedAt DateTime @updatedAt\n\n schedule Schedule?\n}\n\nmodel MatchPlayer {\n id String @id @default(uuid())\n steamId String\n matchId String\n teamId String?\n team Team? @relation(fields: [teamId], references: [id])\n\n match Match @relation(fields: [matchId], references: [id])\n user User @relation(fields: [steamId], references: [steamId])\n\n stats PlayerStats?\n\n createdAt DateTime @default(now())\n\n @@unique([matchId, steamId])\n}\n\nmodel PlayerStats {\n id String @id @default(uuid())\n matchId String\n steamId String\n\n kills Int\n assists Int\n deaths Int\n headshotPct Float\n\n totalDamage Float @default(0)\n utilityDamage Int @default(0)\n flashAssists Int @default(0)\n mvps Int @default(0)\n mvpEliminations Int @default(0)\n mvpDefuse Int @default(0)\n mvpPlant Int @default(0)\n knifeKills Int @default(0)\n zeusKills Int @default(0)\n wallbangKills Int @default(0)\n smokeKills Int @default(0)\n headshots Int @default(0)\n noScopes Int @default(0)\n blindKills Int @default(0)\n\n aim Int @default(0)\n\n oneK Int @default(0)\n twoK Int @default(0)\n threeK Int @default(0)\n fourK Int @default(0)\n fiveK Int @default(0)\n\n rankOld Int?\n rankNew Int?\n rankChange Int?\n winCount Int?\n\n matchPlayer MatchPlayer @relation(fields: [matchId, steamId], references: [matchId, steamId])\n\n @@unique([matchId, steamId])\n}\n\nmodel RankHistory {\n id String @id @default(uuid())\n steamId String\n matchId String?\n\n rankOld Int\n rankNew Int\n delta Int\n winCount Int\n\n createdAt DateTime @default(now())\n\n user User @relation(\"UserRankHistory\", fields: [steamId], references: [steamId])\n match Match? @relation(\"MatchRankHistory\", fields: [matchId], references: [id])\n}\n\nmodel Schedule {\n id String @id @default(uuid())\n title String\n description String?\n map String?\n date DateTime\n status ScheduleStatus @default(PENDING)\n\n teamAId String?\n teamA Team? @relation(\"ScheduleTeamA\", fields: [teamAId], references: [id])\n\n teamBId String?\n teamB Team? @relation(\"ScheduleTeamB\", fields: [teamBId], references: [id])\n\n createdById String\n createdBy User @relation(\"CreatedSchedules\", fields: [createdById], references: [steamId])\n\n confirmedById String?\n confirmedBy User? @relation(\"ConfirmedSchedules\", fields: [confirmedById], references: [steamId])\n\n linkedMatchId String? @unique\n linkedMatch Match? @relation(fields: [linkedMatchId], references: [id])\n\n createdAt DateTime @default(now())\n updatedAt DateTime @updatedAt\n}\n\nenum ScheduleStatus {\n PENDING\n CONFIRMED\n DECLINED\n CANCELLED\n COMPLETED\n}\n\n//\n// ──────────────────────────────────────────────\n// 📦 Demo-Dateien & CS2 Requests\n// ──────────────────────────────────────────────\n//\n\nmodel DemoFile {\n id String @id @default(uuid())\n matchId String @unique\n steamId String\n fileName String @unique\n filePath String\n parsed Boolean @default(false)\n\n createdAt DateTime @default(now())\n\n match Match @relation(fields: [matchId], references: [id])\n user User @relation(fields: [steamId], references: [steamId])\n}\n\nmodel ServerRequest {\n id String @id @default(uuid())\n steamId String\n matchId String\n reservationId BigInt\n tvPort BigInt\n processed Boolean @default(false)\n failed Boolean @default(false)\n\n createdAt DateTime @default(now())\n\n user User @relation(\"MatchRequests\", fields: [steamId], references: [steamId])\n\n @@unique([steamId, matchId])\n}\n\n// ──────────────────────────────────────────────\n// 🗺️ Map-Vote\n// ──────────────────────────────────────────────\n\nenum MapVoteAction {\n BAN\n PICK\n DECIDER\n}\n\nmodel MapVote {\n id String @id @default(uuid())\n matchId String @unique\n match Match @relation(fields: [matchId], references: [id])\n\n bestOf Int @default(3)\n mapPool String[]\n currentIdx Int @default(0)\n locked Boolean @default(false)\n opensAt DateTime?\n\n adminEditingBy String?\n adminEditingSince DateTime?\n\n steps MapVoteStep[]\n\n createdAt DateTime @default(now())\n updatedAt DateTime @updatedAt\n}\n\nmodel MapVoteStep {\n id String @id @default(uuid())\n voteId String\n order Int\n action MapVoteAction\n\n teamId String?\n team Team? @relation(\"VoteStepTeam\", fields: [teamId], references: [id])\n\n map String?\n chosenAt DateTime?\n chosenBy String?\n chooser User? @relation(\"VoteStepChooser\", fields: [chosenBy], references: [steamId])\n\n vote MapVote @relation(fields: [voteId], references: [id])\n\n @@unique([voteId, order])\n @@index([teamId])\n @@index([chosenBy])\n}\n", - "inlineSchemaHash": "6a3173f8873b8732ce0374e908c46c28a2f778a9616d63160597fb24c88535e2", + "inlineSchema": "generator client {\n provider = \"prisma-client-js\"\n output = \"../src/generated/prisma\"\n}\n\ndatasource db {\n provider = \"postgresql\"\n url = env(\"DATABASE_URL\")\n}\n\n//\n// ──────────────────────────────────────────────\n// 🧑 Benutzer, Teams & Verwaltung\n// ──────────────────────────────────────────────\n//\n\nmodel User {\n steamId String @id\n name String?\n avatar String?\n location String?\n isAdmin Boolean @default(false)\n\n teamId String?\n team Team? @relation(\"UserTeam\", fields: [teamId], references: [id])\n ledTeam Team? @relation(\"TeamLeader\")\n\n matchesAsTeamA Match[] @relation(\"TeamAPlayers\")\n matchesAsTeamB Match[] @relation(\"TeamBPlayers\")\n\n premierRank Int?\n authCode String?\n lastKnownShareCode String?\n lastKnownShareCodeDate DateTime?\n createdAt DateTime @default(now())\n\n invites TeamInvite[] @relation(\"UserInvitations\")\n notifications Notification[]\n matchPlayers MatchPlayer[]\n serverRequests ServerRequest[] @relation(\"MatchRequests\")\n rankHistory RankHistory[] @relation(\"UserRankHistory\")\n demoFiles DemoFile[]\n\n createdSchedules Schedule[] @relation(\"CreatedSchedules\")\n confirmedSchedules Schedule[] @relation(\"ConfirmedSchedules\")\n\n mapVoteChoices MapVoteStep[] @relation(\"VoteStepChooser\")\n\n status UserStatus @default(offline) // 👈 neu\n lastActiveAt DateTime? // optional: wann zuletzt aktiv\n}\n\nenum UserStatus {\n online\n away\n offline\n}\n\nmodel Team {\n id String @id @default(uuid())\n name String @unique\n logo String?\n leaderId String? @unique\n createdAt DateTime @default(now())\n\n activePlayers String[]\n inactivePlayers String[]\n\n leader User? @relation(\"TeamLeader\", fields: [leaderId], references: [steamId])\n members User[] @relation(\"UserTeam\")\n invites TeamInvite[]\n matchPlayers MatchPlayer[]\n\n matchesAsTeamA Match[] @relation(\"MatchTeamA\")\n matchesAsTeamB Match[] @relation(\"MatchTeamB\")\n\n schedulesAsTeamA Schedule[] @relation(\"ScheduleTeamA\")\n schedulesAsTeamB Schedule[] @relation(\"ScheduleTeamB\")\n\n mapVoteSteps MapVoteStep[] @relation(\"VoteStepTeam\")\n}\n\nmodel TeamInvite {\n id String @id @default(uuid())\n steamId String\n teamId String\n type String\n createdAt DateTime @default(now())\n\n user User @relation(\"UserInvitations\", fields: [steamId], references: [steamId])\n team Team @relation(fields: [teamId], references: [id])\n}\n\nmodel Notification {\n id String @id @default(uuid())\n steamId String\n title String?\n message String\n read Boolean @default(false)\n persistent Boolean @default(false)\n actionType String?\n actionData String?\n createdAt DateTime @default(now())\n\n user User @relation(fields: [steamId], references: [steamId])\n}\n\n//\n// ──────────────────────────────────────────────\n// 🎮 Matches & Spieler\n// ──────────────────────────────────────────────\n//\n\n// ──────────────────────────────────────────────\n// 🎮 Matches\n// ──────────────────────────────────────────────\n\nmodel Match {\n id String @id @default(uuid())\n title String\n matchType String @default(\"community\")\n map String?\n description String?\n scoreA Int?\n scoreB Int?\n\n teamAId String?\n teamA Team? @relation(\"MatchTeamA\", fields: [teamAId], references: [id])\n\n teamBId String?\n teamB Team? @relation(\"MatchTeamB\", fields: [teamBId], references: [id])\n\n teamAUsers User[] @relation(\"TeamAPlayers\")\n teamBUsers User[] @relation(\"TeamBPlayers\")\n\n filePath String?\n demoFile DemoFile?\n demoDate DateTime?\n demoData Json?\n\n players MatchPlayer[]\n rankUpdates RankHistory[] @relation(\"MatchRankHistory\")\n\n roundCount Int?\n roundHistory Json?\n winnerTeam String?\n\n bestOf Int @default(3) // 1 | 3 | 5 – app-seitig validieren\n matchDate DateTime? // geplante Startzeit (separat von demoDate)\n mapVote MapVote?\n\n createdAt DateTime @default(now())\n updatedAt DateTime @updatedAt\n\n schedule Schedule?\n}\n\nmodel MatchPlayer {\n id String @id @default(uuid())\n steamId String\n matchId String\n teamId String?\n team Team? @relation(fields: [teamId], references: [id])\n\n match Match @relation(fields: [matchId], references: [id])\n user User @relation(fields: [steamId], references: [steamId])\n\n stats PlayerStats?\n\n createdAt DateTime @default(now())\n\n @@unique([matchId, steamId])\n}\n\nmodel PlayerStats {\n id String @id @default(uuid())\n matchId String\n steamId String\n\n kills Int\n assists Int\n deaths Int\n headshotPct Float\n\n totalDamage Float @default(0)\n utilityDamage Int @default(0)\n flashAssists Int @default(0)\n mvps Int @default(0)\n mvpEliminations Int @default(0)\n mvpDefuse Int @default(0)\n mvpPlant Int @default(0)\n knifeKills Int @default(0)\n zeusKills Int @default(0)\n wallbangKills Int @default(0)\n smokeKills Int @default(0)\n headshots Int @default(0)\n noScopes Int @default(0)\n blindKills Int @default(0)\n\n aim Int @default(0)\n\n oneK Int @default(0)\n twoK Int @default(0)\n threeK Int @default(0)\n fourK Int @default(0)\n fiveK Int @default(0)\n\n rankOld Int?\n rankNew Int?\n rankChange Int?\n winCount Int?\n\n matchPlayer MatchPlayer @relation(fields: [matchId, steamId], references: [matchId, steamId])\n\n @@unique([matchId, steamId])\n}\n\nmodel RankHistory {\n id String @id @default(uuid())\n steamId String\n matchId String?\n\n rankOld Int\n rankNew Int\n delta Int\n winCount Int\n\n createdAt DateTime @default(now())\n\n user User @relation(\"UserRankHistory\", fields: [steamId], references: [steamId])\n match Match? @relation(\"MatchRankHistory\", fields: [matchId], references: [id])\n}\n\nmodel Schedule {\n id String @id @default(uuid())\n title String\n description String?\n map String?\n date DateTime\n status ScheduleStatus @default(PENDING)\n\n teamAId String?\n teamA Team? @relation(\"ScheduleTeamA\", fields: [teamAId], references: [id])\n\n teamBId String?\n teamB Team? @relation(\"ScheduleTeamB\", fields: [teamBId], references: [id])\n\n createdById String\n createdBy User @relation(\"CreatedSchedules\", fields: [createdById], references: [steamId])\n\n confirmedById String?\n confirmedBy User? @relation(\"ConfirmedSchedules\", fields: [confirmedById], references: [steamId])\n\n linkedMatchId String? @unique\n linkedMatch Match? @relation(fields: [linkedMatchId], references: [id])\n\n createdAt DateTime @default(now())\n updatedAt DateTime @updatedAt\n}\n\nenum ScheduleStatus {\n PENDING\n CONFIRMED\n DECLINED\n CANCELLED\n COMPLETED\n}\n\n//\n// ──────────────────────────────────────────────\n// 📦 Demo-Dateien & CS2 Requests\n// ──────────────────────────────────────────────\n//\n\nmodel DemoFile {\n id String @id @default(uuid())\n matchId String @unique\n steamId String\n fileName String @unique\n filePath String\n parsed Boolean @default(false)\n\n createdAt DateTime @default(now())\n\n match Match @relation(fields: [matchId], references: [id])\n user User @relation(fields: [steamId], references: [steamId])\n}\n\nmodel ServerRequest {\n id String @id @default(uuid())\n steamId String\n matchId String\n reservationId BigInt\n tvPort BigInt\n processed Boolean @default(false)\n failed Boolean @default(false)\n\n createdAt DateTime @default(now())\n\n user User @relation(\"MatchRequests\", fields: [steamId], references: [steamId])\n\n @@unique([steamId, matchId])\n}\n\n// ──────────────────────────────────────────────\n// 🗺️ Map-Vote\n// ──────────────────────────────────────────────\n\nenum MapVoteAction {\n BAN\n PICK\n DECIDER\n}\n\nmodel MapVote {\n id String @id @default(uuid())\n matchId String @unique\n match Match @relation(fields: [matchId], references: [id])\n\n bestOf Int @default(3)\n mapPool String[]\n currentIdx Int @default(0)\n locked Boolean @default(false)\n opensAt DateTime?\n\n adminEditingBy String?\n adminEditingSince DateTime?\n\n steps MapVoteStep[]\n\n createdAt DateTime @default(now())\n updatedAt DateTime @updatedAt\n}\n\nmodel MapVoteStep {\n id String @id @default(uuid())\n voteId String\n order Int\n action MapVoteAction\n\n teamId String?\n team Team? @relation(\"VoteStepTeam\", fields: [teamId], references: [id])\n\n map String?\n chosenAt DateTime?\n chosenBy String?\n chooser User? @relation(\"VoteStepChooser\", fields: [chosenBy], references: [steamId])\n\n vote MapVote @relation(fields: [voteId], references: [id])\n\n @@unique([voteId, order])\n @@index([teamId])\n @@index([chosenBy])\n}\n", + "inlineSchemaHash": "8a515788915caf6a9807424781c3f79de8f69f7d4971b7e0d4fbdd71cf03d57e", "copyEngine": true } @@ -397,7 +405,7 @@ if (!fs.existsSync(path.join(__dirname, 'schema.prisma'))) { config.isBundled = true } -config.runtimeDataModel = JSON.parse("{\"models\":{\"User\":{\"dbName\":null,\"schema\":null,\"fields\":[{\"name\":\"steamId\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":true,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"name\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"avatar\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"location\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"isAdmin\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"Boolean\",\"nativeType\":null,\"default\":false,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"teamId\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":true,\"hasDefaultValue\":false,\"type\":\"String\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"team\",\"kind\":\"object\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"Team\",\"nativeType\":null,\"relationName\":\"UserTeam\",\"relationFromFields\":[\"teamId\"],\"relationToFields\":[\"id\"],\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"ledTeam\",\"kind\":\"object\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"Team\",\"nativeType\":null,\"relationName\":\"TeamLeader\",\"relationFromFields\":[],\"relationToFields\":[],\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"matchesAsTeamA\",\"kind\":\"object\",\"isList\":true,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"Match\",\"nativeType\":null,\"relationName\":\"TeamAPlayers\",\"relationFromFields\":[],\"relationToFields\":[],\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"matchesAsTeamB\",\"kind\":\"object\",\"isList\":true,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"Match\",\"nativeType\":null,\"relationName\":\"TeamBPlayers\",\"relationFromFields\":[],\"relationToFields\":[],\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"premierRank\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"Int\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"authCode\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"lastKnownShareCode\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"lastKnownShareCodeDate\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"DateTime\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"createdAt\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"DateTime\",\"nativeType\":null,\"default\":{\"name\":\"now\",\"args\":[]},\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"invites\",\"kind\":\"object\",\"isList\":true,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"TeamInvite\",\"nativeType\":null,\"relationName\":\"UserInvitations\",\"relationFromFields\":[],\"relationToFields\":[],\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"notifications\",\"kind\":\"object\",\"isList\":true,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"Notification\",\"nativeType\":null,\"relationName\":\"NotificationToUser\",\"relationFromFields\":[],\"relationToFields\":[],\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"matchPlayers\",\"kind\":\"object\",\"isList\":true,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"MatchPlayer\",\"nativeType\":null,\"relationName\":\"MatchPlayerToUser\",\"relationFromFields\":[],\"relationToFields\":[],\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"serverRequests\",\"kind\":\"object\",\"isList\":true,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"ServerRequest\",\"nativeType\":null,\"relationName\":\"MatchRequests\",\"relationFromFields\":[],\"relationToFields\":[],\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"rankHistory\",\"kind\":\"object\",\"isList\":true,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"RankHistory\",\"nativeType\":null,\"relationName\":\"UserRankHistory\",\"relationFromFields\":[],\"relationToFields\":[],\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"demoFiles\",\"kind\":\"object\",\"isList\":true,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"DemoFile\",\"nativeType\":null,\"relationName\":\"DemoFileToUser\",\"relationFromFields\":[],\"relationToFields\":[],\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"createdSchedules\",\"kind\":\"object\",\"isList\":true,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"Schedule\",\"nativeType\":null,\"relationName\":\"CreatedSchedules\",\"relationFromFields\":[],\"relationToFields\":[],\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"confirmedSchedules\",\"kind\":\"object\",\"isList\":true,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"Schedule\",\"nativeType\":null,\"relationName\":\"ConfirmedSchedules\",\"relationFromFields\":[],\"relationToFields\":[],\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"mapVoteChoices\",\"kind\":\"object\",\"isList\":true,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"MapVoteStep\",\"nativeType\":null,\"relationName\":\"VoteStepChooser\",\"relationFromFields\":[],\"relationToFields\":[],\"isGenerated\":false,\"isUpdatedAt\":false}],\"primaryKey\":null,\"uniqueFields\":[],\"uniqueIndexes\":[],\"isGenerated\":false},\"Team\":{\"dbName\":null,\"schema\":null,\"fields\":[{\"name\":\"id\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":true,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"String\",\"nativeType\":null,\"default\":{\"name\":\"uuid\",\"args\":[4]},\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"name\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":true,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"logo\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"leaderId\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":true,\"isId\":false,\"isReadOnly\":true,\"hasDefaultValue\":false,\"type\":\"String\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"createdAt\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"DateTime\",\"nativeType\":null,\"default\":{\"name\":\"now\",\"args\":[]},\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"activePlayers\",\"kind\":\"scalar\",\"isList\":true,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"inactivePlayers\",\"kind\":\"scalar\",\"isList\":true,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"leader\",\"kind\":\"object\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"User\",\"nativeType\":null,\"relationName\":\"TeamLeader\",\"relationFromFields\":[\"leaderId\"],\"relationToFields\":[\"steamId\"],\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"members\",\"kind\":\"object\",\"isList\":true,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"User\",\"nativeType\":null,\"relationName\":\"UserTeam\",\"relationFromFields\":[],\"relationToFields\":[],\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"invites\",\"kind\":\"object\",\"isList\":true,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"TeamInvite\",\"nativeType\":null,\"relationName\":\"TeamToTeamInvite\",\"relationFromFields\":[],\"relationToFields\":[],\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"matchPlayers\",\"kind\":\"object\",\"isList\":true,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"MatchPlayer\",\"nativeType\":null,\"relationName\":\"MatchPlayerToTeam\",\"relationFromFields\":[],\"relationToFields\":[],\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"matchesAsTeamA\",\"kind\":\"object\",\"isList\":true,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"Match\",\"nativeType\":null,\"relationName\":\"MatchTeamA\",\"relationFromFields\":[],\"relationToFields\":[],\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"matchesAsTeamB\",\"kind\":\"object\",\"isList\":true,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"Match\",\"nativeType\":null,\"relationName\":\"MatchTeamB\",\"relationFromFields\":[],\"relationToFields\":[],\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"schedulesAsTeamA\",\"kind\":\"object\",\"isList\":true,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"Schedule\",\"nativeType\":null,\"relationName\":\"ScheduleTeamA\",\"relationFromFields\":[],\"relationToFields\":[],\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"schedulesAsTeamB\",\"kind\":\"object\",\"isList\":true,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"Schedule\",\"nativeType\":null,\"relationName\":\"ScheduleTeamB\",\"relationFromFields\":[],\"relationToFields\":[],\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"mapVoteSteps\",\"kind\":\"object\",\"isList\":true,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"MapVoteStep\",\"nativeType\":null,\"relationName\":\"VoteStepTeam\",\"relationFromFields\":[],\"relationToFields\":[],\"isGenerated\":false,\"isUpdatedAt\":false}],\"primaryKey\":null,\"uniqueFields\":[],\"uniqueIndexes\":[],\"isGenerated\":false},\"TeamInvite\":{\"dbName\":null,\"schema\":null,\"fields\":[{\"name\":\"id\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":true,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"String\",\"nativeType\":null,\"default\":{\"name\":\"uuid\",\"args\":[4]},\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"steamId\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":true,\"hasDefaultValue\":false,\"type\":\"String\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"teamId\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":true,\"hasDefaultValue\":false,\"type\":\"String\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"type\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"createdAt\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"DateTime\",\"nativeType\":null,\"default\":{\"name\":\"now\",\"args\":[]},\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"user\",\"kind\":\"object\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"User\",\"nativeType\":null,\"relationName\":\"UserInvitations\",\"relationFromFields\":[\"steamId\"],\"relationToFields\":[\"steamId\"],\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"team\",\"kind\":\"object\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"Team\",\"nativeType\":null,\"relationName\":\"TeamToTeamInvite\",\"relationFromFields\":[\"teamId\"],\"relationToFields\":[\"id\"],\"isGenerated\":false,\"isUpdatedAt\":false}],\"primaryKey\":null,\"uniqueFields\":[],\"uniqueIndexes\":[],\"isGenerated\":false},\"Notification\":{\"dbName\":null,\"schema\":null,\"fields\":[{\"name\":\"id\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":true,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"String\",\"nativeType\":null,\"default\":{\"name\":\"uuid\",\"args\":[4]},\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"steamId\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":true,\"hasDefaultValue\":false,\"type\":\"String\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"title\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"message\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"read\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"Boolean\",\"nativeType\":null,\"default\":false,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"persistent\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"Boolean\",\"nativeType\":null,\"default\":false,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"actionType\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"actionData\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"createdAt\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"DateTime\",\"nativeType\":null,\"default\":{\"name\":\"now\",\"args\":[]},\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"user\",\"kind\":\"object\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"User\",\"nativeType\":null,\"relationName\":\"NotificationToUser\",\"relationFromFields\":[\"steamId\"],\"relationToFields\":[\"steamId\"],\"isGenerated\":false,\"isUpdatedAt\":false}],\"primaryKey\":null,\"uniqueFields\":[],\"uniqueIndexes\":[],\"isGenerated\":false},\"Match\":{\"dbName\":null,\"schema\":null,\"fields\":[{\"name\":\"id\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":true,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"String\",\"nativeType\":null,\"default\":{\"name\":\"uuid\",\"args\":[4]},\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"title\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"matchType\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"String\",\"nativeType\":null,\"default\":\"community\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"map\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"description\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"scoreA\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"Int\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"scoreB\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"Int\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"teamAId\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":true,\"hasDefaultValue\":false,\"type\":\"String\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"teamA\",\"kind\":\"object\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"Team\",\"nativeType\":null,\"relationName\":\"MatchTeamA\",\"relationFromFields\":[\"teamAId\"],\"relationToFields\":[\"id\"],\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"teamBId\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":true,\"hasDefaultValue\":false,\"type\":\"String\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"teamB\",\"kind\":\"object\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"Team\",\"nativeType\":null,\"relationName\":\"MatchTeamB\",\"relationFromFields\":[\"teamBId\"],\"relationToFields\":[\"id\"],\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"teamAUsers\",\"kind\":\"object\",\"isList\":true,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"User\",\"nativeType\":null,\"relationName\":\"TeamAPlayers\",\"relationFromFields\":[],\"relationToFields\":[],\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"teamBUsers\",\"kind\":\"object\",\"isList\":true,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"User\",\"nativeType\":null,\"relationName\":\"TeamBPlayers\",\"relationFromFields\":[],\"relationToFields\":[],\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"filePath\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"demoFile\",\"kind\":\"object\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"DemoFile\",\"nativeType\":null,\"relationName\":\"DemoFileToMatch\",\"relationFromFields\":[],\"relationToFields\":[],\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"demoDate\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"DateTime\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"demoData\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"Json\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"players\",\"kind\":\"object\",\"isList\":true,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"MatchPlayer\",\"nativeType\":null,\"relationName\":\"MatchToMatchPlayer\",\"relationFromFields\":[],\"relationToFields\":[],\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"rankUpdates\",\"kind\":\"object\",\"isList\":true,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"RankHistory\",\"nativeType\":null,\"relationName\":\"MatchRankHistory\",\"relationFromFields\":[],\"relationToFields\":[],\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"roundCount\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"Int\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"roundHistory\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"Json\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"winnerTeam\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"bestOf\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"Int\",\"nativeType\":null,\"default\":3,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"matchDate\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"DateTime\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"mapVote\",\"kind\":\"object\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"MapVote\",\"nativeType\":null,\"relationName\":\"MapVoteToMatch\",\"relationFromFields\":[],\"relationToFields\":[],\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"createdAt\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"DateTime\",\"nativeType\":null,\"default\":{\"name\":\"now\",\"args\":[]},\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"updatedAt\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"DateTime\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":true},{\"name\":\"schedule\",\"kind\":\"object\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"Schedule\",\"nativeType\":null,\"relationName\":\"MatchToSchedule\",\"relationFromFields\":[],\"relationToFields\":[],\"isGenerated\":false,\"isUpdatedAt\":false}],\"primaryKey\":null,\"uniqueFields\":[],\"uniqueIndexes\":[],\"isGenerated\":false},\"MatchPlayer\":{\"dbName\":null,\"schema\":null,\"fields\":[{\"name\":\"id\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":true,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"String\",\"nativeType\":null,\"default\":{\"name\":\"uuid\",\"args\":[4]},\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"steamId\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":true,\"hasDefaultValue\":false,\"type\":\"String\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"matchId\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":true,\"hasDefaultValue\":false,\"type\":\"String\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"teamId\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":true,\"hasDefaultValue\":false,\"type\":\"String\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"team\",\"kind\":\"object\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"Team\",\"nativeType\":null,\"relationName\":\"MatchPlayerToTeam\",\"relationFromFields\":[\"teamId\"],\"relationToFields\":[\"id\"],\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"match\",\"kind\":\"object\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"Match\",\"nativeType\":null,\"relationName\":\"MatchToMatchPlayer\",\"relationFromFields\":[\"matchId\"],\"relationToFields\":[\"id\"],\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"user\",\"kind\":\"object\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"User\",\"nativeType\":null,\"relationName\":\"MatchPlayerToUser\",\"relationFromFields\":[\"steamId\"],\"relationToFields\":[\"steamId\"],\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"stats\",\"kind\":\"object\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"PlayerStats\",\"nativeType\":null,\"relationName\":\"MatchPlayerToPlayerStats\",\"relationFromFields\":[],\"relationToFields\":[],\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"createdAt\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"DateTime\",\"nativeType\":null,\"default\":{\"name\":\"now\",\"args\":[]},\"isGenerated\":false,\"isUpdatedAt\":false}],\"primaryKey\":null,\"uniqueFields\":[[\"matchId\",\"steamId\"]],\"uniqueIndexes\":[{\"name\":null,\"fields\":[\"matchId\",\"steamId\"]}],\"isGenerated\":false},\"PlayerStats\":{\"dbName\":null,\"schema\":null,\"fields\":[{\"name\":\"id\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":true,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"String\",\"nativeType\":null,\"default\":{\"name\":\"uuid\",\"args\":[4]},\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"matchId\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":true,\"hasDefaultValue\":false,\"type\":\"String\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"steamId\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":true,\"hasDefaultValue\":false,\"type\":\"String\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"kills\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"Int\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"assists\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"Int\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"deaths\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"Int\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"headshotPct\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"Float\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"totalDamage\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"Float\",\"nativeType\":null,\"default\":0,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"utilityDamage\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"Int\",\"nativeType\":null,\"default\":0,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"flashAssists\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"Int\",\"nativeType\":null,\"default\":0,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"mvps\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"Int\",\"nativeType\":null,\"default\":0,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"mvpEliminations\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"Int\",\"nativeType\":null,\"default\":0,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"mvpDefuse\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"Int\",\"nativeType\":null,\"default\":0,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"mvpPlant\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"Int\",\"nativeType\":null,\"default\":0,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"knifeKills\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"Int\",\"nativeType\":null,\"default\":0,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"zeusKills\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"Int\",\"nativeType\":null,\"default\":0,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"wallbangKills\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"Int\",\"nativeType\":null,\"default\":0,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"smokeKills\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"Int\",\"nativeType\":null,\"default\":0,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"headshots\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"Int\",\"nativeType\":null,\"default\":0,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"noScopes\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"Int\",\"nativeType\":null,\"default\":0,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"blindKills\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"Int\",\"nativeType\":null,\"default\":0,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"aim\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"Int\",\"nativeType\":null,\"default\":0,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"oneK\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"Int\",\"nativeType\":null,\"default\":0,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"twoK\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"Int\",\"nativeType\":null,\"default\":0,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"threeK\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"Int\",\"nativeType\":null,\"default\":0,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"fourK\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"Int\",\"nativeType\":null,\"default\":0,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"fiveK\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"Int\",\"nativeType\":null,\"default\":0,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"rankOld\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"Int\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"rankNew\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"Int\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"rankChange\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"Int\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"winCount\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"Int\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"matchPlayer\",\"kind\":\"object\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"MatchPlayer\",\"nativeType\":null,\"relationName\":\"MatchPlayerToPlayerStats\",\"relationFromFields\":[\"matchId\",\"steamId\"],\"relationToFields\":[\"matchId\",\"steamId\"],\"isGenerated\":false,\"isUpdatedAt\":false}],\"primaryKey\":null,\"uniqueFields\":[[\"matchId\",\"steamId\"]],\"uniqueIndexes\":[{\"name\":null,\"fields\":[\"matchId\",\"steamId\"]}],\"isGenerated\":false},\"RankHistory\":{\"dbName\":null,\"schema\":null,\"fields\":[{\"name\":\"id\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":true,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"String\",\"nativeType\":null,\"default\":{\"name\":\"uuid\",\"args\":[4]},\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"steamId\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":true,\"hasDefaultValue\":false,\"type\":\"String\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"matchId\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":true,\"hasDefaultValue\":false,\"type\":\"String\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"rankOld\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"Int\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"rankNew\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"Int\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"delta\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"Int\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"winCount\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"Int\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"createdAt\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"DateTime\",\"nativeType\":null,\"default\":{\"name\":\"now\",\"args\":[]},\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"user\",\"kind\":\"object\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"User\",\"nativeType\":null,\"relationName\":\"UserRankHistory\",\"relationFromFields\":[\"steamId\"],\"relationToFields\":[\"steamId\"],\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"match\",\"kind\":\"object\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"Match\",\"nativeType\":null,\"relationName\":\"MatchRankHistory\",\"relationFromFields\":[\"matchId\"],\"relationToFields\":[\"id\"],\"isGenerated\":false,\"isUpdatedAt\":false}],\"primaryKey\":null,\"uniqueFields\":[],\"uniqueIndexes\":[],\"isGenerated\":false},\"Schedule\":{\"dbName\":null,\"schema\":null,\"fields\":[{\"name\":\"id\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":true,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"String\",\"nativeType\":null,\"default\":{\"name\":\"uuid\",\"args\":[4]},\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"title\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"description\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"map\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"date\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"DateTime\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"status\",\"kind\":\"enum\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"ScheduleStatus\",\"nativeType\":null,\"default\":\"PENDING\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"teamAId\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":true,\"hasDefaultValue\":false,\"type\":\"String\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"teamA\",\"kind\":\"object\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"Team\",\"nativeType\":null,\"relationName\":\"ScheduleTeamA\",\"relationFromFields\":[\"teamAId\"],\"relationToFields\":[\"id\"],\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"teamBId\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":true,\"hasDefaultValue\":false,\"type\":\"String\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"teamB\",\"kind\":\"object\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"Team\",\"nativeType\":null,\"relationName\":\"ScheduleTeamB\",\"relationFromFields\":[\"teamBId\"],\"relationToFields\":[\"id\"],\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"createdById\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":true,\"hasDefaultValue\":false,\"type\":\"String\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"createdBy\",\"kind\":\"object\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"User\",\"nativeType\":null,\"relationName\":\"CreatedSchedules\",\"relationFromFields\":[\"createdById\"],\"relationToFields\":[\"steamId\"],\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"confirmedById\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":true,\"hasDefaultValue\":false,\"type\":\"String\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"confirmedBy\",\"kind\":\"object\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"User\",\"nativeType\":null,\"relationName\":\"ConfirmedSchedules\",\"relationFromFields\":[\"confirmedById\"],\"relationToFields\":[\"steamId\"],\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"linkedMatchId\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":true,\"isId\":false,\"isReadOnly\":true,\"hasDefaultValue\":false,\"type\":\"String\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"linkedMatch\",\"kind\":\"object\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"Match\",\"nativeType\":null,\"relationName\":\"MatchToSchedule\",\"relationFromFields\":[\"linkedMatchId\"],\"relationToFields\":[\"id\"],\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"createdAt\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"DateTime\",\"nativeType\":null,\"default\":{\"name\":\"now\",\"args\":[]},\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"updatedAt\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"DateTime\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":true}],\"primaryKey\":null,\"uniqueFields\":[],\"uniqueIndexes\":[],\"isGenerated\":false},\"DemoFile\":{\"dbName\":null,\"schema\":null,\"fields\":[{\"name\":\"id\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":true,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"String\",\"nativeType\":null,\"default\":{\"name\":\"uuid\",\"args\":[4]},\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"matchId\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":true,\"isId\":false,\"isReadOnly\":true,\"hasDefaultValue\":false,\"type\":\"String\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"steamId\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":true,\"hasDefaultValue\":false,\"type\":\"String\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"fileName\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":true,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"filePath\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"parsed\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"Boolean\",\"nativeType\":null,\"default\":false,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"createdAt\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"DateTime\",\"nativeType\":null,\"default\":{\"name\":\"now\",\"args\":[]},\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"match\",\"kind\":\"object\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"Match\",\"nativeType\":null,\"relationName\":\"DemoFileToMatch\",\"relationFromFields\":[\"matchId\"],\"relationToFields\":[\"id\"],\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"user\",\"kind\":\"object\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"User\",\"nativeType\":null,\"relationName\":\"DemoFileToUser\",\"relationFromFields\":[\"steamId\"],\"relationToFields\":[\"steamId\"],\"isGenerated\":false,\"isUpdatedAt\":false}],\"primaryKey\":null,\"uniqueFields\":[],\"uniqueIndexes\":[],\"isGenerated\":false},\"ServerRequest\":{\"dbName\":null,\"schema\":null,\"fields\":[{\"name\":\"id\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":true,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"String\",\"nativeType\":null,\"default\":{\"name\":\"uuid\",\"args\":[4]},\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"steamId\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":true,\"hasDefaultValue\":false,\"type\":\"String\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"matchId\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"reservationId\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"BigInt\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"tvPort\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"BigInt\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"processed\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"Boolean\",\"nativeType\":null,\"default\":false,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"failed\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"Boolean\",\"nativeType\":null,\"default\":false,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"createdAt\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"DateTime\",\"nativeType\":null,\"default\":{\"name\":\"now\",\"args\":[]},\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"user\",\"kind\":\"object\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"User\",\"nativeType\":null,\"relationName\":\"MatchRequests\",\"relationFromFields\":[\"steamId\"],\"relationToFields\":[\"steamId\"],\"isGenerated\":false,\"isUpdatedAt\":false}],\"primaryKey\":null,\"uniqueFields\":[[\"steamId\",\"matchId\"]],\"uniqueIndexes\":[{\"name\":null,\"fields\":[\"steamId\",\"matchId\"]}],\"isGenerated\":false},\"MapVote\":{\"dbName\":null,\"schema\":null,\"fields\":[{\"name\":\"id\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":true,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"String\",\"nativeType\":null,\"default\":{\"name\":\"uuid\",\"args\":[4]},\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"matchId\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":true,\"isId\":false,\"isReadOnly\":true,\"hasDefaultValue\":false,\"type\":\"String\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"match\",\"kind\":\"object\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"Match\",\"nativeType\":null,\"relationName\":\"MapVoteToMatch\",\"relationFromFields\":[\"matchId\"],\"relationToFields\":[\"id\"],\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"bestOf\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"Int\",\"nativeType\":null,\"default\":3,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"mapPool\",\"kind\":\"scalar\",\"isList\":true,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"currentIdx\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"Int\",\"nativeType\":null,\"default\":0,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"locked\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"Boolean\",\"nativeType\":null,\"default\":false,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"opensAt\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"DateTime\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"adminEditingBy\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"adminEditingSince\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"DateTime\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"steps\",\"kind\":\"object\",\"isList\":true,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"MapVoteStep\",\"nativeType\":null,\"relationName\":\"MapVoteToMapVoteStep\",\"relationFromFields\":[],\"relationToFields\":[],\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"createdAt\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"DateTime\",\"nativeType\":null,\"default\":{\"name\":\"now\",\"args\":[]},\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"updatedAt\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"DateTime\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":true}],\"primaryKey\":null,\"uniqueFields\":[],\"uniqueIndexes\":[],\"isGenerated\":false},\"MapVoteStep\":{\"dbName\":null,\"schema\":null,\"fields\":[{\"name\":\"id\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":true,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"String\",\"nativeType\":null,\"default\":{\"name\":\"uuid\",\"args\":[4]},\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"voteId\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":true,\"hasDefaultValue\":false,\"type\":\"String\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"order\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"Int\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"action\",\"kind\":\"enum\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"MapVoteAction\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"teamId\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":true,\"hasDefaultValue\":false,\"type\":\"String\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"team\",\"kind\":\"object\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"Team\",\"nativeType\":null,\"relationName\":\"VoteStepTeam\",\"relationFromFields\":[\"teamId\"],\"relationToFields\":[\"id\"],\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"map\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"chosenAt\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"DateTime\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"chosenBy\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":true,\"hasDefaultValue\":false,\"type\":\"String\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"chooser\",\"kind\":\"object\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"User\",\"nativeType\":null,\"relationName\":\"VoteStepChooser\",\"relationFromFields\":[\"chosenBy\"],\"relationToFields\":[\"steamId\"],\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"vote\",\"kind\":\"object\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"MapVote\",\"nativeType\":null,\"relationName\":\"MapVoteToMapVoteStep\",\"relationFromFields\":[\"voteId\"],\"relationToFields\":[\"id\"],\"isGenerated\":false,\"isUpdatedAt\":false}],\"primaryKey\":null,\"uniqueFields\":[[\"voteId\",\"order\"]],\"uniqueIndexes\":[{\"name\":null,\"fields\":[\"voteId\",\"order\"]}],\"isGenerated\":false}},\"enums\":{\"ScheduleStatus\":{\"values\":[{\"name\":\"PENDING\",\"dbName\":null},{\"name\":\"CONFIRMED\",\"dbName\":null},{\"name\":\"DECLINED\",\"dbName\":null},{\"name\":\"CANCELLED\",\"dbName\":null},{\"name\":\"COMPLETED\",\"dbName\":null}],\"dbName\":null},\"MapVoteAction\":{\"values\":[{\"name\":\"BAN\",\"dbName\":null},{\"name\":\"PICK\",\"dbName\":null},{\"name\":\"DECIDER\",\"dbName\":null}],\"dbName\":null}},\"types\":{}}") +config.runtimeDataModel = JSON.parse("{\"models\":{\"User\":{\"dbName\":null,\"schema\":null,\"fields\":[{\"name\":\"steamId\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":true,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"name\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"avatar\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"location\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"isAdmin\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"Boolean\",\"nativeType\":null,\"default\":false,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"teamId\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":true,\"hasDefaultValue\":false,\"type\":\"String\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"team\",\"kind\":\"object\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"Team\",\"nativeType\":null,\"relationName\":\"UserTeam\",\"relationFromFields\":[\"teamId\"],\"relationToFields\":[\"id\"],\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"ledTeam\",\"kind\":\"object\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"Team\",\"nativeType\":null,\"relationName\":\"TeamLeader\",\"relationFromFields\":[],\"relationToFields\":[],\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"matchesAsTeamA\",\"kind\":\"object\",\"isList\":true,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"Match\",\"nativeType\":null,\"relationName\":\"TeamAPlayers\",\"relationFromFields\":[],\"relationToFields\":[],\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"matchesAsTeamB\",\"kind\":\"object\",\"isList\":true,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"Match\",\"nativeType\":null,\"relationName\":\"TeamBPlayers\",\"relationFromFields\":[],\"relationToFields\":[],\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"premierRank\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"Int\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"authCode\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"lastKnownShareCode\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"lastKnownShareCodeDate\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"DateTime\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"createdAt\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"DateTime\",\"nativeType\":null,\"default\":{\"name\":\"now\",\"args\":[]},\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"invites\",\"kind\":\"object\",\"isList\":true,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"TeamInvite\",\"nativeType\":null,\"relationName\":\"UserInvitations\",\"relationFromFields\":[],\"relationToFields\":[],\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"notifications\",\"kind\":\"object\",\"isList\":true,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"Notification\",\"nativeType\":null,\"relationName\":\"NotificationToUser\",\"relationFromFields\":[],\"relationToFields\":[],\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"matchPlayers\",\"kind\":\"object\",\"isList\":true,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"MatchPlayer\",\"nativeType\":null,\"relationName\":\"MatchPlayerToUser\",\"relationFromFields\":[],\"relationToFields\":[],\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"serverRequests\",\"kind\":\"object\",\"isList\":true,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"ServerRequest\",\"nativeType\":null,\"relationName\":\"MatchRequests\",\"relationFromFields\":[],\"relationToFields\":[],\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"rankHistory\",\"kind\":\"object\",\"isList\":true,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"RankHistory\",\"nativeType\":null,\"relationName\":\"UserRankHistory\",\"relationFromFields\":[],\"relationToFields\":[],\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"demoFiles\",\"kind\":\"object\",\"isList\":true,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"DemoFile\",\"nativeType\":null,\"relationName\":\"DemoFileToUser\",\"relationFromFields\":[],\"relationToFields\":[],\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"createdSchedules\",\"kind\":\"object\",\"isList\":true,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"Schedule\",\"nativeType\":null,\"relationName\":\"CreatedSchedules\",\"relationFromFields\":[],\"relationToFields\":[],\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"confirmedSchedules\",\"kind\":\"object\",\"isList\":true,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"Schedule\",\"nativeType\":null,\"relationName\":\"ConfirmedSchedules\",\"relationFromFields\":[],\"relationToFields\":[],\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"mapVoteChoices\",\"kind\":\"object\",\"isList\":true,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"MapVoteStep\",\"nativeType\":null,\"relationName\":\"VoteStepChooser\",\"relationFromFields\":[],\"relationToFields\":[],\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"status\",\"kind\":\"enum\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"UserStatus\",\"nativeType\":null,\"default\":\"offline\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"lastActiveAt\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"DateTime\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false}],\"primaryKey\":null,\"uniqueFields\":[],\"uniqueIndexes\":[],\"isGenerated\":false},\"Team\":{\"dbName\":null,\"schema\":null,\"fields\":[{\"name\":\"id\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":true,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"String\",\"nativeType\":null,\"default\":{\"name\":\"uuid\",\"args\":[4]},\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"name\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":true,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"logo\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"leaderId\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":true,\"isId\":false,\"isReadOnly\":true,\"hasDefaultValue\":false,\"type\":\"String\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"createdAt\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"DateTime\",\"nativeType\":null,\"default\":{\"name\":\"now\",\"args\":[]},\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"activePlayers\",\"kind\":\"scalar\",\"isList\":true,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"inactivePlayers\",\"kind\":\"scalar\",\"isList\":true,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"leader\",\"kind\":\"object\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"User\",\"nativeType\":null,\"relationName\":\"TeamLeader\",\"relationFromFields\":[\"leaderId\"],\"relationToFields\":[\"steamId\"],\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"members\",\"kind\":\"object\",\"isList\":true,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"User\",\"nativeType\":null,\"relationName\":\"UserTeam\",\"relationFromFields\":[],\"relationToFields\":[],\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"invites\",\"kind\":\"object\",\"isList\":true,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"TeamInvite\",\"nativeType\":null,\"relationName\":\"TeamToTeamInvite\",\"relationFromFields\":[],\"relationToFields\":[],\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"matchPlayers\",\"kind\":\"object\",\"isList\":true,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"MatchPlayer\",\"nativeType\":null,\"relationName\":\"MatchPlayerToTeam\",\"relationFromFields\":[],\"relationToFields\":[],\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"matchesAsTeamA\",\"kind\":\"object\",\"isList\":true,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"Match\",\"nativeType\":null,\"relationName\":\"MatchTeamA\",\"relationFromFields\":[],\"relationToFields\":[],\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"matchesAsTeamB\",\"kind\":\"object\",\"isList\":true,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"Match\",\"nativeType\":null,\"relationName\":\"MatchTeamB\",\"relationFromFields\":[],\"relationToFields\":[],\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"schedulesAsTeamA\",\"kind\":\"object\",\"isList\":true,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"Schedule\",\"nativeType\":null,\"relationName\":\"ScheduleTeamA\",\"relationFromFields\":[],\"relationToFields\":[],\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"schedulesAsTeamB\",\"kind\":\"object\",\"isList\":true,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"Schedule\",\"nativeType\":null,\"relationName\":\"ScheduleTeamB\",\"relationFromFields\":[],\"relationToFields\":[],\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"mapVoteSteps\",\"kind\":\"object\",\"isList\":true,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"MapVoteStep\",\"nativeType\":null,\"relationName\":\"VoteStepTeam\",\"relationFromFields\":[],\"relationToFields\":[],\"isGenerated\":false,\"isUpdatedAt\":false}],\"primaryKey\":null,\"uniqueFields\":[],\"uniqueIndexes\":[],\"isGenerated\":false},\"TeamInvite\":{\"dbName\":null,\"schema\":null,\"fields\":[{\"name\":\"id\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":true,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"String\",\"nativeType\":null,\"default\":{\"name\":\"uuid\",\"args\":[4]},\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"steamId\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":true,\"hasDefaultValue\":false,\"type\":\"String\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"teamId\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":true,\"hasDefaultValue\":false,\"type\":\"String\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"type\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"createdAt\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"DateTime\",\"nativeType\":null,\"default\":{\"name\":\"now\",\"args\":[]},\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"user\",\"kind\":\"object\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"User\",\"nativeType\":null,\"relationName\":\"UserInvitations\",\"relationFromFields\":[\"steamId\"],\"relationToFields\":[\"steamId\"],\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"team\",\"kind\":\"object\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"Team\",\"nativeType\":null,\"relationName\":\"TeamToTeamInvite\",\"relationFromFields\":[\"teamId\"],\"relationToFields\":[\"id\"],\"isGenerated\":false,\"isUpdatedAt\":false}],\"primaryKey\":null,\"uniqueFields\":[],\"uniqueIndexes\":[],\"isGenerated\":false},\"Notification\":{\"dbName\":null,\"schema\":null,\"fields\":[{\"name\":\"id\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":true,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"String\",\"nativeType\":null,\"default\":{\"name\":\"uuid\",\"args\":[4]},\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"steamId\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":true,\"hasDefaultValue\":false,\"type\":\"String\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"title\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"message\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"read\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"Boolean\",\"nativeType\":null,\"default\":false,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"persistent\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"Boolean\",\"nativeType\":null,\"default\":false,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"actionType\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"actionData\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"createdAt\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"DateTime\",\"nativeType\":null,\"default\":{\"name\":\"now\",\"args\":[]},\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"user\",\"kind\":\"object\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"User\",\"nativeType\":null,\"relationName\":\"NotificationToUser\",\"relationFromFields\":[\"steamId\"],\"relationToFields\":[\"steamId\"],\"isGenerated\":false,\"isUpdatedAt\":false}],\"primaryKey\":null,\"uniqueFields\":[],\"uniqueIndexes\":[],\"isGenerated\":false},\"Match\":{\"dbName\":null,\"schema\":null,\"fields\":[{\"name\":\"id\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":true,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"String\",\"nativeType\":null,\"default\":{\"name\":\"uuid\",\"args\":[4]},\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"title\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"matchType\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"String\",\"nativeType\":null,\"default\":\"community\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"map\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"description\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"scoreA\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"Int\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"scoreB\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"Int\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"teamAId\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":true,\"hasDefaultValue\":false,\"type\":\"String\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"teamA\",\"kind\":\"object\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"Team\",\"nativeType\":null,\"relationName\":\"MatchTeamA\",\"relationFromFields\":[\"teamAId\"],\"relationToFields\":[\"id\"],\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"teamBId\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":true,\"hasDefaultValue\":false,\"type\":\"String\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"teamB\",\"kind\":\"object\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"Team\",\"nativeType\":null,\"relationName\":\"MatchTeamB\",\"relationFromFields\":[\"teamBId\"],\"relationToFields\":[\"id\"],\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"teamAUsers\",\"kind\":\"object\",\"isList\":true,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"User\",\"nativeType\":null,\"relationName\":\"TeamAPlayers\",\"relationFromFields\":[],\"relationToFields\":[],\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"teamBUsers\",\"kind\":\"object\",\"isList\":true,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"User\",\"nativeType\":null,\"relationName\":\"TeamBPlayers\",\"relationFromFields\":[],\"relationToFields\":[],\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"filePath\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"demoFile\",\"kind\":\"object\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"DemoFile\",\"nativeType\":null,\"relationName\":\"DemoFileToMatch\",\"relationFromFields\":[],\"relationToFields\":[],\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"demoDate\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"DateTime\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"demoData\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"Json\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"players\",\"kind\":\"object\",\"isList\":true,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"MatchPlayer\",\"nativeType\":null,\"relationName\":\"MatchToMatchPlayer\",\"relationFromFields\":[],\"relationToFields\":[],\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"rankUpdates\",\"kind\":\"object\",\"isList\":true,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"RankHistory\",\"nativeType\":null,\"relationName\":\"MatchRankHistory\",\"relationFromFields\":[],\"relationToFields\":[],\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"roundCount\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"Int\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"roundHistory\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"Json\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"winnerTeam\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"bestOf\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"Int\",\"nativeType\":null,\"default\":3,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"matchDate\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"DateTime\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"mapVote\",\"kind\":\"object\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"MapVote\",\"nativeType\":null,\"relationName\":\"MapVoteToMatch\",\"relationFromFields\":[],\"relationToFields\":[],\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"createdAt\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"DateTime\",\"nativeType\":null,\"default\":{\"name\":\"now\",\"args\":[]},\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"updatedAt\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"DateTime\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":true},{\"name\":\"schedule\",\"kind\":\"object\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"Schedule\",\"nativeType\":null,\"relationName\":\"MatchToSchedule\",\"relationFromFields\":[],\"relationToFields\":[],\"isGenerated\":false,\"isUpdatedAt\":false}],\"primaryKey\":null,\"uniqueFields\":[],\"uniqueIndexes\":[],\"isGenerated\":false},\"MatchPlayer\":{\"dbName\":null,\"schema\":null,\"fields\":[{\"name\":\"id\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":true,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"String\",\"nativeType\":null,\"default\":{\"name\":\"uuid\",\"args\":[4]},\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"steamId\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":true,\"hasDefaultValue\":false,\"type\":\"String\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"matchId\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":true,\"hasDefaultValue\":false,\"type\":\"String\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"teamId\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":true,\"hasDefaultValue\":false,\"type\":\"String\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"team\",\"kind\":\"object\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"Team\",\"nativeType\":null,\"relationName\":\"MatchPlayerToTeam\",\"relationFromFields\":[\"teamId\"],\"relationToFields\":[\"id\"],\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"match\",\"kind\":\"object\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"Match\",\"nativeType\":null,\"relationName\":\"MatchToMatchPlayer\",\"relationFromFields\":[\"matchId\"],\"relationToFields\":[\"id\"],\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"user\",\"kind\":\"object\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"User\",\"nativeType\":null,\"relationName\":\"MatchPlayerToUser\",\"relationFromFields\":[\"steamId\"],\"relationToFields\":[\"steamId\"],\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"stats\",\"kind\":\"object\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"PlayerStats\",\"nativeType\":null,\"relationName\":\"MatchPlayerToPlayerStats\",\"relationFromFields\":[],\"relationToFields\":[],\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"createdAt\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"DateTime\",\"nativeType\":null,\"default\":{\"name\":\"now\",\"args\":[]},\"isGenerated\":false,\"isUpdatedAt\":false}],\"primaryKey\":null,\"uniqueFields\":[[\"matchId\",\"steamId\"]],\"uniqueIndexes\":[{\"name\":null,\"fields\":[\"matchId\",\"steamId\"]}],\"isGenerated\":false},\"PlayerStats\":{\"dbName\":null,\"schema\":null,\"fields\":[{\"name\":\"id\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":true,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"String\",\"nativeType\":null,\"default\":{\"name\":\"uuid\",\"args\":[4]},\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"matchId\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":true,\"hasDefaultValue\":false,\"type\":\"String\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"steamId\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":true,\"hasDefaultValue\":false,\"type\":\"String\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"kills\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"Int\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"assists\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"Int\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"deaths\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"Int\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"headshotPct\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"Float\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"totalDamage\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"Float\",\"nativeType\":null,\"default\":0,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"utilityDamage\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"Int\",\"nativeType\":null,\"default\":0,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"flashAssists\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"Int\",\"nativeType\":null,\"default\":0,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"mvps\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"Int\",\"nativeType\":null,\"default\":0,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"mvpEliminations\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"Int\",\"nativeType\":null,\"default\":0,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"mvpDefuse\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"Int\",\"nativeType\":null,\"default\":0,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"mvpPlant\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"Int\",\"nativeType\":null,\"default\":0,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"knifeKills\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"Int\",\"nativeType\":null,\"default\":0,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"zeusKills\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"Int\",\"nativeType\":null,\"default\":0,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"wallbangKills\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"Int\",\"nativeType\":null,\"default\":0,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"smokeKills\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"Int\",\"nativeType\":null,\"default\":0,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"headshots\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"Int\",\"nativeType\":null,\"default\":0,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"noScopes\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"Int\",\"nativeType\":null,\"default\":0,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"blindKills\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"Int\",\"nativeType\":null,\"default\":0,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"aim\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"Int\",\"nativeType\":null,\"default\":0,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"oneK\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"Int\",\"nativeType\":null,\"default\":0,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"twoK\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"Int\",\"nativeType\":null,\"default\":0,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"threeK\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"Int\",\"nativeType\":null,\"default\":0,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"fourK\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"Int\",\"nativeType\":null,\"default\":0,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"fiveK\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"Int\",\"nativeType\":null,\"default\":0,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"rankOld\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"Int\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"rankNew\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"Int\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"rankChange\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"Int\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"winCount\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"Int\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"matchPlayer\",\"kind\":\"object\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"MatchPlayer\",\"nativeType\":null,\"relationName\":\"MatchPlayerToPlayerStats\",\"relationFromFields\":[\"matchId\",\"steamId\"],\"relationToFields\":[\"matchId\",\"steamId\"],\"isGenerated\":false,\"isUpdatedAt\":false}],\"primaryKey\":null,\"uniqueFields\":[[\"matchId\",\"steamId\"]],\"uniqueIndexes\":[{\"name\":null,\"fields\":[\"matchId\",\"steamId\"]}],\"isGenerated\":false},\"RankHistory\":{\"dbName\":null,\"schema\":null,\"fields\":[{\"name\":\"id\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":true,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"String\",\"nativeType\":null,\"default\":{\"name\":\"uuid\",\"args\":[4]},\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"steamId\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":true,\"hasDefaultValue\":false,\"type\":\"String\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"matchId\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":true,\"hasDefaultValue\":false,\"type\":\"String\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"rankOld\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"Int\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"rankNew\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"Int\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"delta\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"Int\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"winCount\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"Int\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"createdAt\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"DateTime\",\"nativeType\":null,\"default\":{\"name\":\"now\",\"args\":[]},\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"user\",\"kind\":\"object\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"User\",\"nativeType\":null,\"relationName\":\"UserRankHistory\",\"relationFromFields\":[\"steamId\"],\"relationToFields\":[\"steamId\"],\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"match\",\"kind\":\"object\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"Match\",\"nativeType\":null,\"relationName\":\"MatchRankHistory\",\"relationFromFields\":[\"matchId\"],\"relationToFields\":[\"id\"],\"isGenerated\":false,\"isUpdatedAt\":false}],\"primaryKey\":null,\"uniqueFields\":[],\"uniqueIndexes\":[],\"isGenerated\":false},\"Schedule\":{\"dbName\":null,\"schema\":null,\"fields\":[{\"name\":\"id\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":true,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"String\",\"nativeType\":null,\"default\":{\"name\":\"uuid\",\"args\":[4]},\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"title\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"description\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"map\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"date\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"DateTime\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"status\",\"kind\":\"enum\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"ScheduleStatus\",\"nativeType\":null,\"default\":\"PENDING\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"teamAId\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":true,\"hasDefaultValue\":false,\"type\":\"String\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"teamA\",\"kind\":\"object\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"Team\",\"nativeType\":null,\"relationName\":\"ScheduleTeamA\",\"relationFromFields\":[\"teamAId\"],\"relationToFields\":[\"id\"],\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"teamBId\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":true,\"hasDefaultValue\":false,\"type\":\"String\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"teamB\",\"kind\":\"object\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"Team\",\"nativeType\":null,\"relationName\":\"ScheduleTeamB\",\"relationFromFields\":[\"teamBId\"],\"relationToFields\":[\"id\"],\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"createdById\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":true,\"hasDefaultValue\":false,\"type\":\"String\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"createdBy\",\"kind\":\"object\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"User\",\"nativeType\":null,\"relationName\":\"CreatedSchedules\",\"relationFromFields\":[\"createdById\"],\"relationToFields\":[\"steamId\"],\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"confirmedById\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":true,\"hasDefaultValue\":false,\"type\":\"String\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"confirmedBy\",\"kind\":\"object\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"User\",\"nativeType\":null,\"relationName\":\"ConfirmedSchedules\",\"relationFromFields\":[\"confirmedById\"],\"relationToFields\":[\"steamId\"],\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"linkedMatchId\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":true,\"isId\":false,\"isReadOnly\":true,\"hasDefaultValue\":false,\"type\":\"String\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"linkedMatch\",\"kind\":\"object\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"Match\",\"nativeType\":null,\"relationName\":\"MatchToSchedule\",\"relationFromFields\":[\"linkedMatchId\"],\"relationToFields\":[\"id\"],\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"createdAt\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"DateTime\",\"nativeType\":null,\"default\":{\"name\":\"now\",\"args\":[]},\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"updatedAt\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"DateTime\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":true}],\"primaryKey\":null,\"uniqueFields\":[],\"uniqueIndexes\":[],\"isGenerated\":false},\"DemoFile\":{\"dbName\":null,\"schema\":null,\"fields\":[{\"name\":\"id\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":true,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"String\",\"nativeType\":null,\"default\":{\"name\":\"uuid\",\"args\":[4]},\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"matchId\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":true,\"isId\":false,\"isReadOnly\":true,\"hasDefaultValue\":false,\"type\":\"String\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"steamId\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":true,\"hasDefaultValue\":false,\"type\":\"String\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"fileName\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":true,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"filePath\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"parsed\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"Boolean\",\"nativeType\":null,\"default\":false,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"createdAt\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"DateTime\",\"nativeType\":null,\"default\":{\"name\":\"now\",\"args\":[]},\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"match\",\"kind\":\"object\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"Match\",\"nativeType\":null,\"relationName\":\"DemoFileToMatch\",\"relationFromFields\":[\"matchId\"],\"relationToFields\":[\"id\"],\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"user\",\"kind\":\"object\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"User\",\"nativeType\":null,\"relationName\":\"DemoFileToUser\",\"relationFromFields\":[\"steamId\"],\"relationToFields\":[\"steamId\"],\"isGenerated\":false,\"isUpdatedAt\":false}],\"primaryKey\":null,\"uniqueFields\":[],\"uniqueIndexes\":[],\"isGenerated\":false},\"ServerRequest\":{\"dbName\":null,\"schema\":null,\"fields\":[{\"name\":\"id\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":true,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"String\",\"nativeType\":null,\"default\":{\"name\":\"uuid\",\"args\":[4]},\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"steamId\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":true,\"hasDefaultValue\":false,\"type\":\"String\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"matchId\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"reservationId\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"BigInt\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"tvPort\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"BigInt\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"processed\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"Boolean\",\"nativeType\":null,\"default\":false,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"failed\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"Boolean\",\"nativeType\":null,\"default\":false,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"createdAt\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"DateTime\",\"nativeType\":null,\"default\":{\"name\":\"now\",\"args\":[]},\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"user\",\"kind\":\"object\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"User\",\"nativeType\":null,\"relationName\":\"MatchRequests\",\"relationFromFields\":[\"steamId\"],\"relationToFields\":[\"steamId\"],\"isGenerated\":false,\"isUpdatedAt\":false}],\"primaryKey\":null,\"uniqueFields\":[[\"steamId\",\"matchId\"]],\"uniqueIndexes\":[{\"name\":null,\"fields\":[\"steamId\",\"matchId\"]}],\"isGenerated\":false},\"MapVote\":{\"dbName\":null,\"schema\":null,\"fields\":[{\"name\":\"id\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":true,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"String\",\"nativeType\":null,\"default\":{\"name\":\"uuid\",\"args\":[4]},\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"matchId\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":true,\"isId\":false,\"isReadOnly\":true,\"hasDefaultValue\":false,\"type\":\"String\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"match\",\"kind\":\"object\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"Match\",\"nativeType\":null,\"relationName\":\"MapVoteToMatch\",\"relationFromFields\":[\"matchId\"],\"relationToFields\":[\"id\"],\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"bestOf\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"Int\",\"nativeType\":null,\"default\":3,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"mapPool\",\"kind\":\"scalar\",\"isList\":true,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"currentIdx\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"Int\",\"nativeType\":null,\"default\":0,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"locked\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"Boolean\",\"nativeType\":null,\"default\":false,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"opensAt\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"DateTime\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"adminEditingBy\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"adminEditingSince\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"DateTime\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"steps\",\"kind\":\"object\",\"isList\":true,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"MapVoteStep\",\"nativeType\":null,\"relationName\":\"MapVoteToMapVoteStep\",\"relationFromFields\":[],\"relationToFields\":[],\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"createdAt\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"DateTime\",\"nativeType\":null,\"default\":{\"name\":\"now\",\"args\":[]},\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"updatedAt\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"DateTime\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":true}],\"primaryKey\":null,\"uniqueFields\":[],\"uniqueIndexes\":[],\"isGenerated\":false},\"MapVoteStep\":{\"dbName\":null,\"schema\":null,\"fields\":[{\"name\":\"id\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":true,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"String\",\"nativeType\":null,\"default\":{\"name\":\"uuid\",\"args\":[4]},\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"voteId\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":true,\"hasDefaultValue\":false,\"type\":\"String\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"order\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"Int\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"action\",\"kind\":\"enum\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"MapVoteAction\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"teamId\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":true,\"hasDefaultValue\":false,\"type\":\"String\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"team\",\"kind\":\"object\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"Team\",\"nativeType\":null,\"relationName\":\"VoteStepTeam\",\"relationFromFields\":[\"teamId\"],\"relationToFields\":[\"id\"],\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"map\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"chosenAt\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"DateTime\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"chosenBy\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":true,\"hasDefaultValue\":false,\"type\":\"String\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"chooser\",\"kind\":\"object\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"User\",\"nativeType\":null,\"relationName\":\"VoteStepChooser\",\"relationFromFields\":[\"chosenBy\"],\"relationToFields\":[\"steamId\"],\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"vote\",\"kind\":\"object\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"MapVote\",\"nativeType\":null,\"relationName\":\"MapVoteToMapVoteStep\",\"relationFromFields\":[\"voteId\"],\"relationToFields\":[\"id\"],\"isGenerated\":false,\"isUpdatedAt\":false}],\"primaryKey\":null,\"uniqueFields\":[[\"voteId\",\"order\"]],\"uniqueIndexes\":[{\"name\":null,\"fields\":[\"voteId\",\"order\"]}],\"isGenerated\":false}},\"enums\":{\"UserStatus\":{\"values\":[{\"name\":\"online\",\"dbName\":null},{\"name\":\"away\",\"dbName\":null},{\"name\":\"offline\",\"dbName\":null}],\"dbName\":null},\"ScheduleStatus\":{\"values\":[{\"name\":\"PENDING\",\"dbName\":null},{\"name\":\"CONFIRMED\",\"dbName\":null},{\"name\":\"DECLINED\",\"dbName\":null},{\"name\":\"CANCELLED\",\"dbName\":null},{\"name\":\"COMPLETED\",\"dbName\":null}],\"dbName\":null},\"MapVoteAction\":{\"values\":[{\"name\":\"BAN\",\"dbName\":null},{\"name\":\"PICK\",\"dbName\":null},{\"name\":\"DECIDER\",\"dbName\":null}],\"dbName\":null}},\"types\":{}}") defineDmmfProperty(exports.Prisma, config.runtimeDataModel) config.engineWasm = undefined config.compilerWasm = undefined diff --git a/src/generated/prisma/package.json b/src/generated/prisma/package.json index 4e7bb13..b54370a 100644 --- a/src/generated/prisma/package.json +++ b/src/generated/prisma/package.json @@ -1,5 +1,5 @@ { - "name": "prisma-client-d6ee9e0758cbf84308223ad2add52d1ebc187831f60d22da54a3cc72e384b3c6", + "name": "prisma-client-6d46bb441ad6771c9d4c18422a89623b795f3a4d205bdd0a7fbf78b6d9d34ce6", "main": "index.js", "types": "index.d.ts", "browser": "index-browser.js", diff --git a/src/generated/prisma/schema.prisma b/src/generated/prisma/schema.prisma index 34b8f58..601e664 100644 --- a/src/generated/prisma/schema.prisma +++ b/src/generated/prisma/schema.prisma @@ -45,6 +45,15 @@ model User { confirmedSchedules Schedule[] @relation("ConfirmedSchedules") mapVoteChoices MapVoteStep[] @relation("VoteStepChooser") + + status UserStatus @default(offline) // 👈 neu + lastActiveAt DateTime? // optional: wann zuletzt aktiv +} + +enum UserStatus { + online + away + offline } model Team { diff --git a/src/generated/prisma/wasm.js b/src/generated/prisma/wasm.js index 39bc898..055eb86 100644 --- a/src/generated/prisma/wasm.js +++ b/src/generated/prisma/wasm.js @@ -131,7 +131,9 @@ exports.Prisma.UserScalarFieldEnum = { authCode: 'authCode', lastKnownShareCode: 'lastKnownShareCode', lastKnownShareCodeDate: 'lastKnownShareCodeDate', - createdAt: 'createdAt' + createdAt: 'createdAt', + status: 'status', + lastActiveAt: 'lastActiveAt' }; exports.Prisma.TeamScalarFieldEnum = { @@ -326,6 +328,12 @@ exports.Prisma.JsonNullValueFilter = { JsonNull: Prisma.JsonNull, AnyNull: Prisma.AnyNull }; +exports.UserStatus = exports.$Enums.UserStatus = { + online: 'online', + away: 'away', + offline: 'offline' +}; + exports.ScheduleStatus = exports.$Enums.ScheduleStatus = { PENDING: 'PENDING', CONFIRMED: 'CONFIRMED',