mirror of
https://github.com/LukeHagar/better-auth.git
synced 2025-12-09 20:27:44 +00:00
fix: mysql date conversion (#492)
This commit is contained in:
@@ -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",
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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,
|
||||
|
||||
@@ -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) {
|
||||
|
||||
@@ -34,7 +34,7 @@ const mysqlMap = {
|
||||
"float",
|
||||
"double",
|
||||
],
|
||||
boolean: ["boolean"],
|
||||
boolean: ["boolean", "tinyint"],
|
||||
date: ["datetime", "date"],
|
||||
};
|
||||
|
||||
|
||||
@@ -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
3
pnpm-lock.yaml
generated
@@ -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)
|
||||
|
||||
Reference in New Issue
Block a user