···
func GetReactionStatus(e Execer, userDid string, threadAt syntax.ATURI, kind models.ReactionKind) bool {
if _, err := GetReaction(e, userDid, threadAt, kind); err != nil {
···
+
func GetReactionMap(e Execer, threadAt syntax.ATURI) (map[models.ReactionKind]models.ReactionDisplayData, error) {
+
const maxUsersPerKind = 20
+
select kind, reacted_by_did,
+
row_number() over (partition by kind order by created asc) as rn,
+
count(*) over (partition by kind) as total
+
order by kind, created asc`
+
rows, err := e.Query(query, threadAt)
+
reactionMap := map[models.ReactionKind]models.ReactionDisplayData{}
+
for _, kind := range models.OrderedReactionKinds {
+
reactionMap[kind] = models.ReactionDisplayData{Count: 0, Users: []string{}}
+
var kind models.ReactionKind
+
if err := rows.Scan(&kind, &did, &rn, &total); err != nil {
+
data := reactionMap[kind]
+
if rn <= maxUsersPerKind {
+
data.Users = append(data.Users, did)
+
reactionMap[kind] = data
+
return reactionMap, rows.Err()
func GetReactionStatus(e Execer, userDid string, threadAt syntax.ATURI, kind models.ReactionKind) bool {
if _, err := GetReaction(e, userDid, threadAt, kind); err != nil {