github.com/bluestoneag/bluephish@v0.1.0/controllers/api/group.go (about) 1 package api 2 3 import ( 4 "encoding/json" 5 "net/http" 6 "strconv" 7 "time" 8 9 ctx "github.com/bluestoneag/bluephish/context" 10 log "github.com/bluestoneag/bluephish/logger" 11 "github.com/bluestoneag/bluephish/models" 12 "github.com/gorilla/mux" 13 "github.com/jinzhu/gorm" 14 ) 15 16 // Groups returns a list of groups if requested via GET. 17 // If requested via POST, APIGroups creates a new group and returns a reference to it. 18 func (as *Server) Groups(w http.ResponseWriter, r *http.Request) { 19 switch { 20 case r.Method == "GET": 21 gs, err := models.GetGroups(ctx.Get(r, "user_id").(int64)) 22 if err != nil { 23 JSONResponse(w, models.Response{Success: false, Message: "No groups found"}, http.StatusNotFound) 24 return 25 } 26 JSONResponse(w, gs, http.StatusOK) 27 //POST: Create a new group and return it as JSON 28 case r.Method == "POST": 29 g := models.Group{} 30 // Put the request into a group 31 err := json.NewDecoder(r.Body).Decode(&g) 32 if err != nil { 33 JSONResponse(w, models.Response{Success: false, Message: "Invalid JSON structure"}, http.StatusBadRequest) 34 return 35 } 36 _, err = models.GetGroupByName(g.Name, ctx.Get(r, "user_id").(int64)) 37 if err != gorm.ErrRecordNotFound { 38 JSONResponse(w, models.Response{Success: false, Message: "Group name already in use"}, http.StatusConflict) 39 return 40 } 41 g.ModifiedDate = time.Now().UTC() 42 g.UserId = ctx.Get(r, "user_id").(int64) 43 err = models.PostGroup(&g) 44 if err != nil { 45 JSONResponse(w, models.Response{Success: false, Message: err.Error()}, http.StatusBadRequest) 46 return 47 } 48 JSONResponse(w, g, http.StatusCreated) 49 } 50 } 51 52 // GroupsSummary returns a summary of the groups owned by the current user. 53 func (as *Server) GroupsSummary(w http.ResponseWriter, r *http.Request) { 54 switch { 55 case r.Method == "GET": 56 gs, err := models.GetGroupSummaries(ctx.Get(r, "user_id").(int64)) 57 if err != nil { 58 log.Error(err) 59 JSONResponse(w, models.Response{Success: false, Message: err.Error()}, http.StatusInternalServerError) 60 return 61 } 62 JSONResponse(w, gs, http.StatusOK) 63 } 64 } 65 66 // Group returns details about the requested group. 67 // If the group is not valid, Group returns null. 68 func (as *Server) Group(w http.ResponseWriter, r *http.Request) { 69 vars := mux.Vars(r) 70 id, _ := strconv.ParseInt(vars["id"], 0, 64) 71 g, err := models.GetGroup(id, ctx.Get(r, "user_id").(int64)) 72 if err != nil { 73 JSONResponse(w, models.Response{Success: false, Message: "Group not found"}, http.StatusNotFound) 74 return 75 } 76 switch { 77 case r.Method == "GET": 78 JSONResponse(w, g, http.StatusOK) 79 case r.Method == "DELETE": 80 err = models.DeleteGroup(&g) 81 if err != nil { 82 JSONResponse(w, models.Response{Success: false, Message: "Error deleting group"}, http.StatusInternalServerError) 83 return 84 } 85 JSONResponse(w, models.Response{Success: true, Message: "Group deleted successfully!"}, http.StatusOK) 86 case r.Method == "PUT": 87 // Change this to get from URL and uid (don't bother with id in r.Body) 88 g = models.Group{} 89 err = json.NewDecoder(r.Body).Decode(&g) 90 if err != nil { 91 log.Errorf("error decoding group: %v", err) 92 JSONResponse(w, models.Response{Success: false, Message: err.Error()}, http.StatusInternalServerError) 93 return 94 } 95 if g.Id != id { 96 JSONResponse(w, models.Response{Success: false, Message: "Error: /:id and group_id mismatch"}, http.StatusInternalServerError) 97 return 98 } 99 g.ModifiedDate = time.Now().UTC() 100 g.UserId = ctx.Get(r, "user_id").(int64) 101 err = models.PutGroup(&g) 102 if err != nil { 103 JSONResponse(w, models.Response{Success: false, Message: err.Error()}, http.StatusBadRequest) 104 return 105 } 106 JSONResponse(w, g, http.StatusOK) 107 } 108 } 109 110 // GroupSummary returns a summary of the groups owned by the current user. 111 func (as *Server) GroupSummary(w http.ResponseWriter, r *http.Request) { 112 switch { 113 case r.Method == "GET": 114 vars := mux.Vars(r) 115 id, _ := strconv.ParseInt(vars["id"], 0, 64) 116 g, err := models.GetGroupSummary(id, ctx.Get(r, "user_id").(int64)) 117 if err != nil { 118 JSONResponse(w, models.Response{Success: false, Message: "Group not found"}, http.StatusNotFound) 119 return 120 } 121 JSONResponse(w, g, http.StatusOK) 122 } 123 }