import data
This commit is contained in:
parent
84c2292ee0
commit
841a48a955
18 changed files with 1750 additions and 109 deletions
7
.env
Normal file
7
.env
Normal file
|
@ -0,0 +1,7 @@
|
||||||
|
# Environment variables declared in this file are automatically made available to Prisma.
|
||||||
|
# See the documentation for more detail: https://pris.ly/d/prisma-schema#accessing-environment-variables-from-the-schema
|
||||||
|
|
||||||
|
# Prisma supports the native connection string format for PostgreSQL, MySQL, SQLite, SQL Server, MongoDB and CockroachDB.
|
||||||
|
# See the documentation for all the connection string options: https://pris.ly/d/connection-strings
|
||||||
|
|
||||||
|
DATABASE_URL="mysql://root:example@localhost:3306/omdb?schema=public"
|
5
.gitignore
vendored
5
.gitignore
vendored
|
@ -33,3 +33,8 @@ yarn-error.log*
|
||||||
# typescript
|
# typescript
|
||||||
*.tsbuildinfo
|
*.tsbuildinfo
|
||||||
next-env.d.ts
|
next-env.d.ts
|
||||||
|
|
||||||
|
dev.db
|
||||||
|
docker-data
|
||||||
|
|
||||||
|
/data.sql
|
12
docker-compose.yml
Normal file
12
docker-compose.yml
Normal file
|
@ -0,0 +1,12 @@
|
||||||
|
version: "3.7"
|
||||||
|
|
||||||
|
services:
|
||||||
|
dev-db:
|
||||||
|
image: mysql:8
|
||||||
|
command: --default-authentication-plugin=mysql_native_password
|
||||||
|
ports: [3306:3306]
|
||||||
|
environment:
|
||||||
|
- MYSQL_ROOT_PASSWORD=example
|
||||||
|
- MYSQL_DATABASE=omdb
|
||||||
|
volumes:
|
||||||
|
- ./docker-data/mysql:/var/lib/mysql
|
|
@ -1,4 +1,4 @@
|
||||||
/** @type {import('next').NextConfig} */
|
/** @type {import('next').NextConfig} */
|
||||||
const nextConfig = {}
|
const nextConfig = {};
|
||||||
|
|
||||||
module.exports = nextConfig
|
module.exports = nextConfig;
|
||||||
|
|
1032
package-lock.json
generated
1032
package-lock.json
generated
File diff suppressed because it is too large
Load diff
11
package.json
11
package.json
|
@ -9,14 +9,25 @@
|
||||||
"lint": "next lint"
|
"lint": "next lint"
|
||||||
},
|
},
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
|
"@prisma/client": "^5.1.1",
|
||||||
|
"@radix-ui/react-dropdown-menu": "^2.0.5",
|
||||||
|
"@radix-ui/react-icons": "^1.3.0",
|
||||||
|
"@radix-ui/react-navigation-menu": "^1.1.3",
|
||||||
|
"@radix-ui/react-popover": "1.0.6",
|
||||||
"@types/node": "20.5.0",
|
"@types/node": "20.5.0",
|
||||||
"@types/react": "18.2.20",
|
"@types/react": "18.2.20",
|
||||||
"@types/react-dom": "18.2.7",
|
"@types/react-dom": "18.2.7",
|
||||||
|
"classnames": "^2.3.2",
|
||||||
"eslint": "8.47.0",
|
"eslint": "8.47.0",
|
||||||
"eslint-config-next": "13.4.16",
|
"eslint-config-next": "13.4.16",
|
||||||
"next": "13.4.16",
|
"next": "13.4.16",
|
||||||
|
"prisma": "^5.1.1",
|
||||||
"react": "18.2.0",
|
"react": "18.2.0",
|
||||||
"react-dom": "18.2.0",
|
"react-dom": "18.2.0",
|
||||||
"typescript": "5.1.6"
|
"typescript": "5.1.6"
|
||||||
|
},
|
||||||
|
"devDependencies": {
|
||||||
|
"prettier": "^3.0.2",
|
||||||
|
"sass": "^1.65.1"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
205
prisma/migrations/20230905213259_initial/migration.sql
Normal file
205
prisma/migrations/20230905213259_initial/migration.sql
Normal file
|
@ -0,0 +1,205 @@
|
||||||
|
-- CreateTable
|
||||||
|
CREATE TABLE `apikeys` (
|
||||||
|
`ApiID` INTEGER NOT NULL AUTO_INCREMENT,
|
||||||
|
`Name` TEXT NULL,
|
||||||
|
`ApiKey` TEXT NULL,
|
||||||
|
`UserID` INTEGER NULL,
|
||||||
|
|
||||||
|
UNIQUE INDEX `ApiKey`(`ApiKey`(255)),
|
||||||
|
PRIMARY KEY (`ApiID`)
|
||||||
|
) DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
|
||||||
|
|
||||||
|
-- CreateTable
|
||||||
|
CREATE TABLE `beatmap_creators` (
|
||||||
|
`BeatmapID` INTEGER NOT NULL,
|
||||||
|
`CreatorID` INTEGER NOT NULL,
|
||||||
|
|
||||||
|
INDEX `idx_BeatmapID`(`BeatmapID`),
|
||||||
|
PRIMARY KEY (`BeatmapID`, `CreatorID`)
|
||||||
|
) DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
|
||||||
|
|
||||||
|
-- CreateTable
|
||||||
|
CREATE TABLE `beatmap_edit_requests` (
|
||||||
|
`EditID` INTEGER NOT NULL AUTO_INCREMENT,
|
||||||
|
`BeatmapID` INTEGER NULL,
|
||||||
|
`SetID` INTEGER NULL,
|
||||||
|
`UserID` INTEGER NOT NULL,
|
||||||
|
`EditData` JSON NOT NULL,
|
||||||
|
`Timestamp` TIMESTAMP(0) NOT NULL DEFAULT CURRENT_TIMESTAMP(0),
|
||||||
|
`Status` ENUM('Pending', 'Denied', 'Approved') NULL DEFAULT 'Pending',
|
||||||
|
`EditorID` INTEGER NULL,
|
||||||
|
|
||||||
|
PRIMARY KEY (`EditID`)
|
||||||
|
) DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
|
||||||
|
|
||||||
|
-- CreateTable
|
||||||
|
CREATE TABLE `beatmaps` (
|
||||||
|
`BeatmapID` MEDIUMINT UNSIGNED NOT NULL,
|
||||||
|
`SetID` MEDIUMINT UNSIGNED NULL,
|
||||||
|
`SetCreatorID` INTEGER NULL,
|
||||||
|
`DifficultyName` VARCHAR(255) NULL,
|
||||||
|
`Mode` TINYINT UNSIGNED NOT NULL DEFAULT 0,
|
||||||
|
`Status` TINYINT NOT NULL DEFAULT 0,
|
||||||
|
`SR` FLOAT NOT NULL DEFAULT 0,
|
||||||
|
`Rating` VARCHAR(45) NULL,
|
||||||
|
`ChartRank` INTEGER NULL,
|
||||||
|
`ChartYearRank` INTEGER NULL,
|
||||||
|
`Timestamp` TIMESTAMP(0) NULL DEFAULT CURRENT_TIMESTAMP(0),
|
||||||
|
`RatingCount` INTEGER NULL,
|
||||||
|
`WeightedAvg` FLOAT NULL,
|
||||||
|
`Genre` INTEGER NULL,
|
||||||
|
`Lang` INTEGER NULL,
|
||||||
|
`Artist` VARCHAR(255) NULL,
|
||||||
|
`Title` VARCHAR(255) NULL,
|
||||||
|
`DateRanked` TIMESTAMP(0) NULL,
|
||||||
|
`Blacklisted` BOOLEAN NOT NULL DEFAULT false,
|
||||||
|
`BlacklistReason` TEXT NULL,
|
||||||
|
`controversy` DECIMAL(10, 8) NULL,
|
||||||
|
|
||||||
|
INDEX `beatmapset_id`(`SetID`),
|
||||||
|
FULLTEXT INDEX `Artist`(`DifficultyName`, `Artist`, `Title`),
|
||||||
|
PRIMARY KEY (`BeatmapID`)
|
||||||
|
) DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
|
||||||
|
|
||||||
|
-- CreateTable
|
||||||
|
CREATE TABLE `beatmapset_nominators` (
|
||||||
|
`SetID` INTEGER NULL,
|
||||||
|
`NominatorID` INTEGER NULL,
|
||||||
|
`Mode` INTEGER NULL,
|
||||||
|
|
||||||
|
INDEX `beatmapset_nominators_SetID_index`(`SetID`),
|
||||||
|
UNIQUE INDEX `beatmapset_nominators_pk`(`SetID`, `NominatorID`, `Mode`)
|
||||||
|
) DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
|
||||||
|
|
||||||
|
-- CreateTable
|
||||||
|
CREATE TABLE `blacklist` (
|
||||||
|
`UserID` INTEGER NOT NULL,
|
||||||
|
|
||||||
|
PRIMARY KEY (`UserID`)
|
||||||
|
) DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
|
||||||
|
|
||||||
|
-- CreateTable
|
||||||
|
CREATE TABLE `comments` (
|
||||||
|
`CommentID` INTEGER NOT NULL AUTO_INCREMENT,
|
||||||
|
`UserID` INTEGER NOT NULL,
|
||||||
|
`SetID` INTEGER NOT NULL,
|
||||||
|
`Comment` TEXT NULL,
|
||||||
|
`date` TIMESTAMP(0) NULL DEFAULT CURRENT_TIMESTAMP(0),
|
||||||
|
|
||||||
|
PRIMARY KEY (`CommentID`)
|
||||||
|
) DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
|
||||||
|
|
||||||
|
-- CreateTable
|
||||||
|
CREATE TABLE `descriptor_votes` (
|
||||||
|
`VoteID` INTEGER NOT NULL AUTO_INCREMENT,
|
||||||
|
`BeatmapID` INTEGER NOT NULL,
|
||||||
|
`UserID` INTEGER NOT NULL,
|
||||||
|
`Vote` BOOLEAN NOT NULL,
|
||||||
|
`DescriptorID` INTEGER NOT NULL,
|
||||||
|
|
||||||
|
INDEX `descriptor_votes_BeatmapID_index`(`BeatmapID`),
|
||||||
|
UNIQUE INDEX `descriptor_votes_pk2`(`BeatmapID`, `UserID`, `DescriptorID`),
|
||||||
|
PRIMARY KEY (`VoteID`)
|
||||||
|
) DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
|
||||||
|
|
||||||
|
-- CreateTable
|
||||||
|
CREATE TABLE `descriptors` (
|
||||||
|
`DescriptorID` INTEGER NOT NULL AUTO_INCREMENT,
|
||||||
|
`Name` VARCHAR(40) NOT NULL,
|
||||||
|
`ShortDescription` TEXT NULL,
|
||||||
|
`ParentID` INTEGER NULL,
|
||||||
|
`Usable` BOOLEAN NOT NULL DEFAULT true,
|
||||||
|
|
||||||
|
UNIQUE INDEX `descriptors_pk2`(`Name`),
|
||||||
|
PRIMARY KEY (`DescriptorID`)
|
||||||
|
) DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
|
||||||
|
|
||||||
|
-- CreateTable
|
||||||
|
CREATE TABLE `logs` (
|
||||||
|
`LogID` INTEGER NOT NULL AUTO_INCREMENT,
|
||||||
|
`UserID` INTEGER NOT NULL,
|
||||||
|
`LogData` JSON NULL,
|
||||||
|
|
||||||
|
PRIMARY KEY (`LogID`)
|
||||||
|
) DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
|
||||||
|
|
||||||
|
-- CreateTable
|
||||||
|
CREATE TABLE `mappernames` (
|
||||||
|
`UserID` INTEGER NOT NULL,
|
||||||
|
`Username` VARCHAR(255) NULL,
|
||||||
|
|
||||||
|
PRIMARY KEY (`UserID`)
|
||||||
|
) DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
|
||||||
|
|
||||||
|
-- CreateTable
|
||||||
|
CREATE TABLE `rating_tags` (
|
||||||
|
`UserID` INTEGER NULL,
|
||||||
|
`BeatmapID` INTEGER NULL,
|
||||||
|
`Tag` VARCHAR(150) NULL,
|
||||||
|
`TagID` INTEGER NOT NULL AUTO_INCREMENT,
|
||||||
|
|
||||||
|
UNIQUE INDEX `rating_tags_pk`(`BeatmapID`, `UserID`, `Tag`),
|
||||||
|
PRIMARY KEY (`TagID`)
|
||||||
|
) DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
|
||||||
|
|
||||||
|
-- CreateTable
|
||||||
|
CREATE TABLE `ratings` (
|
||||||
|
`RatingID` INTEGER NOT NULL AUTO_INCREMENT,
|
||||||
|
`BeatmapID` INTEGER NOT NULL,
|
||||||
|
`UserID` INTEGER NOT NULL,
|
||||||
|
`Score` DECIMAL(2, 1) NULL,
|
||||||
|
`date` DATETIME(0) NOT NULL,
|
||||||
|
|
||||||
|
INDEX `idx_beatmapID`(`BeatmapID`),
|
||||||
|
PRIMARY KEY (`RatingID`)
|
||||||
|
) DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
|
||||||
|
|
||||||
|
-- CreateTable
|
||||||
|
CREATE TABLE `setretrieveinfo` (
|
||||||
|
`LastRetrieval` DATETIME(0) NULL,
|
||||||
|
`LastDate` DATE NULL
|
||||||
|
) DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
|
||||||
|
|
||||||
|
-- CreateTable
|
||||||
|
CREATE TABLE `user_correlations` (
|
||||||
|
`user1_id` INTEGER NULL,
|
||||||
|
`user2_id` INTEGER NULL,
|
||||||
|
`correlation` FLOAT NULL,
|
||||||
|
|
||||||
|
UNIQUE INDEX `user_correlations_pk`(`user1_id`, `user2_id`)
|
||||||
|
) DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
|
||||||
|
|
||||||
|
-- CreateTable
|
||||||
|
CREATE TABLE `user_relations` (
|
||||||
|
`UserIDFrom` INTEGER NULL,
|
||||||
|
`UserIDTo` INTEGER NULL,
|
||||||
|
`type` INTEGER NULL,
|
||||||
|
|
||||||
|
UNIQUE INDEX `user_relations_pk`(`UserIDTo`, `UserIDFrom`)
|
||||||
|
) DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
|
||||||
|
|
||||||
|
-- CreateTable
|
||||||
|
CREATE TABLE `users` (
|
||||||
|
`UserID` INTEGER NOT NULL,
|
||||||
|
`Username` VARCHAR(255) NULL,
|
||||||
|
`AccessToken` VARCHAR(2000) NULL,
|
||||||
|
`RefreshToken` VARCHAR(2000) NULL,
|
||||||
|
`banned` BOOLEAN NULL DEFAULT false,
|
||||||
|
`Weight` DECIMAL(6, 4) NULL,
|
||||||
|
`DoTrueRandom` BOOLEAN NOT NULL DEFAULT false,
|
||||||
|
`Custom00Rating` VARCHAR(60) NOT NULL DEFAULT '',
|
||||||
|
`Custom05Rating` VARCHAR(60) NOT NULL DEFAULT '',
|
||||||
|
`Custom10Rating` VARCHAR(60) NOT NULL DEFAULT '',
|
||||||
|
`Custom15Rating` VARCHAR(60) NOT NULL DEFAULT '',
|
||||||
|
`Custom20Rating` VARCHAR(60) NOT NULL DEFAULT '',
|
||||||
|
`Custom25Rating` VARCHAR(60) NOT NULL DEFAULT '',
|
||||||
|
`Custom30Rating` VARCHAR(60) NOT NULL DEFAULT '',
|
||||||
|
`Custom35Rating` VARCHAR(60) NOT NULL DEFAULT '',
|
||||||
|
`Custom40Rating` VARCHAR(60) NOT NULL DEFAULT '',
|
||||||
|
`Custom45Rating` VARCHAR(60) NOT NULL DEFAULT '',
|
||||||
|
`Custom50Rating` VARCHAR(60) NOT NULL DEFAULT '',
|
||||||
|
`LastAccessedSite` TIMESTAMP(0) NOT NULL DEFAULT CURRENT_TIMESTAMP(0),
|
||||||
|
`HideRatings` BOOLEAN NULL DEFAULT false,
|
||||||
|
|
||||||
|
PRIMARY KEY (`UserID`)
|
||||||
|
) DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
|
3
prisma/migrations/migration_lock.toml
Normal file
3
prisma/migrations/migration_lock.toml
Normal file
|
@ -0,0 +1,3 @@
|
||||||
|
# Please do not edit this file manually
|
||||||
|
# It should be added in your version-control system (i.e. Git)
|
||||||
|
provider = "mysql"
|
191
prisma/schema.prisma
Normal file
191
prisma/schema.prisma
Normal file
|
@ -0,0 +1,191 @@
|
||||||
|
generator client {
|
||||||
|
provider = "prisma-client-js"
|
||||||
|
previewFeatures = ["fullTextIndex", "fullTextSearch"]
|
||||||
|
}
|
||||||
|
|
||||||
|
datasource db {
|
||||||
|
provider = "mysql"
|
||||||
|
url = "mysql://root:example@localhost:3306/omdb"
|
||||||
|
}
|
||||||
|
|
||||||
|
model apikeys {
|
||||||
|
ApiID Int @id @default(autoincrement())
|
||||||
|
Name String? @db.Text
|
||||||
|
ApiKey String? @unique(map: "ApiKey", length: 255) @db.Text
|
||||||
|
UserID Int?
|
||||||
|
}
|
||||||
|
|
||||||
|
model beatmap_creators {
|
||||||
|
BeatmapID Int
|
||||||
|
CreatorID Int
|
||||||
|
|
||||||
|
@@id([BeatmapID, CreatorID])
|
||||||
|
@@index([BeatmapID], map: "idx_BeatmapID")
|
||||||
|
}
|
||||||
|
|
||||||
|
model beatmap_edit_requests {
|
||||||
|
EditID Int @id @default(autoincrement())
|
||||||
|
BeatmapID Int?
|
||||||
|
SetID Int?
|
||||||
|
UserID Int
|
||||||
|
EditData Json
|
||||||
|
Timestamp DateTime @default(now()) @db.Timestamp(0)
|
||||||
|
Status beatmap_edit_requests_Status? @default(Pending)
|
||||||
|
EditorID Int?
|
||||||
|
}
|
||||||
|
|
||||||
|
model beatmaps {
|
||||||
|
BeatmapID Int @id @db.UnsignedMediumInt
|
||||||
|
SetID Int? @db.UnsignedMediumInt
|
||||||
|
SetCreatorID Int?
|
||||||
|
DifficultyName String? @db.VarChar(255)
|
||||||
|
Mode Int @default(0) @db.UnsignedTinyInt
|
||||||
|
Status Int @default(0) @db.TinyInt
|
||||||
|
SR Float @default(0) @db.Float
|
||||||
|
Rating String? @db.VarChar(45)
|
||||||
|
ChartRank Int?
|
||||||
|
ChartYearRank Int?
|
||||||
|
Timestamp DateTime? @default(now()) @db.Timestamp(0)
|
||||||
|
RatingCount Int?
|
||||||
|
WeightedAvg Float? @db.Float
|
||||||
|
Genre Int?
|
||||||
|
Lang Int?
|
||||||
|
Artist String? @db.VarChar(255)
|
||||||
|
Title String? @db.VarChar(255)
|
||||||
|
DateRanked DateTime? @db.Timestamp(0)
|
||||||
|
Blacklisted Boolean @default(false)
|
||||||
|
BlacklistReason String? @db.Text
|
||||||
|
controversy Decimal? @db.Decimal(10, 8)
|
||||||
|
|
||||||
|
@@index([SetID], map: "beatmapset_id")
|
||||||
|
@@fulltext([DifficultyName, Artist, Title], map: "Artist")
|
||||||
|
}
|
||||||
|
|
||||||
|
/// The underlying table does not contain a valid unique identifier and can therefore currently not be handled by Prisma Client.
|
||||||
|
model beatmapset_nominators {
|
||||||
|
SetID Int?
|
||||||
|
NominatorID Int?
|
||||||
|
Mode Int?
|
||||||
|
|
||||||
|
@@unique([SetID, NominatorID, Mode], map: "beatmapset_nominators_pk")
|
||||||
|
@@index([SetID], map: "beatmapset_nominators_SetID_index")
|
||||||
|
@@ignore
|
||||||
|
}
|
||||||
|
|
||||||
|
model blacklist {
|
||||||
|
UserID Int @id
|
||||||
|
}
|
||||||
|
|
||||||
|
model comments {
|
||||||
|
CommentID Int @id @default(autoincrement())
|
||||||
|
UserID Int
|
||||||
|
SetID Int
|
||||||
|
Comment String? @db.Text
|
||||||
|
date DateTime? @default(now()) @db.Timestamp(0)
|
||||||
|
}
|
||||||
|
|
||||||
|
model descriptor_votes {
|
||||||
|
VoteID Int @id @default(autoincrement())
|
||||||
|
BeatmapID Int
|
||||||
|
UserID Int
|
||||||
|
Vote Boolean
|
||||||
|
DescriptorID Int
|
||||||
|
|
||||||
|
@@unique([BeatmapID, UserID, DescriptorID], map: "descriptor_votes_pk2")
|
||||||
|
@@index([BeatmapID], map: "descriptor_votes_BeatmapID_index")
|
||||||
|
}
|
||||||
|
|
||||||
|
model descriptors {
|
||||||
|
DescriptorID Int @id @default(autoincrement())
|
||||||
|
Name String @unique(map: "descriptors_pk2") @db.VarChar(40)
|
||||||
|
ShortDescription String? @db.Text
|
||||||
|
ParentID Int?
|
||||||
|
Usable Boolean @default(true)
|
||||||
|
}
|
||||||
|
|
||||||
|
model logs {
|
||||||
|
LogID Int @id @default(autoincrement())
|
||||||
|
UserID Int
|
||||||
|
LogData Json?
|
||||||
|
}
|
||||||
|
|
||||||
|
model mappernames {
|
||||||
|
UserID Int @id
|
||||||
|
Username String? @db.VarChar(255)
|
||||||
|
}
|
||||||
|
|
||||||
|
model rating_tags {
|
||||||
|
UserID Int?
|
||||||
|
BeatmapID Int?
|
||||||
|
Tag String? @db.VarChar(150)
|
||||||
|
TagID Int @id @default(autoincrement())
|
||||||
|
|
||||||
|
@@unique([BeatmapID, UserID, Tag], map: "rating_tags_pk")
|
||||||
|
}
|
||||||
|
|
||||||
|
model ratings {
|
||||||
|
RatingID Int @id @default(autoincrement())
|
||||||
|
BeatmapID Int
|
||||||
|
UserID Int
|
||||||
|
Score Decimal? @db.Decimal(2, 1)
|
||||||
|
date DateTime @db.DateTime(0)
|
||||||
|
|
||||||
|
@@index([BeatmapID], map: "idx_beatmapID")
|
||||||
|
}
|
||||||
|
|
||||||
|
/// The underlying table does not contain a valid unique identifier and can therefore currently not be handled by Prisma Client.
|
||||||
|
model setretrieveinfo {
|
||||||
|
LastRetrieval DateTime? @db.DateTime(0)
|
||||||
|
LastDate DateTime? @db.Date
|
||||||
|
|
||||||
|
@@ignore
|
||||||
|
}
|
||||||
|
|
||||||
|
/// The underlying table does not contain a valid unique identifier and can therefore currently not be handled by Prisma Client.
|
||||||
|
model user_correlations {
|
||||||
|
user1_id Int?
|
||||||
|
user2_id Int?
|
||||||
|
correlation Float? @db.Float
|
||||||
|
|
||||||
|
@@unique([user1_id, user2_id], map: "user_correlations_pk")
|
||||||
|
@@ignore
|
||||||
|
}
|
||||||
|
|
||||||
|
/// The underlying table does not contain a valid unique identifier and can therefore currently not be handled by Prisma Client.
|
||||||
|
model user_relations {
|
||||||
|
UserIDFrom Int?
|
||||||
|
UserIDTo Int?
|
||||||
|
type Int?
|
||||||
|
|
||||||
|
@@unique([UserIDTo, UserIDFrom], map: "user_relations_pk")
|
||||||
|
@@ignore
|
||||||
|
}
|
||||||
|
|
||||||
|
model users {
|
||||||
|
UserID Int @id
|
||||||
|
Username String? @db.VarChar(255)
|
||||||
|
AccessToken String? @db.VarChar(2000)
|
||||||
|
RefreshToken String? @db.VarChar(2000)
|
||||||
|
banned Boolean? @default(false)
|
||||||
|
Weight Decimal? @db.Decimal(6, 4)
|
||||||
|
DoTrueRandom Boolean @default(false)
|
||||||
|
Custom00Rating String @default("") @db.VarChar(60)
|
||||||
|
Custom05Rating String @default("") @db.VarChar(60)
|
||||||
|
Custom10Rating String @default("") @db.VarChar(60)
|
||||||
|
Custom15Rating String @default("") @db.VarChar(60)
|
||||||
|
Custom20Rating String @default("") @db.VarChar(60)
|
||||||
|
Custom25Rating String @default("") @db.VarChar(60)
|
||||||
|
Custom30Rating String @default("") @db.VarChar(60)
|
||||||
|
Custom35Rating String @default("") @db.VarChar(60)
|
||||||
|
Custom40Rating String @default("") @db.VarChar(60)
|
||||||
|
Custom45Rating String @default("") @db.VarChar(60)
|
||||||
|
Custom50Rating String @default("") @db.VarChar(60)
|
||||||
|
LastAccessedSite DateTime @default(now()) @db.Timestamp(0)
|
||||||
|
HideRatings Boolean? @default(false)
|
||||||
|
}
|
||||||
|
|
||||||
|
enum beatmap_edit_requests_Status {
|
||||||
|
Pending
|
||||||
|
Denied
|
||||||
|
Approved
|
||||||
|
}
|
|
@ -1,9 +1,9 @@
|
||||||
:root {
|
:root {
|
||||||
--max-width: 1100px;
|
--max-width: 1100px;
|
||||||
--border-radius: 12px;
|
--border-radius: 12px;
|
||||||
--font-mono: ui-monospace, Menlo, Monaco, 'Cascadia Mono', 'Segoe UI Mono',
|
--font-mono: ui-monospace, Menlo, Monaco, "Cascadia Mono", "Segoe UI Mono",
|
||||||
'Roboto Mono', 'Oxygen Mono', 'Ubuntu Monospace', 'Source Code Pro',
|
"Roboto Mono", "Oxygen Mono", "Ubuntu Monospace", "Source Code Pro",
|
||||||
'Fira Mono', 'Droid Sans Mono', 'Courier New', monospace;
|
"Fira Mono", "Droid Sans Mono", "Courier New", monospace;
|
||||||
|
|
||||||
--foreground-rgb: 0, 0, 0;
|
--foreground-rgb: 0, 0, 0;
|
||||||
--background-start-rgb: 214, 219, 220;
|
--background-start-rgb: 214, 219, 220;
|
||||||
|
@ -38,6 +38,8 @@
|
||||||
--callout-border-rgb: 172, 175, 176;
|
--callout-border-rgb: 172, 175, 176;
|
||||||
--card-rgb: 180, 185, 188;
|
--card-rgb: 180, 185, 188;
|
||||||
--card-border-rgb: 131, 134, 135;
|
--card-border-rgb: 131, 134, 135;
|
||||||
|
|
||||||
|
--accent-1: DarkSlateGrey;
|
||||||
}
|
}
|
||||||
|
|
||||||
@media (prefers-color-scheme: dark) {
|
@media (prefers-color-scheme: dark) {
|
||||||
|
@ -86,6 +88,8 @@ body {
|
||||||
}
|
}
|
||||||
|
|
||||||
body {
|
body {
|
||||||
|
position: relative;
|
||||||
|
font-family: Verdana, Geneva, Tahoma, sans-serif;
|
||||||
color: rgb(var(--foreground-rgb));
|
color: rgb(var(--foreground-rgb));
|
||||||
background: linear-gradient(
|
background: linear-gradient(
|
||||||
to bottom,
|
to bottom,
|
||||||
|
@ -95,6 +99,11 @@ body {
|
||||||
rgb(var(--background-start-rgb));
|
rgb(var(--background-start-rgb));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
.container {
|
||||||
|
max-width: 980px;
|
||||||
|
margin: auto;
|
||||||
|
}
|
||||||
|
|
||||||
a {
|
a {
|
||||||
color: inherit;
|
color: inherit;
|
||||||
text-decoration: none;
|
text-decoration: none;
|
|
@ -1,22 +1,23 @@
|
||||||
import './globals.css'
|
import TopBar from "@/components/TopBar";
|
||||||
import type { Metadata } from 'next'
|
import "./globals.scss";
|
||||||
import { Inter } from 'next/font/google'
|
import type { Metadata } from "next";
|
||||||
|
|
||||||
const inter = Inter({ subsets: ['latin'] })
|
|
||||||
|
|
||||||
export const metadata: Metadata = {
|
export const metadata: Metadata = {
|
||||||
title: 'Create Next App',
|
title: "Create Next App",
|
||||||
description: 'Generated by create next app',
|
description: "Generated by create next app",
|
||||||
}
|
};
|
||||||
|
|
||||||
export default function RootLayout({
|
export default function RootLayout({
|
||||||
children,
|
children,
|
||||||
}: {
|
}: {
|
||||||
children: React.ReactNode
|
children: React.ReactNode;
|
||||||
}) {
|
}) {
|
||||||
return (
|
return (
|
||||||
<html lang="en">
|
<html lang="en">
|
||||||
<body className={inter.className}>{children}</body>
|
<body>
|
||||||
|
<TopBar />
|
||||||
|
{children}
|
||||||
|
</body>
|
||||||
</html>
|
</html>
|
||||||
)
|
);
|
||||||
}
|
}
|
||||||
|
|
|
@ -15,7 +15,6 @@
|
||||||
max-width: var(--max-width);
|
max-width: var(--max-width);
|
||||||
width: 100%;
|
width: 100%;
|
||||||
z-index: 2;
|
z-index: 2;
|
||||||
font-family: var(--font-mono);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
.description a {
|
.description a {
|
||||||
|
@ -36,7 +35,6 @@
|
||||||
|
|
||||||
.code {
|
.code {
|
||||||
font-weight: 700;
|
font-weight: 700;
|
||||||
font-family: var(--font-mono);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
.grid {
|
.grid {
|
||||||
|
@ -51,7 +49,9 @@
|
||||||
border-radius: var(--border-radius);
|
border-radius: var(--border-radius);
|
||||||
background: rgba(var(--card-rgb), 0);
|
background: rgba(var(--card-rgb), 0);
|
||||||
border: 1px solid rgba(var(--card-border-rgb), 0);
|
border: 1px solid rgba(var(--card-border-rgb), 0);
|
||||||
transition: background 200ms, border 200ms;
|
transition:
|
||||||
|
background 200ms,
|
||||||
|
border 200ms;
|
||||||
}
|
}
|
||||||
|
|
||||||
.card span {
|
.card span {
|
||||||
|
@ -97,7 +97,7 @@
|
||||||
|
|
||||||
.center::before,
|
.center::before,
|
||||||
.center::after {
|
.center::after {
|
||||||
content: '';
|
content: "";
|
||||||
left: 50%;
|
left: 50%;
|
||||||
position: absolute;
|
position: absolute;
|
||||||
filter: blur(45px);
|
filter: blur(45px);
|
||||||
|
|
108
src/app/page.tsx
108
src/app/page.tsx
|
@ -1,95 +1,25 @@
|
||||||
import Image from 'next/image'
|
import Image from "next/image";
|
||||||
import styles from './page.module.css'
|
import styles from "./page.module.css";
|
||||||
|
import { PrismaClient } from "@prisma/client";
|
||||||
|
import RatingTable from "@/components/RatingTable";
|
||||||
|
|
||||||
|
export async function getData() {
|
||||||
|
const prisma = new PrismaClient();
|
||||||
|
|
||||||
|
const comments = await prisma.comments.findMany({ take: 20 });
|
||||||
|
|
||||||
|
return { comments };
|
||||||
|
}
|
||||||
|
|
||||||
|
export default async function Home() {
|
||||||
|
const data = await getData();
|
||||||
|
console.log("data", data);
|
||||||
|
|
||||||
export default function Home() {
|
|
||||||
return (
|
return (
|
||||||
<main className={styles.main}>
|
<main className={styles.main}>
|
||||||
<div className={styles.description}>
|
<div className="flex-container column-when-mobile-container">
|
||||||
<p>
|
<RatingTable />
|
||||||
Get started by editing
|
|
||||||
<code className={styles.code}>src/app/page.tsx</code>
|
|
||||||
</p>
|
|
||||||
<div>
|
|
||||||
<a
|
|
||||||
href="https://vercel.com?utm_source=create-next-app&utm_medium=appdir-template&utm_campaign=create-next-app"
|
|
||||||
target="_blank"
|
|
||||||
rel="noopener noreferrer"
|
|
||||||
>
|
|
||||||
By{' '}
|
|
||||||
<Image
|
|
||||||
src="/vercel.svg"
|
|
||||||
alt="Vercel Logo"
|
|
||||||
className={styles.vercelLogo}
|
|
||||||
width={100}
|
|
||||||
height={24}
|
|
||||||
priority
|
|
||||||
/>
|
|
||||||
</a>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<div className={styles.center}>
|
|
||||||
<Image
|
|
||||||
className={styles.logo}
|
|
||||||
src="/next.svg"
|
|
||||||
alt="Next.js Logo"
|
|
||||||
width={180}
|
|
||||||
height={37}
|
|
||||||
priority
|
|
||||||
/>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<div className={styles.grid}>
|
|
||||||
<a
|
|
||||||
href="https://nextjs.org/docs?utm_source=create-next-app&utm_medium=appdir-template&utm_campaign=create-next-app"
|
|
||||||
className={styles.card}
|
|
||||||
target="_blank"
|
|
||||||
rel="noopener noreferrer"
|
|
||||||
>
|
|
||||||
<h2>
|
|
||||||
Docs <span>-></span>
|
|
||||||
</h2>
|
|
||||||
<p>Find in-depth information about Next.js features and API.</p>
|
|
||||||
</a>
|
|
||||||
|
|
||||||
<a
|
|
||||||
href="https://nextjs.org/learn?utm_source=create-next-app&utm_medium=appdir-template&utm_campaign=create-next-app"
|
|
||||||
className={styles.card}
|
|
||||||
target="_blank"
|
|
||||||
rel="noopener noreferrer"
|
|
||||||
>
|
|
||||||
<h2>
|
|
||||||
Learn <span>-></span>
|
|
||||||
</h2>
|
|
||||||
<p>Learn about Next.js in an interactive course with quizzes!</p>
|
|
||||||
</a>
|
|
||||||
|
|
||||||
<a
|
|
||||||
href="https://vercel.com/templates?framework=next.js&utm_source=create-next-app&utm_medium=appdir-template&utm_campaign=create-next-app"
|
|
||||||
className={styles.card}
|
|
||||||
target="_blank"
|
|
||||||
rel="noopener noreferrer"
|
|
||||||
>
|
|
||||||
<h2>
|
|
||||||
Templates <span>-></span>
|
|
||||||
</h2>
|
|
||||||
<p>Explore the Next.js 13 playground.</p>
|
|
||||||
</a>
|
|
||||||
|
|
||||||
<a
|
|
||||||
href="https://vercel.com/new?utm_source=create-next-app&utm_medium=appdir-template&utm_campaign=create-next-app"
|
|
||||||
className={styles.card}
|
|
||||||
target="_blank"
|
|
||||||
rel="noopener noreferrer"
|
|
||||||
>
|
|
||||||
<h2>
|
|
||||||
Deploy <span>-></span>
|
|
||||||
</h2>
|
|
||||||
<p>
|
|
||||||
Instantly deploy your Next.js site to a shareable URL with Vercel.
|
|
||||||
</p>
|
|
||||||
</a>
|
|
||||||
</div>
|
</div>
|
||||||
</main>
|
</main>
|
||||||
)
|
);
|
||||||
}
|
}
|
||||||
|
|
0
src/components/RatingTable.module.scss
Normal file
0
src/components/RatingTable.module.scss
Normal file
68
src/components/RatingTable.tsx
Normal file
68
src/components/RatingTable.tsx
Normal file
|
@ -0,0 +1,68 @@
|
||||||
|
import styles from "./RatingTable.module.scss";
|
||||||
|
import { PrismaClient } from "@prisma/client";
|
||||||
|
|
||||||
|
export async function getData() {
|
||||||
|
const prisma = new PrismaClient();
|
||||||
|
|
||||||
|
const comments = await prisma.comments.findMany({ take: 20 });
|
||||||
|
|
||||||
|
return { comments };
|
||||||
|
}
|
||||||
|
|
||||||
|
export default async function RatingTable() {
|
||||||
|
return (
|
||||||
|
<div
|
||||||
|
className="flex-child column-when-mobile" // style="width:40%;height:32em;overflow-y:scroll;position:relative;"
|
||||||
|
>
|
||||||
|
<div className="flex-container ratingContainer alternating-bg">
|
||||||
|
<div
|
||||||
|
className="flex-child" // style="margin-left:0.5em;"
|
||||||
|
>
|
||||||
|
<a href="/mapset/115011">
|
||||||
|
<img
|
||||||
|
src="https://b.ppy.sh/thumb/115011l.jpg"
|
||||||
|
className="diffThumb"
|
||||||
|
onerror="this.onerror=null; this.src='/charts/INF.png';"
|
||||||
|
/>
|
||||||
|
</a>
|
||||||
|
</div>
|
||||||
|
<div className="flex-child">
|
||||||
|
<a // style="display:flex;"
|
||||||
|
href="/profile/11237996"
|
||||||
|
>
|
||||||
|
<img
|
||||||
|
src="https://s.ppy.sh/a/11237996"
|
||||||
|
// style="height:24px;width:24px;"
|
||||||
|
title="payney"
|
||||||
|
/>
|
||||||
|
</a>
|
||||||
|
</div>
|
||||||
|
<div
|
||||||
|
className="flex-child" //style="flex:0 0 66%;"
|
||||||
|
>
|
||||||
|
<a // style="display:flex;"
|
||||||
|
href="/profile/11237996"
|
||||||
|
>
|
||||||
|
payney{" "}
|
||||||
|
</a>
|
||||||
|
<div className="starRatingDisplay">
|
||||||
|
<div className="starBackground">
|
||||||
|
<i className="icon-star"></i>
|
||||||
|
<i className="icon-star"></i>
|
||||||
|
<i className="icon-star"></i>
|
||||||
|
<i className="icon-star"></i>
|
||||||
|
<i className="icon-star"></i>
|
||||||
|
</div>
|
||||||
|
<div className="starForeground">
|
||||||
|
<i className="star icon-star"></i>
|
||||||
|
<i className="star icon-star"></i>
|
||||||
|
<i className="star icon-star"></i>
|
||||||
|
<i className="star icon-star"></i>
|
||||||
|
</div>
|
||||||
|
</div>{" "}
|
||||||
|
on <a href="/mapset/115011">Lan</a>{" "}
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
);
|
||||||
|
}
|
29
src/components/SearchBar.tsx
Normal file
29
src/components/SearchBar.tsx
Normal file
|
@ -0,0 +1,29 @@
|
||||||
|
"use client";
|
||||||
|
|
||||||
|
import { ChangeEvent, useState } from "react";
|
||||||
|
|
||||||
|
export default function SearchBar() {
|
||||||
|
const [searchQuery, setSearchQuery] = useState("");
|
||||||
|
|
||||||
|
const changeSearchQuery = (evt: ChangeEvent<HTMLInputElement>) => {
|
||||||
|
setSearchQuery(evt.target.value);
|
||||||
|
// showResult(searchQuery)
|
||||||
|
};
|
||||||
|
|
||||||
|
return (
|
||||||
|
<form className="topBarSearch">
|
||||||
|
<input
|
||||||
|
className="topBarSearchBar"
|
||||||
|
type="text"
|
||||||
|
size={30}
|
||||||
|
// onfocusin="searchFocus()"
|
||||||
|
onChange={changeSearchQuery}
|
||||||
|
value={searchQuery}
|
||||||
|
autoComplete="off"
|
||||||
|
placeholder="Search... (or paste link)"
|
||||||
|
/>
|
||||||
|
|
||||||
|
<div id="topBarSearchResults"></div>
|
||||||
|
</form>
|
||||||
|
);
|
||||||
|
}
|
63
src/components/TopBar.module.scss
Normal file
63
src/components/TopBar.module.scss
Normal file
|
@ -0,0 +1,63 @@
|
||||||
|
.topBar {
|
||||||
|
position: sticky;
|
||||||
|
top: 0px;
|
||||||
|
|
||||||
|
background-color: var(--accent-1);
|
||||||
|
|
||||||
|
.container {
|
||||||
|
display: flex;
|
||||||
|
}
|
||||||
|
|
||||||
|
.spacer {
|
||||||
|
flex-grow: 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
.leftHalf,
|
||||||
|
.rightHalf {
|
||||||
|
display: flex;
|
||||||
|
}
|
||||||
|
|
||||||
|
.searchResults {
|
||||||
|
display: block;
|
||||||
|
}
|
||||||
|
|
||||||
|
.username {
|
||||||
|
color: white;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
.homeLink {
|
||||||
|
margin-right: 8px;
|
||||||
|
color: white;
|
||||||
|
}
|
||||||
|
|
||||||
|
.topBarDropDown {
|
||||||
|
display: inline-block;
|
||||||
|
margin: 0px;
|
||||||
|
padding: 0px;
|
||||||
|
|
||||||
|
.dropdownContent {
|
||||||
|
display: none;
|
||||||
|
position: absolute;
|
||||||
|
background-color: #395f5f;
|
||||||
|
min-width: 8rem;
|
||||||
|
z-index: 1;
|
||||||
|
|
||||||
|
a {
|
||||||
|
float: none;
|
||||||
|
color: white;
|
||||||
|
padding: 0.01rem 1rem;
|
||||||
|
text-decoration: none;
|
||||||
|
display: block;
|
||||||
|
text-align: left;
|
||||||
|
|
||||||
|
&:hover {
|
||||||
|
background-color: DarkSlateGrey;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
&:hover .dropdownContent {
|
||||||
|
display: block;
|
||||||
|
}
|
||||||
|
}
|
75
src/components/TopBar.tsx
Normal file
75
src/components/TopBar.tsx
Normal file
|
@ -0,0 +1,75 @@
|
||||||
|
"use client";
|
||||||
|
|
||||||
|
import SearchBar from "./SearchBar";
|
||||||
|
import styles from "./TopBar.module.scss";
|
||||||
|
import classNames from "classnames";
|
||||||
|
import { GearIcon } from "@radix-ui/react-icons";
|
||||||
|
|
||||||
|
export default function TopBar() {
|
||||||
|
return (
|
||||||
|
<div className={styles.topBar}>
|
||||||
|
<div className={classNames("container", styles.container)}>
|
||||||
|
<div className={styles.leftHalf}>
|
||||||
|
<a href="/" className={styles.homeLink}>
|
||||||
|
OMDB
|
||||||
|
</a>
|
||||||
|
|
||||||
|
<a href="/">
|
||||||
|
<div className="topBarLink">home</div>
|
||||||
|
</a>
|
||||||
|
<a href="/charts/">
|
||||||
|
<div className="topBarLink">charts</div>
|
||||||
|
</a>
|
||||||
|
|
||||||
|
<div className={styles.topBarDropDown}>
|
||||||
|
<div className="topBarLink topBarDropDownButton">maps</div>
|
||||||
|
<div className={styles.dropdownContent}>
|
||||||
|
<a href="/maps/?m=08&y=2023">latest</a>
|
||||||
|
<a href="/random/">random</a>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<SearchBar />
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div className={styles.spacer} />
|
||||||
|
|
||||||
|
<div className={styles.rightHalf}>
|
||||||
|
<div className={styles.topBarDropDown}>
|
||||||
|
<div className="topBarLink topBarDropDownButton">osu! </div>
|
||||||
|
<div className={styles.dropdownContent}>
|
||||||
|
<a id="osuLink" href="">
|
||||||
|
osu!
|
||||||
|
</a>
|
||||||
|
<a id="taikoLink" href="">
|
||||||
|
osu!taiko
|
||||||
|
</a>
|
||||||
|
<a id="catchLink" href="">
|
||||||
|
osu!catch
|
||||||
|
</a>
|
||||||
|
<a id="maniaLink" href="">
|
||||||
|
osu!mania
|
||||||
|
</a>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<a href="/dashboard/">
|
||||||
|
<div className="topBarLink">dashboard</div>
|
||||||
|
</a>
|
||||||
|
<a href="/settings/">
|
||||||
|
<GearIcon />
|
||||||
|
</a>
|
||||||
|
<a href="/profile/2688103" style={{ color: "white" }}>
|
||||||
|
<img
|
||||||
|
src="https://s.ppy.sh/a/2688103"
|
||||||
|
style={{ height: "2rem", verticalAlign: "middle" }}
|
||||||
|
/>
|
||||||
|
|
||||||
|
</a>
|
||||||
|
<a className={styles.username} href="/profile/2688103">
|
||||||
|
<b>IOException</b>
|
||||||
|
</a>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
);
|
||||||
|
}
|
Loading…
Reference in a new issue