referrals.go 2.7 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879
  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/telemetry"
  11. )
  12. // GetProjectReferralDetailsHandler is a handler for getting a project's referral code
  13. type GetProjectReferralDetailsHandler struct {
  14. handlers.PorterHandlerWriter
  15. }
  16. // NewGetProjectReferralDetailsHandler returns an instance of GetProjectReferralDetailsHandler
  17. func NewGetProjectReferralDetailsHandler(
  18. config *config.Config,
  19. writer shared.ResultWriter,
  20. ) *GetProjectReferralDetailsHandler {
  21. return &GetProjectReferralDetailsHandler{
  22. PorterHandlerWriter: handlers.NewDefaultPorterHandler(config, nil, writer),
  23. }
  24. }
  25. func (c *GetProjectReferralDetailsHandler) ServeHTTP(w http.ResponseWriter, r *http.Request) {
  26. ctx, span := telemetry.NewSpan(r.Context(), "serve-get-project-referral-details")
  27. defer span.End()
  28. proj, _ := ctx.Value(types.ProjectScope).(*models.Project)
  29. telemetry.WithAttributes(span,
  30. telemetry.AttributeKV{Key: "lago-config-exists", Value: c.Config().BillingManager.LagoConfigLoaded},
  31. telemetry.AttributeKV{Key: "lago-enabled", Value: proj.GetFeatureFlag(models.LagoEnabled, c.Config().LaunchDarklyClient)},
  32. )
  33. if !c.Config().BillingManager.LagoConfigLoaded || !proj.GetFeatureFlag(models.LagoEnabled, c.Config().LaunchDarklyClient) || !proj.EnableSandbox {
  34. c.WriteResult(w, r, "")
  35. return
  36. }
  37. if proj.ReferralCode == "" {
  38. telemetry.WithAttributes(span,
  39. telemetry.AttributeKV{Key: "referral-code-exists", Value: false},
  40. )
  41. // Generate referral code for project if not present
  42. proj.ReferralCode = models.NewReferralCode()
  43. _, err := c.Repo().Project().UpdateProject(proj)
  44. if err != nil {
  45. err := telemetry.Error(ctx, span, err, "error updating project")
  46. c.HandleAPIError(w, r, apierrors.NewErrInternal(err))
  47. return
  48. }
  49. }
  50. referralCount, err := c.Repo().Referral().CountReferralsByProjectID(proj.ID, models.ReferralStatusCompleted)
  51. if err != nil {
  52. err := telemetry.Error(ctx, span, err, "error listing referrals by project id")
  53. c.HandleAPIError(w, r, apierrors.NewErrInternal(err))
  54. return
  55. }
  56. referralCodeResponse := struct {
  57. Code string `json:"code"`
  58. ReferralCount int64 `json:"referral_count"`
  59. MaxAllowedRewards int64 `json:"max_allowed_referrals"`
  60. }{
  61. Code: proj.ReferralCode,
  62. ReferralCount: referralCount,
  63. MaxAllowedRewards: c.Config().BillingManager.LagoClient.MaxReferralRewards,
  64. }
  65. c.WriteResult(w, r, referralCodeResponse)
  66. }