mirror of
https://github.com/grafana/grafana.git
synced 2025-02-25 18:55:37 -06:00
user picker should only include users from current org (#10845)
This commit is contained in:
parent
864e2647db
commit
a86f2fa34b
@ -46,26 +46,30 @@ func addOrgUserHelper(cmd m.AddOrgUserCommand) Response {
|
|||||||
|
|
||||||
// GET /api/org/users
|
// GET /api/org/users
|
||||||
func GetOrgUsersForCurrentOrg(c *middleware.Context) Response {
|
func GetOrgUsersForCurrentOrg(c *middleware.Context) Response {
|
||||||
return getOrgUsersHelper(c.OrgId)
|
return getOrgUsersHelper(c.OrgId, c.Params("query"), c.ParamsInt("limit"))
|
||||||
}
|
}
|
||||||
|
|
||||||
// GET /api/orgs/:orgId/users
|
// GET /api/orgs/:orgId/users
|
||||||
func GetOrgUsers(c *middleware.Context) Response {
|
func GetOrgUsers(c *middleware.Context) Response {
|
||||||
return getOrgUsersHelper(c.ParamsInt64(":orgId"))
|
return getOrgUsersHelper(c.ParamsInt64(":orgId"), "", 0)
|
||||||
}
|
}
|
||||||
|
|
||||||
func getOrgUsersHelper(orgId int64) Response {
|
func getOrgUsersHelper(orgId int64, query string, limit int) Response {
|
||||||
query := m.GetOrgUsersQuery{OrgId: orgId}
|
q := m.GetOrgUsersQuery{
|
||||||
|
OrgId: orgId,
|
||||||
|
Query: query,
|
||||||
|
Limit: limit,
|
||||||
|
}
|
||||||
|
|
||||||
if err := bus.Dispatch(&query); err != nil {
|
if err := bus.Dispatch(&q); err != nil {
|
||||||
return ApiError(500, "Failed to get account user", err)
|
return ApiError(500, "Failed to get account user", err)
|
||||||
}
|
}
|
||||||
|
|
||||||
for _, user := range query.Result {
|
for _, user := range q.Result {
|
||||||
user.AvatarUrl = dtos.GetGravatarUrl(user.Email)
|
user.AvatarUrl = dtos.GetGravatarUrl(user.Email)
|
||||||
}
|
}
|
||||||
|
|
||||||
return Json(200, query.Result)
|
return Json(200, q.Result)
|
||||||
}
|
}
|
||||||
|
|
||||||
// PATCH /api/org/users/:userId
|
// PATCH /api/org/users/:userId
|
||||||
|
@ -95,7 +95,10 @@ type UpdateOrgUserCommand struct {
|
|||||||
// QUERIES
|
// QUERIES
|
||||||
|
|
||||||
type GetOrgUsersQuery struct {
|
type GetOrgUsersQuery struct {
|
||||||
OrgId int64
|
OrgId int64
|
||||||
|
Query string
|
||||||
|
Limit int
|
||||||
|
|
||||||
Result []*OrgUserDTO
|
Result []*OrgUserDTO
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -123,6 +123,31 @@ func TestAccountDataAccess(t *testing.T) {
|
|||||||
So(query.Result[0].Role, ShouldEqual, "Admin")
|
So(query.Result[0].Role, ShouldEqual, "Admin")
|
||||||
})
|
})
|
||||||
|
|
||||||
|
Convey("Can get organization users with query", func() {
|
||||||
|
query := m.GetOrgUsersQuery{
|
||||||
|
OrgId: ac1.OrgId,
|
||||||
|
Query: "ac1",
|
||||||
|
}
|
||||||
|
err := GetOrgUsers(&query)
|
||||||
|
|
||||||
|
So(err, ShouldBeNil)
|
||||||
|
So(len(query.Result), ShouldEqual, 1)
|
||||||
|
So(query.Result[0].Email, ShouldEqual, ac1.Email)
|
||||||
|
})
|
||||||
|
|
||||||
|
Convey("Can get organization users with query and limit", func() {
|
||||||
|
query := m.GetOrgUsersQuery{
|
||||||
|
OrgId: ac1.OrgId,
|
||||||
|
Query: "ac",
|
||||||
|
Limit: 1,
|
||||||
|
}
|
||||||
|
err := GetOrgUsers(&query)
|
||||||
|
|
||||||
|
So(err, ShouldBeNil)
|
||||||
|
So(len(query.Result), ShouldEqual, 1)
|
||||||
|
So(query.Result[0].Email, ShouldEqual, ac1.Email)
|
||||||
|
})
|
||||||
|
|
||||||
Convey("Can set using org", func() {
|
Convey("Can set using org", func() {
|
||||||
cmd := m.SetUsingOrgCommand{UserId: ac2.Id, OrgId: ac1.Id}
|
cmd := m.SetUsingOrgCommand{UserId: ac2.Id, OrgId: ac1.Id}
|
||||||
err := SetUsingOrg(&cmd)
|
err := SetUsingOrg(&cmd)
|
||||||
|
@ -2,6 +2,7 @@ package sqlstore
|
|||||||
|
|
||||||
import (
|
import (
|
||||||
"fmt"
|
"fmt"
|
||||||
|
"strings"
|
||||||
"time"
|
"time"
|
||||||
|
|
||||||
"github.com/grafana/grafana/pkg/bus"
|
"github.com/grafana/grafana/pkg/bus"
|
||||||
@ -69,9 +70,30 @@ func UpdateOrgUser(cmd *m.UpdateOrgUserCommand) error {
|
|||||||
|
|
||||||
func GetOrgUsers(query *m.GetOrgUsersQuery) error {
|
func GetOrgUsers(query *m.GetOrgUsersQuery) error {
|
||||||
query.Result = make([]*m.OrgUserDTO, 0)
|
query.Result = make([]*m.OrgUserDTO, 0)
|
||||||
|
|
||||||
sess := x.Table("org_user")
|
sess := x.Table("org_user")
|
||||||
sess.Join("INNER", "user", fmt.Sprintf("org_user.user_id=%s.id", x.Dialect().Quote("user")))
|
sess.Join("INNER", "user", fmt.Sprintf("org_user.user_id=%s.id", x.Dialect().Quote("user")))
|
||||||
sess.Where("org_user.org_id=?", query.OrgId)
|
|
||||||
|
whereConditions := make([]string, 0)
|
||||||
|
whereParams := make([]interface{}, 0)
|
||||||
|
|
||||||
|
whereConditions = append(whereConditions, "org_user.org_id = ?")
|
||||||
|
whereParams = append(whereParams, query.OrgId)
|
||||||
|
|
||||||
|
if query.Query != "" {
|
||||||
|
queryWithWildcards := "%" + query.Query + "%"
|
||||||
|
whereConditions = append(whereConditions, "(user.email "+dialect.LikeStr()+" ? OR user.name "+dialect.LikeStr()+" ? OR user.login "+dialect.LikeStr()+" ?)")
|
||||||
|
whereParams = append(whereParams, queryWithWildcards, queryWithWildcards, queryWithWildcards)
|
||||||
|
}
|
||||||
|
|
||||||
|
if len(whereConditions) > 0 {
|
||||||
|
sess.Where(strings.Join(whereConditions, " AND "), whereParams...)
|
||||||
|
}
|
||||||
|
|
||||||
|
if query.Limit > 0 {
|
||||||
|
sess.Limit(query.Limit, 0)
|
||||||
|
}
|
||||||
|
|
||||||
sess.Cols("org_user.org_id", "org_user.user_id", "user.email", "user.login", "org_user.role", "user.last_seen_at")
|
sess.Cols("org_user.org_id", "org_user.user_id", "user.email", "user.login", "org_user.role", "user.last_seen_at")
|
||||||
sess.Asc("user.email", "user.login")
|
sess.Asc("user.email", "user.login")
|
||||||
|
|
||||||
|
@ -31,7 +31,7 @@ class UserPicker extends Component<IProps, any> {
|
|||||||
|
|
||||||
this.debouncedSearch = debounce(this.search, 300, {
|
this.debouncedSearch = debounce(this.search, 300, {
|
||||||
leading: true,
|
leading: true,
|
||||||
trailing: false,
|
trailing: true,
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -39,10 +39,10 @@ class UserPicker extends Component<IProps, any> {
|
|||||||
const { toggleLoading, backendSrv } = this.props;
|
const { toggleLoading, backendSrv } = this.props;
|
||||||
|
|
||||||
toggleLoading(true);
|
toggleLoading(true);
|
||||||
return backendSrv.get(`/api/users/search?perpage=10&page=1&query=${query}`).then(result => {
|
return backendSrv.get(`/api/org/users?query=${query}&limit=10`).then(result => {
|
||||||
const users = result.users.map(user => {
|
const users = result.map(user => {
|
||||||
return {
|
return {
|
||||||
id: user.id,
|
id: user.userId,
|
||||||
label: `${user.login} - ${user.email}`,
|
label: `${user.login} - ${user.email}`,
|
||||||
avatarUrl: user.avatarUrl,
|
avatarUrl: user.avatarUrl,
|
||||||
login: user.login,
|
login: user.login,
|
||||||
|
Loading…
Reference in New Issue
Block a user