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.

97 lines
2.5KB

  1. package main
  2. import (
  3. "bytes"
  4. "encoding/json"
  5. "html/template"
  6. "net/http"
  7. "path/filepath"
  8. "github.com/goanywhere/rex"
  9. "github.com/goanywhere/rex/livereload"
  10. )
  11. type User struct {
  12. Username string
  13. }
  14. func Index(w http.ResponseWriter, r *http.Request) {
  15. if html, err := template.ParseFiles(filepath.Join("views", "index.html")); err != nil {
  16. http.Error(w, err.Error(), http.StatusInternalServerError)
  17. } else {
  18. w.Header().Set("Content-Type", "text/html")
  19. var user = User{Username: rex.Env.String("USER", "guest")}
  20. html.Execute(w, user)
  21. }
  22. }
  23. type Response struct {
  24. Code int
  25. Text string
  26. }
  27. func JSON(next http.Handler) http.Handler {
  28. return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
  29. w.Header().Set("Content-Type", "application/json; charset=utf-8")
  30. next.ServeHTTP(w, r)
  31. })
  32. }
  33. func fetch(w http.ResponseWriter, r *http.Request) {
  34. w.WriteHeader(http.StatusOK)
  35. var buffer = new(bytes.Buffer)
  36. var response = Response{Code: http.StatusOK, Text: http.StatusText(http.StatusOK)}
  37. if err := json.NewEncoder(buffer).Encode(response); err == nil {
  38. w.Write(buffer.Bytes())
  39. } else {
  40. http.Error(w, err.Error(), http.StatusBadGateway)
  41. }
  42. }
  43. func create(w http.ResponseWriter, r *http.Request) {
  44. w.WriteHeader(http.StatusCreated)
  45. var buffer = new(bytes.Buffer)
  46. var response = Response{Code: http.StatusCreated, Text: http.StatusText(http.StatusCreated)}
  47. if err := json.NewEncoder(buffer).Encode(response); err == nil {
  48. w.Write(buffer.Bytes())
  49. } else {
  50. http.Error(w, err.Error(), http.StatusBadGateway)
  51. }
  52. }
  53. func update(w http.ResponseWriter, r *http.Request) {
  54. w.WriteHeader(http.StatusAccepted)
  55. var buffer = new(bytes.Buffer)
  56. var response = Response{Code: http.StatusAccepted, Text: http.StatusText(http.StatusAccepted)}
  57. if err := json.NewEncoder(buffer).Encode(response); err == nil {
  58. w.Write(buffer.Bytes())
  59. } else {
  60. http.Error(w, err.Error(), http.StatusBadGateway)
  61. }
  62. }
  63. func remove(w http.ResponseWriter, r *http.Request) {
  64. w.WriteHeader(http.StatusGone)
  65. var buffer = new(bytes.Buffer)
  66. var response = Response{Code: http.StatusGone, Text: http.StatusText(http.StatusGone)}
  67. if err := json.NewEncoder(buffer).Encode(response); err == nil {
  68. w.Write(buffer.Bytes())
  69. } else {
  70. http.Error(w, err.Error(), http.StatusBadGateway)
  71. }
  72. }
  73. func main() {
  74. rex.Use(livereload.Middleware)
  75. rex.Get("/", Index)
  76. apis := rex.Group("/v1/")
  77. apis.Use(JSON)
  78. apis.Get("/", fetch)
  79. apis.Post("/", create)
  80. apis.Put("/", update)
  81. apis.Delete("/", remove)
  82. rex.Run()
  83. }