UserDetailsSelfController.java

package sk.iway.iwcm.components.users.userdetail;

import java.util.ArrayList;
import java.util.List;

import javax.servlet.http.HttpServletRequest;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.Pageable;
import org.springframework.security.access.prepost.PreAuthorize;
import org.springframework.validation.Errors;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import sk.iway.iwcm.Identity;
import sk.iway.iwcm.Tools;
import sk.iway.iwcm.common.UserTools;
import sk.iway.iwcm.i18n.Prop;
import sk.iway.iwcm.system.datatable.Datatable;
import sk.iway.iwcm.system.datatable.DatatablePageImpl;
import sk.iway.iwcm.system.datatable.DatatableRequest;
import sk.iway.iwcm.system.datatable.DatatableRestControllerV2;

/**
 * Controller to edit user details for current user without useredit perms (show only limited fields)
 */
@RestController
@Datatable
@RequestMapping(value = "/admin/rest/user-self")
@PreAuthorize(value = "@WebjetSecurityService.isAdmin()")
public class UserDetailsSelfController extends DatatableRestControllerV2<UserDetailsSelfEntity, Long> {

    private final UserDetailsService userDetailsService;
    private final UserDetailsSelfRepository userDetailsSelfRepository;

    @Autowired
    public UserDetailsSelfController(UserDetailsSelfRepository userDetailsSelfRepository, UserDetailsService userDetailsService) {
        super(userDetailsSelfRepository);
        this.userDetailsSelfRepository = userDetailsSelfRepository;
        this.userDetailsService = userDetailsService;
    }

    @Override
    public Page<UserDetailsSelfEntity> getAllItems(Pageable pageable) {

        List<UserDetailsSelfEntity> all = new ArrayList<>();
        UserDetailsSelfEntity self = userDetailsSelfRepository.getById(Long.valueOf(getUser().getUserId()));
        all.add(self);

        DatatablePageImpl<UserDetailsSelfEntity> page = new DatatablePageImpl<>(all);

        return page;
    }

    @Override
	public UserDetailsSelfEntity insertItem(UserDetailsSelfEntity entity) {
		throwPermsDenied();
        return null;
	}

    @Override
	public UserDetailsSelfEntity editItem(UserDetailsSelfEntity entity, long id) {
		if (id != getUser().getUserId()) {
            throwPermsDenied();
        }
        UserDetailsSelfEntity saved = super.editItem(entity, id);
        UserDetailsService.savePassword(entity.getPassword(), entity.getId().intValue());
        return saved;
	}

    @Override
    public UserDetailsSelfEntity getOneItem(long id) {
        if (id != getUser().getUserId()) throwPermsDenied();

        UserDetailsSelfEntity one = super.getOneItem(id);

        //nastav heslo na Unchanged, aby presla validacia
        one.setPassword(UserTools.PASS_UNCHANGED);

        return one;
    }

    @Override
    public void afterSave(UserDetailsSelfEntity entity, UserDetailsSelfEntity saved) {
        //update current user if editing self
        userDetailsService.updateSelf(saved, getUser(), getRequest());
    }

    @SuppressWarnings("all")
    @Override
    public void validateEditor(HttpServletRequest request, DatatableRequest<Long, UserDetailsSelfEntity> target, Identity user, Errors errors, Long id, UserDetailsSelfEntity entity) {

        Prop prop = Prop.getInstance(request);

        userDetailsService.validatePassword(entity, false, true, prop, errors);

        //not empty aby pri prazdnej hlasilo v editore, ze to je povinne pole
        if (Tools.isNotEmpty(entity.getEmail()) && Tools.isEmail(entity.getEmail())==false) {
            errors.rejectValue("errorField.email", null, prop.getText("javax.validation.constraints.Email.message"));
        }

    }

    private void throwPermsDenied() {
        throwError("datatables.error.recordIsNotEditable");
    }
}