Go言語 のお作法(?)について
最近Go言語でWebアプリ作ってます.
書き方というかデザインパターン/お作法的なことで悩むことが多かったのでぼやいていこうと思います.
Repository, こういう書き方であってる?
type DbImpl struct{
db *gorm.DB
}
type DB interface {
IAccount
}
type IAccount interface {
CreateAccountByTempAccount(account model.ITempAccount)error
CreateAccount(account model.IAccount) error
GetAccount(uuid string) model.IAccount
GetAccountByMail(mail string) model.IAccount
GetAllAccounts() []model.IAccount
UpdateAccount(account model.IAccount)error
DeleteAccount(uuid string)
}
func ConnectDB(dsn string) (DB, error) {
db, err := gorm.Open(mysql.Open(dsn), &gorm.Config{})
if err != nil {
return nil, err
}
return &AllDB{db: db}, nil
}
こんな感じでインターフェースにインターフェースを生やす感じで書いて, 呼び出すときは
func Sample1(db DB){
all := db.(IAccount).GetAllAccounts()
for i,v := range all{
fmt.Println(v.GetName())
}
}
このように型変換して呼び出してあげているのですが, こういう感じでお作法的(?)にはあってるんですかね?
ログインフィルターの実装
ginというWebフレームワークを使ってRESTfulAPIを実装しています.
ログインセッションを持つブラウザーのみアクセスを通し, それ以外のユーザーをそれ以降のルーティングに通さないようにする処理を実装するために,
func LoginFilter(r repository.DB,success func(r repository.DB,u model.IAccount,ctx *gin.Context)) gin.HandlerFunc {
return func(ctx *gin.Context) {
authN := ctx.GetHeader("Authorization")
if authN == ""{
authN = ctx.GetHeader("authorization")
}
split := strings.Split(authN," ")
if len(split) != 2{
ctx.AbortWithStatusJSON(http.StatusUnauthorized,gin.H{
"status":"error",
"message":"bad_authorization_header",
})
return
}
account := r.(repository.IAccount).GetAccount(split[1])
if account == nil{
ctx.AbortWithStatusJSON(http.StatusForbidden,gin.H{
"status":"error",
"message":"bad_header",
})
return
}
success(r,account,ctx)
}
}
というフィルターを用意し,ルーティング側で
//GetHandlerはgin.HandlerFuncを返す関数
router.GET("", LoginFilter(r, me.GetHandler))
という風に呼び出してあげるコードを書いています
ginデフォルトで用意されているミドルウェアをガン無視で書いているのですが, Goでこういった処理を書く際のお作法ってあったりするんですかね?
コメント入力