Skip to content

Commit 12540d0

Browse files
authored
Merge pull request #41 from Zenfulcode/development
Development
2 parents 2df2a13 + 1d3edd5 commit 12540d0

47 files changed

Lines changed: 3174 additions & 361 deletions

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

.env.example

Lines changed: 2 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -4,12 +4,6 @@ DB_USER=
44
DB_PASSWORD=
55
DB_NAME=commercify
66

7-
TEST_DB_HOST=localhost
8-
TEST_DB_PORT=5432
9-
TEST_DB_USER=postgres
10-
TEST_DB_PASSWORD=postgres
11-
TEST_DB_NAME=commercify_test
12-
137
AUTH_JWT_SECRET=your_jwt_secret
148

159
EMAIL_ENABLED=true
@@ -27,11 +21,6 @@ STRIPE_PUBLIC_KEY=pk_test_your_key
2721
STRIPE_WEBHOOK_SECRET=whsec_your_webhook_signing_secret
2822
STRIPE_PAYMENT_DESCRIPTION=Commercify Store Purchase
2923

30-
PAYPAL_ENABLED=true
31-
PAYPAL_CLIENT_ID=your_client_id
32-
PAYPAL_CLIENT_SECRET=your_client_secret
33-
PAYPAL_SANDBOX=true
34-
3524
MOBILEPAY_ENABLED=false
3625
MOBILEPAY_TEST_MODE=true
3726
MOBILEPAY_MERCHANT_SERIAL_NUMBER=your_merchant_serial_number
@@ -42,4 +31,5 @@ MOBILEPAY_WEBHOOK_URL=https://your-site.com/api/webhooks/mobilepay
4231
MOBILEPAY_PAYMENT_DESCRIPTION=Commercify Store Purchase
4332
MOBILEPAY_MARKET=NOK
4433

45-
RETURN_URL=https://your-site.com/payment/complete
34+
RETURN_URL=https://your-site.com/payment/complete
35+
CORS_ALLOWED_ORIGINS=http://localhost:3000,http://localhost:5173

Makefile

Lines changed: 28 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
.PHONY: help db-start db-stop db-restart db-logs db-clean migrate-up migrate-down seed-data build run test clean
1+
.PHONY: help db-start db-stop db-restart db-logs db-clean migrate-up migrate-down seed-data build run test clean docker-build docker-build-tag docker-push docker-build-push
22

33
# Default target
44
help: ## Show this help message
@@ -41,6 +41,7 @@ build: ## Build the application
4141
go build -o bin/api ./cmd/api
4242
go build -o bin/migrate ./cmd/migrate
4343
go build -o bin/seed ./cmd/seed
44+
go build -o bin/expire-checkouts ./cmd/expire-checkouts
4445

4546
run: db-start ## Run the application locally with database
4647
@echo "Starting database and waiting for it to be ready..."
@@ -56,6 +57,28 @@ stop-docker: ## Stop the entire application stack
5657
logs: ## Show application logs
5758
docker compose logs -f api
5859

60+
# Docker image commands
61+
docker-build: ## Build Docker image
62+
docker build -t ghcr.io/zenfulcode/commercifygo:latest .
63+
64+
docker-build-tag: ## Build Docker image with specific tag (use TAG=version)
65+
@if [ -z "$(TAG)" ]; then echo "Error: TAG is required. Use: make docker-build-tag TAG=v1.0.0"; exit 1; fi
66+
docker build -t ghcr.io/zenfulcode/commercifygo:$(TAG) -t ghcr.io/zenfulcode/commercifygo:latest -t ghcr.io/zenfulcode/commercifygo:dev .
67+
68+
docker-push: ## Push Docker image to registry (use REGISTRY and TAG)
69+
@if [ -z "$(REGISTRY)" ]; then echo "Error: REGISTRY is required. Use: make docker-push REGISTRY=your-registry.com"; exit 1; fi
70+
@if [ -z "$(TAG)" ]; then echo "Error: TAG is required. Use: make docker-push REGISTRY=your-registry.com TAG=v1.0.0"; exit 1; fi
71+
# docker tag $(REGISTRY)commercifygo:$(TAG) $(REGISTRY)/commercifygo:$(TAG)
72+
# docker tag $(REGISTRY)commercifygo:latest $(REGISTRY)/commercifygo:latest
73+
docker push $(REGISTRY)/commercifygo:$(TAG)
74+
docker push $(REGISTRY)/commercifygo:latest
75+
docker push $(REGISTRY)/commercifygo:dev
76+
77+
docker-build-push: docker-build-tag docker-push ## Build and push Docker image (use REGISTRY and TAG)
78+
79+
docker-dev-build: ## Build Docker image for development
80+
docker build -t ghcr.io/zenfulcode/commercifygo:dev .
81+
5982
# Development commands
6083
test: ## Run tests
6184
go test ./...
@@ -83,3 +106,7 @@ vet: ## Run go vet
83106

