import { GoogleUserInfo, User } from '@nirvana/core/models'; import { ObjectId } from 'mongodb'; import { UserStatus } from '../../core/models/user.model'; import axios from 'axios'; import { collections } from './database.service'; export class UserService { static async getUserById(userId: string) { const query = { _id: new ObjectId(userId) }; const res = await collections.users?.findOne(query); // exists if (res?._id) { return res as User; } return null; } static async getUsersByIds(userIds: ObjectId[]) { const query = { _id: { $in: userIds } }; const res = await collections.users?.find(query).toArray(); // exists if (res?.length) { return res as User[]; } return undefined; } static async getUserByGoogleId(googleUserId: string) { const query = { googleId: googleUserId }; const res = await collections.users?.findOne(query); // exists if (res?._id) { return res as User; } return null; } static async getUserByEmail(email: string) { const query = { email }; const res = await collections.users?.findOne(query); // exists if (res?._id) { return res as User; } return null; } static async getUsersLikeEmailAndName(searchQuery: string) { // based on index defined in Mongo atlas const query = { $search: { index: 'basic user search', text: { query: searchQuery, path: { wildcard: '*', }, }, }, }; // const res = await collections.users?.find(query).toArray(); const res = await collections.users?.aggregate([query]).toArray(); // exists if (res?.length) { return res as User[]; } return null; } static async createUserIfNotExists(newUser: User) { const getUser = await this.getUserByEmail(newUser.email); if (!getUser) { return await collections.users?.insertOne(newUser); } // user with email exists already, don't create return null; } static async getGoogleUserInfoWithAccessToken(accessToken: string): Promise { return ( await axios.get(`https://www.googleapis.com/oauth2/v1/userinfo?access_token=${accessToken}`) ).data; } static async updateUserStatus(userGoogleId: string, newStatus: UserStatus) { const query = { googleId: userGoogleId }; const updateDoc = { $set: { status: newStatus, lastUpdatedDate: new Date() }, }; const resultUpdate = await collections.users?.updateOne(query, updateDoc); return resultUpdate; } }