create-entity-server 0.0.27 → 0.2.2

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 (100) hide show
  1. package/package.json +1 -1
  2. package/template/configs/cache.json +2 -1
  3. package/template/configs/database.json +18 -7
  4. package/template/entities/README.md +3 -3
  5. package/template/entities/System/Address/addr_dong.json +10115 -0
  6. package/template/entities/System/Address/addr_sido.json +39 -0
  7. package/template/entities/System/Address/addr_sigungu.json +1398 -0
  8. package/template/entities/System/Auth/account.json +94 -18
  9. package/template/entities/System/Auth/account_audit.json +11 -3
  10. package/template/entities/System/Auth/account_device.json +13 -27
  11. package/template/entities/System/Auth/account_login_log.json +17 -7
  12. package/template/entities/System/Auth/anon_device.json +56 -0
  13. package/template/entities/System/Auth/api_keys.json +18 -9
  14. package/template/entities/System/Auth/license.json +41 -20
  15. package/template/entities/System/Auth/rbac_roles.json +10 -7
  16. package/template/entities/System/Backup/backup_log.json +11 -7
  17. package/template/entities/System/Email/smtp_log.json +9 -5
  18. package/template/entities/System/Email/smtp_msg.json +5 -5
  19. package/template/entities/System/Storage/file_backup_log.json +11 -6
  20. package/template/entities/System/Storage/file_download_log.json +7 -5
  21. package/template/entities/System/Storage/file_meta.json +20 -7
  22. package/template/entities/System/system_audit_log.json +38 -34
  23. package/template/entities/company.json +5 -2
  24. package/template/entities/goods.json +10 -3
  25. package/template/entities/todo.json +4 -2
  26. package/template/samples/entities/01_basic_fields.json +15 -2
  27. package/template/samples/entities/02_types_and_defaults.json +15 -5
  28. package/template/samples/entities/03_hash_and_unique.json +18 -3
  29. package/template/samples/entities/04_fk_and_composite_unique.json +18 -3
  30. package/template/samples/entities/05_cache.json +15 -9
  31. package/template/samples/entities/06_history_and_hard_delete.json +19 -6
  32. package/template/samples/entities/07_license_scope.json +18 -3
  33. package/template/samples/entities/08_hook_sql.json +24 -5
  34. package/template/samples/entities/09_hook_entity.json +12 -2
  35. package/template/samples/entities/10_hook_submit_delete.json +14 -5
  36. package/template/samples/entities/11_hook_webhook.json +20 -6
  37. package/template/samples/entities/12_hook_push.json +15 -2
  38. package/template/samples/entities/13_read_only.json +8 -4
  39. package/template/samples/entities/14_optimistic_lock.json +13 -2
  40. package/template/samples/entities/15_reset_defaults.json +7 -1
  41. package/template/samples/entities/16_isolated_license.json +19 -6
  42. package/template/scripts/reset-all.sh +130 -3
  43. package/template/scripts/run.sh +129 -33
  44. package/template/templates/ocr/business_reg.json +145 -0
  45. package/template/templates/ocr/career_cert.json +93 -0
  46. package/template/templates/ocr/driver_license.json +89 -0
  47. package/template/templates/ocr/facility_card.json +82 -0
  48. package/template/templates/ocr/id_card.json +55 -0
  49. package/template/templates/ocr/invoice.json +92 -0
  50. package/template/templates/ocr/namecard.json +116 -0
  51. package/template/templates/ocr/prompts/business_reg.json +14 -0
  52. package/template/templates/ocr/prompts/career_cert.json +16 -0
  53. package/template/templates/ocr/prompts/driver_license.json +14 -0
  54. package/template/templates/ocr/prompts/facility_card.json +15 -0
  55. package/template/templates/ocr/prompts/general.json +13 -0
  56. package/template/templates/ocr/prompts/id_card.json +11 -0
  57. package/template/templates/ocr/prompts/invoice.json +17 -0
  58. package/template/templates/ocr/prompts/namecard.json +15 -0
  59. package/template/templates/ocr/prompts/receipt.json +14 -0
  60. package/template/templates/ocr/receipt.json +79 -0
  61. package/template/configs/auth/identity.json +0 -27
  62. package/template/configs/auth/oauth.json +0 -40
  63. package/template/configs/auth/password.json +0 -33
  64. package/template/configs/auth/privacy_policy.json +0 -28
  65. package/template/configs/auth/two_factor.json +0 -12
  66. package/template/configs/extensions/pg.json +0 -37
  67. package/template/configs/extensions/tax-invoice.json +0 -59
  68. package/template/configs/keys/apns.p8.example +0 -7
  69. package/template/configs/keys/firebase.pem.example +0 -7
  70. package/template/configs/notification/alimtalk.json +0 -75
  71. package/template/configs/notification/push.json +0 -25
  72. package/template/configs/notification/sms.json +0 -54
  73. package/template/entities/System/Auth/account_oauth.json +0 -45
  74. package/template/entities/System/Auth/identity_verification.json +0 -95
  75. package/template/entities/System/Auth/password_history.json +0 -20
  76. package/template/entities/System/Notification/alimtalk_log.json +0 -45
  77. package/template/entities/System/Notification/alimtalk_msg.json +0 -39
  78. package/template/entities/System/Notification/friendtalk_log.json +0 -48
  79. package/template/entities/System/Notification/friendtalk_msg.json +0 -63
  80. package/template/entities/System/Notification/sms_log.json +0 -26
  81. package/template/entities/System/Notification/sms_msg.json +0 -52
  82. package/template/entities/System/Notification/sms_verification.json +0 -40
  83. package/template/entities/System/Payment/pg_cancel.json +0 -45
  84. package/template/entities/System/Payment/pg_order.json +0 -88
  85. package/template/entities/System/Payment/pg_webhook_log.json +0 -37
  86. package/template/entities/System/Push/push_log.json +0 -71
  87. package/template/entities/System/Push/push_msg.json +0 -55
  88. package/template/templates/email/account/dormancy_warning.html +0 -20
  89. package/template/templates/email/account/password_expiry_warning.html +0 -21
  90. package/template/templates/email/auth/2fa_disabled.html +0 -23
  91. package/template/templates/email/auth/2fa_recovery_regenerated.html +0 -31
  92. package/template/templates/email/auth/2fa_setup_complete.html +0 -43
  93. package/template/templates/email/auth/email_verification.html +0 -18
  94. package/template/templates/email/auth/force_reset.html +0 -18
  95. package/template/templates/email/auth/password_reset.html +0 -19
  96. package/template/templates/email/auth/verification.html +0 -15
  97. package/template/templates/email/auth/verification_link.html +0 -25
  98. package/template/templates/email/auth/welcome.html +0 -18
  99. package/template/templates/email/order/order_confirmation.html +0 -30
  100. /package/template/configs/{notification/smtp.json → smtp.json} +0 -0
