Files
panelhosting/internal/handler/site.go
T

86 lines
2.2 KiB
Go

package handler
import (
"encoding/json"
"errors"
"net/http"
"github.com/panelhosting/panel/internal/middleware"
"github.com/panelhosting/panel/internal/sitesvc"
)
type SiteHandler struct {
svc *sitesvc.Service
}
func NewSiteHandler(svc *sitesvc.Service) *SiteHandler {
return &SiteHandler{svc: svc}
}
type createSiteRequest struct {
Name string `json:"name"`
Domain string `json:"domain"`
PHPVersion string `json:"php_version"`
ServerID int64 `json:"server_id,omitempty"`
}
func (h *SiteHandler) List(w http.ResponseWriter, r *http.Request) {
user, ok := middleware.UserFromContext(r.Context())
if !ok {
writeError(w, http.StatusUnauthorized, "unauthorized")
return
}
sites, err := h.svc.List(r.Context(), user, middleware.IsAdmin(user))
if err != nil {
writeError(w, http.StatusInternalServerError, "failed to list sites")
return
}
writeJSON(w, http.StatusOK, map[string]any{"sites": sites})
}
func (h *SiteHandler) Create(w http.ResponseWriter, r *http.Request) {
user, ok := middleware.UserFromContext(r.Context())
if !ok {
writeError(w, http.StatusUnauthorized, "unauthorized")
return
}
var req createSiteRequest
if err := json.NewDecoder(r.Body).Decode(&req); err != nil {
writeError(w, http.StatusBadRequest, "invalid json")
return
}
site, err := h.svc.Create(r.Context(), sitesvc.CreateInput{
Name: req.Name,
Domain: req.Domain,
PHPVersion: req.PHPVersion,
ServerID: req.ServerID,
OwnerID: user.ID,
IsAdmin: middleware.IsAdmin(user),
})
if err != nil {
switch {
case errors.Is(err, sitesvc.ErrInvalidSiteName),
errors.Is(err, sitesvc.ErrInvalidDomain),
errors.Is(err, sitesvc.ErrInvalidPHPVersion):
writeError(w, http.StatusBadRequest, err.Error())
default:
writeError(w, http.StatusInternalServerError, "failed to create site")
}
return
}
writeJSON(w, http.StatusCreated, map[string]any{"site": site})
}
func (h *SiteHandler) PHPVersions(w http.ResponseWriter, r *http.Request) {
versions, err := h.svc.ListPHPVersions(r.Context())
if err != nil {
writeError(w, http.StatusInternalServerError, "failed to list php versions")
return
}
writeJSON(w, http.StatusOK, map[string]any{"versions": versions})
}