feat: configurable rate limiting and comprehensive E2E test suite

Rate Limiting Configuration:
- Add ACKIFY_AUTH_MAGICLINK_RATE_LIMIT_EMAIL (default: 3/hour)
- Add ACKIFY_AUTH_MAGICLINK_RATE_LIMIT_IP (default: 10/hour)
- Add ACKIFY_AUTH_RATE_LIMIT (default: 5/min)
- Add ACKIFY_DOCUMENT_RATE_LIMIT (default: 10/min)
- Add ACKIFY_GENERAL_RATE_LIMIT (default: 100/min)

E2E Test Suite:
- 01-signature-workflow: Complete signature flow validation
- 02-signature-uniqueness: Constraint enforcement and duplicate prevention
- 03-admin-signers-management: Expected signers CRUD operations
- 04-admin-email-reminders: SMTP reminder functionality
- 05-document-creation-by-url: URL-based document initialization
- 06-my-signatures-page: User signature list and navigation
- 07-admin-document-deletion: Cascade deletion verification
- 08-admin-route-protection: Access control validation
- 09-complete-workflow: End-to-end multi-user scenario
- 10-unexpected-signatures: Handling of non-expected signers
This commit is contained in:
Benjamin
2025-11-23 22:26:26 +01:00
parent 779aada760
commit 5cd91654e0
19 changed files with 1371 additions and 224 deletions
+9 -4
View File
@@ -115,10 +115,12 @@ func NewServer(ctx context.Context, cfg *config.Config, frontend embed.FS, versi
}
magicLinkService := services.NewMagicLinkService(services.MagicLinkServiceConfig{
Repository: magicLinkRepo,
EmailSender: emailSender,
BaseURL: cfg.App.BaseURL,
AppName: cfg.App.Organisation,
Repository: magicLinkRepo,
EmailSender: emailSender,
BaseURL: cfg.App.BaseURL,
AppName: cfg.App.Organisation,
RateLimitPerEmail: cfg.Auth.MagicLinkRateLimitEmail,
RateLimitPerIP: cfg.Auth.MagicLinkRateLimitIP,
})
// Initialize Magic Link cleanup worker
@@ -178,6 +180,9 @@ func NewServer(ctx context.Context, cfg *config.Config, frontend embed.FS, versi
OAuthEnabled: cfg.Auth.OAuthEnabled,
MagicLinkEnabled: cfg.Auth.MagicLinkEnabled,
OnlyAdminCanCreate: cfg.App.OnlyAdminCanCreate,
AuthRateLimit: cfg.App.AuthRateLimit,
DocumentRateLimit: cfg.App.DocumentRateLimit,
GeneralRateLimit: cfg.App.GeneralRateLimit,
}
apiRouter := api.NewRouter(apiConfig)
router.Mount("/api/v1", apiRouter)