@@ -1,36 +1,101 @@
1
1
  {
2
2
  "name": "account",
3
- "description": "JWT 로그인/인증 계정 예제. 사용자 환경에 맞게 index·fields를 자유롭게 확장할 수 있습니다.",
4
- "index": {
5
- "user_seq": {
6
- "comment": "사용자번호"
7
- },
3
+ "description": "JWT 로그인/인증용 계정 정보. 사용자 환경에 맞게 fields를 자유롭게 확장할 수 있습니다.",
4
+ "fields": {
8
5
  "email": {
6
+ "index": true,
7
+ "hash": true,
9
8
  "comment": "이메일",
10
9
  "type": "email",
11
10
  "required": true,
12
11
  "unique": true
13
12
  },
14
- "status": {
15
- "comment": "상태",
16
- "type": ["active", "inactive", "blocked"],
17
- "default": "active"
18
- },
19
13
  "rbac_role": {
20
- "comment": "RBAC 역할 (JWT 인증/인가에 사용)",
14
+ "index": true,
15
+ "comment": "엔티티 접근 역할",
21
16
  "type": ["admin", "editor", "viewer", "auditor", "user"],
22
17
  "default": "user"
18
+ },
19
+ "status": {
20
+ "index": true,
21
+ "comment": "계정 상태",
22
+ "type": ["active", "inactive", "blocked", "dormant"],
23
+ "default": "active"
24
+ },
25
+ "max_session_cnt": {
26
+ "type": "uint"
27
+ },
28
+ "has_password": {
29
+ "type": "bool",
30
+ "comment": "비밀번호 설정 여부 (소셜 전용 계정 구분)"
31
+ },
32
+ "last_login_time": {
33
+ "comment": "마지막 로그인 시각 (휴면 판단 기준)"
34
+ },
35
+ "passwd_changed_time": {
36
+ "comment": "마지막 비밀번호 변경 시각 (만료 정책 기준)"
37
+ },
38
+ "temp_password_hash": {
39
+ "type": "varchar(128)",
40
+ "comment": "임시 비밀번호 해시 (비밀번호 초기화 요청 시 발급)"
41
+ },
42
+ "temp_password_issued_time": {
43
+ "comment": "임시 비밀번호 발급 시각"
44
+ },
45
+ "force_password_change": {
46
+ "type": "bool",
47
+ "default": false,
48
+ "comment": "다음 로그인 시 비밀번호 변경 강제"
23
49
  }
24
50
  },
25
- "fk": {
26
- "user_seq": "user.seq"
27
- },
28
51
  "reset_defaults": [
29
52
  {
30
- "email": "admin@example.com",
53
+ "email": "admin1@${DEFAULT_EMAIL_DOMAIN}",
31
54
  "passwd": "admin12345",
32
55
  "rbac_role": "admin",
33
56
  "status": "active"
57
+ },
58
+ {
59
+ "email": "admin2@${DEFAULT_EMAIL_DOMAIN}",
60
+ "passwd": "admin12345",
61
+ "rbac_role": "admin",
62
+ "status": "active"
63
+ },
64
+ {
65
+ "email": "admin3@${DEFAULT_EMAIL_DOMAIN}",
66
+ "passwd": "admin12345",
67
+ "rbac_role": "admin",
68
+ "status": "active"
69
+ },
70
+ {
71
+ "email": "test1@${DEFAULT_EMAIL_DOMAIN}",
72
+ "passwd": "test12345",
73
+ "rbac_role": "user",
74
+ "status": "active"
75
+ },
76
+ {
77
+ "email": "test2@${DEFAULT_EMAIL_DOMAIN}",
78
+ "passwd": "test12345",
79
+ "rbac_role": "user",
80
+ "status": "active"
81
+ },
82
+ {
83
+ "email": "test3@${DEFAULT_EMAIL_DOMAIN}",
84
+ "passwd": "test12345",
85
+ "rbac_role": "user",
86
+ "status": "active"
87
+ },
88
+ {
89
+ "email": "test4@${DEFAULT_EMAIL_DOMAIN}",
90
+ "passwd": "test12345",
91
+ "rbac_role": "user",
92
+ "status": "active"
93
+ },
94
+ {
95
+ "email": "test5@${DEFAULT_EMAIL_DOMAIN}",
96
+ "passwd": "test12345",
97
+ "rbac_role": "user",
98
+ "status": "active"
34
99
  }
35
100
  ],
36
101
  "hooks": {
@@ -39,7 +104,7 @@
39
104
  "type": "sql",
40
105
  "query": "INSERT INTO account_audit (account_seq, action, email, created_time) VALUES (?, ?, ?, NOW())",
41
106
  "params": ["${new.seq}", "INSERT", "${new.email}"],
42
- "async": false
107
+ "required": true
43
108
  }
44
109
  ],
45
110
  "after_update": [
@@ -47,7 +112,7 @@
47
112
  "type": "sql",
48
113
  "query": "INSERT INTO account_audit (account_seq, action, email, created_time) VALUES (?, ?, ?, NOW())",
49
114
  "params": ["${new.seq}", "UPDATE", "${new.email}"],
50
- "async": false
115
+ "required": true
51
116
  }
52
117
  ],
