@@ -20,145 +20,167 @@ import com.example.demo.repository.EmployeeRepository;
/** EMP-01: 社員登録、EMP-02: 社員編集 */
@Service
public class EmployeeService {
private static final Pattern MAIL = Pattern . compile ( " ^[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+ \\ .[A-Za-z]{2,}$ " ) ;
private static final String MSG_DUP = " このメールアドレスは既に登録されています。 " ;
private static final Pattern MAIL = Pattern . compile ( " ^[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+ \\ .[A-Za-z]{2,}$ " ) ;
private static final String MSG_DUP = " このメールアドレスは既に登録されています。 " ;
private final EmployeeRepository employeeRepository ;
private final EmployeeRepository employeeRepository ;
public EmployeeService ( EmployeeRepository employeeRepository ) {
this . employeeRepository = employeeRepository ;
}
public EmployeeService ( EmployeeRepository employeeRepository ) {
this . employeeRepository = employeeRepository ;
}
// ---------- 検索 ----------
// ---------- 検索 ----------
@Transactional ( readOnly = true )
public Optional < Employee > findByMail ( String mail ) {
return employeeRepository . findByMailAddress ( mail = = null ? " " : mail . trim ( ) ) ;
}
@Transactional ( readOnly = true )
public Optional < Employee > findByMail ( String mail ) {
return employeeRepository . findByMailAddress ( mail = = null ? " " : mail . trim ( ) ) ;
}
@Transactional ( readOnly = true )
public Employee find ( Integer id ) {
return employeeRepository . findById ( id )
. orElseThrow ( ( ) - > new BusinessException ( " 対象の社員が見つかりません。 " ) ) ;
}
@Transactional ( readOnly = true )
public Employee find ( Integer id ) {
return employeeRepository . findById ( id )
. orElseThrow ( ( ) - > new BusinessException ( " 対象の社員が見つかりません。 " ) ) ;
}
/** 編集画面の初期値(パスワードは空:管理者は変更時のみ入力) */
public EmployeeForm toForm ( Employee e ) {
EmployeeForm f = new EmployeeForm ( ) ;
f . setIdEmployee ( e . getIdEmployee ( ) ) ;
f . setNmEmployee ( e . getNmEmployee ( ) ) ;
f . setKnEmployee ( e . getKnEmployee ( ) ) ;
f . setMailAddress ( e . getMailAddress ( ) ) ;
f . setFlgAdmin ( e . getFlgAdmin ( ) ) ;
f . setFlgRetirement ( e . getFlgRetirement ( ) ) ;
return f ;
}
/** 編集画面の初期値(パスワードは空:管理者は変更時のみ入力) */
public EmployeeForm toForm ( Employee e ) {
EmployeeForm f = new EmployeeForm ( ) ;
f . setIdEmployee ( e . getIdEmployee ( ) ) ;
f . setNmEmployee ( e . getNmEmployee ( ) ) ;
f . setKnEmployee ( e . getKnEmployee ( ) ) ;
f . setMailAddress ( e . getMailAddress ( ) ) ;
f . setFlgAdmin ( e . getFlgAdmin ( ) ) ;
f . setFlgRetirement ( e . getFlgRetirement ( ) ) ;
return f ;
}
// ---------- 入力チェック ----------
// ---------- 入力チェック ----------
/** 社員登録:社員名・よみ・メール・管理者フラグ。パスワードは初期値で登録する。 */
public List < String > validateRegist ( EmployeeForm f ) {
f . trim ( ) ;
List < String > e = new ArrayList < > ( ) ;
checkBasic ( f , e ) ;
checkMail ( f , null , e ) ;
checkFlag ( f . getFlgAdmin ( ) , " 管理者フラグ " , e ) ;
return e ;
}
/** 社員登録:社員名・よみ・メール・管理者フラグ。パスワードは初期値で登録する。 */
public List < String > validateRegist ( EmployeeForm f ) {
f . trim ( ) ;
List < String > e = new ArrayList < > ( ) ;
checkBasic ( f , e ) ;
checkMail ( f , null , e ) ;
checkFlag ( f . getFlgAdmin ( ) , " 管理者フラグ " , e ) ;
return e ;
}
/** 管理者による編集:全項目。パスワードは空なら変更しない。 */
public List < String > validateUpdateByAdmin ( EmployeeForm f ) {
f . trim ( ) ;
List < String > e = new ArrayList < > ( ) ;
checkBasic ( f , e ) ;
checkMail ( f , f . getIdEmployee ( ) , e ) ;
checkFlag ( f . getFlgAdmin ( ) , " 管理者フラグ " , e ) ;
checkFlag ( f . getFlgRetirement ( ) , " 退職フラグ " , e ) ;
if ( f . getPassword ( ) . length ( ) > 256 ) e . add ( " パスワードは256文字以内で入力してください。 " ) ;
return e ;
}
/** 管理者による編集:全項目。パスワードは空なら変更しない。 */
public List < String > validateUpdateByAdmin ( EmployeeForm f ) {
f . trim ( ) ;
List < String > e = new ArrayList < > ( ) ;
checkBasic ( f , e ) ;
checkMail ( f , f . getIdEmployee ( ) , e ) ;
checkFlag ( f . getFlgAdmin ( ) , " 管理者フラグ " , e ) ;
checkFlag ( f . getFlgRetirement ( ) , " 退職フラグ " , e ) ;
if ( f . getPassword ( ) . length ( ) > 256 )
e . add ( " パスワードは256文字以内で入力してください。 " ) ;
return e ;
}
/** 一般ユーザーによる編集:パスワードのみ(必須)。 */
public List < String > validateUpdateBySelf ( EmployeeForm f ) {
f . trim ( ) ;
List < String > e = new ArrayList < > ( ) ;
if ( f . getPassword ( ) . isEmpty ( ) ) e . add ( " パスワードを入力してください。 " ) ;
else if ( f . getPassword ( ) . length ( ) > 256 ) e . add ( " パスワードは256文字以内で 入力してください。 " ) ;
return e ;
}
/** 一般ユーザーによる編集:パスワードのみ(必須)。 */
public List < String > validateUpdateBySelf ( EmployeeForm f ) {
f . trim ( ) ;
List < String > e = new ArrayList < > ( ) ;
if ( f . getPassword ( ) . isEmpty ( ) )
e . add ( " パスワードを 入力してください。 " ) ;
else if ( f . getPassword ( ) . length ( ) > 256 )
e . add ( " パスワードは256文字以内で入力してください。 " ) ;
return e ;
}
private void checkBasic ( EmployeeForm f , List < String > e ) {
if ( f . getNmEmployee ( ) . isEmpty ( ) ) e . add ( " 社員名を入力してください。 " ) ;
else if ( f . getNmEmployee ( ) . length ( ) > 50 ) e . add ( " 社員名は50文字以内で 入力してください。 " ) ;
// ※社員名よみの文字種(ひらがなのみ等)は設計で確定する。現状は文字数のみチェック
if ( f . getKnEmployee ( ) . isEmpty ( ) ) e . add ( " 社員名よみを 入力してください。 " ) ;
else if ( f . getKnEmployee ( ) . length ( ) > 100 ) e . add ( " 社員名よみは100文字以内で入力してください。 " ) ;
}
private void checkBasic ( EmployeeForm f , List < String > e ) {
if ( f . getNmEmployee ( ) . isEmpty ( ) )
e . add ( " 社員名を 入力してください。 " ) ;
else if ( f . getNmEmployee ( ) . length ( ) > 50 )
e . add ( " 社員名は50文字以内で 入力してください。 " ) ;
// ※社員名よみの文字種(ひらがなのみ等)は設計で確定する。現状は文字数のみチェック
if ( f . getKnEmployee ( ) . isEmpty ( ) )
e . add ( " 社員名よみを入力してください。 " ) ;
else if ( f . getKnEmployee ( ) . length ( ) > 100 )
e . add ( " 社員名よみは100文字以内で入力してください。 " ) ;
else if ( ! f . getKnEmployee ( ) . matches ( " ^[ \\ u3040- \\ u309F]+$ " ) )
e . add ( " 社員名よみはひらがなで入力してください " ) ;
}
private void checkMail ( EmployeeForm f , Integer selfId , List < String > e ) {
String m = f . getMailAddress ( ) ;
if ( m . isEmpty ( ) ) { e . add ( " メールアドレスを入力してください。 " ) ; return ; }
if ( m . length ( ) > 256 ) { e . add ( " メールアドレスは256文字以内で 入力してください。 " ) ; return ; }
if ( ! MAIL . matcher ( m ) . matches ( ) ) { e . add ( " メールアドレスの形式が正しくありません。 " ) ; return ; }
Optional < Employee > dup = employeeRepository . findByMailAddress ( m ) ;
if ( dup . isPresent ( ) & & ! dup . get ( ) . getIdEmployee ( ) . equals ( selfId ) ) e . add ( MSG_DUP ) ;
}
private void checkMail ( EmployeeForm f , Integer selfId , List < String > e ) {
String m = f . getMailAddress ( ) ;
if ( m . isEmpty ( ) ) {
e . add ( " メールアドレスを 入力してください。 " ) ;
return ;
}
if ( m . length ( ) > 256 ) {
e . add ( " メールアドレスは256文字以内で入力してください。 " ) ;
return ;
}
if ( ! MAIL . matcher ( m ) . matches ( ) ) {
e . add ( " メールアドレスの形式が正しくありません。 " ) ;
return ;
}
Optional < Employee > dup = employeeRepository . findByMailAddress ( m ) ;
if ( dup . isPresent ( ) & & ! dup . get ( ) . getIdEmployee ( ) . equals ( selfId ) )
e . add ( MSG_DUP ) ;
}
private static void checkFlag ( String v , String label , List < String > e ) {
if ( ! " 0 " . equals ( v ) & & ! " 1 " . equals ( v ) ) e . add ( label + " が正しくありません。 " ) ;
}
private static void checkFlag ( String v , String label , List < String > e ) {
if ( ! " 0 " . equals ( v ) & & ! " 1 " . equals ( v ) )
e . add ( label + " が正しくありません。 " ) ;
}
// ---------- 登録・更新 ----------
// ---------- 登録・更新 ----------
@Transactional
public Integer register ( EmployeeForm f , LoginUser admin ) {
raise ( validateRegist ( f ) ) ;
Employee e = new Employee ( ) ;
e . setNmEmployee ( f . getNmEmployee ( ) ) ;
e . setKnEmployee ( f . getKnEmployee ( ) ) ;
e . setMailAddress ( f . getMailAddress ( ) ) ;
e . setPassword ( Const . DEFAULT_PASSWORD ) ;
e . setFlgAdmin ( f . getFlgAdmin ( ) ) ;
e . setFlgRetirement ( Const . RETIRE_NO ) ;
e . setIdUpdate ( admin . getIdEmployee ( ) ) ;
e . setDateUpdate ( LocalDateTime . now ( ) ) ;
try {
return employeeRepository . saveAndFlush ( e ) . getIdEmployee ( ) ;
} catch ( DataIntegrityViolationException ex ) {
throw new BusinessException ( MSG_DUP ) ; // 同時登録によるUNIQUE制約違反
}
}
@Transactional
public Integer register ( EmployeeForm f , LoginUser admin ) {
raise ( validateRegist ( f ) ) ;
Employee e = new Employee ( ) ;
e . setNmEmployee ( f . getNmEmployee ( ) ) ;
e . setKnEmployee ( f . getKnEmployee ( ) ) ;
e . setMailAddress ( f . getMailAddress ( ) ) ;
e . setPassword ( Const . DEFAULT_PASSWORD ) ;
e . setFlgAdmin ( f . getFlgAdmin ( ) ) ;
e . setFlgRetirement ( Const . RETIRE_NO ) ;
e . setIdUpdate ( admin . getIdEmployee ( ) ) ;
e . setDateUpdate ( LocalDateTime . now ( ) ) ;
try {
return employeeRepository . saveAndFlush ( e ) . getIdEmployee ( ) ;
} catch ( DataIntegrityViolationException ex ) {
throw new BusinessException ( MSG_DUP ) ; // 同時登録によるUNIQUE制約違反
}
}
@Transactional
public void updateByAdmin ( EmployeeForm f , LoginUser admin ) {
raise ( validateUpdateByAdmin ( f ) ) ;
Employee e = find ( f . getIdEmployee ( ) ) ;
e . setNmEmployee ( f . getNmEmployee ( ) ) ;
e . setKnEmployee ( f . getKnEmployee ( ) ) ;
e . setMailAddress ( f . getMailAddress ( ) ) ;
if ( ! f . getPassword ( ) . isEmpty ( ) ) e . setPassword ( f . getPassword ( ) ) ;
e . setFlgAdmin ( f . getFlgAdmin ( ) ) ;
e . setFlgRetirement ( f . getFlgRetirement ( ) ) ;
e . setIdUpdate ( admin . getIdEmployee ( ) ) ;
e . setDate Update ( LocalDateTime . now ( ) ) ;
try {
employeeRepository . saveAndFlush ( e ) ;
} catch ( DataIntegrityViolationException ex ) {
throw new BusinessException ( MSG_DUP ) ;
}
}
@Transactional
public void updateByAdmin ( EmployeeForm f , LoginUser admin ) {
raise ( validateUpdateByAdmin ( f ) ) ;
Employee e = find ( f . getIdEmployee ( ) ) ;
e . setNmEmployee ( f . getNmEmployee ( ) ) ;
e . setKnEmployee ( f . getKnEmployee ( ) ) ;
e . setMailAddress ( f . getMailAddress ( ) ) ;
if ( ! f . getPassword ( ) . isEmpty ( ) )
e . setPassword ( f . getPassword ( ) ) ;
e . setFlgAdmin ( f . getFlgAdmin ( ) ) ;
e . setFlgRetirement ( f . getFlgRetirement ( ) ) ;
e . setId Update ( admin . getIdEmployee ( ) ) ;
e . setDateUpdate ( LocalDateTime . now ( ) ) ;
try {
employeeRepository . saveAndFlush ( e ) ;
} catch ( DataIntegrityViolationException ex ) {
throw new BusinessException ( MSG_DUP ) ;
}
}
/** 一般ユーザー: 自分自身( セッションの社員ID) のパスワードのみ更新する。 */
@Transactional
public void updateBySelf ( EmployeeForm f , LoginUser self ) {
raise ( validateUpdateBySelf ( f ) ) ;
Employee e = find ( self . getIdEmployee ( ) ) ;
e . setPassword ( f . getPassword ( ) ) ;
e . setIdUpdate ( self . getIdEmployee ( ) ) ;
e . setDateUpdate ( LocalDateTime . now ( ) ) ;
}
/** 一般ユーザー: 自分自身( セッションの社員ID) のパスワードのみ更新する。 */
@Transactional
public void updateBySelf ( EmployeeForm f , LoginUser self ) {
raise ( validateUpdateBySelf ( f ) ) ;
Employee e = find ( self . getIdEmployee ( ) ) ;
e . setPassword ( f . getPassword ( ) ) ;
e . setIdUpdate ( self . getIdEmployee ( ) ) ;
e . setDateUpdate ( LocalDateTime . now ( ) ) ;
}
private static void raise ( List < String > errors ) {
if ( ! errors . isEmpty ( ) ) throw new BusinessException ( String . join ( " " , errors ) ) ;
}
private static void raise ( List < String > errors ) {
if ( ! errors . isEmpty ( ) )
throw new BusinessException ( String . join ( " " , errors ) ) ;
}
}