create-fullstack-scaffold 0.4.3 → 0.4.4

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 (147) hide show
  1. package/dist/cli/index.js +513 -122
  2. package/dist/cli/index.js.map +1 -1
  3. package/package.json +1 -1
  4. package/template/dist/cli/index.js +237 -94
  5. package/template/dist/cli/index.js.map +1 -1
  6. package/template/dist/client/admin.html +15 -10
  7. package/template/dist/client/assets/App-BpFUIC-5.js +114 -0
  8. package/template/dist/client/assets/{CartPage-DESSHkaG.js → CartPage-DgDZP-R5.js} +2 -2
  9. package/template/dist/client/assets/{CategoriesPage-DqLZ_Mom.js → CategoriesPage-fuYNiSmE.js} +2 -2
  10. package/template/dist/client/assets/ContentDetailPage-BvvFU1Mr.js +1 -0
  11. package/template/dist/client/assets/ContentListPage-ShPxo6WG.js +1 -0
  12. package/template/dist/client/assets/DashboardPage-C1rZzZo4.js +11 -0
  13. package/template/dist/client/assets/{DeveloperDashboardPage-Cum7zFwO.js → DeveloperDashboardPage-_WtmbVoA.js} +2 -2
  14. package/template/dist/client/assets/{EmptyState-BK7ttK8D.js → EmptyState-DEyOQjbY.js} +1 -1
  15. package/template/dist/client/assets/LoadingSpinner-BcHjaM1m.js +6 -0
  16. package/template/dist/client/assets/LoginPage-CjeQqDdO.js +1 -0
  17. package/template/dist/client/assets/LogoutOutlined-ColFAHdd.js +1 -0
  18. package/template/dist/client/assets/NotificationPage-DRkEv02s.js +1 -0
  19. package/template/dist/client/assets/OrdersPage-7I3vPWLP.js +11 -0
  20. package/template/dist/client/assets/{PluginDetailPage-Br24YS4P.js → PluginDetailPage-CWyxdVCg.js} +3 -13
  21. package/template/dist/client/assets/PluginsPage-DRgWLeJT.js +6 -0
  22. package/template/dist/client/assets/ProfilePage-2FFkaii8.js +16 -0
  23. package/template/dist/client/assets/PublishPage-DW7yvROx.js +1 -0
  24. package/template/dist/client/assets/{RegisterPage-rPFG4Sry.js → RegisterPage-Dvaf9b0e.js} +2 -2
  25. package/template/dist/client/assets/SaveOutlined-CLQ2tsSY.js +2 -0
  26. package/template/dist/client/assets/{SearchPage-DQl1U5Uy.js → SearchPage-DvnEyswS.js} +2 -2
  27. package/template/dist/client/assets/{SettingsPage-DaYE80wj.js → SettingsPage-IrU-L9Zr.js} +2 -2
  28. package/template/dist/client/assets/{StatusBadge-BJ3W2Zc7.js → StatusBadge-CG7wVqpu.js} +1 -1
  29. package/template/dist/client/assets/{TodoPage-zC5wWNBa.js → TodoPage-B7D-bl65.js} +3 -3
  30. package/template/dist/client/assets/TopicsPage-CYCNr-mn.js +6 -0
  31. package/template/dist/client/assets/{WebSocketPage-B4NLdz1w.js → WebSocketPage-CGEg6QJE.js} +2 -2
  32. package/template/dist/client/assets/{activity-B94BUAsD.js → activity-CgTz9Mrd.js} +1 -1
  33. package/template/dist/client/assets/admin-D2iHWNOg.js +1 -0
  34. package/template/dist/client/assets/api-request-DIJocPxr.js +356 -0
  35. package/template/dist/client/assets/{arrow-left-H5JH0iU1.js → arrow-left-DtLQ3tTk.js} +1 -1
  36. package/template/dist/client/assets/{chevron-down-DwRh_wjD.js → chevron-down-CpIAV_yr.js} +1 -1
  37. package/template/dist/client/assets/{chevron-right-CpIWaqAL.js → chevron-right-CnU7oPQs.js} +1 -1
  38. package/template/dist/client/assets/{circle-check-big-CSElLscG.js → circle-check-big-CrZdwS75.js} +1 -1
  39. package/template/dist/client/assets/{circle-x-CYxr4RAw.js → circle-x-CvN9r3fW.js} +1 -1
  40. package/template/dist/client/assets/{clock-BseUJ7ex.js → clock-CTeSZBiH.js} +1 -1
  41. package/template/dist/client/assets/{download-BsGC_Xhq.js → download-OSVfVuNV.js} +1 -1
  42. package/template/dist/client/assets/{external-link-UTDzdjq8.js → external-link-fBsuHMby.js} +1 -1
  43. package/template/dist/client/assets/{eye-nR10ui7i.js → eye-CwlZZEsj.js} +1 -1
  44. package/template/dist/client/assets/index-09IqiOaE.css +1 -0
  45. package/template/dist/client/assets/index-B3CRby6r.js +51 -0
  46. package/template/dist/client/assets/index-CC_zy73y.js +17 -0
  47. package/template/dist/client/assets/main-Cn4IDo2I.js +92 -0
  48. package/template/dist/client/assets/merchant-DDDN9bMu.js +40 -0
  49. package/template/dist/client/assets/{message-square-CwWGL-Bh.js → message-square-BRaZfgbJ.js} +1 -1
  50. package/template/dist/client/assets/pluginStore-DDsWJPe6.js +1 -0
  51. package/template/dist/client/assets/{plus-pZld_nUL.js → plus-DDZfPiDJ.js} +1 -1
  52. package/template/dist/client/assets/sse-client-DGQ072hl.js +64 -0
  53. package/template/dist/client/assets/star-C7tO6w4H.js +11 -0
  54. package/template/dist/client/assets/{tag-DsiUPF90.js → tag-DBfpQDuJ.js} +1 -1
  55. package/template/dist/client/assets/tenant-CizbLaLJ.js +1 -0
  56. package/template/dist/client/assets/{trash-2-DRblNbnA.js → trash-2-BP7fkd5b.js} +1 -1
  57. package/template/dist/client/assets/{triangle-alert-D1CLh-Vd.js → triangle-alert-CrOQEdJ2.js} +1 -1
  58. package/template/dist/client/assets/{wifi-BwXjnCqI.js → wifi-CwYSE0J4.js} +1 -1
  59. package/template/dist/client/assets/{x-BH2rJdFq.js → x-t615pnNR.js} +1 -1
  60. package/template/dist/client/content/index.html +5 -4
  61. package/template/dist/client/index.html +4 -3
  62. package/template/dist/client/merchant.html +18 -0
  63. package/template/dist/client/notifications/index.html +6 -5
  64. package/template/dist/client/tenant.html +18 -0
  65. package/template/dist/client/todos/index.html +6 -5
  66. package/template/dist/client/websocket/index.html +6 -5
  67. package/template/dist/cloudflare/chunk-HX7DVRDX.js +1 -0
  68. package/template/dist/cloudflare/{chunk-QBHAPWIA.js → chunk-IXJL2LE4.js} +1 -1
  69. package/template/dist/cloudflare/chunk-Q34AN3RF.js +14 -0
  70. package/template/dist/cloudflare/{chunk-BHPTQ4K2.js → chunk-ZAMVL4EG.js} +2 -2
  71. package/template/dist/cloudflare/cloudflare.js +35 -29
  72. package/template/dist/cloudflare/db-4AQOSFAX.js +1 -0
  73. package/template/dist/cloudflare/{migrator-2ZYYKNI5.js → migrator-TEPBVUFO.js} +1 -1
  74. package/template/dist/cloudflare/permission-service-impl-RE7NPW3Q.js +1 -0
  75. package/template/dist/cloudflare/schema-DVEMT3X2.js +1 -0
  76. package/template/dist/cloudflare/test-setup-Z2RYE5B4.js +265 -0
  77. package/template/dist/server/chunk-27SIJSPF.js +1 -0
  78. package/template/dist/server/chunk-37QNGBQU.js +1 -0
  79. package/template/dist/server/chunk-FIY4CGJJ.js +1 -0
  80. package/template/dist/server/chunk-HZUDBIT4.js +1 -0
  81. package/template/dist/server/chunk-I6OBDFDU.js +1 -0
  82. package/template/dist/server/chunk-JHNYLNG7.js +1 -0
  83. package/template/dist/server/chunk-MDOVVKKD.js +1 -0
  84. package/template/dist/server/chunk-NSOCT7E5.js +1 -0
  85. package/template/dist/server/chunk-OU5IGVVO.js +1 -0
  86. package/template/dist/server/chunk-OYCBNRMK.js +1 -0
  87. package/template/dist/server/chunk-P2RJNNGD.js +1 -0
  88. package/template/dist/server/chunk-UMAQLNPE.js +1 -0
  89. package/template/dist/server/chunk-XZZTSRSN.js +1 -0
  90. package/template/dist/server/content-service-5QVHDR5X.js +1 -0
  91. package/template/dist/server/db-FLI5L5DD.js +1 -0
  92. package/template/dist/server/dispute-service-E2FCYUEM.js +1 -0
  93. package/template/dist/server/init-72JXJV3I.js +46 -0
  94. package/template/dist/server/init-FWYXSKPX.js +46 -0
  95. package/template/dist/server/node.js +34 -28
  96. package/template/dist/server/order-service-TKGG5S5K.js +1 -0
  97. package/template/dist/server/permission-service-impl-M3AKEYNY.js +1 -0
  98. package/template/dist/server/schema-V4UG7HMU.js +1 -0
  99. package/template/dist/server/tenant-service-JG6UUWXQ.js +1 -0
  100. package/template/dist/server/tenant-service-XJWZSEDX.js +1 -0
  101. package/template/dist/{cloudflare/test-setup-NMZJZLRV.js → server/test-setup-VFOPBGYM.js} +83 -2
  102. package/template/dist/server/ticket-service-3RSW7V2Z.js +1 -0
  103. package/template/dist/server/todo-service-S6BGIO7D.js +1 -0
  104. package/template/src/merchant/pages/DisputesPage.tsx +11 -11
  105. package/template/src/merchant/pages/OrdersPage.tsx +4 -3
  106. package/template/src/merchant/pages/ProductsPage.tsx +2 -2
  107. package/template/src/merchant/stores/merchantStore.ts +11 -6
  108. package/template/src/server/db/init.ts +5 -642
  109. package/template/src/server/module-plugin/services/plugin-seed-service.ts +623 -0
  110. package/template/src/server/module-tenant/routes/tenant-routes.ts +2 -2
  111. package/template/src/server/module-tenant/services/tenant-service.ts +63 -17
  112. package/template/src/shared/modules/merchant/index.ts +9 -0
  113. package/template/src/shared/modules/merchant/schemas.ts +37 -0
  114. package/template/src/shared/modules/tenant/index.ts +2 -0
  115. package/template/src/shared/schemas/index.ts +27 -0
  116. package/template/src/tenant/layouts/Header.tsx +1 -1
  117. package/template/src/tenant/layouts/Sidebar.tsx +1 -1
  118. package/template/src/tenant/pages/SettingsPage.tsx +4 -8
  119. package/template/src/tenant/stores/tenantStore.ts +41 -302
  120. package/template/tsconfig.json +1 -0
  121. package/template/tsup.config.ts +11 -3
  122. package/template/dist/client/assets/ContentDetailPage-DdltMANL.js +0 -1
  123. package/template/dist/client/assets/ContentListPage-B63sUB6N.js +0 -1
  124. package/template/dist/client/assets/DashboardPage-tUMilc7Z.js +0 -11
  125. package/template/dist/client/assets/LoadingSpinner-DVYOLSRM.js +0 -6
  126. package/template/dist/client/assets/LoginPage-g9mSLIMC.js +0 -6
  127. package/template/dist/client/assets/NotificationPage-COTzp-HD.js +0 -1
  128. package/template/dist/client/assets/OrdersPage-BsPh4oEI.js +0 -11
  129. package/template/dist/client/assets/PluginsPage-BNtAe_yo.js +0 -6
  130. package/template/dist/client/assets/ProfilePage-dL_iSuZN.js +0 -16
  131. package/template/dist/client/assets/PublishPage-D96FnbLA.js +0 -1
  132. package/template/dist/client/assets/TopicsPage-DyLjZa4D.js +0 -6
  133. package/template/dist/client/assets/admin-Bh1vfz_L.js +0 -486
  134. package/template/dist/client/assets/index-1bA-ixFv.js +0 -114
  135. package/template/dist/client/assets/index-CWh3vXC_.css +0 -1
  136. package/template/dist/client/assets/main-DHnArIp_.js +0 -82
  137. package/template/dist/client/assets/pluginStore-XQfsm3iR.js +0 -1
  138. package/template/dist/client/content/content-1/index.html +0 -18
  139. package/template/dist/client/content/content-13/index.html +0 -18
  140. package/template/dist/client/content/content-14/index.html +0 -18
  141. package/template/dist/client/content/content-15/index.html +0 -18
  142. package/template/dist/client/content/content-19/index.html +0 -18
  143. package/template/dist/client/content/content-2/index.html +0 -18
  144. package/template/dist/client/content/content-20/index.html +0 -18
  145. package/template/dist/cloudflare/chunk-YY6FRMAQ.js +0 -14
  146. package/template/dist/cloudflare/db-7J42RQ3T.js +0 -1
  147. package/template/dist/cloudflare/permission-service-impl-TGXVSSSA.js +0 -1
