diff --git a/appview/db/follow.go b/appview/db/follow.go --- a/appview/db/follow.go +++ b/appview/db/follow.go @@ -11,7 +11,7 @@ "tangled.org/core/appview/models" "tangled.org/core/orm" ) -func UpsertFollow(e Execer, follow models.Follow) error { +func UpsertFollow(e Execer, rkey string, follow models.Follow) error { _, err := e.Exec( `insert into follows (did, rkey, subject_did, created) values (?, ?, ?, ?) @@ -19,7 +19,7 @@ on conflict(did, rkey) do update set subject_did = excluded.subject_did, created = excluded.created`, follow.UserDid, - follow.Rkey, + rkey, follow.SubjectDid, follow.FollowedAt.Format(time.RFC3339), ) @@ -189,9 +189,10 @@ args = append(args, limit) } query := fmt.Sprintf( - `select did, subject_did, created, rkey + `select did, subject_did, max(created) from follows %s + group by did, subject_did order by created desc %s `, whereClause, limitClause) @@ -209,7 +210,6 @@ err := rows.Scan( &follow.UserDid, &follow.SubjectDid, &followedAt, - &follow.Rkey, ) if err != nil { return nil, err diff --git a/appview/ingester.go b/appview/ingester.go --- a/appview/ingester.go +++ b/appview/ingester.go @@ -287,10 +287,9 @@ l.Error("invalid record", "err", err) return err } - err = db.UpsertFollow(i.Db, models.Follow{ + err = db.UpsertFollow(i.Db, e.Commit.RKey, models.Follow{ UserDid: did, SubjectDid: record.Subject, - Rkey: e.Commit.RKey, FollowedAt: followedAt, }) case jmodels.CommitOperationDelete: diff --git a/appview/models/follow.go b/appview/models/follow.go --- a/appview/models/follow.go +++ b/appview/models/follow.go @@ -10,7 +10,6 @@ type Follow struct { UserDid string SubjectDid string FollowedAt time.Time - Rkey string } func (f *Follow) AsRecord() tangled.GraphFollow { diff --git a/appview/state/follow.go b/appview/state/follow.go --- a/appview/state/follow.go +++ b/appview/state/follow.go @@ -46,9 +46,9 @@ case http.MethodPost: follow := models.Follow{ UserDid: currentUser.Did, SubjectDid: subjectIdent.DID.String(), - Rkey: tid.TID(), FollowedAt: time.Now(), } + rkey := tid.TID() tx, err := s.db.BeginTx(r.Context(), nil) if err != nil { @@ -57,7 +57,7 @@ return } defer tx.Rollback() - if err := db.UpsertFollow(tx, follow); err != nil { + if err := db.UpsertFollow(tx, rkey, follow); err != nil { s.logger.Error("failed to follow", "err", err) return } @@ -66,7 +66,7 @@ record := follow.AsRecord() resp, err := comatproto.RepoPutRecord(r.Context(), client, &comatproto.RepoPutRecord_Input{ Collection: tangled.GraphFollowNSID, Repo: currentUser.Did, - Rkey: follow.Rkey, + Rkey: rkey, Record: &lexutil.LexiconTypeDecoder{ Val: &record, },