diff --git a/interfaces/index.ts b/interfaces/index.ts index 4098b41..f12de52 100644 --- a/interfaces/index.ts +++ b/interfaces/index.ts @@ -7,4 +7,6 @@ export type * from './gallery'; export type * from './spacial_data'; export type * from './minecraft'; -export type * from './settings'; \ No newline at end of file +export type * from './settings'; + +export type * from './responses'; \ No newline at end of file diff --git a/interfaces/responses.ts b/interfaces/responses.ts new file mode 100644 index 0000000..d14f3ff --- /dev/null +++ b/interfaces/responses.ts @@ -0,0 +1,4 @@ +export interface ErrorResponse { + code: number; + message: string; +} \ No newline at end of file diff --git a/interfaces/user.ts b/interfaces/user.ts index 22b61b1..f3ae404 100644 --- a/interfaces/user.ts +++ b/interfaces/user.ts @@ -1,5 +1,5 @@ -import { Badge } from '@/utils/badges'; -import { Permission } from '@/utils/permissions'; +import { BadgeNamed } from '@/utils/badges'; +import { PermissionNamed } from '@/utils/permissions'; export interface User { id: BigInt; @@ -16,9 +16,13 @@ export interface User { discordId: BigInt; - permissions: Permission[]; - badges: Badge[]; + permissions: PermissionNamed[]; + badges: BadgeNamed[]; createdAt: Date; updatedAt: Date; +} + +export interface TeamMember extends User { + role: string; } \ No newline at end of file diff --git a/lib/Database.ts b/lib/Database.ts index 9b5470d..cdb18c3 100644 --- a/lib/Database.ts +++ b/lib/Database.ts @@ -1,3 +1,6 @@ +import { TeamMember, User } from '@/interfaces'; +import { getBadges } from '@/utils/badges'; +import { getPermissions } from '@/utils/permissions'; import mysql, { Pool, QueryResult } from 'mysql2/promise'; class Database { @@ -21,6 +24,58 @@ class Database { Database.instance = this; } + + /** + * Get a user from their id. + * + * @param id User's id + * + * @returns User + */ + async getUser(id: BigInt): Promise { + const [ rows ] = await this.mysqlPool!.query('SELECT * FROM users WHERE id = ?', [ id ]); + + if((rows as any[]).length === 0) + throw new Error('User Not Found'); + + const row = (rows as any[])[0]; + + return { + id: row.id as BigInt, + + username: row.username, + displayName: row.display_name, + + email: row.email, + + avatar: row.avatar, + banner: row.banner, + + accentColor: row.accent_color, + + discordId: row.discord_id as BigInt, + + permissions: getPermissions(row.permissions), + badges: getBadges(row.badges), + + createdAt: row.created_at, + updatedAt: row.updated_at + } as User; + } + + // Meta ----------- + + async getTeam(): Promise { + const [ rows ] = await this.mysqlPool!.query('SELECT * FROM team'); + + const usersPromises = (rows as any[]).map(row => this.getUser(row.user_id)); + const users = await Promise.all(usersPromises); + + return users.map((user, i) => ({ + role: (rows as any[])[i].role, + ...user, + } as TeamMember)); + } } export default Database; \ No newline at end of file diff --git a/pages/api/v1/meta/index.ts b/pages/api/v1/meta/index.ts new file mode 100644 index 0000000..6458a38 --- /dev/null +++ b/pages/api/v1/meta/index.ts @@ -0,0 +1,20 @@ +import getConfig from 'next/config'; + +import type { NextApiRequest, NextApiResponse } from 'next'; + +export default function handler( + req: NextApiRequest, + res: NextApiResponse, +) { + const { publicRuntimeConfig } = getConfig(); + + let { git } = publicRuntimeConfig; + + git.commit.created = new Date(git.commit.created).getTime(); + + res + .status(200) + .json({ + git, + }); +} \ No newline at end of file diff --git a/pages/api/v1/meta/team.ts b/pages/api/v1/meta/team.ts new file mode 100644 index 0000000..1a2d339 --- /dev/null +++ b/pages/api/v1/meta/team.ts @@ -0,0 +1,36 @@ +import { ErrorResponse, TeamMember, User } from '@/interfaces'; + +import Database from '@/lib/Database'; + +import type { NextApiRequest, NextApiResponse } from 'next'; + +export default async function handler( + req: NextApiRequest, + res: NextApiResponse, +) { + const db = new Database(); + + try { + let team: any[] = await db.getTeam(); + + team = team.map((member: TeamMember) => { + return { + ...member, + email: undefined, + discordId: undefined, + + createdAt: new Date(member.createdAt).getTime(), + updatedAt: new Date(member.updatedAt).getTime() + }; + }); + + res.status(200).json(team); + } catch (e) { + console.error(e); + + res.status(500).json({ + code: 500, + message: 'Internal Server Error' + }); + } +} \ No newline at end of file diff --git a/utils/badges.ts b/utils/badges.ts index f25f207..f3db33f 100644 --- a/utils/badges.ts +++ b/utils/badges.ts @@ -9,15 +9,20 @@ export enum Badge { Supporter = 1 << 1, // "Donator" } -export function getBadges(badges: number): Badge[] { - const result: Badge[] = []; +export enum BadgeNamed { + Old = 'og', + Supporter = 'supporter', +} + +export function getBadges(badges: number): BadgeNamed[] { + const result: BadgeNamed[] = []; if ((badges & Badge.Old) === Badge.Old) { - result.push(Badge.Old); + result.push(BadgeNamed.Old); } if ((badges & Badge.Supporter) === Badge.Supporter) { - result.push(Badge.Supporter); + result.push(BadgeNamed.Supporter); } return result; diff --git a/utils/permissions.ts b/utils/permissions.ts index bf3a455..07aa9b3 100644 --- a/utils/permissions.ts +++ b/utils/permissions.ts @@ -4,6 +4,30 @@ export enum Permission { ServerPlayer = 1 << 2 } +export enum PermissionNamed { + SuperAdmin = 'super_admin', + Admin = 'admin', + ServerPlayer = 'server_player' +} + export function hasPermission(permissions: number, permission: Permission): boolean { return (permissions & permission) === permission; +} + +export function getPermissions(permissions: number): PermissionNamed[] { + const result: PermissionNamed[] = []; + + if ((permissions & Permission.SuperAdmin) === Permission.SuperAdmin) { + result.push(PermissionNamed.SuperAdmin); + } + + if ((permissions & Permission.Admin) === Permission.Admin) { + result.push(PermissionNamed.Admin); + } + + if ((permissions & Permission.ServerPlayer) === Permission.ServerPlayer) { + result.push(PermissionNamed.ServerPlayer); + } + + return result; } \ No newline at end of file