106 lines
2.8 KiB
TypeScript
106 lines
2.8 KiB
TypeScript
import {
|
|
Conversation,
|
|
ConversationMember,
|
|
} from "../../core/models/conversation.model";
|
|
import { client, collections } from "./database.service";
|
|
|
|
import { ObjectId } from "mongodb";
|
|
|
|
export class ConversationService {
|
|
static async getConversationByOtherUserId(otherUserId: ObjectId) {
|
|
// get all of the conversations for this user that have exactly two conversation members
|
|
// get all of the conversationMembers for this user
|
|
// get all of the conversations for this user
|
|
// get all of the conversations
|
|
// const query = { googleId: userId };
|
|
// const res = await collections.users?.findOne(query);
|
|
// // exists
|
|
// if (res?._id) {
|
|
// return res as User;
|
|
// }
|
|
// return null;
|
|
}
|
|
|
|
static async getConversationsByIds(convoIds: ObjectId[]) {
|
|
const query = { _id: { $in: convoIds } };
|
|
|
|
const convosRes = await collections.conversations?.find(query).toArray();
|
|
|
|
// exists
|
|
if (convosRes?.length) {
|
|
return convosRes as Conversation[];
|
|
}
|
|
|
|
return null;
|
|
}
|
|
|
|
static async getConversationsMembersByUserId(userId: string) {
|
|
const query = { userId: new ObjectId(userId) };
|
|
|
|
const convoMembersRes = await collections.conversationMembers
|
|
?.find(query)
|
|
.toArray();
|
|
|
|
// exists
|
|
if (convoMembersRes?.length) {
|
|
return convoMembersRes as ConversationMember[];
|
|
}
|
|
|
|
return null;
|
|
}
|
|
|
|
static async createConversation(
|
|
convo: Conversation,
|
|
convoMembers: ConversationMember[]
|
|
) {
|
|
const session = client.startSession();
|
|
try {
|
|
const transactionResults = await session.withTransaction(async () => {
|
|
// todo: check if convoMembers userId's actually exist
|
|
|
|
const insertConvoRes = await collections.conversations?.insertOne(
|
|
convo
|
|
);
|
|
if (!insertConvoRes?.insertedId) {
|
|
await session.abortTransaction();
|
|
console.error("failed to create convo");
|
|
|
|
return;
|
|
}
|
|
|
|
const insertConvoMembersRes =
|
|
await collections.conversationMembers?.insertMany(convoMembers);
|
|
if (!insertConvoMembersRes?.insertedCount) {
|
|
await session.abortTransaction();
|
|
console.error("failed to create conversation members");
|
|
|
|
return;
|
|
}
|
|
|
|
console.log("success");
|
|
return insertConvoMembersRes;
|
|
});
|
|
|
|
console.log(transactionResults);
|
|
|
|
return "success";
|
|
|
|
// if (transactionResults) {
|
|
// console.log("The convo was successfully created.");
|
|
// return transactionResults;
|
|
// } else {
|
|
// console.log("The convo was intentionally aborted.");
|
|
// return null;
|
|
// }
|
|
} catch (e) {
|
|
console.log(
|
|
"The transaction was aborted due to an unexpected error: " + e
|
|
);
|
|
} finally {
|
|
await session.endSession();
|
|
}
|
|
|
|
return null;
|
|
}
|
|
}
|