File name
Commit message
Commit date
File name
Commit message
Commit date
File name
Commit message
Commit date
File name
Commit message
Commit date
File name
Commit message
Commit date
package kr.itn.itnhub.feed;
import kr.itn.itnhub.mattermost.MattermostClient;
import kr.itn.itnhub.org.Organization;
import kr.itn.itnhub.org.OrganizationMapper;
import kr.itn.itnhub.org.OrgNotFoundException;
import org.springframework.stereotype.Service;
import java.util.List;
/**
* 기관관리 상세 화면의 게시물/자료 탭이 쓰는 조회 전용 서비스.
* Mattermost를 매번 실시간으로 읽어오는 뷰이므로 {@code @Transactional}을 걸지 않는다 -
* DB 조회는 채널 id를 얻기 위한 짧은 findById 한 번뿐이고, 외부 API 호출을 트랜잭션
* 안에 묶어둘 이유가 없다.
*/
@Service
public class ChannelFeedService {
/** 게시물 탭 한 번에 보여줄 최근 게시글 수. */
private static final int RECENT_POSTS_PAGE_SIZE = 60;
private final OrganizationMapper orgMapper;
private final MattermostClient mattermost;
public ChannelFeedService(OrganizationMapper orgMapper, MattermostClient mattermost) {
this.orgMapper = orgMapper;
this.mattermost = mattermost;
}
public List<PostView> posts(Long orgId, String channel) {
String channelId = resolveChannelId(orgId, channel);
return mattermost.getRecentPosts(channelId, RECENT_POSTS_PAGE_SIZE);
}
public List<FileView> files(Long orgId, String channel) {
String channelId = resolveChannelId(orgId, channel);
return mattermost.collectChannelFiles(channelId);
}
private String resolveChannelId(Long orgId, String channel) {
Organization org = orgMapper.findById(orgId);
if (org == null) {
throw new OrgNotFoundException("기관을 찾을 수 없습니다: " + orgId);
}
String channelId = switch (channel) {
case "mj" -> org.getChannelIdMj();
case "law" -> org.getChannelIdLaw();
default -> throw new ChannelNotReadyException("알 수 없는 채널 구분입니다: " + channel);
};
if (channelId == null || channelId.isBlank()) {
throw new ChannelNotReadyException("해당 채널이 아직 생성되지 않았습니다.");
}
return channelId;
}
}