From 9b8be90a73ea410a7a6981fd87e61e8780dfc0eb Mon Sep 17 00:00:00 2001 From: JohnDoe6345789 Date: Fri, 26 Dec 2025 00:04:03 +0000 Subject: [PATCH] code: user,nextjs,get (5 files) --- .../src/lib/db/auth/get-user-by-email.ts | 16 +++-- .../lib/db/users/get-user-by-email.test.ts | 63 ------------------- .../src/lib/db/users/get-user-by-email.ts | 30 --------- .../lib/db/users/get-user-by-username.test.ts | 63 ------------------- .../src/lib/db/users/get-user-by-username.ts | 30 --------- 5 files changed, 11 insertions(+), 191 deletions(-) delete mode 100644 frontends/nextjs/src/lib/db/users/get-user-by-email.test.ts delete mode 100644 frontends/nextjs/src/lib/db/users/get-user-by-email.ts delete mode 100644 frontends/nextjs/src/lib/db/users/get-user-by-username.test.ts delete mode 100644 frontends/nextjs/src/lib/db/users/get-user-by-username.ts diff --git a/frontends/nextjs/src/lib/db/auth/get-user-by-email.ts b/frontends/nextjs/src/lib/db/auth/get-user-by-email.ts index c42bd2532..b6e2b9dcb 100644 --- a/frontends/nextjs/src/lib/db/auth/get-user-by-email.ts +++ b/frontends/nextjs/src/lib/db/auth/get-user-by-email.ts @@ -5,18 +5,24 @@ import type { User } from '../../types/level-types' * Get user by email from DBAL. * Single-responsibility lambda for email lookup. */ -export const getUserByEmail = async (email: string): Promise => { +export const getUserByEmail = async ( + email: string, + options?: { tenantId?: string } +): Promise => { const adapter = getAdapter() - const result = await adapter.list('User', { - filter: { email }, + const record = await adapter.findFirst('User', { + where: { + email, + ...(options?.tenantId ? { tenantId: options.tenantId } : {}), + }, }) - if (result.data.length === 0) { + if (!record) { return null } - const userData = result.data[0] as Record + const userData = record as Record return { id: String(userData.id), diff --git a/frontends/nextjs/src/lib/db/users/get-user-by-email.test.ts b/frontends/nextjs/src/lib/db/users/get-user-by-email.test.ts deleted file mode 100644 index b47914b33..000000000 --- a/frontends/nextjs/src/lib/db/users/get-user-by-email.test.ts +++ /dev/null @@ -1,63 +0,0 @@ -import { describe, it, expect, vi, beforeEach } from 'vitest' - -const mockFindFirst = vi.fn() -const mockAdapter = { findFirst: mockFindFirst } - -vi.mock('../dbal-client', () => ({ - getAdapter: () => mockAdapter, -})) - -import { getUserByEmail } from './get-user-by-email' - -describe('getUserByEmail', () => { - beforeEach(() => { - mockFindFirst.mockReset() - }) - - it('returns null when user not found', async () => { - mockFindFirst.mockResolvedValue(null) - - const result = await getUserByEmail('missing@example.com') - - expect(mockFindFirst).toHaveBeenCalledWith('User', { where: { email: 'missing@example.com' } }) - expect(result).toBeNull() - }) - - it('returns user when found', async () => { - mockFindFirst.mockResolvedValue({ - id: 'user_2', - username: 'bob', - email: 'bob@example.com', - role: 'user', - profilePicture: 'pic.png', - bio: null, - createdAt: BigInt(2000), - tenantId: 'tenant_2', - isInstanceOwner: true, - }) - - const result = await getUserByEmail('bob@example.com') - - expect(result).toEqual({ - id: 'user_2', - username: 'bob', - email: 'bob@example.com', - role: 'user', - profilePicture: 'pic.png', - bio: undefined, - createdAt: 2000, - tenantId: 'tenant_2', - isInstanceOwner: true, - }) - }) - - it('includes tenant filter when provided', async () => { - mockFindFirst.mockResolvedValue(null) - - await getUserByEmail('bob@example.com', { tenantId: 'tenant_2' }) - - expect(mockFindFirst).toHaveBeenCalledWith('User', { - where: { email: 'bob@example.com', tenantId: 'tenant_2' }, - }) - }) -}) diff --git a/frontends/nextjs/src/lib/db/users/get-user-by-email.ts b/frontends/nextjs/src/lib/db/users/get-user-by-email.ts deleted file mode 100644 index fe7a8d6a7..000000000 --- a/frontends/nextjs/src/lib/db/users/get-user-by-email.ts +++ /dev/null @@ -1,30 +0,0 @@ -import { getAdapter } from '../dbal-client' -import type { User } from '../../types/level-types' - -export async function getUserByEmail( - email: string, - options?: { tenantId?: string } -): Promise { - const adapter = getAdapter() - const record = await adapter.findFirst('User', { - where: { - email, - ...(options?.tenantId ? { tenantId: options.tenantId } : {}), - }, - }) - - if (!record) return null - - const user = record as any - return { - id: user.id, - username: user.username, - email: user.email, - role: user.role as any, - profilePicture: user.profilePicture || undefined, - bio: user.bio || undefined, - createdAt: Number(user.createdAt), - tenantId: user.tenantId || undefined, - isInstanceOwner: user.isInstanceOwner, - } -} diff --git a/frontends/nextjs/src/lib/db/users/get-user-by-username.test.ts b/frontends/nextjs/src/lib/db/users/get-user-by-username.test.ts deleted file mode 100644 index ca0bf022d..000000000 --- a/frontends/nextjs/src/lib/db/users/get-user-by-username.test.ts +++ /dev/null @@ -1,63 +0,0 @@ -import { describe, it, expect, vi, beforeEach } from 'vitest' - -const mockFindFirst = vi.fn() -const mockAdapter = { findFirst: mockFindFirst } - -vi.mock('../dbal-client', () => ({ - getAdapter: () => mockAdapter, -})) - -import { getUserByUsername } from './get-user-by-username' - -describe('getUserByUsername', () => { - beforeEach(() => { - mockFindFirst.mockReset() - }) - - it('returns null when user not found', async () => { - mockFindFirst.mockResolvedValue(null) - - const result = await getUserByUsername('missing') - - expect(mockFindFirst).toHaveBeenCalledWith('User', { where: { username: 'missing' } }) - expect(result).toBeNull() - }) - - it('returns user when found', async () => { - mockFindFirst.mockResolvedValue({ - id: 'user_1', - username: 'alice', - email: 'alice@example.com', - role: 'admin', - profilePicture: null, - bio: 'Bio', - createdAt: BigInt(1000), - tenantId: null, - isInstanceOwner: false, - }) - - const result = await getUserByUsername('alice') - - expect(result).toEqual({ - id: 'user_1', - username: 'alice', - email: 'alice@example.com', - role: 'admin', - profilePicture: undefined, - bio: 'Bio', - createdAt: 1000, - tenantId: undefined, - isInstanceOwner: false, - }) - }) - - it('includes tenant filter when provided', async () => { - mockFindFirst.mockResolvedValue(null) - - await getUserByUsername('alice', { tenantId: 'tenant_1' }) - - expect(mockFindFirst).toHaveBeenCalledWith('User', { - where: { username: 'alice', tenantId: 'tenant_1' }, - }) - }) -}) diff --git a/frontends/nextjs/src/lib/db/users/get-user-by-username.ts b/frontends/nextjs/src/lib/db/users/get-user-by-username.ts deleted file mode 100644 index f9b1aae0e..000000000 --- a/frontends/nextjs/src/lib/db/users/get-user-by-username.ts +++ /dev/null @@ -1,30 +0,0 @@ -import { getAdapter } from '../dbal-client' -import type { User } from '../../types/level-types' - -export async function getUserByUsername( - username: string, - options?: { tenantId?: string } -): Promise { - const adapter = getAdapter() - const record = await adapter.findFirst('User', { - where: { - username, - ...(options?.tenantId ? { tenantId: options.tenantId } : {}), - }, - }) - - if (!record) return null - - const user = record as any - return { - id: user.id, - username: user.username, - email: user.email, - role: user.role as any, - profilePicture: user.profilePicture || undefined, - bio: user.bio || undefined, - createdAt: Number(user.createdAt), - tenantId: user.tenantId || undefined, - isInstanceOwner: user.isInstanceOwner, - } -}