feature/adapt-to-new-database #34
@ -88,6 +88,7 @@ Table user_sessions {
|
|||||||
browser_name String
|
browser_name String
|
||||||
browser_version String
|
browser_version String
|
||||||
ip_login String
|
ip_login String
|
||||||
|
valid_until DateTime [not null]
|
||||||
login_at DateTime [default: `now()`, not null]
|
login_at DateTime [default: `now()`, not null]
|
||||||
logout_at DateTime
|
logout_at DateTime
|
||||||
user_id String [not null]
|
user_id String [not null]
|
||||||
|
|||||||
@ -0,0 +1,12 @@
|
|||||||
|
-- DropForeignKey
|
||||||
|
ALTER TABLE "user_preferences" DROP CONSTRAINT "user_preferences_char_as_partner_id_fkey";
|
||||||
|
|
||||||
|
-- AlterTable
|
||||||
|
ALTER TABLE "user_oauth_accounts" ALTER COLUMN "provider_token" SET DATA TYPE TEXT,
|
||||||
|
ALTER COLUMN "refresh_token" SET DATA TYPE TEXT;
|
||||||
|
|
||||||
|
-- AlterTable
|
||||||
|
ALTER TABLE "user_preferences" ALTER COLUMN "char_as_partner_id" DROP NOT NULL;
|
||||||
|
|
||||||
|
-- AddForeignKey
|
||||||
|
ALTER TABLE "user_preferences" ADD CONSTRAINT "user_preferences_char_as_partner_id_fkey" FOREIGN KEY ("char_as_partner_id") REFERENCES "characters"("id") ON DELETE SET NULL ON UPDATE CASCADE;
|
||||||
@ -0,0 +1,8 @@
|
|||||||
|
/*
|
||||||
|
Warnings:
|
||||||
|
|
||||||
|
- Added the required column `valid_until` to the `user_sessions` table without a default value. This is not possible if the table is not empty.
|
||||||
|
|
||||||
|
*/
|
||||||
|
-- AlterTable
|
||||||
|
ALTER TABLE "user_sessions" ADD COLUMN "valid_until" TIMESTAMPTZ NOT NULL;
|
||||||
@ -175,8 +175,8 @@ model UserOauthAccounts {
|
|||||||
provider_name auth_provider
|
provider_name auth_provider
|
||||||
provider_sub String? @db.VarChar(255)
|
provider_sub String? @db.VarChar(255)
|
||||||
provider_email String? @db.VarChar(255)
|
provider_email String? @db.VarChar(255)
|
||||||
provider_token String? @db.VarChar(255)
|
provider_token String? @db.Text
|
||||||
refresh_token String? @db.VarChar(255)
|
refresh_token String? @db.Text
|
||||||
expires_at DateTime? @db.Timestamptz()
|
expires_at DateTime? @db.Timestamptz()
|
||||||
created_at DateTime @default(now()) @db.Timestamptz()
|
created_at DateTime @default(now()) @db.Timestamptz()
|
||||||
updated_at DateTime @updatedAt @db.Timestamptz()
|
updated_at DateTime @updatedAt @db.Timestamptz()
|
||||||
@ -194,7 +194,8 @@ model UserSession {
|
|||||||
browser_name String? @db.VarChar(50)
|
browser_name String? @db.VarChar(50)
|
||||||
browser_version String? @db.VarChar(50)
|
browser_version String? @db.VarChar(50)
|
||||||
ip_login String? @db.Inet()
|
ip_login String? @db.Inet()
|
||||||
login_at DateTime @default(now()) @db.Timestamptz()
|
valid_until DateTime @db.Timestamptz()
|
||||||
|
login_at DateTime @default(now()) @db.Timestamptz()
|
||||||
logout_at DateTime? @db.Timestamptz()
|
logout_at DateTime? @db.Timestamptz()
|
||||||
|
|
||||||
user_id String @db.Uuid
|
user_id String @db.Uuid
|
||||||
|
|||||||
@ -0,0 +1,28 @@
|
|||||||
|
import { AppError } from "../../../../helpers/error/instances/app";
|
||||||
|
import { prisma } from "../../../../utils/databases/prisma/connection";
|
||||||
|
import { createUserViaOauth } from "../../../user/user.types";
|
||||||
|
|
||||||
|
export const createUserWithOAuthCredentialsRepository = async (payload: createUserViaOauth) => {
|
||||||
|
try {
|
||||||
|
const { oauthProvider, ...userData } = payload;
|
||||||
|
return await prisma.user.create({
|
||||||
|
data: {
|
||||||
|
...userData,
|
||||||
|
oauth_accounts: {
|
||||||
|
create: {
|
||||||
|
provider_name: oauthProvider.providerName,
|
||||||
|
provider_sub: oauthProvider.sub,
|
||||||
|
provider_token: oauthProvider.token,
|
||||||
|
refresh_token: oauthProvider.refreshToken,
|
||||||
|
expires_at: oauthProvider.expiresAt,
|
||||||
|
},
|
||||||
|
},
|
||||||
|
preferences: {
|
||||||
|
create: {},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
});
|
||||||
|
} catch (error) {
|
||||||
|
throw new AppError(500, "Error creating user with OAuth credentials", error);
|
||||||
|
}
|
||||||
|
};
|
||||||
@ -5,6 +5,7 @@ import { createUserViaOauth } from "../../../user/user.types";
|
|||||||
import { createUserService } from "../../../user/services/internal/createUser.service";
|
import { createUserService } from "../../../user/services/internal/createUser.service";
|
||||||
import { AppError } from "../../../../helpers/error/instances/app";
|
import { AppError } from "../../../../helpers/error/instances/app";
|
||||||
import { findAuthIdentityByEmailAndProviderRepository } from "../../repositories/READ/findAuthIdentityByEmailAndProvider.repository";
|
import { findAuthIdentityByEmailAndProviderRepository } from "../../repositories/READ/findAuthIdentityByEmailAndProvider.repository";
|
||||||
|
import { createUserWithOAuthCredentialsRepository } from "../../repositories/WRITE/createUserWithOAuthCredentials.repository";
|
||||||
|
|
||||||
export const OAuthUserProvisionService = async (payload: createUserViaOauth, userHeaderInfo: UserHeaderInformation) => {
|
export const OAuthUserProvisionService = async (payload: createUserViaOauth, userHeaderInfo: UserHeaderInformation) => {
|
||||||
try {
|
try {
|
||||||
@ -18,7 +19,7 @@ export const OAuthUserProvisionService = async (payload: createUserViaOauth, use
|
|||||||
return await createUserSessionService(checkExistingUser.id, userHeaderInfo);
|
return await createUserSessionService(checkExistingUser.id, userHeaderInfo);
|
||||||
} else if (!checkExistingUser) {
|
} else if (!checkExistingUser) {
|
||||||
// No user with this email, create new user
|
// No user with this email, create new user
|
||||||
const createdUser = await createUserService(payload);
|
const createdUser = await createUserWithOAuthCredentialsRepository(payload);
|
||||||
return await createUserSessionService(createdUser.id, userHeaderInfo);
|
return await createUserSessionService(createdUser.id, userHeaderInfo);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@ -20,7 +20,7 @@ export interface createUserViaRegisterInput {
|
|||||||
}
|
}
|
||||||
export interface createUserViaOauth extends createUserViaRegisterInput {
|
export interface createUserViaOauth extends createUserViaRegisterInput {
|
||||||
oauthProvider: {
|
oauthProvider: {
|
||||||
providerName: string;
|
providerName: "google" | "github";
|
||||||
sub: string;
|
sub: string;
|
||||||
token: string;
|
token: string;
|
||||||
refreshToken?: string;
|
refreshToken?: string;
|
||||||
|
|||||||
@ -1,36 +1,28 @@
|
|||||||
import { Prisma } from "@prisma/client";
|
import { Prisma } from "@prisma/client";
|
||||||
import { ErrorForwarder } from "../../../helpers/error/instances/forwarder";
|
import { ErrorForwarder } from "../../../helpers/error/instances/forwarder";
|
||||||
import { userSessionModel } from "../userSession.model";
|
import { userSessionModel } from "../userSession.model";
|
||||||
import { generateUUIDv7 } from "../../../helpers/databases/uuidv7";
|
|
||||||
|
|
||||||
export const createUserSessionRepository = async (
|
export const createUserSessionRepository = async (data: Omit<Prisma.UserSessionUncheckedCreateInput, "id">) => {
|
||||||
data: Omit<Prisma.UserSessionUncheckedCreateInput, "id">,
|
|
||||||
) => {
|
|
||||||
try {
|
try {
|
||||||
return await userSessionModel.create({
|
return await userSessionModel.create({
|
||||||
data: {
|
data: {
|
||||||
id: generateUUIDv7(),
|
|
||||||
...data,
|
...data,
|
||||||
},
|
},
|
||||||
select: {
|
select: {
|
||||||
id: true,
|
id: true,
|
||||||
isAuthenticated: true,
|
browser_name: true,
|
||||||
validUntil: true,
|
ip_login: true,
|
||||||
|
valid_until: true,
|
||||||
user: {
|
user: {
|
||||||
select: {
|
select: {
|
||||||
id: true,
|
id: true,
|
||||||
name: true,
|
|
||||||
email: true,
|
email: true,
|
||||||
|
fullname: true,
|
||||||
username: true,
|
username: true,
|
||||||
avatar: true,
|
avatar: true,
|
||||||
birthDate: true,
|
datebirth: true,
|
||||||
bioProfile: true,
|
bio: true,
|
||||||
preference: {
|
preferences: {},
|
||||||
omit: {
|
|
||||||
updatedAt: true,
|
|
||||||
createdAt: true,
|
|
||||||
},
|
|
||||||
},
|
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
|
|||||||
@ -29,7 +29,7 @@ export const createUserSessionService = async (userId: string, userHeaderInfo: U
|
|||||||
await createUserSessionInRedisService({
|
await createUserSessionInRedisService({
|
||||||
userId,
|
userId,
|
||||||
sessionId: createUserSession.id,
|
sessionId: createUserSession.id,
|
||||||
validUntil: createUserSession.validUntil,
|
validUntil: createUserSession.valid_until,
|
||||||
});
|
});
|
||||||
|
|
||||||
// create a jwt token with a payload containing the created user session, then return jwt
|
// create a jwt token with a payload containing the created user session, then return jwt
|
||||||
|
|||||||
@ -9,4 +9,7 @@ const pool = new pg.Pool({
|
|||||||
});
|
});
|
||||||
|
|
||||||
const adapter = new PrismaPg(pool);
|
const adapter = new PrismaPg(pool);
|
||||||
export const prisma = new PrismaClient({ adapter });
|
export const prisma = new PrismaClient({
|
||||||
|
adapter,
|
||||||
|
log: process.env.ENABLE_PRISMA_LOG === "true" ? ["query", "error", "warn", "info"] : [],
|
||||||
|
});
|
||||||
|
|||||||
Reference in New Issue
Block a user