90 lines
2.0 KiB
Go
90 lines
2.0 KiB
Go
|
|
package rest
|
||
|
|
|
||
|
|
import (
|
||
|
|
"encoding/json"
|
||
|
|
"net/http"
|
||
|
|
"strings"
|
||
|
|
|
||
|
|
"github.com/explorer/backend/auth"
|
||
|
|
)
|
||
|
|
|
||
|
|
// handleMembershipTiers returns the canonical set of institutional tiers
|
||
|
|
// with their labels and default explorer access tracks.
|
||
|
|
// GET /api/v1/membership/tiers
|
||
|
|
func (s *Server) handleMembershipTiers(w http.ResponseWriter, r *http.Request) {
|
||
|
|
if r.Method != http.MethodGet {
|
||
|
|
writeMethodNotAllowed(w)
|
||
|
|
return
|
||
|
|
}
|
||
|
|
|
||
|
|
tiers := auth.ListTiers()
|
||
|
|
w.Header().Set("Content-Type", "application/json")
|
||
|
|
_ = json.NewEncoder(w).Encode(map[string]interface{}{
|
||
|
|
"tiers": tiers,
|
||
|
|
})
|
||
|
|
}
|
||
|
|
|
||
|
|
// handleMembershipMembers returns all active institutional members.
|
||
|
|
// GET /api/v1/membership/members
|
||
|
|
func (s *Server) handleMembershipMembers(w http.ResponseWriter, r *http.Request) {
|
||
|
|
if r.Method != http.MethodGet {
|
||
|
|
writeMethodNotAllowed(w)
|
||
|
|
return
|
||
|
|
}
|
||
|
|
|
||
|
|
if !s.requireDB(w) {
|
||
|
|
return
|
||
|
|
}
|
||
|
|
|
||
|
|
store := auth.NewMembershipStore(s.db)
|
||
|
|
members, err := store.ListMembers(r.Context())
|
||
|
|
if err != nil {
|
||
|
|
writeInternalError(w, err.Error())
|
||
|
|
return
|
||
|
|
}
|
||
|
|
if members == nil {
|
||
|
|
members = []auth.InstitutionalMember{}
|
||
|
|
}
|
||
|
|
|
||
|
|
w.Header().Set("Content-Type", "application/json")
|
||
|
|
_ = json.NewEncoder(w).Encode(map[string]interface{}{
|
||
|
|
"members": members,
|
||
|
|
"total": len(members),
|
||
|
|
})
|
||
|
|
}
|
||
|
|
|
||
|
|
// handleMembershipMemberDetail returns a single member by slug.
|
||
|
|
// GET /api/v1/membership/members/{slug}
|
||
|
|
func (s *Server) handleMembershipMemberDetail(w http.ResponseWriter, r *http.Request) {
|
||
|
|
if r.Method != http.MethodGet {
|
||
|
|
writeMethodNotAllowed(w)
|
||
|
|
return
|
||
|
|
}
|
||
|
|
|
||
|
|
if !s.requireDB(w) {
|
||
|
|
return
|
||
|
|
}
|
||
|
|
|
||
|
|
slug := strings.TrimPrefix(r.URL.Path, "/api/v1/membership/members/")
|
||
|
|
if slug == "" {
|
||
|
|
writeError(w, http.StatusBadRequest, "MISSING_SLUG", "Member slug is required")
|
||
|
|
return
|
||
|
|
}
|
||
|
|
|
||
|
|
store := auth.NewMembershipStore(s.db)
|
||
|
|
member, err := store.GetMemberBySlug(r.Context(), slug)
|
||
|
|
if err != nil {
|
||
|
|
writeInternalError(w, err.Error())
|
||
|
|
return
|
||
|
|
}
|
||
|
|
if member == nil {
|
||
|
|
writeNotFound(w, "Member")
|
||
|
|
return
|
||
|
|
}
|
||
|
|
|
||
|
|
w.Header().Set("Content-Type", "application/json")
|
||
|
|
_ = json.NewEncoder(w).Encode(map[string]interface{}{
|
||
|
|
"member": member,
|
||
|
|
})
|
||
|
|
}
|