From b68d411db9f0f3bddf8fd042e425ece8b6b90c2b Mon Sep 17 00:00:00 2001 From: huytran17 Date: Sun, 26 May 2024 20:27:37 +0700 Subject: [PATCH] update user eintity for status tracking --- core/server/src/config/socket.io/nsp/client.ts | 16 ++++++++++++---- core/server/src/database/entities/user.ts | 3 +++ core/server/src/database/interfaces/user.ts | 1 + core/server/src/database/schemas/user.ts | 1 + 4 files changed, 17 insertions(+), 4 deletions(-) diff --git a/core/server/src/config/socket.io/nsp/client.ts b/core/server/src/config/socket.io/nsp/client.ts index 9be06c20..ac051bea 100644 --- a/core/server/src/config/socket.io/nsp/client.ts +++ b/core/server/src/config/socket.io/nsp/client.ts @@ -27,10 +27,17 @@ export default function makeInitialClientNsp({ userDb }: { userDb: IUserDb }) { io.of(SocketIONsp.PRIVATE_CLIENT); client_nsp.on(SocketEvents.CONNECT, (socket) => { - socket.on( - ClientEvents.ONLINE, - ({ user_id }: IUserPayload) => (online_users[socket.id] = user_id) - ); + socket.on(ClientEvents.ONLINE, async ({ user_id }: IUserPayload) => { + const user_ids = Array.from(new Set(Object.values(online_users))); + if (!user_ids.includes(user_id)) { + await userDb.update({ + _id: user_id, + is_online: true, + }); + } + + online_users[socket.id] = user_id; + }); socket.on(SocketEvents.DISCONNECT, async () => { const offline_user_id = online_users[socket.id]; @@ -47,6 +54,7 @@ export default function makeInitialClientNsp({ userDb }: { userDb: IUserDb }) { await userDb.update({ _id: offline_user_id, last_online_at: new Date(), + is_online: false, }); }); }); diff --git a/core/server/src/database/entities/user.ts b/core/server/src/database/entities/user.ts index c82bee13..b8e6d0aa 100644 --- a/core/server/src/database/entities/user.ts +++ b/core/server/src/database/entities/user.ts @@ -12,6 +12,7 @@ export default class User implements IUser { public readonly blocked_comment_at?: Date; public readonly is_blocked_comment?: boolean; public readonly is_enabled_2fa?: boolean; + public readonly is_online?: boolean; public readonly tfa_secret?: string; public readonly socialite?: { provider?: string; @@ -42,6 +43,7 @@ export default class User implements IUser { tfa_secret, login_failed_times, last_online_at, + is_online, }: IUser) { this._id = _id; this.ip = ip; @@ -61,5 +63,6 @@ export default class User implements IUser { this.tfa_secret = tfa_secret; this.login_failed_times = login_failed_times; this.last_online_at = last_online_at; + this.is_online = is_online; } } diff --git a/core/server/src/database/interfaces/user.ts b/core/server/src/database/interfaces/user.ts index 1b117009..d275d28c 100644 --- a/core/server/src/database/interfaces/user.ts +++ b/core/server/src/database/interfaces/user.ts @@ -8,6 +8,7 @@ export default interface IUser { avatar?: Record; blocked_comment_at?: Date; is_blocked_comment?: boolean; + is_online?: boolean; is_enabled_2fa?: boolean; avatar_url?: string; email: string; diff --git a/core/server/src/database/schemas/user.ts b/core/server/src/database/schemas/user.ts index 80325efd..7e64dc39 100644 --- a/core/server/src/database/schemas/user.ts +++ b/core/server/src/database/schemas/user.ts @@ -16,6 +16,7 @@ const userSchema = new Schema>( }, is_blocked_comment: { type: Boolean, default: false }, is_enabled_2fa: { type: Boolean, default: false }, + is_online: { type: Boolean, default: false }, blocked_comment_at: { type: Date }, avatar: { type: Object }, email: { type: String, trim: true, lowercase: true, required: true },