Добавил валидацию данных в контроллер производителей.
Добавил Удаление, Просмотр всех производителей.
This commit is contained in:
parent
4560a4626a
commit
c6d9d1519e
|
@ -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)
|
||||
}
|
||||
|
|
|
@ -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 {
|
||||
|
|
|
@ -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
|
||||
}
|
|
@ -0,0 +1,11 @@
|
|||
meta {
|
||||
name: Delete Manufacturer
|
||||
type: http
|
||||
seq: 2
|
||||
}
|
||||
|
||||
delete {
|
||||
url: {{host}}/manufacturer/{{manufacturerID}}
|
||||
body: none
|
||||
auth: none
|
||||
}
|
|
@ -0,0 +1,11 @@
|
|||
meta {
|
||||
name: Get All Manufacturers
|
||||
type: http
|
||||
seq: 3
|
||||
}
|
||||
|
||||
get {
|
||||
url: {{host}}/manufacturer
|
||||
body: none
|
||||
auth: none
|
||||
}
|
|
@ -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
|
||||
}
|
|
@ -0,0 +1,4 @@
|
|||
vars {
|
||||
host: http://localhost:8080
|
||||
manufacturerID: 3
|
||||
}
|
|
@ -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
17
main.go
|
@ -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)
|
||||
}
|
||||
}()
|
||||
|
|
|
@ -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)
|
||||
}
|
||||
}
|
||||
|
|
|
@ -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 {
|
||||
|
|
|
@ -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
|
||||
}
|
Loading…
Reference in New Issue