👔 add create account in provision

Add logic to create a new account when provisioning if not yet registered.
This commit is contained in:
Rafi Arrafif
2025-08-30 22:41:42 +07:00
parent 28d2ddad31
commit bf35af294e
5 changed files with 49 additions and 21 deletions

View File

@ -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);

View File

@ -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) {

View File

@ -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);

View File

@ -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);
}
};

View File

@ -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;
}