75 lines
2.3 KiB
TypeScript
75 lines
2.3 KiB
TypeScript
import { HttpStatusCodes } from './constants.ts'
|
|
import { errors } from 'jose'
|
|
import type { LoginDto, WebSocketCtx, WebSocketData } from './types/types.ts'
|
|
import { createAccessToken, verifyAccessToken } from './utils/jwt.ts'
|
|
import { config } from './config.ts'
|
|
import { messageService } from './grpc/message.ts'
|
|
|
|
export const handlers = {
|
|
async getVersion() {
|
|
try {
|
|
const res = await messageService.getVersion()
|
|
return Response.json(res)
|
|
} catch (error) {
|
|
return Response.json({ message: 'Error' }, { status: HttpStatusCodes.BAD_REQUEST })
|
|
}
|
|
},
|
|
async login(req: Request) {
|
|
try {
|
|
const body: LoginDto = await req.json()
|
|
|
|
const { email } = body
|
|
if (!email) return Response.json({ message: 'email required' }, { status: HttpStatusCodes.BAD_REQUEST })
|
|
|
|
const userResponse = await messageService.getUserByEmail({ email: body.email })
|
|
const user = userResponse.data
|
|
if (!user) return Response.json({ message: 'Invalid email or password' }, { status: HttpStatusCodes.NOT_FOUND })
|
|
|
|
const accessToken = await createAccessToken(user.id, user.email)
|
|
const expires = new Date(Date.now() + config.cookieExpiry * 1000)
|
|
|
|
return Response.json(
|
|
{
|
|
accessToken: accessToken.token,
|
|
tokenType: 'Bearer',
|
|
expires: expires,
|
|
},
|
|
{ status: HttpStatusCodes.CREATED },
|
|
)
|
|
} catch (error) {
|
|
console.log({ error })
|
|
return Response.json({ message: 'Login failed' }, { status: HttpStatusCodes.BAD_REQUEST })
|
|
}
|
|
},
|
|
}
|
|
|
|
export async function upgrade(req: Request, server: Bun.Server<WebSocketCtx>) {
|
|
const payload = await checkRequest(req)
|
|
if (!payload) return new Response('Invalid token', { status: HttpStatusCodes.NOT_FOUND })
|
|
|
|
const success = server.upgrade(req, { data: { userId: +payload.sub, email: payload.email } })
|
|
if (success) return undefined
|
|
|
|
return new Response('Upgrade failed', { status: HttpStatusCodes.BAD_REQUEST })
|
|
}
|
|
|
|
async function checkRequest(req: Request) {
|
|
try {
|
|
const url = new URL(req.url)
|
|
const token = url.searchParams.get('token')
|
|
if (!token) return null
|
|
|
|
return await verifyAccessToken(token)
|
|
} catch (error) {
|
|
if (error instanceof errors.JWTInvalid) {
|
|
console.log('invalid')
|
|
}
|
|
|
|
if (error instanceof errors.JWTExpired) {
|
|
console.log('expired')
|
|
}
|
|
|
|
return null
|
|
}
|
|
}
|