Optimize User Info Storage & Reduce API Calls to DB

This commit is contained in:
2024-02-23 03:44:05 +00:00
parent ac7317a0b7
commit bafcd88fa1
4 changed files with 35 additions and 55 deletions
+28 -6
View File
@@ -4,8 +4,9 @@ import { NextResponse } from "next/server";
import { auth } from "firebase-admin";
import { signInWithEmailAndPassword } from "firebase/auth";
// Lib Imports
import { auth as authConfig } from "../firebase-config";
import { app, auth as authConfig } from "../firebase-config";
import { customInitApp } from "../firebase-admin";
import { getDatabase, ref, get as firebaseGet } from "firebase/database";
// Needs to "init" on each call to the API
customInitApp();
@@ -16,9 +17,31 @@ async function handleEmailAndPassword(email, password) {
var userCredential = await signInWithEmailAndPassword(authConfig,email,password);
if (userCredential.user.accessToken) {
var token = await auth().verifyIdToken(userCredential.user.accessToken);
var expiresIn = 20 * 60 * 1000; // 20 minutes
var sessionCookie = await auth().createSessionCookie(userCredential.user.accessToken, {expiresIn,});
if (token) {
var expiresIn = 20 * 60 * 1000; // 20 minutes
var sessionCookie = await auth().createSessionCookie(userCredential.user.accessToken, {expiresIn,});
var database = getDatabase(app)
var user = await firebaseGet(ref(database, `users/${userCredential.user.uid}`));
if (!user.exists()) {
var userOptions = {
name: "user",
value: JSON.stringify({firstName: 'DNE', uid: userCredential.user.uid}),
maxAge: expiresIn, // 20 mins
httpOnly: true,
secure: true,
};
} else {
var userData = user.val()
userData.uid = userCredential.user.uid
var userOptions = {
name: "user",
value: JSON.stringify(userData),
maxAge: expiresIn, // 20 mins
httpOnly: true,
secure: true,
};
}
cookies().set(userOptions);
var options = {
name: "session",
value: sessionCookie,
@@ -27,14 +50,13 @@ async function handleEmailAndPassword(email, password) {
secure: true,
};
cookies().set(options);
var uid_options = {
cookies().set({
name: "uid",
value: userCredential.user.uid,
maxAge: expiresIn, // 20 mins
httpOnly: true,
secure: true,
};
cookies().set(uid_options);
});
return NextResponse.json({ options }, { status: 200 });
}
}
+3 -10
View File
@@ -3,15 +3,8 @@ import { NextResponse } from "next/server";
export async function GET(req) {
cookies().set({
name: "session",
value: "",
maxAge: -1,
});
cookies().set({
name: "firstName",
value: "",
maxAge: -1,
});
cookies().delete('user')
cookies().delete('session')
cookies().delete('uid')
return NextResponse.json({}, { status: 200 });
}
+2 -32
View File
@@ -1,37 +1,7 @@
import { NextResponse } from "next/server";
import { cookies } from "next/headers";
import { app } from "../firebase-config";
import { getDatabase, ref, get as firebaseGet } from "firebase/database";
export async function POST(req,res) {
var uid = await req?.json()
var database = getDatabase(app)
var user = await firebaseGet(ref(database, `users/${uid}`));
if (!user.exists()) {
return NextResponse.json({
firstName: "not-found",
lastName: "not-found",
uid: "not-found",
});
} else {
cookies().set("firstName",user.val()?.firstName)
cookies().set("lastName",user.val()?.lastName)
cookies().set("uid",uid)
return NextResponse.json({
firstName: user.val()?.firstName,
lastName: user.val()?.lastName,
uid: uid,
})
}
}
export async function GET(req) {
var uid = cookies().get("uid")?.value
var database = getDatabase(app)
var user = await firebaseGet(ref(database, `users/${uid}`));
return NextResponse.json({
firstName: user.val()?.firstName,
lastName: user.val()?.lastName,
uid: cookies().get("uid")?.value,
})
var userData = cookies().get("user")?.value
return NextResponse.json(JSON.parse(userData))
}
+2 -7
View File
@@ -21,13 +21,8 @@ export async function middleware(req, res) {
}
// If new user, redirect to onboarding
var { uid } = await responseAPI.json()
var user = await fetch(new URL("/api/user", req.url), {
method: "POST",
body: JSON.stringify(uid ? uid : {}),
});
user = await user.json();
if (user.firstName !== "not-found") {
var user = JSON.parse(req.cookies.get("user").value)
if (user.firstName !== "DNE") {
return NextResponse.next();
} else {
return NextResponse.redirect(new URL("/onboarding", req.url));