grafana/pkg/services/sqlstore/team.go

234 lines
5.0 KiB
Go
Raw Normal View History

package sqlstore
import (
"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-12-08 23:25:45 +08:00
func CreateTeam(cmd *m.CreateTeamCommand) error {
return inTransaction(func(sess *DBSession) error {
2017-12-08 23:25:45 +08:00
if isNameTaken, err := isTeamNameTaken(cmd.Name, 0, sess); err != nil {
return err
} else if isNameTaken {
2017-12-08 23:25:45 +08:00
return m.ErrTeamNameTaken
}
2017-12-08 23:25:45 +08:00
team := m.Team{
Name: cmd.Name,
OrgId: cmd.OrgId,
Created: time.Now(),
Updated: time.Now(),
}
2017-12-08 23:25:45 +08:00
_, err := sess.Insert(&team)
2017-12-08 23:25:45 +08:00
cmd.Result = team
return err
})
}
2017-12-08 23:25:45 +08:00
func UpdateTeam(cmd *m.UpdateTeamCommand) error {
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 {
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 {
return err
} else if len(res) != 1 {
2017-12-08 23:25:45 +08:00
return m.ErrTeamNotFound
}
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 = ?",
}
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)
if err != nil {
return false, nil
}
2017-12-08 23:25:45 +08:00
if exists && existingId != team.Id {
return true, nil
}
return false, nil
}
2017-12-08 23:25:45 +08:00
func SearchTeams(query *m.SearchTeamsQuery) error {
query.Result = m.SearchTeamQueryResult{
Teams: make([]*m.Team, 0),
2017-04-10 07:24:16 +08:00
}
queryWithWildcards := "%" + query.Query + "%"
2017-12-08 23:25:45 +08:00
sess := x.Table("team")
sess.Where("org_id=?", query.OrgId)
if query.Query != "" {
2017-04-10 07:24:16 +08:00
sess.Where("name LIKE ?", queryWithWildcards)
}
if query.Name != "" {
sess.Where("name=?", query.Name)
}
sess.Asc("name")
2017-04-10 07:24:16 +08:00
offset := query.Limit * (query.Page - 1)
sess.Limit(query.Limit, offset)
sess.Cols("id", "name")
2017-12-08 23:25:45 +08:00
if err := sess.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{}
2017-04-10 07:24:16 +08:00
2017-12-08 23:25:45 +08:00
countSess := x.Table("team")
2017-04-10 07:24:16 +08:00
if query.Query != "" {
countSess.Where("name LIKE ?", queryWithWildcards)
}
if query.Name != "" {
countSess.Where("name=?", query.Name)
}
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
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)
if err != nil {
return err
}
if !exists {
2017-12-08 23:25:45 +08:00
return m.ErrTeamNotFound
}
2017-12-08 23:25:45 +08:00
query.Result = &team
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 {
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 {
return err
} else if len(res) == 1 {
2017-12-08 23:25:45 +08:00
return m.ErrTeamMemberAlreadyAdded
}
2017-12-08 23:25:45 +08:00
if res, err := sess.Query("SELECT 1 from team WHERE id=?", cmd.TeamId); err != nil {
return err
} else if len(res) != 1 {
2017-12-08 23:25:45 +08:00
return m.ErrTeamNotFound
}
2017-12-08 23:25:45 +08:00
entity := m.TeamMember{
OrgId: cmd.OrgId,
2017-12-08 23:25:45 +08:00
TeamId: cmd.TeamId,
UserId: cmd.UserId,
Created: time.Now(),
Updated: time.Now(),
}
_, err := sess.Insert(&entity)
return err
})
}
2017-12-08 23:25:45 +08:00
func RemoveTeamMember(cmd *m.RemoveTeamMemberCommand) error {
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)
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")
sess.Asc("user.login", "user.email")
err := sess.Find(&query.Result)
return err
}