MES(Project) 저장소입니다. 이 문서는 처음 GitHub를 쓰는 초보자도 따라 할 수 있도록 단계별로 설명합니다. 아래 안내만 그대로 따라 하면 프로젝트를 내려받고, 간단한 예제 서버를 실행해 볼 수 있습니다.
- Git: https://git-scm.com 에서 설치 (기본 설정 그대로 Next를 눌러도 됩니다)
- 코드 편집기: Visual Studio Code 추천
- Node.js 18 이상(예제 서버 실행용): https://nodejs.org 에서 LTS 버전 설치
PowerShell(또는 명령 프롬프트)을 열고 아래 명령을 입력합니다.
git clone https://github.com/JikwangHan/MES-Project.git
cd MES-Project정상적으로 내려받으면 MES-Project 폴더 안에 README.md와 src 폴더가 보입니다.
MES-Project/
├─ README.md # 이 문서
├─ .gitignore # Git에 올리지 않을 파일 목록
├─ package.json # 실행/의존성 정의
├─ package-lock.json
├─ data/ # SQLite DB 파일 저장 위치(자동 생성)
├─ src/
│ ├─ server.js # 메인 API 서버 엔트리
│ ├─ db.js # SQLite 연결/스키마 초기화
│ ├─ routes/
│ │ └─ itemCategories.js # Ticket-01: 품목유형 API
│ ├─ middleware/
│ │ ├─ tenant.js # x-company-id 헤더 확인
│ │ └─ auth.js # x-role 헤더, VIEWER 제한
│ ├─ utils/response.js # 표준 응답 포맷
│ └─ example-server.js # 기존 단순 예제 서버(검증용)
└─ node_modules/ (자동 생성)
아래 단계는 “서버가 제대로 동작하는지” 확인하는 가장 단순한 예시입니다.
- 프로젝트 폴더로 이동:
cd MES-Project - 서버 실행:
node src/example-server.js - PowerShell 화면에
Server running at http://localhost:4000이 보이면 성공입니다. - 웹 브라우저 주소창에
http://localhost:4000입력 → “MES Project 서버가 정상 동작 중입니다.” 문구가 보이면 OK.
src/example-server.js 파일에 들어 있는 코드입니다. 그대로 실행만 해도 되고, 메시지를 바꾸면서 테스트해도 됩니다.
const http = require('http');
const PORT = 4000;
const server = http.createServer((req, res) => {
// 간단한 텍스트 응답
res.writeHead(200, { 'Content-Type': 'text/plain; charset=utf-8' });
res.end('MES Project 서버가 정상 동작 중입니다.');
});
server.listen(PORT, () => {
console.log(`Server running at http://localhost:${PORT}`);
});아래 순서대로 따라 하면 “품목유형 등록/조회 API”를 바로 띄워볼 수 있습니다.
- 프로젝트 폴더로 이동
cd MES-Project - 의존성 설치(처음 한 번만)
npm install
- API 서버 실행
npm start
- PowerShell에
MES API server running at http://localhost:4000메시지가 보이면 성공입니다.
- PowerShell에
x-company-id: 회사 식별자 (필수) – 테넌트 분리용x-role: 사용자 역할 –OPERATOR,MANAGER등.VIEWER는 등록 불가(403).
예제: 회사 A(OPERATOR)가 “완제품” 카테고리를 등록
curl -X POST http://localhost:4000/api/v1/item-categories ^
-H "Content-Type: application/json" ^
-H "x-company-id: COMPANY-A" ^
-H "x-role: OPERATOR" ^
-d "{ \"name\": \"완제품\", \"code\": \"FINISHED\" }"- 성공 시 201 Created와 함께 등록된 데이터가 JSON으로 돌아옵니다.
- 같은 회사에서
code가 중복되면 409 응답을 받습니다.
curl -X GET http://localhost:4000/api/v1/item-categories ^
-H "x-company-id: COMPANY-A" ^
-H "x-role: VIEWER"- 회사별(
x-company-id)로만 필터링되어 반환됩니다. - VIEWER도 조회는 가능하지만 등록은 불가합니다.
data/mes.db는 SQLite 파일입니다. DB Browser for SQLite 같은 무료 툴로 열어서 audit_logs 테이블을 보면 누가(역할), 어떤 엔티티를, 언제 만들었는지 확인 가능합니다.
Ticket-01과 같은 패턴으로 바로 테스트할 수 있습니다.
- 서버 실행
npm start
- 등록 성공 (OPERATOR, 회사 A, 카테고리 id=1 사용 예시)
curl.exe -X POST "http://localhost:4000/api/v1/items" ^ -H "Content-Type: application/json" ^ -H "x-company-id: COMPANY-A" ^ -H "x-role: OPERATOR" ^ -d "{\"categoryId\":1,\"name\":\"라면\",\"code\":\"ITEM-001\"}"
- 같은 회사(
x-company-id)에서code가 중복되면 409가 반환됩니다.
- 같은 회사(
- 조회 (VIEWER도 가능)
curl.exe -X GET "http://localhost:4000/api/v1/items" ^ -H "x-company-id: COMPANY-A" ^ -H "x-role: VIEWER"
- 실패 케이스 예시
x-role: VIEWER로 POST → 403- 다른 회사의 categoryId 사용 → 403
- 존재하지 않는 categoryId → 400
- 감사 로그 확인
data/mes.db의audit_logs에서 성공(CREATE)과 실패(CREATE_FAIL) 기록을 확인할 수 있습니다.
완제품(itemId)에 자재(childItemId)와 수량/단위를 연결하는 API입니다.
- BOM 추가 (OPERATOR, 회사 A, 완제품 id=1, 자재 id=2 예시)
curl.exe -X POST "http://localhost:4000/api/v1/items/1/parts" ^ -H "Content-Type: application/json" ^ -H "x-company-id: COMPANY-A" ^ -H "x-role: OPERATOR" ^ -d "{\"childItemId\":2,\"qty\":1.5,\"unit\":\"EA\"}"
- 규칙:
qty는 0보다 커야 합니다. 부모/자식이 같으면 400, 중복 연결이면 409.
- 규칙:
- BOM 조회 (VIEWER도 가능)
curl.exe -X GET "http://localhost:4000/api/v1/items/1/parts" ^ -H "x-company-id: COMPANY-A" ^ -H "x-role: VIEWER"
- 삭제 (필요 시, OPERATOR)
curl.exe -X DELETE "http://localhost:4000/api/v1/items/1/parts/파트ID" ^ -H "x-company-id: COMPANY-A" ^ -H "x-role: OPERATOR"
- 실패 케이스 예시
- VIEWER로 추가 → 403
- parent/child가 동일 → 400(BOM_SELF_REFERENCE)
- 같은 parent+child 중복 → 409(BOM_DUPLICATE)
- 다른 회사의 itemId/childItemId 사용 → 400(ITEM_NOT_FOUND로 통일)
- 감사 로그 확인
audit_logs에서entity=item_boms의 CREATE/DELETE/FAIL 기록을 확인할 수 있습니다.
공정을 상위/하위 구조로 관리합니다. (이번 티켓은 등록/조회만)
- 공정 등록 (OPERATOR, parent 없이)
curl.exe -X POST "http://localhost:4000/api/v1/processes" ^ -H "Content-Type: application/json" ^ -H "x-company-id: COMPANY-A" ^ -H "x-role: OPERATOR" ^ -d "{\"name\":\"포장공정\",\"code\":\"PROC-001\",\"parentId\":null,\"sortOrder\":0}"
- 같은 회사에서 code가 중복이면 409(PROCESS_CODE_DUPLICATE).
- parentId가 존재하지 않거나 다른 회사이면 400(PROCESS_PARENT_NOT_FOUND).
- 공정 조회 (VIEWER도 가능)
curl.exe -X GET "http://localhost:4000/api/v1/processes" ^ -H "x-company-id: COMPANY-A" ^ -H "x-role: VIEWER"
- 실패 케이스 예시
- VIEWER로 등록 → 403
- parentId가 없거나 타사 → 400(PROCESS_PARENT_NOT_FOUND)
- 감사 로그 확인
audit_logs에서entity=processesCREATE/FAIL 기록 확인 가능.
설비를 등록/조회합니다. 이번 티켓은 삭제 제외.
- 설비 등록 (OPERATOR, processId 없이)
curl.exe -X POST "http://localhost:4000/api/v1/equipments" ^ -H "Content-Type: application/json" ^ -H "x-company-id: COMPANY-A" ^ -H "x-role: OPERATOR" ^ -d "{\"name\":\"포장기\",\"code\":\"EQ-001\",\"processId\":null,\"commType\":\"MODBUS_TCP\",\"commConfig\":{\"ip\":\"192.168.0.10\",\"port\":502},\"isActive\":1}"
- 같은 회사에서 code 중복 → 409(EQUIPMENT_CODE_DUPLICATE)
- processId가 없거나 타사/없는 공정 → 400(EQUIPMENT_PROCESS_NOT_FOUND)
- 설비 조회 (VIEWER도 가능)
curl.exe -X GET "http://localhost:4000/api/v1/equipments" ^ -H "x-company-id: COMPANY-A" ^ -H "x-role: VIEWER"
- 실패 케이스 예시
- VIEWER로 등록 → 403
- 타사/없는 processId → 400(EQUIPMENT_PROCESS_NOT_FOUND)
- 감사 로그 확인
audit_logs에서entity=equipmentsCREATE/FAIL 기록 확인 가능.
불량유형을 등록/조회합니다. 이번 티켓은 삭제 제외.
- 불량유형 등록 (OPERATOR, processId 없이)
curl.exe -X POST "http://localhost:4000/api/v1/defect-types" ^ -H "Content-Type: application/json" ^ -H "x-company-id: COMPANY-A" ^ -H "x-role: OPERATOR" ^ -d "{\"name\":\"스크래치\",\"code\":\"DEF-001\",\"processId\":null,\"severity\":2,\"isActive\":1}"
- 같은 회사에서 code 중복 → 409(DEFECT_CODE_DUPLICATE)
- processId가 없거나 타사/없는 공정 → 400(DEFECT_PROCESS_NOT_FOUND)
- 불량유형 조회 (VIEWER도 가능)
curl.exe -X GET "http://localhost:4000/api/v1/defect-types" ^ -H "x-company-id: COMPANY-A" ^ -H "x-role: VIEWER"
- 실패 케이스 예시
- VIEWER로 등록 → 403
- 타사/없는 processId → 400(DEFECT_PROCESS_NOT_FOUND)
- 감사 로그 확인
audit_logs에서entity=defect_typesCREATE/FAIL 기록 확인 가능.
거래처를 등록/조회합니다. 이번 티켓은 삭제 제외.
- 거래처 등록 (OPERATOR)
curl.exe -X POST "http://localhost:4000/api/v1/partners" ^ -H "Content-Type: application/json" ^ -H "x-company-id: COMPANY-A" ^ -H "x-role: OPERATOR" ^ -d "{\"name\":\"ABC 상사\",\"code\":\"PART-001\",\"type\":\"CUSTOMER\",\"isActive\":1}"
- 같은 회사에서 code 중복 → 409(PARTNER_CODE_DUPLICATE)
- type이 CUSTOMER/VENDOR/BOTH가 아니면 400(PARTNER_TYPE_INVALID)
- 거래처 조회 (VIEWER도 가능)
curl.exe -X GET "http://localhost:4000/api/v1/partners" ^ -H "x-company-id: COMPANY-A" ^ -H "x-role: VIEWER"
- 실패 케이스 예시
- VIEWER로 등록 → 403
- 잘못된 type → 400(PARTNER_TYPE_INVALID)
- 감사 로그 확인
audit_logs에서entity=partnersCREATE/FAIL 기록 확인 가능.
장비/게이트웨이가 이벤트를 업로드하는 최소 API입니다.
- 이벤트 수신 (equipmentCode 필수)
curl.exe -X POST "http://localhost:4000/api/v1/telemetry/events" ^ -H "Content-Type: application/json" ^ -H "x-company-id: COMPANY-A" ^ -H "x-role: VIEWER" ^ # Ticket-08: VIEWER도 허용(장비 수신 목적) -d "{\"equipmentCode\":\"EQ-001\",\"timestamp\":\"2025-12-17T12:00:00+09:00\",\"eventType\":\"STATUS\",\"payload\":{\"state\":\"RUN\",\"speed\":120}}"
- equipmentCode 없으면 400(TELEMETRY_EQUIPMENT_CODE_REQUIRED)
- 해당 회사 설비 코드가 아니면 400(TELEMETRY_EQUIPMENT_NOT_FOUND)
- 이벤트 조회 (VIEWER 허용)
curl.exe -X GET "http://localhost:4000/api/v1/telemetry/events?limit=20" ^ -H "x-company-id: COMPANY-A" ^ -H "x-role: VIEWER"
- 실패 케이스 예시
- equipmentCode 누락 → 400
- 타사/없는 equipmentCode → 400
- limit가 숫자 아님/0/200 초과 → 400(TELEMETRY_LIMIT_INVALID)
- 감사 로그 확인
audit_logs에서entity=telemetry_eventsCREATE/FAIL 기록 확인 가능.
※ Ticket-09(보안 강화) 이후에는 Telemetry POST 시 추가 헤더 필요
x-device-key, x-ts(epoch), x-nonce, x-signature(HMAC-SHA256)
— 디바이스 키 발급 API(/api/v1/equipments/:id/device-key)로 key/secret을 받은 뒤 서명 계산(스모크 참고).
품질 검사 헤더와 불량 라인을 기록하는 최소 API입니다.
- 검사 등록 (OPERATOR)
curl.exe -X POST "http://localhost:4000/api/v1/quality/inspections" ^ -H "Content-Type: application/json" ^ -H "x-company-id: COMPANY-A" ^ -H "x-role: OPERATOR" ^ -d "{\"inspectionNo\":\"QI-2025-0001\",\"inspectionType\":\"FINAL\",\"status\":\"PASS\",\"processId\":1,\"equipmentId\":1}"
- 같은 회사에서 inspectionNo 중복 → 409(QUALITY_INSPECTION_NO_DUPLICATE)
- inspectionType/ status 값이 잘못되면 400
- 검사 조회 (VIEWER도 가능)
curl.exe -X GET "http://localhost:4000/api/v1/quality/inspections?limit=20" ^ -H "x-company-id: COMPANY-A" ^ -H "x-role: VIEWER"
- VIEWER 등록 차단 (403)
curl.exe -X POST "http://localhost:4000/api/v1/quality/inspections" ^ -H "Content-Type: application/json" ^ -H "x-company-id: COMPANY-A" ^ -H "x-role: VIEWER" ^ -d "{\"inspectionNo\":\"QI-VIEW-0001\",\"inspectionType\":\"FINAL\",\"status\":\"PASS\",\"processId\":1}"
- 불량 라인 등록 (OPERATOR)
curl.exe -X POST "http://localhost:4000/api/v1/quality/inspections/1/defects" ^ -H "Content-Type: application/json" ^ -H "x-company-id: COMPANY-A" ^ -H "x-role: OPERATOR" ^ -d "{\"defectTypeId\":1,\"qty\":2,\"note\":\"scratch\"}"
- 불량 라인 조회 (VIEWER도 가능)
curl.exe -X GET "http://localhost:4000/api/v1/quality/inspections/1/defects" ^ -H "x-company-id: COMPANY-A" ^ -H "x-role: VIEWER"
- 감사 로그 확인
audit_logs에서entity=quality_inspections와quality_inspection_defects의 CREATE/FAIL 기록 확인 가능.
검사 항목 마스터와 검사 결과(측정값/판정) 기록 API입니다.
- 검사 항목 등록 (OPERATOR)
curl.exe -X POST "http://localhost:4000/api/v1/quality/check-items" ^ -H "Content-Type: application/json" ^ -H "x-company-id: COMPANY-A" ^ -H "x-role: OPERATOR" ^ -d "{\"name\":\"중량\",\"code\":\"CHK-WEIGHT\",\"dataType\":\"NUMBER\",\"unit\":\"g\",\"lowerLimit\":95,\"upperLimit\":105,\"isRequired\":1}"
- 같은 회사에서 code 중복 → 409(QUALITY_CHECK_ITEM_CODE_DUPLICATE)
- 검사 항목 조회 (VIEWER도 가능)
curl.exe -X GET "http://localhost:4000/api/v1/quality/check-items" ^ -H "x-company-id: COMPANY-A" ^ -H "x-role: VIEWER"
- VIEWER 등록 차단 (403)
curl.exe -X POST "http://localhost:4000/api/v1/quality/check-items" ^ -H "Content-Type: application/json" ^ -H "x-company-id: COMPANY-A" ^ -H "x-role: VIEWER" ^ -d "{\"name\":\"염도\",\"code\":\"CHK-SALT\",\"dataType\":\"NUMBER\",\"unit\":\"pct\",\"lowerLimit\":2,\"upperLimit\":4,\"isRequired\":1}"
- 검사 결과 등록 (측정값이 규격 밖 → FAIL 판정)
curl.exe -X POST "http://localhost:4000/api/v1/quality/inspections/1/results" ^ -H "Content-Type: application/json" ^ -H "x-company-id: COMPANY-A" ^ -H "x-role: OPERATOR" ^ -d "{\"checkItemCode\":\"CHK-WEIGHT\",\"measuredValue\":200,\"note\":\"범위 초과 테스트\"}"
- 검사 결과 조회
curl.exe -X GET "http://localhost:4000/api/v1/quality/inspections/1/results?limit=20" ^ -H "x-company-id: COMPANY-A" ^ -H "x-role: VIEWER"
- 타사 검사 항목으로 결과 등록(400)
curl.exe -X POST "http://localhost:4000/api/v1/quality/inspections/1/results" ^ -H "Content-Type: application/json" ^ -H "x-company-id: COMPANY-A" ^ -H "x-role: OPERATOR" ^ -d "{\"checkItemCode\":\"CHK-WEIGHT-B\",\"measuredValue\":100}"
LOT 마스터 생성과 계보(Trace) 조회 API입니다.
- LOT 생성 (OPERATOR)
curl.exe -X POST "http://localhost:4000/api/v1/lots" ^ -H "Content-Type: application/json" ^ -H "x-company-id: COMPANY-A" ^ -H "x-role: OPERATOR" ^ -d "{\"lotNo\":\"LOT-A-001\",\"itemId\":1,\"qty\":10,\"unit\":\"EA\",\"status\":\"CREATED\"}"
- 같은 회사에서 lotNo 중복 → 409(LOT_NO_DUPLICATE)
- itemId가 없거나 타사 → 400(LOT_ITEM_NOT_FOUND)
- 자식 LOT 생성
curl.exe -X POST "http://localhost:4000/api/v1/lots" ^ -H "Content-Type: application/json" ^ -H "x-company-id: COMPANY-A" ^ -H "x-role: OPERATOR" ^ -d "{\"lotNo\":\"LOT-A-001-CH1\",\"itemId\":1,\"parentLotNo\":\"LOT-A-001\",\"qty\":5,\"unit\":\"EA\",\"status\":\"CREATED\"}"
- VIEWER 생성 차단 (403)
curl.exe -X POST "http://localhost:4000/api/v1/lots" ^ -H "Content-Type: application/json" ^ -H "x-company-id: COMPANY-A" ^ -H "x-role: VIEWER" ^ -d "{\"lotNo\":\"LOT-V-001\",\"itemId\":1,\"qty\":1,\"unit\":\"EA\",\"status\":\"CREATED\"}"
- 잘못된 itemId(400)
curl.exe -X POST "http://localhost:4000/api/v1/lots" ^ -H "Content-Type: application/json" ^ -H "x-company-id: COMPANY-A" ^ -H "x-role: OPERATOR" ^ -d "{\"lotNo\":\"LOT-BADITEM-001\",\"itemId\":999999,\"qty\":1,\"unit\":\"EA\",\"status\":\"CREATED\"}"
- Trace 조회 (200)
curl.exe -X GET "http://localhost:4000/api/v1/lots/LOT-A-001/trace?direction=down&depth=3" ^ -H "x-company-id: COMPANY-A" ^ -H "x-role: VIEWER"
- 감사 로그 확인
audit_logs에서entity=lotsCREATE/FAIL 기록 확인 가능.
작업지시와 LOT을 연결하는 최소 운영형 API입니다.
- 링크 생성 (OPERATOR)
curl.exe -X POST "http://localhost:4000/api/v1/work-orders/1/lots/1/link" ^ -H "x-company-id: COMPANY-A" ^ -H "x-role: OPERATOR"
- 같은 링크가 이미 있으면 409(WO_LOT_LINK_DUPLICATE)
- VIEWER 차단 (403)
curl.exe -X POST "http://localhost:4000/api/v1/work-orders/1/lots/1/link" ^ -H "x-company-id: COMPANY-A" ^ -H "x-role: VIEWER"
- 타사 workOrder/lot 사용 (400)
curl.exe -X POST "http://localhost:4000/api/v1/work-orders/999/lots/999/link" ^ -H "x-company-id: COMPANY-A" ^ -H "x-role: OPERATOR"
- 변경 사항 확인:
git status - 파일 추가/갱신 상태 확인:
git status -sb(요약) - 새 파일 스테이징:
git add 파일명 - 커밋 만들기:
git commit -m "메시지" - GitHub로 올리기:
git push origin main(처음 푸시하는 경우 브랜치 이름을 확인하세요. 기본은main)
운영 단계에서는 태그 오타/중복을 줄이기 위해 자동 스크립트를 사용하는 것을 권장합니다.
- 다음 baseline 태그 계산만(출력만)
pwsh .\tools\baseline-tag.ps1- 릴리즈 게이트 원클릭(DryRun)
$env:MES_MASTER_KEY="dev-master-key"
pwsh .\tools\release-gate.ps1- 태그 생성 + 원격 푸시까지
$env:MES_MASTER_KEY="dev-master-key"
pwsh .\tools\release-gate.ps1 -ApplyTag -PushTag- 프로젝트 목표와 요구사항을 정리한 문서 추가 (예:
docs/requirements.md) - 백엔드/프론트엔드 선택 후 폴더 구조 잡기 (예:
backend/,frontend/) - 테스트 자동화 도입 (예: Jest, Vitest, Pytest 등 스택에 맞춰 선택)
필요한 스택이나 세부 구조를 알려주시면, 거기에 맞춘 설정 파일과 예제 코드를 더 추가해드리겠습니다.
조회 전용 리포트 API입니다. 데이터가 없어도 200으로 응답합니다.
- 요약 리포트 (summary)
curl.exe -X GET "http://localhost:4000/api/v1/reports/summary?from=2025-01-01&to=2025-01-07" `
-H "x-company-id: COMPANY-A" `
-H "x-role: VIEWER"- 일별 리포트 (daily)
curl.exe -X GET "http://localhost:4000/api/v1/reports/daily?from=2025-01-01&to=2025-01-07" `
-H "x-company-id: COMPANY-A" `
-H "x-role: VIEWER"- 불량 상위 리포트 (top-defects)
curl.exe -X GET "http://localhost:4000/api/v1/reports/top-defects?from=2025-01-01&to=2025-01-07&limit=5" `
-H "x-company-id: COMPANY-A" `
-H "x-role: VIEWER"- 잘못된 날짜 형식 (400)
curl.exe -X GET "http://localhost:4000/api/v1/reports/summary?from=2025-99-99&to=2025-01-01" `
-H "x-company-id: COMPANY-A" `
-H "x-role: VIEWER"- 잘못된 날짜 범위 (400)
curl.exe -X GET "http://localhost:4000/api/v1/reports/daily?from=2025-12-31&to=2025-01-01" `
-H "x-company-id: COMPANY-A" `
-H "x-role: VIEWER"- limit 범위 초과 (400)
curl.exe -X GET "http://localhost:4000/api/v1/reports/top-defects?limit=999" `
-H "x-company-id: COMPANY-A" `
-H "x-role: VIEWER"대시보드 위젯용 조회 API입니다. 조회 전용이라 VIEWER도 사용 가능합니다.
- 대시보드 요약(overview)
curl.exe -X GET "http://localhost:4000/api/v1/dashboard/overview?days=7" `
-H "x-company-id: COMPANY-A" `
-H "x-role: VIEWER"- 대시보드 활동(activity)
curl.exe -X GET "http://localhost:4000/api/v1/dashboard/activity?days=14" `
-H "x-company-id: COMPANY-A" `
-H "x-role: VIEWER"- 대시보드 알림(alerts)
curl.exe -X GET "http://localhost:4000/api/v1/dashboard/alerts?limit=5" `
-H "x-company-id: COMPANY-A" `
-H "x-role: VIEWER"- 잘못된 days (400)
curl.exe -X GET "http://localhost:4000/api/v1/dashboard/activity?days=0" `
-H "x-company-id: COMPANY-A" `
-H "x-role: VIEWER"- 잘못된 limit (400)
curl.exe -X GET "http://localhost:4000/api/v1/dashboard/alerts?limit=999" `
-H "x-company-id: COMPANY-A" `
-H "x-role: VIEWER"- 멀티테넌트 분리 확인 (COMPANY-B 조회)
curl.exe -X GET "http://localhost:4000/api/v1/dashboard/overview?days=7" `
-H "x-company-id: COMPANY-B" `
-H "x-role: VIEWER"대시보드 KPI 심화 조회 API입니다. 조회 전용이라 VIEWER도 사용 가능합니다.
- KPI 요약(kpis)
curl.exe -X GET "http://localhost:4000/api/v1/dashboard/kpis?from=2025-01-01&to=2025-01-07" `
-H "x-company-id: COMPANY-A" `
-H "x-role: VIEWER"- 일별 추이(trends/daily)
curl.exe -X GET "http://localhost:4000/api/v1/dashboard/trends/daily?from=2025-01-01&to=2025-01-07" `
-H "x-company-id: COMPANY-A" `
-H "x-role: VIEWER"- 불량 Top N(top/defects)
curl.exe -X GET "http://localhost:4000/api/v1/dashboard/top/defects?from=2025-01-01&to=2025-01-07&limit=5" `
-H "x-company-id: COMPANY-A" `
-H "x-role: VIEWER"- 알람(결함률 임계치)
curl.exe -X GET "http://localhost:4000/api/v1/dashboard/alerts?from=2025-01-01&to=2025-01-07&defectRateThreshold=0.05" `
-H "x-company-id: COMPANY-A" `
-H "x-role: VIEWER"- 잘못된 날짜 형식 (400)
curl.exe -X GET "http://localhost:4000/api/v1/dashboard/kpis?from=2025-99-99&to=2025-01-07" `
-H "x-company-id: COMPANY-A" `
-H "x-role: VIEWER"- 잘못된 날짜 범위 (400)
curl.exe -X GET "http://localhost:4000/api/v1/dashboard/trends/daily?from=2025-01-07&to=2025-01-01" `
-H "x-company-id: COMPANY-A" `
-H "x-role: VIEWER"