Add Cloudflare email and collaboration workflows
This commit is contained in:
@@ -39,15 +39,18 @@ type AuthConfig struct {
|
||||
|
||||
type EmailConfig struct {
|
||||
// Provider selects the sender implementation. Valid values: "noop",
|
||||
// "smtp", "postmark". When empty, the loader infers from the other
|
||||
// fields: PostmarkToken wins, then SMTPHost, then NoOp.
|
||||
Provider string `json:"provider"`
|
||||
SMTPHost string `json:"smtpHost"`
|
||||
SMTPPort int `json:"smtpPort"`
|
||||
PostmarkToken string `json:"postmarkToken"`
|
||||
PostmarkAPIURL string `json:"postmarkApiUrl"`
|
||||
From string `json:"from"`
|
||||
InstanceName string `json:"instanceName"`
|
||||
// "smtp", "postmark", or "cloudflare". When empty, the loader infers
|
||||
// from credentials, then SMTPHost, then NoOp.
|
||||
Provider string `json:"provider"`
|
||||
SMTPHost string `json:"smtpHost"`
|
||||
SMTPPort int `json:"smtpPort"`
|
||||
PostmarkToken string `json:"postmarkToken"`
|
||||
PostmarkAPIURL string `json:"postmarkApiUrl"`
|
||||
CloudflareAccountID string `json:"cloudflareAccountId"`
|
||||
CloudflareAPIToken string `json:"cloudflareApiToken"`
|
||||
CloudflareAPIURL string `json:"cloudflareApiUrl"`
|
||||
From string `json:"from"`
|
||||
InstanceName string `json:"instanceName"`
|
||||
}
|
||||
|
||||
// ResolvedProvider returns the concrete provider choice after applying the
|
||||
@@ -56,6 +59,9 @@ func (e EmailConfig) ResolvedProvider() string {
|
||||
if e.Provider != "" {
|
||||
return e.Provider
|
||||
}
|
||||
if e.CloudflareAPIToken != "" || e.CloudflareAccountID != "" {
|
||||
return "cloudflare"
|
||||
}
|
||||
if e.PostmarkToken != "" {
|
||||
return "postmark"
|
||||
}
|
||||
@@ -112,6 +118,9 @@ func Load() (Config, error) {
|
||||
overrideString(&cfg.Email.SMTPHost, "CAIRNQUIRE_EMAIL_SMTP_HOST")
|
||||
overrideString(&cfg.Email.PostmarkToken, "CAIRNQUIRE_EMAIL_POSTMARK_TOKEN")
|
||||
overrideString(&cfg.Email.PostmarkAPIURL, "CAIRNQUIRE_EMAIL_POSTMARK_API_URL")
|
||||
overrideString(&cfg.Email.CloudflareAccountID, "CAIRNQUIRE_EMAIL_CLOUDFLARE_ACCOUNT_ID")
|
||||
overrideString(&cfg.Email.CloudflareAPIToken, "CAIRNQUIRE_EMAIL_CLOUDFLARE_API_TOKEN")
|
||||
overrideString(&cfg.Email.CloudflareAPIURL, "CAIRNQUIRE_EMAIL_CLOUDFLARE_API_URL")
|
||||
overrideString(&cfg.Email.Provider, "CAIRNQUIRE_EMAIL_PROVIDER")
|
||||
overrideString(&cfg.Email.InstanceName, "CAIRNQUIRE_INSTANCE_NAME")
|
||||
if port := os.Getenv("CAIRNQUIRE_EMAIL_SMTP_PORT"); port != "" {
|
||||
|
||||
46
apps/server/internal/config/config_test.go
Normal file
46
apps/server/internal/config/config_test.go
Normal file
@@ -0,0 +1,46 @@
|
||||
package config
|
||||
|
||||
import "testing"
|
||||
|
||||
func TestEmailConfigResolvedProvider(t *testing.T) {
|
||||
tests := []struct {
|
||||
name string
|
||||
cfg EmailConfig
|
||||
want string
|
||||
}{
|
||||
{"explicit", EmailConfig{Provider: "noop", CloudflareAPIToken: "token"}, "noop"},
|
||||
{"cloudflare", EmailConfig{CloudflareAccountID: "account"}, "cloudflare"},
|
||||
{"postmark", EmailConfig{PostmarkToken: "token"}, "postmark"},
|
||||
{"smtp", EmailConfig{SMTPHost: "localhost"}, "smtp"},
|
||||
{"noop", EmailConfig{}, "noop"},
|
||||
}
|
||||
for _, test := range tests {
|
||||
t.Run(test.name, func(t *testing.T) {
|
||||
if got := test.cfg.ResolvedProvider(); got != test.want {
|
||||
t.Fatalf("ResolvedProvider() = %q, want %q", got, test.want)
|
||||
}
|
||||
})
|
||||
}
|
||||
}
|
||||
|
||||
func TestLoadCloudflareEmailEnvironment(t *testing.T) {
|
||||
t.Setenv("CAIRNQUIRE_EMAIL_PROVIDER", "cloudflare")
|
||||
t.Setenv("CAIRNQUIRE_EMAIL_CLOUDFLARE_ACCOUNT_ID", "account")
|
||||
t.Setenv("CAIRNQUIRE_EMAIL_CLOUDFLARE_API_TOKEN", "token")
|
||||
t.Setenv("CAIRNQUIRE_EMAIL_CLOUDFLARE_API_URL", "https://api.example.test")
|
||||
t.Setenv("CAIRNQUIRE_EMAIL_FROM", "notifications@example.com")
|
||||
|
||||
cfg, err := Load()
|
||||
if err != nil {
|
||||
t.Fatalf("Load: %v", err)
|
||||
}
|
||||
if cfg.Email.ResolvedProvider() != "cloudflare" {
|
||||
t.Fatalf("provider = %q", cfg.Email.ResolvedProvider())
|
||||
}
|
||||
if cfg.Email.CloudflareAccountID != "account" || cfg.Email.CloudflareAPIToken != "token" {
|
||||
t.Fatalf("cloudflare config = %#v", cfg.Email)
|
||||
}
|
||||
if cfg.Email.CloudflareAPIURL != "https://api.example.test" || cfg.Email.From != "notifications@example.com" {
|
||||
t.Fatalf("cloudflare endpoint/from = %#v", cfg.Email)
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user