Messages CRUD

This commit is contained in:
2024-03-30 18:40:21 +08:00
parent 8e31675317
commit 729409618b
5 changed files with 134 additions and 33 deletions

View File

@ -3,7 +3,6 @@ package services
import (
"git.solsynth.dev/hydrogen/messaging/pkg/models"
"github.com/gofiber/contrib/websocket"
"github.com/samber/lo"
)
var WsConn = make(map[uint][]*websocket.Conn)
@ -20,28 +19,6 @@ func PushCommand(userId uint, task models.UnifiedCommand) {
func DealCommand(task models.UnifiedCommand, user models.Account) *models.UnifiedCommand {
switch task.Action {
case "messages.send.text":
var req struct {
ChannelID uint `json:"channel_id"`
Content string `json:"content"`
Attachments []models.Attachment `json:"attachments"`
}
models.FitStruct(task.Payload, &req)
if len(req.Content) == 0 {
return &models.UnifiedCommand{
Action: "error",
Message: "content cannot be empty",
}
}
if channel, member, err := GetAvailableChannel(req.ChannelID, user); err != nil {
return lo.ToPtr(models.UnifiedCommandFromError(err))
} else if _, err = NewTextMessage(req.Content, member, channel); err != nil {
return lo.ToPtr(models.UnifiedCommandFromError(err))
} else {
return nil
}
default:
return &models.UnifiedCommand{
Action: "error",

View File

@ -22,15 +22,44 @@ func ListMessage(channel models.Channel, take int, offset int) ([]models.Message
}
var messages []models.Message
if err := database.C.Where(models.Message{
ChannelID: channel.ID,
}).Limit(take).Offset(offset).Find(&messages).Error; err != nil {
if err := database.C.
Where(models.Message{
ChannelID: channel.ID,
}).Limit(take).Offset(offset).
Order("created_at DESC").
Preload("Sender").
Find(&messages).Error; err != nil {
return messages, err
} else {
return messages, nil
}
}
func GetMessage(channel models.Channel, id uint) (models.Message, error) {
var message models.Message
if err := database.C.Where(models.Message{
BaseModel: models.BaseModel{ID: id},
ChannelID: channel.ID,
}).First(&message).Error; err != nil {
return message, err
} else {
return message, nil
}
}
func GetMessageWithPrincipal(channel models.Channel, member models.ChannelMember, id uint) (models.Message, error) {
var message models.Message
if err := database.C.Where(models.Message{
BaseModel: models.BaseModel{ID: id},
ChannelID: channel.ID,
SenderID: member.ID,
}).First(&message).Error; err != nil {
return message, err
} else {
return message, nil
}
}
func NewTextMessage(content string, sender models.ChannelMember, channel models.Channel, attachments ...models.Attachment) (models.Message, error) {
message := models.Message{
Content: content,
@ -57,3 +86,39 @@ func NewTextMessage(content string, sender models.ChannelMember, channel models.
return message, nil
}
func EditMessage(message models.Message) (models.Message, error) {
var members []models.ChannelMember
if err := database.C.Save(&message).Error; err != nil {
return message, err
} else if err = database.C.Where(models.ChannelMember{
ChannelID: message.ChannelID,
}).Find(&members).Error; err == nil {
for _, member := range members {
PushCommand(member.ID, models.UnifiedCommand{
Action: "messages.update",
Payload: message,
})
}
}
return message, nil
}
func DeleteMessage(message models.Message) (models.Message, error) {
var members []models.ChannelMember
if err := database.C.Delete(&message).Error; err != nil {
return message, err
} else if err = database.C.Where(models.ChannelMember{
ChannelID: message.ChannelID,
}).Find(&members).Error; err == nil {
for _, member := range members {
PushCommand(member.ID, models.UnifiedCommand{
Action: "messages.burnt",
Payload: message,
})
}
}
return message, nil
}