feat: add /meta apis
All checks were successful
Lint Codebase / lint (push) Successful in 54s

This commit is contained in:
TheClashFruit 2024-09-01 15:47:31 +02:00
parent bd27f0084c
commit 0a8b61c472
Signed by: TheClashFruit
GPG key ID: 09BB24C34C2F3204
8 changed files with 159 additions and 9 deletions

View file

@ -7,4 +7,6 @@ export type * from './gallery';
export type * from './spacial_data'; export type * from './spacial_data';
export type * from './minecraft'; export type * from './minecraft';
export type * from './settings'; export type * from './settings';
export type * from './responses';

4
interfaces/responses.ts Normal file
View file

@ -0,0 +1,4 @@
export interface ErrorResponse {
code: number;
message: string;
}

View file

@ -1,5 +1,5 @@
import { Badge } from '@/utils/badges'; import { BadgeNamed } from '@/utils/badges';
import { Permission } from '@/utils/permissions'; import { PermissionNamed } from '@/utils/permissions';
export interface User { export interface User {
id: BigInt; id: BigInt;
@ -16,9 +16,13 @@ export interface User {
discordId: BigInt; discordId: BigInt;
permissions: Permission[]; permissions: PermissionNamed[];
badges: Badge[]; badges: BadgeNamed[];
createdAt: Date; createdAt: Date;
updatedAt: Date; updatedAt: Date;
}
export interface TeamMember extends User {
role: string;
} }

View file

@ -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'; import mysql, { Pool, QueryResult } from 'mysql2/promise';
class Database { class Database {
@ -21,6 +24,58 @@ class Database {
Database.instance = this; Database.instance = this;
} }
/**
* Get a user from their id.
*
* @param id User's id
*
* @returns User
*/
async getUser(id: BigInt): Promise<User> {
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<TeamMember[]> {
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; export default Database;

View file

@ -0,0 +1,20 @@
import getConfig from 'next/config';
import type { NextApiRequest, NextApiResponse } from 'next';
export default function handler(
req: NextApiRequest,
res: NextApiResponse<any>,
) {
const { publicRuntimeConfig } = getConfig();
let { git } = publicRuntimeConfig;
git.commit.created = new Date(git.commit.created).getTime();
res
.status(200)
.json({
git,
});
}

36
pages/api/v1/meta/team.ts Normal file
View file

@ -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<TeamMember[] | ErrorResponse>,
) {
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'
});
}
}

View file

@ -9,15 +9,20 @@ export enum Badge {
Supporter = 1 << 1, // "Donator" Supporter = 1 << 1, // "Donator"
} }
export function getBadges(badges: number): Badge[] { export enum BadgeNamed {
const result: Badge[] = []; Old = 'og',
Supporter = 'supporter',
}
export function getBadges(badges: number): BadgeNamed[] {
const result: BadgeNamed[] = [];
if ((badges & Badge.Old) === Badge.Old) { if ((badges & Badge.Old) === Badge.Old) {
result.push(Badge.Old); result.push(BadgeNamed.Old);
} }
if ((badges & Badge.Supporter) === Badge.Supporter) { if ((badges & Badge.Supporter) === Badge.Supporter) {
result.push(Badge.Supporter); result.push(BadgeNamed.Supporter);
} }
return result; return result;

View file

@ -4,6 +4,30 @@ export enum Permission {
ServerPlayer = 1 << 2 ServerPlayer = 1 << 2
} }
export enum PermissionNamed {
SuperAdmin = 'super_admin',
Admin = 'admin',
ServerPlayer = 'server_player'
}
export function hasPermission(permissions: number, permission: Permission): boolean { export function hasPermission(permissions: number, permission: Permission): boolean {
return (permissions & permission) === permission; 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;
} }