create-entity-server 0.0.25 → 0.0.27

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (80) hide show
  1. package/package.json +1 -1
  2. package/template/.env.example +38 -0
  3. package/template/configs/auth/cors.json +15 -0
  4. package/template/configs/auth/identity.json +27 -0
  5. package/template/configs/auth/jwt.json +12 -0
  6. package/template/configs/{oauth.json → auth/oauth.json} +7 -4
  7. package/template/configs/auth/password.json +33 -0
  8. package/template/configs/auth/privacy_policy.json +28 -0
  9. package/template/configs/{security.json → auth/security.json} +4 -2
  10. package/template/configs/auth/two_factor.json +12 -0
  11. package/template/configs/database.json +0 -159
  12. package/template/configs/database.json.example +186 -0
  13. package/template/configs/extensions/backup.json +46 -0
  14. package/template/configs/extensions/pg.json +37 -0
  15. package/template/configs/extensions/storage.json +148 -0
  16. package/template/configs/extensions/tax-invoice.json +59 -0
  17. package/template/configs/keys/.gitkeep +0 -0
  18. package/template/configs/keys/apns.p8.example +7 -0
  19. package/template/configs/keys/firebase.pem.example +7 -0
  20. package/template/configs/notification/alimtalk.json +75 -0
  21. package/template/configs/{push.json → notification/push.json} +1 -2
  22. package/template/configs/notification/sms.json +54 -0
  23. package/template/configs/notification/smtp.json +43 -0
  24. package/template/configs/server.json +2 -0
  25. package/template/entities/README.md +20 -23
  26. package/template/entities/System/Auth/account.json +17 -1
  27. package/template/entities/System/Auth/account_audit.json +23 -0
  28. package/template/entities/System/Auth/account_device.json +63 -0
  29. package/template/entities/System/Auth/account_login_log.json +54 -0
  30. package/template/entities/System/Auth/account_oauth.json +45 -0
  31. package/template/entities/System/Auth/api_keys.json +1 -1
  32. package/template/entities/System/Auth/identity_verification.json +95 -0
  33. package/template/entities/System/Auth/license.json +1 -1
  34. package/template/entities/System/Auth/password_history.json +20 -0
  35. package/template/entities/System/Auth/rbac_roles.json +1 -1
  36. package/template/entities/System/Backup/backup_log.json +62 -0
  37. package/template/entities/System/Email/smtp_log.json +83 -0
  38. package/template/entities/System/Email/smtp_msg.json +104 -0
  39. package/template/entities/System/Notification/alimtalk_log.json +45 -0
  40. package/template/entities/System/Notification/alimtalk_msg.json +39 -0
  41. package/template/entities/System/Notification/friendtalk_log.json +48 -0
  42. package/template/entities/System/Notification/friendtalk_msg.json +63 -0
  43. package/template/entities/System/Notification/sms_log.json +26 -0
  44. package/template/entities/System/Notification/sms_msg.json +52 -0
  45. package/template/entities/System/Notification/sms_verification.json +40 -0
  46. package/template/entities/System/Payment/pg_cancel.json +45 -0
  47. package/template/entities/System/Payment/pg_order.json +88 -0
  48. package/template/entities/System/Payment/pg_webhook_log.json +37 -0
  49. package/template/entities/System/Push/push_log.json +71 -0
  50. package/template/entities/System/Push/push_msg.json +55 -0
  51. package/template/entities/System/Storage/file_backup_log.json +46 -0
  52. package/template/entities/System/Storage/file_download_log.json +41 -0
  53. package/template/entities/System/Storage/file_meta.json +59 -0
  54. package/template/entities/System/system_audit_log.json +2 -1
  55. package/template/entities/company.json +1 -1
  56. package/template/entities/{product.json → goods.json} +6 -10
  57. package/template/entities/todo.json +1 -1
  58. package/template/samples/entities/README.md +2 -2
  59. package/template/scripts/generate-env-keys.sh +16 -0
  60. package/template/templates/email/account/dormancy_warning.html +20 -0
  61. package/template/templates/email/account/password_expiry_warning.html +21 -0
  62. package/template/templates/email/auth/2fa_disabled.html +23 -0
  63. package/template/templates/email/auth/2fa_recovery_regenerated.html +31 -0
  64. package/template/templates/email/auth/2fa_setup_complete.html +43 -0
  65. package/template/templates/email/auth/email_verification.html +18 -0
  66. package/template/templates/email/auth/force_reset.html +18 -0
  67. package/template/templates/email/auth/password_reset.html +19 -0
  68. package/template/templates/email/auth/verification.html +15 -0
  69. package/template/templates/email/auth/verification_link.html +25 -0
  70. package/template/templates/email/auth/welcome.html +18 -0
  71. package/template/templates/email/backup/backup_completed.html +35 -0
  72. package/template/templates/email/backup/backup_failed.html +27 -0
  73. package/template/templates/email/backup/backup_partial.html +31 -0
  74. package/template/templates/email/layout.html +47 -0
  75. package/template/templates/email/order/order_confirmation.html +30 -0
  76. package/template/templates/email/storage/storage_quota_exceeded.html +37 -0
  77. package/template/templates/email/storage/storage_quota_warning.html +37 -0
  78. package/template/configs/cors.json +0 -7
  79. package/template/configs/jwt.json +0 -8
  80. package/template/entities/Account/account_audit.json +0 -16
