feat: disciple link
This commit is contained in:
@@ -37,7 +37,8 @@ const userColumns = `id, email, handle, password_hash, name, avatar_url, role, p
|
||||
email_verified_at, token_version, created_at, updated_at, country,
|
||||
sampradaya, gender, initiated, initiated_at, daily_chanting_rounds,
|
||||
preferred_chanting_time, peak_active_time, banned_at,
|
||||
bookmark_limit, public_collection_limit, private_collection_limit`
|
||||
bookmark_limit, public_collection_limit, private_collection_limit,
|
||||
disciple_id`
|
||||
|
||||
// rowScanner is satisfied by both pgx.Row (QueryRow) and pgx.Rows, so
|
||||
// scanUser works for single-row and iterated reads alike.
|
||||
@@ -53,6 +54,7 @@ func scanUser(row rowScanner, u *model.User) error {
|
||||
&u.Sampradaya, &u.Gender, &u.Initiated, &u.InitiatedAt, &u.DailyChantingRounds,
|
||||
&u.PreferredChantingTime, &u.PeakActiveTime, &u.BannedAt,
|
||||
&u.BookmarkLimit, &u.PublicCollectionLimit, &u.PrivateCollectionLimit,
|
||||
&u.DiscipleID,
|
||||
)
|
||||
}
|
||||
|
||||
@@ -402,6 +404,41 @@ func (r *UserRepo) AllHandles(ctx context.Context) ([]string, error) {
|
||||
return handles, rows.Err()
|
||||
}
|
||||
|
||||
// DiscipleLink pairs a Mongo disciple id with the platform account an admin
|
||||
// has linked to it. Powers the /disciples browser highlight: the reader page
|
||||
// fetches the whole (small) set once and marks the matching cards.
|
||||
type DiscipleLink struct {
|
||||
DiscipleID string `json:"disciple_id"`
|
||||
Handle string `json:"handle"`
|
||||
Name string `json:"name"`
|
||||
AvatarURL *string `json:"avatar_url"`
|
||||
}
|
||||
|
||||
// ListDiscipleLinks returns every user→disciple link. Deliberately unpaged:
|
||||
// only Śrīla Prabhupāda's own disciples are ever linked, so this is dozens of
|
||||
// rows at most and the partial index on disciple_id keeps it a cheap scan.
|
||||
// Suspended accounts are excluded so a banned user can't keep a public badge.
|
||||
func (r *UserRepo) ListDiscipleLinks(ctx context.Context) ([]DiscipleLink, error) {
|
||||
rows, err := r.pg.Pool.Query(ctx, `
|
||||
SELECT disciple_id, handle, name, avatar_url
|
||||
FROM users
|
||||
WHERE disciple_id IS NOT NULL AND banned_at IS NULL
|
||||
ORDER BY name`)
|
||||
if err != nil {
|
||||
return nil, fmt.Errorf("list disciple links: %w", err)
|
||||
}
|
||||
defer rows.Close()
|
||||
out := []DiscipleLink{}
|
||||
for rows.Next() {
|
||||
var l DiscipleLink
|
||||
if err := rows.Scan(&l.DiscipleID, &l.Handle, &l.Name, &l.AvatarURL); err != nil {
|
||||
return nil, fmt.Errorf("scan disciple link: %w", err)
|
||||
}
|
||||
out = append(out, l)
|
||||
}
|
||||
return out, rows.Err()
|
||||
}
|
||||
|
||||
// RecentlyJoined returns up to `limit` users who registered on/after `since`,
|
||||
// newest first, as a discovery list for the feed's "new on the platform"
|
||||
// strip. Excludes the viewer, anyone the viewer already has a follow edge with
|
||||
|
||||
Reference in New Issue
Block a user