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>
490 lines
11 KiB
JavaScript
490 lines
11 KiB
JavaScript
/*-------------------------------------------------------------------+
|
|
* 1. 파일명: valid.js
|
|
* 2. 설 명: 필수항목여부 및 길이에 대한 유효성 점검을
|
|
* 위한 함수를 정의한다.
|
|
* 3. 의존성: ui.js
|
|
* 4. 작성자:
|
|
* 5. 작성일: 2006.10.10.
|
|
-------------------------------------------------------------------*/
|
|
|
|
|
|
/**
|
|
* 값이 비었는지 여부를 점검하여 돌려준다.
|
|
* 주어진 값이 null이거나, undefined이거나 빈 문자열("")이면
|
|
* 비었다고 판단한다.
|
|
*/
|
|
function isEmpty(value, afterTrim) {
|
|
if ( value == null || typeof(value) == "undefined" ) return true;
|
|
|
|
if ( afterTrim == undefined ) afterTrim = true;
|
|
|
|
/* 문자열이 아니면 문자열로 변경한다. */
|
|
if ( typeof(value) == "string" ) value = new String(value);
|
|
|
|
if ( afterTrim ) value = trim(value);
|
|
|
|
return ("" == value);
|
|
}
|
|
|
|
|
|
/**
|
|
* 주어진 객체의 값이 빈 값인지 여부를 검사하여
|
|
* 돌려준다. 빈값이면 true, 아니면 false이다.
|
|
*/
|
|
function isEmptyObj(obj, afterTrim) {
|
|
obj = ref(obj);
|
|
|
|
return isEmpty(obj.value, afterTrim);
|
|
}
|
|
|
|
|
|
/**
|
|
* 주어진 값이 정수 값인지 혹은 정수로 치환될 수 있는
|
|
* 문자열 값인지 여부를 돌려 준다.
|
|
* 자릿수 값이 있을 경우는 자릿수 이하인지도 검사한다.
|
|
*
|
|
* @param cipher 제한 자릿수. 사전 찾아 보니 이 단어네요.
|
|
*/
|
|
function isInteger(value, cipher) {
|
|
/* 일단 빈 값이면 true. */
|
|
if ( isEmpty(value) ) return true;
|
|
|
|
/* value 값이 String이 아니면 String으로 바꾼다. */
|
|
var numStr = "";
|
|
if ( typeof(value) != "string" ) numStr = new String(value);
|
|
|
|
/* 3자리마다 컴마가 들어간 숫자일 수도 있으니 컴마를 삭제한다. */
|
|
numStr = removeChar(numStr, ",");
|
|
|
|
/* 숫자가 아닌가? */
|
|
if ( isNaN(numStr) ) return false;
|
|
|
|
/* 숫자이지만 정수인가? 소숫점을 가지고 있는가? */
|
|
if ( numStr.indexOf(".") > -1 ) return false;
|
|
|
|
/* 자릿수 제한이 있다면 주어진 자릿수 이하인가? */
|
|
if ( ! isEmpty(cipher) && numStr.length > cipher ) return false;
|
|
|
|
/* 여기까지 왔으면 합격! */
|
|
return true;
|
|
}
|
|
|
|
|
|
/**
|
|
* 주어진 값이 소수 값인지 혹은 소수로 치환될 수 있는
|
|
* 문자열 값인지 여부를 돌려 준다.
|
|
* 자릿수 값이 있을 경우는 자릿수 이하인지도 검사한다.
|
|
*
|
|
* @param value 소수 여부를 확인할 값.
|
|
* @param integerPartCipher 정수부 제한 자릿수.
|
|
* @param fractionCipher 소수부 제한 자릿수.
|
|
*/
|
|
function isFloat(value, integerPartCipher, fractionCipher) {
|
|
/* 일단 빈 값이면 true. */
|
|
if ( isEmpty(value) ) return true;
|
|
|
|
/* value 값이 String이 아니면 String으로 바꾼다. */
|
|
var numStr = "";
|
|
if ( typeof(value) != "string" ) numStr = new String(value);
|
|
|
|
/* 3자리마다 컴마가 들어간 숫자일 수도 있으니 컴마를 삭제한다. */
|
|
numStr = removeChar(numStr, ",");
|
|
|
|
/* 숫자가 아닌가? */
|
|
if ( isNaN(numStr) ) return false;
|
|
|
|
/* 자릿수 제한이 있다면 정수부와 소수부로 나눈다. */
|
|
if ( ! isEmpty(integerPartCipher) || ! isEmpty(fractionCipher) ) {
|
|
var tempArr = numStr.split(".");
|
|
|
|
var intergerPart = tempArr[0]; // 정수부
|
|
var fractionPart = tempArr.length > 1 ? tempArr[1] : ""; // 소수부
|
|
|
|
/* 정수부 확인. */
|
|
if ( ! isEmpty(integerPartCipher) && intergerPart.length > integerPartCipher ) return false;
|
|
|
|
/* 소수부 확인. */
|
|
if ( ! isEmpty(fractionCipher) && fractionPart.length > fractionCipher ) return false;
|
|
}
|
|
|
|
/* 여기까지 왔으면 합격! */
|
|
return true;
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
* 주어진 문자열의 byte 수가 length의 값과 같은지를
|
|
* 검사하여 같으면 true를, 다르면 false를 돌려준다.
|
|
*
|
|
* @param str 대상 문자열
|
|
* @param length 비교 byte 수
|
|
*/
|
|
function checkLengthEQ(str, length) {
|
|
return countByte(str) == length;
|
|
}
|
|
|
|
|
|
/**
|
|
* Text형 입력폼 값의 byte 수가 length의 값과 같은지를
|
|
* 검사하여 같으면 true를, 다르면 false를 돌려준다.
|
|
*
|
|
* @param obj Text형 입력폼 객체
|
|
* @param length 비교 byte 수
|
|
*/
|
|
function checkLengthEQObj(obj, length) {
|
|
return checkLengthEQ(obj.value, length);
|
|
}
|
|
|
|
|
|
/**
|
|
* Text형 입력폼 값의 byte 수가 length의 값과 같은지를
|
|
* 검사하여 그렇다면 true를, 그렇지 않으면 false를 돌려준다.
|
|
*
|
|
* @param value 검사대상 값.
|
|
* @param length 비교 byte 수.
|
|
* @param fieldName 항목명
|
|
*/
|
|
function validateLengthEQ(value, length, fieldName) {
|
|
if ( fieldName == undefined ) {
|
|
fieldName = "";
|
|
}
|
|
else {
|
|
fieldName += "의 ";
|
|
}
|
|
|
|
var valid = checkLengthEQ(value, length);
|
|
|
|
if ( ! valid ) {
|
|
showMessage(fieldName + " 값은 " + length + " 글자(숫자, 영문 기준)이어야 합니다.");
|
|
}
|
|
|
|
return valid;
|
|
}
|
|
|
|
|
|
/**
|
|
* Text형 입력폼 값의 byte 수가 length의 값과 같지를
|
|
* 검사하여 그렇다면 true를, 그렇지 않으면 false를 돌려준다.
|
|
*
|
|
* @param obj Text형 입력폼 객체
|
|
* @param length 비교 byte 수
|
|
* @param fieldName 항목명
|
|
*/
|
|
function validateLengthEQObj(obj, length, fieldName) {
|
|
var valid = validateLengthEQ(obj.value, length, fieldName);
|
|
|
|
if ( ! valid ) {
|
|
obj.focus();
|
|
}
|
|
|
|
return valid;
|
|
}
|
|
|
|
|
|
/**
|
|
* 주어진 문자열의 byte 수가 length의 값보다 큰지를
|
|
* 검사하여 같으면 true를, 다르면 false를 돌려준다.
|
|
*
|
|
* @param str 대상 문자열
|
|
* @param length 비교 byte 수
|
|
*/
|
|
function checkLengthGT(str, length) {
|
|
return countByte(str) > length;
|
|
}
|
|
|
|
|
|
/**
|
|
* Text형 입력폼 값의 byte 수가 length의 값보다 큰지를
|
|
* 검사하여 같으면 true를, 다르면 false를 돌려준다.
|
|
*
|
|
* @param obj Text형 입력폼 객체
|
|
* @param length 비교 byte 수
|
|
*/
|
|
function checkLengthGTObj(obj, length) {
|
|
return checkLengthGT(obj.value, length);
|
|
}
|
|
|
|
|
|
/**
|
|
* Text형 입력폼 값의 byte 수가 length의 값보다 큰지를
|
|
* 검사하여 그렇다면 true를, 그렇지 않으면 false를 돌려준다.
|
|
*
|
|
* @param value 검사대상 값.
|
|
* @param length 비교 byte 수.
|
|
* @param fieldName 항목명
|
|
*/
|
|
function validateLengthGT(value, length, fieldName) {
|
|
if ( fieldName == undefined ) {
|
|
fieldName = "";
|
|
}
|
|
else {
|
|
fieldName += "의 ";
|
|
}
|
|
|
|
var valid = checkLengthGT(value, length);
|
|
|
|
if ( ! valid ) {
|
|
showMessage(fieldName + " 값은 " + length + " 글자(숫자, 영문 기준)보다 커야 합니다.");
|
|
}
|
|
|
|
return valid;
|
|
}
|
|
|
|
|
|
/**
|
|
* Text형 입력폼 값의 byte 수가 length의 값보다 큰지를
|
|
* 검사하여 그렇다면 true를, 그렇지 않으면 false를 돌려준다.
|
|
*
|
|
* @param obj Text형 입력폼 객체
|
|
* @param length 비교 byte 수
|
|
* @param fieldName 항목명
|
|
*/
|
|
function validateLengthGTObj(obj, length, fieldName) {
|
|
var valid = validateLengthGT(obj.value, length, fieldName);
|
|
|
|
if ( ! valid ) {
|
|
obj.focus();
|
|
}
|
|
|
|
return valid;
|
|
}
|
|
|
|
|
|
/**
|
|
* 주어진 문자열의 byte 수가 length의 값보다 작은지를
|
|
* 검사하여 같으면 true를, 다르면 false를 돌려준다.
|
|
*
|
|
* @param str 대상 문자열
|
|
* @param length 비교 byte 수
|
|
*/
|
|
function checkLengthLT(str, length) {
|
|
return countByte(str) < length;
|
|
}
|
|
|
|
|
|
/**
|
|
* Text형 입력폼 값의 byte 수가 length의 값보다 작은지를
|
|
* 검사하여 같으면 true를, 다르면 false를 돌려준다.
|
|
*
|
|
* @param obj Text형 입력폼 객체
|
|
* @param length 비교 byte 수
|
|
*/
|
|
function checkLengthLTObj(obj, length) {
|
|
return checkLengthLT(obj.value, length);
|
|
}
|
|
|
|
|
|
/**
|
|
* Text형 입력폼 값의 byte 수가 length의 값보다 작은지를
|
|
* 검사하여 그렇다면 true를, 그렇지 않으면 false를 돌려준다.
|
|
*
|
|
* @param value 검사대상 값.
|
|
* @param length 비교 byte 수.
|
|
* @param fieldName 항목명
|
|
*/
|
|
function validateLengthLT(value, length, fieldName) {
|
|
if ( fieldName == undefined ) {
|
|
fieldName = "";
|
|
}
|
|
else {
|
|
fieldName += "의 ";
|
|
}
|
|
|
|
var valid = checkLengthLT(value, length);
|
|
|
|
if ( ! valid ) {
|
|
showMessage(fieldName + " 값은 " + length + " 글자(숫자, 영문 기준)보다 작아야 합니다.");
|
|
}
|
|
|
|
return valid;
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
* Text형 입력폼 값의 byte 수가 length의 값보다 작은지를
|
|
* 검사하여 그렇다면 true를, 그렇지 않으면 false를 돌려준다.
|
|
*
|
|
* @param obj Text형 입력폼 객체
|
|
* @param length 비교 byte 수
|
|
* @param fieldName 항목명
|
|
*/
|
|
function validateLengthLTObj(obj, length, fieldName) {
|
|
var valid = validateLengthLT(obj.value, length, fieldName);
|
|
|
|
if ( ! valid ) {
|
|
obj.focus();
|
|
}
|
|
|
|
return valid;
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
* 주어진 문자열의 byte 수가 length의 값보다 크거나 같은지를
|
|
* 검사하여 같으면 true를, 다르면 false를 돌려준다.
|
|
*
|
|
* @param str 대상 문자열
|
|
* @param length 비교 byte 수
|
|
*/
|
|
function checkLengthGE(str, length) {
|
|
return countByte(str) >= length;
|
|
}
|
|
|
|
|
|
/**
|
|
* Text형 입력폼 값의 byte 수가 length의 값과 크거나 같은지를
|
|
* 검사하여 같으면 true를, 다르면 false를 돌려준다.
|
|
*
|
|
* @param obj Text형 입력폼 객체
|
|
* @param length 비교 byte 수
|
|
*/
|
|
function checkLengthGEObj(obj, length) {
|
|
return checkLengthGE(obj.value, length);
|
|
}
|
|
|
|
|
|
/**
|
|
* Text형 입력폼 값의 byte 수가 length의 값보다 작은지를
|
|
* 검사하여 그렇다면 true를, 그렇지 않으면 false를 돌려준다.
|
|
*
|
|
* @param value 검사대상 값.
|
|
* @param length 비교 byte 수.
|
|
* @param fieldName 항목명
|
|
*/
|
|
function validateLengthGE(value, length, fieldName) {
|
|
if ( fieldName == undefined ) {
|
|
fieldName = "";
|
|
}
|
|
else {
|
|
fieldName += "의 ";
|
|
}
|
|
|
|
var valid = checkLengthGE(value, length);
|
|
|
|
if ( ! valid ) {
|
|
showMessage(fieldName + " 값은 " + length + " 글자(숫자, 영문 기준)보다 크거나 같아야 합니다.");
|
|
}
|
|
|
|
return valid;
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
* Text형 입력폼 값의 byte 수가 length의 값보다 작은지를
|
|
* 검사하여 그렇다면 true를, 그렇지 않으면 false를 돌려준다.
|
|
*
|
|
* @param obj Text형 입력폼 객체
|
|
* @param length 비교 byte 수
|
|
* @param fieldName 항목명
|
|
*/
|
|
function validateLengthGEObj(obj, length, fieldName) {
|
|
var valid = validateLengthGE(obj.value, length, fieldName);
|
|
|
|
if ( ! valid ) {
|
|
obj.focus();
|
|
}
|
|
|
|
return valid;
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
* 주어진 문자열의 byte 수가 length의 값보다 작거나 같은지를
|
|
* 검사하여 같으면 true를, 다르면 false를 돌려준다.
|
|
*
|
|
* @param str 대상 문자열
|
|
* @param length 비교 byte 수
|
|
*/
|
|
function checkLengthLE(str, length) {
|
|
return countByte(str) <= length;
|
|
}
|
|
|
|
|
|
/**
|
|
* 주어진 문자열의 byte 수가 length의 값보다 작거나 같은지를
|
|
* 검사하여 같으면 true를, 다르면 false를 돌려준다.
|
|
*
|
|
* @param obj Text형 입력폼 객체
|
|
* @param length 비교 byte 수
|
|
*/
|
|
function checkLengthLEObj(obj, length, fieldName) {
|
|
return checkLengthLE(obj.value, length);
|
|
}
|
|
|
|
|
|
/**
|
|
* Text형 입력폼 값의 byte 수가 length의 값보다 작거나 같은지를
|
|
* 검사하여 그렇다면 true를, 그렇지 않으면 false를 돌려준다.
|
|
*
|
|
* @param value 검사대상 값.
|
|
* @param length 비교 byte 수.
|
|
* @param fieldName 항목명
|
|
*/
|
|
function validateLengthLE(value, length, fieldName) {
|
|
if ( fieldName == undefined ) {
|
|
fieldName = "";
|
|
}
|
|
else {
|
|
fieldName += "의 ";
|
|
}
|
|
|
|
var valid = checkLengthLE(value, length);
|
|
|
|
if ( ! valid ) {
|
|
showMessage(fieldName + " 값은 " + length + " 글자(숫자, 영문 기준)보다 작거나 같아야 합니다.");
|
|
}
|
|
|
|
return valid;
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
* Text형 입력폼 값의 byte 수가 length의 값보다 작거나 같은지를
|
|
* 검사하여 그렇다면 true를, 그렇지 않으면 false를 돌려준다.
|
|
*
|
|
* @param obj Text형 입력폼 객체
|
|
* @param length 비교 byte 수
|
|
* @param fieldName 항목명
|
|
*/
|
|
function validateLengthLEObj(obj, length, fieldName) {
|
|
var valid = validateLengthLE(obj.value, length, fieldName);
|
|
|
|
if ( ! valid ) {
|
|
obj.focus();
|
|
}
|
|
|
|
return valid;
|
|
}
|
|
|
|
|
|
|
|
/* 필수항목 여부를 점검하여 항목이 있으면 true를,
|
|
* 없으면 오류 메세지를 보여주고 false를 돌려 준다.
|
|
*/
|
|
function validateMandatory(value, fieldName) {
|
|
var isValid = ! isEmpty(value);
|
|
|
|
if ( fieldName == undefined ) fieldName = "검사";
|
|
|
|
if ( ! isValid ) {
|
|
showMessage(fieldName + " 항목은 필수입력 사항입니다.");
|
|
}
|
|
|
|
return isValid;
|
|
}
|
|
|
|
|
|
function validateMandatoryObj(obj, fieldName) {
|
|
var isValid = validateMandatory(obj.value, fieldName);
|
|
|
|
if ( ! isValid ) obj.focus();
|
|
|
|
return isValid;
|
|
}
|