diff --git a/kadai4/yasu/controllers/rottely_controller.go b/kadai4/yasu/controllers/rottely_controller.go new file mode 100644 index 0000000..6076717 --- /dev/null +++ b/kadai4/yasu/controllers/rottely_controller.go @@ -0,0 +1,23 @@ +package controllers + +import ( + "dojo4/kadai4/yasu/controllers/serializer" + "dojo4/kadai4/yasu/services" + "encoding/json" + "net/http" +) + +func DevineFortune(w http.ResponseWriter, r *http.Request) { + w.Header().Set("Content-Type", "application/json") + fortune, err := services.Rottely() + if err != nil { + response := serializer.Error{Err: err} + w.WriteHeader(http.StatusInternalServerError) + json.NewEncoder(w).Encode(response) + return + } + + w.WriteHeader(http.StatusOK) + response := serializer.RottelyResult{Fortune: fortune} + json.NewEncoder(w).Encode(response) +} diff --git a/kadai4/yasu/controllers/rottely_controller_test.go b/kadai4/yasu/controllers/rottely_controller_test.go new file mode 100644 index 0000000..dd8af39 --- /dev/null +++ b/kadai4/yasu/controllers/rottely_controller_test.go @@ -0,0 +1,29 @@ +package controllers + +import ( + "io/ioutil" + "net/http" + "net/http/httptest" + "testing" +) + +func DevineFortuneTest(t *testing.T) { + w := httptest.NewRecorder() + r := httptest.NewRequest("GET", "/rottely", nil) + DevineFortune(w, r) + res := w.Result() + defer res.Body.Close() + + if res.StatusCode != http.StatusOK { + t.Fatal("unexpected status code") + } + + bytes, err := ioutil.ReadAll(res.Body) + if err != nil { + t.Error(err) + t.Fatal("unexpected error") + } + if fortune := string(bytes); fortune == "" { + t.Fatalf("unexpected response: %s", fortune) + } +} diff --git a/kadai4/yasu/controllers/serializer/error.go b/kadai4/yasu/controllers/serializer/error.go new file mode 100644 index 0000000..091b73e --- /dev/null +++ b/kadai4/yasu/controllers/serializer/error.go @@ -0,0 +1,5 @@ +package serializer + +type Error struct { + Err error +} diff --git a/kadai4/yasu/controllers/serializer/rottely_serializer.go b/kadai4/yasu/controllers/serializer/rottely_serializer.go new file mode 100644 index 0000000..5d91330 --- /dev/null +++ b/kadai4/yasu/controllers/serializer/rottely_serializer.go @@ -0,0 +1,5 @@ +package serializer + +type RottelyResult struct { + Fortune string `json:"fortune"` +} diff --git a/kadai4/yasu/main.go b/kadai4/yasu/main.go new file mode 100644 index 0000000..4084cdf --- /dev/null +++ b/kadai4/yasu/main.go @@ -0,0 +1,13 @@ +package main + +import ( + "dojo4/kadai4/yasu/controllers" + "net/http" +) + +func main() { + + http.HandleFunc("/rottely", controllers.DevineFortune) + + http.ListenAndServe(":8080", nil) +} diff --git a/kadai4/yasu/services/rottely_service.go b/kadai4/yasu/services/rottely_service.go new file mode 100644 index 0000000..907cdb1 --- /dev/null +++ b/kadai4/yasu/services/rottely_service.go @@ -0,0 +1,62 @@ +package services + +import ( + "errors" + "math/rand" + "time" +) + +func Rottely() (string, error) { + var randomInt int + var fortune string + var err error + location, _ := time.LoadLocation("Asia/Tokyo") + now := time.Now().In(location) + newYearsDay := time.Date(2018, 1, 1, 0, 0, 0, 0, location) + endDay := time.Date(2018, 1, 4, 0, 0, 0, 0, location) + if !now.Before(newYearsDay) && !now.After(endDay) { + fortune = "大吉" + } else { + rand.Seed(time.Now().UnixNano()) + randomInt = rand.Intn(17) + switch randomInt { + case 0: + fortune = "大大吉" + case 1: + fortune = "大吉" + case 2: + fortune = "向大吉" + case 3: + fortune = "末大吉" + case 4: + fortune = "吉凶末分末大吉" + case 5: + fortune = "吉" + case 6: + fortune = "中吉" + case 7: + fortune = "小吉" + case 8: + fortune = "後吉" + case 9: + fortune = "末吉" + case 10: + fortune = "吉凶不分末吉" + case 11: + fortune = "末凶相交末吉" + case 12: + fortune = "吉凶相半" + case 13: + fortune = "吉凶相央" + case 14: + fortune = "小吉後吉" + case 15: + fortune = "凶後吉" + case 16: + fortune = "凶後大吉" + default: + err = errors.New("Rottely error: Invalid integer") + } + } + return fortune, err +}