create.go 1.8 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677
  1. package policy
  2. import (
  3. "encoding/json"
  4. "net/http"
  5. "github.com/porter-dev/porter/api/server/handlers"
  6. "github.com/porter-dev/porter/api/server/shared"
  7. "github.com/porter-dev/porter/api/server/shared/apierrors"
  8. "github.com/porter-dev/porter/api/server/shared/config"
  9. "github.com/porter-dev/porter/api/types"
  10. "github.com/porter-dev/porter/internal/encryption"
  11. "github.com/porter-dev/porter/internal/models"
  12. )
  13. type PolicyCreateHandler struct {
  14. handlers.PorterHandlerReadWriter
  15. }
  16. func NewPolicyCreateHandler(
  17. config *config.Config,
  18. decoderValidator shared.RequestDecoderValidator,
  19. writer shared.ResultWriter,
  20. ) *PolicyCreateHandler {
  21. return &PolicyCreateHandler{
  22. PorterHandlerReadWriter: handlers.NewDefaultPorterHandler(config, decoderValidator, writer),
  23. }
  24. }
  25. func (p *PolicyCreateHandler) ServeHTTP(w http.ResponseWriter, r *http.Request) {
  26. user, _ := r.Context().Value(types.UserScope).(*models.User)
  27. proj, _ := r.Context().Value(types.ProjectScope).(*models.Project)
  28. req := &types.CreatePolicy{}
  29. if ok := p.DecodeAndValidate(w, r, req); !ok {
  30. return
  31. }
  32. uid, err := encryption.GenerateRandomBytes(16)
  33. if err != nil {
  34. p.HandleAPIError(w, r, apierrors.NewErrInternal(err))
  35. return
  36. }
  37. policyBytes, err := json.Marshal(req.Policy)
  38. if err != nil {
  39. p.HandleAPIError(w, r, apierrors.NewErrInternal(err))
  40. return
  41. }
  42. policy := &models.Policy{
  43. ProjectID: proj.ID,
  44. UniqueID: uid,
  45. CreatedByUserID: user.ID,
  46. Name: req.Name,
  47. PolicyBytes: policyBytes,
  48. }
  49. policy, err = p.Repo().Policy().CreatePolicy(policy)
  50. if err != nil {
  51. p.HandleAPIError(w, r, apierrors.NewErrInternal(err))
  52. return
  53. }
  54. res, err := policy.ToAPIPolicyType()
  55. if err != nil {
  56. p.HandleAPIError(w, r, apierrors.NewErrInternal(err))
  57. return
  58. }
  59. p.WriteResult(w, r, res)
  60. }