bdx

package module
v0.1.1 Latest Latest
Warning

This package is not in the latest version of its module.

Go to latest
Published: Sep 15, 2020 License: BSD-3-Clause Imports: 19 Imported by: 0

README

BDX Web Framework

bdxは Go(Golang)で記述されたWebフレームワークです。

Contents

Installation

  • Library

    go get github.com/belldata-dx/bdx

  • Command

    go get github.com/belldata-dx/bdx/...

Quick Start(Application)

cat _examples/main.go
package main

import (
  "github.com/belldata-dx/bdx"
  "github.com/belldata-dx/bdx/interfaces"
)

func main() {
  r := bdx.New()
  r.GET("/health", func(c interfaces.Context) {
    c.JSON(200, bdx.B{"data": "test"})
  })
  r.Run()
}
$ go run _examples/main.go
yyyy/mm/dd hh:mi:ss [INFO] [engine] utils.go:resolveAddress:51: 環境変数`HTTP_PORT`が未定義です。 デフォルトでは`:8080`を使用します。
$ curl localhost:8080/health
{"data":"test"}

Quick Start(Dependency injection)

  • Infrastructure layer
$ cat _tests/example/infrastructure/example.go
package infrastructure

import (
  "github.com/belldata-dx/bdx/_tests/example/domain/models"
  "github.com/belldata-dx/bdx/_tests/example/domain/repository"
  "github.com/belldata-dx/bdx/infra"
)

type (
  // studentInfra infrastructure層のインターフェイス
  studentInfra struct {
    infra.RepositoryImple
  }
)

var (
  students = []models.StudentModel{}
)

// NewStudentInfra infrastructure層の実装を持つインスタンス
// @repository
func NewStudentInfra(db infra.IDataBase) repository.IStudent {
  return &studentInfra{
    RepositoryImple: infra.RepositoryImple{
      Master: db.Master(),
      Slave:  db.Slave(),
    },
  }
}

// Create infrastructure層の実装
func (u *studentInfra) Create(model models.StudentModel) (resultModel *models.StudentModel, err error) {
  model.ID = len(students) + 1
  students = append(students, model)
  return &model, nil
}

// Find infrastructure層の実装
func (u *studentInfra) Find() (result []*models.StudentModel) {
  for _, u := range students {
    result = append(result, &u)
  }
  return result
}
  • UseCase or Service layer
$ cat _tests/example/usecase/example.go
package usecase

import (
  "github.com/belldata-dx/bdx/_tests/example/domain/models"
  "github.com/belldata-dx/bdx/_tests/example/domain/repository"
)

type (
  // IStudentUseCase UseCase層のインターフェイス
  IStudentUseCase interface {
    Create(model models.StudentModel) (result *models.StudentModel, err error)
    Find() (result []*models.StudentModel)
  }

  // studentUseCaseImpl UseCase層の実装を持つ構造体
  studentUseCaseImpl struct {
    repo repository.IStudent
  }
)

// NewStudentUseCase UseCase層の実装を持つインスタンス
// @service
func NewStudentUseCase(repo repository.IStudent) IStudentUseCase {
  return &studentUseCaseImpl{repo}
}

// Create UseCase層の実装
func (u *studentUseCaseImpl) Create(model models.StudentModel) (resultModel *models.StudentModel, err error) {
  return u.repo.Create(model)
}

// Find UseCase層の実装
func (u *studentUseCaseImpl) Find() (result []*models.StudentModel) {
  return u.repo.Find()
}

  • Handler layer
$ cat _tests/example/handler/example.go
package handler

import (
  "github.com/belldata-dx/bdx/_tests/example/domain/models"
  "github.com/belldata-dx/bdx/_tests/example/usecase"
  "github.com/belldata-dx/bdx/interfaces"
)

type (

  // StudentHandle application層のインターフェイス
  StudentHandle interface {
    Post(c interfaces.Context)
    Get(c interfaces.Context)
  }

  // studentHandler application層の実装を持つ構造体
  studentHandler struct {
    u usecase.IStudentUseCase
  }
)

// NewStudentHandler application層の実装を持つインスタンス
// @handler
func NewStudentHandler(u usecase.IStudentUseCase) StudentHandle {
  return &studentHandler{u}
}