@@ -0,0 +1 @@
1
+ import {m}from'./chunk-HX7DVRDX.js';export{k as closeDb,c as getDatabaseConfig,i as getDb,j as getRawClient,l as runMigrations}from'./chunk-HX7DVRDX.js';export{_ as contentCategories,Z as contentStatuses,$ as contents,aa as developers,X as disputeStatuses,W as disputeTypes,Y as disputes,G as notifications,O as orderStatuses,P as orders,N as permissionAuditLogs,M as permissionRouteMappings,H as permissions,fa as pluginCategories,ga as pluginCategoryMappings,ea as pluginReviews,ba as pluginStatus,da as pluginVersions,ca as plugins,J as rolePermissions,I as roles,L as routes,ha as tenants,S as ticketCategories,R as ticketPriorities,V as ticketReplies,T as ticketReplyAuthorRoles,Q as ticketStatuses,U as tickets,F as todoAttachments,D as todoStatus,E as todos,K as userRoles}from'./chunk-Q34AN3RF.js';import'./chunk-IXJL2LE4.js';import'./chunk-5J6HXUF6.js';m();
@@ -1,4 +1,4 @@
1
- import {C,y}from'./chunk-QBHAPWIA.js';import {a}from'./chunk-5J6HXUF6.js';import E from'crypto';import m from'fs';function d(i){let t=i.migrationsFolder,s=[],a=`${t}/meta/_journal.json`;if(!m.existsSync(a))throw new Error("Can't find meta/_journal.json file");let l=m.readFileSync(`${t}/meta/_journal.json`).toString(),f=JSON.parse(l);for(let o of f.entries){let e=`${t}/${o.tag}.sql`;try{let n=m.readFileSync(`${t}/${o.tag}.sql`).toString(),c=n.split("--> statement-breakpoint").map(g=>g);s.push({sql:c,bps:o.breakpoints,folderMillis:o.when,hash:E.createHash("sha256").update(n).digest("hex")});}catch{throw new Error(`No file ${e} found in ${t} folder`)}}return s}var h=a(()=>{});async function w(i,t){let s=d(t),a=t.migrationsTable??"__drizzle_migrations",l=y`
1
+ import {C,y}from'./chunk-IXJL2LE4.js';import {a}from'./chunk-5J6HXUF6.js';import E from'crypto';import m from'fs';function d(i){let t=i.migrationsFolder,s=[],a=`${t}/meta/_journal.json`;if(!m.existsSync(a))throw new Error("Can't find meta/_journal.json file");let l=m.readFileSync(`${t}/meta/_journal.json`).toString(),f=JSON.parse(l);for(let o of f.entries){let e=`${t}/${o.tag}.sql`;try{let n=m.readFileSync(`${t}/${o.tag}.sql`).toString(),c=n.split("--> statement-breakpoint").map(g=>g);s.push({sql:c,bps:o.breakpoints,folderMillis:o.when,hash:E.createHash("sha256").update(n).digest("hex")});}catch{throw new Error(`No file ${e} found in ${t} folder`)}}return s}var h=a(()=>{});async function w(i,t){let s=d(t),a=t.migrationsTable??"__drizzle_migrations",l=y`
2
2
  CREATE TABLE IF NOT EXISTS ${y.identifier(a)} (
3
3
  id SERIAL PRIMARY KEY,
4
4
  hash text NOT NULL,
@@ -0,0 +1 @@
1
+ export{C as PermissionService,D as permissionService}from'./chunk-ZAMVL4EG.js';import'./chunk-HX7DVRDX.js';import'./chunk-Q34AN3RF.js';import'./chunk-IXJL2LE4.js';import'./chunk-5J6HXUF6.js';
@@ -0,0 +1 @@
1
+ import {ja}from'./chunk-Q34AN3RF.js';export{_ as contentCategories,Z as contentStatuses,$ as contents,aa as developers,X as disputeStatuses,W as disputeTypes,Y as disputes,G as notifications,O as orderStatuses,P as orders,N as permissionAuditLogs,M as permissionRouteMappings,H as permissions,fa as pluginCategories,ga as pluginCategoryMappings,ea as pluginReviews,ba as pluginStatus,da as pluginVersions,ca as plugins,J as rolePermissions,I as roles,L as routes,ha as tenants,S as ticketCategories,R as ticketPriorities,V as ticketReplies,T as ticketReplyAuthorRoles,Q as ticketStatuses,U as tickets,F as todoAttachments,D as todoStatus,E as todos,K as userRoles}from'./chunk-Q34AN3RF.js';import'./chunk-IXJL2LE4.js';import'./chunk-5J6HXUF6.js';ja();
@@ -0,0 +1,265 @@
1
+ import {m as m$1,j}from'./chunk-HX7DVRDX.js';import'./chunk-Q34AN3RF.js';import'./chunk-IXJL2LE4.js';import'./chunk-5J6HXUF6.js';m$1();async function O(){let e=await j();if(!e||!("execute"in e))throw new Error("Test database client not available");let t=`
2
+ CREATE TABLE IF NOT EXISTS todos (
3
+ id INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL,
4
+ title TEXT NOT NULL,
5
+ description TEXT,
6
+ status TEXT DEFAULT 'pending' NOT NULL,
7
+ created_at INTEGER DEFAULT (unixepoch() * 1000) NOT NULL,
8
+ updated_at INTEGER DEFAULT (unixepoch() * 1000) NOT NULL
9
+ );
10
+
11
+ CREATE TABLE IF NOT EXISTS todo_attachments (
12
+ id INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL,
13
+ todo_id INTEGER NOT NULL,
14
+ file_name TEXT NOT NULL,
15
+ original_name TEXT NOT NULL,
16
+ mime_type TEXT NOT NULL,
17
+ size INTEGER NOT NULL,
18
+ path TEXT NOT NULL,
19
+ uploaded_by TEXT,
20
+ created_at INTEGER DEFAULT (unixepoch() * 1000) NOT NULL,
21
+ FOREIGN KEY (todo_id) REFERENCES todos(id) ON DELETE CASCADE
22
+ );
23
+
24
+ CREATE TABLE IF NOT EXISTS notifications (
25
+ id TEXT PRIMARY KEY NOT NULL,
26
+ type TEXT NOT NULL,
27
+ title TEXT NOT NULL,
28
+ message TEXT NOT NULL,
29
+ read INTEGER DEFAULT false NOT NULL,
30
+ created_at INTEGER DEFAULT (unixepoch() * 1000) NOT NULL
31
+ );
32
+
33
+ CREATE TABLE IF NOT EXISTS permissions (
34
+ id TEXT PRIMARY KEY NOT NULL,
35
+ code TEXT NOT NULL UNIQUE,
36
+ name TEXT NOT NULL,
37
+ label TEXT NOT NULL,
38
+ category TEXT NOT NULL,
39
+ description TEXT,
40
+ sort_order INTEGER DEFAULT 0,
41
+ is_active INTEGER DEFAULT true,
42
+ created_at INTEGER,
43
+ updated_at INTEGER
44
+ );
45
+
46
+ CREATE TABLE IF NOT EXISTS roles (
47
+ id TEXT PRIMARY KEY NOT NULL,
48
+ code TEXT NOT NULL UNIQUE,
49
+ name TEXT NOT NULL,
50
+ label TEXT NOT NULL,
51
+ description TEXT,
52
+ is_system INTEGER DEFAULT false,
53
+ is_active INTEGER DEFAULT true,
54
+ sort_order INTEGER DEFAULT 0,
55
+ created_at INTEGER,
56
+ updated_at INTEGER
57
+ );
58
+
59
+ CREATE TABLE IF NOT EXISTS role_permissions (
60
+ role_id TEXT NOT NULL,
61
+ permission_id TEXT NOT NULL,
62
+ created_at INTEGER,
63
+ PRIMARY KEY(role_id, permission_id),
64
+ FOREIGN KEY (role_id) REFERENCES roles(id) ON DELETE CASCADE,
65
+ FOREIGN KEY (permission_id) REFERENCES permissions(id) ON DELETE CASCADE
66
+ );
67
+
68
+ CREATE TABLE IF NOT EXISTS user_roles (
69
+ id TEXT PRIMARY KEY NOT NULL,
70
+ user_id TEXT NOT NULL,
71
+ role_id TEXT NOT NULL,
72
+ assigned_by TEXT,
73
+ assigned_at INTEGER,
74
+ expires_at INTEGER,
75
+ is_active INTEGER DEFAULT true,
76
+ FOREIGN KEY (role_id) REFERENCES roles(id) ON DELETE CASCADE
77
+ );
78
+
79
+ CREATE TABLE IF NOT EXISTS routes (
80
+ id TEXT PRIMARY KEY NOT NULL,
81
+ path TEXT NOT NULL,
82
+ method TEXT NOT NULL,
83
+ name TEXT,
84
+ description TEXT,
85
+ module TEXT,
86
+ is_public INTEGER DEFAULT false,
87
+ is_active INTEGER DEFAULT true,
88
+ created_at INTEGER,
89
+ updated_at INTEGER
90
+ );
91
+
92
+ CREATE TABLE IF NOT EXISTS permission_routes (
93
+ permission_id TEXT NOT NULL,
94
+ route_id TEXT NOT NULL,
95
+ created_at INTEGER,
96
+ PRIMARY KEY(permission_id, route_id),
97
+ FOREIGN KEY (permission_id) REFERENCES permissions(id) ON DELETE CASCADE,
98
+ FOREIGN KEY (route_id) REFERENCES routes(id) ON DELETE CASCADE
99
+ );
100
+
101
+ CREATE TABLE IF NOT EXISTS permission_audit_logs (
102
+ id TEXT PRIMARY KEY NOT NULL,
103
+ user_id TEXT NOT NULL,
104
+ action TEXT NOT NULL,
105
+ resource_type TEXT NOT NULL,
106
+ resource_id TEXT,
107
+ old_value TEXT,
108
+ new_value TEXT,
109
+ ip_address TEXT,
110
+ user_agent TEXT,
111
+ created_at INTEGER
112
+ );
113
+
114
+ CREATE TABLE IF NOT EXISTS orders (
115
+ id INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL,
116
+ order_no TEXT NOT NULL,
117
+ customer_name TEXT NOT NULL,
118
+ customer_email TEXT NOT NULL,
119
+ product_name TEXT NOT NULL,
120
+ amount INTEGER NOT NULL,
121
+ status TEXT DEFAULT 'pending' NOT NULL,
122
+ created_at INTEGER DEFAULT (unixepoch() * 1000) NOT NULL,
123
+ updated_at INTEGER DEFAULT (unixepoch() * 1000) NOT NULL
124
+ );
125
+
126
+ CREATE TABLE IF NOT EXISTS tickets (
127
+ id INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL,
128
+ ticket_no TEXT NOT NULL,
129
+ customer_name TEXT NOT NULL,
130
+ customer_email TEXT NOT NULL,
131
+ subject TEXT NOT NULL,
132
+ description TEXT NOT NULL,
133
+ status TEXT DEFAULT 'open' NOT NULL,
134
+ priority TEXT DEFAULT 'medium' NOT NULL,
135
+ category TEXT NOT NULL,
136
+ assigned_to TEXT,
137
+ created_at INTEGER DEFAULT (unixepoch() * 1000) NOT NULL,
138
+ updated_at INTEGER DEFAULT (unixepoch() * 1000) NOT NULL
139
+ );
140
+
141
+ CREATE TABLE IF NOT EXISTS ticket_replies (
142
+ id INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL,
143
+ ticket_id INTEGER NOT NULL,
144
+ content TEXT NOT NULL,
145
+ author TEXT NOT NULL,
146
+ is_customer INTEGER DEFAULT 0 NOT NULL,
147
+ created_at INTEGER DEFAULT (unixepoch() * 1000) NOT NULL,
148
+ FOREIGN KEY (ticket_id) REFERENCES tickets(id) ON DELETE CASCADE
149
+ );
150
+
151
+ CREATE TABLE IF NOT EXISTS disputes (
152
+ id INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL,
153
+ dispute_no TEXT NOT NULL,
154
+ order_id TEXT NOT NULL,
155
+ order_no TEXT NOT NULL,
156
+ customer_name TEXT NOT NULL,
157
+ customer_email TEXT NOT NULL,
158
+ type TEXT NOT NULL,
159
+ status TEXT DEFAULT 'pending' NOT NULL,
160
+ description TEXT NOT NULL,
161
+ resolution TEXT,
162
+ amount INTEGER NOT NULL,
163
+ resolved_at INTEGER,
164
+ resolved_by TEXT,
165
+ created_at INTEGER DEFAULT (unixepoch() * 1000) NOT NULL,
166
+ updated_at INTEGER DEFAULT (unixepoch() * 1000) NOT NULL
167
+ );
168
+
169
+ CREATE TABLE IF NOT EXISTS contents (
170
+ id INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL,
171
+ title TEXT NOT NULL,
172
+ body TEXT NOT NULL,
173
+ excerpt TEXT,
174
+ category TEXT NOT NULL,
175
+ tags TEXT,
176
+ status TEXT DEFAULT 'draft' NOT NULL,
177
+ author TEXT NOT NULL,
178
+ view_count INTEGER DEFAULT 0 NOT NULL,
179
+ like_count INTEGER DEFAULT 0 NOT NULL,
180
+ published_at INTEGER,
181
+ created_at INTEGER DEFAULT (unixepoch() * 1000) NOT NULL,
182
+ updated_at INTEGER DEFAULT (unixepoch() * 1000) NOT NULL
183
+ );
184
+
185
+ CREATE TABLE IF NOT EXISTS developers (
186
+ id TEXT PRIMARY KEY NOT NULL,
187
+ username TEXT NOT NULL UNIQUE,
188
+ email TEXT NOT NULL UNIQUE,
189
+ password_hash TEXT NOT NULL,
190
+ role TEXT DEFAULT 'developer' NOT NULL,
191
+ api_key TEXT NOT NULL UNIQUE,
192
+ created_at INTEGER DEFAULT (unixepoch() * 1000) NOT NULL,
193
+ updated_at INTEGER DEFAULT (unixepoch() * 1000) NOT NULL
194
+ );
195
+
196
+ CREATE TABLE IF NOT EXISTS plugins (
197
+ id TEXT PRIMARY KEY NOT NULL,
198
+ name TEXT NOT NULL,
199
+ slug TEXT NOT NULL UNIQUE,
200
+ description TEXT NOT NULL DEFAULT '',
201
+ readme TEXT,
202
+ author_id TEXT NOT NULL,
203
+ author_name TEXT NOT NULL,
204
+ repository_url TEXT,
205
+ homepage_url TEXT,
206
+ npm_package TEXT,
207
+ license TEXT,
208
+ version TEXT NOT NULL DEFAULT '0.0.1',
209
+ status TEXT NOT NULL DEFAULT 'pending',
210
+ download_count INTEGER NOT NULL DEFAULT 0,
211
+ view_count INTEGER NOT NULL DEFAULT 0,
212
+ featured INTEGER NOT NULL DEFAULT 0,
213
+ screenshot_url TEXT,
214
+ site_urls TEXT,
215
+ tags TEXT,
216
+ commands TEXT,
217
+ reject_reason TEXT,
218
+ created_at INTEGER DEFAULT (unixepoch() * 1000) NOT NULL,
219
+ updated_at INTEGER DEFAULT (unixepoch() * 1000) NOT NULL
220
+ );
221
+
222
+ CREATE TABLE IF NOT EXISTS plugin_versions (
223
+ id TEXT PRIMARY KEY NOT NULL,
224
+ plugin_id TEXT NOT NULL,
225
+ version TEXT NOT NULL,
226
+ changelog TEXT,
227
+ package_url TEXT,
228
+ file_size INTEGER,
229
+ checksum TEXT,
230
+ status TEXT NOT NULL DEFAULT 'pending',
231
+ published_at INTEGER DEFAULT (unixepoch() * 1000) NOT NULL,
232
+ FOREIGN KEY (plugin_id) REFERENCES plugins(id) ON DELETE CASCADE,
233
+ UNIQUE(plugin_id, version)
234
+ );
235
+
236
+ CREATE TABLE IF NOT EXISTS plugin_reviews (
237
+ id TEXT PRIMARY KEY NOT NULL,
238
+ plugin_id TEXT NOT NULL,
239
+ user_id TEXT NOT NULL,
240
+ user_name TEXT NOT NULL,
241
+ rating INTEGER NOT NULL,
242
+ title TEXT,
243
+ content TEXT,
244
+ created_at INTEGER DEFAULT (unixepoch() * 1000) NOT NULL,
245
+ FOREIGN KEY (plugin_id) REFERENCES plugins(id) ON DELETE CASCADE,
246
+ UNIQUE(plugin_id, user_id)
247
+ );
248
+
249
+ CREATE TABLE IF NOT EXISTS plugin_categories (
250
+ id TEXT PRIMARY KEY NOT NULL,
251
+ name TEXT NOT NULL UNIQUE,
252
+ slug TEXT NOT NULL UNIQUE,
253
+ description TEXT,
254
+ icon TEXT,
255
+ sort_order INTEGER NOT NULL DEFAULT 0
256
+ );
257
+
258
+ CREATE TABLE IF NOT EXISTS plugin_category_mappings (
259
+ plugin_id TEXT NOT NULL,
260
+ category_id TEXT NOT NULL,
261
+ FOREIGN KEY (plugin_id) REFERENCES plugins(id) ON DELETE CASCADE,
262
+ FOREIGN KEY (category_id) REFERENCES plugin_categories(id) ON DELETE CASCADE,
263
+ UNIQUE(plugin_id, category_id)
264
+ );
265
+ `.split(";").filter(E=>E.trim());for(let E of t)if(E.trim())try{await e.execute(E);}catch{}await l(e);}async function l(e){let s=[{id:"role_super_admin",code:"super_admin",name:"\u8D85\u7EA7\u7BA1\u7406\u5458",label:"\u8D85\u7EA7\u7BA1\u7406\u5458",is_system:1,sort_order:1},{id:"role_admin",code:"admin",name:"\u7BA1\u7406\u5458",label:"\u7BA1\u7406\u5458",is_system:1,sort_order:2},{id:"role_user",code:"user",name:"\u666E\u901A\u7528\u6237",label:"\u666E\u901A\u7528\u6237",is_system:0,sort_order:3},{id:"role_customer_service",code:"customer_service",name:"\u5BA2\u670D\u4EBA\u5458",label:"\u5BA2\u670D",is_system:0,sort_order:4}];for(let T of s)try{await e.execute({sql:"INSERT OR IGNORE INTO roles (id, code, name, label, is_system, is_active, sort_order, created_at, updated_at) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?)",args:[T.id,T.code,T.name,T.label,T.is_system,1,T.sort_order,Date.now(),Date.now()]});}catch{}let t=[{id:"perm_user_view",code:"user:view",name:"\u67E5\u770B\u7528\u6237",label:"\u67E5\u770B\u7528\u6237",category:"user"},{id:"perm_user_create",code:"user:create",name:"\u521B\u5EFA\u7528\u6237",label:"\u521B\u5EFA\u7528\u6237",category:"user"},{id:"perm_user_update",code:"user:update",name:"\u66F4\u65B0\u7528\u6237",label:"\u66F4\u65B0\u7528\u6237",category:"user"},{id:"perm_user_delete",code:"user:delete",name:"\u5220\u9664\u7528\u6237",label:"\u5220\u9664\u7528\u6237",category:"user"}],E=[{id:"perm_content_view",code:"content:view",name:"\u67E5\u770B\u5185\u5BB9",label:"\u67E5\u770B\u5185\u5BB9",category:"content"},{id:"perm_content_create",code:"content:create",name:"\u521B\u5EFA\u5185\u5BB9",label:"\u521B\u5EFA\u5185\u5BB9",category:"content"},{id:"perm_content_update",code:"content:update",name:"\u66F4\u65B0\u5185\u5BB9",label:"\u66F4\u65B0\u5185\u5BB9",category:"content"},{id:"perm_content_delete",code:"content:delete",name:"\u5220\u9664\u5185\u5BB9",label:"\u5220\u9664\u5185\u5BB9",category:"content"}],a=[{id:"perm_system_settings",code:"system:settings",name:"\u7CFB\u7EDF\u8BBE\u7F6E",label:"\u7CFB\u7EDF\u8BBE\u7F6E",category:"system"},{id:"perm_system_logs",code:"system:logs",name:"\u67E5\u770B\u65E5\u5FD7",label:"\u67E5\u770B\u65E5\u5FD7",category:"system"},{id:"perm_system_backup",code:"system:backup",name:"\u7CFB\u7EDF\u5907\u4EFD",label:"\u7CFB\u7EDF\u5907\u4EFD",category:"system"}],o=[{id:"perm_order_view",code:"order:view",name:"\u67E5\u770B\u8BA2\u5355",label:"\u67E5\u770B\u8BA2\u5355",category:"order"},{id:"perm_order_create",code:"order:create",name:"\u521B\u5EFA\u8BA2\u5355",label:"\u521B\u5EFA\u8BA2\u5355",category:"order"},{id:"perm_order_edit",code:"order:edit",name:"\u7F16\u8F91\u8BA2\u5355",label:"\u7F16\u8F91\u8BA2\u5355",category:"order"},{id:"perm_order_delete",code:"order:delete",name:"\u5220\u9664\u8BA2\u5355",label:"\u5220\u9664\u8BA2\u5355",category:"order"},{id:"perm_order_process",code:"order:process",name:"\u5904\u7406\u8BA2\u5355",label:"\u5904\u7406\u8BA2\u5355",category:"order"}],N=[{id:"perm_ticket_view",code:"ticket:view",name:"\u67E5\u770B\u5DE5\u5355",label:"\u67E5\u770B\u5DE5\u5355",category:"ticket"},{id:"perm_ticket_create",code:"ticket:create",name:"\u521B\u5EFA\u5DE5\u5355",label:"\u521B\u5EFA\u5DE5\u5355",category:"ticket"},{id:"perm_ticket_edit",code:"ticket:edit",name:"\u7F16\u8F91\u5DE5\u5355",label:"\u7F16\u8F91\u5DE5\u5355",category:"ticket"},{id:"perm_ticket_delete",code:"ticket:delete",name:"\u5220\u9664\u5DE5\u5355",label:"\u5220\u9664\u5DE5\u5355",category:"ticket"},{id:"perm_ticket_reply",code:"ticket:reply",name:"\u56DE\u590D\u5DE5\u5355",label:"\u56DE\u590D\u5DE5\u5355",category:"ticket"},{id:"perm_ticket_close",code:"ticket:close",name:"\u5173\u95ED\u5DE5\u5355",label:"\u5173\u95ED\u5DE5\u5355",category:"ticket"}],d=[{id:"perm_data_export",code:"data:export",name:"\u5BFC\u51FA\u6570\u636E",label:"\u5BFC\u51FA\u6570\u636E",category:"data"},{id:"perm_data_import",code:"data:import",name:"\u5BFC\u5165\u6570\u636E",label:"\u5BFC\u5165\u6570\u636E",category:"data"}],L=[{id:"perm_dispute_view",code:"dispute:view",name:"\u67E5\u770B\u4E89\u8BAE",label:"\u67E5\u770B\u4E89\u8BAE",category:"dispute"},{id:"perm_dispute_create",code:"dispute:create",name:"\u521B\u5EFA\u4E89\u8BAE",label:"\u521B\u5EFA\u4E89\u8BAE",category:"dispute"},{id:"perm_dispute_edit",code:"dispute:edit",name:"\u7F16\u8F91\u4E89\u8BAE",label:"\u7F16\u8F91\u4E89\u8BAE",category:"dispute"},{id:"perm_dispute_delete",code:"dispute:delete",name:"\u5220\u9664\u4E89\u8BAE",label:"\u5220\u9664\u4E89\u8BAE",category:"dispute"},{id:"perm_dispute_resolve",code:"dispute:resolve",name:"\u89E3\u51B3\u4E89\u8BAE",label:"\u89E3\u51B3\u4E89\u8BAE",category:"dispute"}],i=[...t,...E,...a,...o,...N,...d,...L];for(let T of i)try{await e.execute({sql:"INSERT OR IGNORE INTO permissions (id, code, name, label, category, is_active, sort_order, created_at, updated_at) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?)",args:[T.id,T.code,T.name,T.label,T.category,1,0,Date.now(),Date.now()]});}catch{}for(let T of i)try{await e.execute({sql:"INSERT OR IGNORE INTO role_permissions (role_id, permission_id, created_at) VALUES (?, ?, ?)",args:["role_super_admin",T.id,Date.now()]});}catch{}for(let T of i)if(T.code!=="system:settings")try{await e.execute({sql:"INSERT OR IGNORE INTO role_permissions (role_id, permission_id, created_at) VALUES (?, ?, ?)",args:["role_admin",T.id,Date.now()]});}catch{}let c=["perm_user_view","perm_content_view","perm_order_view","perm_order_create","perm_order_edit","perm_order_delete","perm_order_process","perm_ticket_view","perm_ticket_create","perm_ticket_edit","perm_ticket_delete","perm_ticket_reply","perm_ticket_close","perm_dispute_view","perm_dispute_create","perm_dispute_edit","perm_dispute_delete","perm_dispute_resolve"];for(let T of c)try{await e.execute({sql:"INSERT OR IGNORE INTO role_permissions (role_id, permission_id, created_at) VALUES (?, ?, ?)",args:["role_customer_service",T,Date.now()]});}catch{}let _=[{userId:"super-admin-1",roleId:"role_super_admin"},{userId:"customer-service-1",roleId:"role_customer_service"},{userId:"user-1",roleId:"role_user"}];for(let T of _)try{await e.execute({sql:"INSERT OR IGNORE INTO user_roles (id, user_id, role_id, is_active, assigned_at) VALUES (?, ?, ?, ?, ?)",args:[`ur_${T.userId}`,T.userId,T.roleId,1,Date.now()]});}catch{}let n=["perm_content_view","perm_order_view"];for(let T of n)try{await e.execute({sql:"INSERT OR IGNORE INTO role_permissions (role_id, permission_id, created_at) VALUES (?, ?, ?)",args:["role_user",T,Date.now()]});}catch{}}async function m(){let e=await j();if(e&&"execute"in e){try{await e.execute("DELETE FROM todo_attachments");}catch{}await e.execute("DELETE FROM todos"),await e.execute("DELETE FROM notifications"),await e.execute("DELETE FROM permission_routes"),await e.execute("DELETE FROM permission_audit_logs"),await e.execute("DELETE FROM role_permissions"),await e.execute("DELETE FROM user_roles"),await e.execute("DELETE FROM permissions"),await e.execute("DELETE FROM roles"),await e.execute("DELETE FROM routes"),await e.execute("DELETE FROM ticket_replies"),await e.execute("DELETE FROM tickets"),await e.execute("DELETE FROM orders"),await e.execute("DELETE FROM disputes"),await e.execute("DELETE FROM contents");try{await e.execute("DELETE FROM plugin_category_mappings"),await e.execute("DELETE FROM plugin_reviews"),await e.execute("DELETE FROM plugin_versions"),await e.execute("DELETE FROM plugins"),await e.execute("DELETE FROM plugin_categories"),await e.execute("DELETE FROM developers");}catch{}}}export{m as cleanupTestDatabase,O as setupTestDatabase};
@@ -0,0 +1 @@
1
+ import {a,b}from'./chunk-5J6HXUF6.js';import {sqliteTable,integer,text,primaryKey,unique,uniqueIndex}from'drizzle-orm/sqlite-core';import {sql}from'drizzle-orm';var z,K,C=a(()=>{z=["pending","in_progress","completed"],K=sqliteTable("todos",{id:integer("id").primaryKey({autoIncrement:true}),title:text("title").notNull(),description:text("description"),status:text("status",{enum:z}).notNull().default("pending"),createdAt:integer("created_at",{mode:"timestamp"}).notNull().default(sql`(unixepoch() * 1000)`),updatedAt:integer("updated_at",{mode:"timestamp"}).notNull().default(sql`(unixepoch() * 1000)`)});});var qe,B=a(()=>{C();qe=sqliteTable("todo_attachments",{id:integer("id").primaryKey({autoIncrement:true}),todoId:integer("todo_id").notNull().references(()=>K.id,{onDelete:"cascade"}),fileName:text("file_name").notNull(),originalName:text("original_name").notNull(),mimeType:text("mime_type").notNull(),size:integer("size").notNull(),path:text("path").notNull(),uploadedBy:text("uploaded_by"),createdAt:integer("created_at",{mode:"timestamp"}).notNull().default(sql`(unixepoch() * 1000)`)});});var ke,H=a(()=>{ke=sqliteTable("notifications",{id:text("id").primaryKey(),type:text("type").notNull(),title:text("title").notNull(),message:text("message").notNull(),read:integer("read",{mode:"boolean"}).notNull().default(false),createdAt:integer("created_at",{mode:"timestamp"}).notNull().default(sql`(unixepoch() * 1000)`)});});var y,A=a(()=>{y=sqliteTable("permissions",{id:text("id").primaryKey(),code:text("code").notNull().unique(),name:text("name").notNull(),label:text("label").notNull(),category:text("category").notNull(),description:text("description"),sortOrder:integer("sort_order").default(0),isActive:integer("is_active",{mode:"boolean"}).default(true),createdAt:integer("created_at",{mode:"timestamp"}).$defaultFn(()=>new Date),updatedAt:integer("updated_at",{mode:"timestamp"}).$defaultFn(()=>new Date)});});var x,T=a(()=>{x=sqliteTable("roles",{id:text("id").primaryKey(),code:text("code").notNull().unique(),name:text("name").notNull(),label:text("label").notNull(),description:text("description"),isSystem:integer("is_system",{mode:"boolean"}).default(false),isActive:integer("is_active",{mode:"boolean"}).default(true),sortOrder:integer("sort_order").default(0),createdAt:integer("created_at",{mode:"timestamp"}).$defaultFn(()=>new Date),updatedAt:integer("updated_at",{mode:"timestamp"}).$defaultFn(()=>new Date)});});var Ue,J=a(()=>{T();A();Ue=sqliteTable("role_permissions",{roleId:text("role_id").notNull().references(()=>x.id,{onDelete:"cascade"}),permissionId:text("permission_id").notNull().references(()=>y.id,{onDelete:"cascade"}),createdAt:integer("created_at",{mode:"timestamp"}).$defaultFn(()=>new Date)},o=>({pk:primaryKey({columns:[o.roleId,o.permissionId]})}));});var Ve,Q=a(()=>{T();Ve=sqliteTable("user_roles",{id:text("id").primaryKey(),userId:text("user_id").notNull(),roleId:text("role_id").notNull().references(()=>x.id,{onDelete:"cascade"}),assignedBy:text("assigned_by"),assignedAt:integer("assigned_at",{mode:"timestamp"}).$defaultFn(()=>new Date),expiresAt:integer("expires_at",{mode:"timestamp"}),isActive:integer("is_active",{mode:"boolean"}).default(true)});});var F,V=a(()=>{F=sqliteTable("routes",{id:text("id").primaryKey(),path:text("path").notNull(),method:text("method").notNull(),name:text("name"),description:text("description"),module:text("module"),isPublic:integer("is_public",{mode:"boolean"}).default(false),isActive:integer("is_active",{mode:"boolean"}).default(true),createdAt:integer("created_at",{mode:"timestamp"}).$defaultFn(()=>new Date),updatedAt:integer("updated_at",{mode:"timestamp"}).$defaultFn(()=>new Date)},o=>({pathMethodUnique:unique().on(o.path,o.method)}));});var Be,X=a(()=>{A();V();Be=sqliteTable("permission_routes",{permissionId:text("permission_id").notNull().references(()=>y.id,{onDelete:"cascade"}),routeId:text("route_id").notNull().references(()=>F.id,{onDelete:"cascade"}),createdAt:integer("created_at",{mode:"timestamp"}).$defaultFn(()=>new Date)},o=>({pk:primaryKey({columns:[o.permissionId,o.routeId]})}));});var Ge,Y=a(()=>{Ge=sqliteTable("permission_audit_logs",{id:text("id").primaryKey(),userId:text("user_id").notNull(),action:text("action").notNull(),resourceType:text("resource_type").notNull(),resourceId:text("resource_id"),oldValue:text("old_value"),newValue:text("new_value"),ipAddress:text("ip_address"),userAgent:text("user_agent"),createdAt:integer("created_at",{mode:"timestamp"}).$defaultFn(()=>new Date)});});var ee,Qe,te=a(()=>{ee=["pending","processing","completed","cancelled","disputed"],Qe=sqliteTable("orders",{id:integer("id").primaryKey({autoIncrement:true}),orderNo:text("order_no").notNull(),customerName:text("customer_name").notNull(),customerEmail:text("customer_email").notNull(),productName:text("product_name").notNull(),amount:integer("amount").notNull(),status:text("status",{enum:ee}).notNull().default("pending"),createdAt:integer("created_at",{mode:"timestamp"}).notNull().default(sql`(unixepoch() * 1000)`),updatedAt:integer("updated_at",{mode:"timestamp"}).notNull().default(sql`(unixepoch() * 1000)`)});});var re,ne,ie,We,se,Xe,le=a(()=>{re=["open","in_progress","waiting_customer","resolved","closed"],ne=["low","medium","high","urgent"],ie=["technical","billing","feature_request","bug_report","general"],We=["customer","admin","system"],se=sqliteTable("tickets",{id:integer("id").primaryKey({autoIncrement:true}),ticketNo:text("ticket_no").notNull(),customerName:text("customer_name").notNull(),customerEmail:text("customer_email").notNull(),subject:text("subject").notNull(),description:text("description").notNull(),status:text("status",{enum:re}).notNull().default("open"),priority:text("priority",{enum:ne}).notNull().default("medium"),category:text("category",{enum:ie}).notNull(),assignedTo:text("assigned_to"),createdAt:integer("created_at",{mode:"timestamp"}).notNull().default(sql`(unixepoch() * 1000)`),updatedAt:integer("updated_at",{mode:"timestamp"}).notNull().default(sql`(unixepoch() * 1000)`)}),Xe=sqliteTable("ticket_replies",{id:integer("id").primaryKey({autoIncrement:true}),ticketId:integer("ticket_id").notNull().references(()=>se.id,{onDelete:"cascade"}),content:text("content").notNull(),author:text("author").notNull(),isCustomer:integer("is_customer",{mode:"boolean"}).notNull().default(false),createdAt:integer("created_at",{mode:"timestamp"}).notNull().default(sql`(unixepoch() * 1000)`)});});var ae,ue,Ze,de=a(()=>{ae=["refund","product_quality","service_quality","delivery","other"],ue=["pending","investigating","resolved","rejected"],Ze=sqliteTable("disputes",{id:integer("id").primaryKey({autoIncrement:true}),disputeNo:text("dispute_no").notNull(),orderId:text("order_id").notNull(),orderNo:text("order_no").notNull(),customerName:text("customer_name").notNull(),customerEmail:text("customer_email").notNull(),type:text("type",{enum:ae}).notNull(),status:text("status",{enum:ue}).notNull().default("pending"),description:text("description").notNull(),resolution:text("resolution"),amount:integer("amount").notNull(),resolvedAt:integer("resolved_at",{mode:"timestamp"}),resolvedBy:text("resolved_by"),createdAt:integer("created_at",{mode:"timestamp"}).notNull().default(sql`(unixepoch() * 1000)`),updatedAt:integer("updated_at",{mode:"timestamp"}).notNull().default(sql`(unixepoch() * 1000)`)});});var ce,fe,tt,ye=a(()=>{ce=["draft","published","archived"],fe=["article","announcement","tutorial","news","policy"],tt=sqliteTable("contents",{id:integer("id").primaryKey({autoIncrement:true}),title:text("title").notNull(),body:text("body").notNull(),excerpt:text("excerpt"),category:text("category",{enum:fe}).notNull(),tags:text("tags"),status:text("status",{enum:ce}).notNull().default("draft"),author:text("author").notNull(),viewCount:integer("view_count").notNull().default(0),likeCount:integer("like_count").notNull().default(0),publishedAt:integer("published_at",{mode:"timestamp"}),createdAt:integer("created_at",{mode:"timestamp"}).notNull().default(sql`(unixepoch() * 1000)`),updatedAt:integer("updated_at",{mode:"timestamp"}).notNull().default(sql`(unixepoch() * 1000)`)});});var rt,xe=a(()=>{rt=sqliteTable("developers",{id:text("id").primaryKey(),username:text("username").notNull().unique(),email:text("email").notNull().unique(),passwordHash:text("password_hash").notNull(),role:text("role").notNull().default("developer"),apiKey:text("api_key").notNull().unique(),createdAt:integer("created_at",{mode:"timestamp"}).notNull().default(sql`(unixepoch() * 1000)`),updatedAt:integer("updated_at",{mode:"timestamp"}).notNull().default(sql`(unixepoch() * 1000)`)});});var O,R,nt,it,_e,st,he=a(()=>{O=["pending","approved","rejected"],R=sqliteTable("plugins",{id:text("id").primaryKey(),name:text("name").notNull(),slug:text("slug").notNull().unique(),description:text("description").notNull().default(""),readme:text("readme"),authorId:text("author_id").notNull(),authorName:text("author_name").notNull(),repositoryUrl:text("repository_url"),homepageUrl:text("homepage_url"),npmPackage:text("npm_package"),license:text("license"),version:text("version").notNull().default("0.0.1"),status:text("status",{enum:O}).notNull().default("pending"),downloadCount:integer("download_count").notNull().default(0),viewCount:integer("view_count").notNull().default(0),featured:integer("featured",{mode:"boolean"}).notNull().default(false),screenshotUrl:text("screenshot_url"),siteUrls:text("site_urls"),tags:text("tags"),commands:text("commands"),rejectReason:text("reject_reason"),createdAt:integer("created_at",{mode:"timestamp"}).notNull().default(sql`(unixepoch() * 1000)`),updatedAt:integer("updated_at",{mode:"timestamp"}).notNull().default(sql`(unixepoch() * 1000)`)}),nt=sqliteTable("plugin_versions",{id:text("id").primaryKey(),pluginId:text("plugin_id").notNull().references(()=>R.id,{onDelete:"cascade"}),version:text("version").notNull(),changelog:text("changelog"),packageUrl:text("package_url"),fileSize:integer("file_size"),checksum:text("checksum"),status:text("status",{enum:O}).notNull().default("pending"),publishedAt:integer("published_at",{mode:"timestamp"}).notNull().default(sql`(unixepoch() * 1000)`)},o=>({pluginVersionUnique:uniqueIndex("plugin_version_unique").on(o.pluginId,o.version)})),it=sqliteTable("plugin_reviews",{id:text("id").primaryKey(),pluginId:text("plugin_id").notNull().references(()=>R.id,{onDelete:"cascade"}),userId:text("user_id").notNull(),userName:text("user_name").notNull(),rating:integer("rating").notNull(),title:text("title"),content:text("content"),createdAt:integer("created_at",{mode:"timestamp"}).notNull().default(sql`(unixepoch() * 1000)`)},o=>({pluginUserUnique:uniqueIndex("plugin_review_user_unique").on(o.pluginId,o.userId)})),_e=sqliteTable("plugin_categories",{id:text("id").primaryKey(),name:text("name").notNull().unique(),slug:text("slug").notNull().unique(),description:text("description"),icon:text("icon"),sortOrder:integer("sort_order").notNull().default(0)}),st=sqliteTable("plugin_category_mappings",{pluginId:text("plugin_id").notNull().references(()=>R.id,{onDelete:"cascade"}),categoryId:text("category_id").notNull().references(()=>_e.id,{onDelete:"cascade"})},o=>({mappingUnique:uniqueIndex("plugin_category_mapping_unique").on(o.pluginId,o.categoryId)}));});var pt,Ie=a(()=>{pt=sqliteTable("tenants",{id:integer("id").primaryKey({autoIncrement:true}),name:text("name").notNull(),slug:text("slug").notNull().unique(),status:text("status",{enum:["active","suspended","trial"]}).notNull().default("trial"),plan:text("plan",{enum:["free","starter","pro","enterprise"]}).notNull().default("free"),maxUsers:integer("max_users").notNull().default(5),settings:text("settings"),createdAt:text("created_at").notNull(),updatedAt:text("updated_at").notNull()});});var at={};b(at,{contentCategories:()=>fe,contentStatuses:()=>ce,contents:()=>tt,developers:()=>rt,disputeStatuses:()=>ue,disputeTypes:()=>ae,disputes:()=>Ze,notifications:()=>ke,orderStatuses:()=>ee,orders:()=>Qe,permissionAuditLogs:()=>Ge,permissionRouteMappings:()=>Be,permissions:()=>y,pluginCategories:()=>_e,pluginCategoryMappings:()=>st,pluginReviews:()=>it,pluginStatus:()=>O,pluginVersions:()=>nt,plugins:()=>R,rolePermissions:()=>Ue,roles:()=>x,routes:()=>F,tenants:()=>pt,ticketCategories:()=>ie,ticketPriorities:()=>ne,ticketReplies:()=>Xe,ticketReplyAuthorRoles:()=>We,ticketStatuses:()=>re,tickets:()=>se,todoAttachments:()=>qe,todoStatus:()=>z,todos:()=>K,userRoles:()=>Ve});var ut=a(()=>{C();B();H();A();T();J();Q();V();X();Y();te();le();de();ye();xe();he();Ie();});export{xe as A,O as B,R as C,nt as D,it as E,_e as F,st as G,pt as H,at as I,ut as J,z as a,K as b,qe as c,ke as d,y as e,x as f,Ue as g,Ve as h,F as i,Be as j,Ge as k,ee as l,Qe as m,re as n,ne as o,ie as p,We as q,se as r,Xe as s,ae as t,ue as u,Ze as v,ce as w,fe as x,tt as y,rt as z};
@@ -0,0 +1 @@
1
+ import {d as d$1,b as b$1}from'./chunk-JCPOP4XL.js';import {a}from'./chunk-UMAQLNPE.js';import {h as h$1,g as g$1,i}from'./chunk-OYCBNRMK.js';import {J,f,h as h$2,e,g as g$2}from'./chunk-27SIJSPF.js';import {eq,and}from'drizzle-orm';import {z as z$1}from'@hono/zod-openapi';a();J();a();J();d$1();var C=class{async getAll(){return (await(await i()).select().from(f)).map(b$1)}async getActive(){return (await(await i()).select().from(f).where(eq(f.isActive,true))).map(b$1)}async getById(e){let s=await(await i()).select().from(f).where(eq(f.id,e));return s[0]?b$1(s[0]):void 0}async getByCode(e){let s=await(await i()).select().from(f).where(eq(f.code,e));return s[0]?b$1(s[0]):void 0}async create(e){let s=await(await i()).insert(f).values({...e,createdAt:new Date,updatedAt:new Date}).returning();return b$1(s[0])}async update(e,i$1){let n=await(await i()).update(f).set({...i$1,updatedAt:new Date}).where(eq(f.id,e)).returning();return n[0]?b$1(n[0]):void 0}async delete(e){let i$1=await i(),s=await this.getById(e);return !s||s.isSystem?false:(await i$1.update(f).set({isActive:false}).where(eq(f.id,e)).returning()).length>0}async assignRoleToUser(e,i$1,s){let n=await i();(await n.select().from(h$2).where(and(eq(h$2.userId,e),eq(h$2.roleId,i$1),eq(h$2.isActive,true)))).length===0&&await n.insert(h$2).values({id:`ur_${Date.now()}`,userId:e,roleId:i$1,assignedBy:s??null,assignedAt:new Date,expiresAt:null,isActive:true});}async revokeRoleFromUser(e,i$1){await(await i()).update(h$2).set({isActive:false}).where(and(eq(h$2.userId,e),eq(h$2.roleId,i$1)));}async getUserRoles(e){let i$1=await i(),s=await i$1.select().from(h$2).where(and(eq(h$2.userId,e),eq(h$2.isActive,true)));if(s.length===0)return [];let n=s.map(m=>m.roleId);return (await i$1.select().from(f).where(eq(f.isActive,true))).filter(m=>n.includes(m.id))}},O=new C;h$1();var S=(s=>(s.SUPER_ADMIN="super_admin",s.CUSTOMER_SERVICE="customer_service",s.USER="user",s))(S||{}),u=(o=>(o.USER_VIEW="user:view",o.USER_CREATE="user:create",o.USER_EDIT="user:edit",o.USER_DELETE="user:delete",o.CONTENT_VIEW="content:view",o.CONTENT_CREATE="content:create",o.CONTENT_EDIT="content:edit",o.CONTENT_DELETE="content:delete",o.SYSTEM_SETTINGS="system:settings",o.SYSTEM_LOGS="system:logs",o.SYSTEM_MONITOR="system:monitor",o.DATA_EXPORT="data:export",o.DATA_IMPORT="data:import",o.ORDER_VIEW="order:view",o.ORDER_CREATE="order:create",o.ORDER_EDIT="order:edit",o.ORDER_DELETE="order:delete",o.ORDER_PROCESS="order:process",o.TICKET_VIEW="ticket:view",o.TICKET_CREATE="ticket:create",o.TICKET_EDIT="ticket:edit",o.TICKET_DELETE="ticket:delete",o.TICKET_REPLY="ticket:reply",o.TICKET_CLOSE="ticket:close",o.DISPUTE_VIEW="dispute:view",o.DISPUTE_CREATE="dispute:create",o.DISPUTE_EDIT="dispute:edit",o.DISPUTE_DELETE="dispute:delete",o.DISPUTE_RESOLVE="dispute:resolve",o.NOTIFICATION_VIEW="notification:view",o.NOTIFICATION_CREATE="notification:create",o.NOTIFICATION_EDIT="notification:edit",o.NOTIFICATION_DELETE="notification:delete",o.TODO_VIEW="todo:view",o.TODO_CREATE="todo:create",o.TODO_EDIT="todo:edit",o.TODO_DELETE="todo:delete",o.TODO_FILE_UPLOAD="todo:file_upload",o.TODO_FILE_DELETE="todo:file_delete",o.CHAT_VIEW="chat:view",o.CHAT_SEND="chat:send",o.ROLE_VIEW="role:view",o.ROLE_CREATE="role:create",o.ROLE_EDIT="role:edit",o.ROLE_DELETE="role:delete",o))(u||{}),W={super_admin:Object.values(u),customer_service:["user:view","content:view","order:view","order:create","order:edit","order:delete","order:process","ticket:view","ticket:create","ticket:edit","ticket:delete","ticket:reply","ticket:close","data:export","system:logs"],user:["content:view","order:view"]},D={super_admin:"\u8D85\u7EA7\u7BA1\u7406\u5458",customer_service:"\u5BA2\u670D\u4EBA\u5458",user:"\u666E\u901A\u7528\u6237"},w={"user:view":"\u67E5\u770B\u7528\u6237","user:create":"\u521B\u5EFA\u7528\u6237","user:edit":"\u7F16\u8F91\u7528\u6237","user:delete":"\u5220\u9664\u7528\u6237","content:view":"\u67E5\u770B\u5185\u5BB9","content:create":"\u521B\u5EFA\u5185\u5BB9","content:edit":"\u7F16\u8F91\u5185\u5BB9","content:delete":"\u5220\u9664\u5185\u5BB9","system:settings":"\u7CFB\u7EDF\u8BBE\u7F6E","system:logs":"\u67E5\u770B\u65E5\u5FD7","system:monitor":"\u7CFB\u7EDF\u76D1\u63A7","data:export":"\u6570\u636E\u5BFC\u51FA","data:import":"\u6570\u636E\u5BFC\u5165","order:view":"\u67E5\u770B\u8BA2\u5355","order:create":"\u521B\u5EFA\u8BA2\u5355","order:edit":"\u7F16\u8F91\u8BA2\u5355","order:delete":"\u5220\u9664\u8BA2\u5355","order:process":"\u5904\u7406\u8BA2\u5355","ticket:view":"\u67E5\u770B\u5DE5\u5355","ticket:create":"\u521B\u5EFA\u5DE5\u5355","ticket:edit":"\u7F16\u8F91\u5DE5\u5355","ticket:delete":"\u5220\u9664\u5DE5\u5355","ticket:reply":"\u56DE\u590D\u5DE5\u5355","ticket:close":"\u5173\u95ED\u5DE5\u5355","dispute:view":"\u67E5\u770B\u4E89\u8BAE","dispute:create":"\u521B\u5EFA\u4E89\u8BAE","dispute:edit":"\u7F16\u8F91\u4E89\u8BAE","dispute:delete":"\u5220\u9664\u4E89\u8BAE","dispute:resolve":"\u89E3\u51B3\u4E89\u8BAE","notification:view":"\u67E5\u770B\u901A\u77E5","notification:create":"\u521B\u5EFA\u901A\u77E5","notification:edit":"\u7F16\u8F91\u901A\u77E5","notification:delete":"\u5220\u9664\u901A\u77E5","todo:view":"\u67E5\u770B\u5F85\u529E","todo:create":"\u521B\u5EFA\u5F85\u529E","todo:edit":"\u7F16\u8F91\u5F85\u529E","todo:delete":"\u5220\u9664\u5F85\u529E","todo:file_upload":"\u4E0A\u4F20\u6587\u4EF6","todo:file_delete":"\u5220\u9664\u6587\u4EF6","chat:view":"\u67E5\u770B\u804A\u5929","chat:send":"\u53D1\u9001\u6D88\u606F","role:view":"\u67E5\u770B\u89D2\u8272","role:create":"\u521B\u5EFA\u89D2\u8272","role:edit":"\u7F16\u8F91\u89D2\u8272","role:delete":"\u5220\u9664\u89D2\u8272"},b={user:{label:"\u7528\u6237\u7BA1\u7406",permissions:["user:view","user:create","user:edit","user:delete"]},content:{label:"\u5185\u5BB9\u7BA1\u7406",permissions:["content:view","content:create","content:edit","content:delete"]},system:{label:"\u7CFB\u7EDF\u7BA1\u7406",permissions:["system:settings","system:logs","system:monitor"]},role:{label:"\u89D2\u8272\u7BA1\u7406",permissions:["role:view","role:create","role:edit","role:delete"]},data:{label:"\u6570\u636E\u7BA1\u7406",permissions:["data:export","data:import"]},order:{label:"\u8BA2\u5355\u7BA1\u7406",permissions:["order:view","order:create","order:edit","order:delete","order:process"]},ticket:{label:"\u5DE5\u5355\u7BA1\u7406",permissions:["ticket:view","ticket:create","ticket:edit","ticket:delete","ticket:reply","ticket:close"]},dispute:{label:"\u4E89\u8BAE\u7BA1\u7406",permissions:["dispute:view","dispute:create","dispute:edit","dispute:delete","dispute:resolve"]},notification:{label:"\u901A\u77E5\u7BA1\u7406",permissions:["notification:view","notification:create","notification:edit","notification:delete"]},todo:{label:"\u5F85\u529E\u4E8B\u9879",permissions:["todo:view","todo:create","todo:edit","todo:delete","todo:file_upload","todo:file_delete"]},chat:{label:"\u804A\u5929\u7BA1\u7406",permissions:["chat:view","chat:send"]}};function K(f){return W[f]||[]}var g=z$1.nativeEnum(S),d=z$1.nativeEnum(u),k=z$1.object({role:g,label:z$1.string(),permissions:z$1.array(d)}),F=z$1.object({permission:d,label:z$1.string(),category:z$1.string()}),$=z$1.object({userId:z$1.string(),role:g,permissions:z$1.array(d)}),Y=z$1.object({path:z$1.string(),label:z$1.string(),icon:z$1.string(),permissions:z$1.array(d),children:z$1.array(z$1.object({path:z$1.string(),label:z$1.string(),icon:z$1.string(),permissions:z$1.array(d)})).nullish()}),B=z$1.object({key:z$1.string(),label:z$1.string(),permissions:z$1.array(d),mode:z$1.enum(["all","any"])}),G=z$1.object({path:z$1.string(),label:z$1.string(),requiredPermissions:z$1.array(d),actions:z$1.array(B)}),j=z$1.object({label:z$1.string(),permissions:z$1.array(d)});z$1.array(k);z$1.array(F);var z=z$1.array(Y),q=z$1.array(G),ee=z$1.record(z$1.string(),j),se=z$1.record(g,z$1.string()),ie=z$1.record(d,z$1.string()),re=z$1.object({permissions:z$1.array(d),menuConfig:z,pagePermissions:q,role:g});var h=[{path:"/dashboard",label:"\u4EEA\u8868\u76D8",icon:"LayoutDashboard",permissions:[]},{path:"/users",label:"\u7528\u6237\u7BA1\u7406",icon:"Users",permissions:["user:view"]},{path:"/orders",label:"\u8BA2\u5355\u7BA1\u7406",icon:"ShoppingCart",permissions:["order:view"]},{path:"/tickets",label:"\u5BA2\u670D\u4E2D\u5FC3",icon:"Headphones",permissions:["ticket:view"]},{path:"/disputes",label:"\u4E89\u8BAE\u5904\u7406",icon:"AlertTriangle",permissions:["ticket:view"]},{path:"/content",label:"\u5185\u5BB9\u7BA1\u7406",icon:"FileText",permissions:["content:view"]},{path:"/system",label:"\u7CFB\u7EDF\u7BA1\u7406",icon:"Settings",permissions:[],children:[{path:"/system/settings",label:"\u7CFB\u7EDF\u8BBE\u7F6E",icon:"Settings",permissions:["system:settings"]},{path:"/system/logs",label:"\u7CFB\u7EDF\u65E5\u5FD7",icon:"FileText",permissions:["system:logs"]},{path:"/system/monitor",label:"\u7CFB\u7EDF\u76D1\u63A7",icon:"Activity",permissions:["system:monitor"]},{path:"/system/permissions",label:"\u6743\u9650\u7BA1\u7406",icon:"Shield",permissions:["role:view"]},{path:"/system/roles",label:"\u89D2\u8272\u7BA1\u7406",icon:"UserCog",permissions:["role:view"]}]}],A=[{path:"/users",label:"\u7528\u6237\u7BA1\u7406",requiredPermissions:["user:view"],actions:[{key:"create",label:"\u521B\u5EFA\u7528\u6237",permissions:["user:create"],mode:"all"},{key:"edit",label:"\u7F16\u8F91\u7528\u6237",permissions:["user:edit"],mode:"all"},{key:"delete",label:"\u5220\u9664\u7528\u6237",permissions:["user:delete"],mode:"all"}]},{path:"/content",label:"\u5185\u5BB9\u7BA1\u7406",requiredPermissions:["content:view"],actions:[{key:"create",label:"\u521B\u5EFA\u5185\u5BB9",permissions:["content:create"],mode:"all"},{key:"edit",label:"\u7F16\u8F91\u5185\u5BB9",permissions:["content:edit"],mode:"all"},{key:"delete",label:"\u5220\u9664\u5185\u5BB9",permissions:["content:delete"],mode:"all"}]},{path:"/orders",label:"\u8BA2\u5355\u7BA1\u7406",requiredPermissions:["order:view"],actions:[{key:"process",label:"\u5904\u7406\u8BA2\u5355",permissions:["order:process"],mode:"all"}]},{path:"/tickets",label:"\u5DE5\u5355\u7BA1\u7406",requiredPermissions:["ticket:view"],actions:[{key:"reply",label:"\u56DE\u590D\u5DE5\u5355",permissions:["ticket:reply"],mode:"all"},{key:"close",label:"\u5173\u95ED\u5DE5\u5355",permissions:["ticket:close"],mode:"all"}]},{path:"/settings",label:"\u7CFB\u7EDF\u8BBE\u7F6E",requiredPermissions:["system:settings"],actions:[]}];function Se(){return h}function ge(){return A}function Oe(){return b}function fe(){return D}function ye(){return w}var N=g$1.api(),U=class{async getAll(){return await(await i()).select().from(e).where(eq(e.isActive,true))}async getAllRoles(){let i$1=await(await i()).select().from(f).where(eq(f.isActive,true)),s=[];for(let n of i$1){let l=await this.getRolePermissions(n.id);s.push({role:n.code,label:n.label,permissions:l.map(m=>m.code)});}return s}async getAllPermissions(){return (await(await i()).select().from(e).where(eq(e.isActive,true))).map(s=>({permission:s.code,label:s.label,category:s.category}))}async getById(e$1){return (await(await i()).select().from(e).where(eq(e.id,e$1)))[0]}async getByCode(e$1){return (await(await i()).select().from(e).where(eq(e.code,e$1)))[0]}async getByCategory(e$1){return await(await i()).select().from(e).where(and(eq(e.category,e$1),eq(e.isActive,true)))}async create(e$1){return (await(await i()).insert(e).values(e$1).returning())[0]}async update(e$1,i$1){return (await(await i()).update(e).set(i$1).where(eq(e.id,e$1)).returning())[0]}async delete(e$1){return (await(await i()).update(e).set({isActive:false}).where(eq(e.id,e$1)).returning()).length>0}async getRolePermissions(e$1){return (await(await i()).select().from(g$2).innerJoin(e,eq(g$2.permissionId,e.id)).where(eq(g$2.roleId,e$1))).map(n=>n.permissions)}async getUserPermissions(e$1,i$1){if(!i$1)return [];let s=await O.getByCode(i$1);return s?i$1==="super_admin"?await(await i()).select().from(e).where(eq(e.isActive,true)):this.getRolePermissions(s.id):[]}async hasPermission(e,i,s){if(s==="super_admin")return true;if(s){let l=await O.getByCode(s);if(l)return (await this.getRolePermissions(l.id)).some(T=>T.code===i)}let n=await O.getUserRoles(e);for(let l of n)if(l.code==="super_admin"||(await this.getRolePermissions(l.id)).some(T=>T.code===i))return true;return false}async assignPermissionToRole(e,i$1){let s=await i();(await s.select().from(g$2).where(and(eq(g$2.roleId,e),eq(g$2.permissionId,i$1)))).length===0?(N.info({roleId:e,permissionId:i$1},"Assigning permission to role"),await s.insert(g$2).values({roleId:e,permissionId:i$1,createdAt:new Date})):N.debug({roleId:e,permissionId:i$1},"Permission already assigned to role");}async revokePermissionFromRole(e,i$1){let s=await i();N.info({roleId:e,permissionId:i$1},"Revoking permission from role"),await s.delete(g$2).where(and(eq(g$2.roleId,e),eq(g$2.permissionId,i$1)));}async getUserMenuConfig(e,i){let s=await this.getUserPermissions(e,i),n=new Set(s.map(T=>T.code)),l=T=>!T||T.length===0?true:T.some(R=>n.has(R));return (T=>T.filter(R=>l(R.permissions)).map(R=>{if(R.children&&R.children.length>0){let x=R.children.filter(H=>l(H.permissions));return x.length===0?null:{...R,children:x}}return R}).filter(R=>R!==null))(h)}async getUserPagePermissions(e,i){let s=await this.getUserPermissions(e,i),n=new Set(s.map(m=>m.code)),l=m=>!m||m.length===0?true:m.every(T=>n.has(T));return A.filter(m=>l(m.requiredPermissions)).map(m=>({...m,actions:m.actions.filter(T=>l(T.permissions))}))}},Ne=new U;export{K as a,g as b,d as c,k as d,F as e,$ as f,z as g,q as h,ee as i,se as j,ie as k,re as l,O as m,Se as n,ge as o,Oe as p,fe as q,ye as r,U as s,Ne as t};
@@ -0,0 +1 @@
1
+ import {a as a$1}from'./chunk-5J6HXUF6.js';function a(){let t=Date.now().toString(36).toUpperCase(),e=Math.random().toString(36).substring(2,6).toUpperCase();return `ORD${t}${e}`}function i(){let t=Date.now().toString(36).toUpperCase(),e=Math.random().toString(36).substring(2,6).toUpperCase();return `TKT${t}${e}`}function s(){let t=Date.now().toString(36).toUpperCase(),e=Math.random().toString(36).substring(2,6).toUpperCase();return `DSP${t}${e}`}function g(t,e){return new Date(t.getTime()+Math.random()*(e.getTime()-t.getTime())).toISOString()}function p(t){return t[Math.floor(Math.random()*t.length)]}var o=a$1(()=>{});export{a,i as b,s as c,g as d,p as e,o as f};
@@ -0,0 +1 @@
1
+ import {b,a as a$3}from'./chunk-I6OBDFDU.js';import {f,e,d as d$1,a as a$1}from'./chunk-FIY4CGJJ.js';import {d,a as a$2}from'./chunk-JCPOP4XL.js';import {a}from'./chunk-UMAQLNPE.js';import {i}from'./chunk-OYCBNRMK.js';import {J,m}from'./chunk-27SIJSPF.js';import {eq,or,like,and,desc}from'drizzle-orm';a();J();d();f();b();async function M(){let o=await i();if((await o.select().from(m)).length===0){let r=["pending","processing","completed","cancelled","disputed"],n=[{name:"\u5F20\u4E09",email:"zhangsan@example.com"},{name:"\u674E\u56DB",email:"lisi@example.com"},{name:"\u738B\u4E94",email:"wangwu@example.com"},{name:"\u8D75\u516D",email:"zhaoliu@example.com"},{name:"\u94B1\u4E03",email:"qianqi@example.com"}],t=["\u9AD8\u7EA7\u4F1A\u5458\u8BA2\u9605","\u4E13\u4E1A\u7248\u8F6F\u4EF6\u6388\u6743","\u4F01\u4E1A\u7EA7\u89E3\u51B3\u65B9\u6848","\u6570\u636E\u5206\u6790\u670D\u52A1","\u6280\u672F\u652F\u6301\u5957\u9910","\u5B9A\u5236\u5F00\u53D1\u670D\u52A1"];for(let c=0;c<25;c++){let e$1=e(n),A=e(t),O=e(r),w=new Date(d$1(new Date("2024-01-01"),new Date));await o.insert(m).values({orderNo:a$1(),customerName:e$1.name,customerEmail:e$1.email,productName:A,amount:Math.floor(Math.random()*1e4)+100,status:O,createdAt:w,updatedAt:new Date(d$1(w,new Date))});}}}async function q(o){let s=await i(),r=[];return o?.status&&r.push(eq(m.status,o.status)),o?.customerName&&r.push(or(like(m.customerName,`%${o.customerName}%`),like(m.customerEmail,`%${o.customerName}%`))),(r.length>0?await s.select().from(m).where(and(...r)).orderBy(desc(m.createdAt)):await s.select().from(m).orderBy(desc(m.createdAt))).map(t=>({id:`order-${t.id}`,orderNo:t.orderNo,customerName:t.customerName,customerEmail:t.customerEmail,productName:t.productName,amount:t.amount,status:t.status,createdAt:a$2(t.createdAt),updatedAt:a$2(t.updatedAt)}))}async function v(o){let s=await i(),r=a$3("order",o);if(r===-1)return null;let t=(await s.select().from(m).where(eq(m.id,r)))[0];return t?{id:`order-${t.id}`,orderNo:t.orderNo,customerName:t.customerName,customerEmail:t.customerEmail,productName:t.productName,amount:t.amount,status:t.status,createdAt:a$2(t.createdAt),updatedAt:a$2(t.updatedAt)}:null}async function B(o){let s=await i(),r=new Date,t=(await s.insert(m).values({orderNo:a$1(),customerName:o.customerName,customerEmail:o.customerEmail,productName:o.productName,amount:o.amount,status:"pending",createdAt:r,updatedAt:r}).returning())[0];return {id:`order-${t.id}`,orderNo:t.orderNo,customerName:t.customerName,customerEmail:t.customerEmail,productName:t.productName,amount:t.amount,status:t.status,createdAt:a$2(t.createdAt),updatedAt:a$2(t.updatedAt)}}async function z(o,s){let r=await i(),n=a$3("order",o);if(n===-1)return null;let t={updatedAt:new Date};s.status!==void 0&&s.status!==null&&(t.status=s.status);let c=await r.update(m).set(t).where(eq(m.id,n)).returning();if(c.length===0)return null;let e=c[0];return {id:`order-${e.id}`,orderNo:e.orderNo,customerName:e.customerName,customerEmail:e.customerEmail,productName:e.productName,amount:e.amount,status:e.status,createdAt:a$2(e.createdAt),updatedAt:a$2(e.updatedAt)}}async function R(o){let s=await i(),r=a$3("order",o);return r===-1?{message:"\u8BA2\u5355\u4E0D\u5B58\u5728"}:(await s.delete(m).where(eq(m.id,r)).returning()).length===0?{message:"\u8BA2\u5355\u4E0D\u5B58\u5728"}:{message:"\u8BA2\u5355\u5DF2\u5220\u9664"}}async function k(o){let s=await i(),r=a$3("order",o);if(r===-1)return null;let t=(await s.select().from(m).where(eq(m.id,r)))[0];if(!t||t.status!=="pending")return null;let e=(await s.update(m).set({status:"processing",updatedAt:new Date}).where(eq(m.id,r)).returning())[0];return {id:`order-${e.id}`,orderNo:e.orderNo,customerName:e.customerName,customerEmail:e.customerEmail,productName:e.productName,amount:e.amount,status:e.status,createdAt:a$2(e.createdAt),updatedAt:a$2(e.updatedAt)}}async function j(o){let s=await i(),r=a$3("order",o);if(r===-1)return null;let t=(await s.select().from(m).where(eq(m.id,r)))[0];if(!t||t.status!=="pending"&&t.status!=="processing")return null;let e=(await s.update(m).set({status:"cancelled",updatedAt:new Date}).where(eq(m.id,r)).returning())[0];return {id:`order-${e.id}`,orderNo:e.orderNo,customerName:e.customerName,customerEmail:e.customerEmail,productName:e.productName,amount:e.amount,status:e.status,createdAt:a$2(e.createdAt),updatedAt:a$2(e.updatedAt)}}async function F(o){let s=await i(),r=a$3("order",o);if(r===-1)return null;let t=(await s.select().from(m).where(eq(m.id,r)))[0];if(!t||t.status!=="processing")return null;let e=(await s.update(m).set({status:"completed",updatedAt:new Date}).where(eq(m.id,r)).returning())[0];return {id:`order-${e.id}`,orderNo:e.orderNo,customerName:e.customerName,customerEmail:e.customerEmail,productName:e.productName,amount:e.amount,status:e.status,createdAt:a$2(e.createdAt),updatedAt:a$2(e.updatedAt)}}export{M as a,q as b,v as c,B as d,z as e,R as f,k as g,j as h,F as i};
@@ -0,0 +1 @@
1
+ import {a}from'./chunk-5J6HXUF6.js';function u(n,e){let r=parseInt(e.replace(`${n}-`,""),10);return isNaN(r)?-1:r}var s=a(()=>{});export{u as a,s as b};
@@ -0,0 +1 @@
1
+ import {b,a as a$1}from'./chunk-I6OBDFDU.js';import {f,e,d as d$1,b as b$1}from'./chunk-FIY4CGJJ.js';import {d,a as a$2}from'./chunk-JCPOP4XL.js';import {a}from'./chunk-UMAQLNPE.js';import {i}from'./chunk-OYCBNRMK.js';import {J,r,s}from'./chunk-27SIJSPF.js';import {eq,and,desc}from'drizzle-orm';a();J();d();f();b();var E=["\u5BA2\u670D\u5C0F\u738B","\u5BA2\u670D\u5C0F\u674E","\u5BA2\u670D\u5C0F\u5F20"];async function w(t){let e=await(await i()).select().from(s).where(eq(s.ticketId,t.id)).orderBy(desc(s.createdAt));return {id:`ticket-${t.id}`,ticketNo:t.ticketNo,customerName:t.customerName,customerEmail:t.customerEmail,subject:t.subject,description:t.description,status:t.status,priority:t.priority,category:t.category,assignedTo:t.assignedTo??void 0,createdAt:a$2(t.createdAt),updatedAt:a$2(t.updatedAt),replies:e.map(s=>({id:`reply-${s.id}`,ticketId:`ticket-${s.ticketId}`,content:s.content,author:s.author,isCustomer:s.isCustomer,createdAt:a$2(s.createdAt)}))}}function q(t){return {id:`ticket-${t.id}`,ticketNo:t.ticketNo,customerName:t.customerName,customerEmail:t.customerEmail,subject:t.subject,description:t.description,status:t.status,priority:t.priority,category:t.category,assignedTo:t.assignedTo??void 0,createdAt:a$2(t.createdAt),updatedAt:a$2(t.updatedAt),replies:[]}}async function K(){let t=await i();if((await t.select().from(r)).length===0){let e$1=["low","medium","high","urgent"],s$1=["open","in_progress","waiting_customer","resolved","closed"],r$1=["technical","billing","feature_request","bug_report","general"],o=[{name:"\u5F20\u4E09",email:"zhangsan@example.com"},{name:"\u674E\u56DB",email:"lisi@example.com"},{name:"\u738B\u4E94",email:"wangwu@example.com"},{name:"\u8D75\u516D",email:"zhaoliu@example.com"},{name:"\u94B1\u4E03",email:"qianqi@example.com"}],d=["\u65E0\u6CD5\u767B\u5F55\u7CFB\u7EDF","\u8BA2\u5355\u652F\u4ED8\u5931\u8D25","\u529F\u80FD\u4F7F\u7528\u54A8\u8BE2","\u6570\u636E\u5BFC\u51FA\u95EE\u9898","\u8D26\u53F7\u6743\u9650\u7533\u8BF7","\u7CFB\u7EDF\u6027\u80FD\u95EE\u9898","\u754C\u9762\u663E\u793A\u5F02\u5E38","API \u8C03\u7528\u9519\u8BEF"];for(let u=0;u<20;u++){let T=e(o),h=e(s$1),R=e(e$1),x=e(r$1),A=e(d),g=new Date(d$1(new Date("2024-01-01"),new Date)),N=h!=="open"?e(E):null,I=(await t.insert(r).values({ticketNo:b$1(),customerName:T.name,customerEmail:T.email,subject:A,description:`\u5173\u4E8E${A}\u7684\u8BE6\u7EC6\u63CF\u8FF0\uFF0C\u7528\u6237\u9047\u5230\u4E86\u4E00\u4E9B\u95EE\u9898\u9700\u8981\u89E3\u51B3\u3002`,status:h,priority:R,category:x,assignedTo:N,createdAt:g,updatedAt:g}).returning())[0].id;if(h!=="open"){let P=Math.floor(Math.random()*3)+1;for(let y=0;y<P;y++){let S=y%2!==0;await t.insert(s).values({ticketId:I,content:`\u8FD9\u662F\u7B2C ${y+1} \u6761\u56DE\u590D\u5185\u5BB9\uFF0C\u89E3\u51B3\u4E86\u7528\u6237\u7684\u95EE\u9898\u3002`,author:S?T.name:e(E),isCustomer:S,createdAt:new Date(d$1(g,new Date))});}let C=new Date(d$1(g,new Date));await t.update(r).set({updatedAt:C}).where(eq(r.id,I));}}}}async function L(t){let n=await i(),e=[];t?.status&&e.push(eq(r.status,t.status)),t?.priority&&e.push(eq(r.priority,t.priority)),t?.category&&e.push(eq(r.category,t.category));let s={urgent:0,high:1,medium:2,low:3},o=(e.length>0?await n.select().from(r).where(and(...e)):await n.select().from(r)).sort((u,T)=>s[u.priority]-s[T.priority]),d=[];for(let u of o)d.push(await w(u));return d}async function M(t){let n=await i(),e=a$1("ticket",t);if(e===-1)return null;let r$1=(await n.select().from(r).where(eq(r.id,e)))[0];return r$1?w(r$1):null}async function Q(t){let n=await i(),e=new Date,s=await n.insert(r).values({ticketNo:b$1(),customerName:t.customerName,customerEmail:t.customerEmail,subject:t.subject,description:t.description,status:"open",priority:t.priority,category:t.category,createdAt:e,updatedAt:e}).returning();return q(s[0])}async function V(t,n){let e=await i(),s=a$1("ticket",t);if(s===-1)return null;let r$1={updatedAt:new Date};n.status!==void 0&&n.status!==null&&(r$1.status=n.status),n.assignedTo!==void 0&&n.assignedTo!==null&&(r$1.assignedTo=n.assignedTo);let o=await e.update(r).set(r$1).where(eq(r.id,s)).returning();return o.length===0?null:w(o[0])}async function X(t){let n=await i(),e=a$1("ticket",t);return e===-1?{message:"\u5DE5\u5355\u4E0D\u5B58\u5728"}:(await n.delete(r).where(eq(r.id,e)).returning()).length===0?{message:"\u5DE5\u5355\u4E0D\u5B58\u5728"}:{message:"\u5DE5\u5355\u5DF2\u5220\u9664"}}async function Y(t,n){let e=await i(),s$1=a$1("ticket",t);if(s$1===-1)return null;let o=(await e.select().from(r).where(eq(r.id,s$1)))[0];if(!o)return null;let d=new Date;await e.insert(s).values({ticketId:s$1,content:n.content,author:n.author,isCustomer:false,createdAt:d});let u=o.status==="open"?"in_progress":o.status;return await e.update(r).set({status:u,updatedAt:d}).where(eq(r.id,s$1)),M(t)}async function Z(t){let n=await i(),e=a$1("ticket",t);if(e===-1||(await n.select().from(r).where(eq(r.id,e))).length===0)return null;let r$1=await n.update(r).set({status:"closed",updatedAt:new Date}).where(eq(r.id,e)).returning();return r$1.length===0?null:w(r$1[0])}export{K as a,L as b,M as c,Q as d,V as e,X as f,Y as g,Z as h};
@@ -0,0 +1 @@
1
+ var s=class e extends Error{code;statusCode;details;cause;logLevel;timestamp;constructor(t){super(t.message),this.name="AppError",this.code=t.code,this.statusCode=t.statusCode,this.details=t.details,this.cause=t.cause,this.logLevel=t.logLevel??"warn",this.timestamp=new Date().toISOString(),Error.captureStackTrace&&Error.captureStackTrace(this,this.constructor);}toJSON(){return {success:false,error:this.message,code:this.code,status:this.statusCode,details:this.details,timestamp:this.timestamp}}static isAppError(t){return t instanceof e}},n=class extends s{constructor(t,r){super({code:"VALIDATION_ERROR",message:t,statusCode:400,details:r,logLevel:"info"}),this.name="ValidationError";}},i=class e extends s{constructor(t="Unauthorized",r="UNAUTHORIZED"){super({code:r,message:t,statusCode:401,logLevel:"warn"}),this.name="AuthenticationError";}static tokenExpired(){return new e("Token has expired","TOKEN_EXPIRED")}static tokenInvalid(){return new e("Invalid token","TOKEN_INVALID")}static tokenMissing(){return new e("Authentication token is required","TOKEN_MISSING")}},o=class e extends s{constructor(t="Forbidden",r){super({code:"FORBIDDEN",message:t,statusCode:403,details:r,logLevel:"warn"}),this.name="AuthorizationError";}static permissionDenied(t){return new e(t?`Permission denied: ${t}`:"Permission denied",t?[{message:`Missing required permission: ${t}`}]:void 0)}static insufficientRole(t,r){return new e("Insufficient role privileges",t&&r?[{message:`Role '${t}' does not meet required role '${r}'`}]:void 0)}},a=class e extends s{constructor(t,r){super({code:"NOT_FOUND",message:r?`${t} not found: ${r}`:`${t} not found`,statusCode:404,logLevel:"info"}),this.name="NotFoundError";}static user(t){return new e("User",t)}static order(t){return new e("Order",t)}static dispute(t){return new e("Dispute",t)}static ticket(t){return new e("Ticket",t)}static tenant(t){return new e("Tenant",t)}},E=class e extends s{constructor(t,r){super({code:"CONFLICT",message:t,statusCode:409,details:r,logLevel:"info"}),this.name="ConflictError";}static duplicateEntry(t,r){return new e(`Duplicate entry for ${t}`,[{field:t,message:`Value '${r}' already exists`}])}},I=class e extends s{constructor(t,r="BUSINESS_ERROR",N){super({code:r,message:t,statusCode:422,details:N,logLevel:"info"}),this.name="BusinessError";}static invalidState(t,r){return new e("Invalid state transition","INVALID_STATE",[{message:`Current state '${t}' is not valid. Expected one of: ${r.join(", ")}`}])}static operationNotAllowed(t){return new e(`Operation not allowed: ${t}`,"OPERATION_NOT_ALLOWED")}};export{s as a,n as b,i as c,o as d,a as e,E as f,I as g};
@@ -0,0 +1 @@
1
+ import {randomUUID}from'crypto';function n(){return typeof globalThis<"u"&&globalThis.crypto?.randomUUID?globalThis.crypto.randomUUID():randomUUID()}export{n as a};
@@ -0,0 +1 @@
1
+ import {f,d as d$1,e}from'./chunk-FIY4CGJJ.js';import {d,a as a$2}from'./chunk-JCPOP4XL.js';import {a}from'./chunk-UMAQLNPE.js';import {b as b$1,a as a$1,i}from'./chunk-OYCBNRMK.js';import {J,b as b$2,c}from'./chunk-27SIJSPF.js';import {desc,eq}from'drizzle-orm';import {writeFile,readFile,stat,mkdir,unlink}from'fs/promises';import {extname,join}from'path';import {existsSync}from'fs';import {randomUUID,timingSafeEqual,createHmac}from'crypto';a();J();d();b$1();var k=["image/jpeg","image/png","image/gif","image/webp","application/pdf","text/plain","text/csv","application/json","application/vnd.openxmlformats-officedocument.spreadsheetml.sheet","application/vnd.openxmlformats-officedocument.wordprocessingml.document"],q=[".jpg",".jpeg",".png",".gif",".webp",".pdf",".txt",".csv",".json",".xlsx",".docx"],w=null;function y(){if(w)return w;let t=process.env.FILE_STORAGE_PATH||join(process.cwd(),"uploads"),e=process.env.FILE_TEMP_PATH||join(t,"temp"),r=parseInt(process.env.FILE_TEMP_TTL||"3600000",10),i=parseInt(process.env.FILE_PRIVATE_URL_EXPIRY||"3600",10),n=process.env.FILE_SECRET_KEY||(process.env.NODE_ENV==="test"?"test-secret-key":void 0);if(!n)throw new Error("FILE_SECRET_KEY environment variable is required in production");return w={baseDir:t,tempDir:e,tempFileTTL:r,privateUrlExpiry:i,secretKey:n},w}function b(t,e){let r=y();return {uploadDir:join(r.baseDir,t),maxFileSize:e?.maxFileSize??10*1024*1024,allowedMimeTypes:e?.allowedMimeTypes??k,allowedExtensions:e?.allowedExtensions??q}}async function H(t){existsSync(t)||await mkdir(t,{recursive:true});}function v(t,e){if(t.size>e.maxFileSize)return {valid:false,error:`File size exceeds maximum allowed size of ${e.maxFileSize} bytes`};if(!e.allowedMimeTypes.includes(t.type))return {valid:false,error:`File type "${t.type}" is not allowed`};let r=extname(t.name).toLowerCase();return e.allowedExtensions.includes(r)?{valid:true}:{valid:false,error:`File extension "${r}" is not allowed`}}async function E(t,e,r){if(a$1)throw new Error("Local file storage is not supported in Cloudflare environment. Use R2 or other cloud storage.");let i=b(t,r),n=v(e,i);if(!n.valid)throw new Error(n.error);await H(i.uploadDir);let a=extname(e.name).toLowerCase(),o=`${randomUUID()}${a}`,m=join(i.uploadDir,o);return await writeFile(m,Buffer.from(e.data)),{filename:o,originalName:e.name,mimeType:e.type,size:e.size,path:m,extension:a}}async function ne(t){if(a$1)throw new Error("Local file storage is not supported in Cloudflare environment.");if(!existsSync(t))throw new Error("File not found");return readFile(t)}async function A(t){if(a$1)throw new Error("Local file storage is not supported in Cloudflare environment.");try{return existsSync(t)&&await unlink(t),!0}catch{return false}}function Y(t,e){let r=y();return join(r.baseDir,t,e)}function oe(t,e,r){return r?`${r}/files/public/${t}/${e}`:`/files/public/${t}/${e}`}function P(t,e,r){let i=y(),n=`${t}:${e}:${r}`;return createHmac("sha256",i.secretKey).update(n).digest("hex")}function ae(t,e,r,i){let n=P(t,e,r);try{let a=Buffer.from(i,"hex"),o=Buffer.from(n,"hex");return a.length===o.length&&timingSafeEqual(a,o)}catch{return false}}function se(t,e,r,i){let n=y(),a=Math.floor(Date.now()/1e3)+(r||n.privateUrlExpiry),o=P(t,e,a);return {url:i?`${i}/files/private/${t}/${e}?expiry=${a}&signature=${o}`:`/files/private/${t}/${e}?expiry=${a}&signature=${o}`,expiry:a}}async function le(t,e){let r=Y(t,e);if(!existsSync(r))return null;try{let i=await stat(r),n=extname(e).toLowerCase(),a={".jpg":"image/jpeg",".jpeg":"image/jpeg",".png":"image/png",".gif":"image/gif",".webp":"image/webp",".pdf":"application/pdf",".txt":"text/plain",".csv":"text/csv",".json":"application/json",".xlsx":"application/vnd.openxmlformats-officedocument.spreadsheetml.sheet",".docx":"application/vnd.openxmlformats-officedocument.wordprocessingml.document"};return {size:i.size,mimeType:a[n]||"application/octet-stream",lastModified:i.mtime}}catch{return null}}function de(t){return `"${t.replace(/^[+\-=@\t\r]/,"'$&").replace(/"/g,'""')}"`}f();var D="todos",S=["\u5B66\u4E60 Hono RPC","\u5C1D\u8BD5 SSE \u901A\u77E5","\u63A2\u7D22 WebSocket \u804A\u5929","\u5B9E\u73B0\u7528\u6237\u8BA4\u8BC1","\u6DFB\u52A0\u6587\u4EF6\u4E0A\u4F20\u529F\u80FD","\u8BBE\u7F6E\u6743\u9650\u63A7\u5236","\u4F18\u5316\u524D\u7AEF\u6027\u80FD","\u7F16\u5199\u5355\u5143\u6D4B\u8BD5","\u90E8\u7F72\u5230 Cloudflare","\u521B\u5EFA\u7BA1\u7406\u540E\u53F0"],C=["\u6784\u5EFA\u7C7B\u578B\u5B89\u5168\u7684 API \u8C03\u7528","\u5B9E\u65F6\u670D\u52A1\u5668\u63A8\u9001\u66F4\u65B0","\u53CC\u5411\u5B9E\u65F6\u901A\u4FE1","\u4F7F\u7528 JWT \u8FDB\u884C\u7528\u6237\u8BA4\u8BC1","\u652F\u6301\u591A\u79CD\u6587\u4EF6\u683C\u5F0F\u4E0A\u4F20","\u57FA\u4E8E\u89D2\u8272\u7684\u8BBF\u95EE\u63A7\u5236","\u51CF\u5C11\u4E0D\u5FC5\u8981\u7684\u6E32\u67D3","\u786E\u4FDD\u4EE3\u7801\u8D28\u91CF","Serverless \u90E8\u7F72\u65B9\u6848","\u7BA1\u7406\u5458\u53EF\u4EE5\u7BA1\u7406\u6240\u6709\u6570\u636E"];async function xe(){let t=await i();if((await t.select().from(b$2)).length===0){let r=["pending","in_progress","completed"];for(let i=0;i<25;i++){let n=new Date(d$1(new Date("2024-01-01"),new Date));await t.insert(b$2).values({title:S[i%S.length],description:C[i%C.length],status:e(r),createdAt:n,updatedAt:new Date(d$1(n,new Date))});}}}async function ye(){return (await(await i()).select().from(b$2).orderBy(desc(b$2.createdAt))).map(r=>({id:r.id,title:r.title,description:r.description??void 0,status:r.status,createdAt:a$2(r.createdAt),updatedAt:a$2(r.updatedAt)}))}async function V(t){let i$1=(await(await i()).select().from(b$2).where(eq(b$2.id,t)))[0];return i$1?{id:i$1.id,title:i$1.title,description:i$1.description??void 0,status:i$1.status,createdAt:a$2(i$1.createdAt),updatedAt:a$2(i$1.updatedAt)}:null}async function he(t){let e=await i(),r=new Date,n=(await e.insert(b$2).values({title:t.title,description:t.description??null,status:"pending",createdAt:r,updatedAt:r}).returning())[0];return {id:n.id,title:n.title,description:n.description??void 0,status:n.status,createdAt:a$2(n.createdAt),updatedAt:a$2(n.updatedAt)}}async function Te(t,e){let r=await i(),n={updatedAt:new Date};e.title!==void 0&&e.title!==null&&(n.title=e.title),e.description!==void 0&&e.description!==null&&(n.description=e.description),e.status!==void 0&&e.status!==null&&(n.status=e.status);let a=await r.update(b$2).set(n).where(eq(b$2.id,t)).returning();if(a.length===0)return null;let o=a[0];return {id:o.id,title:o.title,description:o.description??void 0,status:o.status,createdAt:a$2(o.createdAt),updatedAt:a$2(o.updatedAt)}}async function be(t){let e=await i(),r=await e.select().from(c).where(eq(c.todoId,t));for(let n of r)await A(n.path);return (await e.delete(b$2).where(eq(b$2.id,t)).returning()).length>0}async function ve(t,e,r){let i$1=await i(),n=b(D),a=v(e,n);if(!a.valid)throw new Error(a.error);let o=await E(D,e),m=new Date,p=(await i$1.insert(c).values({todoId:t,fileName:o.filename,originalName:o.originalName,mimeType:o.mimeType,size:o.size,path:o.path,uploadedBy:r??null,createdAt:m}).returning())[0];return {id:p.id,todoId:p.todoId,fileName:p.fileName,originalName:p.originalName,mimeType:p.mimeType,size:p.size,path:p.path,uploadedBy:p.uploadedBy??void 0,createdAt:a$2(p.createdAt)}}async function X(t){return (await(await i()).select().from(c).where(eq(c.todoId,t)).orderBy(desc(c.createdAt))).map(i=>({id:i.id,todoId:i.todoId,fileName:i.fileName,originalName:i.originalName,mimeType:i.mimeType,size:i.size,path:i.path,uploadedBy:i.uploadedBy??void 0,createdAt:a$2(i.createdAt)}))}async function Ae(t){let e=await V(t);if(!e)return null;let r=await X(t);return {...e,attachments:r}}async function Fe(t){let e=await i(),r=await e.select().from(c).where(eq(c.id,t));if(r.length===0)return false;let i$1=r[0];return await A(i$1.path),await e.delete(c).where(eq(c.id,t)),true}export{E as a,ne as b,Y as c,oe as d,ae as e,se as f,le as g,de as h,xe as i,ye as j,V as k,he as l,Te as m,be as n,ve as o,X as p,Ae as q,Fe as r};
@@ -0,0 +1 @@
1
+ import {J,I}from'./chunk-27SIJSPF.js';import {a as a$1}from'./chunk-5J6HXUF6.js';import {config}from'dotenv';import {resolve,dirname}from'path';import {existsSync,mkdirSync}from'fs';import c from'pino';import {drizzle}from'drizzle-orm/libsql';import {drizzle as drizzle$1}from'drizzle-orm/d1';import {createClient}from'@libsql/client';var a,D=a$1(()=>{a=typeof globalThis<"u"&&("WebSocketPair"in globalThis||globalThis.isCloudflare===true),!a&&typeof process<"u"&&process.versions?.node!==void 0;});function k(){if(a)return;let e=process.env.NODE_ENV||"development",r={test:".env.test",development:".env.local",production:".env.production"}[e];if(r){let i=resolve(process.cwd(),r);existsSync(i)&&config({path:i});}}function L(){let e=typeof process<"u"?process.env.NODE_ENV||"development":"production",o=typeof process<"u"?parseInt(process.env.PORT||"3010",10):3010,r=typeof process<"u"?process.env.ENABLE_DOCS!=="false":false,i=["sqlite","mysql","d1"],s=typeof process<"u"?process.env.DB_DRIVER||"sqlite":"d1",t=i.includes(s)?s:"sqlite";return {nodeEnv:e,port:o,enableDocs:r,database:{driver:a?"d1":t,sqlitePath:typeof process<"u"?process.env.SQLITE_PATH||`./data/${e}.db`:void 0,mysqlHost:typeof process<"u"?process.env.MYSQL_HOST||"localhost":void 0,mysqlPort:typeof process<"u"?parseInt(process.env.MYSQL_PORT||"3306",10):void 0,mysqlUser:typeof process<"u"?process.env.MYSQL_USER||"root":void 0,mysqlPassword:typeof process<"u"?process.env.MYSQL_PASSWORD||"":void 0,mysqlDatabase:typeof process<"u"?process.env.MYSQL_DATABASE||"app":void 0,d1Database:globalThis.DB}}}function m(){return L().database}var S=a$1(()=>{D();k();});function q(e,o="info"){let r=["trace","debug","info","warn","error","fatal"],i=r.indexOf(o),s=(t,n,v)=>{if(r.indexOf(t)>=i){let g=`${`[${new Date().toISOString()}] ${t.toUpperCase()}: [${e}]`} ${v} ${JSON.stringify(n)}`;switch(t){case "error":case "fatal":console.error(g);break;case "warn":console.warn(g);break;default:process.env.NODE_ENV!=="production"&&console.log(g);}}};return {trace:(t,n)=>s("trace",t,n),debug:(t,n)=>s("debug",t,n),info:(t,n)=>s("info",t,n),warn:(t,n)=>s("warn",t,n),error:(t,n)=>s("error",t,n),fatal:(t,n)=>s("fatal",t,n),child:()=>q(e,o)}}function M(e,o){let r=L(),i=o||(r.nodeEnv==="production"?"info":"debug"),s=r.nodeEnv==="development";if(r.nodeEnv==="test"){let C={level:i,timestamp:c.stdTimeFunctions.isoTime,formatters:{level:g=>({level:g}),bindings:()=>({})}};return c(C).child({module:e})}let n=resolve(process.cwd(),"logs");existsSync(n)||mkdirSync(n,{recursive:true});let v=resolve(n,`${e}.log`),u=[];return s&&u.push({level:i,stream:c.transport({target:"pino-pretty",options:{colorize:true,translateTime:"SYS:standard",ignore:"pid,hostname",messageFormat:`[${e}] {msg}`}})}),u.push({level:i,stream:c.transport({target:"pino/file",options:{destination:v}})}),c({level:i},c.multistream(u)).child({module:e})}function p(e,o){if(a)return q(e,o||"info");if(w.has(e))return w.get(e);let r=M(e,o);return w.set(e,r),r}var w,E,x=a$1(()=>{S();D();w=new Map;E={app:()=>p("app"),db:()=>p("db"),api:()=>p("api"),ws:()=>p("ws"),bootstrap:()=>p("bootstrap"),module:e=>p(e)};});async function j(){if(d)return d;let e=m();if(l.debug({driver:e.driver},"Creating database connection"),e.driver==="d1")d=Y(e);else {let o=V(e);d=o.db,f=o.client;}return l.info({driver:e.driver},"Database connected"),d}function V(e){if(a)throw new Error("SQLite is not supported in Cloudflare Workers. Use D1 instead.");let o=e.sqlitePath||"./data/app.db";if(o!==":memory:"){let s=dirname(o);existsSync(s)||(mkdirSync(s,{recursive:true}),l.debug({dir:s},"Created database directory"));}let r=createClient({url:o===":memory:"?":memory:":`file:${o}`}),i=drizzle(r,{schema:I});return l.debug({path:o},"SQLite database created"),{db:i,client:r}}function Y(e){if(!e.d1Database)throw new Error("D1 database binding not found. Make sure D1 is configured in wrangler.toml");return drizzle$1(e.d1Database,{schema:I})}async function ge(){let e=m();return e.driver==="sqlite"?(f||await j(),f):e.driver==="d1"&&e.d1Database||null}async function me(){m().driver==="sqlite"&&f&&(f.close(),f=null,d=null,l.info({},"Database connection closed"));}async function ue(){if(a){l.info({},"Migrations skipped in Cloudflare Workers");return}if(m().driver==="sqlite"&&d){let o="./drizzle";if(existsSync(o)){let{migrate:r}=await import('drizzle-orm/libsql/migrator');await r(d,{migrationsFolder:o}),l.info({folder:o},"Migrations applied");}else l.warn({folder:o},"No migrations folder found");}}var d,f,l,B=a$1(()=>{S();J();x();D();d=null,f=null,l=E.db();});export{a,D as b,L as c,m as d,S as e,p as f,E as g,x as h,j as i,ge as j,me as k,ue as l,B as m};
@@ -0,0 +1 @@
1
+ import {b,a as a$1}from'./chunk-I6OBDFDU.js';import {f,e,d as d$1,c}from'./chunk-FIY4CGJJ.js';import {d,a as a$2}from'./chunk-JCPOP4XL.js';import {a}from'./chunk-UMAQLNPE.js';import {i}from'./chunk-OYCBNRMK.js';import {J,v}from'./chunk-27SIJSPF.js';import {eq,and,desc}from'drizzle-orm';a();J();d();f();b();async function O(){let e$1=await i();if((await e$1.select().from(v)).length===0){let s=["refund","product_quality","service_quality","delivery","other"],r=["pending","investigating","resolved","rejected"],i=["\u5546\u54C1\u4E0E\u63CF\u8FF0\u4E0D\u7B26\uFF0C\u8981\u6C42\u9000\u6B3E","\u5546\u54C1\u8D28\u91CF\u95EE\u9898\uFF0C\u8981\u6C42\u6362\u8D27","\u670D\u52A1\u6001\u5EA6\u5DEE\uFF0C\u8981\u6C42\u8D54\u507F","\u914D\u9001\u5EF6\u8FDF\uFF0C\u8981\u6C42\u8865\u507F","\u8BA2\u5355\u91D1\u989D\u9519\u8BEF\uFF0C\u8981\u6C42\u66F4\u6B63"],u=["\u5DF2\u540C\u610F\u9000\u6B3E\uFF0C3-5\u4E2A\u5DE5\u4F5C\u65E5\u5185\u5230\u8D26","\u5DF2\u5B89\u6392\u6362\u8D27\uFF0C\u9884\u8BA13\u5929\u5185\u9001\u8FBE","\u5DF2\u53D1\u653E\u4F18\u60E0\u5238\u4F5C\u4E3A\u8865\u507F","\u5DF2\u90E8\u5206\u9000\u6B3E\uFF0C\u95EE\u9898\u5DF2\u89E3\u51B3","\u7ECF\u6838\u5B9E\uFF0C\u9A73\u56DE\u4E89\u8BAE\u7533\u8BF7"],d=["\u5F20\u4E09","\u674E\u56DB","\u738B\u4E94","\u8D75\u516D","\u94B1\u4E03"],c$1=["zhangsan","lisi","wangwu","zhaoliu","qianqi"];for(let m=0;m<15;m++){let A=e(s),v$1=e(r),f=new Date(d$1(new Date("2024-01-01"),new Date)),g=v$1==="resolved"||v$1==="rejected";await e$1.insert(v).values({disputeNo:c(),orderId:`order-${Math.floor(Math.random()*25)+1}`,orderNo:`ORD${Math.random().toString(36).substring(2,8).toUpperCase()}`,customerName:d[m%5],customerEmail:`${c$1[m%5]}@example.com`,type:A,status:v$1,description:e(i),resolution:g?e(u):null,amount:Math.floor(Math.random()*5e3)+100,createdAt:f,updatedAt:g?new Date(d$1(f,new Date)):f,resolvedAt:g?new Date(d$1(f,new Date)):null,resolvedBy:g?"\u5BA2\u670D\u5C0F\u738B":null});}}}function l(e){return {id:`dispute-${e.id}`,disputeNo:e.disputeNo,orderId:e.orderId,orderNo:e.orderNo,customerName:e.customerName,customerEmail:e.customerEmail,type:e.type,status:e.status,description:e.description,resolution:e.resolution??void 0,amount:e.amount,createdAt:a$2(e.createdAt),updatedAt:a$2(e.updatedAt),resolvedAt:e.resolvedAt?a$2(e.resolvedAt):void 0,resolvedBy:e.resolvedBy??void 0}}async function j(e){let n=await i(),s=[];return e?.status&&s.push(eq(v.status,e.status)),e?.type&&s.push(eq(v.type,e.type)),(s.length>0?await n.select().from(v).where(and(...s)).orderBy(desc(v.createdAt)):await n.select().from(v).orderBy(desc(v.createdAt))).map(l)}async function C(e){let n=await i(),s=a$1("dispute",e);if(s===-1)return null;let i$1=(await n.select().from(v).where(eq(v.id,s)))[0];return i$1?l(i$1):null}async function _(e){let n=await i(),s=new Date,r=await n.insert(v).values({disputeNo:c(),orderId:e.orderId,orderNo:e.orderNo,customerName:e.customerName,customerEmail:e.customerEmail,type:e.type,status:"pending",description:e.description,amount:e.amount,createdAt:s,updatedAt:s}).returning();return l(r[0])}async function $(e,n){let s=await i(),r=a$1("dispute",e);if(r===-1)return null;let i$1={updatedAt:new Date};n.status!==void 0&&n.status!==null&&(i$1.status=n.status),n.resolution!==void 0&&n.resolution!==null&&(i$1.resolution=n.resolution);let u=await s.update(v).set(i$1).where(eq(v.id,r)).returning();return u.length===0?null:l(u[0])}async function z(e){let n=await i(),s=a$1("dispute",e);return s===-1?{success:false,message:"\u4E89\u8BAE\u4E0D\u5B58\u5728"}:(await n.delete(v).where(eq(v.id,s)).returning()).length===0?{success:false,message:"\u4E89\u8BAE\u4E0D\u5B58\u5728"}:{success:true,message:"\u4E89\u8BAE\u5DF2\u5220\u9664"}}async function L(e){let n=await i(),s=a$1("dispute",e);if(s===-1)return null;let i$1=(await n.select().from(v).where(eq(v.id,s)))[0];if(!i$1||i$1.status!=="pending")return null;let u=await n.update(v).set({status:"investigating",updatedAt:new Date}).where(eq(v.id,s)).returning();return l(u[0])}async function Y(e,n){let s=await i(),r=a$1("dispute",e);if(r===-1)return null;let u=(await s.select().from(v).where(eq(v.id,r)))[0];if(!u||u.status!=="pending"&&u.status!=="investigating")return null;let d=new Date,c=await s.update(v).set({status:"resolved",resolution:n.resolution,resolvedAt:d,resolvedBy:n.resolvedBy,updatedAt:d}).where(eq(v.id,r)).returning();return l(c[0])}async function k(e,n,s){let r=await i(),i$1=a$1("dispute",e);if(i$1===-1)return null;let d=(await r.select().from(v).where(eq(v.id,i$1)))[0];if(!d||d.status!=="pending"&&d.status!=="investigating")return null;let c=new Date,m=await r.update(v).set({status:"rejected",resolution:n,resolvedAt:c,resolvedBy:s,updatedAt:c}).where(eq(v.id,i$1)).returning();return l(m[0])}export{O as a,j as b,C as c,_ as d,$ as e,z as f,L as g,Y as h,k as i};
@@ -0,0 +1 @@
1
+ import {e,m}from'./chunk-OYCBNRMK.js';import {J}from'./chunk-27SIJSPF.js';import {a}from'./chunk-5J6HXUF6.js';var t=a(()=>{e();});var g=a(()=>{m();t();J();});export{g as a};
@@ -0,0 +1 @@
1
+ import {a as a$1,b as b$1}from'./chunk-I6OBDFDU.js';import {e,d as d$1,f}from'./chunk-FIY4CGJJ.js';import {d as d$2,a as a$3}from'./chunk-JCPOP4XL.js';import {a as a$2}from'./chunk-UMAQLNPE.js';import {i}from'./chunk-OYCBNRMK.js';import {y,J}from'./chunk-27SIJSPF.js';import {a,b}from'./chunk-5J6HXUF6.js';import {eq,or,like,and,desc}from'drizzle-orm';function H(t){m=t;}async function p(){m&&(await m.purge("/content"),await m.purgePattern("isr:/content/*"));}var m,I=a(()=>{m=null;});var q={};b(q,{archiveContent:()=>_,createContent:()=>B,deleteContent:()=>G,getContentById:()=>U,getContents:()=>M,publishContent:()=>L,seedContentsIfEmpty:()=>E,updateContent:()=>$});async function E(){let t=await i();if((await t.select().from(y)).length===0){let o=["article","announcement","tutorial","news","policy"],r=["draft","published","archived"],s=["\u7CFB\u7EDF\u5347\u7EA7\u516C\u544A","\u65B0\u529F\u80FD\u53D1\u5E03\u8BF4\u660E","\u7528\u6237\u4F7F\u7528\u6307\u5357","\u5E38\u89C1\u95EE\u9898\u89E3\u7B54","\u9690\u79C1\u653F\u7B56\u66F4\u65B0","\u670D\u52A1\u6761\u6B3E\u53D8\u66F4","\u5E73\u53F0\u64CD\u4F5C\u6559\u7A0B","\u6700\u4F73\u5B9E\u8DF5\u5206\u4EAB"],a=["\u7BA1\u7406\u5458","\u8FD0\u8425\u56E2\u961F","\u6280\u672F\u56E2\u961F","\u5BA2\u670D\u56E2\u961F"],c=[JSON.stringify(["\u7CFB\u7EDF","\u5347\u7EA7"]),JSON.stringify(["\u529F\u80FD","\u65B0\u7279\u6027"]),JSON.stringify(["\u6559\u7A0B","\u5E2E\u52A9"]),JSON.stringify(["FAQ","\u5E38\u89C1\u95EE\u9898"]),JSON.stringify(["\u653F\u7B56","\u9690\u79C1"]),JSON.stringify(["\u6761\u6B3E","\u670D\u52A1"]),JSON.stringify(["\u6559\u7A0B","\u64CD\u4F5C"]),JSON.stringify(["\u6700\u4F73\u5B9E\u8DF5","\u7ECF\u9A8C"])];for(let l=0;l<25;l++){let P=e(o),S=e(r),C=new Date(d$1(new Date("2024-01-01"),new Date)),v=S==="published";await t.insert(y).values({title:s[l%s.length],body:`\u8FD9\u662F${s[l%s.length]}\u7684\u8BE6\u7EC6\u5185\u5BB9\u3002\u8FD9\u91CC\u5305\u542B\u4E86\u5B8C\u6574\u7684\u6587\u7AE0\u5185\u5BB9\uFF0C\u7528\u6237\u53EF\u4EE5\u9605\u8BFB\u548C\u5B66\u4E60\u76F8\u5173\u77E5\u8BC6\u3002`,category:P,status:S,author:e(a),tags:c[l%c.length],viewCount:Math.floor(Math.random()*1e3),likeCount:Math.floor(Math.random()*100),createdAt:C,updatedAt:new Date(d$1(C,new Date)),publishedAt:v?new Date(d$1(C,new Date)):null});}}}function d(t){return {id:`content-${t.id}`,title:t.title,content:t.body,category:t.category,status:t.status,author:t.author,tags:t.tags?JSON.parse(t.tags):[],viewCount:t.viewCount,likeCount:t.likeCount,createdAt:a$3(t.createdAt),updatedAt:a$3(t.updatedAt),publishedAt:t.publishedAt?a$3(t.publishedAt):void 0}}async function M(t){let e=await i(),o=[];if(t?.category&&o.push(eq(y.category,t.category)),t?.status&&o.push(eq(y.status,t.status)),t?.search){let s=`%${t.search}%`;o.push(or(like(y.title,s),like(y.body,s),like(y.tags,s)));}return (o.length>0?await e.select().from(y).where(and(...o)).orderBy(desc(y.createdAt)):await e.select().from(y).orderBy(desc(y.createdAt))).map(d)}async function U(t){let e=await i(),o=a$1("content",t);if(o===-1)return null;let s=(await e.select().from(y).where(eq(y.id,o)))[0];return s?d(s):null}async function B(t){let e=await i(),o=new Date,r=await e.insert(y).values({title:t.title,body:t.content,category:t.category,status:"draft",author:"\u7BA1\u7406\u5458",tags:t.tags?JSON.stringify(t.tags):null,viewCount:0,likeCount:0,createdAt:o,updatedAt:o}).returning();return d(r[0])}async function $(t,e){let o=await i(),r=a$1("content",t);if(r===-1)return null;let s={updatedAt:new Date};e.title!==void 0&&e.title!==null&&(s.title=e.title),e.content!==void 0&&e.content!==null&&(s.body=e.content),e.category!==void 0&&e.category!==null&&(s.category=e.category),e.tags!==void 0&&e.tags!==null&&(s.tags=JSON.stringify(e.tags)),e.status!==void 0&&e.status!==null&&(s.status=e.status);let a=await o.update(y).set(s).where(eq(y.id,r)).returning();return a.length===0?null:(p().catch(c=>{console.warn("ISR content pages purge failed after update:",c);}),d(a[0]))}async function G(t){let e=await i(),o=a$1("content",t);return o===-1?{success:false,message:"\u5185\u5BB9\u4E0D\u5B58\u5728"}:(await e.delete(y).where(eq(y.id,o)).returning()).length===0?{success:false,message:"\u5185\u5BB9\u4E0D\u5B58\u5728"}:(p().catch(s=>{console.warn("ISR content pages purge failed after delete:",s);}),{success:true,message:"\u5185\u5BB9\u5DF2\u5220\u9664"})}async function L(t){let e=await i(),o=a$1("content",t);if(o===-1)return null;let s=(await e.select().from(y).where(eq(y.id,o)))[0];if(!s||s.status!=="draft")return null;let a=new Date,c=await e.update(y).set({status:"published",publishedAt:a,updatedAt:a}).where(eq(y.id,o)).returning();return p().catch(l=>{console.warn("ISR content pages purge failed after publish:",l);}),d(c[0])}async function _(t){let e=await i(),o=a$1("content",t);if(o===-1)return null;let s=(await e.select().from(y).where(eq(y.id,o)))[0];if(!s||s.status!=="published")return null;let a=await e.update(y).set({status:"archived",updatedAt:new Date}).where(eq(y.id,o)).returning();return p().catch(c=>{console.warn("ISR content pages purge failed after archive:",c);}),d(a[0])}var F=a(()=>{a$2();J();d$2();f();b$1();I();});export{H as a,I as b,E as c,M as d,U as e,B as f,$ as g,G as h,L as i,_ as j,q as k,F as l};
@@ -0,0 +1 @@
1
+ import {l}from'./chunk-XZZTSRSN.js';export{j as archiveContent,f as createContent,h as deleteContent,e as getContentById,d as getContents,i as publishContent,c as seedContentsIfEmpty,g as updateContent}from'./chunk-XZZTSRSN.js';import'./chunk-I6OBDFDU.js';import'./chunk-FIY4CGJJ.js';import'./chunk-JCPOP4XL.js';import'./chunk-UMAQLNPE.js';import'./chunk-OYCBNRMK.js';import'./chunk-27SIJSPF.js';import'./chunk-5J6HXUF6.js';l();
@@ -0,0 +1 @@
1
+ import {a}from'./chunk-UMAQLNPE.js';export{k as closeDb,d as getDatabaseConfig,i as getDb,j as getRawClient,l as runMigrations}from'./chunk-OYCBNRMK.js';export{x as contentCategories,w as contentStatuses,y as contents,z as developers,u as disputeStatuses,t as disputeTypes,v as disputes,d as notifications,l as orderStatuses,m as orders,k as permissionAuditLogs,j as permissionRouteMappings,e as permissions,F as pluginCategories,G as pluginCategoryMappings,E as pluginReviews,B as pluginStatus,D as pluginVersions,C as plugins,g as rolePermissions,f as roles,i as routes,H as tenants,p as ticketCategories,o as ticketPriorities,s as ticketReplies,q as ticketReplyAuthorRoles,n as ticketStatuses,r as tickets,c as todoAttachments,a as todoStatus,b as todos,h as userRoles}from'./chunk-27SIJSPF.js';import'./chunk-5J6HXUF6.js';a();
@@ -0,0 +1 @@
1
+ export{d as createDispute,f as deleteDispute,c as getDisputeById,b as getDisputes,g as investigateDispute,i as rejectDispute,h as resolveDispute,a as seedDisputesIfEmpty,e as updateDispute}from'./chunk-P2RJNNGD.js';import'./chunk-I6OBDFDU.js';import'./chunk-FIY4CGJJ.js';import'./chunk-JCPOP4XL.js';import'./chunk-UMAQLNPE.js';import'./chunk-OYCBNRMK.js';import'./chunk-27SIJSPF.js';import'./chunk-5J6HXUF6.js';