This commit is contained in:
parent
bd27f0084c
commit
0a8b61c472
|
@ -8,3 +8,5 @@ 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
4
interfaces/responses.ts
Normal file
|
@ -0,0 +1,4 @@
|
||||||
|
export interface ErrorResponse {
|
||||||
|
code: number;
|
||||||
|
message: string;
|
||||||
|
}
|
|
@ -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;
|
||||||
|
}
|
|
@ -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;
|
20
pages/api/v1/meta/index.ts
Normal file
20
pages/api/v1/meta/index.ts
Normal 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
36
pages/api/v1/meta/team.ts
Normal 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'
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
|
@ -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;
|
||||||
|
|
|
@ -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;
|
||||||
|
}
|
Loading…
Reference in a new issue