package kr.itn.itnhub.memo; import kr.itn.itnhub.org.OrgNotFoundException; import kr.itn.itnhub.org.OrganizationMapper; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import java.util.List; /** * 기관관리 상세의 업무메모 탭이 쓰는 서비스. 전화 통화 등 담당자와의 연락 내용을 * 기관별로 남겨두는 단순 CRUD이며, Mattermost와는 무관한 순수 DB 기능이다. */ @Service public class WorkMemoService { private final WorkMemoMapper memoMapper; private final OrganizationMapper orgMapper; public WorkMemoService(WorkMemoMapper memoMapper, OrganizationMapper orgMapper) { this.memoMapper = memoMapper; this.orgMapper = orgMapper; } public List list(Long orgId) { requireOrg(orgId); return memoMapper.findByOrg(orgId); } /** * 메모를 남긴다. 작성자는 화면에서 고르지 않고 로그인한 사용자를 그대로 기록한다 * (요청자 확정: "담당자 입력란은 필요없고 로그인한 사람이 자동으로 표출되면 된다"). */ @Transactional public WorkMemo create(Long orgId, MemoRequest request, String author) { requireOrg(orgId); WorkMemo memo = new WorkMemo(); memo.setOrgId(orgId); memo.setContactName(author); memo.setBody(request.body()); memoMapper.insert(memo); // 방금 넣은 행이 created_at 기준 가장 최신이므로 목록의 첫 행이 곧 이 메모다. return memoMapper.findByOrg(orgId).get(0); } /** 본문만 고친다. 작성자·작성시각은 처음 값을 유지한다. */ @Transactional public WorkMemo update(Long orgId, Long memoId, MemoRequest request) { requireOrg(orgId); int updated = memoMapper.updateBody(orgId, memoId, request.body()); if (updated == 0) { throw new OrgNotFoundException("메모를 찾을 수 없습니다: " + memoId); } return memoMapper.findByOrg(orgId).stream() .filter(memo -> memo.getId().equals(memoId)) .findFirst() .orElseThrow(() -> new OrgNotFoundException("메모를 찾을 수 없습니다: " + memoId)); } @Transactional public void delete(Long orgId, Long memoId) { requireOrg(orgId); int deleted = memoMapper.delete(orgId, memoId); if (deleted == 0) { throw new OrgNotFoundException("메모를 찾을 수 없습니다: " + memoId); } } private void requireOrg(Long orgId) { if (orgMapper.findById(orgId) == null) { throw new OrgNotFoundException("기관을 찾을 수 없습니다: " + orgId); } } }