spark-server/internal/module/group/logic/view.go
zhr ae9a71034d feat: implement Spark IM V3 modular monolith
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>
2026-09-17 19:52:11 +08:00

76 lines
1.8 KiB
Go

package logic
import (
"time"
"spark-server/internal/module/group/entity"
userentity "spark-server/internal/module/user/entity"
)
// View is the HTTP/TCP group card. ID is the AUTO_INCREMENT 群号.
type View struct {
ID int64 `json:"id"`
ConversationID int64 `json:"conversation_id"`
Name string `json:"name"`
Avatar string `json:"avatar"`
OwnerID int64 `json:"owner_id"`
MutedAll bool `json:"muted_all"`
MemberCount int `json:"member_count"`
Role int `json:"role"`
CreatedAt int64 `json:"created_at"`
}
type MemberView struct {
UID int64 `json:"uid"`
SparkID string `json:"spark_id"`
Nickname string `json:"nickname"`
Avatar string `json:"avatar"`
Gender int `json:"gender"`
Role int `json:"role"`
GroupNickname string `json:"group_nickname"`
SpeakMuted bool `json:"speak_muted"`
JoinedAt int64 `json:"joined_at"`
}
type List struct {
Items []*View `json:"items"`
}
type MemberList struct {
Items []*MemberView `json:"items"`
}
func viewOf(g *entity.Group, role int) *View {
if g == nil {
return nil
}
return &View{
ID: g.ID, ConversationID: g.ConversationID, Name: g.Name, Avatar: g.Avatar,
OwnerID: g.OwnerID, MutedAll: g.MutedAll, MemberCount: g.MemberCount,
Role: role, CreatedAt: g.CreatedAtMS,
}
}
func memberViewOf(mem *entity.Member, u *userentity.User) *MemberView {
v := &MemberView{}
if mem != nil {
v.UID = mem.UserID
v.Role = mem.Role
v.GroupNickname = mem.Nickname
v.SpeakMuted = mem.SpeakMuted
v.JoinedAt = mem.JoinedAtMS
}
if u != nil {
v.SparkID = u.SparkID
v.Nickname = u.Nickname
v.Avatar = u.Avatar
v.Gender = u.Gender
if v.UID == 0 {
v.UID = u.ID
}
}
return v
}
func nowMS() int64 { return time.Now().UnixMilli() }