blob: c31e578cc1c33ba7b3994f861f3e079df349fab2 [file]
package iam
import (
"net/http"
"github.com/apache/airavata/internal/httpx"
dto "github.com/apache/airavata/api/iam/dto"
)
// GroupController serves /api/v1/groups.
type GroupController struct{ svc *GroupService }
// NewGroupController returns a handler delegating to svc.
func NewGroupController(svc *GroupService) *GroupController { return &GroupController{svc: svc} }
// Register mounts the group routes.
//
// /groups/me is registered alongside /groups/{groupId}; the literal segment wins for
// that exact path, the same way /cluster-credentials/me does.
func (h *GroupController) Register(mux *http.ServeMux) {
mux.HandleFunc("GET /api/v1/groups", h.list)
mux.HandleFunc("GET /api/v1/groups/me", h.listMine)
mux.HandleFunc("POST /api/v1/groups", h.create)
mux.HandleFunc("GET /api/v1/groups/{groupId}", h.get)
mux.HandleFunc("PUT /api/v1/groups/{groupId}", h.update)
mux.HandleFunc("DELETE /api/v1/groups/{groupId}", h.delete)
}
func (h *GroupController) list(w http.ResponseWriter, r *http.Request) {
groups, err := h.svc.List(r.Context())
if err != nil {
httpx.WriteError(w, r, err)
return
}
httpx.WriteJSON(w, http.StatusOK, groups)
}
func (h *GroupController) listMine(w http.ResponseWriter, r *http.Request) {
groups, err := h.svc.ListMine(r.Context())
if err != nil {
httpx.WriteError(w, r, err)
return
}
httpx.WriteJSON(w, http.StatusOK, groups)
}
func (h *GroupController) get(w http.ResponseWriter, r *http.Request) {
group, err := h.svc.Get(r.Context(), r.PathValue("groupId"))
if err != nil {
httpx.WriteError(w, r, err)
return
}
httpx.WriteJSON(w, http.StatusOK, group)
}
func (h *GroupController) create(w http.ResponseWriter, r *http.Request) {
var req dto.GroupRequest
if err := httpx.Bind(r, &req); err != nil {
httpx.WriteError(w, r, err)
return
}
group, err := h.svc.Create(r.Context(), &req)
if err != nil {
httpx.WriteError(w, r, err)
return
}
httpx.WriteJSON(w, http.StatusCreated, group)
}
func (h *GroupController) update(w http.ResponseWriter, r *http.Request) {
var req dto.GroupRequest
if err := httpx.Bind(r, &req); err != nil {
httpx.WriteError(w, r, err)
return
}
group, err := h.svc.Update(r.Context(), r.PathValue("groupId"), &req)
if err != nil {
httpx.WriteError(w, r, err)
return
}
httpx.WriteJSON(w, http.StatusOK, group)
}
func (h *GroupController) delete(w http.ResponseWriter, r *http.Request) {
if err := h.svc.Delete(r.Context(), r.PathValue("groupId")); err != nil {
httpx.WriteError(w, r, err)
return
}
httpx.WriteJSON(w, http.StatusNoContent, nil)
}
// GroupMemberController serves /api/v1/groups/{groupId}/members.
type GroupMemberController struct{ svc *GroupMemberService }
// NewGroupMemberController returns a handler delegating to svc.
func NewGroupMemberController(svc *GroupMemberService) *GroupMemberController {
return &GroupMemberController{svc: svc}
}
// Register mounts the membership routes.
func (h *GroupMemberController) Register(mux *http.ServeMux) {
mux.HandleFunc("GET /api/v1/groups/{groupId}/members", h.list)
mux.HandleFunc("POST /api/v1/groups/{groupId}/members", h.add)
mux.HandleFunc("GET /api/v1/groups/{groupId}/members/{userId}", h.get)
mux.HandleFunc("PUT /api/v1/groups/{groupId}/members/{userId}", h.update)
mux.HandleFunc("DELETE /api/v1/groups/{groupId}/members/{userId}", h.remove)
}
func (h *GroupMemberController) list(w http.ResponseWriter, r *http.Request) {
members, err := h.svc.List(r.Context(), r.PathValue("groupId"))
if err != nil {
httpx.WriteError(w, r, err)
return
}
httpx.WriteJSON(w, http.StatusOK, members)
}
func (h *GroupMemberController) get(w http.ResponseWriter, r *http.Request) {
member, err := h.svc.Get(r.Context(), r.PathValue("groupId"), r.PathValue("userId"))
if err != nil {
httpx.WriteError(w, r, err)
return
}
httpx.WriteJSON(w, http.StatusOK, member)
}
func (h *GroupMemberController) add(w http.ResponseWriter, r *http.Request) {
var req dto.GroupMemberRequest
if err := httpx.Bind(r, &req); err != nil {
httpx.WriteError(w, r, err)
return
}
member, err := h.svc.Add(r.Context(), r.PathValue("groupId"), &req)
if err != nil {
httpx.WriteError(w, r, err)
return
}
httpx.WriteJSON(w, http.StatusCreated, member)
}
func (h *GroupMemberController) update(w http.ResponseWriter, r *http.Request) {
var req dto.GroupMemberUpdate
if err := httpx.Bind(r, &req); err != nil {
httpx.WriteError(w, r, err)
return
}
member, err := h.svc.Update(r.Context(), r.PathValue("groupId"), r.PathValue("userId"), &req)
if err != nil {
httpx.WriteError(w, r, err)
return
}
httpx.WriteJSON(w, http.StatusOK, member)
}
func (h *GroupMemberController) remove(w http.ResponseWriter, r *http.Request) {
if err := h.svc.Remove(r.Context(), r.PathValue("groupId"), r.PathValue("userId")); err != nil {
httpx.WriteError(w, r, err)
return
}
httpx.WriteJSON(w, http.StatusNoContent, nil)
}