66 lines
1.7 KiB
Go
66 lines
1.7 KiB
Go
package handler
|
|
|
|
import (
|
|
"encoding/json"
|
|
"errors"
|
|
"net/http"
|
|
|
|
"github.com/panelhosting/panel/internal/auth"
|
|
"github.com/panelhosting/panel/internal/setup"
|
|
)
|
|
|
|
type SetupHandler struct {
|
|
svc *setup.Service
|
|
}
|
|
|
|
func NewSetupHandler(svc *setup.Service) *SetupHandler {
|
|
return &SetupHandler{svc: svc}
|
|
}
|
|
|
|
func (h *SetupHandler) Status(w http.ResponseWriter, r *http.Request) {
|
|
required, err := h.svc.Status(r.Context())
|
|
if err != nil {
|
|
writeError(w, http.StatusInternalServerError, "internal error")
|
|
return
|
|
}
|
|
writeJSON(w, http.StatusOK, map[string]bool{"setup_required": required})
|
|
}
|
|
|
|
func (h *SetupHandler) Register(w http.ResponseWriter, r *http.Request) {
|
|
var in setup.RegisterInput
|
|
if err := json.NewDecoder(r.Body).Decode(&in); err != nil {
|
|
writeError(w, http.StatusBadRequest, "invalid json")
|
|
return
|
|
}
|
|
|
|
user, err := h.svc.RegisterFirstAdmin(r.Context(), in)
|
|
if err != nil {
|
|
switch {
|
|
case errors.Is(err, setup.ErrSetupCompleted):
|
|
writeError(w, http.StatusConflict, "setup already completed")
|
|
case errors.Is(err, auth.ErrPasswordTooShort),
|
|
errors.Is(err, auth.ErrInvalidEmail),
|
|
errors.Is(err, auth.ErrInvalidUsername):
|
|
writeError(w, http.StatusBadRequest, err.Error())
|
|
default:
|
|
writeError(w, http.StatusInternalServerError, "registration failed")
|
|
}
|
|
return
|
|
}
|
|
|
|
writeJSON(w, http.StatusCreated, map[string]any{
|
|
"message": "admin created",
|
|
"user": user,
|
|
})
|
|
}
|
|
|
|
func writeJSON(w http.ResponseWriter, status int, v any) {
|
|
w.Header().Set("Content-Type", "application/json")
|
|
w.WriteHeader(status)
|
|
_ = json.NewEncoder(w).Encode(v)
|
|
}
|
|
|
|
func writeError(w http.ResponseWriter, status int, msg string) {
|
|
writeJSON(w, status, map[string]string{"error": msg})
|
|
}
|