| 
									
										
										
										
											2017-04-09 06:55:07 +08:00
										 |  |  | package sqlstore | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | import ( | 
					
						
							| 
									
										
										
										
											2017-12-15 00:22:45 +08:00
										 |  |  | 	"bytes" | 
					
						
							| 
									
										
										
										
											2017-04-09 06:55:07 +08:00
										 |  |  | 	"fmt" | 
					
						
							|  |  |  | 	"time" | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	"github.com/grafana/grafana/pkg/bus" | 
					
						
							|  |  |  | 	m "github.com/grafana/grafana/pkg/models" | 
					
						
							|  |  |  | ) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | func init() { | 
					
						
							| 
									
										
										
										
											2017-12-08 23:25:45 +08:00
										 |  |  | 	bus.AddHandler("sql", CreateTeam) | 
					
						
							|  |  |  | 	bus.AddHandler("sql", UpdateTeam) | 
					
						
							|  |  |  | 	bus.AddHandler("sql", DeleteTeam) | 
					
						
							|  |  |  | 	bus.AddHandler("sql", SearchTeams) | 
					
						
							|  |  |  | 	bus.AddHandler("sql", GetTeamById) | 
					
						
							|  |  |  | 	bus.AddHandler("sql", GetTeamsByUser) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	bus.AddHandler("sql", AddTeamMember) | 
					
						
							|  |  |  | 	bus.AddHandler("sql", RemoveTeamMember) | 
					
						
							|  |  |  | 	bus.AddHandler("sql", GetTeamMembers) | 
					
						
							| 
									
										
										
										
											2017-04-09 06:55:07 +08:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-12-08 23:25:45 +08:00
										 |  |  | func CreateTeam(cmd *m.CreateTeamCommand) error { | 
					
						
							| 
									
										
										
										
											2017-05-24 22:19:21 +08:00
										 |  |  | 	return inTransaction(func(sess *DBSession) error { | 
					
						
							| 
									
										
										
										
											2017-04-09 06:55:07 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-12-08 23:25:45 +08:00
										 |  |  | 		if isNameTaken, err := isTeamNameTaken(cmd.Name, 0, sess); err != nil { | 
					
						
							| 
									
										
										
										
											2017-04-09 06:55:07 +08:00
										 |  |  | 			return err | 
					
						
							|  |  |  | 		} else if isNameTaken { | 
					
						
							| 
									
										
										
										
											2017-12-08 23:25:45 +08:00
										 |  |  | 			return m.ErrTeamNameTaken | 
					
						
							| 
									
										
										
										
											2017-04-09 06:55:07 +08:00
										 |  |  | 		} | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-12-08 23:25:45 +08:00
										 |  |  | 		team := m.Team{ | 
					
						
							| 
									
										
										
										
											2017-04-09 06:55:07 +08:00
										 |  |  | 			Name:    cmd.Name, | 
					
						
							| 
									
										
										
										
											2017-04-19 21:35:11 +08:00
										 |  |  | 			OrgId:   cmd.OrgId, | 
					
						
							| 
									
										
										
										
											2017-04-09 06:55:07 +08:00
										 |  |  | 			Created: time.Now(), | 
					
						
							|  |  |  | 			Updated: time.Now(), | 
					
						
							|  |  |  | 		} | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-12-08 23:25:45 +08:00
										 |  |  | 		_, err := sess.Insert(&team) | 
					
						
							| 
									
										
										
										
											2017-04-09 06:55:07 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-12-08 23:25:45 +08:00
										 |  |  | 		cmd.Result = team | 
					
						
							| 
									
										
										
										
											2017-04-09 06:55:07 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  | 		return err | 
					
						
							|  |  |  | 	}) | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-12-08 23:25:45 +08:00
										 |  |  | func UpdateTeam(cmd *m.UpdateTeamCommand) error { | 
					
						
							| 
									
										
										
										
											2017-05-24 22:19:21 +08:00
										 |  |  | 	return inTransaction(func(sess *DBSession) error { | 
					
						
							| 
									
										
										
										
											2017-04-18 21:01:05 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-12-08 23:25:45 +08:00
										 |  |  | 		if isNameTaken, err := isTeamNameTaken(cmd.Name, cmd.Id, sess); err != nil { | 
					
						
							| 
									
										
										
										
											2017-04-18 21:01:05 +08:00
										 |  |  | 			return err | 
					
						
							|  |  |  | 		} else if isNameTaken { | 
					
						
							| 
									
										
										
										
											2017-12-08 23:25:45 +08:00
										 |  |  | 			return m.ErrTeamNameTaken | 
					
						
							| 
									
										
										
										
											2017-04-18 21:01:05 +08:00
										 |  |  | 		} | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-12-08 23:25:45 +08:00
										 |  |  | 		team := m.Team{ | 
					
						
							| 
									
										
										
										
											2017-04-18 21:01:05 +08:00
										 |  |  | 			Name:    cmd.Name, | 
					
						
							|  |  |  | 			Updated: time.Now(), | 
					
						
							|  |  |  | 		} | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-12-08 23:25:45 +08:00
										 |  |  | 		affectedRows, err := sess.Id(cmd.Id).Update(&team) | 
					
						
							| 
									
										
										
										
											2017-04-18 21:01:05 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  | 		if err != nil { | 
					
						
							|  |  |  | 			return err | 
					
						
							|  |  |  | 		} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 		if affectedRows == 0 { | 
					
						
							| 
									
										
										
										
											2017-12-08 23:25:45 +08:00
										 |  |  | 			return m.ErrTeamNotFound | 
					
						
							| 
									
										
										
										
											2017-04-18 21:01:05 +08:00
										 |  |  | 		} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 		return nil | 
					
						
							|  |  |  | 	}) | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-12-08 23:25:45 +08:00
										 |  |  | func DeleteTeam(cmd *m.DeleteTeamCommand) error { | 
					
						
							| 
									
										
										
										
											2017-05-24 22:19:21 +08:00
										 |  |  | 	return inTransaction(func(sess *DBSession) error { | 
					
						
							| 
									
										
										
										
											2017-12-08 23:25:45 +08:00
										 |  |  | 		if res, err := sess.Query("SELECT 1 from team WHERE id=?", cmd.Id); err != nil { | 
					
						
							| 
									
										
										
										
											2017-04-09 06:55:07 +08:00
										 |  |  | 			return err | 
					
						
							|  |  |  | 		} else if len(res) != 1 { | 
					
						
							| 
									
										
										
										
											2017-12-08 23:25:45 +08:00
										 |  |  | 			return m.ErrTeamNotFound | 
					
						
							| 
									
										
										
										
											2017-04-09 06:55:07 +08:00
										 |  |  | 		} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 		deletes := []string{ | 
					
						
							| 
									
										
										
										
											2017-12-08 23:25:45 +08:00
										 |  |  | 			"DELETE FROM team_member WHERE team_id = ?", | 
					
						
							|  |  |  | 			"DELETE FROM team WHERE id = ?", | 
					
						
							|  |  |  | 			"DELETE FROM dashboard_acl WHERE team_id = ?", | 
					
						
							| 
									
										
										
										
											2017-04-09 06:55:07 +08:00
										 |  |  | 		} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 		for _, sql := range deletes { | 
					
						
							|  |  |  | 			_, err := sess.Exec(sql, cmd.Id) | 
					
						
							|  |  |  | 			if err != nil { | 
					
						
							|  |  |  | 				return err | 
					
						
							|  |  |  | 			} | 
					
						
							|  |  |  | 		} | 
					
						
							|  |  |  | 		return nil | 
					
						
							|  |  |  | 	}) | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-12-08 23:25:45 +08:00
										 |  |  | func isTeamNameTaken(name string, existingId int64, sess *DBSession) (bool, error) { | 
					
						
							|  |  |  | 	var team m.Team | 
					
						
							|  |  |  | 	exists, err := sess.Where("name=?", name).Get(&team) | 
					
						
							| 
									
										
										
										
											2017-04-09 06:55:07 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  | 	if err != nil { | 
					
						
							|  |  |  | 		return false, nil | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-12-08 23:25:45 +08:00
										 |  |  | 	if exists && existingId != team.Id { | 
					
						
							| 
									
										
										
										
											2017-04-09 06:55:07 +08:00
										 |  |  | 		return true, nil | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	return false, nil | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-12-08 23:25:45 +08:00
										 |  |  | func SearchTeams(query *m.SearchTeamsQuery) error { | 
					
						
							|  |  |  | 	query.Result = m.SearchTeamQueryResult{ | 
					
						
							| 
									
										
										
										
											2017-12-15 00:22:45 +08:00
										 |  |  | 		Teams: make([]*m.SearchTeamDto, 0), | 
					
						
							| 
									
										
										
										
											2017-04-10 07:24:16 +08:00
										 |  |  | 	} | 
					
						
							|  |  |  | 	queryWithWildcards := "%" + query.Query + "%" | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-12-15 00:22:45 +08:00
										 |  |  | 	var sql bytes.Buffer | 
					
						
							|  |  |  | 	params := make([]interface{}, 0) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	sql.WriteString(`select | 
					
						
							|  |  |  | 		team.id as id, | 
					
						
							|  |  |  | 		team.name as name, | 
					
						
							|  |  |  | 		(select count(*) from team_member where team_member.team_id = team.id) as member_count | 
					
						
							|  |  |  | 		from team as team | 
					
						
							|  |  |  | 		where team.org_id = ?`) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	params = append(params, query.OrgId) | 
					
						
							| 
									
										
										
										
											2017-06-24 02:55:53 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-04-09 06:55:07 +08:00
										 |  |  | 	if query.Query != "" { | 
					
						
							| 
									
										
										
										
											2017-12-15 00:22:45 +08:00
										 |  |  | 		sql.WriteString(` and team.name ` + dialect.LikeStr() + ` ?`) | 
					
						
							|  |  |  | 		params = append(params, queryWithWildcards) | 
					
						
							| 
									
										
										
										
											2017-04-09 06:55:07 +08:00
										 |  |  | 	} | 
					
						
							| 
									
										
										
										
											2017-12-15 00:22:45 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-04-09 06:55:07 +08:00
										 |  |  | 	if query.Name != "" { | 
					
						
							| 
									
										
										
										
											2017-12-15 00:22:45 +08:00
										 |  |  | 		sql.WriteString(` and team.name = ?`) | 
					
						
							|  |  |  | 		params = append(params, query.Name) | 
					
						
							| 
									
										
										
										
											2017-04-09 06:55:07 +08:00
										 |  |  | 	} | 
					
						
							| 
									
										
										
										
											2017-06-24 02:55:53 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-12-15 00:22:45 +08:00
										 |  |  | 	sql.WriteString(` order by team.name asc`) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	if query.Limit != 0 { | 
					
						
							|  |  |  | 		sql.WriteString(` limit ? offset ?`) | 
					
						
							|  |  |  | 		offset := query.Limit * (query.Page - 1) | 
					
						
							|  |  |  | 		params = append(params, query.Limit, offset) | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	if err := x.Sql(sql.String(), params...).Find(&query.Result.Teams); err != nil { | 
					
						
							| 
									
										
										
										
											2017-04-10 07:24:16 +08:00
										 |  |  | 		return err | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-12-08 23:25:45 +08:00
										 |  |  | 	team := m.Team{} | 
					
						
							|  |  |  | 	countSess := x.Table("team") | 
					
						
							| 
									
										
										
										
											2017-04-10 07:24:16 +08:00
										 |  |  | 	if query.Query != "" { | 
					
						
							| 
									
										
										
										
											2017-12-15 00:22:45 +08:00
										 |  |  | 		countSess.Where(`name `+dialect.LikeStr()+` ?`, queryWithWildcards) | 
					
						
							| 
									
										
										
										
											2017-04-10 07:24:16 +08:00
										 |  |  | 	} | 
					
						
							| 
									
										
										
										
											2017-12-15 00:22:45 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-04-10 07:24:16 +08:00
										 |  |  | 	if query.Name != "" { | 
					
						
							|  |  |  | 		countSess.Where("name=?", query.Name) | 
					
						
							|  |  |  | 	} | 
					
						
							| 
									
										
										
										
											2017-12-15 00:22:45 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-12-08 23:25:45 +08:00
										 |  |  | 	count, err := countSess.Count(&team) | 
					
						
							| 
									
										
										
										
											2017-04-10 07:24:16 +08:00
										 |  |  | 	query.Result.TotalCount = count | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-04-09 06:55:07 +08:00
										 |  |  | 	return err | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-12-08 23:25:45 +08:00
										 |  |  | func GetTeamById(query *m.GetTeamByIdQuery) error { | 
					
						
							|  |  |  | 	var team m.Team | 
					
						
							|  |  |  | 	exists, err := x.Id(query.Id).Get(&team) | 
					
						
							| 
									
										
										
										
											2017-04-09 06:55:07 +08:00
										 |  |  | 	if err != nil { | 
					
						
							|  |  |  | 		return err | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	if !exists { | 
					
						
							| 
									
										
										
										
											2017-12-08 23:25:45 +08:00
										 |  |  | 		return m.ErrTeamNotFound | 
					
						
							| 
									
										
										
										
											2017-04-09 06:55:07 +08:00
										 |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-12-08 23:25:45 +08:00
										 |  |  | 	query.Result = &team | 
					
						
							| 
									
										
										
										
											2017-04-09 06:55:07 +08:00
										 |  |  | 	return nil | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-12-08 23:25:45 +08:00
										 |  |  | func GetTeamsByUser(query *m.GetTeamsByUserQuery) error { | 
					
						
							|  |  |  | 	query.Result = make([]*m.Team, 0) | 
					
						
							| 
									
										
										
										
											2017-05-22 16:33:17 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-12-08 23:25:45 +08:00
										 |  |  | 	sess := x.Table("team") | 
					
						
							|  |  |  | 	sess.Join("INNER", "team_member", "team.id=team_member.team_id") | 
					
						
							|  |  |  | 	sess.Where("team_member.user_id=?", query.UserId) | 
					
						
							| 
									
										
										
										
											2017-05-22 16:33:17 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  | 	err := sess.Find(&query.Result) | 
					
						
							|  |  |  | 	if err != nil { | 
					
						
							|  |  |  | 		return err | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	return nil | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-12-08 23:25:45 +08:00
										 |  |  | func AddTeamMember(cmd *m.AddTeamMemberCommand) error { | 
					
						
							| 
									
										
										
										
											2017-05-24 22:19:21 +08:00
										 |  |  | 	return inTransaction(func(sess *DBSession) error { | 
					
						
							| 
									
										
										
										
											2017-12-08 23:25:45 +08:00
										 |  |  | 		if res, err := sess.Query("SELECT 1 from team_member WHERE team_id=? and user_id=?", cmd.TeamId, cmd.UserId); err != nil { | 
					
						
							| 
									
										
										
										
											2017-04-09 06:55:07 +08:00
										 |  |  | 			return err | 
					
						
							|  |  |  | 		} else if len(res) == 1 { | 
					
						
							| 
									
										
										
										
											2017-12-08 23:25:45 +08:00
										 |  |  | 			return m.ErrTeamMemberAlreadyAdded | 
					
						
							| 
									
										
										
										
											2017-04-09 06:55:07 +08:00
										 |  |  | 		} | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-12-08 23:25:45 +08:00
										 |  |  | 		if res, err := sess.Query("SELECT 1 from team WHERE id=?", cmd.TeamId); err != nil { | 
					
						
							| 
									
										
										
										
											2017-04-09 06:55:07 +08:00
										 |  |  | 			return err | 
					
						
							|  |  |  | 		} else if len(res) != 1 { | 
					
						
							| 
									
										
										
										
											2017-12-08 23:25:45 +08:00
										 |  |  | 			return m.ErrTeamNotFound | 
					
						
							| 
									
										
										
										
											2017-04-09 06:55:07 +08:00
										 |  |  | 		} | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-12-08 23:25:45 +08:00
										 |  |  | 		entity := m.TeamMember{ | 
					
						
							| 
									
										
										
										
											2017-12-12 00:46:05 +08:00
										 |  |  | 			OrgId:   cmd.OrgId, | 
					
						
							|  |  |  | 			TeamId:  cmd.TeamId, | 
					
						
							|  |  |  | 			UserId:  cmd.UserId, | 
					
						
							|  |  |  | 			Created: time.Now(), | 
					
						
							|  |  |  | 			Updated: time.Now(), | 
					
						
							| 
									
										
										
										
											2017-04-09 06:55:07 +08:00
										 |  |  | 		} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 		_, err := sess.Insert(&entity) | 
					
						
							|  |  |  | 		return err | 
					
						
							|  |  |  | 	}) | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-12-08 23:25:45 +08:00
										 |  |  | func RemoveTeamMember(cmd *m.RemoveTeamMemberCommand) error { | 
					
						
							| 
									
										
										
										
											2017-05-24 22:19:21 +08:00
										 |  |  | 	return inTransaction(func(sess *DBSession) error { | 
					
						
							| 
									
										
										
										
											2017-12-08 23:25:45 +08:00
										 |  |  | 		var rawSql = "DELETE FROM team_member WHERE team_id=? and user_id=?" | 
					
						
							|  |  |  | 		_, err := sess.Exec(rawSql, cmd.TeamId, cmd.UserId) | 
					
						
							| 
									
										
										
										
											2017-04-09 06:55:07 +08:00
										 |  |  | 		if err != nil { | 
					
						
							|  |  |  | 			return err | 
					
						
							|  |  |  | 		} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 		return err | 
					
						
							|  |  |  | 	}) | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-12-08 23:25:45 +08:00
										 |  |  | func GetTeamMembers(query *m.GetTeamMembersQuery) error { | 
					
						
							|  |  |  | 	query.Result = make([]*m.TeamMemberDTO, 0) | 
					
						
							|  |  |  | 	sess := x.Table("team_member") | 
					
						
							|  |  |  | 	sess.Join("INNER", "user", fmt.Sprintf("team_member.user_id=%s.id", x.Dialect().Quote("user"))) | 
					
						
							|  |  |  | 	sess.Where("team_member.team_id=?", query.TeamId) | 
					
						
							|  |  |  | 	sess.Cols("user.org_id", "team_member.team_id", "team_member.user_id", "user.email", "user.login") | 
					
						
							| 
									
										
										
										
											2017-06-24 02:55:53 +08:00
										 |  |  | 	sess.Asc("user.login", "user.email") | 
					
						
							| 
									
										
										
										
											2017-04-09 06:55:07 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  | 	err := sess.Find(&query.Result) | 
					
						
							|  |  |  | 	return err | 
					
						
							|  |  |  | } |