|
|
@@ -0,0 +1,81 @@
|
|
|
+import { Injectable, Logger } from '@nestjs/common';
|
|
|
+import { UserLoginEventPayload } from '@box/common/events/user-login-event.dto';
|
|
|
+import { PrismaMongoService } from '../../prisma/prisma-mongo.service';
|
|
|
+
|
|
|
+@Injectable()
|
|
|
+export class UserLoginService {
|
|
|
+ private readonly logger = new Logger(UserLoginService.name);
|
|
|
+
|
|
|
+ constructor(private readonly prisma: PrismaMongoService) {}
|
|
|
+
|
|
|
+ // create a function createUser, to create a new user in mongo-stats database model User with fields from event payload
|
|
|
+ async createUser(event: UserLoginEventPayload): Promise<void> {
|
|
|
+ try {
|
|
|
+ // upsert user record based on uid, if user exists, update lastLoginAt, else create new user
|
|
|
+ this.logger.log(`Creating or updating user for uid=${event.uid}`);
|
|
|
+ await this.prisma.user.upsert({
|
|
|
+ where: { uid: event.uid },
|
|
|
+ update: {
|
|
|
+ lastLoginAt:
|
|
|
+ typeof event.loginAt === 'bigint'
|
|
|
+ ? event.loginAt
|
|
|
+ : BigInt(event.loginAt),
|
|
|
+ ip: event.ip,
|
|
|
+ os: event.os ?? null,
|
|
|
+ },
|
|
|
+ create: {
|
|
|
+ uid: event.uid,
|
|
|
+ os: event.os ?? null,
|
|
|
+ createAt:
|
|
|
+ typeof event.loginAt === 'bigint'
|
|
|
+ ? event.loginAt
|
|
|
+ : BigInt(event.loginAt),
|
|
|
+ lastLoginAt:
|
|
|
+ typeof event.loginAt === 'bigint'
|
|
|
+ ? event.loginAt
|
|
|
+ : BigInt(event.loginAt),
|
|
|
+ ip: event.ip,
|
|
|
+ },
|
|
|
+ });
|
|
|
+ } catch (error: any) {
|
|
|
+ this.logger.error(
|
|
|
+ `Failed to create user for uid=${event.uid}: ${error.message}`,
|
|
|
+ error.stack,
|
|
|
+ );
|
|
|
+ throw error;
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ async recordLogin(event: UserLoginEventPayload): Promise<void> {
|
|
|
+ try {
|
|
|
+ this.logger.log(
|
|
|
+ `Recording login for uid=${event.uid} from ip=${event.ip}`,
|
|
|
+ );
|
|
|
+ const createAt =
|
|
|
+ typeof event.loginAt === 'bigint'
|
|
|
+ ? event.loginAt
|
|
|
+ : BigInt(event.loginAt);
|
|
|
+
|
|
|
+ await this.prisma.userLoginHistory.create({
|
|
|
+ data: {
|
|
|
+ uid: event.uid,
|
|
|
+ ip: event.ip,
|
|
|
+ userAgent: event.userAgent ?? null,
|
|
|
+ appVersion: event.appVersion ?? null,
|
|
|
+ os: event.os ?? null,
|
|
|
+ createAt,
|
|
|
+ tokenId: event.tokenId ?? null,
|
|
|
+ },
|
|
|
+ });
|
|
|
+
|
|
|
+ // Also update or create user record
|
|
|
+ await this.createUser(event);
|
|
|
+ } catch (error: any) {
|
|
|
+ this.logger.error(
|
|
|
+ `Failed to record login for uid=${event.uid}: ${error.message}`,
|
|
|
+ error.stack,
|
|
|
+ );
|
|
|
+ throw error;
|
|
|
+ }
|
|
|
+ }
|
|
|
+}
|