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 Long officeId;
private List<String> notSelectedItems = new ArrayList<String>(); private List<String> notSelectedItems = new ArrayList<String>();
private List<String> selectedItems = new ArrayList<String>(); private String[] selectedItems;
public UserCommand() { public UserCommand() {
// //
@@ -95,11 +95,11 @@ public class UserCommand implements Serializable {
this.notSelectedItems = notSelectedItems; this.notSelectedItems = notSelectedItems;
} }
public List<String> getSelectedItems() { public String[] getSelectedItems() {
return selectedItems; return selectedItems;
} }
public void setSelectedItems(List<String> selectedItems) { public void setSelectedItems(String... selectedItems) {
this.selectedItems = selectedItems; this.selectedItems = selectedItems;
} }
} }
+1 -1
View File
@@ -333,7 +333,7 @@ CREATE TABLE `admin_appuser` (
`lastmodified_date` datetime DEFAULT NULL, `lastmodified_date` datetime DEFAULT NULL,
`lastmodifiedby_id` bigint(20) DEFAULT NULL, `lastmodifiedby_id` bigint(20) DEFAULT NULL,
PRIMARY KEY (`id`), PRIMARY KEY (`id`),
UNIQUE KEY `org_id` (`org_id`,`username`), UNIQUE KEY `username_org` (`org_id`,`username`),
KEY `FKB3D587CE0DD567A` (`office_id`), KEY `FKB3D587CE0DD567A` (`office_id`),
KEY `FKB3D587C54DF2770` (`org_id`), KEY `FKB3D587C54DF2770` (`org_id`),
CONSTRAINT `FKB3D587C54DF2770` FOREIGN KEY (`org_id`) REFERENCES `org_organisation` (`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, `lastmodified_date` datetime DEFAULT NULL,
`lastmodifiedby_id` bigint(20) DEFAULT NULL, `lastmodifiedby_id` bigint(20) DEFAULT NULL,
PRIMARY KEY (`id`), PRIMARY KEY (`id`),
UNIQUE KEY `org_id` (`org_id`,`username`), UNIQUE KEY `username_org` (`org_id`,`username`),
KEY `FKB3D587CE0DD567A` (`office_id`), KEY `FKB3D587CE0DD567A` (`office_id`),
KEY `FKB3D587C54DF2770` (`org_id`), KEY `FKB3D587C54DF2770` (`org_id`),
CONSTRAINT `FKB3D587C54DF2770` FOREIGN KEY (`org_id`) REFERENCES `org_organisation` (`id`), CONSTRAINT `FKB3D587C54DF2770` FOREIGN KEY (`org_id`) REFERENCES `org_organisation` (`id`),
+1 -1
View File
@@ -91,6 +91,6 @@ dependencies {
} }
[tomcatRun, tomcatRunWar, tomcatStop]*.with { [tomcatRun, tomcatRunWar, tomcatStop]*.with {
httpPort = 8080 httpPort = 8085
stopPort = 8082 stopPort = 8082
} }
@@ -187,7 +187,13 @@
} }
o[this.name].push(this.value || ''); o[this.name].push(this.value || '');
} else { } 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; return o;
@@ -114,9 +114,7 @@ $(document).ready(function() {
removeErrors(placeholderDiv); removeErrors(placeholderDiv);
var jsonErrors = JSON.parse(jqXHR.responseText); var jsonErrors = JSON.parse(jqXHR.responseText);
console.log(jsonErrors);
var valErrors = jsonErrors.errors; var valErrors = jsonErrors.errors;
console.log(valErrors);
var errorArray = new Array(); var errorArray = new Array();
var arrayIndex = 0; var arrayIndex = 0;
$.each(valErrors, function() { $.each(valErrors, function() {
@@ -133,7 +131,6 @@ $(document).ready(function() {
argArray[argArrayIndex] = this.value; argArray[argArrayIndex] = this.value;
argArrayIndex++; argArrayIndex++;
}); });
console.log(argArray);
// hardcoded support for six arguments // 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.message = jQuery.i18n.prop(this.userMessageGlobalisationCode, argArray[0], argArray[1], argArray[2], argArray[3], argArray[4], argArray[5]);
errorObj.value = this.value; errorObj.value = this.value;
@@ -166,7 +163,13 @@ $(document).ready(function() {
} }
o[this.name].push(this.value || ''); o[this.name].push(this.value || '');
} else { } 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; return o;
@@ -200,7 +203,6 @@ $(document).ready(function() {
$(this).attr("selected", "selected"); $(this).attr("selected", "selected");
}); });
var newFormData = JSON.stringify($('#entityform').serializeObject()); var newFormData = JSON.stringify($('#entityform').serializeObject());
console.log(newFormData); console.log(newFormData);
@@ -322,14 +324,14 @@ $(document).ready(function() {
} }
$('#listusers').click(function(e) { $('#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(); refreshUsersView();
e.preventDefault(); e.preventDefault();
}); });
$('#adduser').click(function(e) { $('#adduser').click(function(e) {
var url = 'http://localhost:8085/mifosng-provider/api/v1/users/template'; var url = 'http://localhost:8080/mifosng-provider/api/v1/users/template';
var postUrl = "http://localhost:8085/mifosng-provider/api/v1/users"; var postUrl = "http://localhost:8080/mifosng-provider/api/v1/users";
var templateSelector = "#userFormTemplate"; var templateSelector = "#userFormTemplate";
var width = 1000; var width = 1000;
var height = 550; var height = 550;
@@ -405,10 +407,10 @@ $(document).ready(function() {
function refreshUsersView() { 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 templateSelector = "#usersListTemplate";
var displayAreaDivSelector = "#contentplaceholder"; 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 singleEntityTemplateSelector = "#userFormTemplate";
var jqxhr = $.ajax({ var jqxhr = $.ajax({
@@ -424,8 +426,8 @@ $(document).ready(function() {
$("a.edit").click( function(e) { $("a.edit").click( function(e) {
var linkId = this.id; var linkId = this.id;
var entityId = linkId.replace("edit", ""); var entityId = linkId.replace("edit", "");
var getUrl = 'http://localhost:8085/mifosng-provider/api/v1/users/' + entityId; var getUrl = 'http://localhost:8080/mifosng-provider/api/v1/users/' + entityId;
var putUrl = 'http://localhost:8085/mifosng-provider/api/v1/users/' + entityId; var putUrl = 'http://localhost:8080/mifosng-provider/api/v1/users/' + entityId;
var templateSelector = "#userFormTemplate"; var templateSelector = "#userFormTemplate";
var width = 600; var width = 600;
@@ -443,7 +445,7 @@ $(document).ready(function() {
$("a.delete").click( function(e) { $("a.delete").click( function(e) {
var linkId = this.id; var linkId = this.id;
var entityId = linkId.replace("delete", ""); 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'); showNotAvailableDialog('dialog.title.functionality.not.available');
e.preventDefault(); e.preventDefault();
+1 -1
View File
@@ -123,6 +123,6 @@ dependencies {
[tomcatRun, tomcatRunWar, tomcatStop]*.with { [tomcatRun, tomcatRunWar, tomcatStop]*.with {
configFile = file('src/test/resources/META-INF/context.xml') configFile = file('src/test/resources/META-INF/context.xml')
httpPort = 8085 httpPort = 8080
stopPort = 8081 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.LoanTransactionCommand;
import org.mifosng.data.command.NoteCommand; import org.mifosng.data.command.NoteCommand;
import org.mifosng.data.command.RoleCommand; import org.mifosng.data.command.RoleCommand;
import org.mifosng.data.command.SignupCommand;
import org.mifosng.data.command.SubmitLoanApplicationCommand; import org.mifosng.data.command.SubmitLoanApplicationCommand;
import org.mifosng.data.command.UndoLoanApprovalCommand; import org.mifosng.data.command.UndoLoanApprovalCommand;
import org.mifosng.data.command.UndoLoanDisbursalCommand; import org.mifosng.data.command.UndoLoanDisbursalCommand;
import org.mifosng.data.command.UpdateUsernamePasswordCommand; import org.mifosng.data.command.UpdateUsernamePasswordCommand;
import org.mifosng.data.command.UserCommand; import org.mifosng.data.command.UserCommand;
import org.mifosng.platform.exceptions.InvalidSignupException;
import org.springframework.security.access.prepost.PreAuthorize; import org.springframework.security.access.prepost.PreAuthorize;
public interface WritePlatformService { public interface WritePlatformService {
Long createUser(UserCommand command);
Long updateUser(UserCommand command);
Long updateCurrentUser(UserCommand command); Long updateCurrentUser(UserCommand command);
Long updateCurrentUserPassword(ChangePasswordCommand command); Long updateCurrentUserPassword(ChangePasswordCommand command);
void deleteUser(Long userId);
Long createRole(RoleCommand command); Long createRole(RoleCommand command);
Long updateRole(RoleCommand command); Long updateRole(RoleCommand command);
/**
* @throws InvalidSignupException when sign up fails
*/
Long signup(SignupCommand command);
void updateUsernamePasswordOnFirstTimeLogin(UpdateUsernamePasswordCommand command); void updateUsernamePasswordOnFirstTimeLogin(UpdateUsernamePasswordCommand command);
@PreAuthorize(value = "hasAnyRole('PORTFOLIO_MANAGEMENT_SUPER_USER_ROLE', 'CAN_ENROLL_NEW_CLIENT_ROLE')") @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.ArrayList;
import java.util.Arrays; import java.util.Arrays;
import java.util.Collection; import java.util.Collection;
import java.util.HashSet;
import java.util.List; import java.util.List;
import java.util.Set;
import org.apache.commons.lang.StringUtils; import org.apache.commons.lang.StringUtils;
import org.joda.time.LocalDate; import org.joda.time.LocalDate;
import org.mifosng.data.ApiParameterError;
import org.mifosng.data.EntityIdentifier; import org.mifosng.data.EntityIdentifier;
import org.mifosng.data.ErrorResponse; import org.mifosng.data.ErrorResponse;
import org.mifosng.data.LoanSchedule; 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.LoanTransactionCommand;
import org.mifosng.data.command.NoteCommand; import org.mifosng.data.command.NoteCommand;
import org.mifosng.data.command.RoleCommand; import org.mifosng.data.command.RoleCommand;
import org.mifosng.data.command.SignupCommand;
import org.mifosng.data.command.SubmitLoanApplicationCommand; import org.mifosng.data.command.SubmitLoanApplicationCommand;
import org.mifosng.data.command.UndoLoanApprovalCommand; import org.mifosng.data.command.UndoLoanApprovalCommand;
import org.mifosng.data.command.UndoLoanDisbursalCommand; 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.MonetaryCurrency;
import org.mifosng.platform.currency.domain.Money; import org.mifosng.platform.currency.domain.Money;
import org.mifosng.platform.exceptions.ApplicationDomainRuleException; import org.mifosng.platform.exceptions.ApplicationDomainRuleException;
import org.mifosng.platform.exceptions.InvalidSignupException;
import org.mifosng.platform.exceptions.NoAuthorizationException; 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.exceptions.UnAuthenticatedUserException;
import org.mifosng.platform.infrastructure.BasicPasswordEncodablePlatformUser; import org.mifosng.platform.infrastructure.BasicPasswordEncodablePlatformUser;
import org.mifosng.platform.infrastructure.PlatformPasswordEncoder; 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.loan.domain.PeriodFrequencyType;
import org.mifosng.platform.organisation.domain.Office; import org.mifosng.platform.organisation.domain.Office;
import org.mifosng.platform.organisation.domain.OfficeRepository; 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.AppUser;
import org.mifosng.platform.user.domain.AppUserRepository; import org.mifosng.platform.user.domain.AppUserRepository;
import org.mifosng.platform.user.domain.Permission; 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.PlatformUserRepository;
import org.mifosng.platform.user.domain.Role; import org.mifosng.platform.user.domain.Role;
import org.mifosng.platform.user.domain.RoleRepository; 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.beans.factory.annotation.Autowired;
import org.springframework.dao.DataIntegrityViolationException; import org.springframework.dao.DataIntegrityViolationException;
import org.springframework.security.core.Authentication; import org.springframework.security.core.Authentication;
@@ -93,9 +82,7 @@ import org.springframework.transaction.annotation.Transactional;
@Service @Service
public class WritePlatformServiceJpaRepositoryImpl implements WritePlatformService { public class WritePlatformServiceJpaRepositoryImpl implements WritePlatformService {
private final OrganisationRepository organisationRepository;
private final OfficeRepository officeRepository; private final OfficeRepository officeRepository;
private final UserDomainService userDomainService;
private final PlatformUserRepository platformUserRepository; private final PlatformUserRepository platformUserRepository;
private final PlatformPasswordEncoder platformPasswordEncoder; private final PlatformPasswordEncoder platformPasswordEncoder;
private final ClientRepository clientRepository; private final ClientRepository clientRepository;
@@ -111,9 +98,7 @@ public class WritePlatformServiceJpaRepositoryImpl implements WritePlatformServi
@Autowired @Autowired
public WritePlatformServiceJpaRepositoryImpl( public WritePlatformServiceJpaRepositoryImpl(
final OrganisationRepository organisationRepository,
final OfficeRepository officeRepository, final OfficeRepository officeRepository,
final UserDomainService userDomainService,
final PlatformUserRepository platformUserRepository, final PlatformUserRepository platformUserRepository,
final PlatformPasswordEncoder platformPasswordEncoder, final PlatformPasswordEncoder platformPasswordEncoder,
final ClientRepository clientRepository, final ClientRepository clientRepository,
@@ -126,9 +111,7 @@ public class WritePlatformServiceJpaRepositoryImpl implements WritePlatformServi
final AppUserRepository appUserRepository, final AppUserRepository appUserRepository,
final RoleRepository roleRepository, final RoleRepository roleRepository,
final PermissionRepository permissionRepository) { final PermissionRepository permissionRepository) {
this.organisationRepository = organisationRepository;
this.officeRepository = officeRepository; this.officeRepository = officeRepository;
this.userDomainService = userDomainService;
this.platformUserRepository = platformUserRepository; this.platformUserRepository = platformUserRepository;
this.platformPasswordEncoder = platformPasswordEncoder; this.platformPasswordEncoder = platformPasswordEncoder;
this.clientRepository = clientRepository; this.clientRepository = clientRepository;
@@ -143,78 +126,6 @@ public class WritePlatformServiceJpaRepositoryImpl implements WritePlatformServi
this.permissionRepository = permissionRepository; 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 @Transactional
@Override @Override
public Long updateCurrentUser(UserCommand command) { public Long updateCurrentUser(UserCommand command) {
@@ -254,12 +165,6 @@ public class WritePlatformServiceJpaRepositoryImpl implements WritePlatformServi
return userToUpdate.getId(); return userToUpdate.getId();
} }
@Transactional
@Override
public void deleteUser(Long userId) {
this.appUserRepository.delete(userId);
}
@Transactional @Transactional
@Override @Override
public Long createRole(final RoleCommand command) { public Long createRole(final RoleCommand command) {
@@ -321,30 +226,6 @@ public class WritePlatformServiceJpaRepositoryImpl implements WritePlatformServi
return role.getId(); 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 @Transactional
@Override @Override
public void updateUsernamePasswordOnFirstTimeLogin(final UpdateUsernamePasswordCommand command) { public void updateUsernamePasswordOnFirstTimeLogin(final UpdateUsernamePasswordCommand command) {
@@ -4,18 +4,14 @@ import java.util.HashMap;
import java.util.Map; import java.util.Map;
import java.util.Set; import java.util.Set;
import javax.servlet.http.HttpServletResponse;
import javax.ws.rs.Consumes; import javax.ws.rs.Consumes;
import javax.ws.rs.GET; import javax.ws.rs.GET;
import javax.ws.rs.HeaderParam;
import javax.ws.rs.OPTIONS;
import javax.ws.rs.Path; import javax.ws.rs.Path;
import javax.ws.rs.Produces; import javax.ws.rs.Produces;
import javax.ws.rs.core.Context; import javax.ws.rs.core.Context;
import javax.ws.rs.core.MediaType; import javax.ws.rs.core.MediaType;
import javax.ws.rs.core.MultivaluedMap; import javax.ws.rs.core.MultivaluedMap;
import javax.ws.rs.core.Response; import javax.ws.rs.core.Response;
import javax.ws.rs.core.Response.ResponseBuilder;
import javax.ws.rs.core.StreamingOutput; import javax.ws.rs.core.StreamingOutput;
import javax.ws.rs.core.UriInfo; import javax.ws.rs.core.UriInfo;
@@ -38,57 +34,25 @@ public class ReportingApiResource {
@Autowired @Autowired
private ReadExtraDataAndReportingService ReadExtraDataAndReportingService; private ReadExtraDataAndReportingService ReadExtraDataAndReportingService;
private String _corsHeaders; // private Response makeCORSExport(ResponseBuilder req, String exportFilename,
// String returnMethod) {
private Response makeCORS(ResponseBuilder req, String returnMethod) { // ResponseBuilder rb = req
ResponseBuilder rb = req.header("Access-Control-Allow-Origin", "*") // .header("Access-Control-Allow-Origin", "*")
.header("Access-Control-Allow-Methods", "GET, POST, OPTIONS"); // .header("Access-Control-Allow-Methods", "GET, POST, OPTIONS")
// .header("Content-Disposition",
if (!"".equals(returnMethod)) { // "attachment;filename=" + exportFilename);
rb.header("Access-Control-Allow-Headers", returnMethod); //
} // if (!"".equals(returnMethod)) {
// rb.header("Access-Control-Allow-Headers", returnMethod);
return rb.build(); // }
} //
// 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);
}
@GET @GET
@Consumes({ MediaType.APPLICATION_JSON, MediaType.APPLICATION_XML }) @Consumes({ MediaType.APPLICATION_JSON, MediaType.APPLICATION_XML })
@Produces({ MediaType.APPLICATION_JSON, "application/x-msdownload" }) @Produces({ MediaType.APPLICATION_JSON, "application/x-msdownload" })
public Response retrieveReport(@Context UriInfo uriInfo, public Response retrieveReport(@Context UriInfo uriInfo) {
@Context HttpServletResponse httpServletResponse) {
MultivaluedMap<String, String> queryParams = uriInfo MultivaluedMap<String, String> queryParams = uriInfo
.getQueryParameters(); .getQueryParameters();
@@ -115,15 +79,13 @@ public class ReportingApiResource {
if ((exportCSV == null) || (!(exportCSV.equalsIgnoreCase("true")))) { if ((exportCSV == null) || (!(exportCSV.equalsIgnoreCase("true")))) {
GenericResultset result = this.ReadExtraDataAndReportingService GenericResultset result = this.ReadExtraDataAndReportingService
.retrieveGenericResultset(name, type, extractedQueryParams); .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), return Response.ok().entity(result).build();
name.replaceAll(" ", "") + ".csv");
} }
StreamingOutput result = this.ReadExtraDataAndReportingService.retrieveReportCSV(name, type, extractedQueryParams);
return Response.ok().entity(result).header("Content-Disposition","attachment;filename=" + name.replaceAll(" ", "") + ".csv").build();
} }
@GET @GET
@@ -3,7 +3,6 @@ package org.mifosng.platform.api.user;
import java.util.Arrays; import java.util.Arrays;
import java.util.Collection; import java.util.Collection;
import javax.servlet.http.HttpServletRequest;
import javax.ws.rs.Consumes; import javax.ws.rs.Consumes;
import javax.ws.rs.DELETE; import javax.ws.rs.DELETE;
import javax.ws.rs.GET; import javax.ws.rs.GET;
@@ -13,7 +12,6 @@ import javax.ws.rs.Path;
import javax.ws.rs.PathParam; import javax.ws.rs.PathParam;
import javax.ws.rs.Produces; import javax.ws.rs.Produces;
import javax.ws.rs.WebApplicationException; import javax.ws.rs.WebApplicationException;
import javax.ws.rs.core.Context;
import javax.ws.rs.core.MediaType; import javax.ws.rs.core.MediaType;
import javax.ws.rs.core.Response; import javax.ws.rs.core.Response;
import javax.ws.rs.core.Response.Status; 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.ErrorResponse;
import org.mifosng.data.ErrorResponseList; import org.mifosng.data.ErrorResponseList;
import org.mifosng.data.UserList; import org.mifosng.data.UserList;
import org.mifosng.data.command.ChangePasswordCommand;
import org.mifosng.data.command.UserCommand; import org.mifosng.data.command.UserCommand;
import org.mifosng.platform.ReadPlatformService; import org.mifosng.platform.ReadPlatformService;
import org.mifosng.platform.WritePlatformService;
import org.mifosng.platform.exceptions.ApplicationDomainRuleException; import org.mifosng.platform.exceptions.ApplicationDomainRuleException;
import org.mifosng.platform.exceptions.NewDataValidationException; import org.mifosng.platform.exceptions.NewDataValidationException;
import org.mifosng.platform.exceptions.UnAuthenticatedUserException; import org.mifosng.platform.exceptions.UnAuthenticatedUserException;
import org.mifosng.platform.user.domain.AppUser; import org.mifosng.platform.user.domain.AppUser;
import org.mifosng.platform.user.domain.AppUserRepository; import org.mifosng.platform.user.domain.AppUserRepository;
import org.slf4j.Logger; import org.mifosng.platform.user.service.AppUserWritePlatformService;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Scope; import org.springframework.context.annotation.Scope;
import org.springframework.dao.DataIntegrityViolationException;
import org.springframework.security.access.AccessDeniedException; import org.springframework.security.access.AccessDeniedException;
import org.springframework.security.authentication.UsernamePasswordAuthenticationToken; import org.springframework.security.authentication.UsernamePasswordAuthenticationToken;
import org.springframework.security.core.Authentication; import org.springframework.security.core.Authentication;
@@ -49,13 +43,11 @@ import org.springframework.stereotype.Component;
@Scope("singleton") @Scope("singleton")
public class UserApiResource { public class UserApiResource {
private final static Logger logger = LoggerFactory.getLogger(UserApiResource.class);
@Autowired @Autowired
private ReadPlatformService readPlatformService; private ReadPlatformService readPlatformService;
@Autowired @Autowired
private WritePlatformService writePlatformService; private AppUserWritePlatformService appUserWritePlatformService;
@Autowired @Autowired
private AppUserRepository appUserRepository; private AppUserRepository appUserRepository;
@@ -108,32 +100,11 @@ public class UserApiResource {
@POST @POST
@Consumes({ MediaType.APPLICATION_JSON, MediaType.APPLICATION_XML}) @Consumes({ MediaType.APPLICATION_JSON, MediaType.APPLICATION_XML})
@Produces({ MediaType.APPLICATION_JSON}) @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(); hardcodeUserIntoSecurityContext();
Long userId = this.writePlatformService.createUser(command); Long userId = this.appUserWritePlatformService.createUser(command);
return Response.ok().entity(new EntityIdentifier(userId)).build(); 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 @DELETE
@@ -143,7 +114,7 @@ public class UserApiResource {
public Response deleteUser(@PathParam("userId") final Long userId) { public Response deleteUser(@PathParam("userId") final Long userId) {
try { try {
this.writePlatformService.deleteUser(userId); this.appUserWritePlatformService.deleteUser(userId);
return Response.ok().build(); return Response.ok().build();
} catch (UnAuthenticatedUserException e) { } catch (UnAuthenticatedUserException e) {
@@ -167,11 +138,9 @@ public class UserApiResource {
hardcodeUserIntoSecurityContext(); hardcodeUserIntoSecurityContext();
// UserCommand command = new UserCommand();
// command.setSelectedItems(new ArrayList<String>(commandEile.getSelectedItems()));
command.setId(userId); command.setId(userId);
this.writePlatformService.updateUser(command); this.appUserWritePlatformService.updateUser(command);
return Response.ok().entity(new EntityIdentifier(userId)).build(); return Response.ok().entity(new EntityIdentifier(userId)).build();
} }
@@ -201,57 +170,57 @@ public class UserApiResource {
} }
} }
@POST // @POST
@Path("user/current") // @Path("user/current")
@Consumes({ MediaType.APPLICATION_JSON, MediaType.APPLICATION_XML }) // @Consumes({ MediaType.APPLICATION_JSON, MediaType.APPLICATION_XML })
@Produces({ MediaType.APPLICATION_JSON, MediaType.APPLICATION_XML }) // @Produces({ MediaType.APPLICATION_JSON, MediaType.APPLICATION_XML })
public Response updateCurrentUser(UserCommand command) { // public Response updateCurrentUser(UserCommand command) {
//
try { // try {
hardcodeUserIntoSecurityContext(); // hardcodeUserIntoSecurityContext();
//
Long userId = this.writePlatformService.updateCurrentUser(command); // Long userId = this.appUserWritePlatformService.updateCurrentUser(command);
//
return Response.ok().entity(new EntityIdentifier(userId)).build(); // return Response.ok().entity(new EntityIdentifier(userId)).build();
} catch (UnAuthenticatedUserException e) { // } catch (UnAuthenticatedUserException e) {
throw new WebApplicationException(Response.status(Status.UNAUTHORIZED).build()); // throw new WebApplicationException(Response.status(Status.UNAUTHORIZED).build());
} catch (AccessDeniedException e) { // } catch (AccessDeniedException e) {
ErrorResponse errorResponse = new ErrorResponse("error.msg.no.permission", "id"); // ErrorResponse errorResponse = new ErrorResponse("error.msg.no.permission", "id");
ErrorResponseList list = new ErrorResponseList(Arrays.asList(errorResponse)); // ErrorResponseList list = new ErrorResponseList(Arrays.asList(errorResponse));
throw new WebApplicationException(Response.status(Status.BAD_REQUEST).entity(list).build()); // throw new WebApplicationException(Response.status(Status.BAD_REQUEST).entity(list).build());
} catch (ApplicationDomainRuleException e) { // } catch (ApplicationDomainRuleException e) {
throw new WebApplicationException(Response.status(Status.BAD_REQUEST).entity(new ErrorResponseList(e.getErrors())).build()); // throw new WebApplicationException(Response.status(Status.BAD_REQUEST).entity(new ErrorResponseList(e.getErrors())).build());
} catch (NewDataValidationException e) { // } catch (NewDataValidationException e) {
throw new WebApplicationException(Response.status(Status.BAD_REQUEST).entity(new ErrorResponseList(e.getValidationErrors())).build()); // throw new WebApplicationException(Response.status(Status.BAD_REQUEST).entity(new ErrorResponseList(e.getValidationErrors())).build());
} catch (DataIntegrityViolationException e) { // } catch (DataIntegrityViolationException e) {
ErrorResponse errorResponse = new ErrorResponse("error.msg.username.already.exists.in.organisation", "username", command.getUsername()); // ErrorResponse errorResponse = new ErrorResponse("error.msg.username.already.exists.in.organisation", "username", command.getUsername());
ErrorResponseList list = new ErrorResponseList(Arrays.asList(errorResponse)); // ErrorResponseList list = new ErrorResponseList(Arrays.asList(errorResponse));
throw new WebApplicationException(Response.status(Status.BAD_REQUEST).entity(list).build()); // throw new WebApplicationException(Response.status(Status.BAD_REQUEST).entity(list).build());
} // }
} // }
//
@POST // @POST
@Path("user/current/password") // @Path("user/current/password")
@Consumes({ MediaType.APPLICATION_JSON, MediaType.APPLICATION_XML }) // @Consumes({ MediaType.APPLICATION_JSON, MediaType.APPLICATION_XML })
@Produces({ MediaType.APPLICATION_JSON, MediaType.APPLICATION_XML }) // @Produces({ MediaType.APPLICATION_JSON, MediaType.APPLICATION_XML })
public Response updateCurrentUserPassword(ChangePasswordCommand command) { // public Response updateCurrentUserPassword(ChangePasswordCommand command) {
//
try { // try {
hardcodeUserIntoSecurityContext(); // hardcodeUserIntoSecurityContext();
//
Long userId = this.writePlatformService.updateCurrentUserPassword(command); // Long userId = this.appUserWritePlatformService.updateCurrentUserPassword(command);
//
return Response.ok().entity(new EntityIdentifier(userId)).build(); // return Response.ok().entity(new EntityIdentifier(userId)).build();
} catch (UnAuthenticatedUserException e) { // } catch (UnAuthenticatedUserException e) {
throw new WebApplicationException(Response.status(Status.UNAUTHORIZED).build()); // throw new WebApplicationException(Response.status(Status.UNAUTHORIZED).build());
} catch (AccessDeniedException e) { // } catch (AccessDeniedException e) {
ErrorResponse errorResponse = new ErrorResponse("error.msg.no.permission", "id"); // ErrorResponse errorResponse = new ErrorResponse("error.msg.no.permission", "id");
ErrorResponseList list = new ErrorResponseList(Arrays.asList(errorResponse)); // ErrorResponseList list = new ErrorResponseList(Arrays.asList(errorResponse));
throw new WebApplicationException(Response.status(Status.BAD_REQUEST).entity(list).build()); // throw new WebApplicationException(Response.status(Status.BAD_REQUEST).entity(list).build());
} catch (ApplicationDomainRuleException e) { // } catch (ApplicationDomainRuleException e) {
throw new WebApplicationException(Response.status(Status.BAD_REQUEST).entity(new ErrorResponseList(e.getErrors())).build()); // throw new WebApplicationException(Response.status(Status.BAD_REQUEST).entity(new ErrorResponseList(e.getErrors())).build());
} catch (NewDataValidationException e) { // } catch (NewDataValidationException e) {
throw new WebApplicationException(Response.status(Status.BAD_REQUEST).entity(new ErrorResponseList(e.getValidationErrors())).build()); // 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; import org.springframework.web.servlet.ModelAndView;
/** /**
* FIXMED - REMOVE DEPRECATED CONTROLLER and related code artifacts
* @deprecated - remove signup functionality for now. * @deprecated - remove signup functionality for now.
*/ */
@Deprecated @Deprecated
@@ -95,7 +96,8 @@ public class SignupController {
ModelAndView mav = null; ModelAndView mav = null;
try { try {
signupPlatformService.signup(command); // REMOVED
// signupPlatformService.signup(command);
status.setComplete(); status.setComplete();
mav = new ModelAndView("/tenant/signupsuccess", "signupFormBean", mav = new ModelAndView("/tenant/signupsuccess", "signupFormBean",
@@ -4,7 +4,7 @@ import org.mifosng.data.command.OfficeCommand;
public interface OfficeWritePlatformService { public interface OfficeWritePlatformService {
Long createOffice(OfficeCommand command); Long createOffice(final OfficeCommand command);
Long updateOffice(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.exceptions.PlatformDataIntegrityException;
import org.mifosng.platform.organisation.domain.Office; import org.mifosng.platform.organisation.domain.Office;
import org.mifosng.platform.organisation.domain.OfficeRepository; import org.mifosng.platform.organisation.domain.OfficeRepository;
import org.mifosng.platform.organisation.service.OfficeCommandValidator;
import org.mifosng.platform.security.PlatformSecurityContext; import org.mifosng.platform.security.PlatformSecurityContext;
import org.mifosng.platform.user.domain.AppUser; import org.mifosng.platform.user.domain.AppUser;
import org.slf4j.Logger; import org.slf4j.Logger;
@@ -49,7 +50,7 @@ public class OfficeWritePlatformServiceJpaRepositoryImpl implements OfficeWriteP
office.generateHierarchy(); office.generateHierarchy();
this.officeRepository.save(office); this.officeRepository.saveAndFlush(office);
return office.getId(); return office.getId();
} catch (DataIntegrityViolationException dve) { } catch (DataIntegrityViolationException dve) {
@@ -3,10 +3,8 @@ package org.mifosng.platform.rest;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.Arrays; import java.util.Arrays;
import java.util.Collection; import java.util.Collection;
import java.util.List;
import javax.ws.rs.Consumes; import javax.ws.rs.Consumes;
import javax.ws.rs.DELETE;
import javax.ws.rs.GET; import javax.ws.rs.GET;
import javax.ws.rs.POST; import javax.ws.rs.POST;
import javax.ws.rs.Path; import javax.ws.rs.Path;
@@ -27,17 +25,14 @@ import org.mifosng.data.PermissionData;
import org.mifosng.data.PermissionList; import org.mifosng.data.PermissionList;
import org.mifosng.data.RoleData; import org.mifosng.data.RoleData;
import org.mifosng.data.RoleList; import org.mifosng.data.RoleList;
import org.mifosng.data.UserList;
import org.mifosng.data.command.ChangePasswordCommand; import org.mifosng.data.command.ChangePasswordCommand;
import org.mifosng.data.command.RoleCommand; import org.mifosng.data.command.RoleCommand;
import org.mifosng.data.command.UserCommand; import org.mifosng.data.command.UserCommand;
import org.mifosng.platform.ReadPlatformService; import org.mifosng.platform.ReadPlatformService;
import org.mifosng.platform.WritePlatformService; import org.mifosng.platform.WritePlatformService;
import org.mifosng.platform.exceptions.ApplicationDomainRuleException; import org.mifosng.platform.exceptions.ApplicationDomainRuleException;
import org.mifosng.platform.exceptions.UnAuthenticatedUserException;
import org.mifosng.platform.exceptions.NewDataValidationException; import org.mifosng.platform.exceptions.NewDataValidationException;
import org.mifosng.platform.infrastructure.PlatformEmailSendException; import org.mifosng.platform.exceptions.UnAuthenticatedUserException;
import org.mifosng.platform.infrastructure.UsernameAlreadyExistsException;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Scope; import org.springframework.context.annotation.Scope;
import org.springframework.dao.DataIntegrityViolationException; import org.springframework.dao.DataIntegrityViolationException;
@@ -55,158 +50,6 @@ public class UserAdmistrationResource {
@Autowired @Autowired
private WritePlatformService writePlatformService; 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 @GET
@Path("user/current") @Path("user/current")
@Consumes({ MediaType.APPLICATION_JSON, MediaType.APPLICATION_XML }) @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; import org.springframework.security.core.userdetails.User;
@Entity @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 { public class AppUser extends AbstractAuditableCustom<AppUser, Long> implements PlatformUser {
@Column(name = "email", nullable=false, length=100) @Column(name = "email", nullable=false, length=100)
@@ -81,6 +81,8 @@ public class AppUser extends AbstractAuditableCustom<AppUser, Long> implements P
boolean userAccountNonLocked = true; boolean userAccountNonLocked = true;
Collection<SimpleGrantedAuthority> authorities = new ArrayList<SimpleGrantedAuthority>(); 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); User user = new User(username, password, userEnabled, userAccountNonExpired, userCredentialsNonExpired, userAccountNonLocked, authorities);
return new AppUser(organisation, office, user, allRoles, email, firstname, lastname); 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);
}
}
}