Skip to content

Commit

Permalink
feat: get logged in user
Browse files Browse the repository at this point in the history
  • Loading branch information
TheClashFruit committed Aug 1, 2024
1 parent bcd419c commit e3009a0
Show file tree
Hide file tree
Showing 3 changed files with 83 additions and 2 deletions.
66 changes: 66 additions & 0 deletions src/routes/v1/user/@me.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,66 @@
import Method from '../../../enum/method';
import Status from '../../../enum/status';

import { Request, Response } from '../../../util/handler';
import { User } from '../../../interfaces/user';

import { verify } from 'jsonwebtoken';

import Database from '../../../util/database';

interface ZleedJWT {
id: bigint;
email: string;
username: string;
iat: number;
exp: number;
}

export default function handler(req: Request, res: Response<User>) {
const jwtToken = req.getHeader('Authorization');

if (!jwtToken) {
return res.error(Status.UNAUTHORIZED, 'error.auth.noToken');
}

const tokenSplit = jwtToken.split(' ');

if (
!(tokenSplit.length > 1) ||
jwtToken.split(' ')[0].toLowerCase() !== 'bearer'
) {
return res.error(Status.UNAUTHORIZED, 'error.auth.invalidToken');
}

const token = tokenSplit[1];

verify(token, process.env.JWT_SECRET!, async (err, decoded) => {
if (err) {
return res.error(Status.UNAUTHORIZED, 'error.auth.invalidToken');
}

const data = decoded as ZleedJWT;

data.id = BigInt(data.id);

if (req.method === Method.GET) {
const user = await Database.getUser(data.id);

res.status(Status.OK).json({
id: user.id,
username: user.username,
displayName: user.displayName,
email: user.email,
avatar: user.avatar,
banner: user.banner,
badges: user.badges,
connections: user.connections,
streamTitle: user.streamTitle,
streamKeys: user.streamKeys,
lastLive: user.lastLive,
createdAt: user.createdAt,
updatedAt: user.updatedAt
});
}
});
}
15 changes: 15 additions & 0 deletions src/util/database.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
import { User } from '../models';

class Database {
static async getUser(
id: string | number | bigint | boolean
): Promise<any | undefined> {
const user = await User.findOne({ id: BigInt(id) });

if (!user) return undefined;

return user;
}
}

export default Database;
4 changes: 2 additions & 2 deletions src/util/handler.ts
Original file line number Diff line number Diff line change
Expand Up @@ -21,11 +21,11 @@ export class Request {
this.params = req.params;
}

getHeader(key: string): string {
getHeader(key: string): string | undefined {
return this.headers[key.toLowerCase()];
}

getParam(key: string) {
getParam(key: string): string | number | undefined {
return this.params[key.toLowerCase()];
}
}
Expand Down

0 comments on commit e3009a0

Please sign in to comment.