go-ginチュートリアル — Part4
GinのBlog API’s 作成 — DB続き
8 min readNov 22, 2018
第3回の続き、DB周りその他のモジュールを作りましょう。サンプルコードはこちらでご参照ください。githubのtagは part04
となります。
Create AddTag
routers
フォルダ v1
のtag.go
ファイルを修正します。(AddTagを修正)
package v1
import (
"log"
"net/http"
"github.com/gin-gonic/gin"
"github.com/astaxie/beego/validation"
"github.com/Unknwon/com"
"gin-blog/pkg/e"
"gin-blog/models"
"gin-blog/pkg/util"
"gin-blog/pkg/setting"
)
...
func AddTag(c *gin.Context) {
name := c.Query("name")
state := com.StrTo(c.DefaultQuery("state", "0")).MustInt()
createdBy := c.Query("created_by")
valid := validation.Validation{}
valid.Required(name, "name").Message("The name cannot be empty")
valid.MaxSize(name, 100, "name").Message("The name is a maximum of 100 characters")
valid.Required(createdBy, "created_by").Message("The creator cannot be empty")
valid.MaxSize(createdBy, 100, "created_by").Message("The creator is up to 100 characters long")
valid.Range(state, 0, 1, "state").Message("Status only allows 0 or 1")
code := e.INVALID_PARAMS
if ! valid.HasErrors() {
if ! models.ExistTagByName(name) {
code = e.SUCCESS
models.AddTag(name, state, createdBy)
} else {
code = e.ERROR_EXIST_TAG
}
} else {
for _, err := range valid.Errors {
logging.Info(err.Key, err.Message)
}
}
c.JSON(http.StatusOK, gin.H{
"code" : code,
"msg" : e.GetMsg(code),
"data" : make(map[string]string),
})
}
...
insomniaを使って、http://127.0.0.1:8000/api/v1/tags?name=1&state=1&created_by=test
にPOSTしてみます。code
が200
を返しましたが、このようなエラーが出ました。
Create models callbacks
(pq: new row for relation "blog_tag" violates check constraint "blog_tag_created_on_check")(pq: new row for relation "blog_tag" violates check constraint "blog_tag_modified_on_check")
上記エラーを解消するため、 models
フォルダ tag.go
に下記の2つfuncを追加します。
func (tag *Tag) BeforeCreate(scope *gorm.Scope) error {
scope.SetColumn("CreatedOn", time.Now().Unix())
return nil
}
func (tag *Tag) BeforeUpdate(scope *gorm.Scope) error {
scope.SetColumn("ModifiedOn", time.Now().Unix())
return nil
}
サーバを再起動します。もう一度アクセスしてみてください。エラーがでなくなります。
Topic
この部分はgorm
のCallbacks
です。
gorm
の Callbacks
には下記の方法が含まれます。
- 新規:BeforeSave、BeforeCreate、AfterCreate、AfterSave
- 更新:BeforeSave、BeforeUpdate、AfterUpdate、AfterSave
- 削除:BeforeDelete、AfterDelete
- 検索:AfterFind
では、残ってる部分を一気に作ります。
...
func EditTag(c *gin.Context) {
id := com.StrTo(c.Param("id")).MustInt()
name := c.Query("name")
modifiedBy := c.Query("modified_by")
valid := validation.Validation{}
var state int = -1
if arg := c.Query("state"); arg != "" {
state = com.StrTo(arg).MustInt()
valid.Range(state, 0, 1, "state").Message("Status only allows 0 or 1")
}
valid.Required(id, "id").Message("ID cannot be empty")
valid.Required(modifiedBy, "modified_by").Message("The creator cannot be empty")
valid.MaxSize(modifiedBy, 100, "modified_by").Message("The creator is up to 100 characters long")
valid.MaxSize(name, 100, "name").Message("The name is a maximum of 100 characters")
code := e.INVALID_PARAMS
if ! valid.HasErrors() {
code = e.SUCCESS
if models.ExistTagByID(id) {
data := make(map[string]interface{})
data["modified_by"] = modifiedBy
if name != "" {
data["name"] = name
}
if state != -1 {
data["state"] = state
}
models.EditTag(id, data)
} else {
code = e.ERROR_NOT_EXIST_TAG
}
} else {
for _, err := range valid.Errors {
logging.Info(err.Key, err.Message)
}
}
c.JSON(http.StatusOK, gin.H{
"code" : code,
"msg" : e.GetMsg(code),
"data" : make(map[string]string),
})
}
func DeleteTag(c *gin.Context) {
id := com.StrTo(c.Param("id")).MustInt()
valid := validation.Validation{}
valid.Min(id, 1, "id").Message("ID must be greater than 0")
code := e.INVALID_PARAMS
if ! valid.HasErrors() {
code = e.SUCCESS
if models.ExistTagByID(id) {
models.DeleteTag(id)
} else {
code = e.ERROR_NOT_EXIST_TAG
}
} else {
for _, err := range valid.Errors {
logging.Info(err.Key, err.Message)
}
}
c.JSON(http.StatusOK, gin.H{
"code" : code,
"msg" : e.GetMsg(code),
"data" : make(map[string]string),
})
}
insomniaを使い、下記のURLを確認します。
http://127.0.0.1:8000/api/v1/tags/1?name=edit1&state-0&modified_by=edit1
にPUTしてみましょう、レスポンスが200
を返します。http://127.0.0.1:8000/api/v1/tags/1
にDELETEします。削除できるかどうか確認しましょう。