2
0

create.go 2.4 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192
  1. // +build ee
  2. package invite
  3. import (
  4. "fmt"
  5. "net/http"
  6. "time"
  7. "github.com/porter-dev/porter/api/server/handlers"
  8. "github.com/porter-dev/porter/api/server/shared"
  9. "github.com/porter-dev/porter/api/server/shared/apierrors"
  10. "github.com/porter-dev/porter/api/server/shared/config"
  11. "github.com/porter-dev/porter/api/types"
  12. "github.com/porter-dev/porter/internal/models"
  13. "github.com/porter-dev/porter/internal/notifier"
  14. "github.com/porter-dev/porter/internal/oauth"
  15. )
  16. type InviteCreateHandler struct {
  17. handlers.PorterHandlerReadWriter
  18. }
  19. func NewInviteCreateHandler(
  20. config *config.Config,
  21. decoderValidator shared.RequestDecoderValidator,
  22. writer shared.ResultWriter,
  23. ) http.Handler {
  24. return &InviteCreateHandler{
  25. PorterHandlerReadWriter: handlers.NewDefaultPorterHandler(config, decoderValidator, writer),
  26. }
  27. }
  28. func (c *InviteCreateHandler) ServeHTTP(w http.ResponseWriter, r *http.Request) {
  29. user, _ := r.Context().Value(types.UserScope).(*models.User)
  30. project, _ := r.Context().Value(types.ProjectScope).(*models.Project)
  31. request := &types.CreateInviteRequest{}
  32. if ok := c.DecodeAndValidate(w, r, request); !ok {
  33. return
  34. }
  35. // create invite model
  36. invite, err := CreateInviteWithProject(request, project.ID)
  37. if err != nil {
  38. c.HandleAPIError(w, r, apierrors.NewErrInternal(err))
  39. return
  40. }
  41. // write to database
  42. invite, err = c.Repo().Invite().CreateInvite(invite)
  43. if err != nil {
  44. c.HandleAPIError(w, r, apierrors.NewErrInternal(err))
  45. return
  46. }
  47. // app.Logger.Info().Msgf("New invite created: %d", invite.ID)
  48. if err := c.Config().UserNotifier.SendProjectInviteEmail(
  49. &notifier.SendProjectInviteEmailOpts{
  50. InviteeEmail: request.Email,
  51. URL: fmt.Sprintf("%s/api/projects/%d/invites/%s", c.Config().ServerConf.ServerURL, project.ID, invite.Token),
  52. Project: project.Name,
  53. ProjectOwnerEmail: user.Email,
  54. },
  55. ); err != nil {
  56. c.HandleAPIError(w, r, apierrors.NewErrInternal(err))
  57. return
  58. }
  59. res := types.CreateInviteResponse{
  60. Invite: invite.ToInviteType(),
  61. }
  62. c.WriteResult(w, r, res)
  63. }
  64. func CreateInviteWithProject(invite *types.CreateInviteRequest, projectID uint) (*models.Invite, error) {
  65. // generate a token and an expiry time
  66. expiry := time.Now().Add(24 * time.Hour)
  67. return &models.Invite{
  68. Email: invite.Email,
  69. Kind: invite.Kind,
  70. Expiry: &expiry,
  71. ProjectID: projectID,
  72. Token: oauth.CreateRandomState(),
  73. }, nil
  74. }