diff --git a/pkg/models/temp_user.go b/pkg/models/temp_user.go new file mode 100644 index 00000000000..0a59e914836 --- /dev/null +++ b/pkg/models/temp_user.go @@ -0,0 +1,58 @@ +package models + +import ( + "errors" + "time" +) + +// Typed errors +var ( + ErrTempUserNotFound = errors.New("User not found") +) + +// TempUser holds data for org invites and new sign ups +type TempUser struct { + Id int64 + OrgId int64 + Version int + Email string + Name string + Role string + IsInvite bool + + EmailSent bool + EmailSentOn time.Time + Code string + + Created time.Time + Updated time.Time +} + +// --------------------- +// COMMANDS + +type CreateTempUserCommand struct { + Email string + Name string + OrgId int64 + IsInvite bool + Code string + + Result *TempUser +} + +type GetTempUsersForOrgQuery struct { + OrgId int64 + + Result []*TempUserDTO +} + +type TempUserDTO struct { + Id int64 `json:"id"` + Name string `json:"name"` + Email string `json:"email"` + Role string `json:"role"` + EmailSent bool `json:"emailSent"` + EmailSentOn time.Time `json:"emailSentOn"` + Created time.Time `json:"createdOn"` +} diff --git a/pkg/services/sqlstore/migrations/migrations.go b/pkg/services/sqlstore/migrations/migrations.go index 329c6187c9d..70acc9ef736 100644 --- a/pkg/services/sqlstore/migrations/migrations.go +++ b/pkg/services/sqlstore/migrations/migrations.go @@ -10,6 +10,7 @@ import . "github.com/grafana/grafana/pkg/services/sqlstore/migrator" func AddMigrations(mg *Migrator) { addMigrationLogMigrations(mg) addUserMigrations(mg) + addTempUserMigrations(mg) addStarMigrations(mg) addOrgMigrations(mg) addDashboardMigration(mg) diff --git a/pkg/services/sqlstore/migrations/temp_user.go b/pkg/services/sqlstore/migrations/temp_user.go new file mode 100644 index 00000000000..139ab569fb7 --- /dev/null +++ b/pkg/services/sqlstore/migrations/temp_user.go @@ -0,0 +1,34 @@ +package migrations + +import . "github.com/grafana/grafana/pkg/services/sqlstore/migrator" + +func addTempUserMigrations(mg *Migrator) { + tempUserV1 := Table{ + Name: "temp_user", + Columns: []*Column{ + {Name: "id", Type: DB_BigInt, IsPrimaryKey: true, IsAutoIncrement: true}, + {Name: "org_id", Type: DB_BigInt, Nullable: false}, + {Name: "version", Type: DB_Int, Nullable: false}, + {Name: "email", Type: DB_NVarchar, Length: 255}, + {Name: "name", Type: DB_NVarchar, Length: 255, Nullable: true}, + {Name: "role", Type: DB_NVarchar, Length: 20, Nullable: true}, + {Name: "code", Type: DB_NVarchar, Length: 255}, + {Name: "is_invite", Type: DB_Bool}, + {Name: "invited_by", Type: DB_NVarchar, Length: 255, Nullable: true}, + {Name: "email_sent", Type: DB_Bool}, + {Name: "email_sent_on", Type: DB_DateTime, Nullable: true}, + {Name: "created", Type: DB_DateTime}, + {Name: "updated", Type: DB_DateTime}, + }, + Indices: []*Index{ + {Cols: []string{"email"}, Type: IndexType}, + {Cols: []string{"org_id"}, Type: IndexType}, + {Cols: []string{"code"}, Type: IndexType}, + }, + } + + // create table + mg.AddMigration("create temp user table v1", NewAddTableMigration(tempUserV1)) + + addTableIndicesMigrations(mg, "v1-1", tempUserV1) +} diff --git a/pkg/services/sqlstore/temp_user.go b/pkg/services/sqlstore/temp_user.go new file mode 100644 index 00000000000..0c92ad6d7ba --- /dev/null +++ b/pkg/services/sqlstore/temp_user.go @@ -0,0 +1,47 @@ +package sqlstore + +import ( + "time" + + "github.com/grafana/grafana/pkg/bus" + m "github.com/grafana/grafana/pkg/models" +) + +func init() { + bus.AddHandler("sql", CreateTempUser) + bus.AddHandler("sql", GetTempUsersForOrg) +} + +func CreateTempUser(cmd *m.CreateTempUserCommand) error { + return inTransaction2(func(sess *session) error { + + // create user + user := &m.TempUser{ + Email: cmd.Email, + Name: cmd.Name, + OrgId: cmd.OrgId, + Code: cmd.Code, + IsInvite: cmd.IsInvite, + Created: time.Now(), + Updated: time.Now(), + } + + sess.UseBool("is_invite") + + if _, err := sess.Insert(user); err != nil { + return err + } + + cmd.Result = user + return nil + }) +} + +func GetTempUsersForOrg(query *m.GetTempUsersForOrgQuery) error { + query.Result = make([]*m.TempUserDTO, 0) + sess := x.Table("temp_user") + sess.Where("org_id=?", query.OrgId) + + err := sess.Find(&query.Result) + return err +} diff --git a/pkg/services/sqlstore/temp_user_test.go b/pkg/services/sqlstore/temp_user_test.go new file mode 100644 index 00000000000..9424ae09a15 --- /dev/null +++ b/pkg/services/sqlstore/temp_user_test.go @@ -0,0 +1,36 @@ +package sqlstore + +import ( + "testing" + + . "github.com/smartystreets/goconvey/convey" + + m "github.com/grafana/grafana/pkg/models" +) + +func TestTempUserCommandsAndQueries(t *testing.T) { + + Convey("Testing Temp User commands & queries", t, func() { + InitTestDB(t) + + Convey("Given saved api key", func() { + cmd := m.CreateTempUserCommand{ + OrgId: 2256, + Name: "hello", + Email: "e@as.co", + IsInvite: true, + } + err := CreateTempUser(&cmd) + So(err, ShouldBeNil) + + Convey("Should be able to get temp users by org id", func() { + query := m.GetTempUsersForOrgQuery{OrgId: 2256} + err = GetTempUsersForOrg(&query) + + So(err, ShouldBeNil) + So(len(query.Result), ShouldEqual, 1) + }) + + }) + }) +}