Started playing around with typescript generic types
This commit is contained in:
@@ -1,41 +0,0 @@
|
||||
import type { RequestHandler } from '@sveltejs/kit'
|
||||
import { isValidURL } from '$lib/utils'
|
||||
import { z } from 'zod'
|
||||
|
||||
export const POST: RequestHandler = async ({ request, fetch }) => {
|
||||
const jellyfinAuthSchema = z.object({
|
||||
serverUrl: z.string().refine((val) => isValidURL(val)),
|
||||
username: z.string(),
|
||||
password: z.string(),
|
||||
deviceId: z.string(),
|
||||
})
|
||||
|
||||
const jellyfinAuthData = await request.json()
|
||||
const jellyfinAuthValidation = jellyfinAuthSchema.safeParse(jellyfinAuthData)
|
||||
if (!jellyfinAuthValidation.success) return new Response('Invalid data in request body', { status: 400 })
|
||||
|
||||
const { serverUrl, username, password, deviceId } = jellyfinAuthValidation.data
|
||||
const authUrl = new URL('/Users/AuthenticateByName', serverUrl).href
|
||||
try {
|
||||
const authResponse = await fetch(authUrl, {
|
||||
method: 'POST',
|
||||
body: JSON.stringify({
|
||||
Username: username,
|
||||
Pw: password,
|
||||
}),
|
||||
headers: {
|
||||
'Content-Type': 'application/json; charset=utf-8',
|
||||
'X-Emby-Authorization': `MediaBrowser Client="Lazuli", Device="Chrome", DeviceId="${deviceId}", Version="1.0.0.0"`,
|
||||
},
|
||||
})
|
||||
if (!authResponse.ok) return new Response('Failed to authenticate', { status: 401 })
|
||||
|
||||
const authData = await authResponse.json()
|
||||
return Response.json({
|
||||
userId: authData.User.Id,
|
||||
accessToken: authData.AccessToken,
|
||||
})
|
||||
} catch {
|
||||
return new Response('Fetch request failed', { status: 404 })
|
||||
}
|
||||
}
|
||||
@@ -15,10 +15,10 @@ export const actions: Actions = {
|
||||
const formData = await request.formData()
|
||||
const { username, password, redirectLocation } = Object.fromEntries(formData)
|
||||
|
||||
const user = Users.getUsername(username.toString(), { includePassword: true })
|
||||
const user = Users.getUsername(username.toString())
|
||||
if (!user) return fail(400, { message: 'Invalid Username' })
|
||||
|
||||
const passwordValid = await compare(password.toString(), user.password!)
|
||||
const passwordValid = await compare(password.toString(), user.password)
|
||||
if (!passwordValid) return fail(400, { message: 'Invalid Password' })
|
||||
|
||||
const authToken = jwt.sign({ id: user.id, username: user.username }, SECRET_JWT_KEY, { expiresIn: '100d' })
|
||||
@@ -33,14 +33,11 @@ export const actions: Actions = {
|
||||
const formData = await request.formData()
|
||||
const { username, password } = Object.fromEntries(formData)
|
||||
|
||||
const existingUsers = Users.allUsers()
|
||||
const existingUsernames = Array.from(existingUsers, (user) => user.username)
|
||||
if (username.toString() in existingUsernames) return fail(400, { message: 'Username already in use' })
|
||||
|
||||
const passwordHash = await hash(password.toString(), 10)
|
||||
const newUser = Users.addUser(username.toString(), passwordHash)
|
||||
if (!newUser) return fail(400, { message: 'Username already in use' })
|
||||
|
||||
const authToken = jwt.sign(newUser, SECRET_JWT_KEY, { expiresIn: '100d' })
|
||||
const authToken = jwt.sign({ id: newUser.id, username: newUser.username }, SECRET_JWT_KEY, { expiresIn: '100d' })
|
||||
|
||||
cookies.set('lazuli-auth', authToken, { path: '/', httpOnly: true, sameSite: 'strict', secure: false, maxAge: 60 * 60 * 24 * 100 })
|
||||
|
||||
|
||||
@@ -12,6 +12,7 @@ export const load: PageServerLoad = async ({ fetch, locals }) => {
|
||||
})
|
||||
|
||||
const userConnections = await connectionsResponse.json()
|
||||
|
||||
return { connections: userConnections.connections }
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user