setup.go 2.1 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879
  1. package handlers
  2. import (
  3. "encoding/json"
  4. "errors"
  5. "net/http"
  6. "gogs.fxtmmsk.ru/foxtime/photoplaces/backend/internal/services"
  7. "gogs.fxtmmsk.ru/foxtime/photoplaces/backend/internal/validator"
  8. )
  9. type SetupHandler struct {
  10. userRepo UserRepo
  11. authSvc AuthService
  12. }
  13. func NewSetupHandler(userRepo UserRepo, authSvc AuthService) *SetupHandler {
  14. return &SetupHandler{
  15. userRepo: userRepo,
  16. authSvc: authSvc,
  17. }
  18. }
  19. func (h *SetupHandler) Status(w http.ResponseWriter, r *http.Request) {
  20. hasSuperadmin, err := h.userRepo.HasSuperadmin(r.Context())
  21. if err != nil {
  22. writeError(w, http.StatusInternalServerError, "failed to check setup status", err)
  23. return
  24. }
  25. writeJSON(w, http.StatusOK, map[string]bool{"has_superadmin": hasSuperadmin})
  26. }
  27. type setupRequest struct {
  28. Email string `json:"email" validate:"required,email,max=255"`
  29. Password string `json:"password" validate:"required,min=8,max=72"`
  30. Name string `json:"name" validate:"omitempty,max=255"`
  31. }
  32. func (h *SetupHandler) Setup(w http.ResponseWriter, r *http.Request) {
  33. hasSuperadmin, err := h.userRepo.HasSuperadmin(r.Context())
  34. if err != nil {
  35. writeError(w, http.StatusInternalServerError, "failed to check setup status", err)
  36. return
  37. }
  38. if hasSuperadmin {
  39. writeError(w, http.StatusConflict, "superadmin already exists", nil)
  40. return
  41. }
  42. r.Body = http.MaxBytesReader(w, r.Body, maxRequestBodySize)
  43. var req setupRequest
  44. if err := json.NewDecoder(r.Body).Decode(&req); err != nil {
  45. writeError(w, http.StatusBadRequest, "invalid request body", err)
  46. return
  47. }
  48. if err := validator.Validate(req); err != nil {
  49. writeValidationError(w, err)
  50. return
  51. }
  52. result, refreshToken, err := h.authSvc.Register(r.Context(), services.RegisterInput{
  53. Email: req.Email,
  54. Password: req.Password,
  55. Role: "superadmin",
  56. Name: req.Name,
  57. })
  58. if err != nil {
  59. if errors.Is(err, services.ErrEmailExists) {
  60. writeError(w, http.StatusConflict, "email already exists", err)
  61. return
  62. }
  63. writeError(w, http.StatusInternalServerError, "setup failed", err)
  64. return
  65. }
  66. setRefreshTokenCookie(w, refreshToken, r)
  67. writeJSON(w, http.StatusCreated, result)
  68. }