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

Добавил Удаление, Просмотр всех производителей.
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 (
"github.com/gin-gonic/gin"
"github.com/go-playground/validator/v10"
"golang-test/database"
"golang-test/libs"
"golang-test/message"
"golang-test/validators"
"log"
)
func CreateManufacturer(c *gin.Context, manufacturer database.Manufacturer) {
db := database.Connector()
validate := validators.Validate
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 {
log.Println(err.Error())
response.Error = append(response.Error, err.Error())
response.Error = gin.H{
"error": err.Error(),
}
response.Status = 500
message.SendResponse(c, response)
return
@ -27,3 +43,48 @@ func CreateManufacturer(c *gin.Context, manufacturer database.Manufacturer) {
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 {
gorm.Model
Name string `gorm:"unique"`
Name string `gorm:"unique" validate:"required,custom_unique=Name"`
}
type Product struct {

View File

@ -1,11 +1,11 @@
meta {
name: ManufacturerCreate
name: Create Manufacturer
type: http
seq: 3
seq: 1
}
post {
url: http://localhost:8080/manufacturer
url: {{host}}/manufacturer
body: json
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 {
name: ProductCreate
type: http
seq: 2
seq: 1
}
post {
url: http://localhost:8080/product
url: {{host}}/product
body: json
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)
})
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() {
db := database.Connector()
@ -44,7 +55,9 @@ func main() {
if err != nil {
log.Fatal(err)
}
if err := sqlDB.Close(); err != nil {
err = sqlDB.Close()
if err != nil {
log.Println(err)
}
}()

View File

@ -7,13 +7,13 @@ import (
type Response struct {
Status int
Message gin.H
Error []string
Error gin.H
}
func SendResponse(c *gin.Context, response Response) {
if len(response.Message) > 0 {
c.JSON(response.Status, response.Message)
} 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"
"gorm.io/driver/postgres"
"gorm.io/gorm"
"log"
)
func main() {
@ -13,8 +14,11 @@ func main() {
panic("failed to connect database")
}
// 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 {

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
}