G-1: 메신저 Webhook Relay + _send_to_room 실제 httpx 호출 구현 G-2: POST /api/tasks/bulk SR 대량작업 엔드포인트 (최대 100건) G-3: 라이선스 만료 알림 스케줄러 (매일 09:00 KST) G-4: 체험판 upgrade_banner 필드 + license.py 배너 로직 G-5: core/auto_rca.py + incidents/problem auto-rca 엔드포인트 G-6: core/deploy_impact.py + vibe impact-analysis 엔드포인트 G-7: core/ticket_classifier.py + SR 생성 시 AI 분류 + ai-suggestion API G-8: VulnPatchRecord 모델 + vuln_scan 패치추적 4개 엔드포인트 G-9: core/jira_sync.py + gateway Jira/Confluence 연동 엔드포인트 G-10: core/push_notify.py + routers/push.py + PushSubscription 모델 G-11: approvals 다중승인 (위임/서명/기한초과/마감연장) G-12: alembic.ini + migrations/ + cicd/migrate_to_postgres.sh 하네스: guardia-orchestrator 확장기능 Phase 반영 봇명령어: /sr /status /license /bulk 슬래시 명령어 추가 설치스크립트: setup/ (Ubuntu, CentOS, RHEL, Windows) --test 옵션 포함 Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
184 lines
3.7 KiB
JavaScript
184 lines
3.7 KiB
JavaScript
/*------------------------------------------------------------------------------
|
|
* 1. 파일명: ajax.js
|
|
* 2. 설 명: AJAX를 이용한 처리와 관련된 함수를 정의한다.
|
|
* 3. 의존성:
|
|
* 4. 작성자:
|
|
* 5. 작성일: 2006.12.15.
|
|
-----------------------------------------------------------------------------*/
|
|
|
|
|
|
|
|
/**
|
|
* XMLHttpRequest를 통해 처리를 요청한다.
|
|
* 처리는 sync. 하게 일어나도록 한다.
|
|
*/
|
|
function send(url) {
|
|
var res = null;
|
|
|
|
/* XMLHttpRequest를 얻는다. */
|
|
var xmlHttp = getXMLHttpRequest();
|
|
|
|
if ( xmlHttp != null ) {
|
|
xmlHttp.open("GET", url, false); // 동기로 호출.
|
|
xmlHttp.send(null);
|
|
|
|
res = eval("(" + xmlHttp.responseText + ")");
|
|
}
|
|
|
|
/* 사용한 XMLHttpRequest를 돌려준다. */
|
|
returnXMLHttpRequest(xmlHttp);
|
|
|
|
return res;
|
|
}
|
|
|
|
|
|
/**
|
|
* XMLHttpRequest를 이용하여 POST 방식으로 처리를 요청한다.
|
|
* 처리는 sync. 하게 일어난다.
|
|
*/
|
|
function sendForm(form) {
|
|
var res = null;
|
|
|
|
var url = form.action;
|
|
var xmlHttp = getXMLHttpRequest();
|
|
|
|
if ( xmlHttp != null ) {
|
|
xmlHttp.open("POST", url, false); // 동기로 호출.
|
|
|
|
/* POST로 정보를 보내기 전에 Content-Type 값을 설정한다. */
|
|
var contentType = "application/x-www-form-urlencoded; charset=UTF-8";
|
|
xmlHttp.setRequestHeader("Content-Type", contentType);
|
|
|
|
/* POST로 보낼 데이타를 생성한다. */
|
|
var postData = makePostData(form);
|
|
|
|
xmlHttp.send(postData);
|
|
|
|
res = eval("(" + xmlHttp.responseText + ")");
|
|
}
|
|
|
|
/* 사용한 XMLHttpRequest를 돌려준다. */
|
|
returnXMLHttpRequest(xmlHttp);
|
|
|
|
return res;
|
|
}
|
|
|
|
|
|
/**
|
|
* 주어진 Form에 있는 정보를 POST 로 실어 보낼
|
|
* 자료 형식으로 만들어 돌려 준다.
|
|
*/
|
|
function makePostData(form) {
|
|
var data = "";
|
|
|
|
var length = form.elements.length;
|
|
for ( var i = 0; i < length; i++ ) {
|
|
if ( i > 0 ) data += "&";
|
|
|
|
var elem = form.elements[i];
|
|
|
|
/* Disabled 된 항목은 보내지 않는다. */
|
|
if ( elem.disabled ) continue;
|
|
|
|
/* 자료형태가 radio나 checkbox인 경우는 check된 항목의 값만 보낸다.
|
|
value 항목이 정의되어 있지 않으면 true를 보낸다. */
|
|
if ( ( elem.type == "radio" || elem.type == "checkbox" )
|
|
&& elem.checked ) {
|
|
data += elem.name + "=" + ( isEmpty(elem.value) ? "true" : encodeURIComponent(elem.value) );
|
|
}
|
|
else {
|
|
/* type이 text나 select-single 인 경우. select-multi 인 경우는 일단 고려 안 한다. */
|
|
data += elem.name + "=" + encodeURIComponent(elem.value);
|
|
}
|
|
}
|
|
|
|
return data;
|
|
}
|
|
|
|
|
|
/**
|
|
* XMLHttpRequest 객체를 돌려 준다.
|
|
* 이미 생성되어 사용중이지 않은 게 있으면 이를 주고
|
|
* 사용중이 아닌 게 없으면 만들어 돌려 준다.
|
|
*/
|
|
var httpReqStack = new Array();
|
|
|
|
function getXMLHttpRequest() {
|
|
var httpReq = null;
|
|
|
|
if ( httpReqStack.length > 0 ) {
|
|
httpReq = httpReqStack.pop();
|
|
}
|
|
else {
|
|
httpReq = newXMLHttpRequest();
|
|
}
|
|
|
|
return httpReq;
|
|
}
|
|
|
|
|
|
/**
|
|
* 이미 사용한 XMLHttpRequest를 돌려받는다.
|
|
*/
|
|
function returnXMLHttpRequest(httpReq) {
|
|
httpReqStack.push(httpReq);
|
|
}
|
|
|
|
|
|
/**
|
|
* 브라우저의 종류에 맞게 XMLHttpRequest 객체를 생성하여
|
|
* 돌려 준다.
|
|
*/
|
|
function newXMLHttpRequest() {
|
|
var reqHttp;
|
|
|
|
if ( window.ActiveXObject ) { // IE
|
|
try {
|
|
reqHttp = new ActiveXObject("Msxml2.XMLHTTP");
|
|
}
|
|
catch (e) {
|
|
try {
|
|
reqHttp = new ActiveXObject("Microsoft.XMLHTTP");
|
|
}
|
|
catch (e1) {
|
|
reqHttp = null;
|
|
}
|
|
}
|
|
}
|
|
else if ( window.XMLHttpRequest ) { // IE 이외
|
|
try {
|
|
reqHttp = new XMLHttpRequest();
|
|
}
|
|
catch (e) {
|
|
}
|
|
}
|
|
|
|
if ( reqHttp == null ) {
|
|
alert("XMLHttpRequest 객체를 생성하는데 실패하였습니다.");
|
|
}
|
|
|
|
return reqHttp;
|
|
}
|
|
|
|
|
|
function deleteAllRow(obj) {
|
|
var childCount = obj.childNodes.length;
|
|
|
|
for ( var i = (childCount - 1); i >= 0; i-- ) {
|
|
obj.deleteRow(i);
|
|
}
|
|
}
|
|
|
|
function makeTableRow(dataArray) {
|
|
var rowObj = document.createElement("tr");
|
|
|
|
for ( var i = 0; i < dataArray.length; i++ ) {
|
|
var dataObj = document.createElement("td");
|
|
|
|
dataObj.innerHTML = dataArray[i];
|
|
|
|
rowObj.appendChild(dataObj);
|
|
}
|
|
|
|
return rowObj;
|
|
} |