Добавил валидацию данных в контроллер производителей.

Добавил Удаление, Просмотр всех производителей.
This commit is contained in:
Владимир Шалимов 2024-06-05 20:53:24 +05:00
parent 4560a4626a
commit c6d9d1519e
12 changed files with 181 additions and 15 deletions

View File

@ -2,20 +2,36 @@ package controllers
import ( import (
"github.com/gin-gonic/gin" "github.com/gin-gonic/gin"
"github.com/go-playground/validator/v10"
"golang-test/database" "golang-test/database"
"golang-test/libs"
"golang-test/message" "golang-test/message"
"golang-test/validators"
"log" "log"
) )
func CreateManufacturer(c *gin.Context, manufacturer database.Manufacturer) { func CreateManufacturer(c *gin.Context, manufacturer database.Manufacturer) {
db := database.Connector() db := database.Connector()
validate := validators.Validate
response := message.Response{Status: 200} response := message.Response{Status: 200}
err := db.Create(&manufacturer).Error err := validate.Struct(manufacturer)
if err != nil {
response.Error = libs.GetValidationErrors(err.(validator.ValidationErrors))
response.Status = 400
message.SendResponse(c, response)
return
}
err = db.Create(&manufacturer).Error
if err != nil { if err != nil {
log.Println(err.Error()) log.Println(err.Error())
response.Error = append(response.Error, err.Error()) response.Error = gin.H{
"error": err.Error(),
}
response.Status = 500 response.Status = 500
message.SendResponse(c, response) message.SendResponse(c, response)
return return
@ -27,3 +43,48 @@ func CreateManufacturer(c *gin.Context, manufacturer database.Manufacturer) {
message.SendResponse(c, response) message.SendResponse(c, response)
} }
func DeleteManufacturer(c *gin.Context) {
db := database.Connector()
response := message.Response{Status: 200}
id := c.Param("id")
var manufacturer database.Manufacturer
if db.First(&manufacturer, id).Error != nil {
response.Error = gin.H{
"error": "Manufacturer with id '" + id + "' not found",
}
response.Status = 404
message.SendResponse(c, response)
return
}
db.Delete(&manufacturer, id)
response.Message = gin.H{
"message": "Manufacturer deleted",
}
message.SendResponse(c, response)
}
func GetManufacturers(c *gin.Context) {
type ManufacturerResponse struct {
ID uint
Name string
}
db := database.Connector()
response := message.Response{Status: 200}
var manufacturers []ManufacturerResponse
db.Model(&database.Manufacturer{}).Select("ID", "Name").Scan(&manufacturers)
response.Message = gin.H{
"manufacturers": manufacturers,
}
message.SendResponse(c, response)
}

View File

@ -4,7 +4,7 @@ import "gorm.io/gorm"
type Manufacturer struct { type Manufacturer struct {
gorm.Model gorm.Model
Name string `gorm:"unique"` Name string `gorm:"unique" validate:"required,custom_unique=Name"`
} }
type Product struct { type Product struct {

View File

@ -1,11 +1,11 @@
meta { meta {
name: ManufacturerCreate name: Create Manufacturer
type: http type: http
seq: 3 seq: 1
} }
post { post {
url: http://localhost:8080/manufacturer url: {{host}}/manufacturer
body: json body: json
auth: basic auth: basic
} }

View File

@ -0,0 +1,11 @@
meta {
name: Delete Manufacturer
type: http
seq: 2
}
delete {
url: {{host}}/manufacturer/{{manufacturerID}}
body: none
auth: none
}

View File

@ -0,0 +1,11 @@
meta {
name: Get All Manufacturers
type: http
seq: 3
}
get {
url: {{host}}/manufacturer
body: none
auth: none
}

View File

@ -1,11 +1,11 @@
meta { meta {
name: ProductCreate name: ProductCreate
type: http type: http
seq: 2 seq: 1
} }
post { post {
url: http://localhost:8080/product url: {{host}}/product
body: json body: json
auth: none auth: none
} }

View File

@ -0,0 +1,4 @@
vars {
host: http://localhost:8080
manufacturerID: 3
}

29
libs/libs.go Normal file
View File

@ -0,0 +1,29 @@
package libs
import (
"github.com/gin-gonic/gin"
"github.com/go-playground/validator/v10"
"strings"
)
func GetValidationErrors(errs validator.ValidationErrors) gin.H {
errors := make(map[string]any)
for _, err := range errs {
errors[err.Field()] = err.Error()
}
return gin.H{
"error": errors,
}
}
func ToSnakeCase(str string) string {
var result []rune
for i, r := range str {
if i > 0 && 'A' <= r && r <= 'Z' {
result = append(result, '_')
}
result = append(result, r)
}
return strings.ToLower(string(result))
}

17
main.go
View File

@ -36,7 +36,18 @@ func main() {
controllers.CreateManufacturer(c, manufacturer) controllers.CreateManufacturer(c, manufacturer)
}) })
r.Run() r.DELETE("/manufacturer/:id", func(c *gin.Context) {
controllers.DeleteManufacturer(c)
})
r.GET("/manufacturer", func(c *gin.Context) {
controllers.GetManufacturers(c)
})
err := r.Run()
if err != nil {
return
}
defer func() { defer func() {
db := database.Connector() db := database.Connector()
@ -44,7 +55,9 @@ func main() {
if err != nil { if err != nil {
log.Fatal(err) log.Fatal(err)
} }
if err := sqlDB.Close(); err != nil {
err = sqlDB.Close()
if err != nil {
log.Println(err) log.Println(err)
} }
}() }()

View File

@ -7,13 +7,13 @@ import (
type Response struct { type Response struct {
Status int Status int
Message gin.H Message gin.H
Error []string Error gin.H
} }
func SendResponse(c *gin.Context, response Response) { func SendResponse(c *gin.Context, response Response) {
if len(response.Message) > 0 { if len(response.Message) > 0 {
c.JSON(response.Status, response.Message) c.JSON(response.Status, response.Message)
} else if len(response.Error) > 0 { } else if len(response.Error) > 0 {
c.JSON(response.Status, gin.H{"errors": response.Error}) c.JSON(response.Status, response.Error)
} }
} }

View File

@ -4,6 +4,7 @@ import (
"golang-test/database" "golang-test/database"
"gorm.io/driver/postgres" "gorm.io/driver/postgres"
"gorm.io/gorm" "gorm.io/gorm"
"log"
) )
func main() { func main() {
@ -13,8 +14,11 @@ func main() {
panic("failed to connect database") panic("failed to connect database")
} }
// Migrate the schema // Migrate the schema
db.AutoMigrate(&database.Manufacturer{}, &database.Product{}, &database.User{}) err = db.AutoMigrate(&database.Manufacturer{}, &database.Product{}, &database.User{})
if err != nil {
return
}
log.Println("Database migration complete")
} }
//func Test(db *gorm.DB) string { //func Test(db *gorm.DB) string {

33
validators/validators.go Normal file
View File

@ -0,0 +1,33 @@
package validators
import (
"fmt"
"github.com/go-playground/validator/v10"
"golang-test/database"
"golang-test/libs"
"log"
)
var Validate *validator.Validate
func init() {
Validate = validator.New()
err := Validate.RegisterValidation("custom_unique", UniqueValidator)
if err != nil {
return
}
}
func UniqueValidator(fl validator.FieldLevel) bool {
db := database.Connector()
field := fl.Field().String()
structType := libs.ToSnakeCase(fl.Top().Type().Name()) + "s"
param := fl.Param()
log.Println(field, structType, param)
var count int64
db.Table(structType).Where(fmt.Sprintf("%s = ?", param), field).Count(&count)
return count == 0
}