Skip to content
Merged
Show file tree
Hide file tree
Changes from 36 commits
Commits
Show all changes
47 commits
Select commit Hold shift + click to select a range
88d9aa0
feat: Authority 변경 API 추가
rlajm1203 Aug 23, 2025
a61cef2
feat: findRole 메소드 추가
rlajm1203 Aug 23, 2025
a9fe88a
feat: findByIdAndRole 메소드 추가
rlajm1203 Aug 23, 2025
ceb4af5
feat: 사용자의 권한을 변경하는 로직 추가
rlajm1203 Aug 23, 2025
d724fec
feat: 사용자의 권한을 찾을 수 없을 경우의 예외 정의
rlajm1203 Aug 23, 2025
7b97540
feat: isExist 메소드 추가
rlajm1203 Aug 23, 2025
20cbf12
feat: AuthorityUpdateRequest 정의
rlajm1203 Aug 23, 2025
85060c2
feat: authority 수정 api 구현
rlajm1203 Aug 23, 2025
51b4b2a
refactor: RoleType 추가
rlajm1203 Aug 23, 2025
39b067b
refactor: 회원가입 시에 생성하는, 기본 Authority 생성 추가
rlajm1203 Aug 23, 2025
7816361
refactor: 잘못된 Type 수정
rlajm1203 Aug 23, 2025
9fcb02c
feat: Authority 리스트 조회 API 추가
rlajm1203 Aug 23, 2025
a2831ce
feat: 어노테이션 제거, 생성자 추가
rlajm1203 Aug 23, 2025
e68879c
delete: Authority 삭제
rlajm1203 Aug 23, 2025
498ac05
refactor: Authority 삭제
rlajm1203 Aug 24, 2025
4064b26
feat: Department Enum 정의
rlajm1203 Aug 24, 2025
3c82782
feat: Department 수정 Request, Response 정의
rlajm1203 Aug 24, 2025
2b519ba
feat: DepartmentUsecase, DepartmentService 구현
rlajm1203 Aug 24, 2025
846efdc
faet: MemberModel에 Department 추가
rlajm1203 Aug 24, 2025
fb52fd6
feat: Department 수정 API 구현 및 시큐리티 설정 추가
rlajm1203 Aug 24, 2025
abe3989
feat: koName 추가
rlajm1203 Aug 24, 2025
f4087e1
feat: enName 으로 필드명 수정
rlajm1203 Aug 24, 2025
d4b516f
refactor: DepartmentResponse에 koName, enName 추가
rlajm1203 Aug 24, 2025
753d37e
feat: NotFoundDepartmentException 정의
rlajm1203 Aug 24, 2025
0dba966
refactor: NotFoundDepartmentException 을 던지도록 수정
rlajm1203 Aug 24, 2025
30a9cc3
refactor: Department 조회 메소드 수정
rlajm1203 Aug 24, 2025
52514e4
refactor: save 호출
rlajm1203 Aug 24, 2025
75495fd
refactor: 활동 상태 조회 응답에 department 추가
rlajm1203 Aug 24, 2025
850b9c4
style: spotlessApply
rlajm1203 Aug 24, 2025
6fbc5da
feat: swagger 명세 추가
rlajm1203 Aug 24, 2025
be1efc1
refactor: 부서 리스트 조회는, USER 권한으로도 가능하게 수정
rlajm1203 Aug 24, 2025
d875f34
delete: 필요 없는 dto 삭제
rlajm1203 Aug 24, 2025
2e5c68d
refactor: 회원 부서 수정 API QueryString 으로 수정
rlajm1203 Aug 24, 2025
975f973
style: spotlessApply
rlajm1203 Aug 24, 2025
606abd3
refactor: 대소문자 구분하지 않도록 수정
rlajm1203 Aug 24, 2025
965e95b
style: spotlessApply
rlajm1203 Aug 24, 2025
243f476
refactor: securityFilterChain 수정
rlajm1203 Aug 24, 2025
1e1b6b7
refactor: 메소드 이름 변경
rlajm1203 Aug 24, 2025
36d72dd
refactor: 트랜잭션 추가
rlajm1203 Aug 24, 2025
0833a8b
refactor: find 메소드 유효성 검증 로직 추가
rlajm1203 Aug 24, 2025
6791573
refactor: getMemberId() 메소드 호출로 변경
rlajm1203 Aug 24, 2025
cac1d13
refactor: 테이블 유니크 제약조건 추가
rlajm1203 Aug 24, 2025
e6f91ea
refactor: 부서 응답 lowercase 로 수정
rlajm1203 Aug 24, 2025
388cec3
style: spotlessApply
rlajm1203 Aug 24, 2025
c084229
refactor: equalsIgnoreCase 로 변경
rlajm1203 Aug 24, 2025
ad1e714
style: spotlessApply
rlajm1203 Aug 24, 2025
d21e24c
[FEAT] 캘린더 기능을 추가합니다. (#281)
rlajm1203 Sep 21, 2025
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
package com.blackcompany.eeos.auth.application.exception;

import com.blackcompany.eeos.common.exception.BusinessException;
import org.springframework.http.HttpStatus;

public class NotFoundAuthorityException extends BusinessException {

private static final String FAIL_CODE = "4013";

public NotFoundAuthorityException() {
super(FAIL_CODE, HttpStatus.NOT_FOUND);
}

@Override
public String getMessage() {
return "회원의 권한을 찾을 수 없습니다.";
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -3,16 +3,24 @@
import com.blackcompany.eeos.common.support.AbstractModel;
import lombok.Builder;
import lombok.Getter;
import lombok.RequiredArgsConstructor;

@RequiredArgsConstructor
@Getter
@Builder
public class AuthorityModel implements AbstractModel {

private final Long id;
private final Long memberId;
private final Role role;
private Role role;

public AuthorityModel(Long id, Long memberId, Role role) {
this.id = id;
this.memberId = memberId;
this.role = role;
}

public void updateRole(Role role) {
this.role = role;
}

public static AuthorityModel create(Long memberId, Role role) {
return AuthorityModel.builder().role(role).memberId(memberId).build();
Expand Down
Original file line number Diff line number Diff line change
@@ -1,15 +1,41 @@
package com.blackcompany.eeos.auth.application.model;

import java.util.Arrays;
import java.util.List;
import lombok.Getter;

@Getter
public enum Role {
ROLE_ADMIN("ADMIN"),
ROLE_USER("USER");
ROLE_ADMIN(1L, "ADMIN"),
ROLE_USER(2L, "USER");

private String role;
private final Long id;
private final String role; // 시스템 내에 존재하는 role을 찾을 때, 이 문자열을 기준으로 찾습니다.

Role(String role) {
Role(Long id, String role) {
this.id = id;
this.role = role;
}

public static boolean isExist(String role) {
return Arrays.stream(Role.values()).anyMatch(obj -> obj.getRole().equals(role.toUpperCase()));
}

public static Role findRole(String role) {
return Arrays.stream(Role.values())
.filter(obj -> obj.getRole().equals(role.toUpperCase()))
.findFirst()
.orElseThrow(IllegalArgumentException::new);
}

public static Role findById(Long id) {
return Arrays.stream(Role.values())
.filter(obj -> obj.getId().equals(id))
.findFirst()
.orElseThrow(IllegalArgumentException::new);
}

public static List<Role> getAllRoles() {
return Arrays.asList(Role.values());
}
}
Original file line number Diff line number Diff line change
@@ -1,11 +1,14 @@
package com.blackcompany.eeos.auth.application.repository;

import com.blackcompany.eeos.auth.application.model.AuthorityModel;
import com.blackcompany.eeos.auth.application.model.Role;
import java.util.Set;

public interface AuthorityRepository {

Set<AuthorityModel> findByMemberId(Long memberId);

AuthorityModel findByIdAndRole(Long memberId, Role role);

Long save(AuthorityModel authorityModel);
}
Original file line number Diff line number Diff line change
Expand Up @@ -59,7 +59,7 @@ private OauthMemberModel signUpMember(final OauthMemberModel model) {
.build();
MemberModel savedMember = memberRepository.save(member);

authorityRepository.save(AuthorityModel.create(savedMember.getMemberId(), Role.ROLE_USER));
createDefaultRole(savedMember.getMemberId());

OauthMemberModel updatedModel = model.toBuilder().memberId(savedMember.getId()).build();
return oAuthMemberRepository.save(updatedModel);
Expand All @@ -68,4 +68,8 @@ private OauthMemberModel signUpMember(final OauthMemberModel model) {
private void checkPassword(String password, String encryptedPassword) {
if (!encryptHelper.isMatch(password, encryptedPassword)) throw new NotFoundAccountException();
}

private void createDefaultRole(Long memberId) {
authorityRepository.save(AuthorityModel.create(memberId, Role.ROLE_USER));
}
}
Original file line number Diff line number Diff line change
@@ -1,5 +1,7 @@
package com.blackcompany.eeos.auth.persistence.authority;

import com.blackcompany.eeos.auth.application.model.Role;
import java.util.Optional;
import java.util.Set;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.data.jpa.repository.Query;
Expand All @@ -9,4 +11,8 @@ public interface AuthorityJpaRepository extends JpaRepository<AuthorityEntity, L

@Query("SELECT DISTINCT a FROM AuthorityEntity a WHERE a.memberId = :memberId")
Set<AuthorityEntity> findByMemberId(@Param("memberId") Long memberId);

@Query("SELECT a FROM AuthorityEntity a WHERE a.memberId=:memberId AND a.role=:role")
Optional<AuthorityEntity> findByIdAndRole(
@Param("memberId") Long memberId, @Param("role") Role role);
}
Original file line number Diff line number Diff line change
@@ -1,6 +1,8 @@
package com.blackcompany.eeos.auth.persistence.authority;

import com.blackcompany.eeos.auth.application.exception.NotFoundAuthorityException;
import com.blackcompany.eeos.auth.application.model.AuthorityModel;
import com.blackcompany.eeos.auth.application.model.Role;
import com.blackcompany.eeos.auth.application.repository.AuthorityRepository;
import java.util.Set;
import java.util.stream.Collectors;
Expand All @@ -20,6 +22,14 @@ public Set<AuthorityModel> findByMemberId(Long memberId) {
.collect(Collectors.toSet());
}

@Override
public AuthorityModel findByIdAndRole(Long memberId, Role role) {
return repository
.findByIdAndRole(memberId, role)
.map(this::toModel)
.orElseThrow(NotFoundAuthorityException::new);
}

@Override
public Long save(AuthorityModel authorityModel) {
return repository.save(toEntity(authorityModel)).getId();
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -104,6 +104,7 @@ SecurityFilterChain authenticated(HttpSecurity httpSecurity) throws Exception {
requests
.requestMatchers(HttpMethod.PUT, "/api/members/activeStatus/{memberId}")
.hasAnyRole(ADMIN);
requests.requestMatchers(HttpMethod.PUT, "/api/members/department").hasAnyRole(ADMIN);
requests.anyRequest().authenticated();
});

Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
package com.blackcompany.eeos.member.application.dto;

import com.blackcompany.eeos.common.support.dto.AbstractResponseDto;
import com.blackcompany.eeos.member.application.model.Department;

public record DepartmentResponse(Long departmentId, String enName, String koName)
implements AbstractResponseDto {

public static DepartmentResponse from(Department department) {
return new DepartmentResponse(
department.getId(), department.getEnName(), department.getKoName());
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -14,4 +14,5 @@ public class QueryMemberResponse implements AbstractResponseDto {
private Long memberId;
private String name;
private String activeStatus;
private String department;
}
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,7 @@ public QueryMemberResponse from(MemberModel source) {
.memberId(source.getId())
.name(source.getName())
.activeStatus(source.getActiveStatus())
.department(source.getDepartment().getKoName())
.build();
}

Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
package com.blackcompany.eeos.member.application.exception;

import com.blackcompany.eeos.common.exception.BusinessException;
import org.springframework.http.HttpStatus;

public class NotFoundDepartmentException extends BusinessException {

private static final String FAIL_CODE = "3003";

public NotFoundDepartmentException() {
super(FAIL_CODE, HttpStatus.NOT_FOUND);
}

@Override
public String getMessage() {
return "해당 부서를 찾을 수 없습니다.";
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,52 @@
package com.blackcompany.eeos.member.application.model;

import com.blackcompany.eeos.member.application.exception.NotFoundDepartmentException;
import java.util.Arrays;
import java.util.List;
import lombok.Getter;

@Getter
public enum Department {
PRESIDENT(101L, "PRESIDENT", "회장단"),
MARKETING(102L, "MARKETING", "홍보부"),
MANAGEMENT(103L, "MANAGEMENT", "관리부"),
EVENT(104L, "EVENT", "행사부"),
NONE(105L, "NONE", "해당없음");

private final Long id;
private final String enName;
private final String koName;

Department(Long id, String enName, String koName) {
this.id = id;
this.enName = enName;
this.koName = koName;
}

public static boolean isExistById(Long id) {
return Arrays.stream(Department.values()).anyMatch(obj -> obj.getId().equals(id));
}

public static boolean isExistByEnName(String enName) {
return Arrays.stream(Department.values())
.anyMatch(obj -> obj.getEnName().equals(enName.toUpperCase()));
}

public static Department findDepartmentByEnName(String enName) {
return Arrays.stream(Department.values())
.filter(obj -> obj.getEnName().equals(enName.toUpperCase()))
.findFirst()
.orElseThrow(NotFoundDepartmentException::new);
}

public static Department findById(Long id) {
return Arrays.stream(Department.values())
.filter(obj -> obj.getId().equals(id))
.findFirst()
.orElseThrow(NotFoundDepartmentException::new);
}

public static List<Department> getAllDepartments() {
return Arrays.asList(Department.values());
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -22,6 +22,7 @@ public class MemberModel implements AbstractModel, MemberIdModel {
@Builder.Default private ActiveStatus activeStatus = ActiveStatus.AM;
@Builder.Default private boolean isAdmin = false;
private OauthServerType oauthServerType;
@Builder.Default private Department department = Department.NONE;

public MemberModel updateActiveStatus(String status) {
ActiveStatus requestStatus = ActiveStatus.find(status);
Expand All @@ -30,6 +31,11 @@ public MemberModel updateActiveStatus(String status) {
return this;
}

public MemberModel updateDepartment(Department department) {
this.department = department;
return this;
}

// TODO : Equals 재정의로 고민
public boolean validateSame(Long memberId) {
return id.equals(memberId);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,7 @@ public MemberModel from(MemberEntity source) {
.activeStatus(source.getActiveStatus())
.isAdmin(source.isAdmin())
.oauthServerType(source.getOauthServerType())
.department(source.getDepartment())
.build();
}

Expand All @@ -29,6 +30,7 @@ public MemberEntity toEntity(MemberModel source) {
.isAdmin(source.isAdmin())
.activeStatus(ActiveStatus.find(source.getActiveStatus()))
.oauthServerType(source.getOauthServerType())
.department(source.getDepartment())
.build();
}

Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,36 @@
package com.blackcompany.eeos.member.application.service;

import com.blackcompany.eeos.member.application.model.Department;
import com.blackcompany.eeos.member.application.model.MemberModel;
import com.blackcompany.eeos.member.application.repository.MemberRepository;
import com.blackcompany.eeos.member.application.usecase.DepartmentUsecase;
import java.util.List;
import lombok.RequiredArgsConstructor;
import org.springframework.stereotype.Service;

@Service
@RequiredArgsConstructor
public class DepartmentService implements DepartmentUsecase {

private final MemberRepository memberRepository;

@Override
public void changeDepartment(Long memberId, String to) {
MemberModel member = memberRepository.findById(memberId);
Department depart = Department.findDepartmentByEnName(to);
member.updateDepartment(depart);
memberRepository.save(member);
}

public List<Department> getAllDepartments() {
return Department.getAllDepartments();
}

public Department getDepartment(String name) {
return Department.findDepartmentByEnName(name);
}

public Department getDepartmentById(Long id) {
return Department.findById(id);
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
package com.blackcompany.eeos.member.application.usecase;

import com.blackcompany.eeos.member.application.model.Department;
import java.util.List;

public interface DepartmentUsecase {

void changeDepartment(Long memberId, String to);

List<Department> getAllDepartments();
}
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@
import com.blackcompany.eeos.auth.application.domain.OauthServerType;
import com.blackcompany.eeos.common.persistence.BaseEntity;
import com.blackcompany.eeos.member.application.model.ActiveStatus;
import com.blackcompany.eeos.member.application.model.Department;
import jakarta.persistence.Column;
import jakarta.persistence.Entity;
import jakarta.persistence.EnumType;
Expand Down Expand Up @@ -56,4 +57,9 @@ public class MemberEntity extends BaseEntity {
@Column(name = ENTITY_PREFIX + "_is_admin", nullable = false)
@Builder.Default
private boolean isAdmin = false; // TODO : 여러 ROEL 커버 가능하도록

@Column(name = ENTITY_PREFIX + "_department", nullable = false)
@Enumerated(EnumType.STRING)
@Builder.Default
private Department department = Department.NONE;
}
Loading