53
118
  "after_delete": [
@@ -55,7 +120,18 @@
55
120
  "type": "sql",
56
121
  "query": "INSERT INTO account_audit (account_seq, action, email, created_time) VALUES (?, ?, ?, NOW())",
57
122
  "params": ["${old.seq}", "DELETE", "${old.email}"],
58
- "async": false
123
+ "required": true
124
+ }
125
+ ],
126
+ "after_get": [
127
+ {
128
+ "type": "entity",
129
+ "entity": "account_device",
130
+ "action": "list",
131
+ "conditions": {
132
+ "account_seq": "${new.seq}"
133
+ },
134
+ "assign_to": "devices"
59
135
  }
60
136
  ]
61
137
  }
@@ -1,21 +1,29 @@
1
1
  {
2
2
  "name": "account_audit",
3
- "description": "account 감사 로그. account.json 훅(after_insert/after_update/after_delete)에 의해 자동 기록됩니다. 사용자 환경에 맞게 index·fields를 자유롭게 확장할 수 있습니다.",
3
+ "description": "account 감사 로그. account.json 훅(after_insert/after_update/after_delete)에 의해 자동 기록됩니다. 사용자 환경에 맞게 fields를 자유롭게 확장할 수 있습니다.",
4
4
  "hard_delete": true,
5
5
  "read_only": true,
6
6
  "compress": true,
7
- "index": {
7
+ "fields": {
8
8
  "account_seq": {
9
+ "index": true,
9
10
  "comment": "계정 seq (JWT 인증 시 account.seq 참조. HMAC은 nullable)",
10
11
  "type": "bigint",
11
12
  "nullable": true
12
13
  },
13
14
  "action": {
15
+ "index": true,
14
16
  "comment": "작업 유형 (after_insert → INSERT, after_update → UPDATE, after_delete → DELETE)",
15
- "type": ["INSERT", "UPDATE", "DELETE"],
17
+ "type": [
18
+ "INSERT",
19
+ "UPDATE",
20
+ "DELETE"
21
+ ],
16
22
  "required": true
17
23
  },
18
24
  "email": {
25
+ "index": true,
26
+ "hash": true,
19
27
  "comment": "작업 대상 계정 이메일",
20
28
  "nullable": true
21
29
  }
@@ -1,47 +1,31 @@
1
1
  {
2
2
  "name": "account_device",
3
- "description": "계정 기기 정보 및 푸시 토큰 관리. JWT 인증 시 account_seq로 계정과 연결. 사용자 환경에 맞게 index·fields를 자유롭게 확장할 수 있습니다.",
3
+ "description": "회원 계정 기기 정보 및 푸시 토큰 관리. account_seq로 계정과 연결되며 회원 전용으로 사용합니다. 사용자 환경에 맞게 fields를 자유롭게 확장할 수 있습니다.",
4
4
  "license_scope": false,
5
- "index": {
5
+ "fields": {
6
6
  "account_seq": {
7
- "comment": "계정seq (JWT 인증 시 필수. HMAC 인증은 nullable)"
7
+ "index": true,
8
+ "required": true,
9
+ "comment": "계정seq (회원 계정 필수)"
8
10
  },
9
11
  "id": {
12
+ "index": true,
10
13
  "comment": "기기ID"
11
14
  },
12
15
  "push_enabled": {
16
+ "index": true,
13
17
  "comment": "푸시 수신 허용",
14
18
  "type": "bool",
15
19
  "default": true
16
- }
17
- },
18
- "unique": [
19
- [
20
- "id",
21
- "account_seq"
22
- ]
23
- ],
24
- "fields": {
20
+ },
25
21
  "device_type": {
26
22
  "comment": "기기유형",
27
- "type": [
28
- "mobile",
29
- "tablet",
30
- "desktop",
31
- "watch"
32
- ],
23
+ "type": ["mobile", "tablet", "desktop", "watch"],
33
24
  "default": "mobile"
34
25
  },
35
26
  "platform": {
36
27
  "comment": "플랫폼",
37
- "type": [
38
- "android",
39
- "ios",
40
- "web",
41
- "windows",
42
- "macos",
43
- "linux"
44
- ]
28
+ "type": ["android", "ios", "web", "windows", "macos", "linux"]
45
29
  },
46
30
  "browser": {
47
31
  "comment": "브라우저"
@@ -59,5 +43,7 @@
59
43
  "last_ip_addr": {
60
44
  "comment": "마지막IP주소"
61
45
  }
62
- }
46
+ },
47
+ "unique": [["id", "account_seq"]],
48
+ "history": false
63
49
  }
@@ -1,46 +1,56 @@
1
1
  {
2
2
  "name": "account_login_log",
3
- "description": "account_login_log 엔티티. 사용자 환경에 맞게 index·fields를 자유롭게 확장할 수 있습니다.",
3
+ "description": "account_login_log 엔티티. 사용자 환경에 맞게 fields를 자유롭게 확장할 수 있습니다.",
4
4
  "compress": true,
5
- "index": {
5
+ "fields": {
6
6
  "browser": {
7
+ "index": true,
7
8
  "comment": "브라우저"
8
9
  },
9
10
  "country_code": {
11
+ "index": true,
10
12
  "comment": "국가코드 iso2"
11
13
  },
12
14
  "device_id": {
15
+ "index": true,
13
16
  "comment": "디바이스 ID",
14
17
  "type": "string"
15
18
  },
16
19
  "device_type": {
20
+ "index": true,
17
21
  "comment": "장치종류"
18
22
  },
19
23
  "domain": {
24
+ "index": true,
20
25
  "comment": "도메인"
21
26
  },
22
27
  "email": {
28
+ "index": true,
29
+ "hash": true,
23
30
  "comment": "로그인 이메일"
24
31
  },
25
32
  "ip_address": {
33
+ "index": true,
34
+ "hash": true,
26
35
  "comment": "접속아이피"
27
36
  },
28
37
  "is_success": {
38
+ "index": true,
29
39
  "comment": "성공여부"
30
40
  },
31
41
  "language": {
32
42
  "comment": "언어"
33
43
  },
34
- "user_seq": {
35
- "comment": "사용자번호"
44
+ "account_seq": {
45
+ "index": true,
46
+ "comment": "계정번호"
36
47
  },
37
48
  "auth_method": {
49
+ "index": true,
38
50
  "comment": "인증 방식",
39
51
  "type": ["password", "oauth", "2fa_totp", "2fa_recovery"],
40
52
  "default": "password"
41
- }
42
- },
43
- "fields": {
53
+ },
44
54
  "location_info": {
45
55
  "comment": "위치"
46
56
  },
@@ -0,0 +1,56 @@
1
+ {
2
+ "name": "anon_device",
3
+ "description": "비회원 디바이스 식별 및 사용 제한 집계. device_id 쿠키 값 기반으로 추적하며 익명 사용자 전용으로 사용합니다. 사용자 환경에 맞게 fields를 자유롭게 확장할 수 있습니다.",
4
+ "license_scope": false,
5
+ "fields": {
6
+ "id": {
7
+ "index": true,
8
+ "required": true,
9
+ "unique": true,
10
+ "comment": "익명 디바이스 ID (cookie/device_id)"
11
+ },
12
+ "calc_count": {
13
+ "index": true,
14
+ "type": "uint",
15
+ "default": 0,
16
+ "comment": "거리 계산 사용 횟수"
17
+ },
18
+ "first_seen_time": {
19
+ "comment": "최초 식별 시각"
20
+ },
21
+ "last_seen_time": {
22
+ "index": true,
23
+ "comment": "마지막 식별 시각"
24
+ },
25
+ "last_calc_time": {
26
+ "index": true,
27
+ "comment": "마지막 거리 계산 시각"
28
+ },
29
+ "blocked_until_time": {
30
+ "index": true,
31
+ "comment": "차단 해제 시각"
32
+ },
33
+ "last_ip_addr": {
34
+ "comment": "마지막 IP주소"
35
+ },
36
+ "device_type": {
37
+ "comment": "기기유형",
38
+ "type": ["mobile", "tablet", "desktop", "watch"],
39
+ "default": "mobile"
40
+ },
41
+ "platform": {
42
+ "comment": "플랫폼",
43
+ "type": ["android", "ios", "web", "windows", "macos", "linux"]
44
+ },
45
+ "browser": {
46
+ "comment": "브라우저"
47
+ },
48
+ "browser_version": {
49
+ "comment": "브라우저버전"
50
+ },
51
+ "user_agent": {
52
+ "comment": "User Agent"
53
+ }
54
+ },
55
+ "history": false
56
+ }
@@ -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 시크릿 관리. 사용자 환경에 맞게 index·fields를 자유롭게 확장할 수 있습니다.",
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
  }
@@ -1,36 +1,57 @@
1
1
  {
2
2
  "name": "license",
3
- "description": "license Entity. 사용자 환경에 맞게 index·fields를 자유롭게 확장할 수 있습니다.",
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
  }
@@ -1,23 +1,26 @@
1
1
  {
2
2
  "name": "rbac_roles",
3
- "description": "RBAC 역할 정의 예제. 사용자 환경에 맞게 index·fields를 자유롭게 확장할 수 있습니다.",
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",
@@ -1,12 +1,13 @@
1
1
  {
2
2
  "name": "backup_log",
3
- "description": "백업 작업 이력. 사용자 환경에 맞게 index·fields를 자유롭게 확장할 수 있습니다.",
3
+ "description": "백업 작업 이력. 사용자 환경에 맞게 fields를 자유롭게 확장할 수 있습니다.",
4
4
  "license_scope": false,
5
5
  "hard_delete": true,
6
6
  "history": false,
7
7
  "compress": true,
8
- "index": {
8
+ "fields": {
9
9
  "backup_type": {
10
+ "index": true,
10
11
  "type": [
11
12
  "data",
12
13
  "file",
@@ -14,9 +15,14 @@
14
15
  ],
15
16
  "required": true
16
17
  },
17
- "finished_time": {},
18
- "started_time": {},
18
+ "finished_time": {
19
+ "index": true
20
+ },
21
+ "started_time": {
22
+ "index": true
23
+ },
19
24
  "status": {
25
+ "index": true,
20
26
  "type": [
21
27
  "running",
22
28
  "completed",
@@ -24,9 +30,7 @@
24
30
  "failed"
25
31
  ],
26
32
  "required": true
27
- }
28
- },
29
- "fields": {
33
+ },
30
34
  "session_id": {
31
35
  "description": "백업 세션 ID (타임스탬프)"
32
36
  },
@@ -1,28 +1,34 @@
1
1
  {
2
2
  "name": "smtp_log",
3
- "description": "SMTP 이메일 발송 이력. 발송 결과 추적 및 재시도 관리용. 사용자 환경에 맞게 index·fields를 자유롭게 확장할 수 있습니다.",
3
+ "description": "SMTP 이메일 발송 이력. 발송 결과 추적 및 재시도 관리용. 사용자 환경에 맞게 fields를 자유롭게 확장할 수 있습니다.",
4
4
  "license_scope": false,
5
5
  "hard_delete": true,
6
6
  "history": false,
7
7
  "compress": true,
8
- "index": {
8
+ "fields": {
9
9
  "attempt_time": {
10
+ "index": true,
10
11
  "comment": "처리 시작(claim) 시각"
11
12
  },
12
13
  "provider": {
14
+ "index": true,
13
15
  "type": "varchar(50)"
14
16
  },
15
17
  "retry_count": {
18
+ "index": true,
16
19
  "type": "uint",
17
20
  "default": 0
18
21
  },
19
22
  "sent_time": {
23
+ "index": true,
20
24
  "comment": "발송 완료 시각"
21
25
  },
22
26
  "smtp_msg_seq": {
27
+ "index": true,
23
28
  "comment": "원본 smtp_msg seq"
24
29
  },
25
30
  "status": {
31
+ "index": true,
26
32
  "type": [
27
33
  "pending",
28
34
  "processing",
@@ -32,9 +38,7 @@
32
38
  ],
33
39
  "default": "pending",
34
40
  "required": true
35
- }
36
- },
37
- "fields": {
41
+ },
38
42
  "from": {
39
43
  "comment": "발신자"
40
44
  },
@@ -1,14 +1,16 @@
1
1
  {
2
2
  "name": "smtp_msg",
3
- "description": "SMTP 이메일 트리거 엔티티. insert 시 smtp hook으로 비동기 발송. 사용자 환경에 맞게 index·fields를 자유롭게 확장할 수 있습니다.",
3
+ "description": "SMTP 이메일 트리거 엔티티. insert 시 smtp hook으로 비동기 발송. 사용자 환경에 맞게 fields를 자유롭게 확장할 수 있습니다.",
4
4
  "hard_delete": true,
5
5
  "history": false,
6
- "index": {
6
+ "fields": {
7
7
  "provider": {
8
+ "index": true,
8
9
  "comment": "사용할 SMTP 프로바이더 키 (미지정 시 default)",
9
10
  "type": "varchar(50)"
10
11
  },
11
12
  "status": {
13
+ "index": true,
12
14
  "type": [
13
15
  "queued",
14
16
  "sent",
@@ -16,9 +18,7 @@
16
18
  ],
17
19
  "default": "queued",
18
20
  "required": true
19
- }
20
- },
21
- "fields": {
21
+ },
22
22
  "from": {
23
23
  "nullable": true,
24
24
  "comment": "발신자 이메일 (미지정 시 프로바이더 기본값)"