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  }