diff --git a/demo/nextjs/middleware.ts b/demo/nextjs/middleware.ts index d780bce2..870463d1 100644 --- a/demo/nextjs/middleware.ts +++ b/demo/nextjs/middleware.ts @@ -1,5 +1,6 @@ import { authMiddleware } from "better-auth/next-js"; import { NextResponse } from "next/server"; +import { auth } from "@/lib/auth"; export default authMiddleware({ customRedirect: async (session, request) => { diff --git a/packages/better-auth/src/adapters/mongodb-adapter/index.ts b/packages/better-auth/src/adapters/mongodb-adapter/index.ts index 0fa2b45a..c72e2725 100644 --- a/packages/better-auth/src/adapters/mongodb-adapter/index.ts +++ b/packages/better-auth/src/adapters/mongodb-adapter/index.ts @@ -84,6 +84,7 @@ export const mongodbAdapter = (mongo: Db) => { .toArray(); const result = res[0]; + if (!result) { return null; } @@ -108,16 +109,25 @@ export const mongodbAdapter = (mongo: Db) => { const { model, where, update } = data; const wheres = whereConvertor(where); - const res = await db.collection(model).findOneAndUpdate( + if (where.length === 1) { + const res = await db.collection(model).findOneAndUpdate( + //@ts-expect-error + wheres, + { + $set: update, + }, + { returnDocument: "after" }, + ); + return removeMongoId(res); + } + const res = await db.collection(model).updateMany( //@ts-expect-error wheres, { $set: update, }, - { returnDocument: "after" }, ); - - return removeMongoId(res); + return {}; }, async delete(data) { const { model, where } = data; diff --git a/packages/better-auth/src/adapters/prisma-adapter/index.ts b/packages/better-auth/src/adapters/prisma-adapter/index.ts index ba62d992..b091c9c6 100644 --- a/packages/better-auth/src/adapters/prisma-adapter/index.ts +++ b/packages/better-auth/src/adapters/prisma-adapter/index.ts @@ -112,8 +112,13 @@ export const prismaAdapter = ( async update(data) { const { model, where, update } = data; const whereClause = whereConvertor(where); - - return await db[model].update({ + if (where.length === 1) { + return await db[model].update({ + where: whereClause, + data: update, + }); + } + return await db[model].updateMany({ where: whereClause, data: update, }); diff --git a/packages/better-auth/src/adapters/test.ts b/packages/better-auth/src/adapters/test.ts index 817e313a..510b9414 100644 --- a/packages/better-auth/src/adapters/test.ts +++ b/packages/better-auth/src/adapters/test.ts @@ -178,6 +178,38 @@ export async function runAdapterTest(opts: AdapterTestOptions) { expect(res.length).toBe(1); }); + test("should update with multiple where", async () => { + await adapter.update({ + model: "user", + where: [ + { + field: "name", + value: user.name, + }, + { + field: "email", + value: user.email, + }, + ], + update: { + email: "updated@email.com", + }, + }); + const updatedUser = await adapter.findOne({ + model: "user", + where: [ + { + field: "email", + value: "updated@email.com", + }, + ], + }); + expect(updatedUser).toMatchObject({ + name: user.name, + email: "updated@email.com", + }); + }); + test("delete model", async () => { await adapter.delete({ model: "user", diff --git a/packages/better-auth/src/types/adapter.ts b/packages/better-auth/src/types/adapter.ts index 3a2cc05f..954dbf77 100644 --- a/packages/better-auth/src/types/adapter.ts +++ b/packages/better-auth/src/types/adapter.ts @@ -5,7 +5,7 @@ import type { BetterAuthOptions } from "./options"; */ export type Where = { operator?: "eq" | "ne" | "lt" | "lte" | "gt" | "gte"; //eq by default - value: string; + value: string | number | boolean; field: string; connector?: "AND" | "OR"; //AND by default }; @@ -35,6 +35,10 @@ export interface Adapter { }; offset?: number; }) => Promise; + /** + * ⚠︎ Update may not return the updated data + * if multiple where clauses are provided + */ update: (data: { model: string; where: Where[];