79 lines
1.6 KiB
Go
79 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
|
|
FriendCap = 5000
|
|
)
|
|
|
|
// 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
|
|
}
|