feat: mail service
This commit is contained in:
@@ -24,8 +24,16 @@ type SendLoginCodeInput struct {
|
||||
// Email identifies the normalized target e-mail address.
|
||||
Email common.Email
|
||||
|
||||
// IdempotencyKey stores the raw challenge_id value sent to Mail Service as
|
||||
// the required Idempotency-Key header.
|
||||
IdempotencyKey string
|
||||
|
||||
// Code stores the cleartext login code that should be delivered to Email.
|
||||
Code string
|
||||
|
||||
// Locale stores the canonical BCP 47 language tag that selects the auth
|
||||
// mail template locale.
|
||||
Locale string
|
||||
}
|
||||
|
||||
// Validate reports whether SendLoginCodeInput contains a complete delivery
|
||||
@@ -35,10 +43,18 @@ func (i SendLoginCodeInput) Validate() error {
|
||||
return fmt.Errorf("send login code input email: %w", err)
|
||||
}
|
||||
switch {
|
||||
case strings.TrimSpace(i.IdempotencyKey) == "":
|
||||
return errors.New("send login code input idempotency key must not be empty")
|
||||
case strings.TrimSpace(i.IdempotencyKey) != i.IdempotencyKey:
|
||||
return errors.New("send login code input idempotency key must not contain surrounding whitespace")
|
||||
case strings.TrimSpace(i.Code) == "":
|
||||
return errors.New("send login code input code must not be empty")
|
||||
case strings.TrimSpace(i.Code) != i.Code:
|
||||
return errors.New("send login code input code must not contain surrounding whitespace")
|
||||
case strings.TrimSpace(i.Locale) == "":
|
||||
return errors.New("send login code input locale must not be empty")
|
||||
case strings.TrimSpace(i.Locale) != i.Locale:
|
||||
return errors.New("send login code input locale must not contain surrounding whitespace")
|
||||
default:
|
||||
return nil
|
||||
}
|
||||
|
||||
@@ -310,8 +310,10 @@ func TestSendLoginCodeInputAndResultValidate(t *testing.T) {
|
||||
t.Parallel()
|
||||
|
||||
input := SendLoginCodeInput{
|
||||
Email: common.Email("pilot@example.com"),
|
||||
Code: "654321",
|
||||
Email: common.Email("pilot@example.com"),
|
||||
IdempotencyKey: "challenge-1",
|
||||
Code: "654321",
|
||||
Locale: "en",
|
||||
}
|
||||
if err := input.Validate(); err != nil {
|
||||
require.Failf(t, "test failed", "SendLoginCodeInput.Validate() returned error: %v", err)
|
||||
@@ -339,13 +341,14 @@ func TestValidateComparableChallenges(t *testing.T) {
|
||||
func challengeFixture() challenge.Challenge {
|
||||
timestamp := time.Unix(10, 0).UTC()
|
||||
return challenge.Challenge{
|
||||
ID: common.ChallengeID("challenge-1"),
|
||||
Email: common.Email("pilot@example.com"),
|
||||
CodeHash: []byte("hash"),
|
||||
Status: challenge.StatusPendingSend,
|
||||
DeliveryState: challenge.DeliveryPending,
|
||||
CreatedAt: timestamp,
|
||||
ExpiresAt: timestamp.Add(5 * time.Minute),
|
||||
ID: common.ChallengeID("challenge-1"),
|
||||
Email: common.Email("pilot@example.com"),
|
||||
CodeHash: []byte("hash"),
|
||||
PreferredLanguage: "en",
|
||||
Status: challenge.StatusPendingSend,
|
||||
DeliveryState: challenge.DeliveryPending,
|
||||
CreatedAt: timestamp,
|
||||
ExpiresAt: timestamp.Add(5 * time.Minute),
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user