WIP: Make login with api work
This commit is contained in:
@@ -1,40 +1,43 @@
|
|||||||
import { db } from '$lib/server/db';
|
import { redirect, type Handle, type HandleFetch } from '@sveltejs/kit';
|
||||||
import { sessionsTable } from '$lib/server/db/schema';
|
|
||||||
import { eq } from 'drizzle-orm';
|
|
||||||
import { redirect, type Handle } from '@sveltejs/kit';
|
|
||||||
|
|
||||||
export const handle: Handle = async ({ event, resolve }) => {
|
export const handle: Handle = async ({ event, resolve }) => {
|
||||||
const sessionId = event.cookies.get('session_id');
|
const sessionId = event.cookies.get('session_id');
|
||||||
let user = {
|
let user = {
|
||||||
isLoggedIn: false,
|
isLoggedIn: false,
|
||||||
email: "",
|
email: '',
|
||||||
username: ""
|
username: ''
|
||||||
};
|
};
|
||||||
|
|
||||||
if (sessionId) {
|
if (sessionId) {
|
||||||
const session = await db.query.sessionsTable.findFirst({
|
const response = await fetch('http://localhost/api/user/me', {
|
||||||
with: {
|
headers: {
|
||||||
user: true
|
'Content-Type': 'application/json'
|
||||||
},
|
}
|
||||||
where: eq(sessionsTable.id, sessionId)
|
});
|
||||||
});
|
console.log(response.status);
|
||||||
|
console.log(JSON.stringify(response));
|
||||||
|
|
||||||
if (session && session.user && session.user.email) {
|
if (response.status >= 200 && response.status < 300) {
|
||||||
user = {
|
const uBody = await response.json();
|
||||||
isLoggedIn: true,
|
user = {
|
||||||
email: session.user.email,
|
isLoggedIn: true,
|
||||||
username: session.user.username || "Unknown username"
|
email: uBody.email,
|
||||||
};
|
username: uBody.display_name || 'Unknown username'
|
||||||
}
|
};
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
if (event.url.pathname.startsWith("/private") && !user.isLoggedIn) {
|
if (event.url.pathname.startsWith('/private') && !user.isLoggedIn) {
|
||||||
redirect(307, "/error");
|
redirect(307, '/error');
|
||||||
} else if (event.url.pathname.startsWith("/api") && !user.isLoggedIn) {
|
} else if (event.url.pathname.startsWith('/api') && !user.isLoggedIn) {
|
||||||
return new Response(null, { status: 401 });
|
return new Response(null, { status: 401 });
|
||||||
}
|
}
|
||||||
|
|
||||||
event.locals.user = user;
|
event.locals.user = user;
|
||||||
const response = await resolve(event);
|
const response = await resolve(event);
|
||||||
return response;
|
return response;
|
||||||
}
|
};
|
||||||
|
|
||||||
|
// export const handleFetch: HandleFetch = async({request, fetch}) => {
|
||||||
|
// if (request.url
|
||||||
|
// }
|
||||||
|
|||||||
@@ -1,43 +0,0 @@
|
|||||||
import { env } from "$env/dynamic/public";
|
|
||||||
|
|
||||||
export const generateRandomString = (length: number) => {
|
|
||||||
const possible = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789';
|
|
||||||
const values = crypto.getRandomValues(new Uint8Array(length));
|
|
||||||
return values.reduce((acc, x) => acc + possible[x % possible.length], "");
|
|
||||||
}
|
|
||||||
|
|
||||||
export const sha256 = async (plain: string) => {
|
|
||||||
const encoder = new TextEncoder()
|
|
||||||
const data = encoder.encode(plain)
|
|
||||||
return crypto.subtle.digest('SHA-256', data)
|
|
||||||
}
|
|
||||||
|
|
||||||
export const base64encode = (input: ArrayBuffer) => {
|
|
||||||
return btoa(String.fromCharCode(...new Uint8Array(input)))
|
|
||||||
.replace(/=/g, '')
|
|
||||||
.replace(/\+/g, '-')
|
|
||||||
.replace(/\//g, '_');
|
|
||||||
}
|
|
||||||
|
|
||||||
export const getToken = async (code: string, codeVerifier: string) => {
|
|
||||||
const url = "https://accounts.spotify.com/api/token";
|
|
||||||
const payload = {
|
|
||||||
method: 'POST',
|
|
||||||
headers: {
|
|
||||||
'Content-Type': 'application/x-www-form-urlencoded'
|
|
||||||
},
|
|
||||||
body: new URLSearchParams({
|
|
||||||
client_id: env.PUBLIC_CLIENT_ID,
|
|
||||||
grant_type: 'authorization_code',
|
|
||||||
code,
|
|
||||||
redirect_uri: env.PUBLIC_REDIRECT_URI,
|
|
||||||
code_verifier: codeVerifier
|
|
||||||
})
|
|
||||||
};
|
|
||||||
|
|
||||||
const body = await fetch(url, payload);
|
|
||||||
const response = await body.json();
|
|
||||||
|
|
||||||
return response;
|
|
||||||
}
|
|
||||||
|
|
||||||
@@ -1,10 +0,0 @@
|
|||||||
import { drizzle } from 'drizzle-orm/better-sqlite3';
|
|
||||||
import Database from 'better-sqlite3';
|
|
||||||
import * as schema from './schema';
|
|
||||||
import { env } from '$env/dynamic/private';
|
|
||||||
|
|
||||||
if (!env.DATABASE_URL) throw new Error('DATABASE_URL is not set');
|
|
||||||
|
|
||||||
const client = new Database(env.DATABASE_URL);
|
|
||||||
|
|
||||||
export const db = drizzle(client, { schema });
|
|
||||||
@@ -1,55 +0,0 @@
|
|||||||
import { relations } from 'drizzle-orm';
|
|
||||||
import { sqliteTable, integer, text, type AnySQLiteColumn, primaryKey } from 'drizzle-orm/sqlite-core';
|
|
||||||
|
|
||||||
export const usersTable = sqliteTable('users', {
|
|
||||||
email: text('email').primaryKey(),
|
|
||||||
username: text('username'),
|
|
||||||
});
|
|
||||||
|
|
||||||
export const sessionsTable = sqliteTable('sessions', {
|
|
||||||
id: text('id').primaryKey(),
|
|
||||||
accessToken: text('access_token'),
|
|
||||||
refreshToken: text('refresh_token'),
|
|
||||||
userEmail: text('user_email').references((): AnySQLiteColumn => usersTable.email)
|
|
||||||
});
|
|
||||||
|
|
||||||
export const sessionsRelations = relations(sessionsTable, ({ one }) => ({
|
|
||||||
user: one(usersTable, { fields: [sessionsTable.userEmail], references: [usersTable.email] })
|
|
||||||
}))
|
|
||||||
|
|
||||||
export const userRelations = relations(usersTable, ({ one, many }) => ({
|
|
||||||
session: one(sessionsTable),
|
|
||||||
usersInLobby: many(usersInLobby)
|
|
||||||
}));
|
|
||||||
|
|
||||||
export const lobbysTable = sqliteTable('lobbys', {
|
|
||||||
id: integer('id').primaryKey({ autoIncrement: true }),
|
|
||||||
hostEmail: text('host_email').references((): AnySQLiteColumn => usersTable.email),
|
|
||||||
});
|
|
||||||
|
|
||||||
export const lobbysRelations = relations(lobbysTable, ({ many }) => ({
|
|
||||||
usersInLobby: many(usersInLobby)
|
|
||||||
}));
|
|
||||||
|
|
||||||
export const usersInLobby = sqliteTable('user_in_lobby', {
|
|
||||||
userEmail: text('user_email').notNull().references((): AnySQLiteColumn => usersTable.email),
|
|
||||||
lobbyId: integer('lobby_id').notNull().references((): AnySQLiteColumn => lobbysTable.id)
|
|
||||||
}, (t) => [
|
|
||||||
primaryKey({ columns: [t.userEmail, t.lobbyId] })
|
|
||||||
])
|
|
||||||
|
|
||||||
export const usersToLobbysRelations = relations(usersInLobby, ({ one }) => ({
|
|
||||||
lobby: one(lobbysTable, {
|
|
||||||
fields: [usersInLobby.lobbyId],
|
|
||||||
references: [lobbysTable.id]
|
|
||||||
}),
|
|
||||||
user: one(usersTable, {
|
|
||||||
fields: [usersInLobby.userEmail],
|
|
||||||
references: [usersTable.email]
|
|
||||||
})
|
|
||||||
}));
|
|
||||||
|
|
||||||
export const states = sqliteTable('auth_states', {
|
|
||||||
id: text('id').primaryKey(),
|
|
||||||
codeVerifier: text('code_verifier').notNull()
|
|
||||||
})
|
|
||||||
@@ -1,18 +0,0 @@
|
|||||||
export const getJson = async (accessToken: string, subUri: string) => {
|
|
||||||
const baseUrl = new URL("https://api.spotify.com/");
|
|
||||||
const requestUrl = new URL(subUri, baseUrl);
|
|
||||||
|
|
||||||
const response = await fetch(requestUrl, {
|
|
||||||
method: 'GET',
|
|
||||||
headers: {
|
|
||||||
"Authorization": `Bearer ${accessToken}`
|
|
||||||
}
|
|
||||||
})
|
|
||||||
|
|
||||||
if (!response.ok) {
|
|
||||||
console.log(response)
|
|
||||||
return null
|
|
||||||
}
|
|
||||||
|
|
||||||
return response
|
|
||||||
}
|
|
||||||
@@ -1,11 +0,0 @@
|
|||||||
import { redirect } from "@sveltejs/kit";
|
|
||||||
import { getJson } from "./base"
|
|
||||||
|
|
||||||
export const getCurrentUserProfile = async (accessToken: string) => {
|
|
||||||
const response = await getJson(accessToken, "/v1/me");
|
|
||||||
if (!response) {
|
|
||||||
redirect(307, "/error")
|
|
||||||
}
|
|
||||||
|
|
||||||
return await response.json()
|
|
||||||
}
|
|
||||||
Reference in New Issue
Block a user