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 }