setup.go 2.2 KB

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