Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
14 changes: 14 additions & 0 deletions api/db/index.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
import mysql from "mysql2";

// Create a MySQL connection pool
export const pool = mysql.createPool({
host: process.env.MYSQL_ADDRESS as string,
port: parseInt(process.env.MYSQL_PORT as string),
user: process.env.MYSQL_USER as string,
password: process.env.MYSQL_PASSWORD as string,
database: process.env.MYSQL_DATABASE as string,
});

export * from './init';
export * from './queries/guilds';
export * from './queries/users';
79 changes: 79 additions & 0 deletions api/db/init.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,79 @@
import { pool } from ".";

export async function initTables() {
const createGuildsTable = `
CREATE TABLE IF NOT EXISTS guilds (
id VARCHAR(255) NOT NULL PRIMARY KEY,
name VARCHAR(255),
icon VARCHAR(255),
members INT,
updates_enabled BOOLEAN DEFAULT FALSE,
updates_channel JSON
)
`;
const createUsersTable = `
CREATE TABLE IF NOT EXISTS users (
id VARCHAR(255) NOT NULL,
guild_id VARCHAR(255) NOT NULL,
name VARCHAR(255),
nickname VARCHAR(255),
pfp VARCHAR(255),
xp INT DEFAULT 0,
level INT DEFAULT 0,
xp_needed_next_level INT,
progress_next_level DECIMAL(6, 2),
PRIMARY KEY (id, guild_id),
FOREIGN KEY (guild_id) REFERENCES guilds(id)
)
`;
const createRolesTable = `
CREATE TABLE IF NOT EXISTS roles (
id VARCHAR(255) NOT NULL PRIMARY KEY,
guild_id VARCHAR(255) NOT NULL,
name VARCHAR(255),
level INT NOT NULL,
FOREIGN KEY (guild_id) REFERENCES guilds(id)
)
`
const createUpdatesTable = `
CREATE TABLE IF NOT EXISTS updates (
guild_id VARCHAR(255) NOT NULL PRIMARY KEY,
channel_id VARCHAR(255) NOT NULL,
enabled BOOLEAN DEFAULT FALSE,
FOREIGN KEY (guild_id) REFERENCES guilds(id)
)
`

pool.query(createGuildsTable, (err, results) => {
if (err) {
console.error("Error creating guilds table:", err);
} else {
console.log("Guilds table created:", results);
}
});

pool.query(createUsersTable, (err, results) => {
if (err) {
console.error("Error creating users table:", err);
} else {
console.log("Users table created:", results);
}
});


pool.query(createRolesTable, (err, results) => {
if (err) {
console.error("Error creating roles table:", err);
} else {
console.log("Roles table created:", results);
}
});

pool.query(createUpdatesTable, (err, results) => {
if (err) {
console.error("Error creating updates table:", err);
} else {
console.log("Updates table created:", results);
}
});
}
75 changes: 75 additions & 0 deletions api/db/queries/guilds.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,75 @@
import type { QueryError } from "mysql2";
import { pool } from "..";

export interface Guild {
id: string;
name: string;
icon: string;
members: number;
updates_enabled: boolean;
updates_channel: string;
}

export async function getGuild(guildId: string): Promise<[QueryError | null, Guild | null]> {
return new Promise((resolve, reject) => {
pool.query("SELECT * FROM guilds WHERE id = ?", [guildId], (err, results) => {
if (err) {
reject([err, null]);
} else {
resolve([null, (results as Guild[])[0]]);
}
});
});
}

export async function updateGuild(guild: Guild): Promise<[QueryError, null] | [null, Guild[]]> {
return new Promise((resolve, reject) => {
pool.query(
`
INSERT INTO guilds (id, name, icon, members, updates_enabled, updates_channel)
VALUES (?, ?, ?, ?, ?, ?)
ON DUPLICATE KEY UPDATE
name = VALUES(name),
icon = VALUES(icon),
members = VALUES(members),
updates_enabled = VALUES(updates_enabled),
updates_channel = VALUES(updates_channel)
`,
[
guild.id,
guild.name,
guild.icon,
guild.members,
guild.updates_enabled,
guild.updates_channel,
],
(err, results) => {
if (err) {
reject([err, null]);
} else {
resolve([null, results as Guild[]]);
}
},
);
});
}

interface BotInfo {
total_guilds: number;
total_members: number;
}

export async function getBotInfo(): Promise<[QueryError | null, BotInfo | null]> {
return new Promise((resolve, reject) => {
pool.query("SELECT COUNT(*) AS total_guilds, SUM(members) AS total_members FROM guilds", (err, results) => {
if (err) {
reject([err, null]);
} else {
resolve([null, {
total_guilds: (results as BotInfo[])[0].total_guilds,
total_members: (results as BotInfo[])[0].total_members ?? 0,
}]);
}
})
})
}
38 changes: 38 additions & 0 deletions api/db/queries/users.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,38 @@
import type { QueryError } from "mysql2";
import { pool } from "..";

export interface User {
id: string;
guild_id: string;
name: string;
nickname: string;
pfp: string;
xp: number;
level: number;
xp_needed_next_level: number;
progress_next_level: number;
}

export async function getUsers(guildId: string): Promise<[QueryError, null] | [null, User[]]> {
return new Promise((resolve, reject) => {
pool.query("SELECT * FROM users WHERE guild_id = ? ORDER BY xp DESC", [guildId], (err, results) => {
if (err) {
reject([err, null]);
} else {
resolve([null, (results as User[])]);
}
});
});
}

export async function getUser(userId: string, guildId: string): Promise<[QueryError, null] | [null, User | null]> {
return new Promise((resolve, reject) => {
pool.query("SELECT * FROM users WHERE id = ? AND guild_id = ?", [userId, guildId], (err, results) => {
if (err) {
reject([err, null]);
} else {
resolve([null, (results as User[])[0]]);
}
});
});
}
Loading