switch provider app to 8080, tidy up users resource and clean up export code for reports.

This commit is contained in:
Keith Woodlock
2012-05-14 16:01:24 +01:00
parent 7947dda4fe
commit 5ccecb8bc4
20 changed files with 367 additions and 540 deletions
@@ -21,7 +21,7 @@ public class UserCommand implements Serializable {
private Long officeId;
private List<String> notSelectedItems = new ArrayList<String>();
private List<String> selectedItems = new ArrayList<String>();
private String[] selectedItems;
public UserCommand() {
//
@@ -95,11 +95,11 @@ public class UserCommand implements Serializable {
this.notSelectedItems = notSelectedItems;
}
public List<String> getSelectedItems() {
public String[] getSelectedItems() {
return selectedItems;
}
public void setSelectedItems(List<String> selectedItems) {
public void setSelectedItems(String... selectedItems) {
this.selectedItems = selectedItems;
}
}
+1 -1
View File
@@ -333,7 +333,7 @@ CREATE TABLE `admin_appuser` (
`lastmodified_date` datetime DEFAULT NULL,
`lastmodifiedby_id` bigint(20) DEFAULT NULL,
PRIMARY KEY (`id`),
UNIQUE KEY `org_id` (`org_id`,`username`),
UNIQUE KEY `username_org` (`org_id`,`username`),
KEY `FKB3D587CE0DD567A` (`office_id`),
KEY `FKB3D587C54DF2770` (`org_id`),
CONSTRAINT `FKB3D587C54DF2770` FOREIGN KEY (`org_id`) REFERENCES `org_organisation` (`id`),
+1 -1
View File
@@ -41,7 +41,7 @@ CREATE TABLE `admin_appuser` (
`lastmodified_date` datetime DEFAULT NULL,
`lastmodifiedby_id` bigint(20) DEFAULT NULL,
PRIMARY KEY (`id`),
UNIQUE KEY `org_id` (`org_id`,`username`),
UNIQUE KEY `username_org` (`org_id`,`username`),
KEY `FKB3D587CE0DD567A` (`office_id`),
KEY `FKB3D587C54DF2770` (`org_id`),
CONSTRAINT `FKB3D587C54DF2770` FOREIGN KEY (`org_id`) REFERENCES `org_organisation` (`id`),
+1 -1
View File
@@ -91,6 +91,6 @@ dependencies {
}
[tomcatRun, tomcatRunWar, tomcatStop]*.with {
httpPort = 8080
httpPort = 8085
stopPort = 8082
}
@@ -187,7 +187,13 @@
}
o[this.name].push(this.value || '');
} else {
o[this.name] = this.value || '';
if (this.name === 'selectedItems' || this.name === 'notSelectedItems') {
o[this.name] = new Array();
o[this.name].push(this.value || '');
} else {
o[this.name] = this.value || '';
}
}
});
return o;
@@ -397,7 +403,7 @@
$.each(data.offices, function(i, item) {
//alert(item.name);
});
console.log(data);
console.log(data);
var officelistParent = new Object();
officelistParent.items = data.offices;
@@ -114,9 +114,7 @@ $(document).ready(function() {
removeErrors(placeholderDiv);
var jsonErrors = JSON.parse(jqXHR.responseText);
console.log(jsonErrors);
var valErrors = jsonErrors.errors;
console.log(valErrors);
var errorArray = new Array();
var arrayIndex = 0;
$.each(valErrors, function() {
@@ -133,7 +131,6 @@ $(document).ready(function() {
argArray[argArrayIndex] = this.value;
argArrayIndex++;
});
console.log(argArray);
// hardcoded support for six arguments
errorObj.message = jQuery.i18n.prop(this.userMessageGlobalisationCode, argArray[0], argArray[1], argArray[2], argArray[3], argArray[4], argArray[5]);
errorObj.value = this.value;
@@ -166,7 +163,13 @@ $(document).ready(function() {
}
o[this.name].push(this.value || '');
} else {
o[this.name] = this.value || '';
if (this.name === 'selectedItems' || this.name === 'notSelectedItems') {
o[this.name] = new Array();
o[this.name].push(this.value || '');
} else {
o[this.name] = this.value || '';
}
}
});
return o;
@@ -199,7 +202,6 @@ $(document).ready(function() {
$('#selectedItems option').each(function(i) {
$(this).attr("selected", "selected");
});
var newFormData = JSON.stringify($('#entityform').serializeObject());
console.log(newFormData);
@@ -322,14 +324,14 @@ $(document).ready(function() {
}
$('#listusers').click(function(e) {
var listUrl = "http://localhost:8085/mifosng-provider/api/v1/users";
var listUrl = "http://localhost:8080/mifosng-provider/api/v1/users";
refreshUsersView();
e.preventDefault();
});
$('#adduser').click(function(e) {
var url = 'http://localhost:8085/mifosng-provider/api/v1/users/template';
var postUrl = "http://localhost:8085/mifosng-provider/api/v1/users";
var url = 'http://localhost:8080/mifosng-provider/api/v1/users/template';
var postUrl = "http://localhost:8080/mifosng-provider/api/v1/users";
var templateSelector = "#userFormTemplate";
var width = 1000;
var height = 550;
@@ -405,10 +407,10 @@ $(document).ready(function() {
function refreshUsersView() {
var listUrl = 'http://localhost:8085/mifosng-provider/api/v1/users';
var listUrl = 'http://localhost:8080/mifosng-provider/api/v1/users';
var templateSelector = "#usersListTemplate";
var displayAreaDivSelector = "#contentplaceholder";
var singleEntityPrefixUrl = 'http://localhost:8085/mifosng-provider/api/v1/users/';
var singleEntityPrefixUrl = 'http://localhost:8080/mifosng-provider/api/v1/users/';
var singleEntityTemplateSelector = "#userFormTemplate";
var jqxhr = $.ajax({
@@ -424,8 +426,8 @@ $(document).ready(function() {
$("a.edit").click( function(e) {
var linkId = this.id;
var entityId = linkId.replace("edit", "");
var getUrl = 'http://localhost:8085/mifosng-provider/api/v1/users/' + entityId;
var putUrl = 'http://localhost:8085/mifosng-provider/api/v1/users/' + entityId;
var getUrl = 'http://localhost:8080/mifosng-provider/api/v1/users/' + entityId;
var putUrl = 'http://localhost:8080/mifosng-provider/api/v1/users/' + entityId;
var templateSelector = "#userFormTemplate";
var width = 600;
@@ -443,7 +445,7 @@ $(document).ready(function() {
$("a.delete").click( function(e) {
var linkId = this.id;
var entityId = linkId.replace("delete", "");
var url = 'http://localhost:8085/mifosng-provider/api/v1/users/' + entityId;
var url = 'http://localhost:8080/mifosng-provider/api/v1/users/' + entityId;
showNotAvailableDialog('dialog.title.functionality.not.available');
e.preventDefault();
+1 -1
View File
@@ -123,6 +123,6 @@ dependencies {
[tomcatRun, tomcatRunWar, tomcatStop]*.with {
configFile = file('src/test/resources/META-INF/context.xml')
httpPort = 8085
httpPort = 8080
stopPort = 8081
}
@@ -1,71 +0,0 @@
package org.mifosng.platform;
import java.util.ArrayList;
import java.util.List;
import org.apache.commons.lang.StringUtils;
import org.mifosng.data.ErrorResponse;
import org.mifosng.data.command.UserCommand;
import org.mifosng.platform.exceptions.NewDataValidationException;
public class UserCommandValidator {
private final UserCommand command;
public UserCommandValidator(UserCommand command) {
this.command = command;
}
public void validate() {
List<ErrorResponse> dataValidationErrors = new ArrayList<ErrorResponse>();
validateAccountSettings(dataValidationErrors);
if (command.getOfficeId() == null || command.getOfficeId().equals(Long.valueOf(-1))) {
ErrorResponse error = new ErrorResponse("validation.msg.user.office.cannot.be.blank", "officeId");
dataValidationErrors.add(error);
}
if (command.getSelectedItems() == null) {
ErrorResponse error = new ErrorResponse("validation.msg.user.roles.cannot.be.blank", "selectedItems");
dataValidationErrors.add(error);
}
if (!dataValidationErrors.isEmpty()) {
throw new NewDataValidationException(dataValidationErrors, "Data validation errors exist.");
}
}
public void validateAccountSettingDetails() {
List<ErrorResponse> dataValidationErrors = new ArrayList<ErrorResponse>();
validateAccountSettings(dataValidationErrors);
if (!dataValidationErrors.isEmpty()) {
throw new NewDataValidationException(dataValidationErrors, "Data validation errors exist.");
}
}
private void validateAccountSettings(List<ErrorResponse> dataValidationErrors) {
if (StringUtils.isBlank(command.getUsername())) {
ErrorResponse error = new ErrorResponse("validation.msg.user.username.cannot.be.blank", "username");
dataValidationErrors.add(error);
}
if (StringUtils.isBlank(command.getFirstname())) {
ErrorResponse error = new ErrorResponse("validation.msg.user.firstname.cannot.be.blank", "firstname");
dataValidationErrors.add(error);
}
if (StringUtils.isBlank(command.getLastname())) {
ErrorResponse error = new ErrorResponse("validation.msg.user.lastname.cannot.be.blank", "lastname");
dataValidationErrors.add(error);
}
if (StringUtils.isBlank(command.getEmail())) {
ErrorResponse error = new ErrorResponse("validation.msg.user.email.cannot.be.blank", "email");
dataValidationErrors.add(error);
}
}
}
@@ -8,36 +8,23 @@ import org.mifosng.data.command.LoanStateTransitionCommand;
import org.mifosng.data.command.LoanTransactionCommand;
import org.mifosng.data.command.NoteCommand;
import org.mifosng.data.command.RoleCommand;
import org.mifosng.data.command.SignupCommand;
import org.mifosng.data.command.SubmitLoanApplicationCommand;
import org.mifosng.data.command.UndoLoanApprovalCommand;
import org.mifosng.data.command.UndoLoanDisbursalCommand;
import org.mifosng.data.command.UpdateUsernamePasswordCommand;
import org.mifosng.data.command.UserCommand;
import org.mifosng.platform.exceptions.InvalidSignupException;
import org.springframework.security.access.prepost.PreAuthorize;
public interface WritePlatformService {
Long createUser(UserCommand command);
Long updateUser(UserCommand command);
Long updateCurrentUser(UserCommand command);
Long updateCurrentUserPassword(ChangePasswordCommand command);
void deleteUser(Long userId);
Long createRole(RoleCommand command);
Long updateRole(RoleCommand command);
/**
* @throws InvalidSignupException when sign up fails
*/
Long signup(SignupCommand command);
void updateUsernamePasswordOnFirstTimeLogin(UpdateUsernamePasswordCommand command);
@PreAuthorize(value = "hasAnyRole('PORTFOLIO_MANAGEMENT_SUPER_USER_ROLE', 'CAN_ENROLL_NEW_CLIENT_ROLE')")
@@ -9,13 +9,10 @@ import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collection;
import java.util.HashSet;
import java.util.List;
import java.util.Set;
import org.apache.commons.lang.StringUtils;
import org.joda.time.LocalDate;
import org.mifosng.data.ApiParameterError;
import org.mifosng.data.EntityIdentifier;
import org.mifosng.data.ErrorResponse;
import org.mifosng.data.LoanSchedule;
@@ -29,7 +26,6 @@ import org.mifosng.data.command.LoanStateTransitionCommand;
import org.mifosng.data.command.LoanTransactionCommand;
import org.mifosng.data.command.NoteCommand;
import org.mifosng.data.command.RoleCommand;
import org.mifosng.data.command.SignupCommand;
import org.mifosng.data.command.SubmitLoanApplicationCommand;
import org.mifosng.data.command.UndoLoanApprovalCommand;
import org.mifosng.data.command.UndoLoanDisbursalCommand;
@@ -42,11 +38,7 @@ import org.mifosng.platform.client.domain.NoteRepository;
import org.mifosng.platform.currency.domain.MonetaryCurrency;
import org.mifosng.platform.currency.domain.Money;
import org.mifosng.platform.exceptions.ApplicationDomainRuleException;
import org.mifosng.platform.exceptions.InvalidSignupException;
import org.mifosng.platform.exceptions.NoAuthorizationException;
import org.mifosng.platform.exceptions.PlatformApiDataValidationException;
import org.mifosng.platform.exceptions.PlatformDataIntegrityException;
import org.mifosng.platform.exceptions.PlatformResourceNotFoundException;
import org.mifosng.platform.exceptions.UnAuthenticatedUserException;
import org.mifosng.platform.infrastructure.BasicPasswordEncodablePlatformUser;
import org.mifosng.platform.infrastructure.PlatformPasswordEncoder;
@@ -71,9 +63,6 @@ import org.mifosng.platform.loan.domain.LoanTransactionRepository;
import org.mifosng.platform.loan.domain.PeriodFrequencyType;
import org.mifosng.platform.organisation.domain.Office;
import org.mifosng.platform.organisation.domain.OfficeRepository;
import org.mifosng.platform.organisation.domain.Organisation;
import org.mifosng.platform.organisation.domain.OrganisationCurrency;
import org.mifosng.platform.organisation.domain.OrganisationRepository;
import org.mifosng.platform.user.domain.AppUser;
import org.mifosng.platform.user.domain.AppUserRepository;
import org.mifosng.platform.user.domain.Permission;
@@ -81,7 +70,7 @@ import org.mifosng.platform.user.domain.PermissionRepository;
import org.mifosng.platform.user.domain.PlatformUserRepository;
import org.mifosng.platform.user.domain.Role;
import org.mifosng.platform.user.domain.RoleRepository;
import org.mifosng.platform.user.domain.UserDomainService;
import org.mifosng.platform.user.service.UserCommandValidator;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.dao.DataIntegrityViolationException;
import org.springframework.security.core.Authentication;
@@ -93,9 +82,7 @@ import org.springframework.transaction.annotation.Transactional;
@Service
public class WritePlatformServiceJpaRepositoryImpl implements WritePlatformService {
private final OrganisationRepository organisationRepository;
private final OfficeRepository officeRepository;
private final UserDomainService userDomainService;
private final PlatformUserRepository platformUserRepository;
private final PlatformPasswordEncoder platformPasswordEncoder;
private final ClientRepository clientRepository;
@@ -111,9 +98,7 @@ public class WritePlatformServiceJpaRepositoryImpl implements WritePlatformServi
@Autowired
public WritePlatformServiceJpaRepositoryImpl(
final OrganisationRepository organisationRepository,
final OfficeRepository officeRepository,
final UserDomainService userDomainService,
final PlatformUserRepository platformUserRepository,
final PlatformPasswordEncoder platformPasswordEncoder,
final ClientRepository clientRepository,
@@ -126,9 +111,7 @@ public class WritePlatformServiceJpaRepositoryImpl implements WritePlatformServi
final AppUserRepository appUserRepository,
final RoleRepository roleRepository,
final PermissionRepository permissionRepository) {
this.organisationRepository = organisationRepository;
this.officeRepository = officeRepository;
this.userDomainService = userDomainService;
this.platformUserRepository = platformUserRepository;
this.platformPasswordEncoder = platformPasswordEncoder;
this.clientRepository = clientRepository;
@@ -143,78 +126,6 @@ public class WritePlatformServiceJpaRepositoryImpl implements WritePlatformServi
this.permissionRepository = permissionRepository;
}
@Transactional
@Override
public Long createUser(final UserCommand command) {
try {
AppUser currentUser = extractAuthenticatedUser();
UserCommandValidator validator = new UserCommandValidator(command);
validator.validate();
Set<Role> allRoles = new HashSet<Role>();
for (String roleId : command.getSelectedItems()) {
Role role = this.roleRepository.findOne(Long.valueOf(roleId));
allRoles.add(role);
}
Office office = this.officeRepository.findOne(command.getOfficeId());
AppUser appUser = AppUser.createNew(currentUser.getOrganisation(), office,
allRoles, command.getUsername(), command.getEmail(),
command.getFirstname(), command.getLastname(),
command.getPassword());
this.userDomainService.create(appUser);
return appUser.getId();
} catch (DataIntegrityViolationException e) {
throw new UsernameAlreadyExistsException(e);
}
}
@Transactional
@Override
public Long updateUser(UserCommand command) {
try {
AppUser currentUser = extractAuthenticatedUser();
UserCommandValidator validator = new UserCommandValidator(command);
validator.validate();
List<ApiParameterError> dataValidationErrors = new ArrayList<ApiParameterError>();
if (command.getId() == null) {
ApiParameterError error = ApiParameterError.parameterError("validation.msg.user.id.cannot.be.blank", "The parameter id cannot be empty.", "id");
dataValidationErrors.add(error);
throw new PlatformApiDataValidationException("validation.msg.validation.errors.exist", "Validation errors exist.", dataValidationErrors);
}
Set<Role> allRoles = new HashSet<Role>();
for (String roleId : command.getSelectedItems()) {
Role role = this.roleRepository.findOne(Long.valueOf(roleId));
allRoles.add(role);
}
Office office = this.officeRepository.findOne(command.getOfficeId());
if (office == null) {
throw new PlatformResourceNotFoundException("error.msg.office.id.invalid", "Office with identifier {0} does not exist.", command.getOfficeId());
}
AppUser userToUpdate = this.appUserRepository.findOne(usersThatMatch(currentUser.getOrganisation(), command.getId()));
if (userToUpdate == null) {
throw new PlatformResourceNotFoundException("error.msg.user.id.invalid", "User with identifier {0} does not exist.", command.getId());
}
userToUpdate.update(allRoles, office, command.getUsername(), command.getFirstname(), command.getLastname(), command.getEmail());
return userToUpdate.getId();
} catch (DataIntegrityViolationException e) {
throw new PlatformDataIntegrityException("validation.msg.username.already.exists.in.organisation", "Username already exists.", "username", command.getUsername());
}
}
@Transactional
@Override
public Long updateCurrentUser(UserCommand command) {
@@ -254,12 +165,6 @@ public class WritePlatformServiceJpaRepositoryImpl implements WritePlatformServi
return userToUpdate.getId();
}
@Transactional
@Override
public void deleteUser(Long userId) {
this.appUserRepository.delete(userId);
}
@Transactional
@Override
public Long createRole(final RoleCommand command) {
@@ -320,30 +225,6 @@ public class WritePlatformServiceJpaRepositoryImpl implements WritePlatformServi
return role.getId();
}
@Transactional
@Override
public Long signup(final SignupCommand command) {
try {
Organisation organisation = new Organisation(
command.getOrganisationName(), command.getOpeningDate(),
command.getContactEmail(), command.getContactName(),
new ArrayList<OrganisationCurrency>());
this.organisationRepository.save(organisation);
String name = command.getOrganisationName() + " Head Office";
String externalId = null;
Office headOffice = Office.headOffice(organisation, name, command.getOpeningDate(), externalId);
this.officeRepository.save(headOffice);
this.userDomainService.createDefaultAdminUser(organisation,
headOffice);
return organisation.getId();
} catch (DataIntegrityViolationException e) {
throw new InvalidSignupException(e);
}
}
@Transactional
@Override
@@ -4,18 +4,14 @@ import java.util.HashMap;
import java.util.Map;
import java.util.Set;
import javax.servlet.http.HttpServletResponse;
import javax.ws.rs.Consumes;
import javax.ws.rs.GET;
import javax.ws.rs.HeaderParam;
import javax.ws.rs.OPTIONS;
import javax.ws.rs.Path;
import javax.ws.rs.Produces;
import javax.ws.rs.core.Context;
import javax.ws.rs.core.MediaType;
import javax.ws.rs.core.MultivaluedMap;
import javax.ws.rs.core.Response;
import javax.ws.rs.core.Response.ResponseBuilder;
import javax.ws.rs.core.StreamingOutput;
import javax.ws.rs.core.UriInfo;
@@ -38,57 +34,25 @@ public class ReportingApiResource {
@Autowired
private ReadExtraDataAndReportingService ReadExtraDataAndReportingService;
private String _corsHeaders;
private Response makeCORS(ResponseBuilder req, String returnMethod) {
ResponseBuilder rb = req.header("Access-Control-Allow-Origin", "*")
.header("Access-Control-Allow-Methods", "GET, POST, OPTIONS");
if (!"".equals(returnMethod)) {
rb.header("Access-Control-Allow-Headers", returnMethod);
}
return rb.build();
}
private Response makeCORS(ResponseBuilder req) {
return makeCORS(req, _corsHeaders);
}
private Response makeCORSExport(ResponseBuilder req, String exportFilename,
String returnMethod) {
ResponseBuilder rb = req
.header("Access-Control-Allow-Origin", "*")
.header("Access-Control-Allow-Methods", "GET, POST, OPTIONS")
.header("Content-Disposition",
"attachment;filename=" + exportFilename);
if (!"".equals(returnMethod)) {
rb.header("Access-Control-Allow-Headers", returnMethod);
}
return rb.build();
}
private Response makeCORSExport(ResponseBuilder req, String exportFilename) {
return makeCORSExport(req, exportFilename, _corsHeaders);
}
// This OPTIONS request/response is necessary
// if you consumes other format than text/plain or
// if you use other HTTP verbs than GET and POST
@OPTIONS
public Response corsMyResource(
@HeaderParam("Access-Control-Request-Headers") String requestH) {
_corsHeaders = requestH;
return makeCORS(Response.ok(), requestH);
}
// private Response makeCORSExport(ResponseBuilder req, String exportFilename,
// String returnMethod) {
// ResponseBuilder rb = req
// .header("Access-Control-Allow-Origin", "*")
// .header("Access-Control-Allow-Methods", "GET, POST, OPTIONS")
// .header("Content-Disposition",
// "attachment;filename=" + exportFilename);
//
// if (!"".equals(returnMethod)) {
// rb.header("Access-Control-Allow-Headers", returnMethod);
// }
//
// return rb.build();
// }
@GET
@Consumes({ MediaType.APPLICATION_JSON, MediaType.APPLICATION_XML })
@Produces({ MediaType.APPLICATION_JSON, "application/x-msdownload" })
public Response retrieveReport(@Context UriInfo uriInfo,
@Context HttpServletResponse httpServletResponse) {
public Response retrieveReport(@Context UriInfo uriInfo) {
MultivaluedMap<String, String> queryParams = uriInfo
.getQueryParameters();
@@ -115,17 +79,15 @@ public class ReportingApiResource {
if ((exportCSV == null) || (!(exportCSV.equalsIgnoreCase("true")))) {
GenericResultset result = this.ReadExtraDataAndReportingService
.retrieveGenericResultset(name, type, extractedQueryParams);
return makeCORS(Response.ok().entity(result));
} else {
StreamingOutput result = this.ReadExtraDataAndReportingService
.retrieveReportCSV(name, type, extractedQueryParams);
return makeCORSExport(Response.ok().entity(result),
name.replaceAll(" ", "") + ".csv");
}
return Response.ok().entity(result).build();
}
StreamingOutput result = this.ReadExtraDataAndReportingService.retrieveReportCSV(name, type, extractedQueryParams);
return Response.ok().entity(result).header("Content-Disposition","attachment;filename=" + name.replaceAll(" ", "") + ".csv").build();
}
@GET
@Path("forceauth")
public Response hackToForceAuthentication() {
@@ -3,7 +3,6 @@ package org.mifosng.platform.api.user;
import java.util.Arrays;
import java.util.Collection;
import javax.servlet.http.HttpServletRequest;
import javax.ws.rs.Consumes;
import javax.ws.rs.DELETE;
import javax.ws.rs.GET;
@@ -13,7 +12,6 @@ import javax.ws.rs.Path;
import javax.ws.rs.PathParam;
import javax.ws.rs.Produces;
import javax.ws.rs.WebApplicationException;
import javax.ws.rs.core.Context;
import javax.ws.rs.core.MediaType;
import javax.ws.rs.core.Response;
import javax.ws.rs.core.Response.Status;
@@ -23,20 +21,16 @@ import org.mifosng.data.EntityIdentifier;
import org.mifosng.data.ErrorResponse;
import org.mifosng.data.ErrorResponseList;
import org.mifosng.data.UserList;
import org.mifosng.data.command.ChangePasswordCommand;
import org.mifosng.data.command.UserCommand;
import org.mifosng.platform.ReadPlatformService;
import org.mifosng.platform.WritePlatformService;
import org.mifosng.platform.exceptions.ApplicationDomainRuleException;
import org.mifosng.platform.exceptions.NewDataValidationException;
import org.mifosng.platform.exceptions.UnAuthenticatedUserException;
import org.mifosng.platform.user.domain.AppUser;
import org.mifosng.platform.user.domain.AppUserRepository;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.mifosng.platform.user.service.AppUserWritePlatformService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Scope;
import org.springframework.dao.DataIntegrityViolationException;
import org.springframework.security.access.AccessDeniedException;
import org.springframework.security.authentication.UsernamePasswordAuthenticationToken;
import org.springframework.security.core.Authentication;
@@ -49,13 +43,11 @@ import org.springframework.stereotype.Component;
@Scope("singleton")
public class UserApiResource {
private final static Logger logger = LoggerFactory.getLogger(UserApiResource.class);
@Autowired
private ReadPlatformService readPlatformService;
@Autowired
private WritePlatformService writePlatformService;
private AppUserWritePlatformService appUserWritePlatformService;
@Autowired
private AppUserRepository appUserRepository;
@@ -108,32 +100,11 @@ public class UserApiResource {
@POST
@Consumes({ MediaType.APPLICATION_JSON, MediaType.APPLICATION_XML})
@Produces({ MediaType.APPLICATION_JSON})
public Response createUser(@Context HttpServletRequest request) {
public Response createUser(UserCommand command) {
// try {
String selectedItems = request.getParameter("selectedItems");
final UserCommand command = new UserCommand();
// command.setSelectedItems(Arrays.asList(a));
hardcodeUserIntoSecurityContext();
Long userId = this.writePlatformService.createUser(command);
Long userId = this.appUserWritePlatformService.createUser(command);
return Response.ok().entity(new EntityIdentifier(userId)).build();
// } catch (UsernameAlreadyExistsException e) {
// List<ErrorResponse> allErrors = new ArrayList<ErrorResponse>();
// ErrorResponse err = new ErrorResponse("validation.msg.username.already.exists.in.organisation", "username", command.getUsername());
// allErrors.add(err);
//
// throw new WebApplicationException(Response
// .status(Status.BAD_REQUEST)
// .entity(new ErrorResponseList(allErrors)).build());
// } catch (PlatformEmailSendException e) {
// List<ErrorResponse> allErrors = new ArrayList<ErrorResponse>();
// ErrorResponse err = new ErrorResponse("error.msg.user.email.invalid","email", "Email is invalid.");
// allErrors.add(err);
// throw new WebApplicationException(Response
// .status(Status.BAD_REQUEST)
// .entity(new ErrorResponseList(allErrors)).build());
// }
}
@DELETE
@@ -143,7 +114,7 @@ public class UserApiResource {
public Response deleteUser(@PathParam("userId") final Long userId) {
try {
this.writePlatformService.deleteUser(userId);
this.appUserWritePlatformService.deleteUser(userId);
return Response.ok().build();
} catch (UnAuthenticatedUserException e) {
@@ -167,11 +138,9 @@ public class UserApiResource {
hardcodeUserIntoSecurityContext();
// UserCommand command = new UserCommand();
// command.setSelectedItems(new ArrayList<String>(commandEile.getSelectedItems()));
command.setId(userId);
this.writePlatformService.updateUser(command);
this.appUserWritePlatformService.updateUser(command);
return Response.ok().entity(new EntityIdentifier(userId)).build();
}
@@ -201,57 +170,57 @@ public class UserApiResource {
}
}
@POST
@Path("user/current")
@Consumes({ MediaType.APPLICATION_JSON, MediaType.APPLICATION_XML })
@Produces({ MediaType.APPLICATION_JSON, MediaType.APPLICATION_XML })
public Response updateCurrentUser(UserCommand command) {
try {
hardcodeUserIntoSecurityContext();
Long userId = this.writePlatformService.updateCurrentUser(command);
return Response.ok().entity(new EntityIdentifier(userId)).build();
} catch (UnAuthenticatedUserException e) {
throw new WebApplicationException(Response.status(Status.UNAUTHORIZED).build());
} catch (AccessDeniedException e) {
ErrorResponse errorResponse = new ErrorResponse("error.msg.no.permission", "id");
ErrorResponseList list = new ErrorResponseList(Arrays.asList(errorResponse));
throw new WebApplicationException(Response.status(Status.BAD_REQUEST).entity(list).build());
} catch (ApplicationDomainRuleException e) {
throw new WebApplicationException(Response.status(Status.BAD_REQUEST).entity(new ErrorResponseList(e.getErrors())).build());
} catch (NewDataValidationException e) {
throw new WebApplicationException(Response.status(Status.BAD_REQUEST).entity(new ErrorResponseList(e.getValidationErrors())).build());
} catch (DataIntegrityViolationException e) {
ErrorResponse errorResponse = new ErrorResponse("error.msg.username.already.exists.in.organisation", "username", command.getUsername());
ErrorResponseList list = new ErrorResponseList(Arrays.asList(errorResponse));
throw new WebApplicationException(Response.status(Status.BAD_REQUEST).entity(list).build());
}
}
@POST
@Path("user/current/password")
@Consumes({ MediaType.APPLICATION_JSON, MediaType.APPLICATION_XML })
@Produces({ MediaType.APPLICATION_JSON, MediaType.APPLICATION_XML })
public Response updateCurrentUserPassword(ChangePasswordCommand command) {
try {
hardcodeUserIntoSecurityContext();
Long userId = this.writePlatformService.updateCurrentUserPassword(command);
return Response.ok().entity(new EntityIdentifier(userId)).build();
} catch (UnAuthenticatedUserException e) {
throw new WebApplicationException(Response.status(Status.UNAUTHORIZED).build());
} catch (AccessDeniedException e) {
ErrorResponse errorResponse = new ErrorResponse("error.msg.no.permission", "id");
ErrorResponseList list = new ErrorResponseList(Arrays.asList(errorResponse));
throw new WebApplicationException(Response.status(Status.BAD_REQUEST).entity(list).build());
} catch (ApplicationDomainRuleException e) {
throw new WebApplicationException(Response.status(Status.BAD_REQUEST).entity(new ErrorResponseList(e.getErrors())).build());
} catch (NewDataValidationException e) {
throw new WebApplicationException(Response.status(Status.BAD_REQUEST).entity(new ErrorResponseList(e.getValidationErrors())).build());
}
}
// @POST
// @Path("user/current")
// @Consumes({ MediaType.APPLICATION_JSON, MediaType.APPLICATION_XML })
// @Produces({ MediaType.APPLICATION_JSON, MediaType.APPLICATION_XML })
// public Response updateCurrentUser(UserCommand command) {
//
// try {
// hardcodeUserIntoSecurityContext();
//
// Long userId = this.appUserWritePlatformService.updateCurrentUser(command);
//
// return Response.ok().entity(new EntityIdentifier(userId)).build();
// } catch (UnAuthenticatedUserException e) {
// throw new WebApplicationException(Response.status(Status.UNAUTHORIZED).build());
// } catch (AccessDeniedException e) {
// ErrorResponse errorResponse = new ErrorResponse("error.msg.no.permission", "id");
// ErrorResponseList list = new ErrorResponseList(Arrays.asList(errorResponse));
// throw new WebApplicationException(Response.status(Status.BAD_REQUEST).entity(list).build());
// } catch (ApplicationDomainRuleException e) {
// throw new WebApplicationException(Response.status(Status.BAD_REQUEST).entity(new ErrorResponseList(e.getErrors())).build());
// } catch (NewDataValidationException e) {
// throw new WebApplicationException(Response.status(Status.BAD_REQUEST).entity(new ErrorResponseList(e.getValidationErrors())).build());
// } catch (DataIntegrityViolationException e) {
// ErrorResponse errorResponse = new ErrorResponse("error.msg.username.already.exists.in.organisation", "username", command.getUsername());
// ErrorResponseList list = new ErrorResponseList(Arrays.asList(errorResponse));
// throw new WebApplicationException(Response.status(Status.BAD_REQUEST).entity(list).build());
// }
// }
//
// @POST
// @Path("user/current/password")
// @Consumes({ MediaType.APPLICATION_JSON, MediaType.APPLICATION_XML })
// @Produces({ MediaType.APPLICATION_JSON, MediaType.APPLICATION_XML })
// public Response updateCurrentUserPassword(ChangePasswordCommand command) {
//
// try {
// hardcodeUserIntoSecurityContext();
//
// Long userId = this.appUserWritePlatformService.updateCurrentUserPassword(command);
//
// return Response.ok().entity(new EntityIdentifier(userId)).build();
// } catch (UnAuthenticatedUserException e) {
// throw new WebApplicationException(Response.status(Status.UNAUTHORIZED).build());
// } catch (AccessDeniedException e) {
// ErrorResponse errorResponse = new ErrorResponse("error.msg.no.permission", "id");
// ErrorResponseList list = new ErrorResponseList(Arrays.asList(errorResponse));
// throw new WebApplicationException(Response.status(Status.BAD_REQUEST).entity(list).build());
// } catch (ApplicationDomainRuleException e) {
// throw new WebApplicationException(Response.status(Status.BAD_REQUEST).entity(new ErrorResponseList(e.getErrors())).build());
// } catch (NewDataValidationException e) {
// throw new WebApplicationException(Response.status(Status.BAD_REQUEST).entity(new ErrorResponseList(e.getValidationErrors())).build());
// }
// }
}
@@ -16,6 +16,7 @@ import org.springframework.web.bind.support.SessionStatus;
import org.springframework.web.servlet.ModelAndView;
/**
* FIXMED - REMOVE DEPRECATED CONTROLLER and related code artifacts
* @deprecated - remove signup functionality for now.
*/
@Deprecated
@@ -95,7 +96,8 @@ public class SignupController {
ModelAndView mav = null;
try {
signupPlatformService.signup(command);
// REMOVED
// signupPlatformService.signup(command);
status.setComplete();
mav = new ModelAndView("/tenant/signupsuccess", "signupFormBean",
@@ -4,7 +4,7 @@ import org.mifosng.data.command.OfficeCommand;
public interface OfficeWritePlatformService {
Long createOffice(OfficeCommand command);
Long updateOffice(OfficeCommand command);
Long createOffice(final OfficeCommand command);
Long updateOffice(final OfficeCommand command);
}
@@ -7,6 +7,7 @@ import org.mifosng.platform.exceptions.NoAuthorizationException;
import org.mifosng.platform.exceptions.PlatformDataIntegrityException;
import org.mifosng.platform.organisation.domain.Office;
import org.mifosng.platform.organisation.domain.OfficeRepository;
import org.mifosng.platform.organisation.service.OfficeCommandValidator;
import org.mifosng.platform.security.PlatformSecurityContext;
import org.mifosng.platform.user.domain.AppUser;
import org.slf4j.Logger;
@@ -49,7 +50,7 @@ public class OfficeWritePlatformServiceJpaRepositoryImpl implements OfficeWriteP
office.generateHierarchy();
this.officeRepository.save(office);
this.officeRepository.saveAndFlush(office);
return office.getId();
} catch (DataIntegrityViolationException dve) {
@@ -3,10 +3,8 @@ package org.mifosng.platform.rest;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collection;
import java.util.List;
import javax.ws.rs.Consumes;
import javax.ws.rs.DELETE;
import javax.ws.rs.GET;
import javax.ws.rs.POST;
import javax.ws.rs.Path;
@@ -27,17 +25,14 @@ import org.mifosng.data.PermissionData;
import org.mifosng.data.PermissionList;
import org.mifosng.data.RoleData;
import org.mifosng.data.RoleList;
import org.mifosng.data.UserList;
import org.mifosng.data.command.ChangePasswordCommand;
import org.mifosng.data.command.RoleCommand;
import org.mifosng.data.command.UserCommand;
import org.mifosng.platform.ReadPlatformService;
import org.mifosng.platform.WritePlatformService;
import org.mifosng.platform.exceptions.ApplicationDomainRuleException;
import org.mifosng.platform.exceptions.UnAuthenticatedUserException;
import org.mifosng.platform.exceptions.NewDataValidationException;
import org.mifosng.platform.infrastructure.PlatformEmailSendException;
import org.mifosng.platform.infrastructure.UsernameAlreadyExistsException;
import org.mifosng.platform.exceptions.UnAuthenticatedUserException;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Scope;
import org.springframework.dao.DataIntegrityViolationException;
@@ -55,158 +50,6 @@ public class UserAdmistrationResource {
@Autowired
private WritePlatformService writePlatformService;
@GET
@Path("user/all")
@Consumes({ MediaType.APPLICATION_JSON, MediaType.APPLICATION_XML })
@Produces({MediaType.APPLICATION_JSON, MediaType.APPLICATION_XML})
public Response retrieveUsers() {
try {
Collection<AppUserData> users = this.readPlatformService.retrieveAllUsers();
return Response.ok().entity(new UserList(users)).build();
} catch (UnAuthenticatedUserException e) {
throw new WebApplicationException(Response.status(Status.UNAUTHORIZED).build());
} catch (AccessDeniedException e) {
ErrorResponse errorResponse = new ErrorResponse("error.msg.no.permission", "id");
ErrorResponseList list = new ErrorResponseList(Arrays.asList(errorResponse));
throw new WebApplicationException(Response.status(Status.BAD_REQUEST).entity(list).build());
} catch (ApplicationDomainRuleException e) {
throw new WebApplicationException(Response.status(Status.BAD_REQUEST).entity(new ErrorResponseList(e.getErrors())).build());
} catch (NewDataValidationException e) {
throw new WebApplicationException(Response.status(Status.BAD_REQUEST).entity(new ErrorResponseList(e.getValidationErrors())).build());
}
}
@GET
@Path("user/new")
@Consumes({ MediaType.APPLICATION_JSON, MediaType.APPLICATION_XML })
@Produces({ MediaType.APPLICATION_JSON, MediaType.APPLICATION_XML })
public Response newUserDetails() {
try {
AppUserData newUser = this.readPlatformService.retrieveNewUserDetails();
return Response.ok().entity(newUser).build();
} catch (UnAuthenticatedUserException e) {
throw new WebApplicationException(Response.status(Status.UNAUTHORIZED).build());
} catch (AccessDeniedException e) {
ErrorResponse errorResponse = new ErrorResponse("error.msg.no.permission", "id");
ErrorResponseList list = new ErrorResponseList(Arrays.asList(errorResponse));
throw new WebApplicationException(Response.status(Status.BAD_REQUEST).entity(list).build());
} catch (ApplicationDomainRuleException e) {
throw new WebApplicationException(Response.status(Status.BAD_REQUEST).entity(new ErrorResponseList(e.getErrors())).build());
} catch (NewDataValidationException e) {
throw new WebApplicationException(Response.status(Status.BAD_REQUEST).entity(new ErrorResponseList(e.getValidationErrors())).build());
}
}
@POST
@Path("user/new")
@Consumes({ MediaType.APPLICATION_JSON, MediaType.APPLICATION_XML })
@Produces({ MediaType.APPLICATION_JSON, MediaType.APPLICATION_XML })
public Response createUser(final UserCommand command) {
try {
Long userId = this.writePlatformService.createUser(command);
return Response.ok().entity(new EntityIdentifier(userId)).build();
} catch (UsernameAlreadyExistsException e) {
List<ErrorResponse> allErrors = new ArrayList<ErrorResponse>();
ErrorResponse err = new ErrorResponse("validation.msg.username.already.exists.in.organisation", "username", command.getUsername());
allErrors.add(err);
throw new WebApplicationException(Response
.status(Status.BAD_REQUEST)
.entity(new ErrorResponseList(allErrors)).build());
} catch (PlatformEmailSendException e) {
List<ErrorResponse> allErrors = new ArrayList<ErrorResponse>();
ErrorResponse err = new ErrorResponse("error.msg.user.email.invalid","email", "Email is invalid.");
allErrors.add(err);
throw new WebApplicationException(Response
.status(Status.BAD_REQUEST)
.entity(new ErrorResponseList(allErrors)).build());
} catch (UnAuthenticatedUserException e) {
throw new WebApplicationException(Response.status(Status.UNAUTHORIZED).build());
} catch (AccessDeniedException e) {
ErrorResponse errorResponse = new ErrorResponse("error.msg.no.permission", "id");
ErrorResponseList list = new ErrorResponseList(Arrays.asList(errorResponse));
throw new WebApplicationException(Response.status(Status.BAD_REQUEST).entity(list).build());
} catch (ApplicationDomainRuleException e) {
throw new WebApplicationException(Response.status(Status.BAD_REQUEST).entity(new ErrorResponseList(e.getErrors())).build());
} catch (NewDataValidationException e) {
throw new WebApplicationException(Response.status(Status.BAD_REQUEST).entity(new ErrorResponseList(e.getValidationErrors())).build());
}
}
@DELETE
@Path("user/{userId}")
@Consumes({ MediaType.APPLICATION_JSON, MediaType.APPLICATION_XML })
@Produces({ MediaType.APPLICATION_JSON, MediaType.APPLICATION_XML })
public Response deleteUser(@PathParam("userId") final Long userId) {
try {
this.writePlatformService.deleteUser(userId);
return Response.ok().build();
} catch (UnAuthenticatedUserException e) {
throw new WebApplicationException(Response.status(Status.UNAUTHORIZED).build());
} catch (AccessDeniedException e) {
ErrorResponse errorResponse = new ErrorResponse("error.msg.no.permission", "id");
ErrorResponseList list = new ErrorResponseList(Arrays.asList(errorResponse));
throw new WebApplicationException(Response.status(Status.BAD_REQUEST).entity(list).build());
} catch (ApplicationDomainRuleException e) {
throw new WebApplicationException(Response.status(Status.BAD_REQUEST).entity(new ErrorResponseList(e.getErrors())).build());
} catch (NewDataValidationException e) {
throw new WebApplicationException(Response.status(Status.BAD_REQUEST).entity(new ErrorResponseList(e.getValidationErrors())).build());
}
}
@GET
@Path("user/{userId}")
@Consumes({ MediaType.APPLICATION_JSON, MediaType.APPLICATION_XML })
@Produces({ MediaType.APPLICATION_JSON, MediaType.APPLICATION_XML })
public Response retrieveUser(@PathParam("userId") final Long userId) {
try {
AppUserData user = this.readPlatformService.retrieveUser(userId);
return Response.ok().entity(user).build();
} catch (UnAuthenticatedUserException e) {
throw new WebApplicationException(Response.status(Status.UNAUTHORIZED).build());
} catch (AccessDeniedException e) {
ErrorResponse errorResponse = new ErrorResponse("error.msg.no.permission", "id");
ErrorResponseList list = new ErrorResponseList(Arrays.asList(errorResponse));
throw new WebApplicationException(Response.status(Status.BAD_REQUEST).entity(list).build());
} catch (ApplicationDomainRuleException e) {
throw new WebApplicationException(Response.status(Status.BAD_REQUEST).entity(new ErrorResponseList(e.getErrors())).build());
} catch (NewDataValidationException e) {
throw new WebApplicationException(Response.status(Status.BAD_REQUEST).entity(new ErrorResponseList(e.getValidationErrors())).build());
}
}
@POST
@Path("user/{userId}")
@Consumes({ MediaType.APPLICATION_JSON, MediaType.APPLICATION_XML })
@Produces({ MediaType.APPLICATION_JSON, MediaType.APPLICATION_XML })
public Response updateUser(UserCommand command) {
try {
Long userId = this.writePlatformService.updateUser(command);
return Response.ok().entity(new EntityIdentifier(userId)).build();
} catch (UnAuthenticatedUserException e) {
throw new WebApplicationException(Response.status(Status.UNAUTHORIZED).build());
} catch (AccessDeniedException e) {
ErrorResponse errorResponse = new ErrorResponse("error.msg.no.permission", "id");
ErrorResponseList list = new ErrorResponseList(Arrays.asList(errorResponse));
throw new WebApplicationException(Response.status(Status.BAD_REQUEST).entity(list).build());
} catch (ApplicationDomainRuleException e) {
throw new WebApplicationException(Response.status(Status.BAD_REQUEST).entity(new ErrorResponseList(e.getErrors())).build());
} catch (NewDataValidationException e) {
throw new WebApplicationException(Response.status(Status.BAD_REQUEST).entity(new ErrorResponseList(e.getValidationErrors())).build());
}
}
@GET
@Path("user/current")
@Consumes({ MediaType.APPLICATION_JSON, MediaType.APPLICATION_XML })
@@ -25,7 +25,7 @@ import org.springframework.security.core.authority.SimpleGrantedAuthority;
import org.springframework.security.core.userdetails.User;
@Entity
@Table(name = "admin_appuser", uniqueConstraints=@UniqueConstraint(columnNames = {"org_id", "username"}))
@Table(name = "admin_appuser", uniqueConstraints=@UniqueConstraint(columnNames = {"org_id", "username"}, name="username_org"))
public class AppUser extends AbstractAuditableCustom<AppUser, Long> implements PlatformUser {
@Column(name = "email", nullable=false, length=100)
@@ -81,6 +81,8 @@ public class AppUser extends AbstractAuditableCustom<AppUser, Long> implements P
boolean userAccountNonLocked = true;
Collection<SimpleGrantedAuthority> authorities = new ArrayList<SimpleGrantedAuthority>();
authorities.add(new SimpleGrantedAuthority("DUMMY_ROLE_NOT_USED_OR_PERSISTED_TO_AVOID_EXCEPTION"));
User user = new User(username, password, userEnabled, userAccountNonExpired, userCredentialsNonExpired, userAccountNonLocked, authorities);
return new AppUser(organisation, office, user, allRoles, email, firstname, lastname);
}
@@ -0,0 +1,12 @@
package org.mifosng.platform.user.service;
import org.mifosng.data.command.UserCommand;
public interface AppUserWritePlatformService {
Long createUser(final UserCommand command);
Long updateUser(final UserCommand command);
void deleteUser(final Long userId);
}
@@ -0,0 +1,159 @@
package org.mifosng.platform.user.service;
import static org.mifosng.platform.Specifications.usersThatMatch;
import java.util.ArrayList;
import java.util.HashSet;
import java.util.List;
import java.util.Set;
import org.apache.commons.lang.StringUtils;
import org.mifosng.data.ApiParameterError;
import org.mifosng.data.command.UserCommand;
import org.mifosng.platform.exceptions.PlatformApiDataValidationException;
import org.mifosng.platform.exceptions.PlatformDataIntegrityException;
import org.mifosng.platform.exceptions.PlatformResourceNotFoundException;
import org.mifosng.platform.infrastructure.PlatformEmailSendException;
import org.mifosng.platform.organisation.domain.Office;
import org.mifosng.platform.organisation.domain.OfficeRepository;
import org.mifosng.platform.security.PlatformSecurityContext;
import org.mifosng.platform.user.domain.AppUser;
import org.mifosng.platform.user.domain.AppUserRepository;
import org.mifosng.platform.user.domain.Role;
import org.mifosng.platform.user.domain.RoleRepository;
import org.mifosng.platform.user.domain.UserDomainService;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.dao.DataIntegrityViolationException;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
@Service
public class AppUserWritePlatformServiceJpaRepositoryImpl implements AppUserWritePlatformService {
private final static Logger logger = LoggerFactory.getLogger(AppUserWritePlatformServiceJpaRepositoryImpl.class);
private final PlatformSecurityContext context;
private final AppUserRepository appUserRepository;
private final OfficeRepository officeRepository;
private final RoleRepository roleRepository;
private final UserDomainService userDomainService;
@Autowired
public AppUserWritePlatformServiceJpaRepositoryImpl(final PlatformSecurityContext context, final AppUserRepository appUserRepository, final UserDomainService userDomainService,
final OfficeRepository officeRepository, final RoleRepository roleRepository) {
this.context = context;
this.appUserRepository = appUserRepository;
this.userDomainService = userDomainService;
this.officeRepository = officeRepository;
this.roleRepository = roleRepository;
}
@Transactional
@Override
public Long createUser(final UserCommand command) {
try {
AppUser currentUser = context.authenticatedUser();
UserCommandValidator validator = new UserCommandValidator(command);
validator.validate();
Set<Role> allRoles = new HashSet<Role>();
for (String roleId : command.getSelectedItems()) {
Role role = this.roleRepository.findOne(Long.valueOf(roleId));
allRoles.add(role);
}
Office office = this.officeRepository.findOne(command.getOfficeId());
String password = command.getPassword();
if (StringUtils.isBlank(password)) {
password = "autogenerate";
}
AppUser appUser = AppUser.createNew(currentUser.getOrganisation(), office,
allRoles, command.getUsername(), command.getEmail(),
command.getFirstname(), command.getLastname(),
password);
this.userDomainService.create(appUser);
return appUser.getId();
} catch (DataIntegrityViolationException dve) {
handleOfficeDataIntegrityIssues(command, dve);
return Long.valueOf(-1);
} catch (PlatformEmailSendException e) {
List<ApiParameterError> dataValidationErrors = new ArrayList<ApiParameterError>();
ApiParameterError error = ApiParameterError.parameterError("error.msg.user.email.invalid", "The parameter email is invalid.", "email", command.getEmail());
dataValidationErrors.add(error);
throw new PlatformApiDataValidationException("validation.msg.validation.errors.exist", "Validation errors exist.", dataValidationErrors);
}
}
@Transactional
@Override
public Long updateUser(UserCommand command) {
try {
AppUser currentUser = context.authenticatedUser();
UserCommandValidator validator = new UserCommandValidator(command);
validator.validate();
List<ApiParameterError> dataValidationErrors = new ArrayList<ApiParameterError>();
if (command.getId() == null) {
ApiParameterError error = ApiParameterError.parameterError("validation.msg.user.id.cannot.be.blank", "The parameter id cannot be empty.", "id");
dataValidationErrors.add(error);
throw new PlatformApiDataValidationException("validation.msg.validation.errors.exist", "Validation errors exist.", dataValidationErrors);
}
Set<Role> allRoles = new HashSet<Role>();
for (String roleId : command.getSelectedItems()) {
Role role = this.roleRepository.findOne(Long.valueOf(roleId));
allRoles.add(role);
}
Office office = this.officeRepository.findOne(command.getOfficeId());
if (office == null) {
throw new PlatformResourceNotFoundException("error.msg.office.id.invalid", "Office with identifier {0} does not exist.", command.getOfficeId());
}
AppUser userToUpdate = this.appUserRepository.findOne(usersThatMatch(currentUser.getOrganisation(), command.getId()));
if (userToUpdate == null) {
throw new PlatformResourceNotFoundException("error.msg.user.id.invalid", "User with identifier {0} does not exist.", command.getId());
}
userToUpdate.update(allRoles, office, command.getUsername(), command.getFirstname(), command.getLastname(), command.getEmail());
this.appUserRepository.saveAndFlush(userToUpdate);
return userToUpdate.getId();
} catch (DataIntegrityViolationException dve) {
handleOfficeDataIntegrityIssues(command, dve);
return Long.valueOf(-1);
}
}
@Transactional
@Override
public void deleteUser(Long userId) {
this.appUserRepository.delete(userId);
}
/*
* Guaranteed to throw an exception no matter what the data integrity issue is.
*/
private void handleOfficeDataIntegrityIssues(final UserCommand command, DataIntegrityViolationException dve) {
Throwable realCause = dve.getMostSpecificCause();
if (realCause.getMessage().contains("username_org")) {
throw new PlatformDataIntegrityException("error.msg.user.duplicate.username", "User with username {0} already exists", "username", command.getUsername());
}
logger.error(dve.getMessage(), dve);
throw new PlatformDataIntegrityException("error.msg.unknown.data.integrity.issue", "Unknown data integrity issue with resource.");
}
}
@@ -0,0 +1,72 @@
package org.mifosng.platform.user.service;
import java.util.ArrayList;
import java.util.List;
import org.apache.commons.lang.StringUtils;
import org.mifosng.data.ApiParameterError;
import org.mifosng.data.command.UserCommand;
import org.mifosng.platform.exceptions.PlatformApiDataValidationException;
import org.springframework.util.ObjectUtils;
public class UserCommandValidator {
private final UserCommand command;
public UserCommandValidator(UserCommand command) {
this.command = command;
}
public void validate() {
List<ApiParameterError> dataValidationErrors = new ArrayList<ApiParameterError>();
validateAccountSettings(dataValidationErrors);
if (command.getOfficeId() == null || command.getOfficeId().equals(Long.valueOf(-1))) {
ApiParameterError error = ApiParameterError.parameterError("validation.msg.user.office.cannot.be.blank", "The parameter officeId cannot be blank.", "officeId");
dataValidationErrors.add(error);
}
if (ObjectUtils.isEmpty(command.getSelectedItems())) {
ApiParameterError error = ApiParameterError.parameterError("validation.msg.user.roles.cannot.be.blank", "The parameter selectedItems cannot be blank.", "selectedItems");
dataValidationErrors.add(error);
}
if (!dataValidationErrors.isEmpty()) {
throw new PlatformApiDataValidationException("validation.msg.validation.errors.exist", "Validation errors exist.", dataValidationErrors);
}
}
public void validateAccountSettingDetails() {
List<ApiParameterError> dataValidationErrors = new ArrayList<ApiParameterError>();
validateAccountSettings(dataValidationErrors);
if (!dataValidationErrors.isEmpty()) {
throw new PlatformApiDataValidationException("validation.msg.validation.errors.exist", "Validation errors exist.", dataValidationErrors);
}
}
private void validateAccountSettings(List<ApiParameterError> dataValidationErrors) {
if (StringUtils.isBlank(command.getUsername())) {
ApiParameterError error = ApiParameterError.parameterError("validation.msg.user.username.cannot.be.blank", "The parameter username cannot be blank.", "username");
dataValidationErrors.add(error);
}
if (StringUtils.isBlank(command.getFirstname())) {
ApiParameterError error = ApiParameterError.parameterError("validation.msg.user.firstname.cannot.be.blank", "The parameter firstname cannot be blank.", "firstname");
dataValidationErrors.add(error);
}
if (StringUtils.isBlank(command.getLastname())) {
ApiParameterError error = ApiParameterError.parameterError("validation.msg.user.lastname.cannot.be.blank", "The parameter lastname cannot be blank.", "lastname");
dataValidationErrors.add(error);
}
if (StringUtils.isBlank(command.getEmail())) {
ApiParameterError error = ApiParameterError.parameterError("validation.msg.user.email.cannot.be.blank", "The parameter email cannot be blank.", "email");
dataValidationErrors.add(error);
}
}
}