-
Notifications
You must be signed in to change notification settings - Fork 0
/
main.go
91 lines (79 loc) · 2.34 KB
/
main.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
package main
import (
"context"
"flag"
"fmt"
"log"
"net/http"
"os"
"os/signal"
"runtime"
"syscall"
"time"
"github.com/julienschmidt/httprouter"
"github.com/yingxv/flashcard-go/src/controller"
"github.com/yingxv/flashcard-go/src/db"
"github.com/yingxv/flashcard-go/src/middleware"
"github.com/yingxv/flashcard-go/src/util"
)
func init() {
runtime.GOMAXPROCS(runtime.NumCPU())
}
func main() {
var (
addr = flag.String("l", ":8041", "绑定Host地址")
dbinit = flag.Bool("i", false, "init database flag")
mongo = flag.String("m", "mongodb://localhost:27017", "mongod addr flag")
mdb = flag.String("db", "to-do-list", "database name")
ucHost = flag.String("uc", "http://user-center-go-dev", "user center host")
)
flag.Parse()
log.SetOutput(os.Stdout)
log.SetFlags(log.Ldate | log.Ltime | log.Lshortfile)
auth := middleware.NewAuth(ucHost)
mongoClient := db.NewMongoClient()
err := mongoClient.Open(*mongo, *mdb, *dbinit)
validate := util.NewValidator()
trans := util.NewValidatorTranslator(validate)
controller := controller.NewController(validate, trans, auth, mongoClient)
if err != nil {
panic(err)
}
router := httprouter.New()
//task ctrl
router.POST("/record/create", controller.RecordCreate)
router.DELETE("/record/remove/:id", controller.RecordRemove)
router.PATCH("/record/update", controller.RecordUpdate)
router.GET("/record/list", controller.RecordList)
router.PATCH("/record/review", controller.RecordReview)
router.GET("/record/review-all", controller.RecordReviewAll)
router.PATCH("/record/random-review", controller.RecordRandomReview)
router.PATCH("/record/set-review-result", controller.RecordSetReviewResult)
srv := &http.Server{Handler: auth.IsLogin(middleware.CORS(router)), ErrorLog: nil}
srv.Addr = *addr
go func() {
if err := srv.ListenAndServe(); err != nil {
log.Fatal(err)
}
}()
log.Println("server on http port", srv.Addr)
signalChan := make(chan os.Signal, 1)
cleanupDone := make(chan bool)
cleanup := make(chan bool)
signal.Notify(signalChan, syscall.SIGINT, syscall.SIGTERM)
go func() {
for range signalChan {
ctx, cancel := context.WithTimeout(context.Background(), 60*time.Second)
defer cancel()
go func() {
_ = srv.Shutdown(ctx)
cleanup <- true
}()
<-cleanup
mongoClient.Close()
fmt.Println("safe exit")
cleanupDone <- true
}
}()
<-cleanupDone
}