Browse Source

Working on fixing a bug on delete handler

Andrea Fazzi 5 years ago
parent
commit
9ee17d7cdc
4 changed files with 55 additions and 13 deletions
  1. 39 10
      handlers/handlers.go
  2. 10 1
      handlers/handlers_test.go
  3. 3 1
      orm/orm_test.go
  4. 3 1
      templates/layout/base.html.tpl

+ 39 - 10
handlers/handlers.go

@@ -1,7 +1,6 @@
 package handlers
 
 import (
-	"encoding/json"
 	"fmt"
 	"io/ioutil"
 	"log"
@@ -201,6 +200,7 @@ func get(w http.ResponseWriter, r *http.Request, model string, pattern PathPatte
 	if err != nil {
 		respondWithError(w, r, err)
 	} else {
+		log.Println("AFTER REDIRECT:", r.URL)
 		data, err := getFn(mux.Vars(r))
 		if err != nil {
 			renderer.Render[format](w, r, err)
@@ -247,30 +247,59 @@ func post(w http.ResponseWriter, r *http.Request, model string, pattern PathPatt
 
 }
 
+// func delete(w http.ResponseWriter, r *http.Request, model string, pattern PathPattern) {
+// 	postFn, ok := orm.Post[pattern.Path(model)]
+// 	if !ok {
+// 		renderer.Render[r.URL.Query().Get("format")](w, r, fmt.Errorf("Can't find ORM function for path %s!", pattern.PathPattern))
+// 	}
+// 	_, err := postFn(mux.Vars(r), r)
+// 	if err != nil {
+// 		renderer.Render["html"](w, r, err)
+// 	} else {
+// 		var data struct {
+// 			RedirectUrl string `json:"redirect_url"`
+// 		}
+// 		data.RedirectUrl = pattern.RedirectPath(model)
+
+// 		w.Header().Set("Content-Type", "application/json")
+// 		json.NewEncoder(w).Encode(data)
+// 	}
+// }
+
 func delete(w http.ResponseWriter, r *http.Request, model string, pattern PathPattern) {
+	var (
+		data orm.IDer
+		err  error
+	)
+
+	respFormat := renderer.GetContentFormat(r)
+
 	postFn, ok := orm.Post[pattern.Path(model)]
 	if !ok {
 		renderer.Render[r.URL.Query().Get("format")](w, r, fmt.Errorf("Can't find ORM function for path %s!", pattern.PathPattern))
 	}
-	_, err := postFn(mux.Vars(r), r)
+	data, err = postFn(mux.Vars(r), r)
 	if err != nil {
 		renderer.Render["html"](w, r, err)
+	} else if pattern.RedirectPattern != "" {
+		// if id := mux.Vars(r)["id"]; id != "" {
+		// 	modelId, _ := strconv.Atoi(id)
+		// 	http.Redirect(w, r, pattern.RedirectPath(model, uint(modelId)), http.StatusSeeOther)
+		// } else {
+		// 	http.Redirect(w, r, pattern.RedirectPath(model, data.GetID()), http.StatusSeeOther)
+		// }
+		log.Println("REDIRECT:", pattern.RedirectPath(model))
+		http.Redirect(w, r, pattern.RedirectPath(model), http.StatusSeeOther)
 	} else {
-		var data struct {
-			RedirectUrl string `json:"redirect_url"`
-		}
-		data.RedirectUrl = pattern.RedirectPath(model)
-
-		w.Header().Set("Content-Type", "application/json")
-		json.NewEncoder(w).Encode(data)
+		renderer.Render[respFormat](w, r, data.GetID())
 	}
 }
 
 func modelHandler(model string, pattern PathPattern) http.Handler {
 	fn := func(w http.ResponseWriter, r *http.Request) {
 		switch r.Method {
-
 		case "GET":
+			log.Println("AFTER AFTER REDIRECT", model, pattern)
 			get(w, r, model, pattern)
 
 		case "POST":

+ 10 - 1
handlers/handlers_test.go

@@ -122,7 +122,6 @@ func (t *testSuite) BeforeAll() {
 }
 
 func (t *testSuite) TestGetTeachersHTML() {
-
 	req, err := http.NewRequest("GET", "/teachers?format=html&tpl_layout=base&tpl_content=teachers", nil)
 	if err != nil {
 		panic(err)
@@ -180,6 +179,8 @@ func (t *testSuite) TestGetTeachersJSON() {
 }
 
 func (t *testSuite) TestDeleteActivityJSON() {
+	var response renderer.JsonResponse
+
 	req, err := http.NewRequest("DELETE", fmt.Sprintf("/api/activities/%d/delete?format=json", 1), nil)
 	if err != nil {
 		panic(err)
@@ -193,6 +194,14 @@ func (t *testSuite) TestDeleteActivityJSON() {
 	router.Handle("/api/activities/{id}/delete", modelHandler("activities", pattern))
 	router.ServeHTTP(rr, req)
 
+	if !t.Failed() {
+		err := json.Unmarshal(rr.Body.Bytes(), &response)
+		t.Nil(err)
+		if !t.Failed() {
+			t.Equal("1", string(response.Result))
+		}
+	}
+
 	t.Equal(http.StatusOK, rr.Code)
 }
 

+ 3 - 1
orm/orm_test.go

@@ -102,9 +102,11 @@ func (t *testSuite) TestDeleteActivity() {
 
 	t.Equal(numActivities+1, len(activities))
 
-	_, err = DeleteActivity(map[string]string{"id": strconv.Itoa(int(activity.ID))}, nil)
+	act, err := DeleteActivity(map[string]string{"id": strconv.Itoa(int(activity.ID))}, nil)
 	t.Nil(err)
 
+	t.Equal(14, act.GetID())
+
 	err = DB().Find(&activities).Error
 	t.Nil(err)
 

+ 3 - 1
templates/layout/base.html.tpl

@@ -61,8 +61,10 @@
       <div class="modal-dialog" role="document">
 	<div class="modal-content">
 	  <div class="modal-header">
-            <button type="button" class="close" data-dismiss="modal" aria-label="Close"><span aria-hidden="true">&times;</span></button>
             <h4 class="modal-title" id="myModalLabel">Richiesta di conferma eliminazione</h4>
+            <button type="button" class="close" data-dismiss="modal" aria-label="Close">
+              <span aria-hidden="true">&times;</span>
+            </button>
 	  </div>
 	  <div class="modal-body">
             Stai per eliminare l'elemento. Ne sei sicuro?