Spaces:
Running
Running
| import passport from "passport"; | |
| import { Express, Request, Response, NextFunction } from "express"; | |
| import session from "express-session"; | |
| import { storage } from "./storage"; | |
| import { User as SelectUser } from "@shared/schema"; | |
| import { setupSession, sessionStore } from "./session"; | |
| // Extend Express.User to include our user type | |
| declare global { | |
| namespace Express { | |
| interface User extends SelectUser {} | |
| } | |
| } | |
| // Set up auth | |
| export function setupAuth(app: Express) { | |
| // Set up session with Postgres backing store | |
| setupSession(app); | |
| // Set up passport | |
| app.use(passport.initialize()); | |
| app.use(passport.session()); | |
| // Serialize and deserialize user | |
| passport.serializeUser((user, done) => { | |
| done(null, user.id); | |
| }); | |
| passport.deserializeUser(async (id: number, done) => { | |
| try { | |
| const user = await storage.getUserProfile(id); | |
| done(null, user); | |
| } catch (error) { | |
| done(error); | |
| } | |
| }); | |
| // Replit Auth endpoint | |
| app.get("/api/auth/replit", async (req: Request, res: Response) => { | |
| try { | |
| const userId = req.headers["x-replit-user-id"]; | |
| const username = req.headers["x-replit-user-name"]; | |
| const profileImage = req.headers["x-replit-user-profile-image"]; | |
| const roles = req.headers["x-replit-user-roles"]; | |
| const teams = req.headers["x-replit-user-teams"]; | |
| if (!userId || !username) { | |
| return res.status(401).json({ message: "Not authenticated with Replit" }); | |
| } | |
| // Find or create user | |
| let user = await storage.getUserByUsername(username as string); | |
| if (!user) { | |
| user = await storage.createUser({ | |
| username: username as string, | |
| password: userId as string, | |
| system_context: `A chat with ${username}. User roles: ${roles || 'none'}. Teams: ${teams || 'none'}.`, | |
| full_name: username as string, | |
| interests: roles ? (roles as string).split(',') : [], | |
| location: '', // Add default empty values for profile fields | |
| profession: '', | |
| pets: '' | |
| }); | |
| } else { | |
| // Update user profile with latest Replit data | |
| user = await storage.updateUserProfile(user.id, { | |
| full_name: username as string, | |
| interests: roles ? (roles as string).split(',') : [], | |
| system_context: `A chat with ${username}. User roles: ${roles || 'none'}. Teams: ${teams || 'none'}.` | |
| }); | |
| } | |
| // Log user in | |
| req.login(user, (err) => { | |
| if (err) { | |
| return res.status(500).json({ message: "Failed to login" }); | |
| } | |
| const { password, ...userWithoutPassword } = user; | |
| res.json(userWithoutPassword); | |
| }); | |
| } catch (error) { | |
| console.error("Replit auth error:", error); | |
| res.status(500).json({ message: "Authentication failed" }); | |
| } | |
| }); | |
| // Get current user route | |
| app.get("/api/user", (req, res) => { | |
| if (!req.isAuthenticated()) { | |
| return res.status(401).json({ message: "Not authenticated" }); | |
| } | |
| const { password, ...userWithoutPassword } = req.user as SelectUser; | |
| res.json(userWithoutPassword); | |
| }); | |
| // Logout route | |
| app.post("/api/logout", (req, res) => { | |
| if (req.session) { | |
| req.session.destroy((err) => { | |
| if (err) { | |
| console.error("Session destruction error:", err); | |
| } | |
| res.clearCookie('connect.sid'); | |
| res.status(200).json({ success: true }); | |
| }); | |
| } else { | |
| res.status(200).json({ success: true }); | |
| } | |
| }); | |
| // Update user profile | |
| app.patch("/api/user/profile", async (req, res, next) => { | |
| if (!req.isAuthenticated()) { | |
| return res.status(401).json({ message: "Not authenticated" }); | |
| } | |
| try { | |
| const userId = (req.user as SelectUser).id; | |
| const updatedUser = await storage.updateUserProfile(userId, req.body); | |
| if (!updatedUser) { | |
| return res.status(404).json({ message: "User not found" }); | |
| } | |
| // Return user without password | |
| const { password, ...userWithoutPassword } = updatedUser; | |
| res.json(userWithoutPassword); | |
| } catch (error) { | |
| next(error); | |
| } | |
| }); | |
| } |