first coomit

This commit is contained in:
2020-08-10 12:58:54 +08:00
commit 5c00a2534b
16 changed files with 307 additions and 0 deletions
+8
View File
@@ -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/
+6
View File
@@ -0,0 +1,6 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="JavaScriptSettings">
<option name="languageLevel" value="ES6" />
</component>
</project>
+8
View File
@@ -0,0 +1,8 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="ProjectModuleManager">
<modules>
<module fileurl="file://$PROJECT_DIR$/.idea/nbarest.iml" filepath="$PROJECT_DIR$/.idea/nbarest.iml" />
</modules>
</component>
</project>
+9
View File
@@ -0,0 +1,9 @@
<?xml version="1.0" encoding="UTF-8"?>
<module type="WEB_MODULE" version="4">
<component name="Go" enabled="true" />
<component name="NewModuleRootManager">
<content url="file://$MODULE_DIR$" />
<orderEntry type="inheritedJdk" />
<orderEntry type="sourceFolder" forTests="false" />
</component>
</module>
Generated
+6
View File
@@ -0,0 +1,6 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="VcsDirectoryMappings">
<mapping directory="$PROJECT_DIR$" vcs="Git" />
</component>
</project>
+19
View File
@@ -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"]
+16
View File
@@ -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"
+8
View File
@@ -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
)
+4
View File
@@ -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=
+8
View File
@@ -0,0 +1,8 @@
package persistence
import "gopkg.in/mgo.v2/bson"
type Player struct{
ID bson.ObjectId `bson:"_id"`
Name string
}
+59
View File
@@ -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()
}
+9
View File
@@ -0,0 +1,9 @@
package persistence
type DatabaseHandler interface {
AddPlayer(Player)([]byte,error)
FindPlayer([]byte)(Player,error)
FindPlayerByName(string)(Player,error)
FindAllAvailablePlayers()([]Player,error)
}
BIN
View File
Binary file not shown.
+30
View File
@@ -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")
}
+96
View File
@@ -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"}`)
}
}
+21
View File
@@ -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)
}