Add HTTP /v1 MVC, TCP send path, groups with server-side member-avatar collage, object-storage upload, and friends/favorites around the architecture-v3 layout. Co-authored-by: Cursor <cursoragent@cursor.com>
66 lines
1.9 KiB
Go
66 lines
1.9 KiB
Go
package logic
|
|
|
|
import (
|
|
"context"
|
|
"encoding/json"
|
|
"fmt"
|
|
"time"
|
|
|
|
deliverentity "spark-server/internal/module/deliver/entity"
|
|
"spark-server/internal/module/group/entity"
|
|
msgentity "spark-server/internal/module/message/entity"
|
|
"spark-server/internal/pkg/reply"
|
|
)
|
|
|
|
func (s *Service) notice(ctx context.Context, g *entity.Group, actorID int64, kind string, targets []int64) error {
|
|
if s.msgs == nil || s.ids == nil || g == nil || g.ConversationID <= 0 {
|
|
return nil
|
|
}
|
|
msgID, err := s.ids.NextID()
|
|
if err != nil {
|
|
return err
|
|
}
|
|
now := time.Now()
|
|
content := msgentity.NewSystem(&msgentity.System{Kind: kind})
|
|
raw, err := content.Marshal()
|
|
if err != nil {
|
|
return err
|
|
}
|
|
msg := &msgentity.Message{
|
|
ID: msgID, ConversationID: g.ConversationID, SenderID: 0,
|
|
ClientMsgID: fmt.Sprintf("sys:group:%d", msgID),
|
|
Type: msgentity.TypeSystem, Content: raw,
|
|
Status: msgentity.StatusNormal, CreatedAtMS: now.UnixMilli(),
|
|
}
|
|
if err := s.msgs.Create(ctx, msg); err != nil {
|
|
return err
|
|
}
|
|
if err := s.repo.UpdateLastMsg(ctx, g.ConversationID, msgID, now.UnixMilli()); err != nil {
|
|
return err
|
|
}
|
|
if s.queue == nil {
|
|
return nil
|
|
}
|
|
to, err := s.repo.ListMemberIDs(ctx, g.ID)
|
|
if err != nil || len(to) == 0 {
|
|
to = append([]int64{actorID}, targets...)
|
|
}
|
|
return s.queue.Push(ctx, &deliverentity.Job{
|
|
MsgID: msgID, Cmd: cmdMessage, ConversationID: g.ConversationID,
|
|
FromUserID: actorID, ToUserIDs: to,
|
|
Payload: reply.MustMarshal(reply.OK(groupPushBody{
|
|
MsgID: msgID, ConversationID: g.ConversationID, SenderID: 0,
|
|
MessageType: int16(msgentity.TypeSystem), Content: raw, CreatedAt: now.UnixMilli(),
|
|
})),
|
|
})
|
|
}
|
|
|
|
type groupPushBody struct {
|
|
MsgID int64 `json:"msg_id"`
|
|
ConversationID int64 `json:"conversation_id"`
|
|
SenderID int64 `json:"sender_id"`
|
|
MessageType int16 `json:"message_type"`
|
|
Content json.RawMessage `json:"content"`
|
|
CreatedAt int64 `json:"created_at"`
|
|
}
|