<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="cokr.xit.base.syslog.dao.LoggingMapper">

<resultMap id="logRow" type="cokr.xit.base.syslog.ServiceLog">
	<result property="id"           column="LOG_ID"/>    <!-- 로그 ID -->
	<result property="type"         column="LOG_TYPE"/>  <!-- 로그 유형 -->
	<result property="url"          column="URL"/>       <!-- URL -->
	<result property="className"    column="CLS_NM"/>    <!-- 클래스 이름 -->
	<result property="methodName"   column="MTD_NM"/>    <!-- 메소드 이름 -->
	<result property="fileName"     column="FILE_NM"/>   <!-- 파일 이름 -->
	<result property="dataCount"    column="DATA_CNT"/>  <!-- 데이터 수 -->
	<result property="fieldNames"   column="DATA_NM"/>   <!-- 데이터 이름 -->
	<result property="personalInfo" column="PSNL_INFO"/> <!-- 개인 정보 -->
	<result property="userId"       column="USER_ID"/>   <!-- 사용자 ID -->
	<result property="ipAddress"    column="IP_ADDR"/>   <!-- 등록 일시 -->
</resultMap>

<select id="getLogs" parameterType="map" resultType="dataobject">
/* 시스템 로그 조회(loggingMapper.getLogs) */
<include refid="utility.paging-prefix" />
SELECT LOG_ID
     , A.LOG_TYPE
     , CASE MTD_NM WHEN 'onLogin' THEN '로그인'
                   WHEN 'onLogout' THEN '로그아웃'
                   WHEN 'onFailure' THEN '로그인 실패'
                   ELSE LOG_TYPE_NM
       END LOG_TYPE_NM
     , URL
     , CLS_NM
     , MTD_NM
     , NULL DSCRP
     , FILE_NM
     , DATA_CNT
     , DATA_NM
     , PSNL_INFO
     , A.USER_ID
     , UPPER(USER_ACNT) AS USER_ACNT
     , USER_NM
     , NSTT_CD
     , IP_ADDR
     , A.REG_DT
  FROM TB_SYS_LOG A LEFT OUTER JOIN
       TB_USER B ON A.USER_ID = B.USER_ID,
      (SELECT 'log-inout' LOG_TYPE, '로그인아웃' LOG_TYPE_NM FROM DUAL UNION
       SELECT 'download' LOG_TYPE, '다운로드' LOG_TYPE_NM FROM DUAL UNION
       SELECT 'service' LOG_TYPE, '서비스' LOG_TYPE_NM FROM DUAL UNION
       SELECT 'web' LOG_TYPE, '웹' LOG_TYPE_NM FROM DUAL
      ) C
<where>
<if test="fromDate != null">   AND LOG_ID >= CONCAT(#{fromDate}, LPAD(0, 16, '0'))</if>
<if test="toDate != null">   AND LOG_ID &lt;= CONCAT(#{toDate}, LPAD(9, 16, '9'))</if>
<if test="logTypes != null">   AND A.LOG_TYPE IN (<foreach collection="logTypes" item="logType" separator=",">#{logType}</foreach>)</if>
<if test="userIDs != null">   AND USER_ID IN (<foreach collection="userIDs" item="userID" separator=",">#{userID}</foreach>)</if>
<if test="userAccounts != null">   AND UPPER(USER_ACNT) IN (<foreach collection="userAccounts" item="userAccount" separator=",">UPPER(#{userAccount})</foreach>)</if>
<if test="userName != null">   AND USER_NM LIKE CONCAT('%', #{userName}, '%')</if>
   AND A.LOG_TYPE = C.LOG_TYPE
</where>
<include refid="utility.orderBy" />
<include refid="utility.paging-suffix" />
</select>

<insert id="insertLog" parameterType="cokr.xit.base.syslog.ServiceLog">/* 시스템 로그 등록(loggingMapper.insertLog) */
INSERT INTO TB_SYS_LOG (
       LOG_ID    <!-- 로그 ID -->
     , LOG_TYPE  <!-- 로그 유형 -->
     , URL       <!-- URL -->
     , CLS_NM    <!-- 클래스 이름 -->
     , MTD_NM    <!-- 메소드 이름 -->
     , FILE_NM   <!-- 파일 이름 -->
     , DATA_CNT  <!-- 데이터 수 -->
     , DATA_NM   <!-- 데이터 이름 -->
     , PSNL_INFO <!-- 개인 정보 -->
     , USER_ID	 <!-- 사용자 ID -->
     , IP_ADDR	 <!-- IP 주소 -->
     , REG_DT	 <!-- 등록 일시 -->
) VALUES (
       CONCAT(<include refid="utility.today" />, LPAD(NEXTVAL(SQ_SYS_LOG), 16, '0')) <!-- 로그 ID -->
     , #{type}         <!-- 로그 유형 -->
     , #{url}          <!-- URL -->
     , #{className}    <!-- 클래스 이름 -->
     , #{methodName}   <!-- 메소드 이름 -->
     , #{fileName}     <!-- 파일 이름 -->
     , #{dataCount}    <!-- 데이터 수 -->
     , #{fieldNames}   <!-- 데이터 이름 -->
     , #{personalInfo} <!-- 개인 정보 -->
     , #{userId}       <!-- 사용자 ID -->
     , #{ipAddress}    <!-- IP 주소 -->
     ,<include refid="utility.now" />
)
</insert>

</mapper>