84107
mod-tidy: ## Tidy Go modules
85108
go mod tidy
109+
110+
# Maintenance commands
111+
expire-checkouts: ## Expire old checkouts manually
112+
go run ./cmd/expire-checkouts

cmd/api/main.go

Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -48,6 +48,9 @@ func main() {
4848
// Initialize API server
4949
server := api.NewServer(cfg, db, logger)
5050

51+
// Start background checkout expiry process
52+
go startCheckoutExpiryProcess(server, logger)
53+
5154
// Start server in a goroutine
5255
go func() {
5356
logger.Info("Starting server on port %s", cfg.Server.Port)
@@ -73,3 +76,35 @@ func main() {
7376

7477
logger.Info("Server exited properly")
7578
}
79+
80+
// startCheckoutExpiryProcess runs a background process to expire old checkouts
81+
func startCheckoutExpiryProcess(server *api.Server, logger logger.Logger) {
82+
// Run every 15 minutes
83+
ticker := time.NewTicker(15 * time.Minute)
84+
defer ticker.Stop()
85+
86+
// Run immediately on startup
87+
expireCheckouts(server, logger)
88+
89+
for range ticker.C {
90+
expireCheckouts(server, logger)
91+
}
92+
}
93+
94+
// expireCheckouts expires old checkouts
95+
func expireCheckouts(server *api.Server, logger logger.Logger) {
96+
checkoutUseCase := server.GetContainer().UseCases().CheckoutUseCase()
97+
if checkoutUseCase == nil {
98+
logger.Error("CheckoutUseCase not available")
99+
return
100+
}
101+
102+
result, err := checkoutUseCase.ExpireOldCheckouts()
103+
if err != nil {
104+
logger.Error("Failed to expire old checkouts: %v", err)
105+
} else {
106+
logger.Info("Checkout cleanup completed: %d abandoned, %d deleted, %d expired (total: %d)",
107+
result.AbandonedCount, result.DeletedCount, result.ExpiredCount,
108+
result.AbandonedCount+result.DeletedCount+result.ExpiredCount)
109+
}
110+
}

cmd/expire-checkouts/main.go

Lines changed: 53 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,53 @@
1+
package main
2+
3+
import (
4+
"log"
5+
6+
"github.com/joho/godotenv"
7+
"github.com/zenfulcode/commercify/config"
8+
"github.com/zenfulcode/commercify/internal/infrastructure/container"
9+
"github.com/zenfulcode/commercify/internal/infrastructure/database"
10+
"github.com/zenfulcode/commercify/internal/infrastructure/logger"
11+
)
12+
13+
func main() {
14+
// Load environment variables
15+
if err := godotenv.Load(); err != nil {
16+
log.Println("No .env file found, using environment variables")
17+
}
18+
19+
// Initialize logger
20+
logger := logger.NewLogger()
21+
logger.Info("Starting checkout expiry cleanup tool")
22+
23+
// Load configuration
24+
cfg, err := config.LoadConfig()
25+
if err != nil {
26+
logger.Fatal("Failed to load configuration: %v", err)
27+
}
28+
29+
// Connect to database
30+
db, err := database.NewPostgresConnection(cfg.Database)
31+
if err != nil {
32+
logger.Fatal("Failed to connect to database: %v", err)
33+
}
34+
defer db.Close()
35+
36+
// Initialize dependency container
37+
diContainer := container.NewContainer(cfg, db, logger)
38+
39+
// Get checkout use case
40+
checkoutUseCase := diContainer.UseCases().CheckoutUseCase()
41+
42+
// Expire old checkouts
43+
result, err := checkoutUseCase.ExpireOldCheckouts()
44+
if err != nil {
45+
logger.Fatal("Failed to expire old checkouts: %v", err)
46+
}
47+
48+
logger.Info("Checkout cleanup completed:")
49+
logger.Info("- Abandoned checkouts: %d", result.AbandonedCount)
50+
logger.Info("- Deleted checkouts: %d", result.DeletedCount)
51+
logger.Info("- Expired checkouts: %d", result.ExpiredCount)
52+
logger.Info("Total processed: %d", result.AbandonedCount+result.DeletedCount+result.ExpiredCount)
53+
}

0 commit comments

Comments
 (0)