func LinkHandler(w http.ResponseWriter, r *UserRequest) {
	switch r.Method {
	case "GET":
		groupId := util.ParseInt64FromQuery(r.URL, "groupId")

		if service.HasAccessToGroup(r.User, groupId) {
			links := service.GetLinksForGroup(groupId)

			util.MarshalToResponseWriter(links, w)
		} else {
			w.WriteHeader(http.StatusForbidden)
		}
	case "POST":
		var link model.Link

		decoder := json.NewDecoder(r.Body)
		decoder.Decode(&link)

		service.SaveLink(&link)

		w.WriteHeader(http.StatusOK)
	case "DELETE":
		linkId := util.ParseInt64FromQuery(r.URL, "id")

		service.DeleteLink(linkId)
		w.WriteHeader(http.StatusOK)
	default:
		w.WriteHeader(http.StatusMethodNotAllowed)
	}
}
func UserHandler(w http.ResponseWriter, r *UserRequest) {
	switch r.Method {
	case "GET":
		util.MarshalToResponseWriter(r.User, w)
	case "POST":
		var user model.User

		decoder := json.NewDecoder(r.Body)
		decoder.Decode(&user)

		valErr := validator.ValidateUser(&user)

		if !util.HandleBadRequest(valErr, w) {
			user = *service.SaveUser(&user)

			w.WriteHeader(http.StatusCreated)
			util.MarshalToResponseWriter(user, w)
		}
	default:
		w.WriteHeader(http.StatusMethodNotAllowed)
	}
}
func LinkGroupHandler(w http.ResponseWriter, r *UserRequest) {
	switch r.Method {
	case "GET":
		groups := service.GetLinkGroupsForUser(r.User)

		util.MarshalToResponseWriter(groups, w)
	case "POST":
		var group model.LinkGroup

		decoder := json.NewDecoder(r.Body)
		decoder.Decode(&group)
		group.User = r.User

		service.SaveLinkGroup(&group)
		w.WriteHeader(http.StatusOK)
	default:
		w.WriteHeader(http.StatusMethodNotAllowed)
	}
}