独自APIの追加

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

独自APIの追加方法

独自APIを追加するには、Application handler files (*_handler.go)にAPIを追加実装してください。
外部APIの呼び出しやプラグイン内のメソッドの呼び出しなどを行うことが出来ます。

ここでは実際にapp_handler.goに外部API(Google翻訳API)を実装する例で説明します。

1. handlerにAPIを追記する

APIを追加するにはApplication handler files (*_handler.go)にAPIを実装します。
どのhandlerファイルに実装しても実害はありませんが、tableに紐づくAPIは[table名]_handler.goに追加実装し、それ以外のAPIはapp_handler.goに実装すると良いでしょう。

下記では外部APIを実装する例を紹介するのでapp_handler.goに実装を行います。
また、今回はapp_service.goに外部API呼び出し処理を切り出していますのでそちらも実装します。
なお、app_handler.goの56行目からapp_service.goを呼び出しています。

なお、実装に関する詳細な説明は割愛しますが、GoDocを記載する場合、GoDocからswagger.yamlの生成にswagを使用していますので、記載方法が分からない場合はリンクからご確認ください。
詳しくはローカルでの動かし方 – ローカルでのOpen_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についてをご確認ください。
まずは初期の.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/model/app.go
# /src/app/service/app_service.go

今回はapp_handler.goとapp_service.goを修正したので、このままの状態でTemPlatからビルドを行うとapp_service.goの修正は無効になってしまいます。
そのためには、15行目のコメントアウトを外し、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/model/app.go
/src/app/service/app_service.go

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