11import { db } from '@sim/db'
22import { chat , workflow } from '@sim/db/schema'
3- import { and , eq , isNull } from 'drizzle-orm'
3+ import { and , eq , isNull , or } from 'drizzle-orm'
44import {
55 type CursorKey ,
66 type KeysetKey ,
@@ -25,7 +25,12 @@ import {
2525export type ChatDeploymentRow = typeof chat . $inferSelect
2626export type ChatDeploymentSortBy = 'identifier' | 'createdAt' | 'updatedAt'
2727
28- const chatDeploymentId = textKey < ChatDeploymentRow > ( chat . id , ( row ) => row . id )
28+ export interface ChatDeploymentWithWorkflowStatus {
29+ chat : ChatDeploymentRow
30+ isWorkflowDeployed : boolean
31+ }
32+
33+ const chatDeploymentId = textKey < ChatDeploymentWithWorkflowStatus > ( chat . id , ( row ) => row . chat . id )
2934
3035/**
3136 * Keyset orderings for the public list's sortable fields, made total over the
@@ -34,18 +39,25 @@ const chatDeploymentId = textKey<ChatDeploymentRow>(chat.id, (row) => row.id)
3439 */
3540const CHAT_DEPLOYMENT_SORTS = {
3641 identifier : [
37- textKey < ChatDeploymentRow > ( chat . identifier , ( row ) => row . identifier ) ,
42+ textKey < ChatDeploymentWithWorkflowStatus > ( chat . identifier , ( row ) => row . chat . identifier ) ,
3843 chatDeploymentId ,
3944 ] ,
4045 createdAt : [
41- timestampKey < ChatDeploymentRow > ( chat . createdAt , ( row ) => row . createdAt ) ,
46+ timestampKey < ChatDeploymentWithWorkflowStatus > ( chat . createdAt , ( row ) => row . chat . createdAt ) ,
4247 chatDeploymentId ,
4348 ] ,
4449 updatedAt : [
45- timestampKey < ChatDeploymentRow > ( chat . updatedAt , ( row ) => row . updatedAt ) ,
50+ timestampKey < ChatDeploymentWithWorkflowStatus > ( chat . updatedAt , ( row ) => row . chat . updatedAt ) ,
4651 chatDeploymentId ,
4752 ] ,
48- } satisfies Record < ChatDeploymentSortBy , readonly KeysetKey < ChatDeploymentRow > [ ] >
53+ } satisfies Record < ChatDeploymentSortBy , readonly KeysetKey < ChatDeploymentWithWorkflowStatus > [ ] >
54+
55+ function effectiveChatActiveFilter ( isActive : boolean | undefined ) {
56+ if ( isActive === undefined ) return undefined
57+ return isActive
58+ ? and ( eq ( chat . isActive , true ) , eq ( workflow . isDeployed , true ) )
59+ : or ( eq ( chat . isActive , false ) , eq ( workflow . isDeployed , false ) )
60+ }
4961
5062/** One keyset page of live chat deployments whose workflow lives in a workspace. */
5163export async function listWorkspaceChatDeployments ( params : {
@@ -56,13 +68,13 @@ export async function listWorkspaceChatDeployments(params: {
5668 sortOrder ?: ListSortOrder
5769 limit : number
5870 cursorKeys ?: CursorKey [ ]
59- } ) : Promise < KeysetPage < ChatDeploymentRow > > {
71+ } ) : Promise < KeysetPage < ChatDeploymentWithWorkflowStatus > > {
6072 const { sortBy = 'createdAt' , sortOrder = 'desc' , limit } = params
6173 const keys = CHAT_DEPLOYMENT_SORTS [ sortBy ]
6274 const resumeAfter = resumeKeyset ( keys , params . cursorKeys , sortOrder )
6375
6476 const rows = await db
65- . select ( { chat } )
77+ . select ( { chat, isWorkflowDeployed : workflow . isDeployed } )
6678 . from ( chat )
6779 . innerJoin ( workflow , eq ( chat . workflowId , workflow . id ) )
6880 . where (
@@ -71,18 +83,14 @@ export async function listWorkspaceChatDeployments(params: {
7183 isNull ( workflow . archivedAt ) ,
7284 isNull ( chat . archivedAt ) ,
7385 params . workflowId === undefined ? undefined : eq ( chat . workflowId , params . workflowId ) ,
74- params . isActive === undefined ? undefined : eq ( chat . isActive , params . isActive ) ,
86+ effectiveChatActiveFilter ( params . isActive ) ,
7587 resumeAfter
7688 )
7789 )
7890 . orderBy ( ...listOrderBy ( keysetColumns ( keys ) , sortOrder ) )
7991 . limit ( limit + 1 )
8092
81- return keysetPage (
82- keys ,
83- rows . map ( ( row ) => row . chat ) ,
84- limit
85- )
93+ return keysetPage ( keys , rows , limit )
8694}
8795
8896/**
0 commit comments