fix: mysql date conversion (#492)

This commit is contained in:
Bereket Engida
2024-11-11 16:57:50 +03:00
committed by GitHub
parent 228456eba0
commit 1acb34b96e
7 changed files with 63 additions and 11 deletions

View File

@@ -11,10 +11,10 @@
"start": "next start",
"lint": "next lint"
},
"dependencies": {
"dependencies": {
"@better-auth/expo": "workspace:*",
"@hookform/resolvers": "^3.9.0",
"@libsql/client": "^0.12.0",
"@better-auth/expo": "workspace:*",
"@libsql/kysely-libsql": "^0.4.1",
"@prisma/adapter-libsql": "^5.19.1",
"@prisma/client": "^5.19.1",
@@ -65,6 +65,7 @@
"kysely": "^0.27.4",
"lucide-react": "^0.439.0",
"mini-svg-data-uri": "^1.4.4",
"mysql2": "^3.11.0",
"next": "15.0.0-canary.185",
"next-themes": "^0.3.0",
"prisma": "^5.19.1",

View File

@@ -1,6 +1,7 @@
import type { Kysely } from "kysely";
import type { FieldAttribute } from "../../db";
import type { Adapter, Where } from "../../types";
import type { KyselyDatabaseType } from "./types";
function convertWhere(w?: Where[]) {
if (!w)
@@ -96,13 +97,33 @@ function transformTo(
return val;
}
function formatDateForMySQL(date: Date): string {
const pad = (n: number) => (n < 10 ? "0" + n : n);
return (
date.getFullYear() +
"-" +
pad(date.getMonth() + 1) +
"-" +
pad(date.getDate()) +
" " +
pad(date.getHours()) +
":" +
pad(date.getMinutes()) +
":" +
pad(date.getSeconds())
);
}
function transformFrom(val: any, transform: KyselyAdapterConfig["transform"]) {
for (const key in val) {
if (typeof val[key] === "boolean" && transform?.boolean) {
val[key] = val[key] ? 1 : 0;
}
if (val[key] instanceof Date) {
val[key] = val[key].toISOString();
val[key] =
transform?.databaseType === "mysql"
? formatDateForMySQL(val[key])
: val[key].toISOString();
}
}
return val;
@@ -118,6 +139,7 @@ export interface KyselyAdapterConfig {
};
boolean: boolean;
date: boolean;
databaseType?: KyselyDatabaseType | null;
};
/**
* Custom generateId function.
@@ -144,11 +166,22 @@ export const kyselyAdapter = (
if (config?.generateId !== undefined) {
val.id = config.generateId ? config.generateId() : undefined;
}
let res = await db
.insertInto(model)
.values(val as any)
.returningAll()
.executeTakeFirst();
const builder = db.insertInto(model).values(val as any);
let res: any;
if (config?.transform?.databaseType !== "mysql") {
res = await builder.returningAll().executeTakeFirst();
} else {
await builder.execute();
const primaryKey = "id";
const insertedId = val[primaryKey];
res = await db
.selectFrom(model)
.selectAll()
.where(primaryKey, "=", insertedId)
.executeTakeFirst();
}
if (config?.transform) {
const schema = config.transform.schema[model];
@@ -201,7 +234,6 @@ export const kyselyAdapter = (
if (config?.transform) {
const schema = config.transform.schema[model];
res = res && schema ? transformTo(res, schema, config.transform) : res;
return res || null;
}
return (res || null) as any;
@@ -251,7 +283,19 @@ export const kyselyAdapter = (
if (or) {
query = query.where((eb) => eb.or(or.map((expr) => expr(eb))));
}
const res = (await query.returningAll().executeTakeFirst()) || null;
let res: any;
if (config?.transform?.databaseType !== "mysql") {
res = (await query.returningAll().executeTakeFirst()) || null;
} else {
await query.execute();
const primaryKey = "id";
const insertedId = val[primaryKey];
res = await db
.selectFrom(model)
.selectAll()
.where(primaryKey, "=", insertedId)
.executeTakeFirst();
}
if (config?.transform) {
const schema = config.transform.schema[model];
return schema ? transformTo(res, schema, config.transform) : res;

View File

@@ -43,6 +43,7 @@ describe("session", async () => {
it("should update session when close to expiry", async () => {
let headers = new Headers();
const res = await client.signIn.email(
{
email: testUser.email,

View File

@@ -129,6 +129,7 @@ export const getSession = <Option extends BetterAuthOptions>() =>
}
const expiresIn = ctx.context.sessionConfig.expiresIn;
const updateAge = ctx.context.sessionConfig.updateAge;
/**
* Calculate last updated date to throttle write updates to database
* Formula: ({expiry date} - sessionMaxAge) + sessionUpdateAge
@@ -141,6 +142,7 @@ export const getSession = <Option extends BetterAuthOptions>() =>
session.session.expiresAt.valueOf() -
expiresIn * 1000 +
updateAge * 1000;
const shouldBeUpdated = sessionIsDueToBeUpdatedDate <= Date.now();
if (shouldBeUpdated) {

View File

@@ -34,7 +34,7 @@ const mysqlMap = {
"float",
"double",
],
boolean: ["boolean"],
boolean: ["boolean", "tinyint"],
date: ["datetime", "date"],
};

View File

@@ -29,6 +29,7 @@ export async function getAdapter(options: BetterAuthOptions): Promise<Adapter> {
schema,
date: true,
boolean: databaseType === "sqlite",
databaseType,
},
generateId:
"generateId" in options.database

3
pnpm-lock.yaml generated
View File

@@ -967,6 +967,9 @@ importers:
mini-svg-data-uri:
specifier: ^1.4.4
version: 1.4.4
mysql2:
specifier: ^3.11.0
version: 3.11.3
next:
specifier: 15.0.0-canary.185
version: 15.0.0-canary.185(@babel/core@7.26.0)(react-dom@19.0.0-rc-7771d3a7-20240827(react@19.0.0-rc-7771d3a7-20240827))(react@19.0.0-rc-7771d3a7-20240827)