Skip to content

[FIX] 업무·하위 업무 담당자 자격을 등록·수정에서 검사하고, 후보 라벨에 운영진 역할을 싣는다 #709

Description

@bell-person-ii

📄 설명

업무·하위 업무의 담당자 자격을 서버가 등록·수정에서 검사하지 않는다. WorkServiceImpl·SubWorkServiceImpl은 담당자를 MemberService.findAssignableMember로만 본다. 이 메서드는 탈퇴·제명만 거른다. 후보 목록(GET /v1/members/assignable?authority=)에는 권한 필터가 있는데(#101) 단건 판정에는 없다. 그래서 화면이 거른 업무 담당자도 API·MCP로는 아무나 지정된다.

상위 이슈에서 정한 기준은 아래와 같다.

대상 담당자 기준
업무 WORK_MANAGE(업무 관리) 보유자 — #101의 목록 기준 그대로
하위 업무 WORK_READ(업무·하위 업무 조회) 보유자 — 하위 업무 API가 전부 이 권한을 요구하므로, 담당자가 자기 건을 열 수 있는 사람

후보 목록 라벨도 함께 고친다. 지금 세 번째 칸은 «대표 역할, 없으면 등급»이다. 운영진 역할에 대표 표시가 없으면 등급이 찍히고, 대표 역할이 리더 역할이면 «트랙장»이 찍힌다. 응답에 표시용 역할명을 더해 운영진 역할을 먼저 싣는다.

✅ 작업 항목

  • MemberService.findAssignableMember(memberId, requiredAuthority) — 목록판(findAssignableMembers)과 같은 규칙의 단건판. 판정은 AuthorityPolicy.hasAuthority 한 곳
  • 업무 등록·수정이 WORK_MANAGE로, 하위 업무 등록·수정이 WORK_READ로 담당자를 본다. 회의 안건 승격(/promote·/promote-sub-work)은 등록 서비스를 부르므로 따라온다
  • 수정은 담당자가 바뀔 때만 자격을 본다. 같은 담당자를 다시 보내면 판정 없이 그대로 둔다(탈퇴·제명 포함 — 웹 isAssignablePick이 이미 «현재 담당자는 후보에 없어도 그대로 저장»을 전제한다)
  • 자격이 없으면 400. 이유가 «활동 회원이 아님»과 다르므로 코드를 나눈다(WORK_OWNER_NOT_ELIGIBLE · SUB_WORK_OWNER_NOT_ELIGIBLE · 코드 문자열은 기존처럼 VALIDATION_FAILED)
  • AssignableMemberResponse.displayRoleName 추가. 고르는 순서는 ① 대표 역할이 운영진 역할이면 그것 ② 운영진 역할 중 표시 순번이 가장 앞선 것 ③ 대표 역할(리더 포함) ④ null. 운영진 역할은 LeaderRole이 아닌 역할이다. representativeRoleName은 그대로 둔다(lms가 읽는다)
  • 시험: 업무·하위 업무 등록·수정의 자격 판정(없음 → 400 · 있음 → 통과 · 같은 담당자 재전송 → 통과) · 안건 승격 한 건 · displayRoleName 우선순위 · 기존 시험 픽스처의 담당자에게 권한 부여
  • domain/operation/AGENTS.md·domain/member/AGENTS.md에 규칙 한 줄

🚫 검토했으나 택하지 않은 길

후보 왜 안 되는가
역할 이름으로 가른다(리더 셋을 뺀 역할이 하나라도 있으면) WORK_READ가 없는 역할의 회원이 담당자가 되면 자기 건을 열지 못한다(403). 판정이 권한과 역할 이름 두 벌이 된다(ADR-0067)
오류 코드 OWNER_NOT_ACTIVE_MEMBER를 그대로 쓴다 «활동 회원이 아니다»와 «권한이 없다»는 고칠 길이 다르다. MCP 호출자가 메시지만 보고는 원인을 모른다
수정도 매번 자격을 본다 임기가 끝난 담당자의 완료 업무에서 총평을 쓰려면 담당자를 바꿔야 한다. 누가 맡았는지가 지워진다
representativeRoleName에 운영진 역할을 싣는다 필드 이름과 값이 어긋나고, lms 팀원 추가 시트가 같은 필드를 «대표 역할»로 읽는다
하위 업무 담당자 판정을 SubWorkOwnershipPolicy에 둔다 그 정책은 «이 건을 다룰 수 있는 사람인가»이고, 이번 것은 «지정할 수 있는 사람인가»다. 목록과 같은 자리(MemberService)에 있어야 둘이 갈리지 않는다

🔍 먼저 확인할 것

  • 담당자를 지정해 업무·하위 업무를 만드는 기존 시험(서비스·컨트롤러·MCP·알림·감사 등 20여 개 파일)의 담당자가 권한 없는 회원이면 깨진다. 픽스처에 역할을 주는 방식이 클래스마다 다르다
  • 쿼리 수를 못 박은 시험(WorkServiceImplTest 등)은 등록·수정이 아니라 조회를 센다 — 판정이 더하는 쿼리가 조회 숫자를 바꾸지 않는지 본다

🗄 배포 전 수동 DDL

없음

🙋🏻 참고 자료

Activity

  1. added 2 commits that reference this issue on Nov 11, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    fix버그 수정

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions