package handlers import "github.com/orchard9/rdev/internal/domain" // ConversationDTO is the data transfer object for conversations. type ConversationDTO struct { ID string `json:"id"` ProjectID string `json:"project_id"` Title string `json:"title"` CreatedAt string `json:"created_at"` UpdatedAt string `json:"updated_at"` LastMessageAt *string `json:"last_message_at,omitempty"` } // MessageDTO is the data transfer object for messages. type MessageDTO struct { ID string `json:"id"` ConversationID string `json:"conversation_id"` Role string `json:"role"` Content string `json:"content"` CreatedAt string `json:"created_at"` } // ConversationWithMessagesDTO combines a conversation with its messages. type ConversationWithMessagesDTO struct { ConversationDTO Messages []*MessageDTO `json:"messages"` } func toConversationDTO(c *domain.Conversation) *ConversationDTO { if c == nil { return nil } dto := &ConversationDTO{ ID: string(c.ID), ProjectID: c.ProjectID, Title: c.Title, CreatedAt: c.CreatedAt.Format("2006-01-02T15:04:05Z07:00"), UpdatedAt: c.UpdatedAt.Format("2006-01-02T15:04:05Z07:00"), } if c.LastMessage != nil { ts := c.LastMessage.Format("2006-01-02T15:04:05Z07:00") dto.LastMessageAt = &ts } return dto } func toMessageDTO(m *domain.Message) *MessageDTO { if m == nil { return nil } return &MessageDTO{ ID: string(m.ID), ConversationID: string(m.ConversationID), Role: string(m.Role), Content: m.Content, CreatedAt: m.CreatedAt.Format("2006-01-02T15:04:05Z07:00"), } } func toConversationWithMessagesDTO(c *domain.ConversationWithMessages) *ConversationWithMessagesDTO { if c == nil { return nil } messages := make([]*MessageDTO, len(c.Messages)) for i, m := range c.Messages { messages[i] = toMessageDTO(m) } dto := toConversationDTO(&c.Conversation) return &ConversationWithMessagesDTO{ ConversationDTO: *dto, Messages: messages, } }