diff --git a/prisma/schema.prisma b/prisma/schema.prisma index 7ec06af..bda6fc7 100644 --- a/prisma/schema.prisma +++ b/prisma/schema.prisma @@ -329,6 +329,7 @@ model UserSession { deviceType String @db.VarChar(255) deviceOs String @db.VarChar(255) deviceIp String @db.VarChar(255) + browser String @db.VarChar(255) isOnline Boolean @default(false) lastOnline DateTime @default(now()) validUntil DateTime diff --git a/src/modules/auth/services/internal/OAuthUserProvision.service.ts b/src/modules/auth/services/internal/OAuthUserProvision.service.ts index 16a4e09..1e29b0f 100644 --- a/src/modules/auth/services/internal/OAuthUserProvision.service.ts +++ b/src/modules/auth/services/internal/OAuthUserProvision.service.ts @@ -1,5 +1,8 @@ +import { User } from "@prisma/client"; import { UserHeaderInformation } from "../../../../helpers/http/userHeader/getUserHeaderInformation/types"; import { findUserService } from "../../../user/services/internal/findUser.service"; +import { createUserSessionService } from "../../../userSession/services/createUserSession.service"; +import { ErrorForwarder } from "../../../../helpers/error/instances/forwarder"; export const OAuthUserProvisionService = async ( payload: { @@ -20,16 +23,20 @@ export const OAuthUserProvisionService = async ( * * This is just example!! */ - const providerId = `${payload.providerName}_${payload.openId}`; - const findUserResult = await findUserService({ - identifier: providerId, - queryTarget: "providerId", - options: { verbosity: "exist" }, - }); + try { + const providerId = `${payload.providerName}_${payload.openId}`; + const findUserResult = (await findUserService({ + identifier: providerId, + queryTarget: "providerId", + options: { verbosity: "full" }, + })) as User; - if (findUserResult) { - return "Already Created"; - } else { - return "Not Found"; + if (findUserResult) { + return await createUserSessionService(findUserResult.id, userHeaderInfo); + } else { + return "Not Found"; + } + } catch (error) { + ErrorForwarder(error); } }; diff --git a/src/modules/user/services/internal/findUser.service.ts b/src/modules/user/services/internal/findUser.service.ts index 91083ae..ab536c7 100644 --- a/src/modules/user/services/internal/findUser.service.ts +++ b/src/modules/user/services/internal/findUser.service.ts @@ -27,10 +27,9 @@ export const findUserService = async (payload: getUserDataService) => { payload.options.verbosity ); - // Retrieving user data using the associated repository, if user not found return 404 response + // Retrieving user data using the associated repository, if user not found return 'false' response const userData = await repoFn(payload.identifier, payload.options.include); - if (!userData && existsVerbosity) return false; - if (!userData) throw new AppError(404, "User not found"); + if (!userData) return false; // If verbosity in 'exists' level and user is valid then just return 'true' value if (existsVerbosity) return true; diff --git a/src/modules/userSession/repositories/createUserSession.repository.ts b/src/modules/userSession/repositories/createUserSession.repository.ts new file mode 100644 index 0000000..4779c5e --- /dev/null +++ b/src/modules/userSession/repositories/createUserSession.repository.ts @@ -0,0 +1,15 @@ +import { Prisma } from "@prisma/client"; +import { ErrorForwarder } from "../../../helpers/error/instances/forwarder"; +import { userSessionModel } from "../userSession.model"; + +export const createUserSessionRepository = async ( + data: Prisma.UserSessionUncheckedCreateInput +) => { + try { + return await userSessionModel.create({ + data, + }); + } catch (error) { + ErrorForwarder(error); + } +}; diff --git a/src/modules/userSession/services/createUserSession.service.ts b/src/modules/userSession/services/createUserSession.service.ts new file mode 100644 index 0000000..daf878f --- /dev/null +++ b/src/modules/userSession/services/createUserSession.service.ts @@ -0,0 +1,28 @@ +import { Prisma } from "@prisma/client"; +import { UserHeaderInformation } from "../../../helpers/http/userHeader/getUserHeaderInformation/types"; +import { ErrorForwarder } from "../../../helpers/error/instances/forwarder"; +import { createUserSessionRepository } from "../repositories/createUserSession.repository"; + +export const createUserSessionService = async ( + userId: string, + userHeaderInfo: UserHeaderInformation +) => { + try { + const generateTokenExpirationDate = + Date.now() + Number(process.env.SESSION_EXPIRE!) * 1000; + + const constructData = { + userId, + isAuthenticated: true, + deviceType: userHeaderInfo.deviceType, + deviceOs: userHeaderInfo.deviceOS, + deviceIp: userHeaderInfo.ip, + browser: userHeaderInfo.browser, + validUntil: new Date(generateTokenExpirationDate), + } as Prisma.UserSessionUncheckedCreateInput; + + return createUserSessionRepository(constructData); + } catch (error) { + ErrorForwarder(error); + } +}; diff --git a/src/modules/userSession/userSession.model.ts b/src/modules/userSession/userSession.model.ts new file mode 100644 index 0000000..6c993a4 --- /dev/null +++ b/src/modules/userSession/userSession.model.ts @@ -0,0 +1,3 @@ +import { prisma } from "../../utils/databases/prisma/connection"; + +export const userSessionModel = prisma.userSession;