공지사항 게시판을 만들어 보자..
...
GET {{protocol}}://{{hostname}}:{{port}}/node/nodeType/noticeBoard
GET {{protocol}}://{{hostname}}:{{port}}/node/nodeType/read.json?id=noticeBoard
GET {{protocol}}://{{hostname}}:{{port}}/node/nodeType/list.json?id_matching=noticeBoard
GET {{protocol}}://{{hostname}}:{{port}}/node/propertyType/list.json?tid_matching=noticeBoard
...
primary key 가 없으면
, 없으면 있으면Status colour Red title create
처리Status colour Yellow title update
...
Custom API
api Cartegory
id, categoryName 작성
Code Block | ||
---|---|---|
| ||
[ { "typeId": "apiCategory", "id": "notice", "categoryName": "Notice Board API", "dateFormat": "yyyy-MM-dd HH:mm:ss", "fileUrlFormat": { "default": "{{:getEnvValue('core.cluster.api-url-prefix')}}" }, "commonParameters": [ { "parameter": "apiKey", "required": false } ], "commonResponse": [ { "field": "time", "type": "field", "value": "{{:sysdate}}" } ] } ] |
...
...
Status | |||
---|---|---|---|
| |||
|
Info |
---|
GET {{protocol}}://{{hostname}}:{{port}}/svc/notice/list |
ParamsApi Schema
...
Code Block |
---|
...
page
...
pageSize
Config
type : query
cacheable : true / cacheType : 60 → API 결과를 60초간 캐싱
Response
아래와 같이 api 응답결과의 필드를 지정할수도 있고, 모든 필드를 반환할 수도 있다.
Code Block | ||
---|---|---|
| ||
{ "fieldtypeId": "idapi", "typecategory": "fieldnotice", "valueapiId": "list", }, {"apiName": "공지사항 리스트", "fieldapiType": "titleservice", "typemethod": "fieldGET", "valueparameters": ""[ } ] | ||
Code Block | ||
"response, "config": [ { "fieldconfigId": "_all_root", "typetid": "allnoticeBoard", } ] |
...
language | json |
---|
...
" |
...
type": " |
...
query", " |
...
allowParams": |
...
false, " |
...
orderNo": |
...
1, |
...
|
...
|
...
|
...
" |
...
cacheable": |
...
true, |
...
|
...
|
...
" |
...
cacheTime": |
...
60, |
...
" |
...
query": [ |
...
|
...
{ |
...
|
...
" |
...
method": " |
...
matching", |
...
|
...
" |
...
field": |
...
"enable", |
...
|
...
|
...
" |
...
value": |
...
"true" |
...
}, { "method": "matching", "field": " |
...
title", "value": " |
...
{{:title}}" }, { "method": "sorting", "value": "{{:sorting}},id desc" }, { "method": "page", "value": "{{:page}}" }, { "method": "pageSize", "value": "{{:pageSize}}" } ], "response": [ { "field": "id", "type": "field", "value": "" }, { "field": "title", "type": "field", "value": "" }, { "field": "owner", "type": "field", "value": "" }, { "field": "created", "type": "field", "value": "" } ] } ] } |
Status | ||
---|---|---|
|
...
language | json |
---|
Status | ||
---|---|---|
|
...
language | json |
---|
Status | ||
---|---|---|
|
...
ApiType
service : context path “svc”를 사용
Params
title
sorting
page
pageSize
Config
type : query → noticeBoard 에 query 검색
cacheable : true / cacheType : 60 → API 결과를 60초간 캐싱
Response
아래와 같이 api 응답결과의 필드를 지정할수도 있고, 모든 필드를 반환할 수도 있다.
Code Block |
---|
"response": [
{
"field": "id",
"type": "field",
"value": ""
},
{
"field": "title",
"type": "field",
"value": ""
}
] |
Code Block |
---|
"response": [
{
"field": "_all_",
"type": "all"
}
] |
Api Result
Code Block |
---|
{
"result": "200",
"resultMessage": "SUCCESS",
"totalCount": 2,
"totalTypeCount": 2,
"resultCount": 2,
"pageSize": 10,
"pageCount": 1,
"currentPage": 1,
"items": [
{
"id": 1716647245,
"title": "공지합니다. (수정)",
"owner": {
"value": "anonymous",
"label": "Anonymous User",
"refId": "user::anonymous"
},
"created": "2020-07-30 15:38:09"
},
{
"id": 429034766,
"title": "ID 있으면 update, 없으면 create",
"owner": {
"value": "anonymous",
"label": "Anonymous User",
"refId": "user::anonymous"
},
"created": "2020-07-30 15:40:11"
}
]
} |
Paging
Param 으로 page, pageSize 가 들어오면 페이징 처리
Response 응답 결과에 페이징 관련 필드 함께 내려옴
totalCount : 검색된 결과 페이징 제외된 순수 카운트
totalTypeCount : noticeBoard nodeType의 데이터 노드리스트 카운트
resultCount : Response 결과 카운트
pageSize : 페이징 기준 사이즈
pageCount : 페이징 된 페이지 건수
currentPage : 현재 페이지 번호
Code Block |
---|
{
"result": "200",
"resultMessage": "SUCCESS",
"totalCount": 38,
"totalTypeCount": 489,
"resultCount": 10,
"pageSize": 10,
"pageCount": 4,
"currentPage": 1,
"items": [
{
"id": 1716647245,
"title": "공지합니다. (수정)",
"owner": {
"value": "anonymous",
"label": "Anonymous User",
"refId": "user::anonymous"
},
"created": "2020-07-30 15:38:09"
}
...
]
} |
...
Status | ||||
---|---|---|---|---|
|
Info |
---|
GET {{protocol}}://{{hostname}}:{{port}}/svc/notice/read |
Api Schema
Code Block | ||
---|---|---|
| ||
{
"typeId": "api",
"category": "notice",
"apiId": "read",
"apiName": "공지사항 조회",
"apiType": "service",
"method": "GET",
"parameters": [
{
"parameter": "id",
"name": "ID",
"valueType": "STRING",
"required": true
}
],
"config": [
{
"configId": "root",
"tid": "noticeBoard",
"type": "query",
"resultType": "OBJECT",
"allowParams": false,
"orderNo": 1,
"cacheable": true,
"cacheTime": 60,
"query": [
{
"method": "matching",
"field": "enable",
"value": "true"
},
{
"method": "matching",
"field": "id",
"value": "{{:id}}"
}
],
"response": [
{
"field": "_all_",
"type": "all"
}
]
}
]
} |
ApiType
service : context path “svc”를 사용
Parameters
id (required)
Config
resultType : OBJECT
query list 결과 ArrayList [ ] 를 Object { } 로 반환
Api Result
Code Block |
---|
{
"result": "200",
"resultMessage": "SUCCESS",
"item": {
"id": 1716647245,
"label": "공지합니다. (수정)",
"title": "공지합니다. (수정)",
"content": "내용내용 ",
"file": "http://local.i-on.net:8080/noticeBoard/file/202007/30/143f2cdb-da84-4794-8817-2d0b2f0de994.png",
"enable": true,
"owner": {
"value": "anonymous",
"label": "Anonymous User",
"refId": "user::anonymous"
},
"created": "2020-07-30 15:38:09",
"modifier": {
"value": "anonymous",
"label": "Anonymous User",
"refId": "user::anonymous"
},
"changed": "2020-07-30 15:38:09"
}
} |
...
Status | ||||
---|---|---|---|---|
|
Info |
---|
GET {{protocol}}://{{hostname}}:{{port}}/adm/notice/boardList |
Code Block | ||
---|---|---|
| ||
{
"typeId": "api",
"category": "notice",
"apiId": "boardList",
"apiName": "공지사항 리스트",
"apiType": "admin",
"method": "GET",
"parameters": [
],
"config": [
{
"configId": "root",
"tid": "noticeBoard",
"type": "query",
"allowParams": false,
"orderNo": 1,
"cacheable": false,
"query": [
{
"method": "matching",
"field": "enable",
"value": "{{:enable}}"
},
{
"method": "matching",
"field": "title",
"value": "{{:title}}"
},
{
"method": "sorting",
"value": "{{:sorting}},id desc"
},
{
"method": "page",
"value": "{{:page}}"
},
{
"method": "pageSize",
"value": "{{:pageSize}}"
}
],
"response": [
{
"field": "id",
"type": "field",
"value": ""
},
{
"field": "title",
"type": "field",
"value": ""
},
{
"field": "title",
"type": "field",
"value": ""
},
{
"field": "owner",
"type": "field",
"value": ""
},
{
"field": "created",
"type": "field",
"value": ""
}
]
}
]
} |
ApiType
admin : context path “adm”을 사용
/svc/ 로 call하면 아래와 같다.
Code Block |
---|
{
"result": "500",
"resultMessage": "지원하지 않는 API Type 입니다. : admin"
} |
Params
enable
title
sorting
page
pageSize
Config
type : query
cacheable : false → API 결과를 캐싱하지 않음. 캐시 딜레이 없이 관리자가 실시간으로 조회 처리 가능.
...
Status | ||||
---|---|---|---|---|
|
Info |
---|
POST {{protocol}}://{{hostname}}:{{port}}/adm/notice/updateStatus |
Api Schema
Code Block | ||
---|---|---|
| ||
{
"typeId": "api",
"category": "notice",
"apiId": "updateStatus",
"apiName": "공지사항 상태 변경",
"apiType": "admin",
"method": "POST",
"parameters": [
{
"parameter": "id",
"name": "ID",
"valueType": "STRING",
"required": true
},
{
"parameter": "enable",
"name": "사용 여부",
"valueType": "STRING",
"required": true
}
],
"config": [
{
"configId": "root",
"tid": "noticeBoard",
"type": "event",
"allowParams": false,
"orderNo": 1,
"event": "update",
"data": [
{
"field": "id",
"value": "{{:id}}"
},
{
"field": "enable",
"value": "{{:enable}}"
}
]
}
]
} |
Params
id
enable
Config
type : event → noticeBoard 의 event call
event : update
data에 params 를 셋해서 update 실행
Api Result
Code Block |
---|
{
"result": "200",
"resultMessage": "SUCCESS",
"item": {
"id": "1716647245",
"lable": "공지합니다. (수정)",
"title": "공지합니다. (수정)",
"content": "내용내용 ",
"file": "http://local.i-on.net:8080/noticeBoard/file/202007/30/143f2cdb-da84-4794-8817-2d0b2f0de994.png",
"enable": false,
"owner": {
"value": "anonymous",
"label": "Anonymous User",
"refId": "user::anonymous"
},
"created": "2020-07-30 15:38:09",
"modifier": {
"value": "anonymous",
"label": "Anonymous User",
"refId": "user::anonymous"
},
"changed": "2020-07-30 17:19:55"
}
} |
...
Status | ||||
---|---|---|---|---|
|
Info |
---|
POST {{protocol}}://{{hostname}}:{{port}}/adm/notice/test |
Api Schema
Code Block |
---|
{
"typeId": "api",
"category": "notice",
"apiId": "test",
"apiName": "서비스 작성 이벤트 실행",
"apiType": "admin",
"method": "POST",
"parameters": [
],
"config": [
{
"configId": "root",
"tid": "noticeBoard",
"type": "event",
"allowParams": false,
"orderNo": 1,
"event": "testEvent"
}
]
} |
Config
type : event
event : testEvent → 별도 이벤트 작성
NodeType Schema 에 Event 추가
Code Block |
---|
[
{
"typeId": "nodeType",
"parentId": "root",
"tid": "noticeBoard",
"typeName": "게시판",
"repositoryType": "node",
"tableName": "",
"propertyTypes": [
],
"events": [
{
"event": "testEvent",
"name": "테스트 이벤트",
"noneExecute": true,
"eventActions": [
{
"action": "testAction",
"actionName": "테스트 이벤트 작성",
"actionType": "service",
"actionBody": "noticeBoardService.test",
"order": 1
}
]
}
]
}
] |
Events
event : 기본 event 명 (create,update,delete 등)을 제외한 유니크한 아이디로 작성
EventActions
actionType : service
actionBody : noticeboardService.test → @Service annotation name.method
Service Java 작성
Code Block |
---|
package net.ion.ice.services.commerce;
import net.ion.ice.core.api.ApiException;
import net.ion.ice.core.context.ExecuteContext;
import net.ion.ice.core.query.QueryResult;
import org.springframework.stereotype.Service;
import java.util.LinkedHashMap;
import java.util.Map;
@Service("noticeBoardService")
public class NoticeBoardService {
public void test(ExecuteContext context) {
Map<String, Object> params = context.getData();
// 코딩
//Error 처리
if (false) {
throw new ApiException("404", "Not Found Data");
}
//Response Result 세팅
QueryResult result = new QueryResult();
result.setResult("201");
result.setResultMessage("서비스 성공");
Map<String, Object> map = new LinkedHashMap<>();
map.put("a", "1");
map.put("b", "2");
map.put("c", "3");
result.setItem(map);
result.put("apple", "사과");
context.setResult(result);
}
}
|
Event 에서 사용할 Service
@Service annotation 필수
event에서 직접 호출할 method 는 반드시 ExecuteContext 를 인자로 갖는다.
public void test(ExecuteContext context)
Api Result
Code Block |
---|
{
"result": "201",
"resultMessage": "서비스 성공",
"item": {
"a": "1",
"b": "2",
"c": "3"
},
"apple": "사과"
} |
Code Block |
---|
{
"result": "404",
"resultMessage": "Not Found Data"
} |