Ship the product pass on the v0.1.3 schema with additive migrations, a replica migration lock, and bot accounts kept out of people lists.
68 lines
1.9 KiB
Go
68 lines
1.9 KiB
Go
package api
|
|
|
|
import (
|
|
"encoding/json"
|
|
"errors"
|
|
"net/http"
|
|
|
|
"pargar/backend/internal/store"
|
|
)
|
|
|
|
func (s *Server) handlePublicProfile(w http.ResponseWriter, r *http.Request) {
|
|
id := routeID(r, "id")
|
|
if id <= 0 {
|
|
writeErr(w, http.StatusNotFound, "کاربر پیدا نشد")
|
|
return
|
|
}
|
|
u, err := s.store.GetUserByID(r.Context(), id)
|
|
if err != nil {
|
|
if errors.Is(err, store.ErrNotFound) {
|
|
writeErr(w, http.StatusNotFound, "کاربر پیدا نشد")
|
|
return
|
|
}
|
|
writeErr(w, http.StatusInternalServerError, "بارگذاری پروفایل ممکن نشد")
|
|
return
|
|
}
|
|
u = s.settleAccount(r.Context(), u)
|
|
s.signUserMedia(u)
|
|
me := currentUser(r)
|
|
extras, err := s.store.GetProfileExtras(r.Context(), u.ID)
|
|
if err != nil {
|
|
extras = store.ProfileExtras{}
|
|
}
|
|
full := me.ID == u.ID || me.Role.IsStaff()
|
|
if !full && !extras.Public {
|
|
writeJSON(w, http.StatusOK, map[string]any{
|
|
"user": map[string]any{
|
|
"id": u.ID, "name": u.Name, "role": u.Role,
|
|
"avatarVariant": u.AvatarVariant, "avatarPalette": u.AvatarPalette, "avatarPhoto": u.AvatarPhoto,
|
|
"private": true, "isFrozen": u.IsFrozen, "isClosed": u.IsClosed,
|
|
},
|
|
})
|
|
return
|
|
}
|
|
view := map[string]any{
|
|
"id": u.ID, "name": u.Name, "username": u.Username, "role": u.Role,
|
|
"avatarVariant": u.AvatarVariant, "avatarPalette": u.AvatarPalette, "avatarPhoto": u.AvatarPhoto,
|
|
"private": false, "public": extras.Public,
|
|
"createdAt": u.CreatedAt,
|
|
"isFrozen": u.IsFrozen, "isClosed": u.IsClosed,
|
|
}
|
|
if full || extras.ShowStats {
|
|
view["xp"] = u.XP
|
|
view["hearts"] = u.Hearts
|
|
view["streakCurrent"] = u.StreakCurrent
|
|
view["streakLongest"] = u.StreakLongest
|
|
view["isLocked"] = u.IsLocked
|
|
}
|
|
if full || extras.Public {
|
|
view["banner"] = s.signExistingMediaURL(extras.Banner)
|
|
links := extras.SocialLinks
|
|
if len(links) == 0 {
|
|
links = []byte(`[]`)
|
|
}
|
|
view["socialLinks"] = json.RawMessage(links)
|
|
}
|
|
writeJSON(w, http.StatusOK, map[string]any{"user": view})
|
|
}
|