Maison >développement back-end >Golang >Ignorer le champ CreateAt lors de la création/mise à jour mais renvoyer la réponse JSON

Ignorer le champ CreateAt lors de la création/mise à jour mais renvoyer la réponse JSON

王林
王林avant
2024-02-09 17:12:101146parcourir

Ignorer le champ CreateAt lors de la création/mise à jour mais renvoyer la réponse JSON

Lors d'opérations de création ou de mise à jour de données, nous souhaitons parfois ignorer la valeur du champ crééAt et simplement conserver sa valeur par défaut. Le but est d'utiliser le même horodatage à chaque fois que les données sont créées ou mises à jour, sans provoquer d'incohérence des données en raison de la définition manuelle de l'horodatage. Dans le même temps, nous souhaitons également conserver la valeur par défaut du champ createAt lors du renvoi de la réponse JSON. En PHP, nous pouvons réaliser cette fonction grâce à quelques opérations simples, améliorant ainsi la lisibilité et la maintenabilité du code. Cet article explique comment ignorer le champ CreateAt lors de la création/mise à jour en PHP, mais conserver sa valeur par défaut lors du renvoi d'une réponse JSON.

Contenu des questions

J'ai une structure dans Go

type ExternalSystem struct {
    ID        uint            `gorm:"primary_key"`
    Name      string          `json:"name" binding:"required"`
    CreatedAt *time.Time      `json:"createdAt" binding:"-"`
    DeletedAt *gorm.DeletedAt `json:"deletedAt" binding:"-"`
}

Et avec contrôleur (itinéraire)

func CreateExternalSystemAction(c *gin.Context) {
    appG := app.Gin{C: c}

    externalSystem := models.ExternalSystem{}

    if err := c.ShouldBindJSON(&externalSystem); err != nil {
        appG.C.AbortWithStatusJSON(http.StatusBadRequest, gin.H{
            "error": err.Error(),
        })
        return
    }

    db := models2.DB
    db.Create(&externalSystem)

    appG.C.JSON(http.StatusCreated, externalSystem)
}

func UpdateExternalSystemAction(c *gin.Context) {
    appG := app.Gin{C: c}
    db := models2.DB

    var externalSystem models.ExternalSystem

    db.Where("id = @id", sql.Named("id", c.Param("id"))).First(&externalSystem)

    if err := c.ShouldBindJSON(&externalSystem); err != nil {
        appG.C.AbortWithStatusJSON(http.StatusBadRequest, gin.H{
            "error": err.Error(),
        })
        return
    }

    db.Updates(&externalSystem)

    appG.C.JSON(http.StatusOK, externalSystem)
}

Comment ignorer la complétion des champs CreatedAt/UpdatedAt lors de la création ou de la mise à jour d'un objet ? De cette façon, le serveur (et non le client) se charge de remplir les champs, alors que va m'envoyer le JSON ? Cependant, j'ai besoin que la valeur de ce champ soit envoyée au client dans la réponse.

Actuellement, lorsque j'envoie du JSON :

{
    "name": "System 3",
    "createdAt": "2023-12-25T22:04:10.012034+04:00"
}

Gin lie cette valeur à la structure. Pour résumer à nouveau, je souhaite ignorer ces champs d'écriture (lorsqu'ils sont reçus du client) mais les donner dans la réponse de lecture.

J'ai essayé :

Binding : "-" mais cela ne fonctionne pas (validation des enchères)

json : "-" mais cela cache le champ de réponse

Solution de contournement

J'ai longtemps réfléchi à la solution. Après avoir lu les commentaires sous ma question. J'ai fait un choix qui a parfaitement fonctionné pour moi. Cependant, l'approche n'est toujours pas similaire à ce que j'ai utilisé dans d'autres langages (PHP Symfony, Python Django)

Modèle

type System struct {
    ID        uint
    Name      string
    CreatedAt time.Time
    UpdatedAt time.Time
}

type InputSystem struct {
    Name string
}

func (inputSystem *InputSystem) Convert() System {
    system := System{
        Name: inputSystem.Name,
    }
    return system
}

func (system *System) Save() (*System, error) {
    err := DB.Create(system).Error

    if err != nil {
        return &System{}, err
    }

    return system, err
}

func (system *System) BeforeSave(*gorm.DB) error {
    system.Name = html.EscapeString(strings.TrimSpace(system.Name))
    return nil
}

func (system *System) BeforeUpdate(*gorm.DB) error {
    system.Name = html.EscapeString(strings.TrimSpace(system.Name))
    return nil
}

Contrôleur (itinéraire)

func CreateSystemAction(c *gin.Context) {

    var inputSystem models.InputSystem

    if err := c.BindJSON(&inputSystem); err != nil {
        c.AbortWithStatusJSON(http.StatusBadRequest, gin.H{
            "error": err.Error(),
        })
        return
    }

    dbSystem := inputSystem.Convert()

    _, err := dbSystem.Save()
    if err != nil {
        return
    }

    c.JSON(http.StatusCreated, dbSystem)
}

S'il y a de meilleures suggestions, je serai heureux de recevoir des commentaires

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Cet article est reproduit dans:. en cas de violation, veuillez contacter admin@php.cn Supprimer