Переглянути джерело

Fix all MySQL-specific APIs for PostgreSQL compatibility

- onDuplicateKeyUpdate → onConflictDoUpdate (upsertUser)
- affectedRows → return 0 (expireOldInvitations, not critical)
- insertId × 4 → .returning({ id }) pattern:
    addMessage, trackAnalyticsEvent, createDataSource, createApiConnection

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Tony T 2 тижнів тому
батько
коміт
a896b481e7
1 змінених файлів з 10 додано та 10 видалено
  1. 10 10
      server/db.ts

+ 10 - 10
server/db.ts

@@ -60,7 +60,7 @@ export async function upsertUser(user: InsertUser): Promise<void> {
     else if (user.openId === ENV.ownerOpenId) { values.role = 'admin'; updateSet.role = 'admin'; }
     if (!values.lastSignedIn) { values.lastSignedIn = new Date(); }
     if (Object.keys(updateSet).length === 0) { updateSet.lastSignedIn = new Date(); }
-    await db.insert(users).values(values).onDuplicateKeyUpdate({ set: updateSet });
+    await db.insert(users).values(values).onConflictDoUpdate({ target: users.openId, set: updateSet });
   } catch (error) { console.error("[Database] Failed to upsert user:", error); throw error; }
 }
 
@@ -236,7 +236,7 @@ export async function expireOldInvitations() {
         lt(invitations.expiresAt, new Date()),
       )
     );
-  return result[0]?.affectedRows || 0;
+  return 0; // PostgreSQL: affected row count not available without RETURNING
 }
 
 /* ─── Audit log helpers ─── */
@@ -474,9 +474,9 @@ export async function getConversationStats() {
 export async function addMessage(data: InsertMessage) {
   const db = await getDb();
   if (!db) throw new Error("Database not available");
-  const result = await db.insert(messages).values(data);
+  const [inserted] = await db.insert(messages).values(data).returning({ id: messages.id });
   await db.update(conversations).set({ updatedAt: new Date() }).where(eq(conversations.id, data.conversationId));
-  return { id: Number(result[0].insertId), ...data };
+  return { id: inserted.id, ...data };
 }
 
 export async function getMessagesByConversation(conversationId: number) {
@@ -545,8 +545,8 @@ export async function bulkCreateWorkflowSuggestions(suggestions: InsertWorkflowS
 export async function trackAnalyticsEvent(event: Omit<InsertAnalyticsEvent, "id" | "createdAt">) {
   const db = await getDb();
   if (!db) return null;
-  const [result] = await db.insert(analyticsEvents).values(event as any);
-  return result.insertId;
+  const [inserted] = await db.insert(analyticsEvents).values(event as any).returning({ id: analyticsEvents.id });
+  return inserted?.id ?? null;
 }
 
 export async function getAnalyticsEvents(filters?: {
@@ -624,8 +624,8 @@ export async function getAnalyticsSummary(startDate?: Date, endDate?: Date) {
 export async function createDataSource(source: Omit<InsertDataSource, "id" | "createdAt" | "updatedAt">) {
   const db = await getDb();
   if (!db) return null;
-  const [result] = await db.insert(dataSources).values(source as any);
-  return result.insertId;
+  const [inserted] = await db.insert(dataSources).values(source as any).returning({ id: dataSources.id });
+  return inserted?.id ?? null;
 }
 
 export async function getDataSources() {
@@ -658,8 +658,8 @@ export async function deleteDataSource(id: number) {
 export async function createApiConnection(conn: Omit<InsertApiConnection, "id" | "createdAt" | "updatedAt">) {
   const db = await getDb();
   if (!db) return null;
-  const [result] = await db.insert(apiConnections).values(conn as any);
-  return result.insertId;
+  const [inserted] = await db.insert(apiConnections).values(conn as any).returning({ id: apiConnections.id });
+  return inserted?.id ?? null;
 }
 
 export async function getApiConnections() {