Добавил валидацию данных в контроллер производителей.
Добавил Удаление, Просмотр всех производителей.
This commit is contained in:
parent
4560a4626a
commit
c6d9d1519e
|
@ -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)
|
||||||
|
}
|
||||||
|
|
|
@ -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 {
|
||||||
|
|
|
@ -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
|
||||||
}
|
}
|
|
@ -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 {
|
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
|
||||||
}
|
}
|
|
@ -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)
|
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)
|
||||||
}
|
}
|
||||||
}()
|
}()
|
||||||
|
|
|
@ -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)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -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 {
|
||||||
|
|
|
@ -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