diff --git a/pkg/api/admin_users.go b/pkg/api/admin_users.go
index 0ffe0612ac0..9402eb41b20 100644
--- a/pkg/api/admin_users.go
+++ b/pkg/api/admin_users.go
@@ -8,9 +8,6 @@ import (
)
func AdminSearchUsers(c *middleware.Context) {
- // query := c.QueryStrings("q")
- // page := c.QueryStrings("p")
-
query := m.SearchUsersQuery{Query: "", Page: 0, Limit: 20}
if err := bus.Dispatch(&query); err != nil {
c.JsonApiErr(500, "Failed to fetch users", err)
@@ -93,3 +90,16 @@ func AdminUpdateUser(c *middleware.Context, form dtos.AdminUpdateUserForm) {
c.JsonOK("User updated")
}
+
+func AdminDeleteUser(c *middleware.Context) {
+ userId := c.ParamsInt64(":id")
+
+ cmd := m.DeleteUserCommand{UserId: userId}
+
+ if err := bus.Dispatch(&cmd); err != nil {
+ c.JsonApiErr(500, "Failed to delete user", err)
+ return
+ }
+
+ c.JsonOK("User deleted")
+}
diff --git a/pkg/api/api.go b/pkg/api/api.go
index 4da20db956f..a9f6b5d5dc6 100644
--- a/pkg/api/api.go
+++ b/pkg/api/api.go
@@ -98,6 +98,7 @@ func Register(r *macaron.Macaron) {
r.Get("/users/:id", AdminGetUser)
r.Post("/users", bind(dtos.AdminCreateUserForm{}), AdminCreateUser)
r.Put("/users/:id", bind(dtos.AdminUpdateUserForm{}), AdminUpdateUser)
+ r.Delete("/users/:id", AdminDeleteUser)
}, reqGrafanaAdmin)
// rendering
diff --git a/pkg/models/user.go b/pkg/models/user.go
index b63ded299c7..10ec03791a3 100644
--- a/pkg/models/user.go
+++ b/pkg/models/user.go
@@ -50,6 +50,10 @@ type UpdateUserCommand struct {
UserId int64 `json:"-"`
}
+type DeleteUserCommand struct {
+ UserId int64
+}
+
type SetUsingAccountCommand struct {
UserId int64
AccountId int64
diff --git a/pkg/services/sqlstore/user.go b/pkg/services/sqlstore/user.go
index ac7286af77c..2034b0ff347 100644
--- a/pkg/services/sqlstore/user.go
+++ b/pkg/services/sqlstore/user.go
@@ -1,6 +1,7 @@
package sqlstore
import (
+ "fmt"
"strings"
"time"
@@ -23,6 +24,7 @@ func init() {
bus.AddHandler("sql", GetSignedInUser)
bus.AddHandler("sql", SearchUsers)
bus.AddHandler("sql", GetUserAccounts)
+ bus.AddHandler("sql", DeleteUser)
}
func getAccountIdForNewUser(userEmail string, sess *session) (int64, error) {
@@ -256,3 +258,11 @@ func SearchUsers(query *m.SearchUsersQuery) error {
err := sess.Find(&query.Result)
return err
}
+
+func DeleteUser(cmd *m.DeleteUserCommand) error {
+ return inTransaction(func(sess *xorm.Session) error {
+ var rawSql = fmt.Sprintf("DELETE FROM %s WHERE id=?", x.Dialect().Quote("user"))
+ _, err := sess.Exec(rawSql, cmd.UserId)
+ return err
+ })
+}
diff --git a/src/app/features/admin/adminUsersCtrl.js b/src/app/features/admin/adminUsersCtrl.js
index ce5cc7a3b86..bf8e998a16f 100644
--- a/src/app/features/admin/adminUsersCtrl.js
+++ b/src/app/features/admin/adminUsersCtrl.js
@@ -24,7 +24,9 @@ function (angular) {
title: 'Delete user',
text: 'Are you sure you want to delete user: ' + user.login,
onConfirm: function() {
- backendSrv.delete('/api/admin/users/delete/' + user.id);
+ backendSrv.delete('/api/admin/users/' + user.id).then(function() {
+ $scope.getUsers();
+ });
}
});
};
diff --git a/src/app/features/admin/partials/users.html b/src/app/features/admin/partials/users.html
index fb59f6ee514..5a5b2af97e0 100644
--- a/src/app/features/admin/partials/users.html
+++ b/src/app/features/admin/partials/users.html
@@ -33,7 +33,7 @@
Edit
-
+