go-ginチュートリアル — Part4

GinのBlog API’s 作成 — DB続き

gavin.zhou
8 min readNov 22, 2018

第3回の続き、DB周りその他のモジュールを作りましょう。サンプルコードはこちらでご参照ください。githubのtagは part04 となります。

Create AddTag

routersフォルダ v1tag.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してみます。code200を返しましたが、このようなエラーが出ました。

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

この部分はgormCallbacksです。

gormCallbacksには下記の方法が含まれます。

  • 新規: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します。削除できるかどうか確認しましょう。

Tag の部分を一段落完了しましたが、次は Article API’s を作りましょう。

参考サイト

※問題があった場合は、githubの issue をお願いします。

--

--

No responses yet