// Post applicatoin層の実装
func (u *studentHandler) Post(c interfaces.Context) {
  s, _ := u.u.Create(models.StudentModel{Name: "test"})
  c.JSON(200, s)
}

// Get application層の実装
func (u *studentHandler) Get(c interfaces.Context) {
  s := u.u.Find()
  c.JSON(200, s)
}
  • Execute DI command
$ cd ./_tests
$ bdx i
yyyy/mm/dd hh:mi:ss Generate di-registry
yyyy/mm/dd hh:mi:ss example/handler/example.go
yyyy/mm/dd hh:mi:ss example/infrastructure/example.go
yyyy/mm/dd hh:mi:ss example/usecase/example.go
  • registry
$ cat _tests/registry/registry.go
// GENERATED BY THE COMMAND ABOVE; DO NOT EDIT
// This file was generated by belldata-dx/bdx at 2020/08/07 10:21:49

package registry

import (
  "github.com/belldata-dx/bdx/di"
  "github.com/belldata-dx/bdx/_tests/example/handler"
  "github.com/belldata-dx/bdx/_tests/example/infrastructure"
  "github.com/belldata-dx/bdx/_tests/example/usecase"
)

const (
  StudentHandle   = "handler.StudentHandle"
  IStudent        = "repository.IStudent"
  IStudentUseCase = "usecase.IStudentUseCase"
)

func init() {
  di.New()
  di.Container.Set(&di.Definition{
    Name:        "handler.StudentHandle",
    Params:      []interface{}{IStudentUseCase},
    Constructor: handler.NewStudentHandler,
  })
  di.Container.Set(&di.Definition{
    Name:        "repository.IStudent",
    Params:      []interface{}{di.DB},
    Constructor: infrastructure.NewStudentInfra,
  })
  di.Container.Set(&di.Definition{
    Name:        "usecase.IStudentUseCase",
    Params:      []interface{}{IStudent},
    Constructor: usecase.NewStudentUseCase,
  })
}
  • main

package main

import (
  "github.com/belldata-dx/bdx"
  "github.com/belldata-dx/bdx/_tests/example/handler"
  "github.com/belldata-dx/bdx/_tests/registry"
  "github.com/belldata-dx/bdx/di"
  _ "github.com/lib/pq"
)

func main() {
  // コンテナから取得(この時に依存関係が全て解決される。)
  sHandler := di.Container.Get(registry.StudentHandle).(handler.StudentHandle)

  // ルーターのインスタンス生成
  router := bdx.Default()
  // ログレベルの設定
  // router.SetLogLevel(log.Debug)

  router.POST("/student", sHandler.Post)
  router.GET("/student", sHandler.Get)

  router.Run()

}

Quick Start(Producer/Consumer)


func producer() {
  mq := mq.NewBdxMQ("AWS")
  param := interfaces.ProducerParam{
    // Queue Name
    QueueInfo:     "test",
    // Message Body
    Message:       "test-data",
    // Queue Transaction ID(Transaction identifier)
    TransactionID: "test-id",
  }
  // Send
  if err := mq.Producer(param); err != nil {
    t.Error(err)
  }
}

func consumer() {
  mq := mq.NewBdxMQ("AWS")
  mq.Consumer("test", func(param interfaces.ConsumerParam) bool {
    message = param.Message
    transactionID = param.TransactionID
    // true => Delete Message, false => None
    return true
  })
}

API Example

GET, POST, PUT, DELETE, OPTIONSを提供しています
func main() {
  router := bdx.New()
  router.GET("/get")
  router.POST("/post")
  router.PUT("/put")
  router.DELETE("/delete")
  router.OPTIONS("/options")
}

詳細なサンプルはここを参照

Documentation

Index

Constants

View Source
const Version = "v0.0.1"

Variables

View Source
var ContextKey = contextKey{}

ContextKey `request.Context()`で取得できるコンテキストキー

View Source
var DefaultLogger logger.ILogger

DefaultLogger デフォルトで使用されるlogger

Functions

func HandleFunc

func HandleFunc(h Handle) interfaces.BdxHandlerFunc

HandleFunc は`Handle`を`BdxHandlerFunc`へ変換

func HandleFuncrouter

func HandleFuncrouter(h httprouter.Handle) interfaces.BdxHandlerFunc

HandleFuncrouter は`httprouter.Handle`を`BdxHandlerFunc`へ変換

