Last active
September 24, 2020 14:30
-
-
Save podhmo/fb337fe8c4cc0873e92022faab410861 to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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} | |
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
// +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) | |
} | |
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
// +build lambda | |
// +build add | |
package main | |
import ( | |
"github.com/aws/aws-lambda-go/lambda" | |
) | |
func main() { | |
ir := GetInteractor() | |
lambda.Start(ir.Add) // buggy | |
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
// +build lambda | |
// +build list | |
package main | |
import ( | |
"github.com/aws/aws-lambda-go/lambda" | |
) | |
func main() { | |
ir := GetInteractor() | |
lambda.Start(ir.List) | |
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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