Private
Public Access
1
0

Tweaks/cleanups to conversation management in tui

- Pass around message/conversation values instead of pointers where it
makes more sense, and store values instead of pointers in the globally
(within the TUI) shared `App` (pointers provide no utility here).

- Split conversation persistence into separate conversation/message
  saving stages
This commit is contained in:
2024-10-25 16:57:15 +00:00
parent 07c96082e7
commit ec21a02ec0
9 changed files with 116 additions and 86 deletions

View File

@@ -25,6 +25,7 @@ type Repo interface {
CreateConversation(title string) (*Conversation, error)
UpdateConversation(*Conversation) error
DeleteConversation(*Conversation) error
DeleteConversationById(id uint) error
GetMessageByID(messageID uint) (*Message, error)
@@ -71,7 +72,7 @@ func NewRepo(db *gorm.DB) (Repo, error) {
return &repo{db, _sqids}, nil
}
type conversationListItem struct {
type ConversationListItem struct {
ID uint
ShortName string
Title string
@@ -80,7 +81,7 @@ type conversationListItem struct {
type ConversationList struct {
Total int
Items []conversationListItem
Items []ConversationListItem
}
// LoadConversationList loads existing conversations, ordered by the date
@@ -95,7 +96,7 @@ func (s *repo) LoadConversationList() (ConversationList, error) {
}
for _, c := range convos {
list.Items = append(list.Items, conversationListItem{
list.Items = append(list.Items, ConversationListItem{
ID: c.ID,
ShortName: c.ShortName.String,
Title: c.Title,
@@ -147,7 +148,7 @@ func (s *repo) GetConversationByID(id uint) (*Conversation, error) {
func (s *repo) CreateConversation(title string) (*Conversation, error) {
// Create the new conversation
c := &Conversation{Title: title}
err := s.db.Save(c).Error
err := s.db.Create(c).Error
if err != nil {
return nil, err
}
@@ -172,12 +173,18 @@ func (s *repo) DeleteConversation(c *Conversation) error {
if c == nil || c.ID == 0 {
return fmt.Errorf("Conversation is nil or invalid (missing ID)")
}
// Delete messages first
err := s.db.Where("conversation_id = ?", c.ID).Delete(&Message{}).Error
return s.DeleteConversationById(c.ID)
}
func (s *repo) DeleteConversationById(id uint) error {
if id == 0 {
return fmt.Errorf("Invalid conversation ID: %d", id)
}
err := s.db.Where("conversation_id = ?", id).Delete(&Message{}).Error
if err != nil {
return err
}
return s.db.Delete(c).Error
return s.db.Where("id = ?", id).Delete(&Conversation{}).Error
}
func (s *repo) SaveMessage(m Message) (*Message, error) {
@@ -186,6 +193,7 @@ func (s *repo) SaveMessage(m Message) (*Message, error) {
}
newMessage := m
newMessage.ID = 0
newMessage.CreatedAt = time.Now()
return &newMessage, s.db.Create(&newMessage).Error
}
@@ -234,12 +242,15 @@ func (s *repo) Reply(to *Message, messages ...Message) ([]Message, error) {
savedMessages = append(savedMessages, message)
currentParent = &message
}
to.Conversation.LastMessageAt = savedMessages[len(savedMessages)-1].CreatedAt
s.UpdateConversation(to.Conversation)
return nil
})
if err != nil {
return savedMessages, err
}
to.Conversation.LastMessageAt = savedMessages[len(savedMessages)-1].CreatedAt
err = s.UpdateConversation(to.Conversation)
return savedMessages, err
}