diff --git a/internal/api/members/bluk.go b/internal/api/members/bluk.go new file mode 100644 index 00000000..5d5edb20 --- /dev/null +++ b/internal/api/members/bluk.go @@ -0,0 +1,55 @@ +package members + +import ( + "encoding/json" + "fmt" + "io/ioutil" + "net/http" + + "demodesk/neko/internal/types" + "demodesk/neko/internal/utils" +) + +type MemberBulkUpdatePayload struct { + IDs []string `json:"ids"` + Profile types.MemberProfile `json:"profile"` +} + +func (h *MembersHandler) membersBulkUpdate(w http.ResponseWriter, r *http.Request) { + bytes, err := ioutil.ReadAll(r.Body) + if err != nil { + utils.HttpInternalServerError(w, err) + return + } + + header := &MemberBulkUpdatePayload{} + if err := json.Unmarshal(bytes, &header); err != nil { + utils.HttpInternalServerError(w, err) + return + } + + for _, memberId := range header.IDs { + // TODO: Bulk select? + profile, err := h.members.Select(memberId) + if err != nil { + utils.HttpInternalServerError(w, fmt.Sprintf("member %s: %v", memberId, err)) + return + } + + body := &MemberBulkUpdatePayload{ + Profile: profile, + } + + if err := json.Unmarshal(bytes, &body); err != nil { + utils.HttpInternalServerError(w, fmt.Sprintf("member %s: %v", memberId, err)) + return + } + + if err := h.members.UpdateProfile(memberId, body.Profile); err != nil { + utils.HttpInternalServerError(w, fmt.Sprintf("member %s: %v", memberId, err)) + return + } + } + + utils.HttpSuccess(w) +} diff --git a/internal/api/members/handler.go b/internal/api/members/handler.go index 0988f9b9..29656ac7 100644 --- a/internal/api/members/handler.go +++ b/internal/api/members/handler.go @@ -45,6 +45,12 @@ func (h *MembersHandler) Route(r chi.Router) { }) } +func (h *MembersHandler) RouteBulk(r chi.Router) { + r.With(auth.AdminsOnly).Group(func(r chi.Router) { + r.Post("/update", h.membersBulkUpdate) + }) +} + type MemberData struct { ID string Profile types.MemberProfile diff --git a/internal/api/router.go b/internal/api/router.go index 45b6fe2c..df00e79e 100644 --- a/internal/api/router.go +++ b/internal/api/router.go @@ -50,6 +50,7 @@ func (api *ApiManagerCtx) Route(r chi.Router) { membersHandler := members.New(api.members) r.Route("/members", membersHandler.Route) + r.Route("/members_bulk", membersHandler.RouteBulk) roomHandler := room.New(api.sessions, api.desktop, api.capture) r.Route("/room", roomHandler.Route)