data reimport

This commit is contained in:
Michael Zhang 2023-09-05 20:45:38 -05:00
parent 841a48a955
commit bbdb03e377
7 changed files with 271 additions and 152 deletions

View file

@ -56,8 +56,8 @@ CREATE TABLE `beatmaps` (
`BlacklistReason` TEXT NULL, `BlacklistReason` TEXT NULL,
`controversy` DECIMAL(10, 8) NULL, `controversy` DECIMAL(10, 8) NULL,
INDEX `Artist`(`DifficultyName`, `Artist`, `Title`),
INDEX `beatmapset_id`(`SetID`), INDEX `beatmapset_id`(`SetID`),
FULLTEXT INDEX `Artist`(`DifficultyName`, `Artist`, `Title`),
PRIMARY KEY (`BeatmapID`) PRIMARY KEY (`BeatmapID`)
) DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; ) DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;

View file

@ -1,191 +1,217 @@
generator client { generator client {
provider = "prisma-client-js" provider = "prisma-client-js"
previewFeatures = ["fullTextIndex", "fullTextSearch"]
} }
datasource db { datasource db {
provider = "mysql" provider = "mysql"
url = "mysql://root:example@localhost:3306/omdb" url = env("DATABASE_URL")
} }
model apikeys { model ApiKey {
ApiID Int @id @default(autoincrement()) ApiID Int @id @default(autoincrement())
Name String? @db.Text Name String? @db.Text
ApiKey String? @unique(map: "ApiKey", length: 255) @db.Text ApiKey String? @unique(map: "ApiKey", length: 255) @db.Text
UserID Int? UserID Int?
@@map("apikeys")
} }
model beatmap_creators { model BeatmapCreator {
BeatmapID Int BeatmapID Int
CreatorID Int CreatorID Int
@@id([BeatmapID, CreatorID]) @@id([BeatmapID, CreatorID])
@@index([BeatmapID], map: "idx_BeatmapID") @@index([BeatmapID], map: "idx_BeatmapID")
@@map("beatmap_creators")
} }
model beatmap_edit_requests { model BeatmapEditRequest {
EditID Int @id @default(autoincrement()) EditID Int @id @default(autoincrement())
BeatmapID Int? BeatmapID Int?
SetID Int? SetID Int?
UserID Int UserID Int
EditData Json EditData Json
Timestamp DateTime @default(now()) @db.Timestamp(0) Timestamp DateTime @default(now()) @db.Timestamp(0)
Status beatmap_edit_requests_Status? @default(Pending) Status BeatmapEditRequestStatus? @default(Pending)
EditorID Int? EditorID Int?
@@map("beatmap_edit_requests")
} }
model beatmaps { model Beatmap {
BeatmapID Int @id @db.UnsignedMediumInt BeatmapID Int @id @db.UnsignedMediumInt
SetID Int? @db.UnsignedMediumInt SetID Int? @db.UnsignedMediumInt
SetCreatorID Int? SetCreatorID Int?
DifficultyName String? @db.VarChar(255) DifficultyName String? @db.VarChar(255)
Mode Int @default(0) @db.UnsignedTinyInt Mode Int @default(0) @db.UnsignedTinyInt
Status Int @default(0) @db.TinyInt Status Int @default(0) @db.TinyInt
SR Float @default(0) @db.Float SR Float @default(0) @db.Float
Rating String? @db.VarChar(45) Rating String? @db.VarChar(45)
ChartRank Int? ChartRank Int?
ChartYearRank Int? ChartYearRank Int?
Timestamp DateTime? @default(now()) @db.Timestamp(0) Timestamp DateTime? @default(now()) @db.Timestamp(0)
RatingCount Int? RatingCount Int?
WeightedAvg Float? @db.Float WeightedAvg Float? @db.Float
Genre Int? Genre Int?
Lang Int? Lang Int?
Artist String? @db.VarChar(255) Artist String? @db.VarChar(255)
Title String? @db.VarChar(255) Title String? @db.VarChar(255)
DateRanked DateTime? @db.Timestamp(0) DateRanked DateTime? @db.Timestamp(0)
Blacklisted Boolean @default(false) Blacklisted Boolean @default(false)
BlacklistReason String? @db.Text BlacklistReason String? @db.Text
controversy Decimal? @db.Decimal(10, 8) controversy Decimal? @db.Decimal(10, 8)
@@index([SetID], map: "beatmapset_id") @@index([DifficultyName, Artist, Title], map: "Artist")
@@fulltext([DifficultyName, Artist, Title], map: "Artist") @@index([SetID], map: "beatmapset_id")
@@map("beatmaps")
} }
/// The underlying table does not contain a valid unique identifier and can therefore currently not be handled by Prisma Client. /// The underlying table does not contain a valid unique identifier and can therefore currently not be handled by Prisma Client.
model beatmapset_nominators { model BeatmapSetNominator {
SetID Int? SetID Int?
NominatorID Int? NominatorID Int?
Mode Int? Mode Int?
@@unique([SetID, NominatorID, Mode], map: "beatmapset_nominators_pk") @@unique([SetID, NominatorID, Mode], map: "beatmapset_nominators_pk")
@@index([SetID], map: "beatmapset_nominators_SetID_index") @@index([SetID], map: "beatmapset_nominators_SetID_index")
@@ignore @@map("beatmapset_nominators")
@@ignore
} }
model blacklist { model Blacklist {
UserID Int @id UserID Int @id
@@map("blacklist")
} }
model comments { model Comment {
CommentID Int @id @default(autoincrement()) CommentID Int @id @default(autoincrement())
UserID Int UserID Int
SetID Int SetID Int
Comment String? @db.Text Comment String? @db.Text
date DateTime? @default(now()) @db.Timestamp(0) date DateTime? @default(now()) @db.Timestamp(0)
@@map("comments")
} }
model descriptor_votes { model DescriptorVote {
VoteID Int @id @default(autoincrement()) VoteID Int @id @default(autoincrement())
BeatmapID Int BeatmapID Int
UserID Int UserID Int
Vote Boolean Vote Boolean
DescriptorID Int DescriptorID Int
@@unique([BeatmapID, UserID, DescriptorID], map: "descriptor_votes_pk2") @@unique([BeatmapID, UserID, DescriptorID], map: "descriptor_votes_pk2")
@@index([BeatmapID], map: "descriptor_votes_BeatmapID_index") @@index([BeatmapID], map: "descriptor_votes_BeatmapID_index")
@@map("descriptor_votes")
} }
model descriptors { model Descriptor {
DescriptorID Int @id @default(autoincrement()) DescriptorID Int @id @default(autoincrement())
Name String @unique(map: "descriptors_pk2") @db.VarChar(40) Name String @unique(map: "descriptors_pk2") @db.VarChar(40)
ShortDescription String? @db.Text ShortDescription String? @db.Text
ParentID Int? ParentID Int?
Usable Boolean @default(true) Usable Boolean @default(true)
@@map("descriptors")
} }
model logs { model Log {
LogID Int @id @default(autoincrement()) LogID Int @id @default(autoincrement())
UserID Int UserID Int
LogData Json? LogData Json?
@@map("logs")
} }
model mappernames { model MapperName {
UserID Int @id UserID Int @id
Username String? @db.VarChar(255) Username String? @db.VarChar(255)
@@map("mappernames")
} }
model rating_tags { model RatingTag {
UserID Int? UserID Int?
BeatmapID Int? BeatmapID Int?
Tag String? @db.VarChar(150) Tag String? @db.VarChar(150)
TagID Int @id @default(autoincrement()) TagID Int @id @default(autoincrement())
@@unique([BeatmapID, UserID, Tag], map: "rating_tags_pk") @@unique([BeatmapID, UserID, Tag], map: "rating_tags_pk")
@@map("rating_tags")
} }
model ratings { model Rating {
RatingID Int @id @default(autoincrement()) RatingID Int @id @default(autoincrement())
BeatmapID Int BeatmapID Int
UserID Int UserID Int
Score Decimal? @db.Decimal(2, 1) Score Decimal? @db.Decimal(2, 1)
date DateTime @db.DateTime(0) date DateTime @db.DateTime(0)
@@index([BeatmapID], map: "idx_beatmapID") @@index([BeatmapID], map: "idx_beatmapID")
@@map("ratings")
} }
/// The underlying table does not contain a valid unique identifier and can therefore currently not be handled by Prisma Client. /// The underlying table does not contain a valid unique identifier and can therefore currently not be handled by Prisma Client.
model setretrieveinfo { model SetRetrieveInfo {
LastRetrieval DateTime? @db.DateTime(0) LastRetrieval DateTime? @db.DateTime(0)
LastDate DateTime? @db.Date LastDate DateTime? @db.Date
@@ignore @@map("setretrieveinfo")
@@ignore
} }
/// The underlying table does not contain a valid unique identifier and can therefore currently not be handled by Prisma Client. /// The underlying table does not contain a valid unique identifier and can therefore currently not be handled by Prisma Client.
model user_correlations { model UserCorrelation {
user1_id Int? user1_id Int?
user2_id Int? user2_id Int?
correlation Float? @db.Float correlation Float? @db.Float
@@unique([user1_id, user2_id], map: "user_correlations_pk") @@unique([user1_id, user2_id], map: "user_correlations_pk")
@@ignore @@map("user_correlations")
@@ignore
} }
/// The underlying table does not contain a valid unique identifier and can therefore currently not be handled by Prisma Client. /// The underlying table does not contain a valid unique identifier and can therefore currently not be handled by Prisma Client.
model user_relations { model UserRelation {
UserIDFrom Int? UserIDFrom Int?
UserIDTo Int? UserIDTo Int?
type Int? type Int?
@@unique([UserIDTo, UserIDFrom], map: "user_relations_pk") @@unique([UserIDTo, UserIDFrom], map: "user_relations_pk")
@@ignore @@map("user_relations")
@@ignore
} }
model users { model User {
UserID Int @id UserID Int @id
Username String? @db.VarChar(255) Username String? @db.VarChar(255)
AccessToken String? @db.VarChar(2000) AccessToken String? @db.VarChar(2000)
RefreshToken String? @db.VarChar(2000) RefreshToken String? @db.VarChar(2000)
banned Boolean? @default(false) banned Boolean? @default(false)
Weight Decimal? @db.Decimal(6, 4) Weight Decimal? @db.Decimal(6, 4)
DoTrueRandom Boolean @default(false) DoTrueRandom Boolean @default(false)
Custom00Rating String @default("") @db.VarChar(60) Custom00Rating String @default("") @db.VarChar(60)
Custom05Rating String @default("") @db.VarChar(60) Custom05Rating String @default("") @db.VarChar(60)
Custom10Rating String @default("") @db.VarChar(60) Custom10Rating String @default("") @db.VarChar(60)
Custom15Rating String @default("") @db.VarChar(60) Custom15Rating String @default("") @db.VarChar(60)
Custom20Rating String @default("") @db.VarChar(60) Custom20Rating String @default("") @db.VarChar(60)
Custom25Rating String @default("") @db.VarChar(60) Custom25Rating String @default("") @db.VarChar(60)
Custom30Rating String @default("") @db.VarChar(60) Custom30Rating String @default("") @db.VarChar(60)
Custom35Rating String @default("") @db.VarChar(60) Custom35Rating String @default("") @db.VarChar(60)
Custom40Rating String @default("") @db.VarChar(60) Custom40Rating String @default("") @db.VarChar(60)
Custom45Rating String @default("") @db.VarChar(60) Custom45Rating String @default("") @db.VarChar(60)
Custom50Rating String @default("") @db.VarChar(60) Custom50Rating String @default("") @db.VarChar(60)
LastAccessedSite DateTime @default(now()) @db.Timestamp(0) LastAccessedSite DateTime @default(now()) @db.Timestamp(0)
HideRatings Boolean? @default(false) HideRatings Boolean? @default(false)
@@map("users")
} }
enum beatmap_edit_requests_Status { enum BeatmapEditRequestStatus {
Pending Pending
Denied Denied
Approved Approved
@@map("beatmap_edit_requests_Status")
} }

