diff --git a/proto/builder/builder.gen.go b/proto/builder/builder.gen.go index db897d5b..71d11fee 100644 --- a/proto/builder/builder.gen.go +++ b/proto/builder/builder.gen.go @@ -1,6 +1,6 @@ -// sequence-builder v0.1.0 97ffbb3b01cdef9c1dad137ab703fa04e501eb27 +// sequence-builder v0.1.0 4a46de64365e2771e2a31710589017bfc488d6cd // -- -// Code generated by webrpc-gen@v0.18.7 with golang generator. DO NOT EDIT. +// Code generated by webrpc-gen@v0.19.3 with golang generator. DO NOT EDIT. // // webrpc-gen -schema=builder.ridl -target=golang -pkg=builder -client -server -out=./builder.gen.go package builder @@ -30,7 +30,7 @@ func WebRPCSchemaVersion() string { // Schema hash generated from your RIDL schema func WebRPCSchemaHash() string { - return "97ffbb3b01cdef9c1dad137ab703fa04e501eb27" + return "4a46de64365e2771e2a31710589017bfc488d6cd" } // @@ -91,12 +91,19 @@ type EmailTemplate struct { IntroText string `json:"introText" db:"intro_text"` LogoURL string `json:"logoUrl" db:"logo_url"` Template *string `json:"template" db:"template"` + FromEmail *string `json:"fromEmail" db:"from_email"` Placeholders []string `json:"placeholders" db:"placeholders"` + SesConfig *SESSettings `json:"sesConfig" db:"ses_config"` CreatedAt time.Time `json:"createdAt" db:"created_at"` UpdatedAt time.Time `json:"updatedAt" db:"updated_at"` DeletedAt *time.Time `json:"deletedAt,omitempty" db:"deleted_at,omitempty"` } +type SESSettings struct { + AccessRoleARN string `json:"accessRoleARN"` + SourceARN string `json:"sourceARN"` +} + var WebRPCServices = map[string][]string{ "Builder": { "GetEmailTemplate", diff --git a/proto/builder/builder.ridl b/proto/builder/builder.ridl index 19420ec1..c44a02f6 100644 --- a/proto/builder/builder.ridl +++ b/proto/builder/builder.ridl @@ -3,51 +3,50 @@ webrpc = v1 # TODO, use v2 name = sequence-builder version = v0.1.0 - # db table: "email_templates" struct EmailTemplate - id: uint64 + go.field.name = ID + go.tag.db = id,omitempty - - templateType?: EmailTemplateType + go.field.name = TemplateType + go.tag.db = template_type - - projectId: uint64 + go.field.name = ProjectID + go.tag.db = project_id - - subject: string + go.tag.db = subject - - introText: string + go.tag.db = intro_text - - logoUrl: string + go.field.name = LogoURL + go.tag.db = logo_url - - template?: string + go.field.name = Template + go.tag.db = template - + - fromEmail?: string + + go.tag.db = from_email - placeholders: []string + go.tag.db = placeholders - + - sesConfig?: SESSettings + + go.tag.db = ses_config - createdAt: timestamp + json = createdAt + go.tag.db = created_at - - updatedAt: timestamp + json = updatedAt + go.tag.db = updated_at - - deletedAt?: timestamp + go.tag.db = deleted_at,omitempty + go.tag.json = deletedAt,omitempty + go.field.type = *time.Time +struct SESSettings + - accessRoleARN: string + + go.field.name = AccessRoleARN + - sourceARN: string + + go.field.name = SourceARN + enum EmailTemplateType: uint8 - UNKNOWN - LOGIN diff --git a/rpc/auth/email/provider.go b/rpc/auth/email/provider.go index d5f3c382..3bee7034 100644 --- a/rpc/auth/email/provider.go +++ b/rpc/auth/email/provider.go @@ -111,6 +111,16 @@ func (p *AuthProvider) InitiateAuth( HTML: strings.Replace(*tpl.Template, "{auth_code}", secretCode, 1), Text: tpl.IntroText + "\n\n" + secretCode, } + + if tpl.FromEmail != nil { + msg.Source = *tpl.FromEmail + } + + if tpl.SesConfig != nil { + msg.SourceARN = tpl.SesConfig.SourceARN + msg.AccessRoleARN = tpl.SesConfig.AccessRoleARN + } + if err := p.Sender.Send(ctx, msg); err != nil { return nil, fmt.Errorf("failed to send email: %w", err) } diff --git a/rpc/auth/email/sender.go b/rpc/auth/email/sender.go index c8b77d16..69c5e244 100644 --- a/rpc/auth/email/sender.go +++ b/rpc/auth/email/sender.go @@ -5,10 +5,13 @@ import ( ) type Message struct { - Recipient string - Subject string - HTML string - Text string + Recipient string + Subject string + HTML string + Text string + Source string + SourceARN string + AccessRoleARN string } type Sender interface { diff --git a/rpc/auth/email/ses.go b/rpc/auth/email/ses.go index cf19f44e..379eec65 100644 --- a/rpc/auth/email/ses.go +++ b/rpc/auth/email/ses.go @@ -12,39 +12,47 @@ import ( ) type sesSender struct { - client *ses.Client - source *string - sourceARN *string + cfg config.SESConfig + awsCfg aws.Config } func NewSESSender(awsCfg aws.Config, cfg config.SESConfig) Sender { - if cfg.AccessRoleARN != "" { + sender := &sesSender{ + cfg: cfg, + awsCfg: awsCfg, + } + + return sender +} + +func (s *sesSender) Send(ctx context.Context, msg *Message) error { + awsCfg := s.awsCfg + accessRoleARN := s.cfg.AccessRoleARN + if msg.AccessRoleARN != "" { + accessRoleARN = msg.AccessRoleARN + } + if accessRoleARN != "" { stsClient := sts.NewFromConfig(awsCfg) - creds := stscreds.NewAssumeRoleProvider(stsClient, cfg.AccessRoleARN) + creds := stscreds.NewAssumeRoleProvider(stsClient, accessRoleARN) awsCfg.Credentials = aws.NewCredentialsCache(creds) } - - if cfg.Region != "" { - awsCfg.Region = cfg.Region + if s.cfg.Region != "" { + awsCfg.Region = s.cfg.Region } - sender := &sesSender{ - client: ses.NewFromConfig(awsCfg), - } + client := ses.NewFromConfig(awsCfg) - if cfg.Source != "" { - sender.source = &cfg.Source + source := &s.cfg.Source + if msg.Source != "" { + source = &msg.Source } - if cfg.SourceARN != "" { - sender.sourceARN = &cfg.SourceARN + sourceARN := &s.cfg.SourceARN + if msg.SourceARN != "" { + sourceARN = &msg.SourceARN } - return sender -} - -func (s *sesSender) Send(ctx context.Context, msg *Message) error { - _, err := s.client.SendEmail(ctx, &ses.SendEmailInput{ + _, err := client.SendEmail(ctx, &ses.SendEmailInput{ Destination: &types.Destination{ ToAddresses: []string{msg.Recipient}, }, @@ -64,8 +72,8 @@ func (s *sesSender) Send(ctx context.Context, msg *Message) error { Charset: aws.String("UTF-8"), }, }, - Source: s.source, - SourceArn: s.sourceARN, + Source: source, + SourceArn: sourceARN, }) return err }