This commit is contained in:
einhornimmond 2025-12-06 14:46:57 +01:00
parent c27c07003d
commit f5d79e8a36
8 changed files with 43 additions and 31 deletions

View File

@ -1,7 +1,7 @@
import {
dbDeleteOpenaiThread,
dbFindNewestCreatedOpenaiThreadByUserId,
dbInsertOpenaiThread,
import {
dbDeleteOpenaiThread,
dbFindNewestCreatedOpenaiThreadByUserId,
dbInsertOpenaiThread,
dbUpdateOpenaiThread,
User,
} from 'database'
@ -81,7 +81,7 @@ export class OpenaiClient {
* @returns
*/
public async resumeThread(user: User): Promise<MessageModel[]> {
const openaiThreadEntity = await dbFindNewestCreatedOpenaiThreadByUserId(user.id)
const openaiThreadEntity = await dbFindNewestCreatedOpenaiThreadByUserId(user.id)
if (!openaiThreadEntity) {
logger.warn(`No openai thread found for user: ${user.id}`)
return []

View File

@ -118,10 +118,7 @@ export class AppDatabase {
}
public async destroy(): Promise<void> {
await Promise.all([
this.dataSource?.destroy(),
this.drizzleConnection?.end(),
])
await Promise.all([this.dataSource?.destroy(), this.drizzleConnection?.end()])
if (this.redisClient) {
await this.redisClient.quit()
this.redisClient = undefined

View File

@ -2,7 +2,7 @@ import { eq } from 'drizzle-orm'
import { MySql2Database } from 'drizzle-orm/mysql2'
import { AppDatabase } from '../AppDatabase'
import { openaiThreadsTable } from '../schemas'
import {
import {
dbDeleteOpenaiThread,
dbFindNewestCreatedOpenaiThreadByUserId,
dbInsertOpenaiThread,
@ -18,15 +18,13 @@ beforeAll(async () => {
await db.delete(openaiThreadsTable)
})
afterAll(async () => {
console.log('destroying database')
await appDB.destroy()
})
describe('openaiThreads query test', () => {
it('should insert a new openai thread', async () => {
await Promise.resolve([
dbInsertOpenaiThread('7', 1),
dbInsertOpenaiThread('72', 6),
])
await Promise.resolve([dbInsertOpenaiThread('7', 1), dbInsertOpenaiThread('72', 6)])
const result = await db.select().from(openaiThreadsTable)
expect(result).toHaveLength(2)
expect(result).toMatchObject([
@ -38,26 +36,36 @@ describe('openaiThreads query test', () => {
it('should find the newest created openai thread by user id', async () => {
await db.insert(openaiThreadsTable).values([
{ id: '75', userId: 2, createdAt: new Date('2025-01-01T00:00:00.000Z') },
{ id: '172', userId: 2, createdAt: new Date('2025-01-02T00:00:00.000Z') }
{ id: '172', userId: 2, createdAt: new Date('2025-01-02T00:00:00.000Z') },
])
const result = await dbFindNewestCreatedOpenaiThreadByUserId(2)
expect(result).toBeDefined()
expect(result).toMatchObject({ id: '172', userId: 2, createdAt: new Date('2025-01-02T00:00:00.000Z') })
expect(result).toMatchObject({
id: '172',
userId: 2,
createdAt: new Date('2025-01-02T00:00:00.000Z'),
})
})
it('should update an existing openai thread', async () => {
const now = new Date()
now.setMilliseconds(0)
await dbUpdateOpenaiThread('172')
const result = await db.select().from(openaiThreadsTable).where(eq(openaiThreadsTable.id, '172'))
const result = await db
.select()
.from(openaiThreadsTable)
.where(eq(openaiThreadsTable.id, '172'))
expect(result).toHaveLength(1)
expect(result[0].updatedAt.getTime()).toBeGreaterThanOrEqual(now.getTime())
expect(result).toMatchObject([{ id: '172', userId: 2, updatedAt: expect.any(Date) }])
expect(result).toMatchObject([{ id: '172', userId: 2, updatedAt: expect.any(Date) }])
})
it('should delete an existing openai thread', async () => {
await dbDeleteOpenaiThread('172')
const result = await db.select().from(openaiThreadsTable).where(eq(openaiThreadsTable.id, '172'))
const result = await db
.select()
.from(openaiThreadsTable)
.where(eq(openaiThreadsTable.id, '172'))
expect(result).toHaveLength(0)
})
})
})

View File

@ -5,9 +5,7 @@ import { drizzleDb } from '.'
// TODO: replace results with valibot schema after update to typescript 5 is possible
export async function dbInsertOpenaiThread(id: string, userId: number): Promise<void> {
await drizzleDb()
.insert(openaiThreadsTable)
.values({ id, userId })
await drizzleDb().insert(openaiThreadsTable).values({ id, userId })
}
export async function dbUpdateOpenaiThread(id: string): Promise<void> {
@ -17,7 +15,9 @@ export async function dbUpdateOpenaiThread(id: string): Promise<void> {
.where(eq(openaiThreadsTable.id, id))
}
export async function dbFindNewestCreatedOpenaiThreadByUserId(userId: number): Promise<typeof openaiThreadsTable.$inferSelect | undefined> {
export async function dbFindNewestCreatedOpenaiThreadByUserId(
userId: number,
): Promise<typeof openaiThreadsTable.$inferSelect | undefined> {
const result = await drizzleDb()
.select()
.from(openaiThreadsTable)
@ -28,7 +28,5 @@ export async function dbFindNewestCreatedOpenaiThreadByUserId(userId: number): P
}
export async function dbDeleteOpenaiThread(id: string): Promise<void> {
await drizzleDb()
.delete(openaiThreadsTable)
.where(eq(openaiThreadsTable.id, id))
await drizzleDb().delete(openaiThreadsTable).where(eq(openaiThreadsTable.id, id))
}

View File

@ -5,4 +5,4 @@ export const openaiThreadsTable = mysqlTable('openai_threads', {
createdAt: timestamp({ mode: 'date' }).defaultNow().notNull(),
updatedAt: timestamp({ mode: 'date' }).defaultNow().onUpdateNow().notNull(),
userId: int('user_id').notNull(),
})
})

View File

@ -1 +1 @@
export * from './drizzle.schema'
export * from './drizzle.schema'

View File

@ -1,7 +1,11 @@
import DHT from '@hyperswarm/dht'
import { cleanDB, testEnvironment } from '@test/helpers'
import { getLogger } from 'config-schema/test/testSetup'
import { AppDatabase, Community as DbCommunity, FederatedCommunity as DbFederatedCommunity } from 'database'
import {
AppDatabase,
Community as DbCommunity,
FederatedCommunity as DbFederatedCommunity,
} from 'database'
import { validate as validateUUID, version as versionUUID } from 'uuid'
import { CONFIG } from '@/config'
import { LOG4JS_BASE_CATEGORY_NAME } from '@/config/const'

View File

@ -1,7 +1,12 @@
import { cleanDB, testEnvironment } from '@test/helpers'
import { ApolloServerTestClient } from 'apollo-server-testing'
import { EncryptedTransferArgs } from 'core'
import { AppDatabase, Community as DbCommunity, User as DbUser, UserContact as DbUserContact } from 'database'
import {
AppDatabase,
Community as DbCommunity,
User as DbUser,
UserContact as DbUserContact,
} from 'database'
import Decimal from 'decimal.js-light'
import { GraphQLError } from 'graphql'
import { getLogger } from 'log4js'