Files

122 lines
4.1 KiB
Go

package manager
import (
"encoding/json"
"net/http"
"github.com/gorilla/mux"
"github.com/netbirdio/management-refactor/internals/modules/templates"
"github.com/netbirdio/management-refactor/internals/shared/db"
"github.com/netbirdio/management-refactor/internals/shared/permissions"
"github.com/netbirdio/management-refactor/internals/shared/permissions/modules"
"github.com/netbirdio/management-refactor/internals/shared/permissions/operations"
nbcontext "github.com/netbirdio/netbird/management/server/context"
)
type handler struct {
manager templates.Manager
}
func RegisterEndpoints(router *mux.Router, permissionsManager permissions.Manager, manager templates.Manager) {
h := &handler{
manager: manager,
}
router.HandleFunc("/templates", permissionsManager.WithPermission(modules.Template, operations.Write, h.createTemplate)).Methods("POST", "OPTIONS")
router.HandleFunc("/templates", permissionsManager.WithPermission(modules.Template, operations.Read, h.getAllTemplates)).Methods("GET", "OPTIONS")
router.HandleFunc("/templates/{templateId}", permissionsManager.WithPermission(modules.Template, operations.Read, h.getTemplate)).Methods("GET", "OPTIONS")
router.HandleFunc("/templates/{templateId}", permissionsManager.WithPermission(modules.Template, operations.Write, h.updateTemplate)).Methods("PUT", "OPTIONS")
router.HandleFunc("/templates/{templateId}", permissionsManager.WithPermission(modules.Template, operations.Write, h.deleteTemplate)).Methods("DELETE", "OPTIONS")
}
func (h *handler) getAllTemplates(w http.ResponseWriter, r *http.Request, userAuth *nbcontext.UserAuth) {
users, err := h.manager.GetAllTemplates(r.Context(), nil, db.LockingStrengthShare, userAuth.AccountId)
if err != nil {
http.Error(w, "Internal Server Error", http.StatusInternalServerError)
return
}
_ = json.NewEncoder(w).Encode(users)
}
func (h *handler) getTemplate(w http.ResponseWriter, r *http.Request, userAuth *nbcontext.UserAuth) {
vars := mux.Vars(r)
templateId := vars["templateId"]
user, err := h.manager.GetTemplateByID(r.Context(), nil, db.LockingStrengthShare, templateId)
if err != nil {
http.Error(w, "Not Found", http.StatusNotFound)
return
}
_ = json.NewEncoder(w).Encode(user)
}
func (h *handler) createTemplate(w http.ResponseWriter, r *http.Request, userAuth *nbcontext.UserAuth) {
var templateReq api.Template
if err := json.NewDecoder(r.Body).Decode(&templateReq); err != nil {
http.Error(w, "Bad Request", http.StatusBadRequest)
return
}
templateObj := &templates.Template{}
templateObj.FromAPIRequest(templateReq)
err := templateObj.Validate()
if err != nil {
http.Error(w, "Bad Request: "+err.Error(), http.StatusBadRequest)
return
}
templateResp, err := h.manager.CreateTemplate(r.Context(), nil, &templateReq)
if err != nil {
http.Error(w, "Internal Server Error", http.StatusInternalServerError)
return
}
w.WriteHeader(http.StatusCreated)
_ = json.NewEncoder(w).Encode(templateResp)
}
func (h *handler) updateTemplate(w http.ResponseWriter, r *http.Request, userAuth *nbcontext.UserAuth) {
vars := mux.Vars(r)
templateId := vars["templateId"]
var templateReq api.Template
if err := json.NewDecoder(r.Body).Decode(&templateReq); err != nil {
http.Error(w, "Bad Request", http.StatusBadRequest)
return
}
templateObj := &templates.Template{}
templateObj.FromAPIRequest(templateReq)
templateObj.Id = templateId
err := templateObj.Validate()
if err != nil {
http.Error(w, "Bad Request: "+err.Error(), http.StatusBadRequest)
return
}
templateResp, err := h.manager.UpdateTemplate(r.Context(), nil, &templateReq)
if err != nil {
http.Error(w, "Internal Server Error", http.StatusInternalServerError)
return
}
w.WriteHeader(http.StatusOK)
_ = json.NewEncoder(w).Encode(templateResp)
}
func (h *handler) deleteTemplate(w http.ResponseWriter, r *http.Request, userAuth *nbcontext.UserAuth) {
vars := mux.Vars(r)
templateId := vars["templateId"]
err := h.manager.DeleteTemplate(r.Context(), nil, templateId)
if err != nil {
http.Error(w, "Internal Server Error", http.StatusInternalServerError)
return
}
w.WriteHeader(http.StatusNoContent)
}