@@ -0,0 +1,48 @@
1
+ {
2
+ "name": "friendtalk_log",
3
+ "description": "친구톡(브랜드메시지) 발송 로그 — 워커가 소비하는 DB 큐 역할을 합니다. 사용자 환경에 맞게 index·fields를 자유롭게 확장할 수 있습니다.",
4
+ "history": false,
5
+ "read_only": true,
6
+ "compress": true,
7
+ "index": {
8
+ "status": {
9
+ "type": ["pending", "processing", "sent", "failed", "expired"],
10
+ "default": "pending",
11
+ "comment": "발송 상태"
12
+ },
13
+ "msg_type": {
14
+ "type": [
15
+ "text",
16
+ "image",
17
+ "wide_image",
18
+ "wide_item_list",
19
+ "carousel"
20
+ ],
21
+ "default": "text"
22
+ },
23
+ "receiver": { "comment": "수신자 전화번호", "required": true },
24
+ "friendtalk_msg_seq": { "comment": "friendtalk_msg 참조 seq" }
25
+ },
26
+ "fields": {
27
+ "content": { "type": "text", "comment": "메시지 본문" },
28
+ "image_url": { "comment": "이미지 URL" },
29
+ "image_link": { "comment": "이미지 클릭 시 이동 URL" },
30
+ "is_ad": {
31
+ "type": "bool",
32
+ "default": true,
33
+ "comment": "광고성 메시지 여부"
34
+ },
35
+ "buttons_json": { "type": "text", "comment": "버튼 목록 JSON" },
36
+ "carousel_json": { "type": "text", "comment": "캐러셀 데이터 JSON" },
37
+ "items_json": {
38
+ "type": "text",
39
+ "comment": "와이드 아이템 리스트 JSON"
40
+ },
41
+ "header": { "comment": "와이드 아이템 리스트 헤더" },
42
+ "provider": { "comment": "사용 프로바이더" },
43
+ "provider_msg_id": { "comment": "프로바이더 메시지 ID" },
44
+ "error_message": { "type": "text", "comment": "오류 메시지" },
45
+ "retry_count": { "type": "uint", "default": 0 },
46
+ "sent_at": { "type": "string" }
47
+ }
48
+ }
@@ -0,0 +1,63 @@
1
+ {
2
+ "name": "friendtalk_msg",
3
+ "description": "친구톡(브랜드메시지) 발송 트리거 엔티티 — Hook 또는 API를 통해 생성되면 친구톡 발송이 시작됩니다. 사용자 환경에 맞게 index·fields를 자유롭게 확장할 수 있습니다.",
4
+ "history": false,
5
+ "index": {
6
+ "receiver": { "comment": "수신자 전화번호", "required": true },
7
+ "msg_type": {
8
+ "type": [
9
+ "text",
10
+ "image",
11
+ "wide_image",
12
+ "wide_item_list",
13
+ "carousel"
14
+ ],
15
+ "default": "text"
16
+ },
17
+ "status": {
18
+ "type": ["pending", "processing", "sent", "failed"],
19
+ "default": "pending"
20
+ }
21
+ },
22
+ "fields": {
23
+ "content": {
24
+ "type": "text",
25
+ "required": true,
26
+ "comment": "메시지 본문"
27
+ },
28
+ "image_url": { "comment": "이미지 URL" },
29
+ "image_link": { "comment": "이미지 클릭 시 이동 URL" },
30
+ "is_ad": {
31
+ "type": "bool",
32
+ "default": true,
33
+ "comment": "광고성 메시지 여부"
34
+ },
35
+ "buttons_json": { "type": "text", "comment": "버튼 목록 JSON" },
36
+ "carousel_json": { "type": "text", "comment": "캐러셀 데이터 JSON" },
37
+ "items_json": {
38
+ "type": "text",
39
+ "comment": "와이드 아이템 리스트 JSON"
40
+ },
41
+ "header": { "comment": "와이드 아이템 리스트 헤더" },
42
+ "provider": { "comment": "프로바이더 키 (빈 값이면 default)" },
43
+ "ref_entity": { "comment": "참조 엔티티 이름" },
44
+ "ref_seq": { "type": "int" }
45
+ },
46
+ "hooks": {
47
+ "after_insert": [
48
+ {
49
+ "type": "friendtalk",
50
+ "friendtalk_receiver": "${new.receiver}",
51
+ "friendtalk_content": "${new.content}",
52
+ "friendtalk_msg_type": "${new.msg_type}",
53
+ "friendtalk_image_url": "${new.image_url}",
54
+ "friendtalk_image_link": "${new.image_link}",
55
+ "friendtalk_is_ad": "${new.is_ad}",
56
+ "friendtalk_buttons_json": "${new.buttons_json}",
57
+ "friendtalk_carousel_json": "${new.carousel_json}",
58
+ "friendtalk_items_json": "${new.items_json}",
59
+ "friendtalk_header": "${new.header}"
60
+ }
61
+ ]
62
+ }
63
+ }
@@ -0,0 +1,26 @@
1
+ {
2
+ "name": "sms_log",
3
+ "description": "SMS/LMS/MMS 발송 이력 로그. 사용자 환경에 맞게 index·fields를 자유롭게 확장할 수 있습니다.",
4
+ "license_scope": false,
5
+ "hard_delete": true,
6
+ "history": false,
7
+ "read_only": true,
8
+ "compress": true,
9
+ "index": {
10
+ "status": { "type": ["pending", "processing", "sent", "failed"] },
11
+ "msg_type": { "type": ["sms", "lms", "mms"] },
12
+ "receiver": { "type": "string" },
13
+ "sms_msg_seq": { "comment": "sms_msg 참조 seq" }
14
+ },
15
+ "fields": {
16
+ "sender": { "type": "string" },
17
+ "subject": { "type": "string" },
18
+ "content": { "type": "string" },
19
+ "image_url": { "type": "string", "comment": "MMS 이미지 URL" },
20
+ "provider": { "type": "string" },
21
+ "provider_msg_id": { "type": "string" },
22
+ "error_message": { "type": "string" },
23
+ "retry_count": { "type": "uint" },
24
+ "sent_at": { "type": "string" }
25
+ }
26
+ }
@@ -0,0 +1,52 @@
1
+ {
2
+ "name": "sms_msg",
3
+ "description": "SMS/LMS/MMS 발송 트리거 엔티티. insert 시 sms hook으로 비동기 발송. 사용자 환경에 맞게 index·fields를 자유롭게 확장할 수 있습니다.",
4
+ "license_scope": false,
5
+ "hard_delete": true,
6
+ "history": false,
7
+ "read_only": true,
8
+ "index": {
9
+ "status": {
10
+ "type": ["queued", "sent", "failed"],
11
+ "default": "queued"
12
+ },
13
+ "msg_type": {
14
+ "type": ["sms", "lms", "mms"],
15
+ "default": "sms"
16
+ },
17
+ "receiver": {
18
+ "type": "string",
19
+ "required": true,
20
+ "comment": "수신 전화번호"
21
+ }
22
+ },
23
+ "fields": {
24
+ "sender": { "type": "string", "comment": "발신번호" },
25
+ "subject": {
26
+ "type": "string",
27
+ "comment": "LMS/MMS 제목 (SMS는 미사용)"
28
+ },
29
+ "content": { "type": "string", "comment": "메시지 본문" },
30
+ "image_url": { "type": "string", "comment": "MMS 이미지 URL" },
31
+ "provider": { "type": "string", "comment": "발송 프로바이더 키" },
32
+ "provider_msg_id": {
33
+ "type": "string",
34
+ "comment": "프로바이더 메시지 ID"
35
+ },
36
+ "ref_entity": { "type": "string" },
37
+ "ref_seq": { "type": "int" },
38
+ "error_message": { "type": "string" },
39
+ "sent_at": { "type": "string" }
40
+ },
41
+ "hooks": {
42
+ "after_insert": [
43
+ {
44
+ "type": "sms",
45
+ "enabled": true,
46
+ "sms_receiver": "${new.receiver}",
47
+ "sms_content": "${new.content}",
48
+ "sms_subject": "${new.subject}"
49
+ }
50
+ ]
51
+ }
52
+ }
@@ -0,0 +1,40 @@
1
+ {
2
+ "name": "sms_verification",
3
+ "description": "SMS 인증번호 검증 엔티티. 인증번호 SHA-256 해시 저장, 시도 횟수 관리. 사용자 환경에 맞게 index·fields를 자유롭게 확장할 수 있습니다.",
4
+ "license_scope": false,
5
+ "hard_delete": true,
6
+ "history": false,
7
+ "index": {
8
+ "phone": {
9
+ "comment": "수신 전화번호",
10
+ "type": "varchar(20)",
11
+ "required": true
12
+ },
13
+ "purpose": {
14
+ "comment": "인증 목적",
15
+ "type": ["signup", "password_reset", "identity"],
16
+ "required": true
17
+ },
18
+ "status": {
19
+ "type": ["pending", "verified", "expired"],
20
+ "default": "pending",
21
+ "required": true
22
+ }
23
+ },
24
+ "fields": {
25
+ "code_hash": {
26
+ "type": "varchar(64)",
27
+ "required": true,
28
+ "comment": "인증번호 SHA-256 해시"
29
+ },
30
+ "expires_at": {
31
+ "required": true,
32
+ "comment": "만료 시각"
33
+ },
34
+ "attempts": {
35
+ "type": "uint",
36
+ "default": 0,
37
+ "comment": "검증 시도 횟수"
38
+ }
39
+ }
40
+ }
@@ -0,0 +1,45 @@
1
+ {
2
+ "name": "pg_cancel",
3
+ "description": "PG 결제 취소 이력 엔티티. 부분/전액 취소를 기록합니다. 사용자 환경에 맞게 index·fields를 자유롭게 확장할 수 있습니다.",
4
+ "read_only": true,
5
+ "index": {
6
+ "order_seq": {
7
+ "type": "integer",
8
+ "required": true,
9
+ "comment": "pg_order.seq 참조"
10
+ },
11
+ "order_id": {
12
+ "type": "string",
13
+ "required": true,
14
+ "comment": "주문번호 (조회 편의)"
15
+ },
16
+ "cancel_amount": {
17
+ "type": "integer",
18
+ "required": true,
19
+ "comment": "취소 금액"
20
+ },
21
+ "cancel_reason": {
22
+ "type": "string",
23
+ "required": true,
24
+ "comment": "취소 사유 (최대 200자)"
25
+ },
26
+ "cancel_status": {
27
+ "type": ["done", "failed"],
28
+ "default": "done",
29
+ "comment": "취소 처리 상태"
30
+ },
31
+ "transaction_key": {
32
+ "type": "string",
33
+ "comment": "PG사 취소 거래 키"
34
+ }
35
+ },
36
+ "fields": {
37
+ "canceled_time": { "comment": "취소 시각 (ISO 8601)" },
38
+ "refundable_amount": { "comment": "취소 후 환불 가능 잔액" },
39
+ "tax_free_amount": { "comment": "취소된 금액 중 면세 금액" },
40
+ "receipt_key": { "comment": "현금영수증 키 (해당 시)" },
41
+ "refund_account": {
42
+ "comment": "환불 계좌 정보 JSON (가상계좌 취소 시)"
43
+ }
44
+ }
45
+ }
@@ -0,0 +1,88 @@
1
+ {
2
+ "name": "pg_order",
3
+ "description": "PG 결제 주문 엔티티. 결제 요청/승인/취소 상태를 추적합니다. 사용자 환경에 맞게 index·fields를 자유롭게 확장할 수 있습니다.",
4
+ "index": {
5
+ "order_id": {
6
+ "type": "string",
7
+ "required": true,
8
+ "unique": true,
9
+ "comment": "고유 주문번호 (6~64자, [a-zA-Z0-9_-])"
10
+ },
11
+ "status": {
12
+ "type": [
13
+ "created",
14
+ "ready",
15
+ "in_progress",
16
+ "waiting",
17
+ "done",
18
+ "canceled",
19
+ "partial_canceled",
20
+ "aborted",
21
+ "expired"
22
+ ],
23
+ "default": "created",
24
+ "comment": "결제 상태"
25
+ },
26
+ "payment_key": {
27
+ "type": "string",
28
+ "comment": "PG사 결제 키 (승인 후 할당)"
29
+ },
30
+ "provider": {
31
+ "type": "string",
32
+ "required": true,
33
+ "comment": "PG 프로바이더 키 (toss_payments, kcp, inicis 등)"
34
+ },
35
+ "method": {
36
+ "type": "string",
37
+ "comment": "결제수단 (card, virtual_account, transfer, phone, easy_pay)"
38
+ },
39
+ "amount": {
40
+ "type": "integer",
41
+ "required": true,
42
+ "comment": "총 결제 금액 (원)"
43
+ },
44
+ "balance_amount": {
45
+ "type": "integer",
46
+ "comment": "취소 가능 잔액"
47
+ },
48
+ "currency": {
49
+ "type": "string",
50
+ "default": "KRW",
51
+ "comment": "통화 코드 (ISO 4217)"
52
+ },
53
+ "account_seq": {
54
+ "type": "integer",
55
+ "comment": "구매자 계정 seq (로그인 사용자)"
56
+ },
57
+ "customer_name": {
58
+ "type": "string",
59
+ "comment": "구매자명"
60
+ },
61
+ "customer_email": {
62
+ "type": "string",
63
+ "comment": "구매자 이메일"
64
+ }
65
+ },
66
+ "fields": {
67
+ "order_name": { "comment": "주문 상품명 (예: '토스 티셔츠 외 2건')" },
68
+ "requested_time": { "comment": "결제 요청 시각 (ISO 8601)" },
69
+ "approved_time": { "comment": "결제 승인 시각 (ISO 8601)" },
70
+ "card_info": {
71
+ "comment": "카드 결제 정보 JSON (마스킹된 카드번호, 카드타입 등)"
72
+ },
73
+ "virtual_account_info": {
74
+ "comment": "가상계좌 정보 JSON (계좌번호, 은행, 입금기한)"
75
+ },
76
+ "easy_pay_info": {
77
+ "comment": "간편결제 정보 JSON (provider, amount, discountAmount)"
78
+ },
79
+ "receipt_url": { "comment": "영수증 URL" },
80
+ "checkout_url": { "comment": "결제창 URL" },
81
+ "failure_code": { "comment": "실패 에러 코드" },
82
+ "failure_message": { "comment": "실패 에러 메시지" },
83
+ "metadata": {
84
+ "comment": "상점 커스텀 데이터 JSON (최대 5개 key-value)"
85
+ },
86
+ "pg_raw_response": { "comment": "PG사 원본 응답 JSON (디버깅용)" }
87
+ }
88
+ }
@@ -0,0 +1,37 @@
1
+ {
2
+ "name": "pg_webhook_log",
3
+ "description": "PG 웹훅 수신 이력. 모든 수신 이벤트를 기록합니다. 사용자 환경에 맞게 index·fields를 자유롭게 확장할 수 있습니다.",
4
+ "hard_delete": true,
5
+ "read_only": true,
6
+ "compress": true,
7
+ "index": {
8
+ "event_type": {
9
+ "type": "string",
10
+ "required": true,
11
+ "comment": "웹훅 이벤트 타입 (payment.done, payment.canceled 등)"
12
+ },
13
+ "order_id": {
14
+ "type": "string",
15
+ "comment": "관련 주문번호"
16
+ },
17
+ "payment_key": {
18
+ "type": "string",
19
+ "comment": "관련 결제 키"
20
+ },
21
+ "status": {
22
+ "type": ["received", "processed", "failed"],
23
+ "default": "received",
24
+ "comment": "웹훅 처리 상태"
25
+ },
26
+ "provider": {
27
+ "type": "string",
28
+ "comment": "PG 프로바이더 키"
29
+ }
30
+ },
31
+ "fields": {
32
+ "payload": { "comment": "수신한 웹훅 원본 JSON" },
33
+ "processed_time": { "comment": "처리 완료 시각" },
34
+ "error_message": { "comment": "처리 실패 시 에러 메시지" },
35
+ "signature": { "comment": "웹훅 서명값 (검증용)" }
36
+ }
37
+ }
@@ -0,0 +1,71 @@
1
+ {
2
+ "name": "push_log",
3
+ "description": "푸시 알림 발송 이력. 발송 결과 추적 및 재시도 관리용. account_seq(JWT) 또는 device_id(HMAC) 중 하나 존재. 사용자 환경에 맞게 index·fields를 자유롭게 확장할 수 있습니다.",
4
+ "license_scope": false,
5
+ "hard_delete": true,
6
+ "history_ttl": 30,
7
+ "compress": true,
8
+ "index": {
9
+ "account_seq": {
10
+ "comment": "수신자 account seq (JWT 인증 시. nullable)"
11
+ },
12
+ "attempt_time": {
13
+ "comment": "처리 시작(claim) 시각 — 비정상 종료 감지용"
14
+ },
15
+ "body": {
16
+ "comment": "알림 본문"
17
+ },
18
+ "device_id": {
19
+ "comment": "대상 디바이스 ID (HMAC 인증 시. nullable)",
20
+ "type": "varchar(255)"
21
+ },
22
+ "device_seq": {
23
+ "comment": "대상 디바이스 seq (account_device.seq)"
24
+ },
25
+ "device_token": {
26
+ "comment": "발송 시점 디바이스 토큰 스냅샷 (FCM registration token 또는 APNs device token)"
27
+ },
28
+ "error_message": {
29
+ "comment": "실패 시 오류 메시지",
30
+ "type": "varchar(500)"
31
+ },
32
+ "platform": {
33
+ "comment": "발송 채널",
34
+ "type": ["fcm", "apns", "web"]
35
+ },
36
+ "push_data": {
37
+ "comment": "커스텀 페이로드 JSON 문자열",
38
+ "type": "varchar(2000)"
39
+ },
40
+ "ref_entity": {
41
+ "comment": "트리거 엔티티명"
42
+ },
43
+ "ref_seq": {
44
+ "comment": "트리거 레코드 seq"
45
+ },
46
+ "retry_count": {
47
+ "comment": "재시도 횟수",
48
+ "type": "uint",
49
+ "default": 0
50
+ },
51
+ "sent_time": {
52
+ "comment": "발송 완료 시각"
53
+ },
54
+ "status": {
55
+ "comment": "발송 상태",
56
+ "type": [
57
+ "pending",
58
+ "processing",
59
+ "sent",
60
+ "delivered",
61
+ "failed",
62
+ "expired"
63
+ ],
64
+ "default": "pending",
65
+ "required": true
66
+ },
67
+ "title": {
68
+ "comment": "알림 제목"
69
+ }
70
+ }
71
+ }
@@ -0,0 +1,55 @@
1
+ {
2
+ "name": "push_msg",
3
+ "description": "시스템 푸시 트리거 엔티티. insert 시 push hook로 비동기 발송. account_seq(JWT) 또는 device_id(HMAC) 중 하나 필수. 사용자 환경에 맞게 index·fields를 자유롭게 확장할 수 있습니다.",
4
+ "index": {
5
+ "account_seq": {
6
+ "comment": "수신자 account seq (JWT 인증 시 필수. HMAC 인증은 device_id 사용)",
7
+ "required": true
8
+ },
9
+ "device_id": {
10
+ "comment": "대상 디바이스 ID (HMAC 인증 시. 기기단위로 account 없이 푸시 발송)",
11
+ "type": "varchar(255)"
12
+ },
13
+ "title": {
14
+ "comment": "푸시 제목",
15
+ "required": true
16
+ }
17
+ },
18
+ "fields": {
19
+ "message": {
20
+ "comment": "푸시 본문",
21
+ "nullable": true
22
+ },
23
+ "ref_entity": {
24
+ "comment": "참조 엔티티명",
25
+ "nullable": true
26
+ },
27
+ "ref_seq": {
28
+ "comment": "참조 레코드 seq",
29
+ "nullable": true
30
+ },
31
+ "msg_data": {
32
+ "comment": "추가 데이터(JSON 문자열)",
33
+ "type": "varchar(2000)",
34
+ "nullable": true
35
+ }
36
+ },
37
+ "hooks": {
38
+ "after_insert": [
39
+ {
40
+ "type": "push",
41
+ "target_account_seq": "account_seq",
42
+ "target_device_id": "device_id",
43
+ "comment": "account_seq 있으면 계정 기반 발송, 없으면 device_id 기반 발송",
44
+ "title": "${new.title}",
45
+ "push_body": "${new.message}",
46
+ "push_data": {
47
+ "push_msg_seq": "${new.seq}",
48
+ "ref_entity": "${new.ref_entity}",
49
+ "ref_seq": "${new.ref_seq}",
50
+ "msg_data": "${new.msg_data}"
51
+ }
52
+ }
53
+ ]
54
+ }
55
+ }
@@ -0,0 +1,46 @@
1
+ {
2
+ "name": "file_backup_log",
3
+ "description": "파일 백업 작업 로그. 스토리지 간 백업 동기화 이력을 기록합니다. 서버 내부 백업 고루틴이 자동 기록. 사용자 환경에 맞게 index·fields를 자유롭게 확장할 수 있습니다.",
4
+ "license_scope": false,
5
+ "history": false,
6
+ "hard_delete": true,
7
+ "read_only": true,
8
+ "compress": true,
9
+ "index": {
10
+ "started_time": {
11
+ "comment": "백업 작업 시작 시각"
12
+ },
13
+ "status": {
14
+ "comment": "작업 상태",
15
+ "type": ["running", "completed", "partial", "failed"],
16
+ "default": "running",
17
+ "required": true
18
+ }
19
+ },
20
+ "fields": {
21
+ "error_count": {
22
+ "comment": "실패 파일 수"
23
+ },
24
+ "error_message": {
25
+ "comment": "실패 시 오류 메시지 요약"
26
+ },
27
+ "exec_instance": {
28
+ "comment": "작업을 실행한 서버 인스턴스 식별자 (hostname 등)"
29
+ },
30
+ "file_count": {
31
+ "comment": "처리된 파일 수"
32
+ },
33
+ "finished_time": {
34
+ "comment": "백업 작업 완료 시각"
35
+ },
36
+ "source_key": {
37
+ "comment": "원본 스토리지 키 (storage.json storages 맵의 키)"
38
+ },
39
+ "target_key": {
40
+ "comment": "백업 대상 스토리지 키"
41
+ },
42
+ "total_bytes": {
43
+ "comment": "전송된 총 바이트 수"
44
+ }
45
+ }
46
+ }
@@ -0,0 +1,41 @@
1
+ {
2
+ "name": "file_download_log",
3
+ "description": "파일 다운로드 이력. 누가 어떤 파일을 언제 다운로드했는지 기록합니다. 감사(audit) 및 통계 목적. 사용자 환경에 맞게 index·fields를 자유롭게 확장할 수 있습니다.",
4
+ "hard_delete": true,
5
+ "history": false,
6
+ "compress": true,
7
+ "index": {
8
+ "account_seq": {
9
+ "comment": "다운로드한 계정 seq. JWT 인증 시 기록, 비인증은 NULL"
10
+ },
11
+ "downloaded_time": {
12
+ "comment": "다운로드 시각"
13
+ },
14
+ "entity_name": {
15
+ "comment": "파일이 속한 엔티티 이름"
16
+ },
17
+ "file_seq": {
18
+ "comment": "다운로드한 file_meta seq",
19
+ "required": true
20
+ }
21
+ },
22
+ "fields": {
23
+ "ip": {
24
+ "comment": "요청 IP 주소 (IPv4/IPv6)",
25
+ "type": "varchar(45)"
26
+ },
27
+ "thumb": {
28
+ "comment": "썸네일 요청 시 사이즈 (sm, md, lg). 원본 다운로드는 NULL",
29
+ "type": "varchar(10)"
30
+ },
31
+ "user_agent": {
32
+ "comment": "요청 User-Agent 헤더",
33
+ "type": "varchar(500)"
34
+ }
35
+ },
36
+ "fk": {
37
+ "account_seq": false,
38
+ "file_seq": false
39
+ },
40
+ "read_only": true
41
+ }