第2段階 部署削除機能
This commit is contained in:
@@ -1,16 +1,17 @@
|
||||
package com.example.rhizome.aop.aspect;
|
||||
|
||||
import com.example.rhizome.app.presentation.controller.pageproperty.SessionKeyword;
|
||||
import com.example.rhizome.app.presentation.controller.pageproperty.TransitionTargetPageNameKeyword;
|
||||
import com.example.rhizome.app.presentation.form.LoginUserForm;
|
||||
import com.example.rhizome.exception.InsufficientPermissionException;
|
||||
import javax.servlet.http.HttpServletRequest;
|
||||
|
||||
import org.aspectj.lang.annotation.Aspect;
|
||||
import org.aspectj.lang.annotation.Before;
|
||||
import org.aspectj.lang.annotation.Pointcut;
|
||||
import org.springframework.beans.factory.annotation.Autowired;
|
||||
import org.springframework.stereotype.Component;
|
||||
|
||||
import javax.servlet.http.HttpServletRequest;
|
||||
import com.example.rhizome.app.presentation.controller.pageproperty.SessionKeyword;
|
||||
import com.example.rhizome.app.presentation.controller.pageproperty.TransitionTargetPageNameKeyword;
|
||||
import com.example.rhizome.app.presentation.form.LoginUserForm;
|
||||
import com.example.rhizome.exception.InsufficientPermissionException;
|
||||
|
||||
/**
|
||||
* 権限チェック用のAOP
|
||||
@@ -19,96 +20,95 @@ import javax.servlet.http.HttpServletRequest;
|
||||
@Component
|
||||
public class PermissionCheckAspect {
|
||||
|
||||
HttpServletRequest request;
|
||||
HttpServletRequest request;
|
||||
|
||||
@Autowired
|
||||
public PermissionCheckAspect(HttpServletRequest request) {
|
||||
this.request = request;
|
||||
}
|
||||
@Autowired
|
||||
public PermissionCheckAspect(HttpServletRequest request) {
|
||||
this.request = request;
|
||||
}
|
||||
|
||||
// Aspectのフックを定義(今回はPermissionCheckアノテーションが定義されているメソッドが動作するタイミング)
|
||||
@Pointcut("@annotation(com.example.rhizome.aop.aspect.PermissionCheck)")
|
||||
public void permissionCheckMethod() {
|
||||
}
|
||||
// Aspectのフックを定義(今回はPermissionCheckアノテーションが定義されているメソッドが動作するタイミング)
|
||||
@Pointcut("@annotation(com.example.rhizome.aop.aspect.PermissionCheck)")
|
||||
public void permissionCheckMethod() {
|
||||
}
|
||||
|
||||
/**
|
||||
* 権限チェック
|
||||
*/
|
||||
@Before("permissionCheckMethod()")
|
||||
public void checkPermission() {
|
||||
// ログインユーザの取得
|
||||
LoginUserForm loginUserForm = (LoginUserForm) request.getSession().getAttribute(SessionKeyword.LOGIN_USER);
|
||||
/**
|
||||
* 権限チェック
|
||||
*/
|
||||
@Before("permissionCheckMethod()")
|
||||
public void checkPermission() {
|
||||
// ログインユーザの取得
|
||||
LoginUserForm loginUserForm = (LoginUserForm) request.getSession().getAttribute(SessionKeyword.LOGIN_USER);
|
||||
|
||||
// ログインユーザが取得できない場合、または権限がない場合はエラー画面に遷移
|
||||
if (loginUserForm == null || !hasRequiredPermission(request.getRequestURI(), loginUserForm)) {
|
||||
throw new InsufficientPermissionException("不正な遷移です");
|
||||
}
|
||||
// ログインユーザが取得できない場合、または権限がない場合はエラー画面に遷移
|
||||
if (loginUserForm == null || !hasRequiredPermission(request.getRequestURI(), loginUserForm)) {
|
||||
throw new InsufficientPermissionException("不正な遷移です");
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* 遷移先のURLとログインユーザの権限から、遷移可否を判定する
|
||||
*
|
||||
* @param targetURL 遷移したいURL
|
||||
* @param loginUserForm リクエスト元のユーザ
|
||||
* @return true:遷移可 false:遷移不可
|
||||
*/
|
||||
private boolean hasRequiredPermission(String targetURL, LoginUserForm loginUserForm) {
|
||||
/**
|
||||
* 遷移先のURLとログインユーザの権限から、遷移可否を判定する
|
||||
*
|
||||
* @param targetURL 遷移したいURL
|
||||
* @param loginUserForm リクエスト元のユーザ
|
||||
* @return true:遷移可 false:遷移不可
|
||||
*/
|
||||
private boolean hasRequiredPermission(String targetURL, LoginUserForm loginUserForm) {
|
||||
|
||||
// 管理者権限
|
||||
if (isAdminTransition(targetURL, loginUserForm)) {
|
||||
return true;
|
||||
}
|
||||
// 管理者権限
|
||||
if (isAdminTransition(targetURL, loginUserForm)) {
|
||||
return true;
|
||||
}
|
||||
|
||||
// 一般権限
|
||||
if (isUserTransition(targetURL, loginUserForm)) {
|
||||
return true;
|
||||
}
|
||||
// 一般権限
|
||||
if (isUserTransition(targetURL, loginUserForm)) {
|
||||
return true;
|
||||
}
|
||||
|
||||
// アクセス不許可の場合の処理(不正アクセス画面に遷移)
|
||||
return false;
|
||||
// アクセス不許可の場合の処理(不正アクセス画面に遷移)
|
||||
return false;
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* 管理者用のアカウントで管理者向けのページアクセスか
|
||||
*
|
||||
* @param targetURL 遷移したいURL
|
||||
* @param loginUserForm リクエスト元のユーザ
|
||||
* @return true:遷移可 false:遷移不可
|
||||
*/
|
||||
private boolean isAdminTransition(String targetURL, LoginUserForm loginUserForm) {
|
||||
/**
|
||||
* 管理者用のアカウントで管理者向けのページアクセスか
|
||||
*
|
||||
* @param targetURL 遷移したいURL
|
||||
* @param loginUserForm リクエスト元のユーザ
|
||||
* @return true:遷移可 false:遷移不可
|
||||
*/
|
||||
private boolean isAdminTransition(String targetURL, LoginUserForm loginUserForm) {
|
||||
|
||||
// 管理者か
|
||||
if (!loginUserForm.isAdminUser()) {
|
||||
return false;
|
||||
}
|
||||
// 管理者か
|
||||
if (!loginUserForm.isAdminUser()) {
|
||||
return false;
|
||||
}
|
||||
|
||||
// 管理者向けのページ遷移か
|
||||
if (!TransitionTargetPageNameKeyword.getAdminPageList().contains(targetURL)) {
|
||||
return false;
|
||||
}
|
||||
// 管理者向けのページ遷移か
|
||||
if (!TransitionTargetPageNameKeyword.getAdminPageList().contains(targetURL)) {
|
||||
return false;
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
/**
|
||||
* 一般ユーザ用のアカウントで一般ユーザ向けのページアクセスか
|
||||
*
|
||||
* @param targetURL 遷移したいURL
|
||||
* @param loginUserForm リクエスト元のユーザ
|
||||
* @return true:遷移可 false:遷移不可
|
||||
*/
|
||||
private boolean isUserTransition(String targetURL, LoginUserForm loginUserForm) {
|
||||
/**
|
||||
* 一般ユーザ用のアカウントで一般ユーザ向けのページアクセスか
|
||||
*
|
||||
* @param targetURL 遷移したいURL
|
||||
* @param loginUserForm リクエスト元のユーザ
|
||||
* @return true:遷移可 false:遷移不可
|
||||
*/
|
||||
private boolean isUserTransition(String targetURL, LoginUserForm loginUserForm) {
|
||||
|
||||
// 管理者か
|
||||
if (loginUserForm.isAdminUser()) {
|
||||
return false;
|
||||
}
|
||||
// 管理者か
|
||||
if (loginUserForm.isAdminUser()) {
|
||||
return false;
|
||||
}
|
||||
|
||||
// 一般ユーザ向けのページ遷移か
|
||||
return TransitionTargetPageNameKeyword.getUserPageList().contains(targetURL);
|
||||
// 一般ユーザ向けのページ遷移か
|
||||
return TransitionTargetPageNameKeyword.getUserPageList().contains(targetURL);
|
||||
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -0,0 +1,6 @@
|
||||
package com.example.rhizome.app.domain.service;
|
||||
|
||||
public interface DeleteDepartment {
|
||||
void deleteDepartment(Integer idDepartment);
|
||||
|
||||
}
|
||||
@@ -1,14 +1,18 @@
|
||||
package com.example.rhizome.app.domain.service;
|
||||
|
||||
import java.util.List;
|
||||
import java.util.Optional;
|
||||
|
||||
import com.example.rhizome.app.domain.model.Department;
|
||||
import com.example.rhizome.app.domain.model.SearchConditionDepartment;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
public interface SearchDepartment {
|
||||
List<Department> selectAll();
|
||||
List<Department> selectAll();
|
||||
|
||||
List<Department> searchBy(SearchConditionDepartment searchConditionDepartment);
|
||||
List<Department> searchBy(SearchConditionDepartment searchConditionDepartment);
|
||||
|
||||
List<Department> searchByWithLike(SearchConditionDepartment searchConditionDepartment);
|
||||
|
||||
Optional<Department> searchDepartmentByIdDepartment(Integer idDepartment);
|
||||
|
||||
List<Department> searchByWithLike(SearchConditionDepartment searchConditionDepartment);
|
||||
}
|
||||
|
||||
@@ -0,0 +1,33 @@
|
||||
package com.example.rhizome.app.domain.service.impl;
|
||||
|
||||
import org.springframework.beans.factory.annotation.Autowired;
|
||||
import org.springframework.stereotype.Service;
|
||||
import org.springframework.transaction.annotation.Transactional;
|
||||
|
||||
import com.example.rhizome.app.domain.service.DeleteDepartment;
|
||||
import com.example.rhizome.app.infra.repository.DepartmentRepository;
|
||||
|
||||
/**
|
||||
* Employee レコード削除関連の機能を持つサービス
|
||||
*/
|
||||
@Service
|
||||
@Transactional
|
||||
public class DeleteDepartmentImpl implements DeleteDepartment {
|
||||
|
||||
DepartmentRepository departmentRepository;
|
||||
|
||||
@Autowired
|
||||
public DeleteDepartmentImpl(DepartmentRepository departmentRepository) {
|
||||
this.departmentRepository = departmentRepository;
|
||||
}
|
||||
|
||||
/**
|
||||
* idEmployee を元に employee データを削除
|
||||
*
|
||||
* @param idEmployee 削除対象のidEmployee
|
||||
*/
|
||||
public void deleteDepartment(Integer idDepartment) {
|
||||
departmentRepository.deleteById(idDepartment);
|
||||
}
|
||||
|
||||
}
|
||||
@@ -1,17 +1,18 @@
|
||||
package com.example.rhizome.app.domain.service.impl;
|
||||
|
||||
import java.util.List;
|
||||
import java.util.Optional;
|
||||
|
||||
import org.springframework.beans.factory.annotation.Autowired;
|
||||
import org.springframework.data.jpa.domain.Specification;
|
||||
import org.springframework.stereotype.Service;
|
||||
import org.springframework.transaction.annotation.Transactional;
|
||||
|
||||
import com.example.rhizome.app.domain.model.Department;
|
||||
import com.example.rhizome.app.domain.model.SearchConditionDepartment;
|
||||
import com.example.rhizome.app.domain.service.SearchDepartment;
|
||||
import com.example.rhizome.app.infra.entity.DepartmentEntity;
|
||||
import com.example.rhizome.app.infra.repository.DepartmentRepository;
|
||||
import org.springframework.beans.factory.annotation.Autowired;
|
||||
import org.springframework.data.jpa.domain.Specification;
|
||||
import org.springframework.stereotype.Service;
|
||||
import org.springframework.transaction.annotation.Transactional;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
/**
|
||||
* 部署情報検索系の機能を集約させるサービスクラスです。
|
||||
@@ -20,63 +21,67 @@ import java.util.List;
|
||||
@Transactional
|
||||
public class SearchDepartmentImpl implements SearchDepartment {
|
||||
|
||||
DepartmentRepository departmentRepository;
|
||||
DepartmentRepository departmentRepository;
|
||||
|
||||
/**
|
||||
* コンストラクタ
|
||||
*
|
||||
* @param departmentRepository DI対象
|
||||
*/
|
||||
@Autowired
|
||||
public SearchDepartmentImpl(DepartmentRepository departmentRepository) {
|
||||
this.departmentRepository = departmentRepository;
|
||||
}
|
||||
/**
|
||||
* コンストラクタ
|
||||
*
|
||||
* @param departmentRepository DI対象
|
||||
*/
|
||||
@Autowired
|
||||
public SearchDepartmentImpl(DepartmentRepository departmentRepository) {
|
||||
this.departmentRepository = departmentRepository;
|
||||
}
|
||||
|
||||
/**
|
||||
* 部署情報を全件取得する
|
||||
*
|
||||
* @return 取得した部署情報レコード全件
|
||||
*/
|
||||
public List<Department> selectAll() {
|
||||
return DepartmentEntity.createDepartmentList(departmentRepository.findAll());
|
||||
}
|
||||
/**
|
||||
* 部署情報を全件取得する
|
||||
*
|
||||
* @return 取得した部署情報レコード全件
|
||||
*/
|
||||
public List<Department> selectAll() {
|
||||
return DepartmentEntity.createDepartmentList(departmentRepository.findAll());
|
||||
}
|
||||
|
||||
/**
|
||||
* searchConditionDepartment の情報を元に Department のレコードを取得
|
||||
*
|
||||
* @param searchConditionDepartment 検索条件
|
||||
* @return 検索結果のレコード
|
||||
*/
|
||||
public List<Department> searchBy(SearchConditionDepartment searchConditionDepartment) {
|
||||
// 動的に検索条件を絞り込む
|
||||
// Specification は Criteria API の Predicate をラップしたもの
|
||||
return DepartmentEntity
|
||||
.createDepartmentList(
|
||||
departmentRepository.findAll(Specification
|
||||
.where(DepartmentRepository.idDepartmentEqual(searchConditionDepartment.getIdDepartment()))
|
||||
.and(DepartmentRepository.nmDepartmentEqual(searchConditionDepartment.getNmDepartment()))
|
||||
)
|
||||
);
|
||||
/**
|
||||
* searchConditionDepartment の情報を元に Department のレコードを取得
|
||||
*
|
||||
* @param searchConditionDepartment 検索条件
|
||||
* @return 検索結果のレコード
|
||||
*/
|
||||
public List<Department> searchBy(SearchConditionDepartment searchConditionDepartment) {
|
||||
// 動的に検索条件を絞り込む
|
||||
// Specification は Criteria API の Predicate をラップしたもの
|
||||
return DepartmentEntity
|
||||
.createDepartmentList(
|
||||
departmentRepository.findAll(Specification
|
||||
.where(DepartmentRepository
|
||||
.idDepartmentEqual(searchConditionDepartment.getIdDepartment()))
|
||||
.and(DepartmentRepository
|
||||
.nmDepartmentEqual(searchConditionDepartment.getNmDepartment()))));
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* searchConditionDepartment の情報を元に Department のレコードを取得
|
||||
* 部分一致検索
|
||||
*
|
||||
* @param searchConditionDepartment 検索条件
|
||||
* @return 検索結果のレコード
|
||||
*/
|
||||
public List<Department> searchByWithLike(SearchConditionDepartment searchConditionDepartment) {
|
||||
// 動的に検索条件を絞り込む
|
||||
// Specification は Criteria API の Predicate をラップしたもの
|
||||
return DepartmentEntity
|
||||
.createDepartmentList(
|
||||
departmentRepository.findAll(Specification
|
||||
.where(DepartmentRepository.idDepartmentEqual(searchConditionDepartment.getIdDepartment()))
|
||||
.and(DepartmentRepository.nmDepartmentLike(searchConditionDepartment.getNmDepartment()))
|
||||
)
|
||||
);
|
||||
/**
|
||||
* searchConditionDepartment の情報を元に Department のレコードを取得
|
||||
* 部分一致検索
|
||||
*
|
||||
* @param searchConditionDepartment 検索条件
|
||||
* @return 検索結果のレコード
|
||||
*/
|
||||
public List<Department> searchByWithLike(SearchConditionDepartment searchConditionDepartment) {
|
||||
// 動的に検索条件を絞り込む
|
||||
// Specification は Criteria API の Predicate をラップしたもの
|
||||
return DepartmentEntity
|
||||
.createDepartmentList(
|
||||
departmentRepository.findAll(Specification
|
||||
.where(DepartmentRepository
|
||||
.idDepartmentEqual(searchConditionDepartment.getIdDepartment()))
|
||||
.and(DepartmentRepository
|
||||
.nmDepartmentLike(searchConditionDepartment.getNmDepartment()))));
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
public Optional<Department> searchDepartmentByIdDepartment(Integer idDepartment) {
|
||||
return DepartmentEntity.createDepartmentList(departmentRepository.findById(idDepartment));
|
||||
}
|
||||
}
|
||||
|
||||
@@ -6,15 +6,22 @@
|
||||
*/
|
||||
package com.example.rhizome.app.infra.entity;
|
||||
|
||||
import java.util.List;
|
||||
import java.util.Optional;
|
||||
|
||||
import javax.persistence.Column;
|
||||
import javax.persistence.Entity;
|
||||
import javax.persistence.GeneratedValue;
|
||||
import javax.persistence.GenerationType;
|
||||
import javax.persistence.Id;
|
||||
import javax.persistence.Table;
|
||||
|
||||
import com.example.rhizome.app.domain.model.Department;
|
||||
|
||||
import lombok.AllArgsConstructor;
|
||||
import lombok.Data;
|
||||
import lombok.NoArgsConstructor;
|
||||
|
||||
import javax.persistence.*;
|
||||
import java.util.List;
|
||||
|
||||
/**
|
||||
* Department テーブルの Entity
|
||||
*
|
||||
@@ -27,46 +34,52 @@ import java.util.List;
|
||||
@AllArgsConstructor
|
||||
public class DepartmentEntity {
|
||||
|
||||
/**
|
||||
* 部署ID
|
||||
*/
|
||||
@Id
|
||||
@GeneratedValue(strategy = GenerationType.IDENTITY)
|
||||
@Column(name = "id_department", nullable = false)
|
||||
private Integer idDepartment;
|
||||
/**
|
||||
* 部署名
|
||||
*/
|
||||
@Column(name = "nm_department", nullable = false)
|
||||
private String nmDepartment;
|
||||
/**
|
||||
* 部署ID
|
||||
*/
|
||||
@Id
|
||||
@GeneratedValue(strategy = GenerationType.IDENTITY)
|
||||
@Column(name = "id_department", nullable = false)
|
||||
private Integer idDepartment;
|
||||
/**
|
||||
* 部署名
|
||||
*/
|
||||
@Column(name = "nm_department", nullable = false)
|
||||
private String nmDepartment;
|
||||
|
||||
/**
|
||||
* DepartmentEntity(DataAccess層依存)から Department(BusinessLogic層依存型)に変換します。
|
||||
*
|
||||
* @param departmentEntityList department Table のリスト
|
||||
* @return List<Department> リスト
|
||||
*/
|
||||
public static List<Department> createDepartmentList(List<DepartmentEntity> departmentEntityList) {
|
||||
/**
|
||||
* DepartmentEntity(DataAccess層依存)から Department(BusinessLogic層依存型)に変換します。
|
||||
*
|
||||
* @param departmentEntityList department Table のリスト
|
||||
* @return List<Department> リスト
|
||||
*/
|
||||
public static List<Department> createDepartmentList(List<DepartmentEntity> departmentEntityList) {
|
||||
|
||||
// Stream API を利用するとこうなります。
|
||||
return departmentEntityList
|
||||
.stream()
|
||||
.map(departmentEntity -> new Department(
|
||||
departmentEntity.getIdDepartment(),
|
||||
departmentEntity.getNmDepartment()
|
||||
)).toList();
|
||||
}
|
||||
// Stream API を利用するとこうなります。
|
||||
return departmentEntityList
|
||||
.stream()
|
||||
.map(departmentEntity -> new Department(
|
||||
departmentEntity.getIdDepartment(),
|
||||
departmentEntity.getNmDepartment()))
|
||||
.toList();
|
||||
}
|
||||
|
||||
/**
|
||||
* Department(BusinessLogic層依存型) から DepartmentEntity(DataAccess層依存)に変換します。
|
||||
*
|
||||
* @param department department モデルの値
|
||||
* @return DepartmentEntity に変換したインスタンス
|
||||
*/
|
||||
public static DepartmentEntity convertFrom(Department department) {
|
||||
return new DepartmentEntity(
|
||||
department.getIdDepartment(),
|
||||
department.getNmDepartment());
|
||||
}
|
||||
|
||||
public static Optional<Department> createDepartmentList(Optional<DepartmentEntity> departmentEntityList) {
|
||||
|
||||
return departmentEntityList.map(departmentEntity -> new Department(departmentEntity.getIdDepartment(),
|
||||
departmentEntity.getNmDepartment()));
|
||||
}
|
||||
|
||||
/**
|
||||
* Department(BusinessLogic層依存型) から DepartmentEntity(DataAccess層依存)に変換します。
|
||||
*
|
||||
* @param department department モデルの値
|
||||
* @return DepartmentEntity に変換したインスタンス
|
||||
*/
|
||||
public static DepartmentEntity convertFrom(Department department) {
|
||||
return new DepartmentEntity(
|
||||
department.getIdDepartment(),
|
||||
department.getNmDepartment()
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,11 +1,11 @@
|
||||
package com.example.rhizome.app.infra.repository;
|
||||
|
||||
import com.example.rhizome.app.infra.entity.DepartmentEntity;
|
||||
import org.springframework.data.jpa.domain.Specification;
|
||||
import org.springframework.data.jpa.repository.JpaRepository;
|
||||
import org.springframework.data.jpa.repository.JpaSpecificationExecutor;
|
||||
import org.springframework.stereotype.Repository;
|
||||
|
||||
import com.example.rhizome.app.infra.entity.DepartmentEntity;
|
||||
|
||||
/**
|
||||
* Specification:
|
||||
@@ -20,31 +20,32 @@ import org.springframework.stereotype.Repository;
|
||||
* 戻り値はクエリを格納しているPredicateオブジェクトとなります。
|
||||
*/
|
||||
@Repository
|
||||
public interface DepartmentRepository extends JpaRepository<DepartmentEntity, Integer>, JpaSpecificationExecutor<DepartmentEntity> {
|
||||
public interface DepartmentRepository
|
||||
extends JpaRepository<DepartmentEntity, Integer>, JpaSpecificationExecutor<DepartmentEntity> {
|
||||
|
||||
static Specification<DepartmentEntity> idDepartmentEqual(Integer idDepartment) {
|
||||
return idDepartment == null ? null :
|
||||
// 戻り値の型 Specification<DepartmentEntity> にキャスト
|
||||
(Specification<DepartmentEntity>)
|
||||
// ラムダ式で記載しているが書いてあることは criteriaBuilder を使って Where句の後の "'idDepartment' = idDepartment(変数)"
|
||||
// を作成している
|
||||
(root, criteriaQuery, criteriaBuilder) -> criteriaBuilder.equal(root.get("idDepartment"), idDepartment);
|
||||
}
|
||||
|
||||
static Specification<DepartmentEntity> idDepartmentEqual(Integer idDepartment) {
|
||||
return idDepartment == null ?
|
||||
null :
|
||||
// 戻り値の型 Specification<DepartmentEntity> にキャスト
|
||||
(Specification<DepartmentEntity>)
|
||||
// ラムダ式で記載しているが書いてあることは criteriaBuilder を使って Where句の後の "'idDepartment' = idDepartment(変数)"
|
||||
// を作成している
|
||||
(root, criteriaQuery, criteriaBuilder) -> criteriaBuilder.equal(root.get("idDepartment"), idDepartment);
|
||||
}
|
||||
static Specification<DepartmentEntity> nmDepartmentEqual(String nmDepartment) {
|
||||
return (nmDepartment == null || nmDepartment.isEmpty()) ? null
|
||||
: (Specification<DepartmentEntity>) (root, criteriaQuery, criteriaBuilder) -> criteriaBuilder
|
||||
.like(root.get("nmDepartment"), nmDepartment);
|
||||
}
|
||||
|
||||
static Specification<DepartmentEntity> nmDepartmentEqual(String nmDepartment) {
|
||||
return (nmDepartment == null || nmDepartment.isEmpty()) ?
|
||||
null :
|
||||
(Specification<DepartmentEntity>)
|
||||
(root, criteriaQuery, criteriaBuilder) -> criteriaBuilder.like(root.get("nmDepartment"), nmDepartment);
|
||||
}
|
||||
static Specification<DepartmentEntity> nmDepartmentLike(String nmDepartment) {
|
||||
return (nmDepartment == null || nmDepartment.isEmpty()) ? null
|
||||
: (Specification<DepartmentEntity>) (root, criteriaQuery, criteriaBuilder) -> criteriaBuilder
|
||||
.like(root.get("nmDepartment"), "%" + nmDepartment + "%");
|
||||
}
|
||||
|
||||
static void deleteBy(Integer id) {
|
||||
|
||||
}
|
||||
|
||||
static Specification<DepartmentEntity> nmDepartmentLike(String nmDepartment) {
|
||||
return (nmDepartment == null || nmDepartment.isEmpty()) ?
|
||||
null :
|
||||
(Specification<DepartmentEntity>)
|
||||
(root, criteriaQuery, criteriaBuilder) -> criteriaBuilder.like(root.get("nmDepartment"), "%" + nmDepartment + "%");
|
||||
}
|
||||
}
|
||||
|
||||
@@ -0,0 +1,125 @@
|
||||
package com.example.rhizome.app.presentation.controller;
|
||||
|
||||
import static com.example.rhizome.app.presentation.controller.pageproperty.TransitionTargetPageNameKeyword.*;
|
||||
|
||||
import java.util.logging.Level;
|
||||
import java.util.logging.Logger;
|
||||
|
||||
import javax.servlet.http.HttpSession;
|
||||
|
||||
import org.springframework.beans.factory.annotation.Autowired;
|
||||
import org.springframework.stereotype.Controller;
|
||||
import org.springframework.ui.Model;
|
||||
import org.springframework.web.bind.annotation.RequestMapping;
|
||||
import org.springframework.web.bind.annotation.RequestMethod;
|
||||
import org.springframework.web.bind.annotation.RequestParam;
|
||||
|
||||
import com.example.rhizome.aop.aspect.PermissionCheck;
|
||||
import com.example.rhizome.aop.aspect.SessionCheck;
|
||||
import com.example.rhizome.app.domain.model.LoginUser;
|
||||
import com.example.rhizome.app.domain.service.DeleteDepartment;
|
||||
import com.example.rhizome.app.domain.service.SearchDepartment;
|
||||
import com.example.rhizome.app.domain.service.SearchEmployee;
|
||||
import com.example.rhizome.app.presentation.controller.pageproperty.PageReturnAttributeKeyword;
|
||||
import com.example.rhizome.app.presentation.controller.pageproperty.SessionKeyword;
|
||||
import com.example.rhizome.app.presentation.controller.pageproperty.TransitionTargetPageNameKeyword;
|
||||
import com.example.rhizome.app.presentation.form.DepartmentForm;
|
||||
import com.example.rhizome.app.presentation.form.LoginUserForm;
|
||||
import com.example.rhizome.app.presentation.form.MessageForm;
|
||||
|
||||
/**
|
||||
* 削除処理のコントロータ
|
||||
*/
|
||||
@Controller
|
||||
public class DeleteDepartmentController {
|
||||
// ログ出力用インスタンス
|
||||
private final static Logger LOGGER = Logger.getLogger(DeleteDepartmentController.class.getName());
|
||||
|
||||
// エラーメッセージ用の定数フィールド
|
||||
private final static String SEVERE_ERROR_MESSAGE = "エラーが発生しました!";
|
||||
|
||||
HttpSession httpSession;
|
||||
DeleteDepartment deleteDepartment;
|
||||
SearchDepartment searchDepartment;
|
||||
SearchEmployee searchEmployee;
|
||||
|
||||
@Autowired
|
||||
public DeleteDepartmentController(DeleteDepartment deleteDepartment, SearchDepartment searchDepartment,
|
||||
HttpSession httpSession, SearchEmployee searchEmployee) {
|
||||
this.httpSession = httpSession;
|
||||
this.deleteDepartment = deleteDepartment;
|
||||
this.searchDepartment = searchDepartment;
|
||||
this.searchEmployee = searchEmployee;
|
||||
}
|
||||
|
||||
/**
|
||||
* 削除処理のコントローラ
|
||||
*
|
||||
* @param idEmployee 削除対象のemployeeId
|
||||
* @param model ビューにデータを渡すためのコンテナ
|
||||
* @return 遷移先の画面
|
||||
*/
|
||||
@PermissionCheck
|
||||
@SessionCheck
|
||||
@RequestMapping(value = DELETE_DEPARTMENT, method = RequestMethod.POST)
|
||||
public String deleteDepartment(@RequestParam("idDepartment") Integer idDepartment, Model model) {
|
||||
try {
|
||||
// 部署一覧を取得し、画面に返す用のクラスに詰め替える
|
||||
// 作成した部署一覧をセット
|
||||
model.addAttribute(
|
||||
PageReturnAttributeKeyword.DEPARTMENT_FORM_LIST,
|
||||
DepartmentForm.convertFrom(searchDepartment.selectAll()));
|
||||
|
||||
// 削除処理実施
|
||||
deleteExec(
|
||||
model,
|
||||
idDepartment,
|
||||
LoginUserForm.convertTo((LoginUserForm) httpSession.getAttribute(SessionKeyword.LOGIN_USER)));
|
||||
|
||||
// 検索画面に遷移
|
||||
return "forward:" + TransitionTargetPageNameKeyword.SELECT_DEPARTMENT_INFO_FORM_EMPTY;
|
||||
|
||||
} catch (Exception e) {
|
||||
// ログイン情報の破棄
|
||||
httpSession.invalidate();
|
||||
|
||||
e.printStackTrace();
|
||||
// エラーログ出力
|
||||
LOGGER.log(Level.SEVERE, SEVERE_ERROR_MESSAGE, e);
|
||||
// エラー画面遷移
|
||||
return TransitionTargetPageNameKeyword.ERROR_HTML;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* 削除処理実施
|
||||
*
|
||||
* @param model ビューにデータを渡すためのコンテナ
|
||||
* @param idEmployee 削除対象のemployeeId
|
||||
* @param loginUser ログインユーザー情報
|
||||
*/
|
||||
private void deleteExec(Model model, Integer idDepartment, LoginUser loginUser) {
|
||||
|
||||
final String DELETE_COMPLETE = "削除しました。";
|
||||
final String ID_TO_DELETED_IS_UNKNOWN = "削除対象のIDが不明です。";
|
||||
final String YOU_CANNOT_DELETE_A_DEPARTMENT_THAT_HAS_ONE_OR_MORE_MEMBERS_ASSIGNED_TO_IT = "1名以上が所属している部署は削除出来ません。";
|
||||
|
||||
if (searchDepartment.searchDepartmentByIdDepartment(idDepartment).isEmpty()) {
|
||||
// エラーメッセージをセット
|
||||
model.addAttribute(PageReturnAttributeKeyword.MESSAGE_ERROR, new MessageForm(ID_TO_DELETED_IS_UNKNOWN));
|
||||
return;
|
||||
}
|
||||
|
||||
if (!searchEmployee.searchEmployeeByIdDepartment(idDepartment).isEmpty()) {
|
||||
model.addAttribute(PageReturnAttributeKeyword.MESSAGE_ERROR,
|
||||
new MessageForm(YOU_CANNOT_DELETE_A_DEPARTMENT_THAT_HAS_ONE_OR_MORE_MEMBERS_ASSIGNED_TO_IT));
|
||||
return;
|
||||
}
|
||||
// 削除を実施
|
||||
deleteDepartment.deleteDepartment(idDepartment);
|
||||
|
||||
// 削除完了したメッセージをセット
|
||||
model.addAttribute(PageReturnAttributeKeyword.MESSAGE_INFO, new MessageForm(DELETE_COMPLETE));
|
||||
|
||||
}
|
||||
}
|
||||
@@ -51,7 +51,7 @@ public class TransitionTargetPageNameKeyword {
|
||||
// Controller
|
||||
public static final String SELECT_DEPARTMENT_INFO = "/selectDepartmentInfo";
|
||||
public static final String SELECT_DEPARTMENT_INFO_FORM_EMPTY = "/departmentAll";
|
||||
public static final String DELETE_DEPARTMENT = "a";
|
||||
public static final String DELETE_DEPARTMENT = "/deleteDepartment";
|
||||
public static final String INSERT_DEPARTMENT_INPUT = "i";
|
||||
public static final String INSERT_DEPARTMENT_CONFIRM = "u";
|
||||
public static final String INSERT_DEPARTMENT = "e";
|
||||
@@ -81,7 +81,8 @@ public class TransitionTargetPageNameKeyword {
|
||||
SHOW_UPDATE_EMPLOYEE,
|
||||
UPDATE_EMPLOYEE_RESULT,
|
||||
SELECT_DEPARTMENT_INFO,
|
||||
SELECT_DEPARTMENT_INFO_FORM_EMPTY);
|
||||
SELECT_DEPARTMENT_INFO_FORM_EMPTY,
|
||||
DELETE_DEPARTMENT);
|
||||
}
|
||||
|
||||
/**
|
||||
|
||||
Reference in New Issue
Block a user