auth

Paddy 2015-05-17

169:37a42585660e Go to Latest

auth/profile_verification.go

Create interfaces for login verification flow. We needed an interface that we could use to say "send the email to verify the user's login" so that we could verify the emails we have are actually valid. This implements an NSQ version that sends an email_verification event. We'll get listener implementations that pull these messages off NSQ and actually send the emails. This also implements, for testing purposes, a version that just echoes the Login Value and the Verification code to stdout.

History
paddy@169 1 package auth
paddy@169 2
paddy@169 3 import (
paddy@169 4 "log"
paddy@169 5 "time"
paddy@169 6
paddy@169 7 "code.secondbit.org/events.hg"
paddy@169 8 )
paddy@169 9
paddy@169 10 const (
paddy@169 11 EventSystem = "authd"
paddy@169 12 EventModelLogin = "login"
paddy@169 13 EventActionSendVerification = "send_verification"
paddy@169 14 EventTopicLoginVerification = "login_verification"
paddy@169 15 )
paddy@169 16
paddy@169 17 type loginVerificationNotifier interface {
paddy@169 18 SendLoginVerification(login Login)
paddy@169 19 }
paddy@169 20
paddy@169 21 type stdoutNotifier struct{}
paddy@169 22
paddy@169 23 func NewStdoutNotifier() stdoutNotifier {
paddy@169 24 return stdoutNotifier{}
paddy@169 25 }
paddy@169 26
paddy@169 27 func (s stdoutNotifier) SendLoginVerification(login Login) {
paddy@169 28 log.Printf("Use \"%s\" as the verification code for \"%s\"\n", login.Verification, login.Value)
paddy@169 29 }
paddy@169 30
paddy@169 31 type nsqNotifier struct {
paddy@169 32 *events.NSQPublisher
paddy@169 33 }
paddy@169 34
paddy@169 35 func NewNSQNotifier(address string) (*nsqNotifier, error) {
paddy@169 36 p, err := events.NewNSQPublisher(EventSystem+"/"+Version, address)
paddy@169 37 return &nsqNotifier{p}, err
paddy@169 38 }
paddy@169 39
paddy@169 40 func (n *nsqNotifier) SendLoginVerification(login Login) {
paddy@169 41 evt := events.Event{
paddy@169 42 System: EventSystem,
paddy@169 43 Model: EventModelLogin,
paddy@169 44 ID: login.Value,
paddy@169 45 Action: EventActionSendVerification,
paddy@169 46 Timestamp: time.Now(),
paddy@169 47 Data: map[string]string{
paddy@169 48 "verification": login.Verification,
paddy@169 49 },
paddy@169 50 }
paddy@169 51 err := n.Publish(EventTopicLoginVerification, evt)
paddy@169 52 if err != nil {
paddy@169 53 log.Printf("Error sending event: %#+v\n", err)
paddy@169 54 }
paddy@169 55 }