View file

@ -3,18 +3,7 @@ import styles from "./page.module.css";
import { PrismaClient } from "@prisma/client"; import { PrismaClient } from "@prisma/client";
import RatingTable from "@/components/RatingTable"; 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() { export default async function Home() {
const data = await getData();
console.log("data", data);
return ( return (
<main className={styles.main}> <main className={styles.main}>
<div className="flex-container column-when-mobile-container"> <div className="flex-container column-when-mobile-container">

View file

@ -0,0 +1,20 @@
.ratingContainer {
background-color: var(--accent-1);
align-items: center;
}
.setImage {
margin-left: 0.5em;
}
.diffThumb {
height: 32px;
width: 32px;
border: 1px solid #ddd;
object-fit: cover;
}
.profilePicture {
width: 24px;
height: 24px;
}

View file

@ -1,20 +1,58 @@
import classNames from "classnames";
import styles from "./RatingTable.module.scss"; import styles from "./RatingTable.module.scss";
import { PrismaClient } from "@prisma/client"; import { PrismaClient } from "@prisma/client";
import StarRatingDisplay from "./StarRatingDisplay";
export async function getData() { export async function getData() {
const prisma = new PrismaClient(); const prisma = new PrismaClient();
const ratings = await prisma.ratings.findMany({ take: 20 });
const comments = await prisma.comments.findMany({ take: 20 }); const comments = await prisma.comments.findMany({ take: 20 });
return { comments }; return { ratings, comments };
} }
export default async function RatingTable() { export default async function RatingTable() {
const { ratings} = await getData();
return ( return (
<div <div
className="flex-child column-when-mobile" // style="width:40%;height:32em;overflow-y:scroll;position:relative;" className="flex-child column-when-mobile" // style="width:40%;height:32em;overflow-y:scroll;position:relative;"
> >
<div className="flex-container ratingContainer alternating-bg"> {ratings.map((rating) => {
return (
<div className={classNames(styles.ratingContainer)}>
<div className={styles.setImage}>
<a href={`/mapset/${rating.SetID}`}>
<img
src={`https://b.ppy.sh/thumb/${rating.SetID}l.jpg`}
className={styles.diffThumb}
// onerror="this.onerror=null; this.src='/charts/INF.png';"
/>
</a>
</div>
<div>
<a href={`/profile/${rating.UserID}`}>
<img
src={`https://s.ppy.sh/a/${rating.UserID}`}
className={styles.profilePicture}
title="<?php echo GetUserNameFromId($row['UserID'], $conn); ?>"
/>
</a>
</div>
<div className="flex-child" style={{flex:"0 0 66%"}}>
{/* <a style="display:flex;" href="/profile/<?php echo $row["UserID"]; ?>">
<?php echo GetUserNameFromId($row["UserID"], $conn); ?>
</a> */}
<StarRatingDisplay rating={rating.Score} /> on
<a href={`/mapset/${rating.SetID}`}>" . mb_strimwidth(htmlspecialchars($row["DifficultyName"]), 0, 35, "...") . "</a>";
?>
</div>
</div>
);
})}
{/* <div className="flex-container ratingContainer alternating-bg">
<div <div
className="flex-child" // style="margin-left:0.5em;" className="flex-child" // style="margin-left:0.5em;"
> >
@ -62,7 +100,7 @@ export default async function RatingTable() {
</div>{" "} </div>{" "}
on <a href="/mapset/115011">Lan</a>{" "} on <a href="/mapset/115011">Lan</a>{" "}
</div> </div>
</div> </div> */}
</div> </div>
); );
} }

View file

@ -0,0 +1,20 @@
.starRatingDisplay {
display: inline-block;
white-space: nowrap;
width: 5em;
padding-right: 0.25em;
}
.starBackground {
color: #203838;
z-index: 0;
display: inline-block;
position: absolute;
}
.starForeground {
color: white;
z-index: 2;
display: inline-block;
position: relative;
}

View file

@ -0,0 +1,26 @@
import { Decimal } from "@prisma/client/runtime/library";
import styles from "./StarRatingDisplay.module.scss";
export interface Props {
rating: Decimal;
}
export default function StarRatingDisplay({ rating }: Props) {
const ratingNumber = rating.toNumber();
const overlay = [0, 1, 2, 3, 4]
.filter((x) => x < ratingNumber)
.map((x) => {
if (ratingNumber - 0.5 === x)
return <i className="star icon-star-half"></i>;
else return <i className="star icon-star"></i>;
});
const backgroundStars = <div className={styles.starBackground}></div>;
return (
<div className={styles.starRatingDisplay}>
{backgroundStars}
<div className={styles.starForeground}>{overlay}</div>
</div>
);
}