mgmt_api.go 2.0 KB

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