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:
@@ -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
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user