From cd7b959e8f0f8519796dc855488acc0b0b0b7c94 Mon Sep 17 00:00:00 2001 From: tnkyk327 Date: Sun, 27 Oct 2019 19:24:56 +0900 Subject: [PATCH] create MVC arckitekuture --- controller/lottery.go | 206 +++++++++++++++++++++++++++++ database.db | Bin 0 -> 12288 bytes main.go | 223 ++------------------------------ model/db/db.go | 36 ++++++ types.go => model/types.go | 2 +- template.go => view/template.go | 8 +- 6 files changed, 260 insertions(+), 215 deletions(-) create mode 100644 controller/lottery.go create mode 100644 database.db create mode 100644 model/db/db.go rename types.go => model/types.go (98%) rename template.go => view/template.go (86%) diff --git a/controller/lottery.go b/controller/lottery.go new file mode 100644 index 0000000..ccd4c1f --- /dev/null +++ b/controller/lottery.go @@ -0,0 +1,206 @@ +package controller + +import ( + "encoding/json" + "fmt" + "net/http" + "strconv" + + model "github.com/stepupgo/stepupgo2-1/model" + repository "github.com/stepupgo/stepupgo2-1/model/db" + temple "github.com/stepupgo/stepupgo2-1/view" +) + +//宝くじの種類を取得 +func LotteriesTypeGet() http.HandlerFunc { + return func(w http.ResponseWriter, r *http.Request) { + resp, err := http.Get("https://lottery-dot-tenntenn-samples.appspot.com/available_lotteries") + if err != nil { + const status = http.StatusInternalServerError + http.Error(w, http.StatusText(status), status) + return + } + defer resp.Body.Close() + + var lotteries []*model.Lottery + if err := json.NewDecoder(resp.Body).Decode(&lotteries); err != nil { + const status = http.StatusInternalServerError + http.Error(w, http.StatusText(status), status) + return + } + + if err := temple.ListTmpl.Execute(w, lotteries); err != nil { + const status = http.StatusInternalServerError + http.Error(w, http.StatusText(status), status) + return + } + fmt.Println("compleat get lotteries") + } +} + +func PurchasePage() http.HandlerFunc { + return func(w http.ResponseWriter, r *http.Request) { + resp, err := http.Get("https://lottery-dot-tenntenn-samples.appspot.com/lottery?id=" + r.FormValue("id")) + if err != nil { + const status = http.StatusInternalServerError + http.Error(w, http.StatusText(status), status) + return + } + defer resp.Body.Close() + + var l model.Lottery + if err := json.NewDecoder(resp.Body).Decode(&l); err != nil { + const status = http.StatusInternalServerError + http.Error(w, http.StatusText(status), status) + return + } + + data := struct { + model.Lottery + Remain int64 + }{ + Lottery: l, + Remain: l.Num, // TODO: 残りを計算する + } + + if err := temple.PurchasePageTmpl.Execute(w, data); err != nil { + const status = http.StatusInternalServerError + http.Error(w, http.StatusText(status), status) + return + } + } +} + +func Purchase() http.HandlerFunc { + return func(w http.ResponseWriter, r *http.Request) { + id := r.FormValue("id") + num, err := strconv.Atoi(r.FormValue("num")) + if err != nil { + const status = http.StatusInternalServerError + http.Error(w, http.StatusText(status), status) + return + } + // TODO: パラメタのバリデーション + + resp, err := http.Get("https://lottery-dot-tenntenn-samples.appspot.com/lottery?id=" + id) + if err != nil { + const status = http.StatusInternalServerError + http.Error(w, http.StatusText(status), status) + return + } + defer resp.Body.Close() + + var l model.Lottery + if err := json.NewDecoder(resp.Body).Decode(&l); err != nil { + const status = http.StatusInternalServerError + http.Error(w, http.StatusText(status), status) + return + } + + var count int + if err := repository.DB.QueryRow("SELECT COUNT(*) FROM purchased WHERE lottery_id = ?", l.ID).Scan(&count); err != nil { + const status = http.StatusInternalServerError + http.Error(w, http.StatusText(status), status) + return + } + + for i := 1; i <= num; i++ { + const sql = "INSERT INTO purchased(lottery_id, number) values (?,?)" + format := fmt.Sprintf(`%%0%dd`, len(strconv.FormatInt(l.Num-1, 10))) + n := fmt.Sprintf(format, count+i) + if _, err := repository.DB.Exec(sql, id, n); err != nil { + const status = http.StatusInternalServerError + http.Error(w, http.StatusText(status), status) + return + } + } + + http.Redirect(w, r, "/purchase_page?id="+l.ID, http.StatusFound) + } +} + +func LotteryResult() http.HandlerFunc { + return func(w http.ResponseWriter, r *http.Request) { + resp1, err := http.Get("https://lottery-dot-tenntenn-samples.appspot.com/result?id=" + r.FormValue("id")) + if err != nil { + const status = http.StatusInternalServerError + http.Error(w, http.StatusText(status), status) + return + } + defer resp1.Body.Close() + + var result model.Result + if err := json.NewDecoder(resp1.Body).Decode(&result); err != nil { + const status = http.StatusInternalServerError + http.Error(w, http.StatusText(status), status) + return + } + + resp2, err := http.Get("https://lottery-dot-tenntenn-samples.appspot.com/lottery?id=" + r.FormValue("id")) + if err != nil { + const status = http.StatusInternalServerError + http.Error(w, http.StatusText(status), status) + return + } + defer resp2.Body.Close() + + var l model.Lottery + if err := json.NewDecoder(resp2.Body).Decode(&l); err != nil { + const status = http.StatusInternalServerError + http.Error(w, http.StatusText(status), status) + return + } + + type winner struct { + Prize *model.Prize + Numbers []string + } + + data := struct { + model.Lottery + Winners map[string]*winner + }{ + Lottery: l, + Winners: map[string]*winner{}, + } + + rows, err := repository.DB.Query("SELECT number FROM purchased WHERE lottery_id = ?", l.ID) + if err != nil { + const status = http.StatusInternalServerError + http.Error(w, http.StatusText(status), status) + return + } + for rows.Next() { + var number string + if err := rows.Scan(&number); err != nil { + const status = http.StatusInternalServerError + http.Error(w, http.StatusText(status), status) + return + } + + for i := range result.Winners { + for _, n := range result.Winners[i].Numbers { + if number == n { + prizeID := result.Winners[i].PrizeID + if data.Winners[prizeID] == nil { + for _, p := range l.Prizes { + if p.ID == prizeID { + data.Winners[prizeID] = &winner{ + Prize: p, + } + } + } + } + data.Winners[prizeID].Numbers = append(data.Winners[prizeID].Numbers, n) + } + } + } + } + + if err := temple.ResultTmpl.Execute(w, data); err != nil { + const status = http.StatusInternalServerError + http.Error(w, http.StatusText(status), status) + return + } + } +} diff --git a/database.db b/database.db new file mode 100644 index 0000000000000000000000000000000000000000..75c4fecfd09a47ce7db10685d55c2bff86791fe5 GIT binary patch literal 12288 zcmeI#&r8EF6bJC6imru`-FECdZZL$=i$|;EAl6^Cf;*MYMl7_eb}8s_f872jk0z5< z@Up9n?}L}*HKa73p5DWKRA@ynbyH=U0ybcrvoj*b7&m!favQcj+!kiG^{(LT&sB*ZsS37hhh7@r +var ListTmpl = template.Must(template.New("list").Parse(` @@ -20,7 +20,7 @@ var listTmpl = template.Must(template.New("list").Parse(` `)) -var purchasePageTmpl = template.Must(template.New("purchase_page").Parse(` +var PurchasePageTmpl = template.Must(template.New("purchase_page").Parse(` @@ -48,7 +48,7 @@ var purchasePageTmpl = template.Must(template.New("purchase_page").Parse(` `)) -var resultTmpl = template.Must(template.New("result").Parse(` +var ResultTmpl = template.Must(template.New("result").Parse(`