Optimize User Info Storage & Reduce API Calls to DB
This commit is contained in:
@@ -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,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 });
|
||||
}
|
||||
@@ -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))
|
||||
}
|
||||
@@ -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));
|
||||
|
||||
Reference in New Issue
Block a user