@ -0,0 +1,10 @@ |
|||
# goRecommender |
|||
|
|||
Recommendation system API, based on Machine Learning, written in Go lang |
|||
|
|||
Data stored in MongoDB |
|||
|
|||
Applies Machine Learning to perform recommendations: |
|||
|
|||
- Random Forests |
|||
- K Nearest Neighbours |
@ -0,0 +1,57 @@ |
|||
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
|
|||
} |
@ -0,0 +1,9 @@ |
|||
package main |
|||
|
|||
import "fmt" |
|||
|
|||
func check(err error) { |
|||
if err != nil { |
|||
fmt.Println(err) |
|||
} |
|||
} |
@ -0,0 +1,26 @@ |
|||
package main |
|||
|
|||
import ( |
|||
"fmt" |
|||
"log" |
|||
"net/http" |
|||
|
|||
"github.com/fatih/color" |
|||
) |
|||
|
|||
func main() { |
|||
fmt.Println("starting") |
|||
|
|||
//mongodb start
|
|||
readMongodbConfig("./mongodbConfig.json") |
|||
c := connectMongodb() |
|||
fmt.Println(c) |
|||
color.Green("mongodb connected") |
|||
|
|||
//http server start
|
|||
readServerConfig("./serverConfig.json") |
|||
color.Green("server running") |
|||
router := NewRouter() |
|||
log.Fatal(http.ListenAndServe(":"+serverConfig.ServerPort, router)) |
|||
|
|||
} |
@ -0,0 +1,72 @@ |
|||
package main |
|||
|
|||
import ( |
|||
"encoding/json" |
|||
"fmt" |
|||
"io/ioutil" |
|||
"log" |
|||
|
|||
mgo "gopkg.in/mgo.v2" |
|||
) |
|||
|
|||
//MongoConfig stores the configuration of mongodb to connect
|
|||
type MongoConfig struct { |
|||
Ip string `json:"ip"` |
|||
Database string `json:"database"` |
|||
Collection string `json:"collection"` |
|||
} |
|||
|
|||
var mongoConfig MongoConfig |
|||
|
|||
func readMongodbConfig(path string) { |
|||
file, e := ioutil.ReadFile(path) |
|||
if e != nil { |
|||
fmt.Println("error:", e) |
|||
} |
|||
content := string(file) |
|||
json.Unmarshal([]byte(content), &mongoConfig) |
|||
} |
|||
|
|||
func getSession() (*mgo.Session, error) { |
|||
session, err := mgo.Dial("mongodb://" + mongoConfig.Ip) |
|||
if err != nil { |
|||
panic(err) |
|||
} |
|||
//defer session.Close()
|
|||
|
|||
// Optional. Switch the session to a monotonic behavior.
|
|||
session.SetMode(mgo.Monotonic, true) |
|||
|
|||
// Optional. Switch the session to a monotonic behavior.
|
|||
session.SetMode(mgo.Monotonic, true) |
|||
|
|||
return session, err |
|||
} |
|||
func getCollection(session *mgo.Session) *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) |
|||
return c |
|||
} |
|||
|
|||
func saveDataEntryToMongo(c *mgo.Collection, user UserModel) { |
|||
/* |
|||
how to call this function |
|||
var auxArr []string |
|||
user := UserModel{"123", auxArr} |
|||
saveDataEntryToMongo(c, user) |
|||
*/ |
|||
|
|||
err := c.Insert(user) |
|||
if err != nil { |
|||
log.Fatal(err) |
|||
} |
|||
|
|||
} |
@ -0,0 +1,5 @@ |
|||
{ |
|||
"ip": "127.0.0.1", |
|||
"database": "goRecommend", |
|||
"collection": "userHistory" |
|||
} |
@ -0,0 +1,6 @@ |
|||
package main |
|||
|
|||
type UserModel struct { |
|||
Userid string |
|||
History []string |
|||
} |
@ -0,0 +1,67 @@ |
|||
package main |
|||
|
|||
import ( |
|||
"encoding/json" |
|||
"fmt" |
|||
"io/ioutil" |
|||
"log" |
|||
"net/http" |
|||
"time" |
|||
|
|||
"github.com/gorilla/mux" |
|||
) |
|||
|
|||
type Route struct { |
|||
Name string |
|||
Method string |
|||
Pattern string |
|||
HandlerFunc http.HandlerFunc |
|||
} |
|||
|
|||
//server config
|
|||
type ServerConfig struct { |
|||
ServerIP string `json:"serverIP"` |
|||
ServerPort string `json:"serverPort"` |
|||
} |
|||
|
|||
var serverConfig ServerConfig |
|||
|
|||
func readServerConfig(path string) { |
|||
file, err := ioutil.ReadFile(path) |
|||
if err != nil { |
|||
fmt.Println("error: ", err) |
|||
} |
|||
content := string(file) |
|||
json.Unmarshal([]byte(content), &serverConfig) |
|||
} |
|||
|
|||
func Logger(inner http.Handler, name string) http.Handler { |
|||
return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { |
|||
start := time.Now() |
|||
|
|||
inner.ServeHTTP(w, r) |
|||
|
|||
log.Printf( |
|||
"%s\t%s\t%s\t%s", |
|||
r.Method, |
|||
r.RequestURI, |
|||
name, |
|||
time.Since(start), |
|||
) |
|||
}) |
|||
} |
|||
func NewRouter() *mux.Router { |
|||
router := mux.NewRouter().StrictSlash(true) |
|||
for _, route := range routes { |
|||
var handler http.Handler |
|||
handler = route.HandlerFunc |
|||
handler = Logger(handler, route.Name) |
|||
|
|||
router. |
|||
Methods(route.Method). |
|||
Path(route.Pattern). |
|||
Name(route.Name). |
|||
Handler(handler) |
|||
} |
|||
return router |
|||
} |
@ -0,0 +1,4 @@ |
|||
{ |
|||
"serverIP": "127.0.0.1", |
|||
"serverPort": "3056" |
|||
} |
@ -0,0 +1,32 @@ |
|||
package main |
|||
|
|||
import ( |
|||
"fmt" |
|||
"net/http" |
|||
) |
|||
|
|||
type Routes []Route |
|||
|
|||
var routes = Routes{ |
|||
Route{ |
|||
"Index", |
|||
"GET", |
|||
"/", |
|||
Index, |
|||
}, |
|||
Route{ |
|||
"NewImage", |
|||
"POST", |
|||
"/image", |
|||
NewImage, |
|||
}, |
|||
} |
|||
|
|||
//ROUTES
|
|||
|
|||
func Index(w http.ResponseWriter, r *http.Request) { |
|||
fmt.Fprintln(w, "send images to the /image path") |
|||
} |
|||
func NewImage(w http.ResponseWriter, r *http.Request) { |
|||
fmt.Fprintln(w, "response") |
|||
} |