feat: auth, site creation with PHP version selection
This commit is contained in:
@@ -0,0 +1,85 @@
|
||||
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})
|
||||
}
|
||||
Reference in New Issue
Block a user