create.go 4.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136
  1. package invite
  2. import (
  3. "net/http"
  4. "time"
  5. "github.com/porter-dev/porter/internal/telemetry"
  6. "github.com/porter-dev/porter/api/server/handlers"
  7. "github.com/porter-dev/porter/api/server/shared"
  8. "github.com/porter-dev/porter/api/server/shared/apierrors"
  9. "github.com/porter-dev/porter/api/server/shared/config"
  10. "github.com/porter-dev/porter/api/types"
  11. "github.com/porter-dev/porter/internal/models"
  12. "github.com/porter-dev/porter/internal/oauth"
  13. )
  14. type InviteCreateHandler struct {
  15. handlers.PorterHandlerReadWriter
  16. }
  17. func NewInviteCreateHandler(
  18. config *config.Config,
  19. decoderValidator shared.RequestDecoderValidator,
  20. writer shared.ResultWriter,
  21. ) http.Handler {
  22. return &InviteCreateHandler{
  23. PorterHandlerReadWriter: handlers.NewDefaultPorterHandler(config, decoderValidator, writer),
  24. }
  25. }
  26. func (c *InviteCreateHandler) ServeHTTP(w http.ResponseWriter, r *http.Request) {
  27. ctx, span := telemetry.NewSpan(r.Context(), "serve-invite-create")
  28. defer span.End()
  29. user, _ := ctx.Value(types.UserScope).(*models.User)
  30. project, _ := ctx.Value(types.ProjectScope).(*models.Project)
  31. request := &types.CreateInviteRequest{}
  32. if ok := c.DecodeAndValidate(w, r, request); !ok {
  33. telemetry.WithAttributes(span, telemetry.AttributeKV{Key: "message", Value: "failed to decode and validate request"})
  34. return
  35. }
  36. //identities, _, err := c.Config().Ory.IdentityAPI.ListIdentities(context.WithValue(ctx, ory.ContextAccessToken, c.Config().OryApiKey)).CredentialsIdentifier(request.Email).Execute()
  37. //if err != nil {
  38. // fmt.Println("dgt ory", err.Error())
  39. // return
  40. //} else {
  41. // fmt.Println("dgt ory", identities)
  42. // return
  43. //}
  44. //
  45. //basicIdentityBody := ory.CreateIdentityBody{
  46. // SchemaId: "preset://email",
  47. // Traits: map[string]interface{}{"email": request.Email},
  48. //}
  49. //
  50. //fmt.Println("dgt ory", c.Config().OryApiKey)
  51. //
  52. //identity, _, err := c.Config().Ory.IdentityAPI.CreateIdentity(context.WithValue(ctx, ory.ContextAccessToken, c.Config().OryApiKey)).CreateIdentityBody(basicIdentityBody).Execute()
  53. //if err != nil {
  54. // err = telemetry.Error(ctx, span, err, "error creating identity")
  55. // c.HandleAPIError(w, r, apierrors.NewErrInternal(err))
  56. // return
  57. //}
  58. //
  59. //sevenDays := "7d"
  60. //createRecoveryBody := ory.CreateRecoveryLinkForIdentityBody{
  61. // ExpiresIn: &sevenDays,
  62. // IdentityId: identity.Id,
  63. //}
  64. //
  65. //recoveryLink, _, err := c.Config().Ory.IdentityAPI.CreateRecoveryLinkForIdentity(context.WithValue(ctx, ory.ContextAccessToken, c.Config().OryApiKey)).CreateRecoveryLinkForIdentityBody(createRecoveryBody).Execute()
  66. //if err != nil || recoveryLink == nil {
  67. // err = telemetry.Error(ctx, span, err, "error creating recovery link")
  68. // c.HandleAPIError(w, r, apierrors.NewErrInternal(err))
  69. // return
  70. //
  71. //}
  72. // create invite model
  73. invite, err := CreateInviteWithProject(request, project.ID)
  74. if err != nil {
  75. c.HandleAPIError(w, r, apierrors.NewErrInternal(telemetry.Error(ctx, span, err, "error creating invite with project")))
  76. return
  77. }
  78. invite.InvitingUserID = user.ID
  79. telemetry.WithAttributes(span,
  80. telemetry.AttributeKV{Key: "project-id", Value: invite.ProjectID},
  81. telemetry.AttributeKV{Key: "user-id", Value: invite.UserID},
  82. telemetry.AttributeKV{Key: "kind", Value: invite.Kind},
  83. )
  84. // write to database
  85. invite, err = c.Repo().Invite().CreateInvite(invite)
  86. if err != nil {
  87. c.HandleAPIError(w, r, apierrors.NewErrInternal(telemetry.Error(ctx, span, err, "error creating invite in repo")))
  88. return
  89. }
  90. //if err := c.Config().UserNotifier.SendProjectInviteEmail(
  91. // &notifier.SendProjectInviteEmailOpts{
  92. // InviteeEmail: request.Email,
  93. // URL: recoveryLink.RecoveryLink,
  94. // Project: project.Name,
  95. // ProjectOwnerEmail: user.Email,
  96. // },
  97. //); err != nil {
  98. // c.HandleAPIError(w, r, apierrors.NewErrInternal(telemetry.Error(ctx, span, err, "error sending project invite email")))
  99. // return
  100. //}
  101. res := types.CreateInviteResponse{
  102. Invite: invite.ToInviteType(),
  103. }
  104. c.WriteResult(w, r, res)
  105. }
  106. func CreateInviteWithProject(invite *types.CreateInviteRequest, projectID uint) (*models.Invite, error) {
  107. // generate a token and an expiry time
  108. expiry := time.Now().Add(7 * 24 * time.Hour)
  109. return &models.Invite{
  110. Token: oauth.CreateRandomState(),
  111. Expiry: &expiry,
  112. Email: invite.Email,
  113. Kind: invite.Kind,
  114. ProjectID: projectID,
  115. Status: models.InvitePending,
  116. }, nil
  117. }