cleanup
CI / Frontend (push) Successful in 11m7s
CI / Go - apps/auth-service (push) Failing after 8s
CI / Go - apps/backend (push) Failing after 2s
CI / Docker publish - auth-service (push) Has been skipped
CI / Docker publish - backend (push) Has been skipped

This commit is contained in:
Tomas Dvorak
2026-05-05 09:48:15 +02:00
parent 48c3e15a38
commit cf3315e8fc
155 changed files with 70334 additions and 19015 deletions
+20 -30
View File
@@ -13,6 +13,7 @@ import (
"bookra/apps/backend/internal/config"
"bookra/apps/backend/internal/db"
"bookra/apps/backend/internal/domain"
"bookra/apps/backend/internal/shared"
paddle "github.com/PaddleHQ/paddle-go-sdk/v5"
"github.com/jackc/pgx/v5"
@@ -95,11 +96,11 @@ func (s *Service) GetSubscription(ctx context.Context, principal domain.Principa
if err != nil {
if errors.Is(err, pgx.ErrNoRows) {
return toSnapshot(membership.Tenant, db.BillingSnapshotRecord{
TenantID: membership.Tenant.ID,
BillingProvider: "paddle",
Status: firstNonEmpty(membership.Tenant.SubscriptionStatus, "inactive"),
PlanCode: normalizePlanCode(membership.Tenant.PlanCode),
Currency: "czk",
TenantID: membership.Tenant.ID,
BillingProvider: "paddle",
Status: firstNonEmpty(membership.Tenant.SubscriptionStatus, "inactive"),
PlanCode: shared.NormalizePlanCode(membership.Tenant.PlanCode),
Currency: "czk",
}, s.cfg), nil
}
return domain.SubscriptionSnapshot{}, err
@@ -155,11 +156,11 @@ func (s *Service) Refresh(ctx context.Context, principal domain.Principal) (doma
customerID := derefString(membership.Tenant.BillingCustomerID)
if customerID == "" {
return toSnapshot(membership.Tenant, db.BillingSnapshotRecord{
TenantID: membership.Tenant.ID,
BillingProvider: "paddle",
Status: "inactive",
PlanCode: normalizePlanCode(membership.Tenant.PlanCode),
Currency: "czk",
TenantID: membership.Tenant.ID,
BillingProvider: "paddle",
Status: "inactive",
PlanCode: shared.NormalizePlanCode(membership.Tenant.PlanCode),
Currency: "czk",
}, s.cfg), nil
}
if s.client == nil {
@@ -321,7 +322,7 @@ func (s *Service) syncPaddleData(ctx context.Context, tenant db.TenantRecord, cu
BillingCustomerID: customerID,
BillingSubscriptionID: "",
Status: "inactive",
PlanCode: normalizePlanCode(tenant.PlanCode),
PlanCode: shared.NormalizePlanCode(tenant.PlanCode),
Currency: "czk",
PriceID: "",
LastSyncedAt: &now,
@@ -352,9 +353,9 @@ func (s *Service) syncPaddleData(ctx context.Context, tenant db.TenantRecord, cu
func toSnapshot(tenant db.TenantRecord, record db.BillingSnapshotRecord, cfg config.Config) domain.SubscriptionSnapshot {
if record.PlanCode == "" {
record.PlanCode = normalizePlanCode(tenant.PlanCode)
record.PlanCode = shared.NormalizePlanCode(tenant.PlanCode)
} else {
record.PlanCode = normalizePlanCode(record.PlanCode)
record.PlanCode = shared.NormalizePlanCode(record.PlanCode)
}
record.Currency = normalizeCurrency(record.Currency)
if record.Status == "" {
@@ -388,7 +389,7 @@ func toSnapshot(tenant db.TenantRecord, record db.BillingSnapshotRecord, cfg con
}
func entitlementsForPlan(planCode string) domain.PlanEntitlements {
switch normalizePlanCode(planCode) {
switch shared.NormalizePlanCode(planCode) {
case "starter":
return domain.PlanEntitlements{MaxLocations: 1, MaxStaff: 3, EmailReminders: true, AdvancedReporting: false, WidgetEmbedding: true, UmamiTracking: false}
case "business":
@@ -402,15 +403,15 @@ func (s *Service) planCodeForPrice(priceID string, fallback string) string {
for planCode, currencies := range s.cfg.PaddlePriceMatrix {
for _, configuredPriceID := range currencies {
if configuredPriceID != "" && configuredPriceID == priceID {
return normalizePlanCode(planCode)
return shared.NormalizePlanCode(planCode)
}
}
}
return normalizePlanCode(fallback)
return shared.NormalizePlanCode(fallback)
}
func (s *Service) priceForPlan(planCode string, currency string) (string, string, string) {
resolvedPlan := normalizePlanCode(strings.TrimSpace(planCode))
resolvedPlan := shared.NormalizePlanCode(strings.TrimSpace(planCode))
if resolvedPlan == "" {
resolvedPlan = "pro"
}
@@ -444,7 +445,7 @@ func subscriptionRank(subscription *paddle.Subscription) int {
}
func displayPricesForPlan(planCode string) []domain.PlanDisplayPrice {
switch normalizePlanCode(planCode) {
switch shared.NormalizePlanCode(planCode) {
case "starter":
return []domain.PlanDisplayPrice{
{Currency: "czk", AmountCents: 11900, Formatted: "119 Kc"},
@@ -463,17 +464,6 @@ func displayPricesForPlan(planCode string) []domain.PlanDisplayPrice {
}
}
func normalizePlanCode(planCode string) string {
switch strings.TrimSpace(planCode) {
case "growth":
return "pro"
case "multi-location":
return "business"
default:
return strings.TrimSpace(planCode)
}
}
func normalizeCurrency(currency string) string {
switch strings.ToLower(strings.TrimSpace(currency)) {
case "usd":
@@ -498,7 +488,7 @@ func checkoutAvailable(cfg config.Config, planCode string) bool {
if !cfg.PaddleConfigured() || !cfg.PaddleWebhookConfigured() {
return false
}
planCode = normalizePlanCode(planCode)
planCode = shared.NormalizePlanCode(planCode)
for _, priceID := range cfg.PaddlePriceMatrix[planCode] {
if strings.TrimSpace(priceID) != "" {
return true