package model import ( "context" "time" "spark-server/internal/module/friend/entity" ) // FriendRelation maps table friend_relations. type FriendRelation struct { UserSmall int64 `gorm:"column:user_small;primaryKey;comment:两人中较小的 user_id,保证同一对用户只有一行"` UserBig int64 `gorm:"column:user_big;primaryKey;comment:两人中较大的 user_id"` CreatedAt time.Time `gorm:"column:created_at;comment:成为好友时间"` } func (FriendRelation) TableName() string { return "friend_relations" } func (r *FriendRelation) entity() *entity.Relation { if r == nil { return nil } return &entity.Relation{UserSmall: r.UserSmall, UserBig: r.UserBig, CreatedAt: r.CreatedAt} } func (m *Repo) GetRelation(ctx context.Context, a, b int64) (*entity.Relation, error) { db, err := m.session(ctx) if err != nil { return nil, err } small, big := entity.OrderUsers(a, b) var row FriendRelation if err := db.Where("user_small = ? AND user_big = ?", small, big).Take(&row).Error; err != nil { return nil, mapDBErr(err) } return row.entity(), nil } func (m *Repo) ListFriends(ctx context.Context, userID int64, limit int) ([]*entity.Relation, error) { db, err := m.session(ctx) if err != nil { return nil, err } limit = entity.ClampLimit(limit) var rows []FriendRelation err = db.Where("user_small = ? OR user_big = ?", userID, userID). Order("created_at DESC").Limit(limit).Find(&rows).Error if err != nil { return nil, mapDBErr(err) } out := make([]*entity.Relation, 0, len(rows)) for i := range rows { out = append(out, rows[i].entity()) } return out, nil }