package auth import ( "context" "log/slog" ) // EmailSender delivers transactional auth emails (verification, reset, // collaborator-invite). Block A ships LogSender so dev environments work // without Twilio/SES. Tier 1 Block D replaced this with a real SES-backed // sender; Tier 2 Block C added the collaborator-invite method. type EmailSender interface { SendVerification(ctx context.Context, to, name, link string) error SendPasswordReset(ctx context.Context, to, name, link string) error SendCollaboratorInvite(ctx context.Context, to, inviterName, eventName, role, link string) error } type LogEmailSender struct { Logger *slog.Logger } func (l LogEmailSender) SendVerification(_ context.Context, to, name, link string) error { l.Logger.Info("auth email (stub): verification", "to", to, "name", name, "link", link, ) return nil } func (l LogEmailSender) SendPasswordReset(_ context.Context, to, name, link string) error { l.Logger.Info("auth email (stub): password reset", "to", to, "name", name, "link", link, ) return nil } func (l LogEmailSender) SendCollaboratorInvite(_ context.Context, to, inviterName, eventName, role, link string) error { l.Logger.Info("auth email (stub): collaborator invite", "to", to, "inviter", inviterName, "event", eventName, "role", role, "link", link, ) return nil }