Skip to content

Commit

Permalink
Refactor: SQL optimization (RiiConnect24#15)
Browse files Browse the repository at this point in the history
* refactor: Began merging sql requests and grouping private keys

* refactor: User page SQL code refactor and multi-game support

* refactor: User edit page SQL optimized

* refactor: Optimized SQL for edit page
  • Loading branch information
matthe815 authored Sep 13, 2023
1 parent 411c6ff commit 9b44385
Show file tree
Hide file tree
Showing 8 changed files with 274 additions and 248 deletions.
21 changes: 21 additions & 0 deletions prisma/migrations/20230913142372_sqloptimization/migration.sql
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
-- AlterTable
alter table banned_user
add constraint banned_user_user_id_fk
foreign key (user_id) references user (id)
on delete cascade;

alter table game_sessions
modify user_id int not null;

alter table game_sessions
add constraint game_sessions_user_id_fk
foreign key (user_id) references user (id)
on delete cascade;

alter table riitag.game_sessions
modify game_id int unsigned not null;

alter table game_sessions
add constraint game_sessions_game_game_pk_fk
foreign key (game_id) references game (game_pk);

81 changes: 45 additions & 36 deletions prisma/schema.prisma
Original file line number Diff line number Diff line change
Expand Up @@ -23,14 +23,15 @@ model account {
}

model game {
game_pk Int @id @default(autoincrement()) @db.UnsignedInt
game_id String @db.VarChar(50)
console String @db.VarChar(9)
name String? @db.VarChar(255)
playcount Int @default(1) @db.UnsignedInt
first_played DateTime @default(now())
last_played DateTime @default(now()) @updatedAt
playlog playlog[]
game_pk Int @id @default(autoincrement()) @db.UnsignedInt
game_id String @db.VarChar(50)
console String @db.VarChar(9)
name String? @db.VarChar(255)
playcount Int @default(1) @db.UnsignedInt
first_played DateTime @default(now())
last_played DateTime @default(now()) @updatedAt
game_sessions game_sessions[]
playlog playlog[]
@@unique([game_id, console], map: "game_id_console")
@@index([console], map: "console")
Expand Down Expand Up @@ -67,35 +68,37 @@ model following {
}

model user {
id Int @id @default(autoincrement())
username String @unique @db.VarChar(50)
role String @default("user") @db.VarChar(25)
display_name String? @db.VarChar(255)
image String? @db.VarChar(255)
randkey String? @unique @db.VarChar(200)
coins Int @default(0) @db.UnsignedInt
cover_region String @default("EN") @db.VarChar(6)
cover_type String @default("cover3D") @db.VarChar(10)
comment String? @db.VarChar(50)
overlay String @default("overlay1") @db.VarChar(20)
background String @default("riiconnect241.png") @db.VarChar(120)
flag String @default("rc24") @db.VarChar(20)
coin String @default("mario") @db.VarChar(20)
font String @default("default") @db.VarChar(50)
show_avatar Boolean @default(false)
show_mii Boolean @default(false)
mii_type String @default("guest") @db.VarChar(10)
mii_data String? @db.VarChar(8192)
cmoc_entry_no String? @db.VarChar(12)
created_at DateTime @default(now())
updated_at DateTime @default(now()) @updatedAt
badge String? @db.VarChar(50)
isBanned Boolean @default(false)
isPublic Boolean @default(true)
id Int @id @default(autoincrement())
username String @unique @db.VarChar(50)
role String @default("user") @db.VarChar(25)
display_name String? @db.VarChar(255)
image String? @db.VarChar(255)
randkey String? @unique @db.VarChar(200)
coins Int @default(0) @db.UnsignedInt
cover_region String @default("EN") @db.VarChar(6)
cover_type String @default("cover3D") @db.VarChar(10)
comment String? @db.VarChar(50)
overlay String @default("overlay1") @db.VarChar(20)
background String @default("riiconnect241.png") @db.VarChar(120)
flag String @default("rc24") @db.VarChar(20)
coin String @default("mario") @db.VarChar(20)
font String @default("default") @db.VarChar(50)
show_avatar Boolean @default(false)
show_mii Boolean @default(false)
mii_type String @default("guest") @db.VarChar(10)
mii_data String? @db.VarChar(8192)
cmoc_entry_no String? @db.VarChar(12)
created_at DateTime @default(now())
updated_at DateTime @default(now()) @updatedAt
badge String? @db.VarChar(50)
isBanned Boolean @default(false)
isPublic Boolean @default(true)
publicOverride Boolean?
language String @default("en") @db.VarChar(11)
language String @default("en") @db.VarChar(11)
accounts account[]
banned_user banned_user?
following following[]
game_sessions game_sessions[]
playlog playlog[]
}

Expand All @@ -109,9 +112,14 @@ model events {

model game_sessions {
id Int @id @unique(map: "game_sessions_id_uindex") @default(autoincrement())
user_id String @db.VarChar(64)
game_id String @db.VarChar(50)
user_id Int
game_id Int @db.UnsignedInt
start_time DateTime @default(now()) @db.DateTime(0)
game game @relation(fields: [game_id], references: [game_pk], onUpdate: Restrict, map: "game_sessions_game_game_pk_fk")
user user @relation(fields: [user_id], references: [id], onDelete: Cascade, onUpdate: Restrict, map: "game_sessions_user_id_fk")
@@index([user_id], map: "game_sessions_user_id_fk")
@@index([game_id], map: "game_sessions_game_game_pk_fk")
}

model banned_user {
Expand All @@ -120,6 +128,7 @@ model banned_user {
ip_address String @db.VarChar(64)
reason String @db.VarChar(255)
action_time DateTime @default(now()) @db.DateTime(0)
user user @relation(fields: [user_id], references: [id], onDelete: Cascade, onUpdate: Restrict, map: "banned_user_user_id_fk")
}

model moderation_log {
Expand Down
6 changes: 5 additions & 1 deletion src/components/user/PlayLog.jsx
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,10 @@ function PlayLog ({ playlog, current }) {
return duration.humanize()
}

function isPlaying (gameId) {
return current && current.some((session) => session.game.game_id === gameId)
}

const [hydrated, setHydrated] = React.useState(false)
React.useEffect(() => {
// This forces a rerender, so the date is rendered
Expand Down Expand Up @@ -43,7 +47,7 @@ function PlayLog ({ playlog, current }) {
<td>{log.game.name === null ? log.game.game_id : log.game.name}</td>
<td>{log.play_time > 0 ? `${getTimeStamp(log.play_time)}` : 'Not Tracked'}</td>
<td>{log.play_count} times</td>
<td>{current && current.game_id === log.game.game_id ? 'Now' : moment(log.played_on).from()}</td>
<td>{current.length > 0 && isPlaying(log.game.game_id) ? 'Now' : moment(log.played_on).from()}</td>
</tr>
))}
</tbody>
Expand Down
24 changes: 13 additions & 11 deletions src/components/user/PlayingStatus.jsx
Original file line number Diff line number Diff line change
Expand Up @@ -3,23 +3,25 @@ import PropTypes from 'prop-types'
import { Card } from 'react-bootstrap'
import moment from 'moment/moment'

function PlayingStatus ({ session, game }) {
function PlayingStatus ({ session, games: sessions }) {
return (
<Card className='mb-3' bg='success' text='white'>
<Card.Header as='h5'>Now Playing</Card.Header>
<Card.Body>
<ul className='list-unstyled m-0'>
<li><b>Game:</b> {game.name}</li>
<li><b>Started Playing:</b> {moment(session.start_time).from()}</li>
</ul>
</Card.Body>
</Card>
sessions.map((session, index) => (
<Card key={index} className='mb-3' bg='success' text='white'>
<Card.Header as='h5'>Now Playing</Card.Header>
<Card.Body>
<ul className='list-unstyled m-0'>
<li><b>Game:</b> {session.game.name}</li>
<li><b>Started Playing:</b> {moment(session.game.start_time).from()}</li>
</ul>
</Card.Body>
</Card>
))
)
}

PlayingStatus.propTypes = {
session: PropTypes.object.isRequired,
game: PropTypes.object.isRequired
game: PropTypes.array.isRequired
}

export default PlayingStatus
45 changes: 19 additions & 26 deletions src/pages/edit.jsx
Original file line number Diff line number Diff line change
Expand Up @@ -23,20 +23,32 @@ import LanguageContext from '@/components/shared/LanguageContext'
import AppNavbar from '@/components/shared/AppNavbar'

export const getServerSideProps = withSession(async ({ req }) => {
const username = req.session?.username
// get the current user session
const sessionAccount = req.session?.username

const loggedInUser = username != null
const session = sessionAccount != null
? await prisma.user.findUnique({
where: {
username
username: sessionAccount
},
select: {
language: true
language: true,
display_name: true,
cover_region: true,
cover_type: true,
comment: true,
overlay: true,
background: true,
flag: true,
coin: true,
font: true,
show_avatar: true,
show_mii: true
}
})
: { role: 'guest' }
: null

if (!username) {
if (!sessionAccount) {
return {
redirect: {
destination: '/',
Expand All @@ -45,26 +57,7 @@ export const getServerSideProps = withSession(async ({ req }) => {
}
}

const tagInfo = await prisma.user.findUnique({
where: {
username
},
select: {
display_name: true,
cover_region: true,
cover_type: true,
comment: true,
overlay: true,
background: true,
flag: true,
coin: true,
font: true,
show_avatar: true,
show_mii: true
}
})

return { props: { tagInfo, language: loggedInUser?.language || 'en' } }
return { props: { tagInfo: session, language: session?.language || 'en' } }
})

function EditPage ({ tagInfo, language }) {
Expand Down
12 changes: 6 additions & 6 deletions src/pages/game-leaderboard.jsx
Original file line number Diff line number Diff line change
Expand Up @@ -12,14 +12,14 @@ const limit = TOTAL_GAMES_ON_LEADERBOARD

export async function getServerSideProps ({ query }) {
let { page, search } = query
page = page === undefined ? 1 : Number.parseInt(page, 10)
if (Number.isNaN(page) || page <= 0) {
page = 1
}

page = Number.parseInt(page, 10) || 1

if (Number.isNaN(page) || page <= 0) page = 1

// Add logic for the search handler
let leaderboard
let totalGames
let leaderboard, totalGames

if (search) {
// Call your search function here and pass the search parameter
[totalGames, leaderboard] = await getGameLeaderboardSearch(page, limit, search)
Expand Down
Loading

0 comments on commit 9b44385

Please sign in to comment.