create-entity-server 0.0.26 → 0.0.31

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 (98) hide show
  1. package/package.json +1 -1
  2. package/template/.env.example +26 -0
  3. package/template/configs/auth/cors.json +15 -0
  4. package/template/configs/auth/jwt.json +12 -0
  5. package/template/configs/{oauth.json → auth/oauth.json} +7 -4
  6. package/template/configs/auth/password.json +45 -0
  7. package/template/configs/{security.json → auth/security.json} +4 -2
  8. package/template/configs/cache.json +2 -1
  9. package/template/configs/keys/.gitkeep +0 -0
  10. package/template/configs/keys/apns.p8.example +7 -0
  11. package/template/configs/keys/firebase.pem.example +7 -0
  12. package/template/configs/server.json +1 -0
  13. package/template/entities/README.md +13 -16
  14. package/template/entities/System/Auth/account.json +172 -16
  15. package/template/entities/System/Auth/account_audit.json +31 -0
  16. package/template/entities/System/Auth/account_device.json +64 -0
  17. package/template/entities/System/Auth/account_login_log.json +69 -0
  18. package/template/entities/System/Auth/account_oauth.json +74 -0
  19. package/template/entities/System/Auth/api_keys.json +18 -9
  20. package/template/entities/System/Auth/identity_verification.json +106 -0
  21. package/template/entities/System/Auth/license.json +41 -20
  22. package/template/entities/System/Auth/password_history.json +19 -0
  23. package/template/entities/System/Auth/rbac_roles.json +10 -7
  24. package/template/entities/System/Backup/backup_log.json +66 -0
  25. package/template/entities/System/Email/smtp_log.json +87 -0
  26. package/template/entities/System/Email/smtp_msg.json +104 -0
  27. package/template/entities/System/Notification/alimtalk_log.json +65 -0
  28. package/template/entities/System/Notification/alimtalk_msg.json +53 -0
  29. package/template/entities/System/Notification/friendtalk_log.json +89 -0
  30. package/template/entities/System/Notification/friendtalk_msg.json +91 -0
  31. package/template/entities/System/Notification/sms_log.json +65 -0
  32. package/template/entities/System/Notification/sms_msg.json +82 -0
  33. package/template/entities/System/Notification/sms_verification.json +50 -0
  34. package/template/entities/System/Payment/pg_cancel.json +60 -0
  35. package/template/entities/System/Payment/pg_order.json +115 -0
  36. package/template/entities/System/Payment/pg_webhook_log.json +52 -0
  37. package/template/entities/System/Push/push_log.json +86 -0
  38. package/template/entities/System/Push/push_msg.json +56 -0
  39. package/template/entities/System/Storage/file_backup_log.json +51 -0
  40. package/template/entities/System/Storage/file_download_log.json +43 -0
  41. package/template/entities/System/Storage/file_meta.json +72 -0
  42. package/template/entities/System/system_audit_log.json +39 -34
  43. package/template/entities/company.json +5 -2
  44. package/template/entities/{product.json → goods.json} +9 -6
  45. package/template/entities/todo.json +4 -2
  46. package/template/samples/entities/01_basic_fields.json +15 -2
  47. package/template/samples/entities/02_types_and_defaults.json +15 -5
  48. package/template/samples/entities/03_hash_and_unique.json +18 -3
  49. package/template/samples/entities/04_fk_and_composite_unique.json +18 -3
  50. package/template/samples/entities/05_cache.json +15 -9
  51. package/template/samples/entities/06_history_and_hard_delete.json +19 -6
  52. package/template/samples/entities/07_license_scope.json +18 -3
  53. package/template/samples/entities/08_hook_sql.json +24 -5
  54. package/template/samples/entities/09_hook_entity.json +12 -2
  55. package/template/samples/entities/10_hook_submit_delete.json +14 -5
  56. package/template/samples/entities/11_hook_webhook.json +20 -6
  57. package/template/samples/entities/12_hook_push.json +15 -2
  58. package/template/samples/entities/13_read_only.json +8 -4
  59. package/template/samples/entities/14_optimistic_lock.json +13 -2
  60. package/template/samples/entities/15_reset_defaults.json +7 -1
  61. package/template/samples/entities/16_isolated_license.json +19 -6
  62. package/template/scripts/reset-all.sh +57 -3
  63. package/template/scripts/run.sh +56 -6
  64. package/template/templates/email/auth/2fa_disabled.html +23 -0
  65. package/template/templates/email/auth/2fa_recovery_regenerated.html +31 -0
  66. package/template/templates/email/auth/2fa_setup_complete.html +43 -0
  67. package/template/templates/email/auth/welcome.html +18 -0
  68. package/template/templates/email/backup/backup_completed.html +35 -0
  69. package/template/templates/email/backup/backup_failed.html +27 -0
  70. package/template/templates/email/backup/backup_partial.html +31 -0
  71. package/template/templates/email/layout.html +47 -0
  72. package/template/templates/email/order/order_confirmation.html +30 -0
  73. package/template/templates/email/storage/storage_quota_exceeded.html +37 -0
  74. package/template/templates/email/storage/storage_quota_warning.html +37 -0
  75. package/template/templates/ocr/business_reg.json +145 -0
  76. package/template/templates/ocr/career_cert.json +93 -0
  77. package/template/templates/ocr/driver_license.json +89 -0
  78. package/template/templates/ocr/facility_card.json +82 -0
  79. package/template/templates/ocr/id_card.json +55 -0
  80. package/template/templates/ocr/invoice.json +92 -0
  81. package/template/templates/ocr/namecard.json +116 -0
  82. package/template/templates/ocr/prompts/business_reg.json +14 -0
  83. package/template/templates/ocr/prompts/career_cert.json +16 -0
  84. package/template/templates/ocr/prompts/driver_license.json +14 -0
  85. package/template/templates/ocr/prompts/facility_card.json +15 -0
  86. package/template/templates/ocr/prompts/general.json +13 -0
  87. package/template/templates/ocr/prompts/id_card.json +11 -0
  88. package/template/templates/ocr/prompts/invoice.json +17 -0
  89. package/template/templates/ocr/prompts/namecard.json +15 -0
  90. package/template/templates/ocr/prompts/receipt.json +14 -0
  91. package/template/templates/ocr/receipt.json +79 -0
  92. package/template/configs/cors.json +0 -7
  93. package/template/configs/jwt.json +0 -8
  94. package/template/entities/Account/account_audit.json +0 -16
  95. /package/template/configs/{backup.json → extensions/backup.json} +0 -0
  96. /package/template/configs/{storage.json → extensions/storage.json} +0 -0
  97. /package/template/configs/{push.json → notification/push.json} +0 -0
  98. /package/template/configs/{smtp.json → notification/smtp.json} +0 -0
