package sqlstore import ( "context" "time" "github.com/grafana/grafana/pkg/models" "github.com/grafana/grafana/pkg/services/user" ) func (ss *SQLStore) AddOrgUser(ctx context.Context, cmd *models.AddOrgUserCommand) error { return ss.WithTransactionalDbSession(ctx, func(sess *DBSession) error { // check if user exists var usr user.User session := sess.ID(cmd.UserId) if !cmd.AllowAddingServiceAccount { session = session.Where(NotServiceAccountFilter(ss)) } if exists, err := session.Get(&usr); err != nil { return err } else if !exists { return user.ErrUserNotFound } if res, err := sess.Query("SELECT 1 from org_user WHERE org_id=? and user_id=?", cmd.OrgId, usr.ID); err != nil { return err } else if len(res) == 1 { return models.ErrOrgUserAlreadyAdded } if res, err := sess.Query("SELECT 1 from org WHERE id=?", cmd.OrgId); err != nil { return err } else if len(res) != 1 { return models.ErrOrgNotFound } entity := models.OrgUser{ OrgId: cmd.OrgId, UserId: cmd.UserId, Role: cmd.Role, Created: time.Now(), Updated: time.Now(), } _, err := sess.Insert(&entity) if err != nil { return err } var userOrgs []*models.UserOrgDTO sess.Table("org_user") sess.Join("INNER", "org", "org_user.org_id=org.id") sess.Where("org_user.user_id=? AND org_user.org_id=?", usr.ID, usr.OrgID) sess.Cols("org.name", "org_user.role", "org_user.org_id") err = sess.Find(&userOrgs) if err != nil { return err } if len(userOrgs) == 0 { return setUsingOrgInTransaction(sess, usr.ID, cmd.OrgId) } return nil }) }