Improve user data management by handling updates and inserts more robustly
Modify upsertUser logic in DatabaseStorage to first check for existing user by id or email, then perform an update or insert operation accordingly. Replit-Commit-Author: Agent Replit-Commit-Session-Id: e5565357-90e1-419f-b9a8-6ee8394636df Replit-Commit-Checkpoint-Type: full_checkpoint Replit-Commit-Screenshot-Url: https://storage.googleapis.com/screenshot-production-us-central1/6d543d2c-20b9-4ea6-93fe-70fe9b1d9f80/e5565357-90e1-419f-b9a8-6ee8394636df/DrGaAl6
This commit is contained in:
parent
6b6db9474e
commit
74524206a5
@ -56,7 +56,7 @@ import {
|
||||
type InsertCcnlSetting,
|
||||
} from "@shared/schema";
|
||||
import { db } from "./db";
|
||||
import { eq, and, gte, lte, desc } from "drizzle-orm";
|
||||
import { eq, and, gte, lte, desc, or } from "drizzle-orm";
|
||||
|
||||
export interface IStorage {
|
||||
// User operations (Replit Auth required)
|
||||
@ -163,23 +163,40 @@ export class DatabaseStorage implements IStorage {
|
||||
}
|
||||
|
||||
async upsertUser(userData: UpsertUser): Promise<User> {
|
||||
// Use onConflictDoUpdate to handle both insert and update cases
|
||||
// This handles conflicts on both id (primary key) and email (unique constraint)
|
||||
// Handle conflicts on both id (primary key) and email (unique constraint)
|
||||
// Check if user exists by id or email first
|
||||
const existingUser = await db
|
||||
.select()
|
||||
.from(users)
|
||||
.where(
|
||||
userData.id
|
||||
? or(eq(users.id, userData.id), eq(users.email, userData.email || ''))
|
||||
: eq(users.email, userData.email || '')
|
||||
)
|
||||
.limit(1);
|
||||
|
||||
if (existingUser.length > 0) {
|
||||
// Update existing user - NEVER change the ID (it's a primary key)
|
||||
const [updated] = await db
|
||||
.update(users)
|
||||
.set({
|
||||
...(userData.email && { email: userData.email }),
|
||||
...(userData.name && { name: userData.name }),
|
||||
...(userData.role && { role: userData.role }),
|
||||
updatedAt: new Date(),
|
||||
})
|
||||
.where(eq(users.id, existingUser[0].id))
|
||||
.returning();
|
||||
return updated;
|
||||
} else {
|
||||
// Insert new user
|
||||
const [user] = await db
|
||||
.insert(users)
|
||||
.values(userData)
|
||||
.onConflictDoUpdate({
|
||||
target: users.id,
|
||||
set: {
|
||||
email: userData.email,
|
||||
name: userData.name,
|
||||
role: userData.role,
|
||||
updatedAt: new Date(),
|
||||
},
|
||||
})
|
||||
.returning();
|
||||
return user;
|
||||
}
|
||||
}
|
||||
|
||||
async getAllUsers(): Promise<User[]> {
|
||||
return await db.select().from(users).orderBy(desc(users.createdAt));
|
||||
|
||||
Loading…
Reference in New Issue
Block a user