feat(conversations): expose inbox assistant

This commit is contained in:
2026-06-06 15:07:08 +08:00
parent 7554a75427
commit 18a2cc5e83
8 changed files with 127 additions and 13 deletions
+23
View File
@@ -161,6 +161,29 @@ func (s *ConversationService) GetByAccountAndDisplayIDOrID(ctx context.Context,
return s.repo.FindByAccountAndDisplayIDOrID(ctx, accountID, routeID)
}
// GetInboxAssistant returns the Captain assistant connected to the conversation's inbox.
// Reference: Chatwoot enterprise ConversationsController#inbox_assistant.
func (s *ConversationService) GetInboxAssistant(ctx context.Context, accountID, routeID uint) (*model.CaptainAssistant, error) {
conversation, err := s.repo.FindByAccountAndDisplayIDOrID(ctx, accountID, routeID)
if err != nil {
return nil, err
}
var assistant model.CaptainAssistant
err = s.repo.DB().WithContext(ctx).
Joins("JOIN captain_inboxes ON captain_inboxes.captain_assistant_id = captain_assistants.id").
Where("captain_inboxes.account_id = ? AND captain_inboxes.inbox_id = ? AND captain_assistants.account_id = ?", accountID, conversation.InboxID, accountID).
Order("captain_inboxes.id DESC").
First(&assistant).Error
if errors.Is(err, gorm.ErrRecordNotFound) {
return nil, nil
}
if err != nil {
return nil, err
}
return &assistant, nil
}
// CreateConversationRequest is the DTO for creating a conversation.
// Reference: Chatwoot app/controllers/api/v1/accounts/conversations_controller.rb #create
// Supports creating conversation with an initial message (like Chatwoot's ConversationBuilder).