package model import ( "context" "time" "gorm.io/gorm" "spark-server/internal/module/friend/entity" "spark-server/internal/pkg/errs" ) func (m *Repo) AcceptFriend(ctx context.Context, in entity.AcceptParams) error { if len(in.Edges) == 0 { return errs.ErrInvalidArgument } db, err := m.session(ctx) if err != nil { return err } now := time.Now() for _, e := range in.Edges { if e == nil || e.UserID <= 0 || e.FriendID <= 0 { return errs.ErrInvalidArgument } if e.CreatedAt.IsZero() { e.CreatedAt = now } if e.UpdatedAt.IsZero() { e.UpdatedAt = e.CreatedAt } } if !in.Edges[0].CreatedAt.IsZero() { now = in.Edges[0].CreatedAt } return db.Transaction(func(tx *gorm.DB) error { for _, e := range in.Edges { row := rowFromEdge(e) assigns := map[string]any{ "status": entity.StatusFriend, "updated_at": e.UpdatedAt, } if e.Remark != "" { assigns["remark"] = e.Remark } if e.Source != 0 { assigns["source"] = e.Source } if err := tx.Where("user_id = ? AND friend_id = ?", row.UserID, row.FriendID). Attrs(row).Assign(assigns).FirstOrCreate(&row).Error; err != nil { return mapDBErr(err) } } return markRequestsAccepted(tx, in.Requests, now) }) } func (m *Repo) DeleteFriend(ctx context.Context, a, b int64) error { db, err := m.session(ctx) if err != nil { return err } res := db.Where("(user_id = ? AND friend_id = ?) OR (user_id = ? AND friend_id = ?)", a, b, b, a). Delete(&FriendRelation{}) if res.Error != nil { return mapDBErr(res.Error) } if res.RowsAffected == 0 { return errs.ErrNotFound } return nil }