### A. Dabory API 는 POST만 사용한다.
Dabory ERP의 모든 API는 단순성과 보안성을 지향하므로 모은 REST POST 만 사용한다.

### B. 모든 API는 GateToken 사용과 구성
1. API는 타켓 DB의 접근 정보를 PKI 암호화한 BeforeBase64 Key로만 GateToken을 발급받을 수 있다. (Libsodium 참조)
2. 기본적으로 DaborySSO 를 사용하기를 권장하나 Key Pair를 API 서버의 환경변수에 저장하여 SSO 서버에 독립적으로 사용이 가능하다.
3. 모든 Frontend Server는 ClientId 값을 가지며 DaborySSO 에서 App 레코드를 만드는 과정에서 생성이 가능하다.
4. Client(Frontend)의 사용자별로 발급된 GateToken은 API 서버의 메모리 DB에 저장이 되며 유효기간 설정이 가능하다.

### C. Gate Token은  인증 이후의  API의 HTML Header에 모두 포함되어야 한다.
GateToken should be included in every REST API request after GateToken authentication.

[주요 참고 사항 : GateToken (20자리랜덤 Alphonumeric) 은 Request Header 다음과 같이 추가되어 송신되어야 한다.]
GateToken is 20 charaters length and to be added in API Request Header as follow:

req.Header.Add("GateToken", gateToken)

### D. Abango 에서의 기본 API 용어
*  row : DB table record
* page : row 의 복수 = rows : a pack of row
일반적으로  query request and response 는  page unit 으로
* book : page의 복수 = pages : a pack of pages

(1)일반적으로 1개의 수주전표, 매출 전표는 book 단위로 처리되고 transaction 처리됨.
Generally, 1 Sales order slip or Sales invoice are processed (Insert/Update/Delete) as "Book" Unit with "Transaction Process"

(2)입력/수정/삭제는 book 단위로  처리된다.
sorder book : HeaderPage + BodyPage + FooterPage

### E. 개별 Table 단위의 Pick / Action / Page API 의 분리
1. Pick : 한개 또는 다수개의 record을 개별 id 값으로 pick-up 해오는 API
2. Action : 한개 또는 다수개의 record을 Insert/Update/Delete 하는 실행 API
3. Page : 하나의 Select 쿼리로 해당 테이블을 레코드를 2차원적으로 가져오는 리스트 API

### F. Action Query Page 사용 방법 : Id에 부호값을 넣는 방법으로 구분함.

Id = 0 : Insert

Id > 0: Update

Id < 0 : Delete ; 이경우 Id 이외의 필드는 없어도 처리가능함. ( delete can be done without the other field )

### G. API  공용 Json Structure

```json
"PageVars": {
  "QueryCnt": "string", //Response 시에만 유효한 값, Where 절에 걸리느 Row Count - Request 시에 지정할 필요없슴.
  "Query": "string", //Query의  Where Clause 의 내용 똑같은 문법으로 지정 가능함. And / Or 조건 지정 가능
  "Fields": "string", // 가져올 필드를 지정함, 필드자체를 뺄수는 없으나, 해당값을 Empty 처리해줌. 지정하지 않으면 전체를 넣어줌
  "Asc": "string", // ORDER BY  *** ASC  지정가능
  "Desc": "int",  // ORDER BY  *** DESC  지정가능
  "Limit": "int", // 한번 페이징에서 가져오는 Row  갯수,  반드시 지정필요, 10개 Default
  "Offset": "int", // Where로 필터된 rows 중 가져오는 첫번째 레코드 레코드 옵셋 지정 가능
  "ReturnJson": "string", //일반적으로 필터링 하는 지정 조건 값을 서버로 보냈다가 받을 수 있다.
}
```

### H. 개별 Field  설명

a. QueryCnt

b. Query 

    ex) 단일테이블인 경우 id >0 and id <300

    x) 테이블이 조인으로 연결되어 있을 경우 dbr_company.id 처럼 테이블을 명시해줘야 한다.

그렇지않으면  ambigous field  Error 가 난다.


c. Field 

    ex) id, company_name, created_at

d. Asc 

    ex) company_name, created_at

e. Desc 

    ex) company_name, created_at

f. Limit

g. Offset

        예) 전체 1000개에서 31부터 가져올 경우 30 지정

h. ReturnJson :  
 1) 일반적으로 필터링 하는 지정 조건 값을 서버로 보냈다가 받을 수 있다. 
 
 2) Ajax 로 처리 않는 List 의 경우 페이지가 갱신되면서 이전 쿼리 조건값을 잃어버리는 경우가 있는데 이것을 Json 값으로 만들어 서버에 보내는 순간 페이지는 해당 값을 잃어버리기
때문에 똑같은 값을 서버에서 돌려 받아서 현재 리스트의 조건을 이전과 동일하게 구성하게 하기 위해서 사용되는 필드.

 3) 일반적으로 Json 값을 Base64 Encode 해서 보낸다음  받을때는 해당 값을 Base64 Decode 해서 쓰는 것을 권장함.
Frontend 에서의 Json 구조는 각 리스트의 특성에 따라 Frontend에서 구성해서 사용 가능.

 