= 메신저

== 개요
Knox Portal에서 제공하는 메신저 관련 Rest API 를 이용한 연계 서비스 제공

=== Knox REST API 연계 서비스 신청
Knox REST API 연계 서비스 신청은 <<_knox_rest_api_연계_서비스_신청,Knox REST API 연계 서비스 신청>> 항목을 참조한다.

=== Knox Rest 메신저 연계 설정
메일, 결재 Knox Rest API 연계와 마찬가지로 연계를 위한 사전 준비가 되었다면, knox.properties 에 메신저 관련 설정이 되어 있는지 확인한다.

.knox.properties
[source,properties]
----
knox.messenger.contact-service=/messenger/contact/api/v1.0
knox.messenger.msgctx-service=/messenger/msgctx/api/v1.0
knox.messenger.message-service=/messenger/message/api/v1.0
----

=== Knox 메신저 연계 서비스
REST를 통해서 메신저와 연계하는 서비스로 주요 메서드는 KnoxMessengerService 인터페이스에 정의되어 있다.

[source, java]
----
public interface KnoxMessengerService {
	
	/**
	 * 디바이스 ID 조회 : 사용자 ID 와 맵핑되는 단말의 ID 값
	 * @return 디바이스 ID
	 */
	String getDeviceId();

	/**
	 * 메시지 암호화 키 조회 : 메시지를 암호화하기 위한 키 값
	 * @param deviceId 디바이스 ID
	 * @return 메시지 암호화 키
	 */
	String getKey(String deviceId);

	/**
	 * Knox Potal login ID를 이용하여 Knox Messenger 수신자들을 조회한다.
	 * @param deviceId 디바이스 ID
	 * @param singleIds 수신자 Knox ID 리스트
	 * @return Knox Messenger 수신자 ID 리스트
	 */
	List<String> getUserIds(String deviceId, List<String> singleIds);

	/**
	 * 공지 메시지를 발신할 대화방이 없는 경우 신규 대화방 생성을 요청한다.
	 * @param deviceId 디바이스 ID
	 * @param key 암호화 키
	 * @param userIds Knox Messenger 수신자 ID 리스트
	 * @return 대화방 생성 요청 응답 결과
	 */
	Map<String, Object> createChatroom(String deviceId, String key, List<String> userIds);

	/**
	 * Message 서버 API 에서 필요한 암호화된 바디를 만들기 위한 function
	 * @param key - msgCtx 를 통해 전달받은 key 값
	 * @param body - 암호화 해야 될 String
	 * @return 암호화된 String
	 */
	String encrypt(String key, String body);
	
	/**
	 * Response 로 전달된 암호화 body 를 복호화 하기 위한 function <br/>
	 * 암호화의 역순으로 Base64 복호화 -> AES256 복호화
	 * @param body - 암호화 되어 있는 body
	 * @return 복호화된 response String
	 */
	String decrypt(String body);

	/**
	 * 신규 생성한 대화방 또는 기존에 사용중인 대화방에 공지 메시지를 발송한다.
	 * @param deviceId 디바이스 ID
	 * @param key 암호화 키
	 * @param chatroomId 생성된 대화방 ID
	 * @param chatMsg 메시지 내용
	 * @return 메시지 발신 요청 응답 결과
	 */
	Map<String, Object> chat(String deviceId, String key, String chatroomId, String chatMsg);
}
----

자세한 API 스펙은 Swagger API 문서의 knox-messenger-controller 항목을 참고한다.
