From cd2a636deee99a1c721a6fb63b8dab54cec5e75f Mon Sep 17 00:00:00 2001 From: Xavier Date: Mon, 12 Jul 2021 17:21:43 -0300 Subject: [PATCH 01/10] Add first Model for Problem and Create function - Model can change if more fields needs to be added --- app/app.go | 2 + app/dbOperations/problems.go | 93 ++++++++++++++++++++++++++++++++++++ app/handler/problems.go | 40 ++++++++++++++++ app/model/problem.go | 9 ++++ 4 files changed, 144 insertions(+) create mode 100644 app/dbOperations/problems.go create mode 100644 app/handler/problems.go create mode 100644 app/model/problem.go diff --git a/app/app.go b/app/app.go index a19e1f6..ae9c734 100644 --- a/app/app.go +++ b/app/app.go @@ -55,6 +55,8 @@ func (app *App) setRouters() { app.Get("/api/subjects/{name}", app.handleRequest(handler.GetSubject)) app.Put("/api/subjects/{name}", app.handleRequest(handler.UpdateSubject)) app.Delete("/api/subjects/{name}", app.handleRequest(handler.DeleteSubject)) + // Routing for problems + app.Post("/api/problems", app.handleRequest(handler.CreateProblem)) } // Get wraps the router for GET method diff --git a/app/dbOperations/problems.go b/app/dbOperations/problems.go new file mode 100644 index 0000000..b65c74d --- /dev/null +++ b/app/dbOperations/problems.go @@ -0,0 +1,93 @@ +package dbOperations + +import ( + "errors" + "fmt" + + gremcos "github.com/supplyon/gremcos" + "github.com/supplyon/gremcos/api" + "github.com/supplyon/gremcos/interfaces" + + "github.com/imeplusplus/dont-panic-api/app/model" +) + +func CreateProblem(cosmos gremcos.Cosmos, problem model.Problem) (model.Problem, error) { + _, err := GetProblemByName(cosmos, problem.Name) + + if err == nil { + return model.Problem{}, errors.New("There is already a problem with name " + problem.Name) + } + + g := api.NewGraph("g") + + query := g.AddV("problem").Property("partitionKey", "problem") + query = addProblemVertexProperties(query, problem) + + res, err := cosmos.ExecuteQuery(query) + if err != nil { + fmt.Println("Failed to execute a gremlin command", query.String()) + return problem, err + } + + return getProblemFromResponse(res) +} + +func GetProblemByName(cosmos gremcos.Cosmos, name string) (model.Problem, error) { + var problem model.Problem + g := api.NewGraph("g") + query := g.V().HasLabel("Problem").Has("Name", name) + + res, err := cosmos.ExecuteQuery(query) + if err != nil { + fmt.Println("Failed to execute a gremlin command", query.String()) + return problem, err + } + + return getProblemFromResponse(res) +} + +func addProblemVertexProperties(vertex interfaces.Vertex, problem model.Problem) interfaces.Vertex { + vertex = vertex. + Property("name", problem.Name). + Property("difficulty", problem.Difficulty) + + if len(problem.Subjects) > 0 { + vertex = vertex.Property("subjects", problem.Subjects[0]) + + for _, s := range problem.Subjects[1:] { + vertex = vertex.PropertyList("subjects", s) + } + } + + return vertex +} + +func getProblemFromResponse(res []interfaces.Response) (model.Problem, error) { + var problem model.Problem + response := api.ResponseArray(res) + vertices, _ := response.ToVertices() + + if len(vertices) == 0 { + return problem, errors.New("there is no vertex in the response") + } + + problem = vertexToProblem(vertices[0]) + + return problem, nil +} + +func vertexToProblem(vertex api.Vertex) model.Problem { + var problem model.Problem + + problem.Id = vertex.ID + + properties := vertex.Properties + problem.Name = properties["name"][0].Value.AsString() + problem.Difficulty = int(properties["difficulty"][0].Value.AsInt32()) + problem.PartitionKey = properties["partitionKey"][0].Value.AsString() + for _, p := range properties["subjects"] { + problem.Subjects = append(problem.Subjects, p.Value.AsString()) + } + + return problem +} diff --git a/app/handler/problems.go b/app/handler/problems.go new file mode 100644 index 0000000..21a5680 --- /dev/null +++ b/app/handler/problems.go @@ -0,0 +1,40 @@ +package handler + +import ( + "encoding/json" + "fmt" + "log" + "net/http" + + gremcos "github.com/supplyon/gremcos" + + "github.com/imeplusplus/dont-panic-api/app/dbOperations" + "github.com/imeplusplus/dont-panic-api/app/model" +) + +func CreateProblem(cosmos gremcos.Cosmos, w http.ResponseWriter, r *http.Request) { + problem := model.Problem{} + log.Println("New post with body: ", r.Body) + if err := json.NewDecoder(r.Body).Decode(&problem); err != nil { + w.WriteHeader(http.StatusBadRequest) + return + } + log.Println("New problem with fields: ", problem) + + problem, err := dbOperations.CreateProblem(cosmos, problem) + + if err != nil { + fmt.Println(err) + w.WriteHeader(http.StatusInternalServerError) + return + } + + w.Header().Add("Content-Type", "application/json") + w.WriteHeader(http.StatusCreated) + err = json.NewEncoder(w).Encode(problem) + + if err != nil { + fmt.Println(err) + w.WriteHeader(http.StatusInternalServerError) + } +} diff --git a/app/model/problem.go b/app/model/problem.go new file mode 100644 index 0000000..413e415 --- /dev/null +++ b/app/model/problem.go @@ -0,0 +1,9 @@ +package model + +type Problem struct { + Id string `json:"id"` + Name string `json:"name"` + Subjects []string `json:"subjects"` + Difficulty int `json:"difficulty"` + PartitionKey string `json:"partitionKey"` +} From 9e137620f8d52a4f8a635a300630afd27d75cfd5 Mon Sep 17 00:00:00 2001 From: Xavier Date: Mon, 12 Jul 2021 18:06:32 -0300 Subject: [PATCH 02/10] Add "Get All Problems" operation --- app/app.go | 1 + app/dbOperations/problems.go | 41 +++++++++++++++++++++++++++++------- app/handler/problems.go | 22 ++++++++++++++++--- 3 files changed, 53 insertions(+), 11 deletions(-) diff --git a/app/app.go b/app/app.go index ae9c734..0b7caf1 100644 --- a/app/app.go +++ b/app/app.go @@ -56,6 +56,7 @@ func (app *App) setRouters() { app.Put("/api/subjects/{name}", app.handleRequest(handler.UpdateSubject)) app.Delete("/api/subjects/{name}", app.handleRequest(handler.DeleteSubject)) // Routing for problems + app.Get("/api/problems", app.handleRequest(handler.GetProblems)) app.Post("/api/problems", app.handleRequest(handler.CreateProblem)) } diff --git a/app/dbOperations/problems.go b/app/dbOperations/problems.go index b65c74d..088ed8b 100644 --- a/app/dbOperations/problems.go +++ b/app/dbOperations/problems.go @@ -29,13 +29,31 @@ func CreateProblem(cosmos gremcos.Cosmos, problem model.Problem) (model.Problem, return problem, err } - return getProblemFromResponse(res) + problems, err := getProblemsFromResponse(res) + if len(problems) == 0 { + return problem, err + } + + return problems[0], err +} + +func GetProblems(cosmos gremcos.Cosmos) ([]model.Problem, error) { + g := api.NewGraph("g") + + query := g.V().HasLabel("problem") + res, err := cosmos.ExecuteQuery(query) + if err != nil { + fmt.Println("Failed to execute a gremlin command", query.String()) + return nil, err + } + + return getProblemsFromResponse(res) } func GetProblemByName(cosmos gremcos.Cosmos, name string) (model.Problem, error) { var problem model.Problem g := api.NewGraph("g") - query := g.V().HasLabel("Problem").Has("Name", name) + query := g.V().HasLabel("problem").Has("name", name) res, err := cosmos.ExecuteQuery(query) if err != nil { @@ -43,7 +61,12 @@ func GetProblemByName(cosmos gremcos.Cosmos, name string) (model.Problem, error) return problem, err } - return getProblemFromResponse(res) + problems, err := getProblemsFromResponse(res) + if len(problems) == 0 { + return problem, err + } + + return problems[0], err } func addProblemVertexProperties(vertex interfaces.Vertex, problem model.Problem) interfaces.Vertex { @@ -62,18 +85,20 @@ func addProblemVertexProperties(vertex interfaces.Vertex, problem model.Problem) return vertex } -func getProblemFromResponse(res []interfaces.Response) (model.Problem, error) { - var problem model.Problem +func getProblemsFromResponse(res []interfaces.Response) ([]model.Problem, error) { + var problems []model.Problem response := api.ResponseArray(res) vertices, _ := response.ToVertices() if len(vertices) == 0 { - return problem, errors.New("there is no vertex in the response") + return problems, errors.New("there is no vertex in the response") } - problem = vertexToProblem(vertices[0]) + for _, v := range vertices { + problems = append(problems, vertexToProblem(v)) + } - return problem, nil + return problems, nil } func vertexToProblem(vertex api.Vertex) model.Problem { diff --git a/app/handler/problems.go b/app/handler/problems.go index 21a5680..4686d53 100644 --- a/app/handler/problems.go +++ b/app/handler/problems.go @@ -3,7 +3,6 @@ package handler import ( "encoding/json" "fmt" - "log" "net/http" gremcos "github.com/supplyon/gremcos" @@ -14,12 +13,10 @@ import ( func CreateProblem(cosmos gremcos.Cosmos, w http.ResponseWriter, r *http.Request) { problem := model.Problem{} - log.Println("New post with body: ", r.Body) if err := json.NewDecoder(r.Body).Decode(&problem); err != nil { w.WriteHeader(http.StatusBadRequest) return } - log.Println("New problem with fields: ", problem) problem, err := dbOperations.CreateProblem(cosmos, problem) @@ -38,3 +35,22 @@ func CreateProblem(cosmos gremcos.Cosmos, w http.ResponseWriter, r *http.Request w.WriteHeader(http.StatusInternalServerError) } } + +func GetProblems(cosmos gremcos.Cosmos, w http.ResponseWriter, r *http.Request) { + problems, err := dbOperations.GetProblems(cosmos) + + if err != nil { + fmt.Println(err) + w.WriteHeader(http.StatusInternalServerError) + return + } + + w.Header().Add("Content-Type", "application/json") + w.WriteHeader(http.StatusCreated) + err = json.NewEncoder(w).Encode(problems) + + if err != nil { + fmt.Println(err) + w.WriteHeader(http.StatusInternalServerError) + } +} From e840e000891fb4f4ca4f88de32f340abf6bddd0f Mon Sep 17 00:00:00 2001 From: Xavier Date: Tue, 13 Jul 2021 11:27:39 -0300 Subject: [PATCH 03/10] Add GetProblem handler --- app/app.go | 1 + app/dbOperations/problems.go | 4 ++-- app/handler/problems.go | 21 +++++++++++++++++++++ 3 files changed, 24 insertions(+), 2 deletions(-) diff --git a/app/app.go b/app/app.go index 0b7caf1..0d8192e 100644 --- a/app/app.go +++ b/app/app.go @@ -57,6 +57,7 @@ func (app *App) setRouters() { app.Delete("/api/subjects/{name}", app.handleRequest(handler.DeleteSubject)) // Routing for problems app.Get("/api/problems", app.handleRequest(handler.GetProblems)) + app.Get("/api/problems/{name}", app.handleRequest(handler.GetProblem)) app.Post("/api/problems", app.handleRequest(handler.CreateProblem)) } diff --git a/app/dbOperations/problems.go b/app/dbOperations/problems.go index 088ed8b..dc4ae0a 100644 --- a/app/dbOperations/problems.go +++ b/app/dbOperations/problems.go @@ -15,7 +15,7 @@ func CreateProblem(cosmos gremcos.Cosmos, problem model.Problem) (model.Problem, _, err := GetProblemByName(cosmos, problem.Name) if err == nil { - return model.Problem{}, errors.New("There is already a problem with name " + problem.Name) + return model.Problem{}, fmt.Errorf("there is already a problem with name %v", problem.Name) } g := api.NewGraph("g") @@ -91,7 +91,7 @@ func getProblemsFromResponse(res []interfaces.Response) ([]model.Problem, error) vertices, _ := response.ToVertices() if len(vertices) == 0 { - return problems, errors.New("there is no vertex in the response") + return problems, errors.New("there is no data with type 'api.vertex' in the response. the graph query didn't return any vertex") } for _, v := range vertices { diff --git a/app/handler/problems.go b/app/handler/problems.go index 4686d53..0a26876 100644 --- a/app/handler/problems.go +++ b/app/handler/problems.go @@ -5,6 +5,7 @@ import ( "fmt" "net/http" + "github.com/gorilla/mux" gremcos "github.com/supplyon/gremcos" "github.com/imeplusplus/dont-panic-api/app/dbOperations" @@ -54,3 +55,23 @@ func GetProblems(cosmos gremcos.Cosmos, w http.ResponseWriter, r *http.Request) w.WriteHeader(http.StatusInternalServerError) } } + +func GetProblem(cosmos gremcos.Cosmos, w http.ResponseWriter, r *http.Request) { + vars := mux.Vars(r) + + problem, err := dbOperations.GetProblemByName(cosmos, vars["name"]) + + if err != nil { + fmt.Println(err) + w.WriteHeader(http.StatusInternalServerError) + return + } + + w.Header().Add("Content-Type", "application/json") + err = json.NewEncoder(w).Encode(problem) + + if err != nil { + fmt.Println(err) + w.WriteHeader(http.StatusInternalServerError) + } +} From d7eda5056f3506bdbab56d5e3466f7846e05d4d9 Mon Sep 17 00:00:00 2001 From: Xavier Date: Tue, 13 Jul 2021 12:30:57 -0300 Subject: [PATCH 04/10] Add UpdateProblem --- app/app.go | 1 + app/dbOperations/problems.go | 25 ++++++++++++++++++++++++- app/handler/problems.go | 27 ++++++++++++++++++++++++++- 3 files changed, 51 insertions(+), 2 deletions(-) diff --git a/app/app.go b/app/app.go index 0d8192e..24af1cb 100644 --- a/app/app.go +++ b/app/app.go @@ -59,6 +59,7 @@ func (app *App) setRouters() { app.Get("/api/problems", app.handleRequest(handler.GetProblems)) app.Get("/api/problems/{name}", app.handleRequest(handler.GetProblem)) app.Post("/api/problems", app.handleRequest(handler.CreateProblem)) + app.Put("/api/problems/{name}", app.handleRequest(handler.UpdateProblem)) } // Get wraps the router for GET method diff --git a/app/dbOperations/problems.go b/app/dbOperations/problems.go index dc4ae0a..133d38d 100644 --- a/app/dbOperations/problems.go +++ b/app/dbOperations/problems.go @@ -31,7 +31,7 @@ func CreateProblem(cosmos gremcos.Cosmos, problem model.Problem) (model.Problem, problems, err := getProblemsFromResponse(res) if len(problems) == 0 { - return problem, err + return model.Problem{}, err } return problems[0], err @@ -63,9 +63,32 @@ func GetProblemByName(cosmos gremcos.Cosmos, name string) (model.Problem, error) problems, err := getProblemsFromResponse(res) if len(problems) == 0 { + return model.Problem{}, err + } + + return problems[0], err +} + +func UpdateProblem(cosmos gremcos.Cosmos, problem model.Problem, name string) (model.Problem, error) { + oldProblem, err := GetProblemByName(cosmos, name) + if err != nil { + return oldProblem, fmt.Errorf("there is no problem with name '%v' to update in the database", name) + } + + g := api.NewGraph("g") + query := addProblemVertexProperties(g.VByStr(oldProblem.Id), problem) + + res, err := cosmos.ExecuteQuery(query) + if err != nil { + fmt.Println("Failed to execute a gremlin command", query.String()) return problem, err } + problems, err := getProblemsFromResponse(res) + if len(problems) == 0 { + return model.Problem{}, err + } + return problems[0], err } diff --git a/app/handler/problems.go b/app/handler/problems.go index 0a26876..ab2afd0 100644 --- a/app/handler/problems.go +++ b/app/handler/problems.go @@ -58,7 +58,6 @@ func GetProblems(cosmos gremcos.Cosmos, w http.ResponseWriter, r *http.Request) func GetProblem(cosmos gremcos.Cosmos, w http.ResponseWriter, r *http.Request) { vars := mux.Vars(r) - problem, err := dbOperations.GetProblemByName(cosmos, vars["name"]) if err != nil { @@ -75,3 +74,29 @@ func GetProblem(cosmos gremcos.Cosmos, w http.ResponseWriter, r *http.Request) { w.WriteHeader(http.StatusInternalServerError) } } + +func UpdateProblem(cosmos gremcos.Cosmos, w http.ResponseWriter, r *http.Request) { + vars := mux.Vars(r) + + problem := model.Problem{} + if err := json.NewDecoder(r.Body).Decode(&problem); err != nil { + w.WriteHeader(http.StatusBadRequest) + return + } + + problem, err := dbOperations.UpdateProblem(cosmos, problem, vars["name"]) + + if err != nil { + fmt.Println(err) + w.WriteHeader(http.StatusInternalServerError) + return + } + + w.Header().Add("Content-Type", "application/json") + err = json.NewEncoder(w).Encode(problem) + + if err != nil { + fmt.Println(err) + w.WriteHeader(http.StatusInternalServerError) + } +} From 1287af0a707f1876fef7f2489af4eac80e628ace Mon Sep 17 00:00:00 2001 From: Xavier Date: Tue, 13 Jul 2021 12:41:41 -0300 Subject: [PATCH 05/10] Add DeleteProblem handler --- app/app.go | 1 + app/dbOperations/problems.go | 15 +++++++++++++++ app/handler/problems.go | 15 +++++++++++++++ 3 files changed, 31 insertions(+) diff --git a/app/app.go b/app/app.go index 24af1cb..d9d6c8e 100644 --- a/app/app.go +++ b/app/app.go @@ -60,6 +60,7 @@ func (app *App) setRouters() { app.Get("/api/problems/{name}", app.handleRequest(handler.GetProblem)) app.Post("/api/problems", app.handleRequest(handler.CreateProblem)) app.Put("/api/problems/{name}", app.handleRequest(handler.UpdateProblem)) + app.Delete("/api/problems/{name}", app.handleRequest(handler.DeleteProblem)) } // Get wraps the router for GET method diff --git a/app/dbOperations/problems.go b/app/dbOperations/problems.go index 133d38d..401bc60 100644 --- a/app/dbOperations/problems.go +++ b/app/dbOperations/problems.go @@ -92,6 +92,21 @@ func UpdateProblem(cosmos gremcos.Cosmos, problem model.Problem, name string) (m return problems[0], err } +func DeleteProblem(cosmos gremcos.Cosmos, name string) error { + _, err := GetProblemByName(cosmos, name) + + if err != nil { + return fmt.Errorf("there is no problem with name '%v' to delete in the database", name) + } + + g := api.NewGraph("g") + query := g.V().HasLabel("problem").Has("name", name).Drop() + + _, err = cosmos.ExecuteQuery(query) + + return err +} + func addProblemVertexProperties(vertex interfaces.Vertex, problem model.Problem) interfaces.Vertex { vertex = vertex. Property("name", problem.Name). diff --git a/app/handler/problems.go b/app/handler/problems.go index ab2afd0..953f1d7 100644 --- a/app/handler/problems.go +++ b/app/handler/problems.go @@ -100,3 +100,18 @@ func UpdateProblem(cosmos gremcos.Cosmos, w http.ResponseWriter, r *http.Request w.WriteHeader(http.StatusInternalServerError) } } + +func DeleteProblem(cosmos gremcos.Cosmos, w http.ResponseWriter, r *http.Request) { + vars := mux.Vars(r) + + err := dbOperations.DeleteProblem(cosmos, vars["name"]) + + if err != nil { + fmt.Println(err) + w.WriteHeader(http.StatusInternalServerError) + return + } + + w.Header().Add("Content-Type", "application/json") + w.WriteHeader(http.StatusAccepted) +} From 7bb7fe6a77e58367316ce2d167f4973b85dc6993 Mon Sep 17 00:00:00 2001 From: Xavier Date: Tue, 13 Jul 2021 16:13:14 -0300 Subject: [PATCH 06/10] Change 'model' to 'modelStorage' --- app/dbOperations/problems.go | 45 +++++++++++--------------- app/dbOperations/subjects.go | 16 ++++----- app/handler/problems.go | 6 ++-- app/handler/subjects.go | 6 ++-- app/model/problem.go | 9 ------ app/modelStorage/problem.go | 9 ++++++ app/{model => modelStorage}/subject.go | 2 +- 7 files changed, 42 insertions(+), 51 deletions(-) delete mode 100644 app/model/problem.go create mode 100644 app/modelStorage/problem.go rename app/{model => modelStorage}/subject.go (92%) diff --git a/app/dbOperations/problems.go b/app/dbOperations/problems.go index 401bc60..baf6415 100644 --- a/app/dbOperations/problems.go +++ b/app/dbOperations/problems.go @@ -8,14 +8,14 @@ import ( "github.com/supplyon/gremcos/api" "github.com/supplyon/gremcos/interfaces" - "github.com/imeplusplus/dont-panic-api/app/model" + modelStorage "github.com/imeplusplus/dont-panic-api/app/modelStorage" ) -func CreateProblem(cosmos gremcos.Cosmos, problem model.Problem) (model.Problem, error) { +func CreateProblem(cosmos gremcos.Cosmos, problem modelStorage.Problem) (modelStorage.Problem, error) { _, err := GetProblemByName(cosmos, problem.Name) if err == nil { - return model.Problem{}, fmt.Errorf("there is already a problem with name %v", problem.Name) + return modelStorage.Problem{}, fmt.Errorf("there is already a problem with name %v", problem.Name) } g := api.NewGraph("g") @@ -31,13 +31,13 @@ func CreateProblem(cosmos gremcos.Cosmos, problem model.Problem) (model.Problem, problems, err := getProblemsFromResponse(res) if len(problems) == 0 { - return model.Problem{}, err + return modelStorage.Problem{}, err } return problems[0], err } -func GetProblems(cosmos gremcos.Cosmos) ([]model.Problem, error) { +func GetProblems(cosmos gremcos.Cosmos) ([]modelStorage.Problem, error) { g := api.NewGraph("g") query := g.V().HasLabel("problem") @@ -50,8 +50,8 @@ func GetProblems(cosmos gremcos.Cosmos) ([]model.Problem, error) { return getProblemsFromResponse(res) } -func GetProblemByName(cosmos gremcos.Cosmos, name string) (model.Problem, error) { - var problem model.Problem +func GetProblemByName(cosmos gremcos.Cosmos, name string) (modelStorage.Problem, error) { + var problem modelStorage.Problem g := api.NewGraph("g") query := g.V().HasLabel("problem").Has("name", name) @@ -63,13 +63,13 @@ func GetProblemByName(cosmos gremcos.Cosmos, name string) (model.Problem, error) problems, err := getProblemsFromResponse(res) if len(problems) == 0 { - return model.Problem{}, err + return modelStorage.Problem{}, err } return problems[0], err } -func UpdateProblem(cosmos gremcos.Cosmos, problem model.Problem, name string) (model.Problem, error) { +func UpdateProblem(cosmos gremcos.Cosmos, problem modelStorage.Problem, name string) (modelStorage.Problem, error) { oldProblem, err := GetProblemByName(cosmos, name) if err != nil { return oldProblem, fmt.Errorf("there is no problem with name '%v' to update in the database", name) @@ -86,7 +86,7 @@ func UpdateProblem(cosmos gremcos.Cosmos, problem model.Problem, name string) (m problems, err := getProblemsFromResponse(res) if len(problems) == 0 { - return model.Problem{}, err + return modelStorage.Problem{}, err } return problems[0], err @@ -107,24 +107,17 @@ func DeleteProblem(cosmos gremcos.Cosmos, name string) error { return err } -func addProblemVertexProperties(vertex interfaces.Vertex, problem model.Problem) interfaces.Vertex { +func addProblemVertexProperties(vertex interfaces.Vertex, problem modelStorage.Problem) interfaces.Vertex { vertex = vertex. Property("name", problem.Name). - Property("difficulty", problem.Difficulty) - - if len(problem.Subjects) > 0 { - vertex = vertex.Property("subjects", problem.Subjects[0]) - - for _, s := range problem.Subjects[1:] { - vertex = vertex.PropertyList("subjects", s) - } - } + Property("difficulty", problem.Difficulty). + Property("link", problem.Link) return vertex } -func getProblemsFromResponse(res []interfaces.Response) ([]model.Problem, error) { - var problems []model.Problem +func getProblemsFromResponse(res []interfaces.Response) ([]modelStorage.Problem, error) { + var problems []modelStorage.Problem response := api.ResponseArray(res) vertices, _ := response.ToVertices() @@ -139,18 +132,16 @@ func getProblemsFromResponse(res []interfaces.Response) ([]model.Problem, error) return problems, nil } -func vertexToProblem(vertex api.Vertex) model.Problem { - var problem model.Problem +func vertexToProblem(vertex api.Vertex) modelStorage.Problem { + var problem modelStorage.Problem problem.Id = vertex.ID properties := vertex.Properties problem.Name = properties["name"][0].Value.AsString() problem.Difficulty = int(properties["difficulty"][0].Value.AsInt32()) + problem.Link = properties["link"][0].Value.AsString() problem.PartitionKey = properties["partitionKey"][0].Value.AsString() - for _, p := range properties["subjects"] { - problem.Subjects = append(problem.Subjects, p.Value.AsString()) - } return problem } diff --git a/app/dbOperations/subjects.go b/app/dbOperations/subjects.go index 5b71962..f897680 100644 --- a/app/dbOperations/subjects.go +++ b/app/dbOperations/subjects.go @@ -8,7 +8,7 @@ import ( "github.com/supplyon/gremcos/api" "github.com/supplyon/gremcos/interfaces" - "github.com/imeplusplus/dont-panic-api/app/model" + model "github.com/imeplusplus/dont-panic-api/app/modelStorage" ) func GetSubjects(cosmos gremcos.Cosmos) ([]model.Subject, error) { @@ -42,7 +42,7 @@ func GetSubjectByName(cosmos gremcos.Cosmos, name string) (model.Subject, error) res, err := cosmos.ExecuteQuery(query) if err != nil { fmt.Println("Failed to execute a gremlin command " + query.String()) - //logger.Error().Err(err).Msg("Failed to execute a gremlin command") + // logger.Error().Err(err).Msg("Failed to execute a gremlin command") return subject, err } @@ -59,7 +59,7 @@ func CreateSubject(cosmos gremcos.Cosmos, subject model.Subject) (model.Subject, g := api.NewGraph("g") query := g.AddV("subject").Property("partitionKey", "subject") - query = addVertexProperties(query, subject) + query = addSubjectVertexProperties(query, subject) res, err := cosmos.ExecuteQuery(query) if err != nil { @@ -79,7 +79,7 @@ func UpdateSubject(cosmos gremcos.Cosmos, subject model.Subject, name string) (m } g := api.NewGraph("g") - query := addVertexProperties(g.VByStr(oldSubject.Id), subject) + query := addSubjectVertexProperties(g.VByStr(oldSubject.Id), subject) res, err := cosmos.ExecuteQuery(query) if err != nil { @@ -100,7 +100,7 @@ func DeleteSubject(cosmos gremcos.Cosmos, name string) error { return err } -func addVertexProperties(vertex interfaces.Vertex, subject model.Subject) interfaces.Vertex { +func addSubjectVertexProperties(vertex interfaces.Vertex, subject model.Subject) interfaces.Vertex { vertex = vertex. Property("name", subject.Name). Property("difficulty", subject.Difficulty). @@ -120,13 +120,13 @@ func addVertexProperties(vertex interfaces.Vertex, subject model.Subject) interf func getSubjectFromResponse(res []interfaces.Response) (model.Subject, error) { var subject model.Subject response := api.ResponseArray(res) - vertices, err := response.ToVertices() + vertices, _ := response.ToVertices() if len(vertices) == 0 { - return subject, errors.New("There is no vertex in the response") + return subject, errors.New("there is no vertex in the response") } - subject, err = vertexToSubject(vertices[0]) + subject, err := vertexToSubject(vertices[0]) if err != nil { return subject, err } diff --git a/app/handler/problems.go b/app/handler/problems.go index 953f1d7..992d97b 100644 --- a/app/handler/problems.go +++ b/app/handler/problems.go @@ -9,11 +9,11 @@ import ( gremcos "github.com/supplyon/gremcos" "github.com/imeplusplus/dont-panic-api/app/dbOperations" - "github.com/imeplusplus/dont-panic-api/app/model" + modelStorage "github.com/imeplusplus/dont-panic-api/app/modelStorage" ) func CreateProblem(cosmos gremcos.Cosmos, w http.ResponseWriter, r *http.Request) { - problem := model.Problem{} + problem := modelStorage.Problem{} if err := json.NewDecoder(r.Body).Decode(&problem); err != nil { w.WriteHeader(http.StatusBadRequest) return @@ -78,7 +78,7 @@ func GetProblem(cosmos gremcos.Cosmos, w http.ResponseWriter, r *http.Request) { func UpdateProblem(cosmos gremcos.Cosmos, w http.ResponseWriter, r *http.Request) { vars := mux.Vars(r) - problem := model.Problem{} + problem := modelStorage.Problem{} if err := json.NewDecoder(r.Body).Decode(&problem); err != nil { w.WriteHeader(http.StatusBadRequest) return diff --git a/app/handler/subjects.go b/app/handler/subjects.go index 042645e..7b9faa2 100644 --- a/app/handler/subjects.go +++ b/app/handler/subjects.go @@ -9,7 +9,7 @@ import ( gremcos "github.com/supplyon/gremcos" "github.com/imeplusplus/dont-panic-api/app/dbOperations" - "github.com/imeplusplus/dont-panic-api/app/model" + modelStorage "github.com/imeplusplus/dont-panic-api/app/modelStorage" ) func GetSubjects(cosmos gremcos.Cosmos, w http.ResponseWriter, _ *http.Request) { @@ -53,7 +53,7 @@ func GetSubject(cosmos gremcos.Cosmos, w http.ResponseWriter, r *http.Request) { func UpdateSubject(cosmos gremcos.Cosmos, w http.ResponseWriter, r *http.Request) { vars := mux.Vars(r) - subject := model.Subject{} + subject := modelStorage.Subject{} err := json.NewDecoder(r.Body).Decode(&subject) if err != nil { @@ -95,7 +95,7 @@ func DeleteSubject(cosmos gremcos.Cosmos, w http.ResponseWriter, r *http.Request } func CreateSubject(cosmos gremcos.Cosmos, w http.ResponseWriter, r *http.Request) { - subject := model.Subject{} + subject := modelStorage.Subject{} var err error if err = json.NewDecoder(r.Body).Decode(&subject); err != nil { w.WriteHeader(http.StatusBadRequest) diff --git a/app/model/problem.go b/app/model/problem.go deleted file mode 100644 index 413e415..0000000 --- a/app/model/problem.go +++ /dev/null @@ -1,9 +0,0 @@ -package model - -type Problem struct { - Id string `json:"id"` - Name string `json:"name"` - Subjects []string `json:"subjects"` - Difficulty int `json:"difficulty"` - PartitionKey string `json:"partitionKey"` -} diff --git a/app/modelStorage/problem.go b/app/modelStorage/problem.go new file mode 100644 index 0000000..7e19ae8 --- /dev/null +++ b/app/modelStorage/problem.go @@ -0,0 +1,9 @@ +package modelStorage + +type Problem struct { + Id string `json:"id"` + Name string `json:"name"` + Difficulty int `json:"difficulty"` + Link string `json:"link"` + PartitionKey string `json:"partitionKey"` +} diff --git a/app/model/subject.go b/app/modelStorage/subject.go similarity index 92% rename from app/model/subject.go rename to app/modelStorage/subject.go index a635432..85e376b 100644 --- a/app/model/subject.go +++ b/app/modelStorage/subject.go @@ -1,4 +1,4 @@ -package model +package modelStorage type Subject struct { Id string `json:"id"` From eef60b88f8b529ac6081871c88c795c9b8f60558 Mon Sep 17 00:00:00 2001 From: Xavier Date: Tue, 13 Jul 2021 16:13:14 -0300 Subject: [PATCH 07/10] Change 'model' to 'modelStorage' --- app/dbOperations/subjects.go | 30 +++++++++++++++--------------- 1 file changed, 15 insertions(+), 15 deletions(-) diff --git a/app/dbOperations/subjects.go b/app/dbOperations/subjects.go index f897680..7e5fa83 100644 --- a/app/dbOperations/subjects.go +++ b/app/dbOperations/subjects.go @@ -8,10 +8,10 @@ import ( "github.com/supplyon/gremcos/api" "github.com/supplyon/gremcos/interfaces" - model "github.com/imeplusplus/dont-panic-api/app/modelStorage" + modelStorage "github.com/imeplusplus/dont-panic-api/app/modelStorage" ) -func GetSubjects(cosmos gremcos.Cosmos) ([]model.Subject, error) { +func GetSubjects(cosmos gremcos.Cosmos) ([]modelStorage.Subject, error) { g := api.NewGraph("g") query := g.V().HasLabel("subject") @@ -34,8 +34,8 @@ func GetSubjects(cosmos gremcos.Cosmos) ([]model.Subject, error) { return subjects, nil } -func GetSubjectByName(cosmos gremcos.Cosmos, name string) (model.Subject, error) { - var subject model.Subject +func GetSubjectByName(cosmos gremcos.Cosmos, name string) (modelStorage.Subject, error) { + var subject modelStorage.Subject g := api.NewGraph("g") query := g.V().HasLabel("subject").Has("name", name) @@ -49,11 +49,11 @@ func GetSubjectByName(cosmos gremcos.Cosmos, name string) (model.Subject, error) return getSubjectFromResponse(res) } -func CreateSubject(cosmos gremcos.Cosmos, subject model.Subject) (model.Subject, error) { +func CreateSubject(cosmos gremcos.Cosmos, subject modelStorage.Subject) (modelStorage.Subject, error) { _, err := GetSubjectByName(cosmos, subject.Name) if err == nil { - return model.Subject{}, errors.New("There is already a subject with name " + subject.Name) + return modelStorage.Subject{}, errors.New("There is already a subject with name " + subject.Name) } g := api.NewGraph("g") @@ -71,11 +71,11 @@ func CreateSubject(cosmos gremcos.Cosmos, subject model.Subject) (model.Subject, return getSubjectFromResponse(res) } -func UpdateSubject(cosmos gremcos.Cosmos, subject model.Subject, name string) (model.Subject, error) { +func UpdateSubject(cosmos gremcos.Cosmos, subject modelStorage.Subject, name string) (modelStorage.Subject, error) { oldSubject, err := GetSubjectByName(cosmos, name) if err != nil { - return model.Subject{}, errors.New("There is no subject with name " + oldSubject.Name) + return modelStorage.Subject{}, errors.New("There is no subject with name " + oldSubject.Name) } g := api.NewGraph("g") @@ -100,7 +100,7 @@ func DeleteSubject(cosmos gremcos.Cosmos, name string) error { return err } -func addSubjectVertexProperties(vertex interfaces.Vertex, subject model.Subject) interfaces.Vertex { +func addSubjectVertexProperties(vertex interfaces.Vertex, subject modelStorage.Subject) interfaces.Vertex { vertex = vertex. Property("name", subject.Name). Property("difficulty", subject.Difficulty). @@ -117,8 +117,8 @@ func addSubjectVertexProperties(vertex interfaces.Vertex, subject model.Subject) return vertex } -func getSubjectFromResponse(res []interfaces.Response) (model.Subject, error) { - var subject model.Subject +func getSubjectFromResponse(res []interfaces.Response) (modelStorage.Subject, error) { + var subject modelStorage.Subject response := api.ResponseArray(res) vertices, _ := response.ToVertices() @@ -134,8 +134,8 @@ func getSubjectFromResponse(res []interfaces.Response) (model.Subject, error) { return subject, nil } -func verticesToSubjects(vertices []api.Vertex) []model.Subject { - subjects := []model.Subject{} +func verticesToSubjects(vertices []api.Vertex) []modelStorage.Subject { + subjects := []modelStorage.Subject{} for _, v := range vertices { subject, err := vertexToSubject(v) @@ -147,8 +147,8 @@ func verticesToSubjects(vertices []api.Vertex) []model.Subject { return subjects } -func vertexToSubject(vertex api.Vertex) (model.Subject, error) { - var subject model.Subject +func vertexToSubject(vertex api.Vertex) (modelStorage.Subject, error) { + var subject modelStorage.Subject subject.Id = vertex.ID From 94aabb28fbd06c07edfe566aaf8a0788dd3676d4 Mon Sep 17 00:00:00 2001 From: Xavier Date: Tue, 13 Jul 2021 16:36:51 -0300 Subject: [PATCH 08/10] Change 'UpdateProblem' to check if problem name is being changed --- app/dbOperations/problems.go | 3 +++ 1 file changed, 3 insertions(+) diff --git a/app/dbOperations/problems.go b/app/dbOperations/problems.go index baf6415..467678c 100644 --- a/app/dbOperations/problems.go +++ b/app/dbOperations/problems.go @@ -70,6 +70,9 @@ func GetProblemByName(cosmos gremcos.Cosmos, name string) (modelStorage.Problem, } func UpdateProblem(cosmos gremcos.Cosmos, problem modelStorage.Problem, name string) (modelStorage.Problem, error) { + if problem.Name != name { + return modelStorage.Problem{}, fmt.Errorf("can't change the property 'name' of the Problem") + } oldProblem, err := GetProblemByName(cosmos, name) if err != nil { return oldProblem, fmt.Errorf("there is no problem with name '%v' to update in the database", name) From d644cb64460be236a5b4476c4cb2ec9b20987420 Mon Sep 17 00:00:00 2001 From: Xavier Date: Wed, 14 Jul 2021 12:22:02 -0300 Subject: [PATCH 09/10] Enable renaming on UpdateProblem --- app/dbOperations/problems.go | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/app/dbOperations/problems.go b/app/dbOperations/problems.go index 467678c..28c1e2c 100644 --- a/app/dbOperations/problems.go +++ b/app/dbOperations/problems.go @@ -71,7 +71,10 @@ func GetProblemByName(cosmos gremcos.Cosmos, name string) (modelStorage.Problem, func UpdateProblem(cosmos gremcos.Cosmos, problem modelStorage.Problem, name string) (modelStorage.Problem, error) { if problem.Name != name { - return modelStorage.Problem{}, fmt.Errorf("can't change the property 'name' of the Problem") + _, err := GetProblemByName(cosmos, problem.Name) + if err == nil { + return modelStorage.Problem{}, fmt.Errorf("there is already a problem with name %v. can't rename in this case", problem.Name) + } } oldProblem, err := GetProblemByName(cosmos, name) if err != nil { From 85e228b38d595749bd24bc3aa22cdb49ac8e4708 Mon Sep 17 00:00:00 2001 From: Xavier Date: Wed, 14 Jul 2021 15:44:05 -0300 Subject: [PATCH 10/10] Add blank lines for code style --- app/app.go | 1 + app/dbOperations/problems.go | 1 + 2 files changed, 2 insertions(+) diff --git a/app/app.go b/app/app.go index d9d6c8e..ec6eb9a 100644 --- a/app/app.go +++ b/app/app.go @@ -55,6 +55,7 @@ func (app *App) setRouters() { app.Get("/api/subjects/{name}", app.handleRequest(handler.GetSubject)) app.Put("/api/subjects/{name}", app.handleRequest(handler.UpdateSubject)) app.Delete("/api/subjects/{name}", app.handleRequest(handler.DeleteSubject)) + // Routing for problems app.Get("/api/problems", app.handleRequest(handler.GetProblems)) app.Get("/api/problems/{name}", app.handleRequest(handler.GetProblem)) diff --git a/app/dbOperations/problems.go b/app/dbOperations/problems.go index 28c1e2c..3c34223 100644 --- a/app/dbOperations/problems.go +++ b/app/dbOperations/problems.go @@ -76,6 +76,7 @@ func UpdateProblem(cosmos gremcos.Cosmos, problem modelStorage.Problem, name str return modelStorage.Problem{}, fmt.Errorf("there is already a problem with name %v. can't rename in this case", problem.Name) } } + oldProblem, err := GetProblemByName(cosmos, name) if err != nil { return oldProblem, fmt.Errorf("there is no problem with name '%v' to update in the database", name)