From bf35af294ec58352e01d57325ce233f8a2327ff6 Mon Sep 17 00:00:00 2001 From: Rafi Arrafif Date: Sat, 30 Aug 2025 22:41:42 +0700 Subject: [PATCH] :necktie: add create account in provision Add logic to create a new account when provisioning if not yet registered. --- src/index.ts | 2 +- .../services/http/googleCallback.service.ts | 11 ++++++--- .../internal/OAuthUserProvision.service.ts | 23 +++++-------------- .../services/internal/createUser.service.ts | 22 ++++++++++++++++++ src/modules/user/user.types.ts | 12 ++++++++++ 5 files changed, 49 insertions(+), 21 deletions(-) create mode 100644 src/modules/user/services/internal/createUser.service.ts diff --git a/src/index.ts b/src/index.ts index 7550831..666dcb2 100644 --- a/src/index.ts +++ b/src/index.ts @@ -6,7 +6,7 @@ const { Elysia } = await import("elysia"); const { routes } = await import("./routes"); const app = new Elysia() - .use(appAccessTokenMiddleware()) + // .use(appAccessTokenMiddleware()) .use(routes) .listen(process.env.APP_PORT || 3000); diff --git a/src/modules/auth/services/http/googleCallback.service.ts b/src/modules/auth/services/http/googleCallback.service.ts index c220578..fedaedb 100644 --- a/src/modules/auth/services/http/googleCallback.service.ts +++ b/src/modules/auth/services/http/googleCallback.service.ts @@ -46,13 +46,18 @@ export const googleCallbackService = async ( return await OAuthUserProvisionService( { - providerName: "google", - openId: userData.sub, + provider: "google", + providerId: userData.sub, + providerToken: accessToken, + providerPayload: userData, email: userData.email, + username: `goo_${userData.sub}`, name: userData.name, avatar: userData.picture, + password: Math.random() + .toString(36) + .slice(2, 16), }, - userData, userHeaderInfo ); } catch (error) { diff --git a/src/modules/auth/services/internal/OAuthUserProvision.service.ts b/src/modules/auth/services/internal/OAuthUserProvision.service.ts index 02af481..3449571 100644 --- a/src/modules/auth/services/internal/OAuthUserProvision.service.ts +++ b/src/modules/auth/services/internal/OAuthUserProvision.service.ts @@ -3,22 +3,15 @@ import { UserHeaderInformation } from "../../../../helpers/http/userHeader/getUs import { findUserService } from "../../../user/services/internal/findUser.service"; import { createUserSessionService } from "../../../userSession/services/createUserSession.service"; import { ErrorForwarder } from "../../../../helpers/error/instances/forwarder"; +import { createUserViaOauth } from "../../../user/user.types"; +import { createUserService } from "../../../user/services/internal/createUser.service"; export const OAuthUserProvisionService = async ( - payload: { - providerName: string; - openId: string; - email: string; - username?: string; - name: string; - avatar?: string; - bio?: string; - }, - providerRawCallback: unknown, + payload: createUserViaOauth, userHeaderInfo: UserHeaderInformation ) => { try { - const providerId = `${payload.providerName}_${payload.openId}`; + const providerId = payload.providerId; const findUserResult = (await findUserService({ identifier: providerId, queryTarget: "providerId", @@ -28,12 +21,8 @@ export const OAuthUserProvisionService = async ( if (findUserResult) { return await createUserSessionService(findUserResult.id, userHeaderInfo); } else { - /** - * === TODO === - * If the user is not found, - * create a new one with the data obtained from the OAuth provider, - * then create a user session and authenticate it immediately. - */ + const createdUser = await createUserService(payload); + return await createUserSessionService(createdUser.id, userHeaderInfo); } } catch (error) { ErrorForwarder(error); diff --git a/src/modules/user/services/internal/createUser.service.ts b/src/modules/user/services/internal/createUser.service.ts new file mode 100644 index 0000000..dab7a4a --- /dev/null +++ b/src/modules/user/services/internal/createUser.service.ts @@ -0,0 +1,22 @@ +import { ErrorForwarder } from "../../../../helpers/error/instances/forwarder"; +import { hashPassword } from "../../../../helpers/security/password/hash"; +import { createUserViaRegisterRepository } from "../../repositories/create/createUserViaRegister.repository"; +import { + createUserViaOauth, + createUserViaRegisterInput, +} from "../../user.types"; + +export const createUserService = async ( + payload: createUserViaRegisterInput | createUserViaOauth +) => { + try { + const hashedPassword = await hashPassword(payload.password); + + return await createUserViaRegisterRepository({ + ...payload, + password: hashedPassword, + }); + } catch (error) { + ErrorForwarder(error); + } +}; diff --git a/src/modules/user/user.types.ts b/src/modules/user/user.types.ts index 5a5956b..20df9e8 100644 --- a/src/modules/user/user.types.ts +++ b/src/modules/user/user.types.ts @@ -15,3 +15,15 @@ export interface createUserViaRegisterInput { email: string; password: string; } +export interface createUserViaOauth { + provider: string; + providerId: string; + providerToken?: string; + providerPayload?: unknown; + email: string; + username: string; + name: string; + avatar?: string; + bio?: string; + password: string; +}