@@ -0,0 +1,74 @@
1
+ {
2
+ "name": "account_oauth",
3
+ "description": "소셜 로그인 OAuth 프로바이더 연동 정보. 사용자 환경에 맞게 fields를 자유롭게 확장할 수 있습니다.",
4
+ "history": false,
5
+ "hard_delete": true,
6
+ "fields": {
7
+ "account_seq": {
8
+ "index": true,
9
+ "required": true,
10
+ "comment": "계정 seq"
11
+ },
12
+ "provider": {
13
+ "index": true,
14
+ "type": [
15
+ "google",
16
+ "github",
17
+ "naver",
18
+ "kakao",
19
+ "apple"
20
+ ],
21
+ "required": true
22
+ },
23
+ "provider_id": {
24
+ "index": true,
25
+ "type": "string",
26
+ "required": true,
27
+ "comment": "프로바이더 고유 사용자 ID"
28
+ },
29
+ "status": {
30
+ "index": true,
31
+ "type": [
32
+ "active",
33
+ "unlinked"
34
+ ],
35
+ "default": "active"
36
+ },
37
+ "email": {
38
+ "type": "email",
39
+ "comment": "프로바이더에서 제공한 이메일"
40
+ },
41
+ "name": {
42
+ "type": "string",
43
+ "comment": "프로바이더에서 제공한 이름"
44
+ },
45
+ "profile_image": {
46
+ "type": "string",
47
+ "comment": "프로필 이미지 URL"
48
+ },
49
+ "access_token": {
50
+ "type": "string",
51
+ "comment": "OAuth access token (암호화 저장)"
52
+ },
53
+ "refresh_token": {
54
+ "type": "string",
55
+ "comment": "OAuth refresh token (암호화 저장)"
56
+ },
57
+ "token_expires_at": {
58
+ "type": "string",
59
+ "comment": "access token 만료 시각 (RFC3339)"
60
+ },
61
+ "raw": {
62
+ "type": "json",
63
+ "comment": "프로바이더 원본 응답 (디버깅용)"
64
+ },
65
+ "linked_at": {
66
+ "type": "string",
67
+ "comment": "연결 시각"
68
+ },
69
+ "unlinked_at": {
70
+ "type": "string",
71
+ "comment": "연결 해제 시각"
72
+ }
73
+ }
74
+ }
@@ -1,26 +1,35 @@
1
1
  {
2
2
  "name": "api_keys",
3
+ "description": "API 키 및 HMAC 시크릿 관리. account_seq는 JWT 인증 시에만 FK. 사용자 환경에 맞게 fields를 자유롭게 확장할 수 있습니다.",
3
4
  "license_scope": false,
4
- "description": "API 키 및 HMAC 시크릿 관리",
5
- "index": {
5
+ "fields": {
6
6
  "key_value": {
7
- "comment": "API 키 값 (해시 저장)",
7
+ "index": true,
8
+ "comment": "API 키 Hash 값",
8
9
  "required": true,
9
10
  "unique": true,
10
11
  "hash": true
11
12
  },
12
13
  "enabled": {
14
+ "index": true,
13
15
  "comment": "활성 여부",
14
16
  "type": "bool",
15
17
  "default": true
16
18
  },
17
- "user_seq": {
18
- "comment": "발급 대상 사용자 seq (nullable, user 엔티티 참조)"
19
+ "account_seq": {
20
+ "index": true,
21
+ "comment": "발급 대상 사용자 seq (nullable, JWT 인증 시 account 참조)"
22
+ },
23
+ "hmac_secret": {
24
+ "comment": "HMAC 시크릿",
25
+ "type": "text",
26
+ "nullable": true
27
+ },
28
+ "entities": {
29
+ "comment": "접근 허용 엔티티 목록 (쉼표구분)",
30
+ "type": "text",
31
+ "nullable": true
19
32
  }
20
33
  },
21
- "types": {
22
- "hmac_secret": "text",
23
- "entities": "text"
24
- },
25
34
  "hard_delete": true
26
35
  }
@@ -0,0 +1,106 @@
1
+ {
2
+ "name": "identity_verification",
3
+ "description": "휴대폰 본인인증 요청 및 결과 저장. 사용자 환경에 맞게 fields를 자유롭게 확장할 수 있습니다.",
4
+ "history": false,
5
+ "hard_delete": false,
6
+ "compress": true,
7
+ "fields": {
8
+ "request_id": {
9
+ "index": true,
10
+ "type": "string",
11
+ "required": true,
12
+ "unique": true,
13
+ "comment": "인증 요청 고유 ID (32바이트 hex)"
14
+ },
15
+ "status": {
16
+ "index": true,
17
+ "type": [
18
+ "pending",
19
+ "verified",
20
+ "failed",
21
+ "expired"
22
+ ],
23
+ "default": "pending"
24
+ },
25
+ "purpose": {
26
+ "index": true,
27
+ "type": [
28
+ "signup",
29
+ "find_account",
30
+ "password_reset",
31
+ "adult_verify",
32
+ "identity_change"
33
+ ],
34
+ "required": true
35
+ },
36
+ "provider": {
37
+ "index": true,
38
+ "type": [
39
+ "nice",
40
+ "kmc",
41
+ "danal"
42
+ ],
43
+ "required": true
44
+ },
45
+ "ci_hash": {
46
+ "type": "string",
47
+ "comment": "CI의 SHA-256 해시 (중복 조회용)"
48
+ },
49
+ "di": {
50
+ "type": "string",
51
+ "comment": "DI 원문 (암호화 저장)"
52
+ },
53
+ "name": {
54
+ "type": "string",
55
+ "comment": "인증된 실명"
56
+ },
57
+ "birth_date": {
58
+ "type": "string",
59
+ "comment": "생년월일 (YYYYMMDD)"
60
+ },
61
+ "gender": {
62
+ "type": "string",
63
+ "comment": "성별 (M/F)"
64
+ },
65
+ "carrier": {
66
+ "type": "string",
67
+ "comment": "통신사 코드"
68
+ },
69
+ "phone": {
70
+ "type": "string",
71
+ "comment": "인증 휴대폰 번호"
72
+ },
73
+ "nationality": {
74
+ "type": "string",
75
+ "comment": "내/외국인 (local/foreign)"
76
+ },
77
+ "account_seq": {
78
+ "type": "int",
79
+ "comment": "연결된 계정 seq (인증 완료 후 설정)"
80
+ },
81
+ "ip_address": {
82
+ "type": "string",
83
+ "comment": "요청 IP 주소"
84
+ },
85
+ "user_agent": {
86
+ "type": "string",
87
+ "comment": "요청 User-Agent"
88
+ },
89
+ "verified_at": {
90
+ "type": "string",
91
+ "comment": "인증 완료 시각 (RFC3339)"
92
+ },
93
+ "expires_at": {
94
+ "type": "string",
95
+ "comment": "요청 만료 시각 (RFC3339)"
96
+ },
97
+ "error_message": {
98
+ "type": "string",
99
+ "comment": "실패 시 에러 메시지"
100
+ },
101
+ "raw_response": {
102
+ "type": "json",
103
+ "comment": "중계사 원본 응답 (디버깅용, 암호화)"
104
+ }
105
+ }
106
+ }
@@ -1,36 +1,57 @@
1
1
  {
2
2
  "name": "license",
3
- "description": "license Entity",
4
- "index": {
5
- "name": {
6
- "comment": "라이선스명",
7
- "required": true,
8
- "unique": true
3
+ "description": "license 엔티티. 사용자 환경에 맞게 fields를 자유롭게 확장할 수 있습니다.",
4
+ "cache": {
5
+ "ttl_seconds": 300
6
+ },
7
+ "fields": {
8
+ "bizno": {
9
+ "index": true,
10
+ "comment": "사업자번호",
11
+ "hash": true
9
12
  },
10
13
  "contract_date": {
14
+ "index": true,
11
15
  "comment": "계약일"
12
16
  },
17
+ "email": {
18
+ "index": true,
19
+ "hash": true,
20
+ "comment": "이메일"
21
+ },
13
22
  "expire_date": {
23
+ "index": true,
14
24
  "comment": "만료일"
15
25
  },
16
- "status": {
17
- "comment": "상태",
18
- "type": ["active", "expired", "suspended"],
19
- "default": "active"
26
+ "name": {
27
+ "index": true,
28
+ "comment": "라이선스명",
29
+ "required": true
30
+ },
31
+ "name_abbr": {
32
+ "index": true,
33
+ "comment": "약칭"
34
+ },
35
+ "pic": {
36
+ "index": true,
37
+ "comment": "담당자"
38
+ },
39
+ "sido": {
40
+ "index": true,
41
+ "comment": "시도"
42
+ },
43
+ "sigungu": {
44
+ "index": true,
45
+ "comment": "시군구"
46
+ },
47
+ "max_user_cnt": {
48
+ "type": "uint"
20
49
  }
21
50
  },
22
- "defaults": {
23
- "max_users": 100
24
- },
25
- "types": {},
26
51
  "reset_defaults": [
27
52
  {
28
- "name": "Trial License",
29
- "contract_date": "2026-01-01",
30
- "expire_date": "2026-12-31",
31
- "status": "active",
32
- "max_users": 10,
33
- "contact_email": "trial@example.com"
53
+ "name": "system",
54
+ "name_abbr": "system"
34
55
  }
35
56
  ]
36
57
  }
@@ -0,0 +1,19 @@
1
+ {
2
+ "name": "password_history",
3
+ "description": "비밀번호 변경 이력 (재사용 금지 정책용) 사용자 환경에 맞게 fields를 자유롭게 확장할 수 있습니다.",
4
+ "hard_delete": true,
5
+ "fields": {
6
+ "account_seq": {
7
+ "index": true,
8
+ "comment": "계정 seq",
9
+ "type": "integer",
10
+ "required": true
11
+ },
12
+ "passwd_hash": {
13
+ "comment": "변경 시점의 비밀번호 해시 (salt 포함)"
14
+ },
15
+ "changed_time": {
16
+ "comment": "비밀번호 변경 시각"
17
+ }
18
+ }
19
+ }
@@ -1,23 +1,26 @@
1
1
  {
2
2
  "name": "rbac_roles",
3
- "description": "RBAC 역할 정의 예제",
3
+ "description": "역할 기반 접근 제어 역할 정의. 사용자 환경에 맞게 fields를 자유롭게 확장할 수 있습니다.",
4
4
  "license_scope": false,
5
- "index": {
5
+ "hard_delete": true,
6
+ "fields": {
6
7
  "name": {
8
+ "index": true,
7
9
  "comment": "역할 이름",
8
10
  "required": true,
9
11
  "unique": true
12
+ },
13
+ "permissions": {
14
+ "type": "text"
10
15
  }
11
16
  },
12
- "types": {
13
- "permissions": "text"
14
- },
15
- "hard_delete": true,
16
17
  "reset_defaults": [
17
18
  {
18
19
  "name": "admin",
19
20
  "description": "전체 권한 (모든 엔티티 CRUD + 관리)",
20
- "permissions": ["*"]
21
+ "permissions": [
22
+ "*"
23
+ ]
21
24
  },
22
25
  {
23
26
  "name": "editor",
@@ -0,0 +1,66 @@
1
+ {
2
+ "name": "backup_log",
3
+ "description": "백업 작업 이력. 사용자 환경에 맞게 fields를 자유롭게 확장할 수 있습니다.",
4
+ "license_scope": false,
5
+ "hard_delete": true,
6
+ "history": false,
7
+ "compress": true,
8
+ "fields": {
9
+ "backup_type": {
10
+ "index": true,
11
+ "type": [
12
+ "data",
13
+ "file",
14
+ "full"
15
+ ],
16
+ "required": true
17
+ },
18
+ "finished_time": {
19
+ "index": true
20
+ },
21
+ "started_time": {
22
+ "index": true
23
+ },
24
+ "status": {
25
+ "index": true,
26
+ "type": [
27
+ "running",
28
+ "completed",
29
+ "partial",
30
+ "failed"
31
+ ],
32
+ "required": true
33
+ },
34
+ "session_id": {
35
+ "description": "백업 세션 ID (타임스탬프)"
36
+ },
37
+ "db_groups": {
38
+ "type": "varchar(500)",
39
+ "description": "백업된 DB 그룹 목록 (JSON)"
40
+ },
41
+ "entity_count": {
42
+ "description": "백업된 엔티티 수"
43
+ },
44
+ "total_records": {
45
+ "description": "총 레코드 수"
46
+ },
47
+ "total_bytes": {
48
+ "description": "총 바이트"
49
+ },
50
+ "error_count": {
51
+ "description": "에러 수"
52
+ },
53
+ "error_message": {
54
+ "type": "varchar(2000)",
55
+ "nullable": true,
56
+ "description": "에러 상세"
57
+ },
58
+ "exec_instance": {
59
+ "description": "실행 서버 인스턴스 ID"
60
+ },
61
+ "manifest_path": {
62
+ "description": "manifest.json 경로"
63
+ }
64
+ },
65
+ "read_only": true
66
+ }
@@ -0,0 +1,87 @@
1
+ {
2
+ "name": "smtp_log",
3
+ "description": "SMTP 이메일 발송 이력. 발송 결과 추적 및 재시도 관리용. 사용자 환경에 맞게 fields를 자유롭게 확장할 수 있습니다.",
4
+ "license_scope": false,
5
+ "hard_delete": true,
6
+ "history": false,
7
+ "compress": true,
8
+ "fields": {
9
+ "attempt_time": {
10
+ "index": true,
11
+ "comment": "처리 시작(claim) 시각"
12
+ },
13
+ "provider": {
14
+ "index": true,
15
+ "type": "varchar(50)"
16
+ },
17
+ "retry_count": {
18
+ "index": true,
19
+ "type": "uint",
20
+ "default": 0
21
+ },
22
+ "sent_time": {
23
+ "index": true,
24
+ "comment": "발송 완료 시각"
25
+ },
26
+ "smtp_msg_seq": {
27
+ "index": true,
28
+ "comment": "원본 smtp_msg seq"
29
+ },
30
+ "status": {
31
+ "index": true,
32
+ "type": [
33
+ "pending",
34
+ "processing",
35
+ "sent",
36
+ "failed",
37
+ "expired"
38
+ ],
39
+ "default": "pending",
40
+ "required": true
41
+ },
42
+ "from": {
43
+ "comment": "발신자"
44
+ },
45
+ "to": {
46
+ "type": "text",
47
+ "comment": "수신자 목록"
48
+ },
49
+ "cc": {
50
+ "type": "text",
51
+ "nullable": true
52
+ },
53
+ "bcc": {
54
+ "type": "text",
55
+ "nullable": true
56
+ },
57
+ "subject": {
58
+ "comment": "제목"
59
+ },
60
+ "body_text": {
61
+ "type": "mediumtext",
62
+ "nullable": true
63
+ },
64
+ "body_html": {
65
+ "type": "mediumtext",
66
+ "nullable": true
67
+ },
68
+ "attachments": {
69
+ "type": "text",
70
+ "nullable": true
71
+ },
72
+ "error_message": {
73
+ "type": "text",
74
+ "nullable": true
75
+ },
76
+ "message_id": {
77
+ "nullable": true,
78
+ "comment": "SMTP Message-ID 헤더"
79
+ },
80
+ "ref_entity": {
81
+ "nullable": true
82
+ },
83
+ "ref_seq": {
84
+ "nullable": true
85
+ }
86
+ }
87
+ }
@@ -0,0 +1,104 @@
1
+ {
2
+ "name": "smtp_msg",
3
+ "description": "SMTP 이메일 트리거 엔티티. insert 시 smtp hook으로 비동기 발송. 사용자 환경에 맞게 fields를 자유롭게 확장할 수 있습니다.",
4
+ "hard_delete": true,
5
+ "history": false,
6
+ "fields": {
7
+ "provider": {
8
+ "index": true,
9
+ "comment": "사용할 SMTP 프로바이더 키 (미지정 시 default)",
10
+ "type": "varchar(50)"
11
+ },
12
+ "status": {
13
+ "index": true,
14
+ "type": [
15
+ "queued",
16
+ "sent",
17
+ "failed"
18
+ ],
19
+ "default": "queued",
20
+ "required": true
21
+ },
22
+ "from": {
23
+ "nullable": true,
24
+ "comment": "발신자 이메일 (미지정 시 프로바이더 기본값)"
25
+ },
26
+ "to": {
27
+ "type": "text",
28
+ "required": true,
29
+ "comment": "수신자 이메일 (쉼표 구분 또는 JSON 배열)"
30
+ },
31
+ "cc": {
32
+ "type": "text",
33
+ "nullable": true,
34
+ "comment": "참조 (쉼표 구분 또는 JSON 배열)"
35
+ },
36
+ "bcc": {
37
+ "type": "text",
38
+ "nullable": true,
39
+ "comment": "숨은 참조 (쉼표 구분 또는 JSON 배열)"
40
+ },
41
+ "subject": {
42
+ "required": true,
43
+ "comment": "이메일 제목"
44
+ },
45
+ "body_text": {
46
+ "type": "mediumtext",
47
+ "nullable": true,
48
+ "comment": "텍스트 본문"
49
+ },
50
+ "body_html": {
51
+ "type": "mediumtext",
52
+ "nullable": true,
53
+ "comment": "HTML 본문"
54
+ },
55
+ "template_name": {
56
+ "nullable": true,
57
+ "comment": "템플릿 이름 (templates/ 디렉터리)"
58
+ },
59
+ "template_data": {
60
+ "type": "text",
61
+ "nullable": true,
62
+ "comment": "템플릿 변수 JSON"
63
+ },
64
+ "attachments": {
65
+ "type": "text",
66
+ "nullable": true,
67
+ "comment": "첨부 file_meta seq 배열 (JSON)"
68
+ },
69
+ "reply_to": {
70
+ "nullable": true,
71
+ "comment": "회신 주소"
72
+ },
73
+ "ref_entity": {
74
+ "nullable": true,
75
+ "comment": "참조 엔티티 이름"
76
+ },
77
+ "ref_seq": {
78
+ "nullable": true,
79
+ "comment": "참조 레코드 seq"
80
+ }
81
+ },
82
+ "hooks": {
83
+ "after_insert": [
84
+ {
85
+ "type": "smtp",
86
+ "provider": "${new.provider}",
87
+ "from": "${new.from}",
88
+ "to": "${new.to}",
89
+ "cc": "${new.cc}",
90
+ "bcc": "${new.bcc}",
91
+ "subject": "${new.subject}",
92
+ "body_text": "${new.body_text}",
93
+ "body_html": "${new.body_html}",
94
+ "template_name": "${new.template_name}",
95
+ "template_data": "${new.template_data}",
96
+ "attachments": "${new.attachments}",
97
+ "reply_to": "${new.reply_to}",
98
+ "ref_entity": "${new.ref_entity}",
99
+ "ref_seq": "${new.ref_seq}"
100
+ }
101
+ ]
102
+ },
103
+ "read_only": true
104
+ }
@@ -0,0 +1,65 @@
1
+ {
2
+ "name": "alimtalk_log",
3
+ "description": "알림톡 발송 로그 — 워커가 소비하는 DB 큐 역할을 합니다. 사용자 환경에 맞게 fields를 자유롭게 확장할 수 있습니다.",
4
+ "history": false,
5
+ "read_only": true,
6
+ "compress": true,
7
+ "fields": {
8
+ "status": {
9
+ "index": true,
10
+ "type": [
11
+ "pending",
12
+ "processing",
13
+ "sent",
14
+ "delivered",
15
+ "failed",
16
+ "expired"
17
+ ],
18
+ "default": "pending",
19
+ "comment": "발송 상태 (delivered = 프로바이더 수신 확인)"
20
+ },
21
+ "template_code": {
22
+ "index": true,
23
+ "comment": "카카오 알림톡 템플릿 코드",
24
+ "required": true
25
+ },
26
+ "receiver": {
27
+ "index": true,
28
+ "hash": true,
29
+ "comment": "수신자 전화번호",
30
+ "required": true
31
+ },
32
+ "alimtalk_msg_seq": {
33
+ "index": true,
34
+ "comment": "alimtalk_msg 참조 seq"
35
+ },
36
+ "template_name": {
37
+ "comment": "내부 템플릿 이름"
38
+ },
39
+ "variables_json": {
40
+ "type": "text",
41
+ "comment": "템플릿 변수 JSON"
42
+ },
43
+ "provider": {
44
+ "comment": "사용 프로바이더"
45
+ },
46
+ "provider_msg_id": {
47
+ "comment": "프로바이더 메시지 ID"
48
+ },
49
+ "error_message": {
50
+ "type": "text",
51
+ "comment": "오류 메시지"
52
+ },
53
+ "retry_count": {
54
+ "type": "uint",
55
+ "default": 0
56
+ },
57
+ "sent_at": {
58
+ "type": "string"
59
+ },
60
+ "delivered_at": {
61
+ "type": "string",
62
+ "comment": "프로바이더 수신 확인 시각"
63
+ }
64
+ }
65
+ }