Files
ahp 22d92c133d feat: release v0.2.0 profiles, chat, freeze, and bots
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.
2026-10-10 16:42:35 +03:30

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})
}