|
|
@ -2,11 +2,14 @@ package controllers |
|
|
|
|
|
|
|
import ( |
|
|
|
"database/sql" |
|
|
|
"encoding/json" |
|
|
|
"fmt" |
|
|
|
"log" |
|
|
|
"net/http" |
|
|
|
"strconv" |
|
|
|
|
|
|
|
"git.aiterp.net/lucifer/lucifer/internal/httperr" |
|
|
|
|
|
|
|
"git.aiterp.net/lucifer/lucifer/internal/respond" |
|
|
|
"git.aiterp.net/lucifer/lucifer/models" |
|
|
|
"github.com/gorilla/mux" |
|
|
@ -33,11 +36,11 @@ func (c *GroupController) getGroups(w http.ResponseWriter, r *http.Request) { |
|
|
|
respond.Data(w, groups) |
|
|
|
} |
|
|
|
|
|
|
|
// getGroup (`GET /:id`): Get user by id
|
|
|
|
// getGroup (`GET /:group_id`): Get user by id
|
|
|
|
func (c *GroupController) getGroup(w http.ResponseWriter, r *http.Request) { |
|
|
|
session := models.SessionFromContext(r.Context()) |
|
|
|
|
|
|
|
idStr := mux.Vars(r)["id"] |
|
|
|
idStr := mux.Vars(r)["group_id"] |
|
|
|
id, err := strconv.ParseInt(idStr, 10, 32) |
|
|
|
if err != nil { |
|
|
|
respond.Error(w, http.StatusBadRequest, "invalid_id", "The id"+idStr+"is not valid.") |
|
|
@ -53,11 +56,11 @@ func (c *GroupController) getGroup(w http.ResponseWriter, r *http.Request) { |
|
|
|
respond.Data(w, group) |
|
|
|
} |
|
|
|
|
|
|
|
// getGroupLights (`GET /:id/light/`): Get user by id
|
|
|
|
// getGroupLights (`GET /:group_id/light/`): Get user by id
|
|
|
|
func (c *GroupController) getGroupLights(w http.ResponseWriter, r *http.Request) { |
|
|
|
session := models.SessionFromContext(r.Context()) |
|
|
|
|
|
|
|
idStr := mux.Vars(r)["id"] |
|
|
|
idStr := mux.Vars(r)["group_id"] |
|
|
|
id, err := strconv.ParseInt(idStr, 10, 32) |
|
|
|
if err != nil { |
|
|
|
respond.Error(w, http.StatusBadRequest, "invalid_id", "The id "+idStr+" is not valid.") |
|
|
@ -80,7 +83,7 @@ func (c *GroupController) getGroupLights(w http.ResponseWriter, r *http.Request) |
|
|
|
respond.Data(w, lights) |
|
|
|
} |
|
|
|
|
|
|
|
// getGroupLight (`GET /:group_id/light/:id`): Get user by id
|
|
|
|
// getGroupLight (`GET /:group_id/light/:light_id`): Get user by id
|
|
|
|
func (c *GroupController) getGroupLight(w http.ResponseWriter, r *http.Request) { |
|
|
|
session := models.SessionFromContext(r.Context()) |
|
|
|
|
|
|
@ -91,7 +94,7 @@ func (c *GroupController) getGroupLight(w http.ResponseWriter, r *http.Request) |
|
|
|
return |
|
|
|
} |
|
|
|
|
|
|
|
idStr := mux.Vars(r)["id"] |
|
|
|
idStr := mux.Vars(r)["light_id"] |
|
|
|
id, err := strconv.ParseInt(idStr, 10, 32) |
|
|
|
if err != nil { |
|
|
|
respond.Error(w, http.StatusBadRequest, "invalid_id", "The light id "+idStr+" is not valid.") |
|
|
@ -114,14 +117,100 @@ func (c *GroupController) getGroupLight(w http.ResponseWriter, r *http.Request) |
|
|
|
respond.Data(w, light) |
|
|
|
} |
|
|
|
|
|
|
|
// postGroup (`POST /`): Create a group.
|
|
|
|
func (c *GroupController) postGroup(w http.ResponseWriter, r *http.Request) { |
|
|
|
user := models.UserFromContext(r.Context()) |
|
|
|
|
|
|
|
postData := struct { |
|
|
|
Name string |
|
|
|
}{} |
|
|
|
if err := json.NewDecoder(r.Body).Decode(&postData); err != nil { |
|
|
|
respond.Error(w, http.StatusBadRequest, "invalid_json", "Input is not valid JSON.") |
|
|
|
return |
|
|
|
} |
|
|
|
if postData.Name == "" { |
|
|
|
respond.Error(w, http.StatusBadRequest, "invalid_name", "The name cannot be blank.") |
|
|
|
return |
|
|
|
} |
|
|
|
|
|
|
|
group, err := c.groups.Insert(r.Context(), models.Group{Name: postData.Name}) |
|
|
|
if err != nil { |
|
|
|
httperr.Respond(w, err) |
|
|
|
return |
|
|
|
} |
|
|
|
|
|
|
|
permission := models.GroupPermission{ |
|
|
|
GroupID: group.ID, |
|
|
|
UserID: user.ID, |
|
|
|
Read: true, |
|
|
|
Write: true, |
|
|
|
Delete: true, |
|
|
|
Create: true, |
|
|
|
Manage: true, |
|
|
|
} |
|
|
|
|
|
|
|
err = c.groups.UpdatePermissions(r.Context(), permission) |
|
|
|
if err != nil { |
|
|
|
httperr.Respond(w, err) |
|
|
|
return |
|
|
|
} |
|
|
|
|
|
|
|
group.Permissions = []models.GroupPermission{permission} |
|
|
|
respond.Data(w, group) |
|
|
|
} |
|
|
|
|
|
|
|
// updateGroup (`PUT/PATCH /:group_id`): Create a group.
|
|
|
|
func (c *GroupController) updateGroup(w http.ResponseWriter, r *http.Request) { |
|
|
|
user := models.UserFromContext(r.Context()) |
|
|
|
|
|
|
|
groupIDStr := mux.Vars(r)["group_id"] |
|
|
|
groupID, err := strconv.ParseInt(groupIDStr, 10, 32) |
|
|
|
if err != nil { |
|
|
|
respond.Error(w, http.StatusBadRequest, "invalid_id", "The group id "+groupIDStr+" is not valid.") |
|
|
|
return |
|
|
|
} |
|
|
|
|
|
|
|
postData := struct { |
|
|
|
Name string |
|
|
|
}{} |
|
|
|
if err := json.NewDecoder(r.Body).Decode(&postData); err != nil { |
|
|
|
respond.Error(w, http.StatusBadRequest, "invalid_json", "Input is not valid JSON.") |
|
|
|
return |
|
|
|
} |
|
|
|
if postData.Name == "" { |
|
|
|
respond.Error(w, http.StatusBadRequest, "invalid_name", "The name cannot be blank.") |
|
|
|
return |
|
|
|
} |
|
|
|
|
|
|
|
group, err := c.groups.FindByID(r.Context(), int(groupID)) |
|
|
|
if err != nil { |
|
|
|
respond.Error(w, http.StatusNotFound, "group_not_found", "The group cannot be found or you are not authorized to view it.") |
|
|
|
return |
|
|
|
} else if !group.Permission(user.ID).Manage { |
|
|
|
respond.Error(w, http.StatusNotFound, "permission_denied", "Your transgression will be remembered.") |
|
|
|
return |
|
|
|
} |
|
|
|
|
|
|
|
group.Name = postData.Name |
|
|
|
err = c.groups.Update(r.Context(), group) |
|
|
|
if err != nil { |
|
|
|
httperr.Respond(w, err) |
|
|
|
return |
|
|
|
} |
|
|
|
|
|
|
|
respond.Data(w, group) |
|
|
|
} |
|
|
|
|
|
|
|
// Mount mounts the controller
|
|
|
|
func (c *GroupController) Mount(router *mux.Router, prefix string) { |
|
|
|
sub := router.PathPrefix(prefix).Subrouter() |
|
|
|
|
|
|
|
sub.HandleFunc("/", c.getGroups).Methods("GET") |
|
|
|
sub.HandleFunc("/{id}", c.getGroup).Methods("GET") |
|
|
|
sub.HandleFunc("/{id}/light/", c.getGroupLights).Methods("GET") |
|
|
|
sub.HandleFunc("/{group_id}/light/{id}", c.getGroupLight).Methods("GET") |
|
|
|
sub.HandleFunc("/", c.postGroup).Methods("POST") |
|
|
|
sub.HandleFunc("/{group_id}", c.getGroup).Methods("GET") |
|
|
|
sub.HandleFunc("/{group_id}", c.updateGroup).Methods("PUT", "PATCH") |
|
|
|
sub.HandleFunc("/{group_id}/light/", c.getGroupLights).Methods("GET") |
|
|
|
sub.HandleFunc("/{group_id}/light/{light_id}", c.getGroupLight).Methods("GET") |
|
|
|
} |
|
|
|
|
|
|
|
// NewGroupController creates a new GroupController.
|
|
|
|