commit 5c00a2534bd6b72a04d689cbb71e3a839f7e02b3 Author: alienwade007 Date: Mon Aug 10 12:58:54 2020 +0800 first coomit diff --git a/.idea/.gitignore b/.idea/.gitignore new file mode 100644 index 0000000..73f69e0 --- /dev/null +++ b/.idea/.gitignore @@ -0,0 +1,8 @@ +# Default ignored files +/shelf/ +/workspace.xml +# Datasource local storage ignored files +/dataSources/ +/dataSources.local.xml +# Editor-based HTTP Client requests +/httpRequests/ diff --git a/.idea/misc.xml b/.idea/misc.xml new file mode 100644 index 0000000..28a804d --- /dev/null +++ b/.idea/misc.xml @@ -0,0 +1,6 @@ + + + + + \ No newline at end of file diff --git a/.idea/modules.xml b/.idea/modules.xml new file mode 100644 index 0000000..b8a6bb9 --- /dev/null +++ b/.idea/modules.xml @@ -0,0 +1,8 @@ + + + + + + + + \ No newline at end of file diff --git a/.idea/nbarest.iml b/.idea/nbarest.iml new file mode 100644 index 0000000..5e764c4 --- /dev/null +++ b/.idea/nbarest.iml @@ -0,0 +1,9 @@ + + + + + + + + + \ No newline at end of file diff --git a/.idea/vcs.xml b/.idea/vcs.xml new file mode 100644 index 0000000..94a25f7 --- /dev/null +++ b/.idea/vcs.xml @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/Dockerfile.service b/Dockerfile.service new file mode 100644 index 0000000..ffb529e --- /dev/null +++ b/Dockerfile.service @@ -0,0 +1,19 @@ +FROM golang:1.9 + +WORKDIR /go/src + +COPY . . + +WORKDIR ./nbarest + +ENV GOPATH=/go + +RUN go get "github.com/gorilla/mux" +RUN go get "gopkg.in/mgo.v2" +RUN CGO_ENABLED=0 GOOS=linux go build -o /nbaservice ./nbaservice + + + +EXPOSE 8181 + +CMD ["/nbaservice"] \ No newline at end of file diff --git a/docker-compose.yml b/docker-compose.yml new file mode 100644 index 0000000..31b3241 --- /dev/null +++ b/docker-compose.yml @@ -0,0 +1,16 @@ +version: "3" + +services: + test: + build: + context: .. + dockerfile: ./nbarest/Dockerfile.service + ports: + - "8181:8181" + links: + - mongodb + + mongodb: + image: mongo + ports: + - "27017:27017" diff --git a/go.mod b/go.mod new file mode 100644 index 0000000..d62a5f5 --- /dev/null +++ b/go.mod @@ -0,0 +1,8 @@ +module nbarest + +go 1.14 + +require ( + github.com/gorilla/mux v1.7.4 + gopkg.in/mgo.v2 v2.0.0-20190816093944-a6b53ec6cb22 +) diff --git a/go.sum b/go.sum new file mode 100644 index 0000000..9ff9e7e --- /dev/null +++ b/go.sum @@ -0,0 +1,4 @@ +github.com/gorilla/mux v1.7.4 h1:VuZ8uybHlWmqV03+zRzdwKL4tUnIp1MAQtp1mIFE1bc= +github.com/gorilla/mux v1.7.4/go.mod h1:DVbg23sWSpFRCP0SfiEN6jmj59UnW/n46BH5rLB71So= +gopkg.in/mgo.v2 v2.0.0-20190816093944-a6b53ec6cb22 h1:VpOs+IwYnYBaFnrNAeB8UUWtL3vEUnzSCL1nVjPhqrw= +gopkg.in/mgo.v2 v2.0.0-20190816093944-a6b53ec6cb22/go.mod h1:yeKp02qBN3iKW1OzL3MGk2IdtZzaj7SFntXj72NppTA= diff --git a/lib/persistence/models.go b/lib/persistence/models.go new file mode 100644 index 0000000..e765556 --- /dev/null +++ b/lib/persistence/models.go @@ -0,0 +1,8 @@ +package persistence + +import "gopkg.in/mgo.v2/bson" + +type Player struct{ + ID bson.ObjectId `bson:"_id"` + Name string +} diff --git a/lib/persistence/mongolayer/mongolayer.go b/lib/persistence/mongolayer/mongolayer.go new file mode 100644 index 0000000..d71968d --- /dev/null +++ b/lib/persistence/mongolayer/mongolayer.go @@ -0,0 +1,59 @@ +package mongolayer + +import ( + "gopkg.in/mgo.v2" + "gopkg.in/mgo.v2/bson" + "nbarest/lib/persistence" +) + +const( + DB="myplayers" + PLAYER="players" +) + +func NewMongoDBLayer(connection string)(persistence.DatabaseHandler,error){ + s,err:=mgo.Dial(connection) + if err!=nil{ + panic(err) + } + return &MongoDBLayer{session: s},err +} + +type MongoDBLayer struct { + session *mgo.Session +} + +func (m *MongoDBLayer) AddPlayer(p persistence.Player)([]byte,error){ + s:=m.getFreshSession() + defer s.Close() + if !p.ID.Valid(){ + p.ID=bson.NewObjectId() + } + return []byte(p.ID),s.DB(DB).C(PLAYER).Insert(p) + +} +func (m *MongoDBLayer) FindPlayer(id []byte)(persistence.Player,error){ + s:=m.getFreshSession() + defer s.Close() + p:= persistence.Player{} + err:=s.DB(DB).C(PLAYER).FindId(bson.ObjectId(id)).One(&p) + return p,err +} +func (m *MongoDBLayer) FindPlayerByName(name string)(persistence.Player,error){ + s:=m.getFreshSession() + defer s.Close() + p:= persistence.Player{} + err:=s.DB(DB).C(PLAYER).Find(bson.M{"name": name}).One(&p) + return p,err +} +func (m*MongoDBLayer) FindAllAvailablePlayers()([]persistence.Player,error){ + s:=m.getFreshSession() + defer s.Close() + ps:=[]persistence.Player{} + err:=s.DB(DB).C(PLAYER).Find(nil).All(&ps) + return ps,err +} + +func (m *MongoDBLayer) getFreshSession() *mgo.Session{ + return m.session.Copy() +} \ No newline at end of file diff --git a/lib/persistence/persistence.go b/lib/persistence/persistence.go new file mode 100644 index 0000000..e226bff --- /dev/null +++ b/lib/persistence/persistence.go @@ -0,0 +1,9 @@ +package persistence + + +type DatabaseHandler interface { + AddPlayer(Player)([]byte,error) + FindPlayer([]byte)(Player,error) + FindPlayerByName(string)(Player,error) + FindAllAvailablePlayers()([]Player,error) +} \ No newline at end of file diff --git a/nbaservice.exe b/nbaservice.exe new file mode 100644 index 0000000..c5cf227 Binary files /dev/null and b/nbaservice.exe differ diff --git a/nbaservice/main.go b/nbaservice/main.go new file mode 100644 index 0000000..7698874 --- /dev/null +++ b/nbaservice/main.go @@ -0,0 +1,30 @@ +package main + +import ( + "fmt" + "log" + "nbarest/lib/persistence/mongolayer" + "nbarest/nbaservice/rest" + "net/http" +) + +func main(){ + dbhandler,err:= mongolayer.NewMongoDBLayer("mongodb://mongodb:27017") + if err!=nil{ + log.Fatal(err) + } + log.Fatal(rest.ServeAPI(":8181",dbhandler)) + + //r:=mux.NewRouter() + //http.Handle("/",r) + // + //r.HandleFunc("/test",TestHandler) + // + //http.ListenAndServe(":8181",r) + +} + + +func TestHandler(w http.ResponseWriter,r *http.Request){ + fmt.Fprintln(w,"connect") +} diff --git a/nbaservice/rest/handler.go b/nbaservice/rest/handler.go new file mode 100644 index 0000000..8afebc8 --- /dev/null +++ b/nbaservice/rest/handler.go @@ -0,0 +1,96 @@ +package rest + +import ( + "encoding/hex" + "encoding/json" + "fmt" + "github.com/gorilla/mux" + "nbarest/lib/persistence" + "net/http" + "strings" +) + +func NewPlayerServiceHandler(handler persistence.DatabaseHandler) *playerServiceHandler{ + return &playerServiceHandler{ + dbhandler: handler, + } +} + +type playerServiceHandler struct{ + dbhandler persistence.DatabaseHandler +} + +func (ph *playerServiceHandler) FindPlayerHandler(w http.ResponseWriter,r *http.Request){ + fmt.Println("FindPlayerHandler") + vars:=mux.Vars(r) + criteria,ok:=vars["SearchCriteria"] + if !ok{ + w.WriteHeader(400) + fmt.Fprintln(w,"error") + return + } + + searchkey,ok:=vars["search"] + if !ok{ + w.WriteHeader(400) + fmt.Fprintln(w,"error") + return + } + + var player persistence.Player + var err error + + switch strings.ToLower(criteria) { + case "name": + player,err=ph.dbhandler.FindPlayerByName(searchkey) + case "id": + id,err:=hex.DecodeString(searchkey) + if err==nil{ + player,err=ph.dbhandler.FindPlayer(id) + } + } + if err!=nil{ + fmt.Fprintln(w,`{"error"} "%s"`,err) + return + } + fmt.Println("find"+searchkey) + w.Header().Set("Content-Type","application/json;charset=utf8") + json.NewEncoder(w).Encode(&player) +} + +func (ph *playerServiceHandler) NewPlayerHandler(w http.ResponseWriter, r *http.Request){ + fmt.Println("NewPlayerHandler") + player:= persistence.Player{} + err:=json.NewDecoder(r.Body).Decode(&player) + if err!=nil{ + w.WriteHeader(500) + fmt.Fprintln(w,`{"error"}`) + return + } + + id,err:=ph.dbhandler.AddPlayer(player) + if nil!=err{ + w.WriteHeader(500) + fmt.Fprintln(w,`{"error"}`) + return + } + fmt.Fprint(w,`{"id":%d}`,id) +} + +func (ph *playerServiceHandler) FindAllPlayerHandler(w http.ResponseWriter,r *http.Request){ + fmt.Println("FindAllPlayerHandler") + players,err:= ph.dbhandler.FindAllAvailablePlayers() + if err!=nil{ + w.WriteHeader(500) + fmt.Fprintln(w,`{"error"}`) + return + } + + w.Header().Set("Content-Type", "application/json;charset=utf8") + err=json.NewEncoder(w).Encode(&players) + if err!=nil{ + w.WriteHeader(500) + fmt.Fprintln(w,`{"error"}`) + } + +} \ No newline at end of file diff --git a/nbaservice/rest/rest.go b/nbaservice/rest/rest.go new file mode 100644 index 0000000..be03ae5 --- /dev/null +++ b/nbaservice/rest/rest.go @@ -0,0 +1,21 @@ +package rest + +import ( + "fmt" + "github.com/gorilla/mux" + "nbarest/lib/persistence" + "net/http" +) + +func ServeAPI(endpoint string,dbhandler persistence.DatabaseHandler) error{ + handler:=NewPlayerServiceHandler(dbhandler) + r:=mux.NewRouter() + playersrouter:=r.PathPrefix("/players").Subrouter() + + playersrouter.Path("/{SearchCriteria}/{search}").HandlerFunc(handler.FindPlayerHandler).Methods("GET") + playersrouter.Path("/").HandlerFunc(handler.FindAllPlayerHandler).Methods("GET") + playersrouter.Path("/").HandlerFunc(handler.NewPlayerHandler).Methods("POST") + fmt.Println("listen") + return http.ListenAndServe(endpoint,r) +} +