diff --git a/platforms/dreamsync-api/src/services/ConsentService.ts b/platforms/dreamsync-api/src/services/ConsentService.ts index 36cd4b5da..5ce347e39 100644 --- a/platforms/dreamsync-api/src/services/ConsentService.ts +++ b/platforms/dreamsync-api/src/services/ConsentService.ts @@ -541,8 +541,18 @@ export class ConsentService { const dreamsyncUser = await this.findDreamSyncUser(); if (!dreamsyncUser) return; - const adminChat = await this.findOrCreateMutualChat(adminUser.id); - if (!adminChat) return; + const adminChatResult = await this.findOrCreateMutualChat(adminUser.id); + if (!adminChatResult.chat) return; + + const adminChat = adminChatResult.chat; + const wasCreated = adminChatResult.wasCreated; + + // If chat was just created, wait 15 seconds before sending message + if (wasCreated) { + console.log(`⏳ Admin chat was just created, waiting 15 seconds before sending message...`); + await new Promise(resolve => setTimeout(resolve, 15000)); + console.log(`✅ 15-second delay completed for admin message`); + } const activity = this.extractActivityFromMatch(match); const messageContent = `$$system-message$$ @@ -602,11 +612,21 @@ DreamSync } console.log(`✅ DreamSync user found: ${dreamsyncUser.id}`); - const adminChat = await this.findOrCreateMutualChat(adminUser.id); - if (!adminChat) { + const adminChatResult = await this.findOrCreateMutualChat(adminUser.id); + if (!adminChatResult.chat) { console.error("❌ Could not find/create admin chat"); return; } + + const adminChat = adminChatResult.chat; + const wasCreated = adminChatResult.wasCreated; + + // If chat was just created, wait 15 seconds before sending message + if (wasCreated) { + console.log(`⏳ Admin chat was just created, waiting 15 seconds before sending message...`); + await new Promise(resolve => setTimeout(resolve, 15000)); + console.log(`✅ 15-second delay completed for admin message`); + } console.log(`✅ Admin chat found/created: ${adminChat.id}`); const activity = this.extractActivityFromMatch(match); @@ -655,8 +675,18 @@ DreamSync const dreamsyncUser = await this.findDreamSyncUser(); if (!dreamsyncUser) return; - const memberChat = await this.findOrCreateMutualChat(originalMember.id); - if (!memberChat) return; + const memberChatResult = await this.findOrCreateMutualChat(originalMember.id); + if (!memberChatResult.chat) return; + + const memberChat = memberChatResult.chat; + const wasCreated = memberChatResult.wasCreated; + + // If chat was just created, wait 15 seconds before sending message + if (wasCreated) { + console.log(`⏳ Member chat was just created, waiting 15 seconds before sending message...`); + await new Promise(resolve => setTimeout(resolve, 15000)); + console.log(`✅ 15-second delay completed for member message`); + } const activity = this.extractActivityFromMatch(match); const messageContent = `$$system-message$$ @@ -697,8 +727,18 @@ DreamSync // Send notification to both users for (const user of [match.userA, match.userB]) { - const userChat = await this.findOrCreateMutualChat(user.id); - if (!userChat) continue; + const userChatResult = await this.findOrCreateMutualChat(user.id); + if (!userChatResult.chat) continue; + + const userChat = userChatResult.chat; + const wasCreated = userChatResult.wasCreated; + + // If chat was just created, wait 15 seconds before sending message + if (wasCreated) { + console.log(`⏳ User chat was just created, waiting 15 seconds before sending message...`); + await new Promise(resolve => setTimeout(resolve, 15000)); + console.log(`✅ 15-second delay completed for user message`); + } const messageContent = `$$system-message$$ @@ -791,8 +831,17 @@ DreamSync const activity = this.extractActivityFromMatch(match); // Send notification to admin with full details - const adminChat = await this.findOrCreateMutualChat(adminUser.id); - if (adminChat) { + const adminChatResult = await this.findOrCreateMutualChat(adminUser.id); + if (adminChatResult.chat) { + const adminChat = adminChatResult.chat; + const wasCreated = adminChatResult.wasCreated; + + // If chat was just created, wait 15 seconds before sending message + if (wasCreated) { + console.log(`⏳ Admin chat was just created, waiting 15 seconds before sending message...`); + await new Promise(resolve => setTimeout(resolve, 15000)); + console.log(`✅ 15-second delay completed for admin message`); + } const adminMessageContent = `$$system-message$$ 👥 New member joined your ${activity} group! @@ -823,8 +872,17 @@ DreamSync } // Send generic notification to new member - const memberChat = await this.findOrCreateMutualChat(newMember.id); - if (memberChat) { + const memberChatResult = await this.findOrCreateMutualChat(newMember.id); + if (memberChatResult.chat) { + const memberChat = memberChatResult.chat; + const wasCreated = memberChatResult.wasCreated; + + // If chat was just created, wait 15 seconds before sending message + if (wasCreated) { + console.log(`⏳ Member chat was just created, waiting 15 seconds before sending message...`); + await new Promise(resolve => setTimeout(resolve, 15000)); + console.log(`✅ 15-second delay completed for member message`); + } const memberMessageContent = `$$system-message$$ Welcome to the ${activity} group! @@ -1158,11 +1216,21 @@ DreamSync return; } - const userChat = await this.findOrCreateMutualChat(userId); - if (!userChat) { + const userChatResult = await this.findOrCreateMutualChat(userId); + if (!userChatResult.chat) { console.error("Could not find/create user chat for group join notification"); return; } + + const userChat = userChatResult.chat; + const wasCreated = userChatResult.wasCreated; + + // If chat was just created, wait 15 seconds before sending message + if (wasCreated) { + console.log(`⏳ User chat was just created, waiting 15 seconds before sending message...`); + await new Promise(resolve => setTimeout(resolve, 15000)); + console.log(`✅ 15-second delay completed for user message`); + } const activity = this.extractActivityFromMatch(match); const messageContent = `$$system-message$$ @@ -1204,11 +1272,21 @@ DreamSync Team return; } - const userChat = await this.findOrCreateMutualChat(userId); - if (!userChat) { + const userChatResult = await this.findOrCreateMutualChat(userId); + if (!userChatResult.chat) { console.error("Could not find/create user chat for group created notification"); return; } + + const userChat = userChatResult.chat; + const wasCreated = userChatResult.wasCreated; + + // If chat was just created, wait 15 seconds before sending message + if (wasCreated) { + console.log(`⏳ User chat was just created, waiting 15 seconds before sending message...`); + await new Promise(resolve => setTimeout(resolve, 15000)); + console.log(`✅ 15-second delay completed for user message`); + } const activity = this.extractActivityFromMatch(match); const messageContent = `$$system-message$$ @@ -1254,15 +1332,16 @@ DreamSync Team /** * Find or create a mutual chat between DreamSync and a user + * Returns both the chat and whether it was just created */ - private async findOrCreateMutualChat(userId: string): Promise { + private async findOrCreateMutualChat(userId: string): Promise<{ chat: Group | null; wasCreated: boolean }> { try { console.log(`🔍 ConsentService: Looking for mutual chat between DreamSync and user: ${userId}`); const dreamsyncUser = await this.findDreamSyncUser(); if (!dreamsyncUser) { console.error("❌ ConsentService: DreamSync user not found for mutual chat creation"); - return null; + return { chat: null, wasCreated: false }; } console.log(`👤 ConsentService: DreamSync user found: ${dreamsyncUser.id} (${dreamsyncUser.name || dreamsyncUser.ename})`); @@ -1292,7 +1371,7 @@ DreamSync Team if (existingChat) { console.log(`✅ ConsentService: Found existing mutual chat: ${existingChat.id}`); console.log(`📋 ConsentService: Chat details: Name="${existingChat.name}", Private=${existingChat.isPrivate}, Members=${existingChat.members?.length || 0}`); - return existingChat; + return { chat: existingChat, wasCreated: false }; } console.log(`🆕 ConsentService: No existing mutual chat found, creating new one...`); @@ -1321,12 +1400,12 @@ DreamSync Team console.log(`✅ ConsentService: Created new mutual chat: ${mutualChat.id}`); console.log(`📋 ConsentService: New chat details: Name="${mutualChat.name}", Private=${mutualChat.isPrivate}, Members=${mutualChat.members?.length || 0}`); - return mutualChat; + return { chat: mutualChat, wasCreated: true }; } catch (error) { console.error("❌ ConsentService: Error finding or creating mutual chat:", error); console.error("❌ ConsentService: Error details:", (error as Error).message); - return null; + return { chat: null, wasCreated: false }; } } @@ -1392,11 +1471,21 @@ DreamSync Team return; } - const userChat = await this.findOrCreateMutualChat(userId); - if (!userChat) { + const userChatResult = await this.findOrCreateMutualChat(userId); + if (!userChatResult.chat) { console.error("❌ Could not find/create user chat for acknowledgment"); return; } + + const userChat = userChatResult.chat; + const wasCreated = userChatResult.wasCreated; + + // If chat was just created, wait 15 seconds before sending message + if (wasCreated) { + console.log(`⏳ User chat was just created, waiting 15 seconds before sending message...`); + await new Promise(resolve => setTimeout(resolve, 15000)); + console.log(`✅ 15-second delay completed for user message`); + } const activity = this.extractActivityFromMatch(match); const messageContent = `$$system-message$$ diff --git a/platforms/dreamsync-api/src/services/GroupService.ts b/platforms/dreamsync-api/src/services/GroupService.ts index 8a1cb196b..8e4189844 100644 --- a/platforms/dreamsync-api/src/services/GroupService.ts +++ b/platforms/dreamsync-api/src/services/GroupService.ts @@ -13,15 +13,39 @@ export class GroupService { return null; } - // Find groups that have exactly the same members + // Use a more efficient query to find groups with exactly these members + const sortedMemberIds = memberIds.sort(); + + // First, try to find groups that have exactly 2 members (for DMs) + if (sortedMemberIds.length === 2) { + const groups = await this.groupRepository + .createQueryBuilder("group") + .leftJoinAndSelect("group.members", "members") + .where("group.isPrivate = :isPrivate", { isPrivate: true }) + .andWhere("group.name LIKE :namePattern", { namePattern: "DreamSync Chat%" }) + .getMany(); + + // Filter groups that have exactly the same 2 members + for (const group of groups) { + if (group.members.length === 2) { + const groupMemberIds = group.members.map((m: User) => m.id).sort(); + + if (groupMemberIds.length === sortedMemberIds.length && + groupMemberIds.every((id: string, index: number) => id === sortedMemberIds[index])) { + return group; + } + } + } + } + + // Fallback to general search for other group sizes const groups = await this.groupRepository .createQueryBuilder("group") .leftJoinAndSelect("group.members", "members") + .where("group.isPrivate = :isPrivate", { isPrivate: true }) .getMany(); // Filter groups that have exactly the same members (order doesn't matter) - const sortedMemberIds = memberIds.sort(); - for (const group of groups) { const groupMemberIds = group.members.map((m: User) => m.id).sort(); @@ -47,6 +71,15 @@ export class GroupService { bannerUrl?: string, originalMatchParticipants?: string[], ): Promise { + // For DreamSync Chat groups, check if a DM already exists between these users + if (isPrivate && name.startsWith("DreamSync Chat") && memberIds.length === 2) { + const existingDM = await this.findGroupByMembers(memberIds); + if (existingDM) { + console.log(`⚠️ DM already exists between users ${memberIds.join(", ")}, returning existing DM: ${existingDM.id}`); + return existingDM; + } + } + const members = await this.userRepository.findBy({ id: In(memberIds), }); diff --git a/platforms/dreamsync-api/src/services/MatchNotificationService.ts b/platforms/dreamsync-api/src/services/MatchNotificationService.ts index 25f96d8c9..1c8dea66f 100644 --- a/platforms/dreamsync-api/src/services/MatchNotificationService.ts +++ b/platforms/dreamsync-api/src/services/MatchNotificationService.ts @@ -51,14 +51,15 @@ export class MatchNotificationService { /** * Find or create a mutual chat between DreamSync user and another user + * Returns both the chat and whether it was just created */ - async findOrCreateMutualChat(targetUserId: string): Promise { + async findOrCreateMutualChat(targetUserId: string): Promise<{ chat: Group | null; wasCreated: boolean }> { console.log(`🔍 Looking for mutual chat between DreamSync and user: ${targetUserId}`); const dreamsyncUser = await this.findDreamSyncUser(); if (!dreamsyncUser) { console.error("❌ Cannot create mutual chat: DreamSync user not found"); - return null; + return { chat: null, wasCreated: false }; } console.log(`👤 DreamSync user found: ${dreamsyncUser.id} (${dreamsyncUser.name || dreamsyncUser.ename})`); @@ -75,7 +76,7 @@ export class MatchNotificationService { if (existingChat) { console.log(`✅ Found existing mutual chat: ${existingChat.id}`); console.log(`📋 Chat details: Name="${existingChat.name}", Private=${existingChat.isPrivate}, Members=${existingChat.members?.length || 0}`); - return existingChat; + return { chat: existingChat, wasCreated: false }; } console.log(`🆕 No existing mutual chat found, creating new one...`); @@ -107,10 +108,10 @@ export class MatchNotificationService { console.log(`✅ Created new mutual chat: ${mutualChat.id}`); console.log(`📋 New chat details: Name="${mutualChat.name}", Private=${mutualChat.isPrivate}, Members=${mutualChat.members?.length || 0}`); - return mutualChat; + return { chat: mutualChat, wasCreated: true }; } catch (error) { console.error("❌ Error creating mutual chat:", error); - return null; + return { chat: null, wasCreated: false }; } } @@ -462,7 +463,7 @@ DreamSync Team`; ); processedMessage = processedMessage.replace( /Pictique<\/a>/g, - `Pictique` + `Pictique` ); } @@ -556,11 +557,21 @@ DreamSync Team`; } // Find or create mutual chat - const userChat = await this.findOrCreateMutualChat(userId); - if (!userChat) { + const userChatResult = await this.findOrCreateMutualChat(userId); + if (!userChatResult.chat) { console.error(`Cannot send notification: Could not find/create chat for user ${userId}`); return; } + + const userChat = userChatResult.chat; + const wasCreated = userChatResult.wasCreated; + + // If chat was just created, wait 15 seconds before sending message + if (wasCreated) { + console.log(`⏳ User chat was just created, waiting 15 seconds before sending message...`); + await new Promise(resolve => setTimeout(resolve, 15000)); + console.log(`✅ 15-second delay completed for user message`); + } // Get other users in the match (excluding current user) const allUserIds = match.matchData?.allUserIds || []; @@ -611,13 +622,24 @@ Reply with the Match ID "${match.id}" to connect with the other ${otherUserIds.l console.log(`📋 Match details: ID=${match.id}, Type=${match.type}, Confidence=${match.matchData.confidence}`); // Find or create mutual chat - const mutualChat = await this.findOrCreateMutualChat(userId); - if (!mutualChat) { + const chatResult = await this.findOrCreateMutualChat(userId); + if (!chatResult.chat) { console.error(`❌ Failed to create mutual chat for user: ${userId}`); return; } + const mutualChat = chatResult.chat; + const wasCreated = chatResult.wasCreated; + console.log(`💬 Using mutual chat: ${mutualChat.id} (${mutualChat.name})`); + console.log(`🆕 Chat was just created: ${wasCreated}`); + + // If chat was just created, wait 15 seconds before sending message + if (wasCreated) { + console.log(`⏳ Chat was just created, waiting 15 seconds before sending message...`); + await new Promise(resolve => setTimeout(resolve, 15000)); + console.log(`✅ 15-second delay completed, proceeding with message`); + } // Generate the match message for this specific user console.log(`🤖 Generating match message for user: ${userId}`); @@ -797,11 +819,21 @@ Reply with the Match ID "${match.id}" if you'd like to join this group. [Match ID: ${match.id}]`; // Find or create mutual chat between DreamSync and the new user - const mutualChat = await this.findOrCreateMutualChat(newUserId); - if (!mutualChat) { + const mutualChatResult = await this.findOrCreateMutualChat(newUserId); + if (!mutualChatResult.chat) { console.error("Failed to find or create mutual chat for new user notification"); return; } + + const mutualChat = mutualChatResult.chat; + const wasCreated = mutualChatResult.wasCreated; + + // If chat was just created, wait 15 seconds before sending message + if (wasCreated) { + console.log(`⏳ User chat was just created, waiting 15 seconds before sending message...`); + await new Promise(resolve => setTimeout(resolve, 15000)); + console.log(`✅ 15-second delay completed for user message`); + } const messageRepository = AppDataSource.getRepository(Message); const message = messageRepository.create({ @@ -857,11 +889,21 @@ Reply with the Match ID "${match.id}" if you'd like to add them to your group. [Match ID: ${match.id}]`; // Find or create mutual chat between DreamSync and the admin - const mutualChat = await this.findOrCreateMutualChat(adminUserId); - if (!mutualChat) { + const mutualChatResult = await this.findOrCreateMutualChat(adminUserId); + if (!mutualChatResult.chat) { console.error("Failed to find or create mutual chat for admin notification"); return; } + + const mutualChat = mutualChatResult.chat; + const wasCreated = mutualChatResult.wasCreated; + + // If chat was just created, wait 15 seconds before sending message + if (wasCreated) { + console.log(`⏳ Admin chat was just created, waiting 15 seconds before sending message...`); + await new Promise(resolve => setTimeout(resolve, 15000)); + console.log(`✅ 15-second delay completed for admin message`); + } const messageRepository = AppDataSource.getRepository(Message); const message = messageRepository.create({ @@ -941,11 +983,21 @@ Reply with the Match ID "${match.id}" if you'd like to add them to your group. } // Find or create mutual chat between DreamSync and admin - const adminChat = await this.findOrCreateMutualChat(adminUser.id); - if (!adminChat) { + const adminChatResult = await this.findOrCreateMutualChat(adminUser.id); + if (!adminChatResult.chat) { console.error(`Failed to create admin chat for user: ${adminUser.id}`); return; } + + const adminChat = adminChatResult.chat; + const wasCreated = adminChatResult.wasCreated; + + // If chat was just created, wait 15 seconds before sending message + if (wasCreated) { + console.log(`⏳ Admin chat was just created, waiting 15 seconds before sending message...`); + await new Promise(resolve => setTimeout(resolve, 15000)); + console.log(`✅ 15-second delay completed for admin message`); + } const activity = this.extractActivityFromMatch(match); const messageContent = `$$system-message$$ @@ -997,11 +1049,21 @@ DreamSync } // Find or create mutual chat between DreamSync and new member - const memberChat = await this.findOrCreateMutualChat(newMember.id); - if (!memberChat) { + const memberChatResult = await this.findOrCreateMutualChat(newMember.id); + if (!memberChatResult.chat) { console.error(`Failed to create member chat for user: ${newMember.id}`); return; } + + const memberChat = memberChatResult.chat; + const wasCreated = memberChatResult.wasCreated; + + // If chat was just created, wait 15 seconds before sending message + if (wasCreated) { + console.log(`⏳ Member chat was just created, waiting 15 seconds before sending message...`); + await new Promise(resolve => setTimeout(resolve, 15000)); + console.log(`✅ 15-second delay completed for member message`); + } const activity = this.extractActivityFromMatch(match); const messageContent = `$$system-message$$