Skip to content
This repository was archived by the owner on Apr 27, 2023. It is now read-only.

Commit 75b9f3c

Browse files
committed
Added delete a user service ,Added remove icon and refresh the user list
after remove
1 parent 26943b5 commit 75b9f3c

7 files changed

Lines changed: 54 additions & 7 deletions

File tree

codebrag-dao/src/main/scala/com/softwaremill/codebrag/dao/user/SQLUserDAO.scala

Lines changed: 10 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -31,7 +31,7 @@ class SQLUserDAO(val database: SQLDatabase) extends UserDAO with SQLUserSchema {
3131
}
3232

3333
def findById(userId: ObjectId) = findOneWhere(_.id === userId)
34-
34+
3535
def findByEmail(email: String) = findOneWhere(_.emailLowerCase === email.toLowerCase)
3636

3737
def findByLowerCasedLogin(login: String) = db.withTransaction { implicit session =>
@@ -124,7 +124,7 @@ class SQLUserDAO(val database: SQLDatabase) extends UserDAO with SQLUserSchema {
124124
} yield (u, a, s, l)
125125
userQuery.firstOption.map(queryUserAliases).map(untuple)
126126
}
127-
127+
128128
private def queryUserAliases(tuple: (UserTuple, SQLAuth, SQLSettings, SQLLastNotif))(implicit session: Session) = {
129129
val userId = tuple._1._1
130130
val aliases = userAliases.where(_.userId === userId).list()
@@ -135,4 +135,11 @@ class SQLUserDAO(val database: SQLDatabase) extends UserDAO with SQLUserSchema {
135135
val aliases = userAliases.where(_.userId === tuple._1).list()
136136
(tuple._1, tuple._2, tuple._3, tuple._4, UserAliases(aliases.map(_.toUserAlias)))
137137
}
138-
}
138+
139+
def delete(userId: ObjectId) {
140+
db.withTransaction { implicit session =>
141+
users.filter(_.id === userId).delete
142+
}
143+
}
144+
145+
}

codebrag-dao/src/main/scala/com/softwaremill/codebrag/dao/user/UserDAO.scala

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -40,4 +40,7 @@ trait UserDAO {
4040
def countAll(): Long
4141

4242
def countAllActive(): Long
43+
44+
def delete(userId: ObjectId)
45+
4346
}

codebrag-rest/src/main/scala/com/softwaremill/codebrag/rest/UsersServlet.scala

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -34,8 +34,12 @@ class UsersServlet(
3434
case _ => scalatra.Ok()
3535
}
3636
}
37-
37+
delete("/:id") {
38+
haltIfNotAuthenticated()
39+
modifyUserUseCase.delete(new ObjectId(params("id")))
40+
}
3841
}
42+
3943

4044
object UsersServlet {
4145
val MappingPath = "users"

codebrag-service/src/main/scala/com/softwaremill/codebrag/usecases/user/ModifyUserDetailsUseCase.scala

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -51,4 +51,8 @@ class ModifyUserDetailsUseCase(protected val userDao: UserDAO) extends Logging {
5151
validate(checkUserActive, changeOwnFlagsCheck)
5252
}
5353

54+
def delete(userId: ObjectId) = {
55+
userDao.delete(userId)
56+
}
57+
5458
}

codebrag-ui/app/scripts/users/manageUsersPopupCtrl.js

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -26,17 +26,37 @@ angular.module('codebrag.userMgmt')
2626
});
2727
};
2828

29+
$scope.deleteUser = function(userId) {
30+
$scope.flash.clear();
31+
var userData = { userId: userId };
32+
userMgmtService.deleteUser(userId).then(deleteSuccess, deleteFailed('active', userId))
33+
userMgmtService.loadUsers().then(function(users) {
34+
$scope.users = users;
35+
});
36+
};
37+
2938
$scope.askForNewPassword = function(user) {
3039
$scope.flash.clear();
3140
var modal = popupsService.openSetUserPasswordPopup(user);
3241
modal.result.then(function() {
3342
$scope.flash.add('info', 'User password changed');
3443
});
3544
};
45+
function deleteSuccess() {
46+
$scope.flash.add('error', 'User is removed');
47+
}
3648

3749
function modifySuccess() {
3850
$scope.flash.add('info', 'User details changed');
3951
}
52+
function deleteFailed(flag, userId) {
53+
return function(errorsMap) {
54+
$scope.flash.add('error', 'Could not change user details');
55+
flattenErrorsMap(errorsMap).forEach(function(error) {
56+
$scope.flash.add('error', error);
57+
});
58+
}
59+
}
4060

4161
function modifyFailed(flag, user) {
4262
return function(errorsMap) {

codebrag-ui/app/scripts/users/userMgmtService.js

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,11 @@ angular.module('codebrag.userMgmt')
1919
return $http.put(modifyUserUrl, userData).then(null, modifyUserFailed);
2020
};
2121

22+
this.deleteUser = function(userId) {
23+
var modifyUserUrl = [usersApiUrl, '/', userId].join('');
24+
return $http.delete(modifyUserUrl).then(null, modifyUserFailed);
25+
};
26+
2227
function modifyUserFailed(response) {
2328
return $q.reject(response.data);
2429
}
@@ -34,4 +39,4 @@ angular.module('codebrag.userMgmt')
3439
$modal.open(config)
3540
}
3641

37-
});
42+
});

codebrag-ui/app/views/popups/manageUsers.html

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -21,17 +21,21 @@ <h1>Manage team members
2121
</th>
2222
<th class="cell-centered">
2323
<div class="thead">Admin?</div>
24-
</th>
24+
</th>
2525
<th>
2626
<div class="thead">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</div>
2727
</th>
28+
<th class="cell-centered">
29+
<div class="thead">&nbsp;&nbsp;</div>
30+
</th>
2831
</thead>
2932
<tbody>
3033
<tr ng-repeat="user in users">
3134
<td class="user-email">{{ user.email}}</td>
3235
<td class="cell-centered"><input type="checkbox" ng-model="user.active" ng-click="modifyUser(user, 'active')" ng-disabled="user.locked"/></td>
3336
<td class="cell-centered"><input type="checkbox" ng-model="user.admin" ng-click="modifyUser(user, 'admin')" ng-disabled="user.locked"/></td>
3437
<td><button class="link" ng-disabled="!user.active" ng-click="askForNewPassword(user)">Set&nbsp;password</button></td>
38+
<td><i class="icon-remove" ng-hide="user.admin" ng-disabled="user.locked" ng-click="deleteUser(user.userId)"></i></td>
3539
</tr>
3640
</tbody>
3741
</table>
@@ -45,4 +49,4 @@ <h1>Manage team members
4549
<span class="close-btn" ng-click="$close()">
4650
<i class="icon-remove"></i>
4751
</span>
48-
</div>
52+
</div>

0 commit comments

Comments
 (0)