diff --git a/main_dc/yalarba/api_yal/go.mod b/main_dc/yalarba/api_yal/go.mod index 2d18927..a44437a 100644 --- a/main_dc/yalarba/api_yal/go.mod +++ b/main_dc/yalarba/api_yal/go.mod @@ -1,26 +1,32 @@ module api_yal -go 1.22.5 +go 1.24.0 require gorm.io/gorm v1.31.1 require ( + github.com/gabriel-vasile/mimetype v1.4.12 // indirect + github.com/go-playground/locales v0.14.1 // indirect + github.com/go-playground/universal-translator v0.18.1 // indirect github.com/jackc/pgpassfile v1.0.0 // indirect github.com/jackc/pgservicefile v0.0.0-20240606120523-5a60cdf6a761 // indirect github.com/jackc/pgx/v5 v5.6.0 // indirect github.com/jackc/puddle/v2 v2.2.2 // indirect + github.com/leodido/go-urn v1.4.0 // indirect go.uber.org/multierr v1.10.0 // indirect - golang.org/x/crypto v0.31.0 // indirect - golang.org/x/sync v0.10.0 // indirect + golang.org/x/crypto v0.46.0 // indirect + golang.org/x/sync v0.19.0 // indirect + golang.org/x/sys v0.39.0 // indirect ) require ( github.com/go-chi/chi v1.5.5 github.com/go-chi/chi/v5 v5.2.5 + github.com/go-playground/validator/v10 v10.30.1 github.com/jinzhu/inflection v1.0.0 // indirect github.com/jinzhu/now v1.1.5 // indirect github.com/joho/godotenv v1.5.1 go.uber.org/zap v1.27.1 - golang.org/x/text v0.21.0 // indirect + golang.org/x/text v0.32.0 // indirect gorm.io/driver/postgres v1.6.0 ) diff --git a/main_dc/yalarba/api_yal/go.sum b/main_dc/yalarba/api_yal/go.sum index 87dcc03..2d0c35d 100644 --- a/main_dc/yalarba/api_yal/go.sum +++ b/main_dc/yalarba/api_yal/go.sum @@ -1,8 +1,16 @@ github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/gabriel-vasile/mimetype v1.4.12 h1:e9hWvmLYvtp846tLHam2o++qitpguFiYCKbn0w9jyqw= +github.com/gabriel-vasile/mimetype v1.4.12/go.mod h1:d+9Oxyo1wTzWdyVUPMmXFvp4F9tea18J8ufA774AB3s= github.com/go-chi/chi v1.5.5 h1:vOB/HbEMt9QqBqErz07QehcOKHaWFtuj87tTDVz2qXE= github.com/go-chi/chi v1.5.5/go.mod h1:C9JqLr3tIYjDOZpzn+BCuxY8z8vmca43EeMgyZt7irw= github.com/go-chi/chi/v5 v5.2.5 h1:Eg4myHZBjyvJmAFjFvWgrqDTXFyOzjj7YIm3L3mu6Ug= github.com/go-chi/chi/v5 v5.2.5/go.mod h1:X7Gx4mteadT3eDOMTsXzmI4/rwUpOwBHLpAfupzFJP0= +github.com/go-playground/locales v0.14.1 h1:EWaQ/wswjilfKLTECiXz7Rh+3BjFhfDFKv/oXslEjJA= +github.com/go-playground/locales v0.14.1/go.mod h1:hxrqLVvrK65+Rwrd5Fc6F2O76J/NuW9t0sjnWqG1slY= +github.com/go-playground/universal-translator v0.18.1 h1:Bcnm0ZwsGyWbCzImXv+pAJnYK9S473LQFuzCbDbfSFY= +github.com/go-playground/universal-translator v0.18.1/go.mod h1:xekY+UJKNuX9WP91TpwSH2VMlDf28Uj24BCp08ZFTUY= +github.com/go-playground/validator/v10 v10.30.1 h1:f3zDSN/zOma+w6+1Wswgd9fLkdwy06ntQJp0BBvFG0w= +github.com/go-playground/validator/v10 v10.30.1/go.mod h1:oSuBIQzuJxL//3MelwSLD5hc2Tu889bF0Idm9Dg26cM= github.com/jackc/pgpassfile v1.0.0 h1:/6Hmqy13Ss2zCq62VdNG8tM1wchn8zjSGOBJ6icpsIM= github.com/jackc/pgpassfile v1.0.0/go.mod h1:CEx0iS5ambNFdcRtxPj5JhEz+xB6uRky5eyVu/W2HEg= github.com/jackc/pgservicefile v0.0.0-20240606120523-5a60cdf6a761 h1:iCEnooe7UlwOQYpKFhBabPMi4aNAfoODPEFNiAnClxo= @@ -17,6 +25,8 @@ github.com/jinzhu/now v1.1.5 h1:/o9tlHleP7gOFmsnYNz3RGnqzefHA47wQpKrrdTIwXQ= github.com/jinzhu/now v1.1.5/go.mod h1:d3SSVoowX0Lcu0IBviAWJpolVfI5UJVZZ7cO71lE/z8= github.com/joho/godotenv v1.5.1 h1:7eLL/+HRGLY0ldzfGMeQkb7vMd0as4CfYvUVzLqw0N0= github.com/joho/godotenv v1.5.1/go.mod h1:f4LDr5Voq0i2e/R5DDNOoa2zzDfwtkZa6DnEwAbqwq4= +github.com/leodido/go-urn v1.4.0 h1:WT9HwE9SGECu3lg4d/dIA+jxlljEa1/ffXKmRjqdmIQ= +github.com/leodido/go-urn v1.4.0/go.mod h1:bvxc+MVxLKB4z00jd1z+Dvzr47oO32F/QSNjSBOlFxI= github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= @@ -27,12 +37,19 @@ go.uber.org/zap v1.27.1 h1:08RqriUEv8+ArZRYSTXy1LeBScaMpVSTBhCeaZYfMYc= go.uber.org/zap v1.27.1/go.mod h1:GB2qFLM7cTU87MWRP2mPIjqfIDnGu+VIO4V/SdhGo2E= golang.org/x/crypto v0.31.0 h1:ihbySMvVjLAeSH1IbfcRTkD/iNscyz8rGzjF/E5hV6U= golang.org/x/crypto v0.31.0/go.mod h1:kDsLvtWBEx7MV9tJOj9bnXsPbxwJQ6csT/x4KIN4Ssk= +golang.org/x/crypto v0.46.0 h1:cKRW/pmt1pKAfetfu+RCEvjvZkA9RimPbh7bhFjGVBU= +golang.org/x/crypto v0.46.0/go.mod h1:Evb/oLKmMraqjZ2iQTwDwvCtJkczlDuTmdJXoZVzqU0= golang.org/x/sync v0.10.0 h1:3NQrjDixjgGwUOCaF8w2+VYHv0Ve/vGYSbdkTa98gmQ= golang.org/x/sync v0.10.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk= +golang.org/x/sync v0.19.0/go.mod h1:9KTHXmSnoGruLpwFjVSX0lNNA75CykiMECbovNTZqGI= +golang.org/x/sys v0.39.0 h1:CvCKL8MeisomCi6qNZ+wbb0DN9E5AATixKsvNtMoMFk= +golang.org/x/sys v0.39.0/go.mod h1:OgkHotnGiDImocRcuBABYBEXf8A9a87e/uXjp9XT3ks= golang.org/x/text v0.20.0 h1:gK/Kv2otX8gz+wn7Rmb3vT96ZwuoxnQlY+HlJVj7Qug= golang.org/x/text v0.20.0/go.mod h1:D4IsuqiFMhST5bX19pQ9ikHC2GsaKyk/oF+pn3ducp4= golang.org/x/text v0.21.0 h1:zyQAAkrwaneQ066sspRyJaG9VNi/YJ1NfzcGB3hZ/qo= golang.org/x/text v0.21.0/go.mod h1:4IBbMaMmOPCJ8SecivzSH54+73PCFmPWxNTLm+vZkEQ= +golang.org/x/text v0.32.0 h1:ZD01bjUt1FQ9WJ0ClOL5vxgxOI/sVCNgX1YtKwcY0mU= +golang.org/x/text v0.32.0/go.mod h1:o/rUWzghvpD5TXrTIBuJU77MTaN0ljMWE47kxGJQ7jY= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= gorm.io/driver/postgres v1.6.0 h1:2dxzU8xJ+ivvqTRph34QX+WrRaJlmfyPqXmoGVjMBa4= diff --git a/main_dc/yalarba/api_yal/internal/dto/account_dto.go b/main_dc/yalarba/api_yal/internal/dto/account_dto.go new file mode 100644 index 0000000..3a1c461 --- /dev/null +++ b/main_dc/yalarba/api_yal/internal/dto/account_dto.go @@ -0,0 +1,11 @@ +package dto + +import () + +// RegisterRequest - запрос на регистрацию +type RegisterRequest struct { + Email string `json:"email" validate:"required,email"` + Password string `json:"password" validate:"required,min=6"` + FirstName string `json:"first_name" validate:"required"` + LastName string `json:"last_name" validate:"required"` +} diff --git a/main_dc/yalarba/api_yal/internal/handlers/account.go b/main_dc/yalarba/api_yal/internal/handlers/account.go new file mode 100644 index 0000000..cc89f29 --- /dev/null +++ b/main_dc/yalarba/api_yal/internal/handlers/account.go @@ -0,0 +1,13 @@ +package handlers + +import "net/http" + +type AccountHandler struct{} + +func NewAccountHandler() *AccountHandler { + return &AccountHandler{} +} + +func (h *AccountHandler) HandleRegister(w http.ResponseWriter, r *http.Request){ + return +} diff --git a/main_dc/yalarba/api_yal/internal/handlers/auth.go b/main_dc/yalarba/api_yal/internal/handlers/auth.go index b7154c7..07968ee 100644 --- a/main_dc/yalarba/api_yal/internal/handlers/auth.go +++ b/main_dc/yalarba/api_yal/internal/handlers/auth.go @@ -1,35 +1,59 @@ package handlers import ( + "encoding/json" + "errors" "net/http" + + "api_yal/internal/dto" + "api_yal/internal/service" + + "github.com/go-playground/validator/v10" ) // AuthHandler обработчик для аутентификации -type AuthHandler struct{} - -// NewAuthHandler создает новый экземпляр AuthHandler -func NewAuthHandler() *AuthHandler { - return &AuthHandler{} +type AuthHandler struct { + accountService service.AccountService + validator *validator.Validate } -// HandleAuth обрабатывает GET запросы на /auth -func (h *AuthHandler) HandleAuth(w http.ResponseWriter, r *http.Request) { - switch r.Method { - case http.MethodGet: - // Обработка GET-запроса - w.WriteHeader(http.StatusOK) - w.Write([]byte("OK")) - case http.MethodPost: - // Обработка POST-запроса - http.Error(w, "Not implemented", http.StatusNotImplemented) - default: - http.Error(w, "Method not allowed", http.StatusMethodNotAllowed) - return +// NewAuthHandler создает новый экземпляр AuthHandler +func NewAuthHandler(accountService service.AccountService) *AuthHandler { + return &AuthHandler{ + accountService: accountService, + validator: validator.New(), } } -// RegisterAuthRoutes регистрирует маршруты для аутентификации -func RegisterAuthRoutes(mux *http.ServeMux) { - authHandler := NewAuthHandler() - mux.HandleFunc("/auth", authHandler.HandleAuth) +// Register регистрация аккаунта пользователя +func (h *AuthHandler) Register(w http.ResponseWriter, r *http.Request) { + + var req dto.RegisterRequest + if err := json.NewDecoder(r.Body).Decode(&req); err != nil { + http.Error(w, "Invalid request body", http.StatusBadRequest) + return + } + + if err := h.validator.Struct(req); err != nil { + var invalidValidationError *validator.InvalidValidationError + if errors.As(err, &invalidValidationError) { + http.Error(w, "Invalid request", http.StatusBadRequest) + return + } + + var errs []string + for _, err := range err.(validator.ValidationErrors) { + errs = append(errs, fmt.Sprintf("field %s is invalid: %s", err.Field(), err.Tag())) + } + + w.WriteHeader(http.StatusBadRequest) + json.NewEncoder(w).Encode(map[string]interface{}{ + "error": "Validation failed", + "fields": errs, + }) + return + } + + + } \ No newline at end of file diff --git a/main_dc/yalarba/api_yal/internal/router/router.go b/main_dc/yalarba/api_yal/internal/router/router.go index ce7e365..fd7f66f 100644 --- a/main_dc/yalarba/api_yal/internal/router/router.go +++ b/main_dc/yalarba/api_yal/internal/router/router.go @@ -26,7 +26,7 @@ func SetupRouter(db *gorm.DB, config *config.Config) http.Handler { }) r.Route("/auth", func(r chi.Router) { - r.Post("/register", h.AuthHandler().HandleAuth) + r.Post("/register", h.AuthHandler().Register) }) zapLogger.Info("End setup routers") diff --git a/main_dc/yalarba/api_yal/internal/service/account_service.go b/main_dc/yalarba/api_yal/internal/service/account_service.go new file mode 100644 index 0000000..0ca5d1d --- /dev/null +++ b/main_dc/yalarba/api_yal/internal/service/account_service.go @@ -0,0 +1,7 @@ +package service + +import "api_yal/internal/models" + +type AccountService interface { + CreateAccount(accountService *models.Account) error +} \ No newline at end of file