Skip to content

Commit 7131093

Browse files
committed
Create ability to search user by email after payment
1 parent 2f58a83 commit 7131093

File tree

3 files changed

+53
-2
lines changed

3 files changed

+53
-2
lines changed

api/pkg/repositories/gorm_user_repository.go

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -103,6 +103,28 @@ func (repository *gormUserRepository) LoadBySubscriptionID(ctx context.Context,
103103
return user, nil
104104
}
105105

106+
func (repository *gormUserRepository) LoadByEmail(ctx context.Context, email string) (*entities.User, error) {
107+
ctx, span := repository.tracer.Start(ctx)
108+
defer span.End()
109+
110+
user := new(entities.User)
111+
err := repository.db.WithContext(ctx).
112+
Where("email = ?", email).
113+
First(user).
114+
Error
115+
if errors.Is(err, gorm.ErrRecordNotFound) {
116+
msg := fmt.Sprintf("user with email [%s] does not exist", email)
117+
return nil, repository.tracer.WrapErrorSpan(span, stacktrace.PropagateWithCode(err, ErrCodeNotFound, msg))
118+
}
119+
120+
if err != nil {
121+
msg := fmt.Sprintf("cannot load user with email ID [%s]", email)
122+
return nil, repository.tracer.WrapErrorSpan(span, stacktrace.Propagate(err, msg))
123+
}
124+
125+
return user, nil
126+
}
127+
106128
func (repository *gormUserRepository) Store(ctx context.Context, user *entities.User) error {
107129
ctx, span := repository.tracer.Start(ctx)
108130
defer span.End()

api/pkg/repositories/user_repository.go

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,9 @@ type UserRepository interface {
2929
// LoadBySubscriptionID loads a user based on the lemonsqueezy subscriptionID
3030
LoadBySubscriptionID(ctx context.Context, subscriptionID string) (*entities.User, error)
3131

32+
// LoadByEmail loads a user based on the email
33+
LoadByEmail(ctx context.Context, email string) (*entities.User, error)
34+
3235
// Delete an entities.User by entities.UserID
3336
Delete(ctx context.Context, user *entities.User) error
3437
}

api/pkg/services/lemonsqueezy_service.go

Lines changed: 28 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@ import (
1111
"github.com/NdoleStudio/httpsms/pkg/entities"
1212
"github.com/NdoleStudio/httpsms/pkg/events"
1313
"github.com/NdoleStudio/httpsms/pkg/telemetry"
14-
lemonsqueezy "github.com/NdoleStudio/lemonsqueezy-go"
14+
"github.com/NdoleStudio/lemonsqueezy-go"
1515
"github.com/palantir/stacktrace"
1616
)
1717

@@ -39,13 +39,39 @@ func NewLemonsqueezyService(
3939
}
4040
}
4141

42+
// GetUserID gets the user ID from the request
43+
func (service *LemonsqueezyService) GetUserID(ctx context.Context, request *lemonsqueezy.WebhookRequestSubscription) (entities.UserID, error) {
44+
ctx, span, ctxLogger := service.tracer.StartWithLogger(ctx, service.logger)
45+
defer span.End()
46+
47+
userID, ok := request.Meta.CustomData["user_id"].(string)
48+
if ok {
49+
return entities.UserID(userID), nil
50+
}
51+
52+
ctxLogger.Info(fmt.Sprintf("user_id not found in request meta data. Searching via email [%s]", request.Data.Attributes.UserEmail))
53+
user, err := service.userRepository.LoadByEmail(ctx, request.Data.Attributes.UserEmail)
54+
if err != nil {
55+
msg := fmt.Sprintf("cannot load user with email [%s]", request.Data.Attributes.UserEmail)
56+
return "", service.tracer.WrapErrorSpan(span, stacktrace.Propagate(err, msg))
57+
}
58+
59+
return user.ID, nil
60+
}
61+
4262
// HandleSubscriptionCreatedEvent handles the subscription_created lemonsqueezy event
4363
func (service *LemonsqueezyService) HandleSubscriptionCreatedEvent(ctx context.Context, source string, request *lemonsqueezy.WebhookRequestSubscription) error {
4464
ctx, span, ctxLogger := service.tracer.StartWithLogger(ctx, service.logger)
4565
defer span.End()
4666

67+
userID, err := service.GetUserID(ctx, request)
68+
if err != nil {
69+
msg := fmt.Sprintf("cannot get user ID for subscription created event with ID [%s]", request.Data.ID)
70+
return stacktrace.Propagate(err, msg)
71+
}
72+
4773
payload := &events.UserSubscriptionCreatedPayload{
48-
UserID: entities.UserID(request.Meta.CustomData["user_id"].(string)),
74+
UserID: userID,
4975
SubscriptionCreatedAt: request.Data.Attributes.CreatedAt,
5076
SubscriptionID: request.Data.ID,
5177
SubscriptionName: service.subscriptionName(request.Data.Attributes.VariantName),

0 commit comments

Comments
 (0)