diff --git a/pkg/api/org_invite.go b/pkg/api/org_invite.go index 9e85808950f..b776186aec7 100644 --- a/pkg/api/org_invite.go +++ b/pkg/api/org_invite.go @@ -78,6 +78,11 @@ func AddOrgInvite(c *middleware.Context, inviteDto dtos.AddInviteForm) Response return ApiError(500, "Failed to send email invite", err) } + emailSentCmd := m.UpdateTempUserWithEmailSentCommand{Code: cmd.Result.Code} + if err := bus.Dispatch(&emailSentCmd); err != nil { + return ApiError(500, "Failed to update invite with email sent info", err) + } + return ApiSuccess(fmt.Sprintf("Sent invite to %s", inviteDto.LoginOrEmail)) } diff --git a/pkg/models/temp_user.go b/pkg/models/temp_user.go index 00c496c4844..0e09627aab1 100644 --- a/pkg/models/temp_user.go +++ b/pkg/models/temp_user.go @@ -60,6 +60,10 @@ type UpdateTempUserStatusCommand struct { Status TempUserStatus } +type UpdateTempUserWithEmailSentCommand struct { + Code string +} + type GetTempUsersQuery struct { OrgId int64 Email string diff --git a/pkg/services/notifications/notifications.go b/pkg/services/notifications/notifications.go index c765774d062..25eb2b5936a 100644 --- a/pkg/services/notifications/notifications.go +++ b/pkg/services/notifications/notifications.go @@ -146,7 +146,7 @@ func signUpStartedHandler(evt *events.SignUpStarted) error { return nil } - return sendEmailCommandHandler(&m.SendEmailCommand{ + err := sendEmailCommandHandler(&m.SendEmailCommand{ To: []string{evt.Email}, Template: tmplSignUpStarted, Data: map[string]interface{}{ @@ -155,6 +155,12 @@ func signUpStartedHandler(evt *events.SignUpStarted) error { "SignUpUrl": setting.ToAbsUrl(fmt.Sprintf("signup/?email=%s&code=%s", url.QueryEscape(evt.Email), url.QueryEscape(evt.Code))), }, }) + if err != nil { + return err + } + + emailSentCmd := m.UpdateTempUserWithEmailSentCommand{Code: evt.Code} + return bus.Dispatch(&emailSentCmd) } func signUpCompletedHandler(evt *events.SignUpCompleted) error { diff --git a/pkg/services/sqlstore/datasource_test.go b/pkg/services/sqlstore/datasource_test.go index 2749a3cc426..51bc759fdaf 100644 --- a/pkg/services/sqlstore/datasource_test.go +++ b/pkg/services/sqlstore/datasource_test.go @@ -16,6 +16,8 @@ func InitTestDB(t *testing.T) { //x, err := xorm.NewEngine(sqlutil.TestDB_Mysql.DriverName, sqlutil.TestDB_Mysql.ConnStr) //x, err := xorm.NewEngine(sqlutil.TestDB_Postgres.DriverName, sqlutil.TestDB_Postgres.ConnStr) + // x.ShowSQL() + if err != nil { t.Fatalf("Failed to init in memory sqllite3 db %v", err) } diff --git a/pkg/services/sqlstore/temp_user.go b/pkg/services/sqlstore/temp_user.go index 8864d5fb02a..43e1f027057 100644 --- a/pkg/services/sqlstore/temp_user.go +++ b/pkg/services/sqlstore/temp_user.go @@ -12,6 +12,7 @@ func init() { bus.AddHandler("sql", GetTempUsersQuery) bus.AddHandler("sql", UpdateTempUserStatus) bus.AddHandler("sql", GetTempUserByCode) + bus.AddHandler("sql", UpdateTempUserWithEmailSent) } func UpdateTempUserStatus(cmd *m.UpdateTempUserStatusCommand) error { @@ -35,6 +36,7 @@ func CreateTempUser(cmd *m.CreateTempUserCommand) error { Status: cmd.Status, RemoteAddr: cmd.RemoteAddr, InvitedByUserId: cmd.InvitedByUserId, + EmailSentOn: time.Now(), Created: time.Now(), Updated: time.Now(), } @@ -48,6 +50,19 @@ func CreateTempUser(cmd *m.CreateTempUserCommand) error { }) } +func UpdateTempUserWithEmailSent(cmd *m.UpdateTempUserWithEmailSentCommand) error { + return inTransaction(func(sess *DBSession) error { + user := &m.TempUser{ + EmailSent: true, + EmailSentOn: time.Now(), + } + + _, err := sess.Where("code = ?", cmd.Code).Cols("email_sent", "email_sent_on").Update(user) + + return err + }) +} + func GetTempUsersQuery(query *m.GetTempUsersQuery) error { rawSql := `SELECT tu.id as id, diff --git a/pkg/services/sqlstore/temp_user_test.go b/pkg/services/sqlstore/temp_user_test.go index ebf753890f6..80560258162 100644 --- a/pkg/services/sqlstore/temp_user_test.go +++ b/pkg/services/sqlstore/temp_user_test.go @@ -54,6 +54,19 @@ func TestTempUserCommandsAndQueries(t *testing.T) { So(err, ShouldBeNil) }) + Convey("Should be able update email sent and email sent on", func() { + cmd3 := m.UpdateTempUserWithEmailSentCommand{Code: cmd.Result.Code} + err := UpdateTempUserWithEmailSent(&cmd3) + So(err, ShouldBeNil) + + query := m.GetTempUsersQuery{OrgId: 2256, Status: m.TmpUserInvitePending} + err = GetTempUsersQuery(&query) + + So(err, ShouldBeNil) + So(query.Result[0].EmailSent, ShouldBeTrue) + So(query.Result[0].EmailSentOn, ShouldHappenOnOrAfter, (query.Result[0].Created)) + }) + }) }) }