mgmt_api.go 1.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475
  1. package server
  2. import (
  3. "encoding/json"
  4. "fmt"
  5. "log/slog"
  6. "net"
  7. "net/http"
  8. "os"
  9. "github.com/google/uuid"
  10. )
  11. func StartManagementAPI(fs *FeedbagStore, logger *slog.Logger) {
  12. http.HandleFunc("/user", func(w http.ResponseWriter, r *http.Request) {
  13. switch r.Method {
  14. case http.MethodGet:
  15. getUsers(fs, w, r)
  16. case http.MethodPost:
  17. createUser(fs, w, r)
  18. default:
  19. http.Error(w, "Method not allowed", http.StatusMethodNotAllowed)
  20. }
  21. })
  22. //todo make port configurable
  23. addr := Address("", 8080)
  24. listener, err := net.Listen("tcp", addr)
  25. if err != nil {
  26. logger.Error("unable to bind management API address address", "err", err.Error())
  27. os.Exit(1)
  28. }
  29. logger.Info("starting management API server", "addr", addr)
  30. if err := http.Serve(listener, nil); err != nil {
  31. logger.Info("unable to start management API server", "err", err.Error())
  32. os.Exit(1)
  33. }
  34. }
  35. // getUsers handles the GET /user endpoint.
  36. func getUsers(fs *FeedbagStore, w http.ResponseWriter, r *http.Request) {
  37. w.Header().Set("Content-Type", "application/json")
  38. users, err := fs.Users()
  39. if err != nil {
  40. http.Error(w, err.Error(), http.StatusInternalServerError)
  41. return
  42. }
  43. if err := json.NewEncoder(w).Encode(users); err != nil {
  44. http.Error(w, err.Error(), http.StatusInternalServerError)
  45. return
  46. }
  47. }
  48. type CreateUser struct {
  49. User
  50. Password string `json:"password,omitempty"`
  51. }
  52. // createUser handles the POST /user endpoint.
  53. func createUser(fs *FeedbagStore, w http.ResponseWriter, r *http.Request) {
  54. var newUser CreateUser
  55. if err := json.NewDecoder(r.Body).Decode(&newUser); err != nil {
  56. http.Error(w, err.Error(), http.StatusBadRequest)
  57. return
  58. }
  59. newUser.AuthKey = uuid.New().String()
  60. // todo does the request contain authkey?
  61. newUser.HashPassword(newUser.Password)
  62. if err := fs.InsertUser(newUser.User); err != nil {
  63. http.Error(w, err.Error(), http.StatusInternalServerError)
  64. return
  65. }
  66. w.WriteHeader(http.StatusCreated)
  67. fmt.Fprintln(w, "User account created successfully.")
  68. }