Core functionality for new aiterp.net servers
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

95 lines
1.9 KiB

7 years ago
7 years ago
7 years ago
7 years ago
7 years ago
7 years ago
7 years ago
7 years ago
7 years ago
  1. package wrouter
  2. import (
  3. "net/http"
  4. "strings"
  5. "git.aiterp.net/gisle/wrouter/response"
  6. "git.aiterp.net/gisle/wrouter/auth"
  7. )
  8. type Func func(http.ResponseWriter, *http.Request, *auth.User)
  9. type IDFunc func(http.ResponseWriter, *http.Request, string, *auth.User)
  10. type Resource struct {
  11. list Func
  12. create Func
  13. get IDFunc
  14. update IDFunc
  15. delete IDFunc
  16. PrivateRead bool
  17. PrivateWrite bool
  18. }
  19. func NewResource(list, create Func, get, update, delete IDFunc) *Resource {
  20. return &Resource{list, create, get, update, delete, false, false}
  21. }
  22. func (resource *Resource) Handle(path string, w http.ResponseWriter, req *http.Request, user *auth.User) bool {
  23. // Get the subpath out of the path
  24. subpath := req.URL.Path[len(path):]
  25. if subpath[0] == '/' {
  26. subpath = subpath[1:]
  27. }
  28. // Error out on bad IDs which contains /es
  29. if x := strings.Index(subpath, "/"); x != -1 {
  30. w.Header().Set("Content-Type", "text/plain; charset=utf-8")
  31. w.WriteHeader(400)
  32. w.Write([]byte("Invalid ID: " + subpath))
  33. return true
  34. }
  35. // Route it to the resource
  36. switch req.Method {
  37. case "GET":
  38. {
  39. if resource.PrivateRead && user == nil {
  40. response.Text(w, 401, "Not logged in")
  41. return true
  42. }
  43. if subpath != "" {
  44. resource.get(w, req, subpath, user)
  45. } else {
  46. resource.list(w, req, user)
  47. }
  48. }
  49. case "POST":
  50. {
  51. if resource.PrivateWrite && user == nil {
  52. response.Text(w, 401, "Not logged in")
  53. return true
  54. }
  55. if subpath != "" {
  56. response.Text(w, 400, "ID not allowed in POST")
  57. return true
  58. }
  59. resource.create(w, req, user)
  60. }
  61. case "PATCH", "PUT":
  62. {
  63. if resource.PrivateWrite && user == nil {
  64. response.Text(w, 401, "Not logged in")
  65. return true
  66. }
  67. resource.update(w, req, subpath, user)
  68. }
  69. case "DELETE":
  70. {
  71. if resource.PrivateWrite && user == nil {
  72. response.Text(w, 401, "Not logged in")
  73. return true
  74. }
  75. resource.delete(w, req, subpath, user)
  76. }
  77. }
  78. return true
  79. }