独自APIの追加

独自APIについて

TemPlatで作成したサーバーでは、テーブルに対してそれぞれのAPIが実装されており、プラグインを有効にすることによりプラグイン固有のAPIも追加され、基本的なアクションは追加実装なくAPIを通して行えます。
上記のAPIでは実現できない処理、例えば、外部のAPIを利用するAPIや、プラグイン内の処理を隠蔽したAPI等が必要な場合に独自APIとして追加することが可能です。

独自APIの追加方法

独自APIを追加するには、xxx_handler.goにAPIを追加実装してください。
外部APIの呼び出しやプラグイン内のメソッドの呼び出しなどを行うことが出来ます。
ここでは実際にapp_handler.goに外部API(Google翻訳API)を実装する例で説明します。

1. handlerにAPIを追記する

APIを追加するにはhandlerにAPIを実装します。
どのhandlerファイルに実装しても実害はありませんが、tableに紐づくAPIはxxx_handler.goに追加実装し、それ以外のAPIはapp_handler.goに実装すると良いでしょう。
下記では外部APIを実装する例を紹介するのでapp_handler.goに実装を行います。
また、今回はapp_service.goに外部API呼び出し処理を切り出していますのでそちらも実装します。

例: SERVER_ROOT/src/app/hanlder/app_handler.go

package handler

import (
	"fmt"
	"main/constant"
	"main/model"
	"main/repository"
	"main/service"
	"main/util"
	"net/http"

	"github.com/labstack/echo/v4"
)

type appHandler struct {
	e  *echo.Group
	rm repository.Master
	sm service.Master
}

func NewAppHandler(e *echo.Group, rm repository.Master, sm service.Master) {
	h := &appHandler{e, rm, sm}
	e.POST("/translate", h.translate)
}

type TranslateReq struct {
	SourceLanguageCode string `json:"sourceLanguageCode" example:""`
	TargetLanguageCode string `json:"targetLanguageCode" example:""`
	Target             string `json:"target" example:""`
}

// Translate godoc
// @Summary translate
// @Description translate
// @ID translate
// @Tags app
// @Accept  json
// @Produce  json
// @Param body body TranslateReq true "TranslateReq"
// @Success 200 {string} string
// @Failure 400 {object} model.Response
// @Failure 404 {object} model.Response
// @Failure 500 {object} model.Response
// @Security firebase
// @Router /translate [post]
func (h *appHandler) translate(c echo.Context) error {
	params := &TranslateReq{}
	if err := c.Bind(params); err != nil {
		result := &model.Response{}
		result.Error = constant.InvalidRequestParameters
		util.Logger.Error(result.Error, err)
		return c.JSON(http.StatusBadRequest, result)
	}
	util.Logger.Debug(fmt.Sprintf("receive request:%#v", params))

	result, err := h.sm.App.Translate(c, params.SourceLanguageCode, params.TargetLanguageCode, params.Target)
	if err != nil {
		result := &model.Response{}
		result.Error = constant.APIError
		util.Logger.Error(result.Error, err)
		return c.JSON(http.StatusInternalServerError, result)
	}
	return c.String(http.StatusOK, *result)
}

例: SERVER_ROOT/src/app/service/app_service.go

package service

import (
	"os"

	"github.com/labstack/echo/v4"
	"google.golang.org/api/translate/v3"
)

type AppService struct {
}

func NewAppService() *AppService {
	s := &AppService{}
	return s
}

func (s *AppService) Translate(c echo.Context, sourceLanguageCode string, targetLanguageCode string, target string) (*string, error) {
	ctx := c.Request().Context()
	translateService, err := translate.NewService(ctx)
	if err != nil {
		return nil, err
	}
	res, err := translateService.Projects.TranslateText("projects/"+os.Getenv("PROJECT_ID"),
		&translate.TranslateTextRequest{
			Contents:           []string{target},
			MimeType:           "text/plain",
			SourceLanguageCode: sourceLanguageCode,
			TargetLanguageCode: targetLanguageCode,
		}).Do()
	if err != nil {
		return nil, err
	}
	return &res.Translations[0].TranslatedText, nil
}

2. 必要に応じて.templat_ignoreを修正する

.templat_ignoreはTemPlatが生成するサーバーのソースから上書きを禁止するファイルを指定するファイルです。
基本的な記法は.gitignoreと同様に記載できます。
まずは初期の.templat_ignoreを確認します。

# Environment files
*.env

# Application handler files
/src/app/handler/*_handler.go

# Application condition files
/src/app/model/*_condition.go

# Auth config file
/src/app/auth/config.go

# User file
# /src/app/service/app_service.go

今回はapp_handler.goとapp_service.goを修正したので、このままの状態でTemPlatからビルドを行うとapp_service.goの修正は無効になってしまいます。
そのためには、L14のコメントアウトを外し、app_service.goもTemPlatが上書きしないようにしてください。

# Environment files
*.env

# Application handler files
/src/app/handler/*_handler.go

# Application condition files
/src/app/model/*_condition.go

# Auth config file
/src/app/auth/config.go

# User file
/src/app/service/app_service.go

こちらで独自APIの追加は完了です。
なお、独自APIの追加に限らず、サーバーのソースを変更した場合は、.templat_ignoreの指定を確認し、TemPlatによって上書きされないか必ずご確認ください。