func HandlerFunc

HandlerFunc は`http.HandlerFunc`を`BdxHandlerFunc`へ変換

Types

type B

type B map[string]interface{}

B response body

type Engine

type Engine struct {
	RouterGroup
	// contains filtered or unexported fields
}

Engine bdxフレームワークインスタンス

func Default

func Default() (engine *Engine)

Default はデフォルト設定されたルータ

func New

func New() (engine *Engine)

New bdx Instance

func (*Engine) MaxMultipartMemory

func (engine *Engine) MaxMultipartMemory() int64

MaxMultipartMemory Multipartコンテンツタイプで許容される量

func (*Engine) Run

func (engine *Engine) Run(addr ...string) error

Run ListenAndServe

func (*Engine) RunTLS

func (engine *Engine) RunTLS(addr string, certFile string, keyFile string) error

RunTLS ListenAndServeTLS

func (*Engine) ServeHTTP

func (engine *Engine) ServeHTTP(w http.ResponseWriter, r *http.Request)

ServeHTTP .

func (*Engine) SetLogLevel

func (engine *Engine) SetLogLevel(level logger.LogLevel)

SetLogLevel ログ出力レベルを設定

func (*Engine) SetLogger

func (engine *Engine) SetLogger(log logger.ILogger)

SetLogger Logger Change

func (*Engine) Swagger

func (engine *Engine) Swagger(url ...string)

Swagger Swagger2.0出力エンドポイント

func (*Engine) Use

func (engine *Engine) Use(handlers ...interfaces.BdxHandlerFunc) interfaces.Routes

Use ミドルウェア追加

type Handle

type Handle func(http.ResponseWriter, *http.Request, param.IParam)

Handle はハンドラの型

type RouterGroup

type RouterGroup struct {
	Handlers interfaces.HandlersChain
	// contains filtered or unexported fields
}

RouterGroup ルータ

func (*RouterGroup) Any

func (group *RouterGroup) Any(relativePath string, handlers ...interfaces.BdxHandlerFunc) interfaces.Routes

Any は`GET`,`POST`,`PUT`,`DELETE`のショートカットです。

func (*RouterGroup) DELETE

func (group *RouterGroup) DELETE(relativePath string, handlers ...interfaces.BdxHandlerFunc) interfaces.Routes

DELETE は`router.Handler("DELETE", path, handle)`のショートカットです。

func (*RouterGroup) GET

func (group *RouterGroup) GET(relativePath string, handlers ...interfaces.BdxHandlerFunc) interfaces.Routes

GET は`router.Handler("GET", path, handle)`のショートカットです。

func (*RouterGroup) Group

func (group *RouterGroup) Group(relativePath string, handlers ...interfaces.BdxHandlerFunc) interfaces.Router

Group ルータグループ `New()`した際は`/`がbasePath

func (*RouterGroup) Handler

func (group *RouterGroup) Handler(method, relativePath string, handlers ...interfaces.BdxHandlerFunc) interfaces.Routes

Handler 新しいリクエストハンドルとミドルウェアを与えられたパスとメソッドで登録します。 最後のハンドルが実際のハンドルとして登録されます。 それ以外はミドルウェアでなければいけません。

func (*RouterGroup) OPTIONS

func (group *RouterGroup) OPTIONS(relativePath string, handlers ...interfaces.BdxHandlerFunc) interfaces.Routes

OPTIONS は`router.Handler("OPTIONS", path, handle)`のショートカットです。

func (*RouterGroup) POST

func (group *RouterGroup) POST(relativePath string, handlers ...interfaces.BdxHandlerFunc) interfaces.Routes

POST は`router.Handler("POST", path, handle)`のショートカットです。

func (*RouterGroup) PUT

func (group *RouterGroup) PUT(relativePath string, handlers ...interfaces.BdxHandlerFunc) interfaces.Routes

PUT は`router.Handler("PUT", path, handle)`のショートカットです。

func (*RouterGroup) Use

func (group *RouterGroup) Use(middlewares ...interfaces.BdxHandlerFunc) interfaces.Routes

Use ルータの後に実行されるミドルウェアを追加します。 この機能はハンドラ全体に影響します。

Jump to

Keyboard shortcuts

? : This menu
/ : Search site
f or F : Jump to
y or Y : Canonical URL