diff --git a/README.md b/README.md index dae71ad..cb36d01 100644 --- a/README.md +++ b/README.md @@ -8,3 +8,31 @@ Applies Machine Learning to perform recommendations: - Random Forests - K Nearest Neighbours + + + + + + + +## Documentation + + - Add new user + +``` +POST /user +{ + id: "user1", + age: 30 +} +``` + + + - Get recommendations + +``` +GET /r/{userid}/{nrec} + +{userid}: is the userid +{nrec}: number of recommendations requested +``` diff --git a/color.go b/color.go deleted file mode 100644 index e945ac5..0000000 --- a/color.go +++ /dev/null @@ -1,57 +0,0 @@ -package main - -import "fmt" - -//Color struct, defines the color -type Color struct{} - -var c Color - -//DarkGray color -func (c Color) DarkGray(t string) { - fmt.Print("\x1b[30;1m") //dark gray - fmt.Println(t) - fmt.Print("\x1b[0m") //defaultColor -} - -//Red color -func (c Color) Red(t string) { - fmt.Print("\x1b[31;1m") //red - fmt.Println(t) - fmt.Print("\x1b[0m") //defaultColor -} - -//Green color -func (c Color) Green(t string) { - fmt.Print("\x1b[32;1m") //green - fmt.Println(t) - fmt.Print("\x1b[0m") //defaultColor -} - -//Yellow color -func (c Color) Yellow(t string) { - fmt.Print("\x1b[33;1m") //yellow - fmt.Println(t) - fmt.Print("\x1b[0m") //defaultColor -} - -//Blue color -func (c Color) Blue(t string) { - fmt.Print("\x1b[34;1m") //blue - fmt.Println(t) - fmt.Print("\x1b[0m") //defaultColor -} - -//Purple color -func (c Color) Purple(t string) { - fmt.Print("\x1b[35;1m") //purple - fmt.Println(t) - fmt.Print("\x1b[0m") //defaultColor -} - -//Cyan color -func (c Color) Cyan(t string) { - fmt.Print("\x1b[36;1m") //cyan - fmt.Println(t) - fmt.Print("\x1b[0m") //defaultColor -} diff --git a/itemSamples.data b/itemSamples.data new file mode 100644 index 0000000..51c9216 --- /dev/null +++ b/itemSamples.data @@ -0,0 +1,5 @@ +item1 +item2 +item3 +item4 +item5 diff --git a/main.go b/main.go index 06914d1..2c992fc 100644 --- a/main.go +++ b/main.go @@ -5,18 +5,30 @@ import ( "log" "net/http" + mgo "gopkg.in/mgo.v2" + "github.com/fatih/color" ) +var userCollection *mgo.Collection +var itemCollection *mgo.Collection + func main() { fmt.Println("starting") //mongodb start readMongodbConfig("./mongodbConfig.json") - c := connectMongodb() - fmt.Println(c) + session, err := getSession() + check(err) + userCollection = getCollection(session, "users") + itemCollection = getCollection(session, "items") color.Green("mongodb connected") + //read items dataset + itemsDataset := readDataset("./itemSamples.data", "\n", ",") + items := getItemsFromDataset(itemsDataset) + datasetToMongodbIfNotExist(itemCollection, items) + //http server start readServerConfig("./serverConfig.json") color.Green("server running") diff --git a/mongodb.go b/mongodb.go index 6abefe3..26b3384 100644 --- a/mongodb.go +++ b/mongodb.go @@ -7,13 +7,13 @@ import ( "log" mgo "gopkg.in/mgo.v2" + "gopkg.in/mgo.v2/bson" ) //MongoConfig stores the configuration of mongodb to connect type MongoConfig struct { - Ip string `json:"ip"` - Database string `json:"database"` - Collection string `json:"collection"` + Ip string `json:"ip"` + Database string `json:"database"` } var mongoConfig MongoConfig @@ -42,17 +42,9 @@ func getSession() (*mgo.Session, error) { return session, err } -func getCollection(session *mgo.Session) *mgo.Collection { +func getCollection(session *mgo.Session, collection string) *mgo.Collection { - c := session.DB(mongoConfig.Database).C(mongoConfig.Collection) - return c -} -func connectMongodb() *mgo.Collection { - session, err := getSession() - if err != nil { - log.Fatal(err) - } - c := getCollection(session) + c := session.DB(mongoConfig.Database).C(collection) return c } @@ -70,3 +62,39 @@ func saveDataEntryToMongo(c *mgo.Collection, user UserModel) { } } + +func saveItem(c *mgo.Collection, item ItemModel) { + //first, check if the item already exists + result := ItemModel{} + err := c.Find(bson.M{"id": item.ID}).One(&result) + if err != nil { + //item not found, so let's add a new entry + err = c.Insert(item) + check(err) + } else { + /*result.Data = append(result.Data, dataEntry) + err = c.Update(bson.M{"id": dataEntry.ContratoCOD}, result) + if err != nil { + log.Fatal(err) + }*/ + } + +} + +func saveUser(c *mgo.Collection, user UserModel) { + //first, check if the item already exists + result := UserModel{} + err := c.Find(bson.M{"id": user.ID}).One(&result) + if err != nil { + //item not found, so let's add a new entry + err = c.Insert(user) + check(err) + } else { + /*result.Data = append(result.Data, dataEntry) + err = c.Update(bson.M{"id": dataEntry.ContratoCOD}, result) + if err != nil { + log.Fatal(err) + }*/ + } + +} diff --git a/mongodbConfig.json b/mongodbConfig.json index e769fcd..b50c1db 100644 --- a/mongodbConfig.json +++ b/mongodbConfig.json @@ -1,5 +1,4 @@ { "ip": "127.0.0.1", - "database": "goRecommend", - "collection": "userHistory" + "database": "goRecommend" } diff --git a/mongodbModels.go b/mongodbModels.go index d5b95bd..3b4a974 100644 --- a/mongodbModels.go +++ b/mongodbModels.go @@ -1,6 +1,15 @@ package main type UserModel struct { - Userid string - History []string + ID string `json:"id"` + Age int `json:",string"` + Actions []string } +type ItemModel struct { + ID string + TRecommended int + TActed int +} + +var scores []float64 +var ranking []ItemModel diff --git a/readItemSamples.go b/readItemSamples.go new file mode 100644 index 0000000..2ddcef7 --- /dev/null +++ b/readItemSamples.go @@ -0,0 +1,43 @@ +package main + +import ( + "fmt" + "io/ioutil" + "strings" + + mgo "gopkg.in/mgo.v2" +) + +func readDataset(path string, lineSeparation string, valueSeparation string) [][]string { + var dataset [][]string + b, err := ioutil.ReadFile(path) + check(err) + str := string(b) + str = strings.Replace(str, "\r", "", -1) + lines := strings.Split(str, lineSeparation) + for _, v1 := range lines { + params := strings.Split(v1, valueSeparation) + var datasetLine []string + for _, v2 := range params { + datasetLine = append(datasetLine, v2) + } + dataset = append(dataset, datasetLine) + } + return dataset +} +func getItemsFromDataset(dataset [][]string) []ItemModel { + var items []ItemModel + for _, v := range dataset { + var newItem ItemModel + newItem.ID = v[0] + items = append(items, newItem) + } + return items +} + +func datasetToMongodbIfNotExist(c *mgo.Collection, items []ItemModel) { + fmt.Println(items) + for _, item := range items { + saveItem(c, item) + } +} diff --git a/serverRoutes.go b/serverRoutes.go index 5c57a68..a95c4ac 100644 --- a/serverRoutes.go +++ b/serverRoutes.go @@ -1,8 +1,11 @@ package main import ( + "encoding/json" "fmt" "net/http" + + "github.com/gorilla/mux" ) type Routes []Route @@ -15,18 +18,45 @@ var routes = Routes{ Index, }, Route{ - "NewImage", + "Recommendations", + "GET", + "/r/{userid}/{nrec}", + Recommendations, + }, + Route{ + "NewUser", "POST", - "/image", - NewImage, + "/user", + NewUser, }, } //ROUTES func Index(w http.ResponseWriter, r *http.Request) { - fmt.Fprintln(w, "send images to the /image path") + fmt.Fprintln(w, "ask for recommendations in /r") +} + +func NewUser(w http.ResponseWriter, r *http.Request) { + decoder := json.NewDecoder(r.Body) + var newUser UserModel + err := decoder.Decode(&newUser) + check(err) + defer r.Body.Close() + + saveUser(userCollection, newUser) + + fmt.Println(newUser) + fmt.Fprintln(w, "new user added: ", newUser.ID) } -func NewImage(w http.ResponseWriter, r *http.Request) { - fmt.Fprintln(w, "response") +func Recommendations(w http.ResponseWriter, r *http.Request) { + vars := mux.Vars(r) + userid := vars["userid"] + nrec := vars["nrec"] + fmt.Println(userid) + fmt.Println(nrec) + + //now, get recommendations + + fmt.Fprintln(w, "recommendations") } diff --git a/tests.sh b/tests.sh new file mode 100644 index 0000000..3b72959 --- /dev/null +++ b/tests.sh @@ -0,0 +1,15 @@ +echo "------------------" +echo "[Adding new users]" + +echo http http://127.0.0.1:3056/user id="user1" age=23 +http http://127.0.0.1:3056/user id="user1" age=23 + +echo http http://127.0.0.1:3056/user id="user2" age=32 +http http://127.0.0.1:3056/user id="user2" age=32 + +echo "------------------" + +echo "[Getting recommendations for user]" + +echo http http://127.0.0.1:3056/user1/3 +http http://127.0.0.1:3056/r/user1/3