spark-server/internal/module/friend/entity/relation.go
2026-09-18 14:50:41 +08:00

78 lines
1.6 KiB
Go

package entity
import "time"
const (
RelationNone RelationKind = 0
RelationFriend RelationKind = 1
RelationBlock RelationKind = 2
StatusNone EdgeStatus = 0
StatusFriend EdgeStatus = 1
)
// RelationKind is the viewer-centric JSON `relation` (not the table column).
type RelationKind int
func (k RelationKind) Valid() bool {
return k == RelationNone || k == RelationFriend || k == RelationBlock
}
// EdgeStatus is persisted as friend_relations.status.
type EdgeStatus int
func (s EdgeStatus) Valid() bool {
return s == StatusNone || s == StatusFriend
}
const (
ListDefault = 20
ListMax = 100
)
// Relation is one directed edge: UserID's view of FriendID.
type Relation struct {
ID int64
UserID int64
FriendID int64
Status EdgeStatus
Remark string
Blocked bool
Pinned bool
Source Source
CreatedAt time.Time
UpdatedAt time.Time
}
func (r *Relation) Active() bool {
return r != nil && r.Status == StatusFriend
}
func NewFriendEdge(userID, friendID int64, remark string, source Source, at time.Time) *Relation {
return &Relation{
UserID: userID, FriendID: friendID, Status: StatusFriend,
Remark: remark, Source: source, CreatedAt: at, UpdatedAt: at,
}
}
func ClampLimit(limit int) int {
if limit <= 0 {
return ListDefault
}
if limit > ListMax {
return ListMax
}
return limit
}
// ViewRelation is the viewer-centric relation: friend, blocked-by-me, or none.
func ViewRelation(friend, blockedByMe bool) RelationKind {
if blockedByMe {
return RelationBlock
}
if friend {
return RelationFriend
}
return RelationNone
}