create.go 1.9 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788
  1. package project
  2. import (
  3. "net/http"
  4. "github.com/porter-dev/porter/api/server/handlers"
  5. "github.com/porter-dev/porter/api/server/shared"
  6. "github.com/porter-dev/porter/api/server/shared/apierrors"
  7. "github.com/porter-dev/porter/api/server/shared/config"
  8. "github.com/porter-dev/porter/api/types"
  9. "github.com/porter-dev/porter/internal/models"
  10. "github.com/porter-dev/porter/internal/repository"
  11. )
  12. type ProjectCreateHandler struct {
  13. handlers.PorterHandlerReadWriter
  14. }
  15. func NewProjectCreateHandler(
  16. config *config.Config,
  17. decoderValidator shared.RequestDecoderValidator,
  18. writer shared.ResultWriter,
  19. ) *ProjectCreateHandler {
  20. return &ProjectCreateHandler{
  21. PorterHandlerReadWriter: handlers.NewDefaultPorterHandler(config, decoderValidator, writer),
  22. }
  23. }
  24. func (p *ProjectCreateHandler) ServeHTTP(w http.ResponseWriter, r *http.Request) {
  25. request := &types.CreateProjectRequest{}
  26. ok := p.DecodeAndValidate(w, r, request)
  27. if !ok {
  28. return
  29. }
  30. // read the user from context
  31. user, _ := r.Context().Value(types.UserScope).(*models.User)
  32. proj := &models.Project{
  33. Name: request.Name,
  34. }
  35. var err error
  36. proj, err = CreateProjectWithUser(p.Repo().Project(), proj, user)
  37. if err != nil {
  38. p.HandleAPIError(w, r, apierrors.NewErrInternal(err))
  39. return
  40. }
  41. p.WriteResult(w, r, proj.ToProjectType())
  42. }
  43. func CreateProjectWithUser(
  44. projectRepo repository.ProjectRepository,
  45. proj *models.Project,
  46. user *models.User,
  47. ) (*models.Project, error) {
  48. proj, err := projectRepo.CreateProject(proj)
  49. if err != nil {
  50. return nil, err
  51. }
  52. // create a new Role with the user as the admin
  53. _, err = projectRepo.CreateProjectRole(proj, &models.Role{
  54. Role: types.Role{
  55. UserID: user.ID,
  56. ProjectID: proj.ID,
  57. Kind: types.RoleAdmin,
  58. },
  59. })
  60. if err != nil {
  61. return nil, err
  62. }
  63. // read the project again to get the model with the role attached
  64. proj, err = projectRepo.ReadProject(proj.ID)
  65. if err != nil {
  66. return nil, err
  67. }
  68. return proj, nil
  69. }