/** * admin/api */ var mplus_admin_api = function() { // 상속 mplus_admin.call(this); var self = this; // 변수 var $wrapper = $('.main-wrapper #wrapper'), $txtId = $('#txtId'), $txtName = $('#txtName'), $spanCatPathName = $('#spanCatPathName'), $txtApiUrl = $('#txtApiUrl'), $sltApiType = $('#sltApiType'), $btnApiTypeHelp = $('#btnApiTypeHelp'), $sltHttpMethodType = $('#sltHttpMethodType'), $sltResultType = $('#sltResultType'), $sltDataSourceName = $('#sltDataSourceName'), $txtTargetUrlAddr = $('#txtTargetUrlAddr'), $txtQueryMsg = $('#txtQueryMsg'), $txtProcedure = $('#txtProcedure'), $btnCreateNode = $('#btnCreateNode'), $btnRemoveNode = $('#btnRemoveNode'), $btnSaveNode = $('#btnSaveNode'), $btnCacheInit = $('#btnCacheInit'), $btnDeselectNode = $('#btnDeselectNode'), $btnHeaderInfo = $('#btnHeaderInfo'), $btnNewItemHeader = $('#btnNewItem_header'), $btnConfirmHeader = $('#btnConfirmItem_header'), $btnParameter = $('#btnParameter'), $btnNewItemParam = $('#btnNewItem_param'), $btnConfirmParam = $('#btnConfirmItem_param'), $txtResSampleCl = $('#txtResSampleCl'), $txtApiDesc = $('#txtApiDesc'), $spanCreateDt = $('#spanCreateDt'), $spanCreateId = $('#spanCreateId'), $spanUpdateDt = $('#spanUpdateDt'), $spanUpdateId = $('#spanUpdateId'), $crudServiceBaseUrl = contextPath + '/admin/api'; this.treeView = null; /** * 초기화 */ this.init = function() { initTree(); // 설명 글자수 이벤트 - core에 선언 self.checkDescBytes($txtApiDesc, 'txtApiDesc'); addEvent(); }; /** * 이벤트 등록 */ var addEvent = function() { // api type 변경 이벤트 $sltApiType.on('change', function(e) { /* * var treeView = self.treeView; var node = treeView.select(), item = * treeView.dataItem(node), observer = new kendo.observable( item ); */ enableApiTypeRow(this.value); httpMethodType($sltHttpMethodType.val(), e); }); // http method 필드 변경 이벤트 $sltHttpMethodType.on('change', function(e) { httpMethodType(this.value, e); }); // 아이템 추가 $btnCreateNode.on('click', function(e) { addItem(e); }); // 아이템 삭제 $btnRemoveNode.on('click', function(e) { removeItem(e); }); // 아이템 저장 $btnSaveNode.on('click', function(e) { saveItem(e); }); // 아이템 갱신 (to 모바일 서버) $btnCacheInit.on('click', function(e) { reloadItem(e); }); $('#btnTest, #btnTest_inModal').on('click', function(e) { testApi(e); }); // 아이템 선택 해제 $btnDeselectNode.on('click', function(e) { deselectItem(e); }); $btnHeaderInfo.on('click', function(e) { editTableHeaderInfo(e); }); $btnNewItemHeader.on('click', function(e) { newTableHeader(e); }); $btnConfirmHeader.on('click', function(e) { confirmTableHeader(e); }); $btnParameter.on('click', function(e) { editTableParam(e); }); $btnNewItemParam.on('click', function(e) { newTableParam(e); }); $btnConfirmParam.on('click', function(e) { confirmTableParam(e); }); }; /** * http method 필드 변경 이벤트 */ var httpMethodType = function(value, e) { var node = $('#apiTreeView').fancytree('getActiveNode'), item = $('#apiTreeView').fancytree('getActiveNode').data; var apiType = $('#sltApiType').val(); if (apiType === 'SQL') { if (value !== 'GET' && value !== '') { // POST,PUT,DELETE 라면 INT만 $('#sltResultType option').hide(); $('#sltResultType option[value=INT]').show(); $('#sltResultType').val('INT'); } else { // GET 이면 MAP, LIST만 $('#sltResultType option').hide(); $('#sltResultType option[value=MAP]').show(); $('#sltResultType option[value=LIST]').show(); $('#sltResultType').val('MAP'); } } else { // 웹서비스, procedure면 전부다 $('#sltResultType option').show(); $('#sltResultType').val('MAP'); } }; /** * 아이템 추가 */ var addItem = function(e) { var node = $('#apiTreeView').fancytree('getActiveNode'), // 부모노드 추출에 사용될 예정 selectNode = $('#apiTreeView').fancytree('getActiveNode'); if(node==undefined){ alert('카테고리를 선택해주세요.'); return false; }; if(node.expanded==undefined){ $('#apiTreeView').fancytree('getActiveNode').setExpanded(); }; var item = $('#apiTreeView').fancytree('getActiveNode').data; if (addedNodeArr.length > 0) { alert('저장하지 않은 아이템이 있습니다'); return false; }; if (node.length === 0) { alert('아이템을 선택하세요'); return false; } if (item.nodeType === 'API') { alert('카테고리를 선택하여 추가하세요.'); return false; } var cat_seq = item.catSeq; var cat_name = item.catName; var arr = new Array(); arr.push(item.pathName); while (node.parent) { node = node.parent.data; if(node.pathName!=null) arr.push(node.pathName); } var cat_path_name = '/'; for (var n = arr.length; n > 0; n--) { cat_path_name += (arr[n - 1] + '/'); } var nodeData = null, defData = { apiSeq : '', apiName : 'New api', nodeType : 'API', addedNode : true, apiType : $('#sltApiType').val(), catSeq : cat_seq, catName : cat_name, catPathName : cat_path_name, dataSourceName : '', apiDesc : '', httpMethodType : '', targetName : '', queryMsg : '', resultType : '', reqUrlAddr : '', reqUrlName : '', targetUrlAddr : '', useYn : 1, reqParams : [], wsUrl : '', wsHeaders : [], resSampleCl : '' }; selectNode.addChildren({ title : defData.apiName, key : defData.id, folder : false, lazy : false, data : defData }); addedNodeArr.push(defData); $('#apiTreeView').fancytree('getActiveNode').children[$('#apiTreeView') .fancytree('getActiveNode').children.length - 1].li.click(); $('#txtName').focus(); }; /** * 아이템 삭제 */ var removeItem = function(e) { var node = $('#apiTreeView').fancytree('getActiveNode'), item = $('#apiTreeView').fancytree('getActiveNode').data; if (node.length === 0) { alert('선택한 아이템이 없습니다'); return false; } if (item.nodeType === 'CATEGORY') { alert('카테고리는 카테고리 관리에서 삭제가능합니다.'); return false; } if (item.addedNode) { node.remove(); addedNodeArr = []; $('#apiMsg').css('display', 'block'); $('#apiContent').css('display', 'none'); return false; } if (item.childCount > 0) { alert('하위 카테고리가 존재하여 삭제할 수 없습니다'); return false; } if (item.apiCount > 0) { alert('하위 API가 존재하여 삭제할 수 없습니다'); return false; } if (!confirm('삭제 하시겠습니까?')) { return false; } var opt = { url : $crudServiceBaseUrl + '/remove.json', data : self.util.stringifyJson({ apiSeq : item.id }), type : 'POST' }; var success = function(data) { alert('삭제 되었습니다.'); $('#apiTreeView').fancytree('getActiveNode').remove(); /*location.reload(true);*/ }; var error = function(xhr, d, t) { console.log(xhr); alert(xhr.responseText); }; self.ajaxAdmin(opt, success, error); }; /** * 아이템 저장 */ var saveItem = function(e) { var treeView = self.treeView; var item = $('#apiTreeView').fancytree('getActiveNode'); if (item.length === 0 || item.data.nodeType === 'CATEGORY') { alert('선택한 아이템이 없습니다'); return false; }; var reqParamsArr = paramList; for (var i = 0; i < reqParamsArr.length; i++) { var it = reqParamsArr[i], paramName = it.paramName; reqParamsArr[i].paramName = paramName.replace(/\s/gi, ''); reqParamsArr[i].apiSeq = item.data.apiSeq; }; var reqHeaderArr = headerList; for (var i = 0; i < reqHeaderArr.length; i++) { var it = reqHeaderArr[i]; reqHeaderArr[i].apiSeq = item.data.apiSeq; }; var param = $.extend(true, {}, item.data, { apiName: $txtName.val(), apiType: $sltApiType.val(), apiDesc: $txtApiDesc.val(), httpMethodType: $sltHttpMethodType.val(), queryMsg: $txtQueryMsg.val(), resSampleCl: $txtResSampleCl.val(), reqUrlAddr: $txtApiUrl.val(), resultType: $sltResultType.val(), targetUrlAddr: $txtTargetUrlAddr.val(), targetName : $txtProcedure.val(), dataSourceName: $sltDataSourceName.val(), nodeType : 'API', reqParams : reqParamsArr, wsHeaders : reqHeaderArr }, null); if (!fieldValidation(param)) { return false; } var opt = { url : $crudServiceBaseUrl + '/save.json', data : self.util.stringifyJson(param), type : 'POST', dataType : 'json', contentType : 'application/json;charset=UTF-8;' }; var success = function(data) { alert('저장 되었습니다.'); addedNodeArr = []; var saveItemData = $('#apiTreeView').fancytree('getActiveNode'); $('#title'+saveItemData.key).text(data.apiName); saveItemData.data = data; saveItemData.data.id = data.apiSeq; saveItemData.data.name = data.apiName; /*location.reload(true);*/ }; var error = function(xhr, d, t) { console.log(xhr); alert(xhr.responseText); }; self.ajaxAdmin(opt, success, error); }; /** * 트리 아이템 reload 이벤트 * * @private */ var reloadItem = function(e) { var opt = { url : $crudServiceBaseUrl + '/cacheReload.json', type : 'POST', contentType : 'application/json; charset=UTF-8' }; var success = function(data) { if (data === 1) { alert('갱신 되었습니다'); } else { alert('수행 중 에러가 발생하였습니다'); } }; var error = function(xhr, d, t) { console.log(xhr); console.log(t); }; self.ajaxAdmin(opt, success, error); }; /** * 트리 아이템 선택 해제 이벤트 * @private */ var deselectItem = function(e){ var node = $('#apiTreeView').fancytree('getActiveNode'); if(node!=undefined){ node.setActive(false); node.setFocus(false); $('#apiMsg').css('display', 'block'); $('#apiContent').css('display', 'none'); }; }; /** * 실행 테스트 이벤트 */ var testApi = function(e) { var node = $('#apiTreeView').fancytree('getActiveNode'), item = $('#apiTreeView').fancytree('getActiveNode').data; var reqParamsArr = []; if(e.currentTarget.id=='btnTest'){ $.extend(reqParamsArr, paramList); // 객체 복사, 위의 방식으로하면 객체 공유가 되어버림! }else if(e.currentTarget.id=='btnTest_inModal'){ $.extend(reqParamsArr, paramEditList); // 객체 복사, 위의 방식으로하면 객체 공유가 되어버림! }; if (item.dataSourceName !== null && typeof item.dataSourceName === 'object' && item.dataSourceName.value !== undefined) { item.dataSourceName = item.dataSourceName.value; }; for (var i = 0; i < reqParamsArr.length; i++) { var it = reqParamsArr[i], paramName = it.paramName, paramSeq = it.paramSeq; reqParamsArr[i].paramName = paramName.replace(/\s/gi, ''); reqParamsArr[i].paramSeq = paramSeq!=null&&typeof(paramSeq)!="number" && paramSeq.indexOf('new_')>-1 ? null: paramSeq; }; var param = $.extend(true, {}, item.data, { apiName: $txtName.val(), apiType: $sltApiType.val(), apiDesc: $txtApiDesc.val(), httpMethodType: $sltHttpMethodType.val(), queryMsg: $txtQueryMsg.val(), resSampleCl: $txtResSampleCl.val(), reqUrlAddr: $txtApiUrl.val(), resultType: $sltResultType.val(), targetUrlAddr: $txtTargetUrlAddr.val(), targetName : $txtProcedure.val(), dataSourceName: $sltDataSourceName.val(), nodeType : 'API', reqParams : reqParamsArr, wsHeaders : headerList }, null); var opt = { beforeSend: function(){ self.loading('show'); }, url : $crudServiceBaseUrl + '/test.json', data : JSON.stringify(param), type : 'POST', dataType: 'json', contentType : 'application/json; charset=UTF-8;', complete: function(){ self.loading('hide'); } }; var success = function(data) { if ($.isEmptyObject(data)) { alert('테스트에 대한 결과 데이터가 없습니다.'); return false; } var responseData = self.util.stringifyJson(data, null, 2); $('#modal_testResult .modal-body').empty(); $('#modal_testResult .modal-body').append( $('
').html(responseData)); $('#modal_testResult').modal('show'); }; var error = function(xhr, d, t) { console.log(xhr); alert('[' + xhr.statusText + '] ' + xhr.responseText); }; self.ajaxAdmin(opt, success, error); }; /** * 트리 초기화 */ var createDeptNodeData = function(data) { return $.extend({ title : data.name, key : data.id, folder : data.nodeType == 'CATEGORY' ? true : false, lazy : data.nodeType == 'CATEGORY' ? true : false, data : data }, data.data); }; var initTree = function() { var $tree = $('#apiTreeView').fancytree( { extensions : [ 'edit' ], lazyLoad : function(event, ctx) { var param_lazyload = { async : false, url : $crudServiceBaseUrl + '/getList.json', dataType : 'json', type : 'POST', data : self.util.stringifyJson({ catSeq : ctx.node.data.catSeq }) }; result = []; var success_lazyload = function(data) { apiList = data; for ( var i in apiList) { var item = apiList[i]; result.push(createDeptNodeData(item)); } ; ctx.result = result; }; var error_lazyload = function(xhr, d, t) { console.log(xhr); console.log(t); }; self.ajaxAdmin(param_lazyload, success_lazyload, error_lazyload); }, selectMode : 3, activate : function(event, ctx) { var apiData = ctx.node.data; if(apiData.nodeType=='CATEGORY'){ $('#apiMsg').css('display', 'block'); $('#apiContent').css('display', 'none'); }else{ $('#apiMsg').css('display', 'none'); $('#apiContent').css('display', 'block'); if (apiData.apiSeq == undefined || apiData.apiSeq == '') { $txtId.val(''); $txtName.val(''); $spanCatPathName.text(apiData.catPathName); $txtApiUrl.val(''); $sltApiType.val(''); enableApiTypeRow(apiData.apiType); $sltHttpMethodType.val(''); $sltResultType.val(''); $sltDataSourceName.val(''); $txtTargetUrlAddr.val(''); $txtResSampleCl.val(''); $txtApiDesc.val(''); $spanCreateDt.text(''); $spanCreateId.text(''); $spanUpdateDt.text(''); $spanUpdateId.text(''); $txtQueryMsg.val(''); $txtProcedure.val(''); paramList = []; headerList = []; paramEditList = []; headerEditList = []; $('#table_header_view').empty(); $('#table_param_view').empty(); } else { var opt = { url : $crudServiceBaseUrl + "/getApi.json", type : "POST", data : self.util.stringifyJson( {'apiSeq': apiData.apiSeq} ), dataType : "json", contentType : "application/json;charset=utf-8" }; var success = function(data){ $txtId.val(data.apiSeq); $txtName.val(data.apiName); $spanCatPathName.text(data.catPathName); $txtApiUrl.val(data.reqUrlAddr); $sltApiType.val(data.apiType); enableApiTypeRow(data.apiType); $sltHttpMethodType.val(data.httpMethodType); $sltResultType.val(data.resultType); $sltDataSourceName.val(data.dataSourceName); $txtTargetUrlAddr.val(data.targetUrlAddr); $txtResSampleCl.val(data.resSampleCl); $txtApiDesc.val(data.apiDesc); $spanCreateDt.text(moment(data.createDt).format( 'YYYY-MM-DD')); $spanCreateId.text(data.createId==null? '': data.createId); $spanUpdateDt.text(moment(data.updateDt).format( 'YYYY-MM-DD')); $spanUpdateId.text(data.updateId==null? '': data.updateId); $txtQueryMsg.val(data.queryMsg); $txtProcedure.val(data.targetName); initGrid(data.apiSeq); }; var error = function(xhr,d,t){ console.log(xhr); console.log(xhr.responseText); }; self.ajaxAdmin( opt, success, error ); }; // 설명 글자수제한 초기화 $txtApiDesc.trigger('keyup'); } }, click : function(event, data) { }, }).fancytree('getTree'); var apiList; $.ajax({ async : false, url : $crudServiceBaseUrl + '/getList.json', dataType : 'json', type : 'POST', contentType : 'application/json', data: JSON.stringify({}), success : function(result) { apiList = result; } }); var $root = $tree.getRootNode(); for ( var i in apiList) { var item = apiList[i]; $root.addNode(createDeptNodeData(item)); } }; var paramList = []; var headerList = []; var paramEditList = []; var headerEditList = []; /** * 그리드 초기화 */ var initGrid = function(apiSeq) { // 헤더 테이블 var opt_header = { url : $crudServiceBaseUrl + '/getHeaderList.json', type : 'POST', dataType : 'json', data : self.util.stringifyJson({ 'apiSeq' : apiSeq }), contentType : 'application/json; charset=UTF-8' }; var success_header = function(data) { $('#table_header_view').empty(); headerList = data; for (var i = 0; i < headerList.length; i++) { var tr = $('