Skip to content

Instantly share code, notes, and snippets.

@podhmo
Last active September 24, 2020 14:30
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save podhmo/fb337fe8c4cc0873e92022faab410861 to your computer and use it in GitHub Desktop.
Save podhmo/fb337fe8c4cc0873e92022faab410861 to your computer and use it in GitHub Desktop.
package main
type Todo struct {
Title string `json:"title"`
Done bool `json:"done"`
}
type Interactor struct {
Store []Todo
}
func (ir *Interactor) List() ([]Todo, error) {
return ir.Store, nil
}
func (ir *Interactor) Add(todo Todo) (Todo, error) {
ir.Store = append(ir.Store, todo)
return todo, nil
}
var (
store = []Todo{
{Title: "hello"},
{Title: "bye bye"},
}
)
func GetInteractor() *Interactor{
return &Interactor{Store: store}
}
// +build !lambda
package main
import (
"encoding/json"
"log"
"net/http"
"os"
"github.com/go-chi/chi"
"github.com/go-chi/render"
)
type Controller struct {
Interactor *Interactor
}
func (c *Controller) List(w http.ResponseWriter, r *http.Request) {
items, err := c.Interactor.List()
if err != nil {
render.Status(r, 500)
render.JSON(w, r, map[string]interface{}{"message": err.Error()})
return
}
render.JSON(w, r, map[string]interface{}{"items": items})
}
func (c *Controller) Add(w http.ResponseWriter, r *http.Request) {
var item Todo
decoder := json.NewDecoder(r.Body)
if err := decoder.Decode(&item); err != nil {
render.Status(r, 400)
render.JSON(w, r, map[string]interface{}{"message": err.Error()})
}
added, err := c.Interactor.Add(item)
if err != nil {
render.Status(r, 500)
render.JSON(w, r, map[string]interface{}{"message": err.Error()})
return
}
render.JSON(w, r, added)
}
func main() {
r := chi.NewRouter()
// このままが良いのか、interactorの粒度を細かくしたほうが良いのかはわからない
// github.com/awslabs/aws-lambda-go-api-proxy を使うよりは意義があるのではないか?
// Controllerが肥大化するならたぶん分けたほうが良い。Interactorも同様ならhandler関数を生成する関数を定義する形のほうが綺麗かもしれない
c := &Controller{Interactor: GetInteractor()}
r.Get("/", c.List)
r.Post("/", c.Add)
addr := os.Getenv("ADDR")
if addr == "" {
addr = ":44444"
}
if err := http.ListenAndServe(addr, r); err != nil {
log.Fatalf("!!%+v", err)
}
}
// +build lambda
// +build add
package main
import (
"github.com/aws/aws-lambda-go/lambda"
)
func main() {
ir := GetInteractor()
lambda.Start(ir.Add) // buggy
}
// +build lambda
// +build list
package main
import (
"github.com/aws/aws-lambda-go/lambda"
)
func main() {
ir := GetInteractor()
lambda.Start(ir.List)
}
TARGETS := $(shell cat Makefile | grep '^a\.out' | cut -d : -f 1)
default: $(TARGETS)
a.out:
go build -o $@
a.out.lambda.list:
go build -o $@ --tags lambda,list
a.out.lambda.add:
go build -o $@ --tags lambda,add
clean:
rm -f a.out*
.PHONY: clean
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment