create-snapify-app 0.0.0-stage → 1.1.1

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 (614) hide show
  1. package/LICENSE.md +24 -0
  2. package/README.md +55 -2
  3. package/bin/create-snapify-app.mjs +174 -0
  4. package/lib/args.mjs +59 -0
  5. package/lib/copy.mjs +44 -0
  6. package/lib/env.mjs +84 -0
  7. package/lib/prompt.mjs +63 -0
  8. package/package.json +35 -4
  9. package/template/.env.example +79 -0
  10. package/template/.github/workflows/ci.yml +23 -0
  11. package/template/.github/workflows/deploy.yml +26 -0
  12. package/template/.github/workflows/ping.yml +8 -0
  13. package/template/.github/workflows/release.yml +67 -0
  14. package/template/.snapify-install.json +5 -0
  15. package/template/CHANGELOG.md +28 -0
  16. package/template/LICENSE +14 -0
  17. package/template/README.md +287 -0
  18. package/template/administrator.html +23 -0
  19. package/template/apps/client/src/App.tsx +765 -0
  20. package/template/apps/client/src/auth.css +400 -0
  21. package/template/apps/client/src/lib/api.ts +22 -0
  22. package/template/apps/client/src/main.tsx +20 -0
  23. package/template/apps/community/src/App.tsx +592 -0
  24. package/template/apps/community/src/main.tsx +20 -0
  25. package/template/apps/community/src/styles.css +24 -0
  26. package/template/apps/developers/src/App.tsx +643 -0
  27. package/template/apps/developers/src/main.tsx +17 -0
  28. package/template/apps/developers/src/pages.tsx +1587 -0
  29. package/template/apps/developers/src/styles.css +98 -0
  30. package/template/apps/developers/src/ui.tsx +179 -0
  31. package/template/apps/landing/src/App.tsx +598 -0
  32. package/template/apps/landing/src/LegalPages.tsx +158 -0
  33. package/template/apps/landing/src/OrderPage.tsx +381 -0
  34. package/template/apps/landing/src/SeoPages.tsx +923 -0
  35. package/template/apps/landing/src/copy.ts +195 -0
  36. package/template/apps/landing/src/main.tsx +20 -0
  37. package/template/apps/landing/src/styles.css +803 -0
  38. package/template/apps/landing/src/types.ts +19 -0
  39. package/template/apps/marketplace/src/App.tsx +1229 -0
  40. package/template/apps/marketplace/src/developer/DeveloperApp.tsx +1266 -0
  41. package/template/apps/marketplace/src/main.tsx +20 -0
  42. package/template/apps/marketplace/src/styles.css +1001 -0
  43. package/template/apps/shared/AuthContext.tsx +65 -0
  44. package/template/apps/shared/Logo.tsx +33 -0
  45. package/template/apps/shared/api.ts +47 -0
  46. package/template/apps/shared/ui.tsx +128 -0
  47. package/template/apps/superadmin/src/App.tsx +1264 -0
  48. package/template/apps/superadmin/src/lib/api.ts +20 -0
  49. package/template/apps/superadmin/src/lib/hooks.ts +20 -0
  50. package/template/apps/superadmin/src/main.tsx +16 -0
  51. package/template/apps/superadmin/src/pages/ClientsPage.tsx +185 -0
  52. package/template/apps/superadmin/src/pages/InvoicesPage.tsx +157 -0
  53. package/template/apps/superadmin/src/pages/NewsletterPage.tsx +212 -0
  54. package/template/apps/superadmin/src/pages/OrdersPage.tsx +195 -0
  55. package/template/apps/superadmin/src/pages/PaymentsPage.tsx +150 -0
  56. package/template/apps/superadmin/src/pages/PayoutsPage.tsx +133 -0
  57. package/template/apps/superadmin/src/pages/PublishersPage.tsx +151 -0
  58. package/template/apps/superadmin/src/pages/SeoControlPage.tsx +692 -0
  59. package/template/apps/superadmin/src/pages/SettingsPage.tsx +199 -0
  60. package/template/apps/superadmin/src/pages/SystemPage.tsx +109 -0
  61. package/template/apps/superadmin/src/pages/TicketsPage.tsx +201 -0
  62. package/template/apps/superadmin/src/pages/UsersPage.tsx +167 -0
  63. package/template/client.html +21 -0
  64. package/template/community/hamdiayari/akhbar/README.md +23 -0
  65. package/template/community/hamdiayari/akhbar/screenshot.jpg +0 -0
  66. package/template/community/hamdiayari/akhbar/snapify.theme.json +76 -0
  67. package/template/community/hamdiayari/akhbar/src/Brand.tsx +26 -0
  68. package/template/community/hamdiayari/akhbar/src/Footer.tsx +182 -0
  69. package/template/community/hamdiayari/akhbar/src/Header.tsx +191 -0
  70. package/template/community/hamdiayari/akhbar/src/Layout.tsx +49 -0
  71. package/template/community/hamdiayari/akhbar/src/Social.tsx +33 -0
  72. package/template/community/hamdiayari/akhbar/src/Ticker.tsx +86 -0
  73. package/template/community/hamdiayari/akhbar/src/Views.tsx +285 -0
  74. package/template/community/hamdiayari/akhbar/src/blocks/CollectionBlocks.tsx +672 -0
  75. package/template/community/hamdiayari/akhbar/src/blocks/ContentBlocks.tsx +305 -0
  76. package/template/community/hamdiayari/akhbar/src/blocks/ConversionBlocks.tsx +569 -0
  77. package/template/community/hamdiayari/akhbar/src/blocks/HeaderBlocks.tsx +287 -0
  78. package/template/community/hamdiayari/akhbar/src/index.tsx +51 -0
  79. package/template/community/hamdiayari/akhbar/src/kit.tsx +357 -0
  80. package/template/community/hamdiayari/akhbar/src/site.ts +96 -0
  81. package/template/community/hamdiayari/akhbar/src/styles.css +566 -0
  82. package/template/community/hamdiayari/akhbar-actualites/README.md +28 -0
  83. package/template/community/hamdiayari/akhbar-actualites/screenshot.jpg +0 -0
  84. package/template/community/hamdiayari/akhbar-actualites/snapify.module.json +107 -0
  85. package/template/community/hamdiayari/akhbar-actualites/src/admin/AudiencePage.tsx +185 -0
  86. package/template/community/hamdiayari/akhbar-actualites/src/admin/index.tsx +11 -0
  87. package/template/community/hamdiayari/akhbar-actualites/src/public/Archive.tsx +142 -0
  88. package/template/community/hamdiayari/akhbar-actualites/src/public/cards.tsx +152 -0
  89. package/template/community/hamdiayari/akhbar-actualites/src/public/index.tsx +71 -0
  90. package/template/community/hamdiayari/akhbar-actualites/src/public/posts.ts +103 -0
  91. package/template/community/hamdiayari/akhbar-actualites/src/public/styles.css +568 -0
  92. package/template/community/hamdiayari/akhbar-actualites/src/public/widgets.tsx +226 -0
  93. package/template/community/hamdiayari/akhbar-actualites/src/server.ts +119 -0
  94. package/template/community/hamdiayari/akhbar-actualites/src/types.ts +25 -0
  95. package/template/community/hamdiayari/akhbar-urgent/README.md +36 -0
  96. package/template/community/hamdiayari/akhbar-urgent/screenshot.jpg +0 -0
  97. package/template/community/hamdiayari/akhbar-urgent/snapify.module.json +64 -0
  98. package/template/community/hamdiayari/akhbar-urgent/src/admin/FlashesPage.tsx +229 -0
  99. package/template/community/hamdiayari/akhbar-urgent/src/admin/index.tsx +11 -0
  100. package/template/community/hamdiayari/akhbar-urgent/src/public/Ticker.tsx +81 -0
  101. package/template/community/hamdiayari/akhbar-urgent/src/public/index.tsx +63 -0
  102. package/template/community/hamdiayari/akhbar-urgent/src/public/styles.css +142 -0
  103. package/template/community/hamdiayari/akhbar-urgent/src/server.ts +101 -0
  104. package/template/community/hamdiayari/akhbar-urgent/src/types.ts +35 -0
  105. package/template/community.html +21 -0
  106. package/template/developers.html +24 -0
  107. package/template/docker-compose.db.yml +24 -0
  108. package/template/docs/BACKOFFICE_SNAPIFY.md +130 -0
  109. package/template/docs/CI_CD.md +66 -0
  110. package/template/docs/MODULES.md +346 -0
  111. package/template/docs/PLATFORM_DEPLOY.md +54 -0
  112. package/template/docs/logo.svg +10 -0
  113. package/template/drizzle/0000_init.sql +147 -0
  114. package/template/drizzle/0001_page_project.sql +5 -0
  115. package/template/drizzle/0002_modules.sql +23 -0
  116. package/template/drizzle/0003_themes.sql +4 -0
  117. package/template/drizzle/0004_security.sql +82 -0
  118. package/template/drizzle/0005_module_records.sql +16 -0
  119. package/template/drizzle/0006_avatars.sql +4 -0
  120. package/template/drizzle/0007_platform.sql +264 -0
  121. package/template/drizzle/0008_mp_validation.sql +3 -0
  122. package/template/drizzle/0009_saas_ops.sql +77 -0
  123. package/template/drizzle/0010_cms_chrome.sql +13 -0
  124. package/template/drizzle/0011_client_portal.sql +26 -0
  125. package/template/drizzle/meta/0000_snapshot.json +998 -0
  126. package/template/drizzle/meta/0001_snapshot.json +1004 -0
  127. package/template/drizzle/meta/_journal.json +90 -0
  128. package/template/drizzle.config.ts +16 -0
  129. package/template/ecosystem.snapify.cjs +24 -0
  130. package/template/for.html +1 -0
  131. package/template/index.html +29 -0
  132. package/template/landing.html +37 -0
  133. package/template/marketplace/catalog.json +373 -0
  134. package/template/marketplace/gallery/hamdiayari.preveris/01-home.jpg +0 -0
  135. package/template/marketplace/gallery/hamdiayari.recaptcha/01-reglages.jpg +0 -0
  136. package/template/marketplace/gallery/hamdiayari.recaptcha/02-logo.jpg +0 -0
  137. package/template/marketplace/gallery/novalabs.ai-articles/01-generer.jpg +0 -0
  138. package/template/marketplace/gallery/novalabs.ai-articles/02-fournisseur-ia.jpg +0 -0
  139. package/template/marketplace/gallery/novalabs.calendar/01-agenda-site.jpg +0 -0
  140. package/template/marketplace/gallery/novalabs.calendar/02-evenements-admin.jpg +0 -0
  141. package/template/marketplace/gallery/novalabs.calendar/03-reglages.jpg +0 -0
  142. package/template/marketplace/screenshots/hamdiayari.preveris-1.0.6.jpg +0 -0
  143. package/template/marketplace/screenshots/hamdiayari.recaptcha-1.0.0.jpg +0 -0
  144. package/template/marketplace/screenshots/hamdiayari.wp-seo-migrator-1.1.1.jpg +0 -0
  145. package/template/marketplace/screenshots/novalabs.ai-articles-1.0.1.jpg +0 -0
  146. package/template/marketplace/screenshots/novalabs.ai-chat-1.0.1.jpg +0 -0
  147. package/template/marketplace/screenshots/novalabs.calendar-1.0.1.jpg +0 -0
  148. package/template/marketplace/screenshots/novalabs.cart-1.0.0.jpg +0 -0
  149. package/template/marketplace/screenshots/novalabs.checkout-1.0.0.jpg +0 -0
  150. package/template/marketplace/screenshots/novalabs.customers-1.1.0.jpg +0 -0
  151. package/template/marketplace/screenshots/novalabs.dogga-1.0.0.jpg +0 -0
  152. package/template/marketplace/screenshots/novalabs.mahdia-1.0.0.jpg +0 -0
  153. package/template/marketplace/screenshots/novalabs.shop-1.0.0.jpg +0 -0
  154. package/template/marketplace/screenshots/novalabs.sidibou-1.0.0.jpg +0 -0
  155. package/template/marketplace/screenshots/novalabs.whatsapp-1.0.1.jpg +0 -0
  156. package/template/marketplace.html +21 -0
  157. package/template/metadata.json +7 -0
  158. package/template/modules/ai-articles/screenshot.jpg +0 -0
  159. package/template/modules/ai-articles/snapify.module.json +74 -0
  160. package/template/modules/ai-articles/src/admin/ArticlesPage.tsx +162 -0
  161. package/template/modules/ai-articles/src/admin/GeneratePage.tsx +118 -0
  162. package/template/modules/ai-articles/src/admin/index.tsx +12 -0
  163. package/template/modules/ai-articles/src/public/index.tsx +119 -0
  164. package/template/modules/ai-articles/src/server.ts +287 -0
  165. package/template/modules/ai-articles/src/types.ts +30 -0
  166. package/template/modules/ai-chat/screenshot.jpg +0 -0
  167. package/template/modules/ai-chat/snapify.module.json +217 -0
  168. package/template/modules/ai-chat/src/public.tsx +198 -0
  169. package/template/modules/ai-chat/src/server.ts +142 -0
  170. package/template/modules/ai-theme-studio/README.md +15 -0
  171. package/template/modules/ai-theme-studio/screenshot.jpg +0 -0
  172. package/template/modules/ai-theme-studio/snapify.module.json +175 -0
  173. package/template/modules/ai-theme-studio/src/admin/HistoryPage.tsx +91 -0
  174. package/template/modules/ai-theme-studio/src/admin/StudioPage.tsx +414 -0
  175. package/template/modules/ai-theme-studio/src/admin/index.tsx +11 -0
  176. package/template/modules/ai-theme-studio/src/lib/images.ts +240 -0
  177. package/template/modules/ai-theme-studio/src/lib/llm.ts +123 -0
  178. package/template/modules/ai-theme-studio/src/lib/normalize.ts +714 -0
  179. package/template/modules/ai-theme-studio/src/lib/prompts.ts +198 -0
  180. package/template/modules/ai-theme-studio/src/server.ts +137 -0
  181. package/template/modules/ai-theme-studio/src/types.ts +112 -0
  182. package/template/modules/calendar/screenshot.jpg +0 -0
  183. package/template/modules/calendar/snapify.module.json +45 -0
  184. package/template/modules/calendar/src/admin/EventsPage.tsx +217 -0
  185. package/template/modules/calendar/src/admin/index.tsx +11 -0
  186. package/template/modules/calendar/src/public/index.tsx +231 -0
  187. package/template/modules/calendar/src/server.ts +143 -0
  188. package/template/modules/calendar/src/types.ts +25 -0
  189. package/template/modules/cart/screenshot.jpg +0 -0
  190. package/template/modules/cart/snapify.module.json +90 -0
  191. package/template/modules/cart/src/admin/index.tsx +265 -0
  192. package/template/modules/cart/src/public/CartPage.tsx +198 -0
  193. package/template/modules/cart/src/public/index.tsx +261 -0
  194. package/template/modules/cart/src/public/useQuote.ts +67 -0
  195. package/template/modules/cart/src/server.ts +148 -0
  196. package/template/modules/cart/src/types.ts +31 -0
  197. package/template/modules/checkout/screenshot.jpg +0 -0
  198. package/template/modules/checkout/snapify.module.json +264 -0
  199. package/template/modules/checkout/src/admin/OrderDetailPage.tsx +304 -0
  200. package/template/modules/checkout/src/admin/badges.tsx +28 -0
  201. package/template/modules/checkout/src/admin/index.tsx +236 -0
  202. package/template/modules/checkout/src/public/CheckoutPage.tsx +461 -0
  203. package/template/modules/checkout/src/public/OrderPages.tsx +153 -0
  204. package/template/modules/checkout/src/public/index.tsx +23 -0
  205. package/template/modules/checkout/src/server.ts +383 -0
  206. package/template/modules/checkout/src/types.ts +70 -0
  207. package/template/modules/customers/screenshot.jpg +0 -0
  208. package/template/modules/customers/snapify.module.json +115 -0
  209. package/template/modules/customers/src/admin/CustomerDetailPage.tsx +274 -0
  210. package/template/modules/customers/src/admin/index.tsx +194 -0
  211. package/template/modules/customers/src/public/AccountPages.tsx +470 -0
  212. package/template/modules/customers/src/public/AddressForm.tsx +115 -0
  213. package/template/modules/customers/src/public/AuthPages.tsx +349 -0
  214. package/template/modules/customers/src/public/Avatar.tsx +29 -0
  215. package/template/modules/customers/src/public/ProfileSection.tsx +291 -0
  216. package/template/modules/customers/src/public/index.tsx +137 -0
  217. package/template/modules/customers/src/public/session.ts +51 -0
  218. package/template/modules/customers/src/server.ts +421 -0
  219. package/template/modules/customers/src/types.ts +53 -0
  220. package/template/modules/recaptcha/logo.jpg +0 -0
  221. package/template/modules/recaptcha/screenshot.jpg +0 -0
  222. package/template/modules/recaptcha/snapify.module.json +99 -0
  223. package/template/modules/recaptcha/src/public/index.tsx +94 -0
  224. package/template/modules/recaptcha/src/server.ts +65 -0
  225. package/template/modules/recaptcha/src/types.ts +18 -0
  226. package/template/modules/shop/screenshot.jpg +0 -0
  227. package/template/modules/shop/snapify.module.json +340 -0
  228. package/template/modules/shop/src/admin/CategoriesPage.tsx +224 -0
  229. package/template/modules/shop/src/admin/ProductEditor.tsx +313 -0
  230. package/template/modules/shop/src/admin/ProductsPage.tsx +307 -0
  231. package/template/modules/shop/src/admin/index.tsx +14 -0
  232. package/template/modules/shop/src/public/Catalog.tsx +244 -0
  233. package/template/modules/shop/src/public/NotFound.tsx +22 -0
  234. package/template/modules/shop/src/public/ProductPage.tsx +195 -0
  235. package/template/modules/shop/src/public/index.tsx +134 -0
  236. package/template/modules/shop/src/public/useFetch.ts +26 -0
  237. package/template/modules/shop/src/server.ts +493 -0
  238. package/template/modules/shop/src/shared.ts +41 -0
  239. package/template/modules/shop/src/types.ts +60 -0
  240. package/template/modules/whatsapp/screenshot.jpg +0 -0
  241. package/template/modules/whatsapp/snapify.module.json +121 -0
  242. package/template/modules/whatsapp/src/public.tsx +119 -0
  243. package/template/modules/wp-seo-migrator/ARCHITECTURE.md +113 -0
  244. package/template/modules/wp-seo-migrator/README.md +21 -0
  245. package/template/modules/wp-seo-migrator/fixtures/aioseo-sample.csv +3 -0
  246. package/template/modules/wp-seo-migrator/fixtures/sample-exporter.json +39 -0
  247. package/template/modules/wp-seo-migrator/fixtures/sample-page.html +12 -0
  248. package/template/modules/wp-seo-migrator/fixtures/sample.htaccess +3 -0
  249. package/template/modules/wp-seo-migrator/screenshot.jpg +0 -0
  250. package/template/modules/wp-seo-migrator/snapify.module.json +87 -0
  251. package/template/modules/wp-seo-migrator/src/admin/HistoryPage.tsx +64 -0
  252. package/template/modules/wp-seo-migrator/src/admin/WizardPage.tsx +788 -0
  253. package/template/modules/wp-seo-migrator/src/admin/i18n.ts +156 -0
  254. package/template/modules/wp-seo-migrator/src/admin/index.tsx +11 -0
  255. package/template/modules/wp-seo-migrator/src/connectors/CUSTOM_CONNECTOR.md +31 -0
  256. package/template/modules/wp-seo-migrator/src/connectors/csvSeoFactory.ts +106 -0
  257. package/template/modules/wp-seo-migrator/src/connectors/exporter.ts +96 -0
  258. package/template/modules/wp-seo-migrator/src/connectors/gscCsv.ts +53 -0
  259. package/template/modules/wp-seo-migrator/src/connectors/htaccess.ts +65 -0
  260. package/template/modules/wp-seo-migrator/src/connectors/htmlCrawler.ts +90 -0
  261. package/template/modules/wp-seo-migrator/src/connectors/index.ts +113 -0
  262. package/template/modules/wp-seo-migrator/src/connectors/pluginCsv.ts +77 -0
  263. package/template/modules/wp-seo-migrator/src/connectors/rankMathCsv.ts +77 -0
  264. package/template/modules/wp-seo-migrator/src/connectors/redirection.ts +62 -0
  265. package/template/modules/wp-seo-migrator/src/connectors/sitemap.ts +44 -0
  266. package/template/modules/wp-seo-migrator/src/connectors/utils.ts +111 -0
  267. package/template/modules/wp-seo-migrator/src/connectors/wxr.ts +103 -0
  268. package/template/modules/wp-seo-migrator/src/connectors/yoastCsv.ts +56 -0
  269. package/template/modules/wp-seo-migrator/src/pipeline/analyze.ts +158 -0
  270. package/template/modules/wp-seo-migrator/src/pipeline/htmlParse.ts +58 -0
  271. package/template/modules/wp-seo-migrator/src/pipeline/remoteAuto.ts +328 -0
  272. package/template/modules/wp-seo-migrator/src/server.ts +492 -0
  273. package/template/modules/wp-seo-migrator/src/types.ts +151 -0
  274. package/template/modules/wp-seo-migrator/tests/connectors-extra.test.ts +39 -0
  275. package/template/modules/wp-seo-migrator/tests/merge.test.ts +25 -0
  276. package/template/package-lock.json +6016 -0
  277. package/template/package.json +74 -0
  278. package/template/public/images/photos/caravane-chameaux-desert.webp +0 -0
  279. package/template/public/images/photos/hammamet-medina-plage.jpg +0 -0
  280. package/template/public/images/photos/maison-campagne-collines.webp +0 -0
  281. package/template/public/images/photos/maisons-troglodytes-desert.jpg +0 -0
  282. package/template/public/images/photos/panorama-ville.jpg +0 -0
  283. package/template/public/images/photos/preveris-accessibilite-erp.jpg +0 -0
  284. package/template/public/images/photos/preveris-collectivites.jpg +0 -0
  285. package/template/public/images/photos/preveris-etudes-plans.jpg +0 -0
  286. package/template/public/images/photos/preveris-hero-erp.jpg +0 -0
  287. package/template/public/images/photos/preveris-ssi-incendie.jpg +0 -0
  288. package/template/public/images/photos/preveris-suivi-hotel.jpg +0 -0
  289. package/template/public/images/photos/ruelle-bleue-medina.jpg +0 -0
  290. package/template/public/images/photos/sidi-bou-said-port.webp +0 -0
  291. package/template/public/images/photos/terrasse-blanche-mer-voilier.jpg +0 -0
  292. package/template/public/landing/hero-ai-cms.jpg +0 -0
  293. package/template/public/landing/shot-dogga.jpg +0 -0
  294. package/template/public/landing/shot-mahdia.jpg +0 -0
  295. package/template/public/landing/shot-sidibou.jpg +0 -0
  296. package/template/public/llms.txt +35 -0
  297. package/template/public/logo.svg +10 -0
  298. package/template/scripts/app-pack.ts +155 -0
  299. package/template/scripts/app-publish.ts +123 -0
  300. package/template/scripts/apply-ecommerce-home.ts +196 -0
  301. package/template/scripts/auto-deploy-poll.sh +13 -0
  302. package/template/scripts/db-backup.sh +16 -0
  303. package/template/scripts/db-restore.sh +11 -0
  304. package/template/scripts/deploy.sh +34 -0
  305. package/template/scripts/github-webhook-deploy.sh +7 -0
  306. package/template/scripts/install-new-modules.ts +96 -0
  307. package/template/scripts/refresh-demo-baseline.ts +9 -0
  308. package/template/scripts/reinstall-marketplace-packs.ts +51 -0
  309. package/template/scripts/restore-classic-home.ts +13 -0
  310. package/template/scripts/sdk-pack.ts +289 -0
  311. package/template/scripts/sdk-publish.ts +75 -0
  312. package/template/scripts/seed-demo-products.ts +120 -0
  313. package/template/scripts/seed-theme-content-packs.ts +42 -0
  314. package/template/scripts/snapify-module.ts +207 -0
  315. package/template/scripts/test-theme-switch.ts +24 -0
  316. package/template/sdk/admin.css +18 -0
  317. package/template/sdk/admin.ts +95 -0
  318. package/template/sdk/build.ts +249 -0
  319. package/template/sdk/commerce.ts +512 -0
  320. package/template/sdk/content.ts +76 -0
  321. package/template/sdk/icons.ts +101 -0
  322. package/template/sdk/image.ts +60 -0
  323. package/template/sdk/index.ts +500 -0
  324. package/template/sdk/package.ts +298 -0
  325. package/template/sdk/recaptcha.tsx +122 -0
  326. package/template/sdk/settings.ts +84 -0
  327. package/template/sdk/theme.css +29 -0
  328. package/template/sdk/theme.ts +100 -0
  329. package/template/sdk/ui/commerce.tsx +385 -0
  330. package/template/sdk/ui/orders.tsx +136 -0
  331. package/template/sdk-kit/CHANGELOG.md +17 -0
  332. package/template/sdk-kit/LICENSE.md +47 -0
  333. package/template/sdk-kit/README.md +81 -0
  334. package/template/sdk-kit/cli.ts +339 -0
  335. package/template/sdk-kit/create-snapify/README.md +28 -0
  336. package/template/sdk-kit/create-snapify/create-snapify.mjs +11 -0
  337. package/template/sdk-kit/create-snapify/package.template.json +16 -0
  338. package/template/sdk-kit/package.template.json +95 -0
  339. package/template/sdk-kit/templates/common/README.md.tpl +27 -0
  340. package/template/sdk-kit/templates/common/_gitignore +3 -0
  341. package/template/sdk-kit/templates/common/package.json.tpl +19 -0
  342. package/template/sdk-kit/templates/common/src/snapify-env.d.ts +2 -0
  343. package/template/sdk-kit/templates/common/tsconfig.json +15 -0
  344. package/template/sdk-kit/templates/module/snapify.module.json.tpl +33 -0
  345. package/template/sdk-kit/templates/module/src/admin.tsx +53 -0
  346. package/template/sdk-kit/templates/module/src/public.tsx +49 -0
  347. package/template/sdk-kit/templates/module/src/server.ts +30 -0
  348. package/template/sdk-kit/templates/module/src/types.ts +19 -0
  349. package/template/sdk-kit/templates/theme/snapify.theme.json.tpl +22 -0
  350. package/template/sdk-kit/templates/theme/src/Footer.tsx +40 -0
  351. package/template/sdk-kit/templates/theme/src/Header.tsx +47 -0
  352. package/template/sdk-kit/templates/theme/src/Views.tsx +36 -0
  353. package/template/sdk-kit/templates/theme/src/blocks.tsx +93 -0
  354. package/template/sdk-kit/templates/theme/src/index.tsx +30 -0
  355. package/template/sdk-kit/templates/theme/src/site.tsx +59 -0
  356. package/template/sdk-kit/templates/theme/src/styles.css +71 -0
  357. package/template/server/client/routes.ts +252 -0
  358. package/template/server/cms/analyticsStore.ts +180 -0
  359. package/template/server/cms/auth.ts +155 -0
  360. package/template/server/cms/blockCatalog.ts +342 -0
  361. package/template/server/cms/blocks.ts +521 -0
  362. package/template/server/cms/contentMigration.ts +1119 -0
  363. package/template/server/cms/defaults.ts +303 -0
  364. package/template/server/cms/permissions.ts +154 -0
  365. package/template/server/cms/restoreClassicHome.ts +183 -0
  366. package/template/server/cms/revisions.ts +99 -0
  367. package/template/server/cms/scheduler.ts +78 -0
  368. package/template/server/cms/seed.ts +72 -0
  369. package/template/server/cms/seoAnalyzer.ts +213 -0
  370. package/template/server/cms/store.ts +122 -0
  371. package/template/server/cms/themeContent.ts +1386 -0
  372. package/template/server/cms/themePacks/sidibou-branding.json +1 -0
  373. package/template/server/cms/themePacks/sidibou-home.json +1 -0
  374. package/template/server/cms/themePacks/sidibou-menus.json +1 -0
  375. package/template/server/cms/types.ts +432 -0
  376. package/template/server/community/routes.ts +410 -0
  377. package/template/server/db/client.ts +43 -0
  378. package/template/server/db/repository.ts +389 -0
  379. package/template/server/db/schema.ts +726 -0
  380. package/template/server/demo/cmsReset.ts +196 -0
  381. package/template/server/developers/sdk.ts +85 -0
  382. package/template/server/geoip.ts +15 -0
  383. package/template/server/http.ts +53 -0
  384. package/template/server/mail.ts +216 -0
  385. package/template/server/marketplace/catalog.ts +74 -0
  386. package/template/server/marketplace/packageValidate.ts +475 -0
  387. package/template/server/marketplace/payments.ts +193 -0
  388. package/template/server/marketplace/routes.ts +850 -0
  389. package/template/server/marketplace/signing.ts +116 -0
  390. package/template/server/marketplace/syncOfficial.ts +282 -0
  391. package/template/server/media/images.ts +63 -0
  392. package/template/server/middleware/adminAuth.ts +134 -0
  393. package/template/server/modules/legacy.ts +44 -0
  394. package/template/server/modules/manager.ts +1122 -0
  395. package/template/server/modules/marketplace.ts +178 -0
  396. package/template/server/modules/outbound.ts +178 -0
  397. package/template/server/modules/purchases.ts +149 -0
  398. package/template/server/modules/records.ts +168 -0
  399. package/template/server/modules/themeHtml.ts +32 -0
  400. package/template/server/modules/trust.ts +16 -0
  401. package/template/server/modules/types.ts +147 -0
  402. package/template/server/platform/auth.ts +223 -0
  403. package/template/server/platform/clientWelcome.ts +168 -0
  404. package/template/server/platform/clients.ts +139 -0
  405. package/template/server/platform/dailyImprove.ts +356 -0
  406. package/template/server/platform/flouci.ts +126 -0
  407. package/template/server/platform/host.ts +69 -0
  408. package/template/server/platform/hostingProviders.ts +143 -0
  409. package/template/server/platform/licenseOrders.ts +291 -0
  410. package/template/server/platform/money.ts +42 -0
  411. package/template/server/platform/passwords.ts +41 -0
  412. package/template/server/platform/region.ts +86 -0
  413. package/template/server/platform/routes.ts +225 -0
  414. package/template/server/platform/seed.ts +82 -0
  415. package/template/server/platform/settings.ts +72 -0
  416. package/template/server/routes/adminAccount.ts +403 -0
  417. package/template/server/routes/adminCms.ts +808 -0
  418. package/template/server/routes/adminSystem.ts +243 -0
  419. package/template/server/routes/adminUsers.ts +449 -0
  420. package/template/server/routes/googleOAuth.ts +327 -0
  421. package/template/server/routes/modules.ts +323 -0
  422. package/template/server/routes/publicCms.ts +313 -0
  423. package/template/server/routes/seoPublic.ts +158 -0
  424. package/template/server/security/accounts.ts +121 -0
  425. package/template/server/security/audit.ts +143 -0
  426. package/template/server/security/authTokens.ts +74 -0
  427. package/template/server/security/ip.ts +68 -0
  428. package/template/server/security/rateLimit.ts +85 -0
  429. package/template/server/security/retention.ts +46 -0
  430. package/template/server/security/secrets.ts +44 -0
  431. package/template/server/security/sessions.ts +140 -0
  432. package/template/server/security/totp.ts +101 -0
  433. package/template/server/superadmin/analytics.ts +109 -0
  434. package/template/server/superadmin/auth.ts +92 -0
  435. package/template/server/superadmin/backlinksCatalog.ts +210 -0
  436. package/template/server/superadmin/frSeoContent.ts +165 -0
  437. package/template/server/superadmin/landingSeo.ts +675 -0
  438. package/template/server/superadmin/ops.ts +238 -0
  439. package/template/server/superadmin/routes.ts +1095 -0
  440. package/template/server/superadmin/tnSeoContent.ts +130 -0
  441. package/template/server.ts +522 -0
  442. package/template/src/App.tsx +263 -0
  443. package/template/src/admin/AdminApp.tsx +162 -0
  444. package/template/src/admin/account/AuthLayout.tsx +57 -0
  445. package/template/src/admin/account/SecurityForms.tsx +276 -0
  446. package/template/src/admin/admin.css +127 -0
  447. package/template/src/admin/context/AuthContext.tsx +147 -0
  448. package/template/src/admin/context/SiteContext.tsx +50 -0
  449. package/template/src/admin/editor/BlockLibrary.tsx +173 -0
  450. package/template/src/admin/editor/BlocksPanel.tsx +396 -0
  451. package/template/src/admin/editor/EditorBits.tsx +106 -0
  452. package/template/src/admin/editor/PreviewFrame.tsx +145 -0
  453. package/template/src/admin/editor/RichTextEditor.tsx +276 -0
  454. package/template/src/admin/editor/SeoPanel.tsx +349 -0
  455. package/template/src/admin/editor/StyleEditor.tsx +114 -0
  456. package/template/src/admin/editor/blockSchemas.ts +699 -0
  457. package/template/src/admin/editor/fields.tsx +486 -0
  458. package/template/src/admin/layout/AdminShell.tsx +418 -0
  459. package/template/src/admin/layout/nav.ts +95 -0
  460. package/template/src/admin/lib/api.ts +408 -0
  461. package/template/src/admin/lib/audit.ts +141 -0
  462. package/template/src/admin/lib/format.ts +84 -0
  463. package/template/src/admin/lib/hooks.ts +125 -0
  464. package/template/src/admin/main.tsx +16 -0
  465. package/template/src/admin/modules/InstallDialog.tsx +160 -0
  466. package/template/src/admin/modules/SettingsForm.tsx +145 -0
  467. package/template/src/admin/modules/kit.tsx +127 -0
  468. package/template/src/admin/modules/labels.tsx +226 -0
  469. package/template/src/admin/pages/AccountSetupPage.tsx +62 -0
  470. package/template/src/admin/pages/AnalyticsPage.tsx +206 -0
  471. package/template/src/admin/pages/BrandingPage.tsx +154 -0
  472. package/template/src/admin/pages/DashboardPage.tsx +239 -0
  473. package/template/src/admin/pages/EngagementPage.tsx +168 -0
  474. package/template/src/admin/pages/FormsPage.tsx +435 -0
  475. package/template/src/admin/pages/GeneralPage.tsx +120 -0
  476. package/template/src/admin/pages/LoginPage.tsx +249 -0
  477. package/template/src/admin/pages/MaintenancePage.tsx +125 -0
  478. package/template/src/admin/pages/MarketplacePage.tsx +426 -0
  479. package/template/src/admin/pages/MediaPage.tsx +251 -0
  480. package/template/src/admin/pages/MenusPage.tsx +446 -0
  481. package/template/src/admin/pages/ModuleAdminPage.tsx +113 -0
  482. package/template/src/admin/pages/ModuleDetailPage.tsx +293 -0
  483. package/template/src/admin/pages/ModulesPage.tsx +135 -0
  484. package/template/src/admin/pages/NewsletterPage.tsx +193 -0
  485. package/template/src/admin/pages/PageEditorPage.tsx +322 -0
  486. package/template/src/admin/pages/PagesListPage.tsx +277 -0
  487. package/template/src/admin/pages/PostEditorPage.tsx +292 -0
  488. package/template/src/admin/pages/PostsListPage.tsx +187 -0
  489. package/template/src/admin/pages/ProfilePage.tsx +489 -0
  490. package/template/src/admin/pages/ResetPasswordPage.tsx +110 -0
  491. package/template/src/admin/pages/SeoPage.tsx +670 -0
  492. package/template/src/admin/pages/SettingsPage.tsx +189 -0
  493. package/template/src/admin/pages/ThemeCustomizePage.tsx +170 -0
  494. package/template/src/admin/pages/ThemesPage.tsx +292 -0
  495. package/template/src/admin/pages/UsersPage.tsx +57 -0
  496. package/template/src/admin/pages/WidgetsPage.tsx +200 -0
  497. package/template/src/admin/seo/GoogleSetup.tsx +529 -0
  498. package/template/src/admin/settings/EmailTab.tsx +293 -0
  499. package/template/src/admin/settings/OtherTabs.tsx +270 -0
  500. package/template/src/admin/settings/SecurityTab.tsx +172 -0
  501. package/template/src/admin/settings/controls.tsx +133 -0
  502. package/template/src/admin/ui/Pagination.tsx +170 -0
  503. package/template/src/admin/ui/SaveBar.tsx +77 -0
  504. package/template/src/admin/ui/TagInput.tsx +54 -0
  505. package/template/src/admin/ui/charts.tsx +108 -0
  506. package/template/src/admin/ui/media.tsx +265 -0
  507. package/template/src/admin/ui/overlays.tsx +239 -0
  508. package/template/src/admin/ui/primitives.tsx +544 -0
  509. package/template/src/admin/users/AuditTab.tsx +104 -0
  510. package/template/src/admin/users/RolesTab.tsx +368 -0
  511. package/template/src/admin/users/UsersTab.tsx +723 -0
  512. package/template/src/admin/users/shared.tsx +278 -0
  513. package/template/src/cms/icons.ts +7 -0
  514. package/template/src/components/CookieBanner.tsx +166 -0
  515. package/template/src/components/MaintenanceGate.tsx +66 -0
  516. package/template/src/components/SiteAnalytics.tsx +64 -0
  517. package/template/src/components/SnapifyLogo.tsx +44 -0
  518. package/template/src/components/cms/BlockRenderer.tsx +154 -0
  519. package/template/src/components/cms/WidgetArea.tsx +193 -0
  520. package/template/src/context/SiteConfigContext.tsx +130 -0
  521. package/template/src/demoBase.ts +23 -0
  522. package/template/src/index.css +90 -0
  523. package/template/src/main.tsx +16 -0
  524. package/template/src/modules/ModuleHost.tsx +197 -0
  525. package/template/src/preview.ts +63 -0
  526. package/template/src/runtime.ts +38 -0
  527. package/template/src/themes/ThemeHost.tsx +168 -0
  528. package/template/src/themes/fallback.tsx +71 -0
  529. package/template/src/types.ts +94 -0
  530. package/template/src/views/BlogPostView.tsx +68 -0
  531. package/template/src/views/CmsPageView.tsx +34 -0
  532. package/template/start-pm2.sh +3 -0
  533. package/template/superadmin.html +20 -0
  534. package/template/themes/ai-canvas/screenshot.jpg +0 -0
  535. package/template/themes/ai-canvas/snapify.theme.json +96 -0
  536. package/template/themes/ai-canvas/src/CeeSimulator.tsx +247 -0
  537. package/template/themes/ai-canvas/src/Footer.tsx +190 -0
  538. package/template/themes/ai-canvas/src/Header.tsx +324 -0
  539. package/template/themes/ai-canvas/src/Layout.tsx +56 -0
  540. package/template/themes/ai-canvas/src/NotFound.tsx +58 -0
  541. package/template/themes/ai-canvas/src/Post.tsx +26 -0
  542. package/template/themes/ai-canvas/src/SnapifyLogo.tsx +44 -0
  543. package/template/themes/ai-canvas/src/blocks/CollectionBlocks.tsx +711 -0
  544. package/template/themes/ai-canvas/src/blocks/ContentBlocks.tsx +318 -0
  545. package/template/themes/ai-canvas/src/blocks/ConversionBlocks.tsx +559 -0
  546. package/template/themes/ai-canvas/src/blocks/HeaderBlocks.tsx +341 -0
  547. package/template/themes/ai-canvas/src/index.tsx +54 -0
  548. package/template/themes/ai-canvas/src/kit.tsx +398 -0
  549. package/template/themes/ai-canvas/src/site.ts +29 -0
  550. package/template/themes/ai-canvas/src/styles.css +317 -0
  551. package/template/themes/dogga/screenshot.jpg +0 -0
  552. package/template/themes/dogga/snapify.theme.json +55 -0
  553. package/template/themes/dogga/src/Brand.tsx +41 -0
  554. package/template/themes/dogga/src/Footer.tsx +202 -0
  555. package/template/themes/dogga/src/Header.tsx +239 -0
  556. package/template/themes/dogga/src/Layout.tsx +43 -0
  557. package/template/themes/dogga/src/Views.tsx +71 -0
  558. package/template/themes/dogga/src/blocks/CollectionBlocks.tsx +674 -0
  559. package/template/themes/dogga/src/blocks/ContentBlocks.tsx +307 -0
  560. package/template/themes/dogga/src/blocks/ConversionBlocks.tsx +571 -0
  561. package/template/themes/dogga/src/blocks/HeaderBlocks.tsx +289 -0
  562. package/template/themes/dogga/src/index.tsx +53 -0
  563. package/template/themes/dogga/src/kit.tsx +362 -0
  564. package/template/themes/dogga/src/site.ts +56 -0
  565. package/template/themes/dogga/src/styles.css +396 -0
  566. package/template/themes/mahdia/screenshot.jpg +0 -0
  567. package/template/themes/mahdia/snapify.theme.json +65 -0
  568. package/template/themes/mahdia/src/Brand.tsx +39 -0
  569. package/template/themes/mahdia/src/Footer.tsx +210 -0
  570. package/template/themes/mahdia/src/Header.tsx +291 -0
  571. package/template/themes/mahdia/src/Layout.tsx +44 -0
  572. package/template/themes/mahdia/src/Views.tsx +79 -0
  573. package/template/themes/mahdia/src/blocks/CollectionBlocks.tsx +674 -0
  574. package/template/themes/mahdia/src/blocks/ContentBlocks.tsx +307 -0
  575. package/template/themes/mahdia/src/blocks/ConversionBlocks.tsx +571 -0
  576. package/template/themes/mahdia/src/blocks/HeaderBlocks.tsx +289 -0
  577. package/template/themes/mahdia/src/index.tsx +53 -0
  578. package/template/themes/mahdia/src/kit.tsx +362 -0
  579. package/template/themes/mahdia/src/site.ts +75 -0
  580. package/template/themes/mahdia/src/styles.css +446 -0
  581. package/template/themes/preveris/screenshot.jpg +0 -0
  582. package/template/themes/preveris/snapify.theme.json +126 -0
  583. package/template/themes/preveris/src/Brand.tsx +44 -0
  584. package/template/themes/preveris/src/Footer.tsx +202 -0
  585. package/template/themes/preveris/src/Header.tsx +239 -0
  586. package/template/themes/preveris/src/Layout.tsx +42 -0
  587. package/template/themes/preveris/src/Views.tsx +71 -0
  588. package/template/themes/preveris/src/blocks/CollectionBlocks.tsx +678 -0
  589. package/template/themes/preveris/src/blocks/ContentBlocks.tsx +307 -0
  590. package/template/themes/preveris/src/blocks/ConversionBlocks.tsx +571 -0
  591. package/template/themes/preveris/src/blocks/HeaderBlocks.tsx +299 -0
  592. package/template/themes/preveris/src/index.tsx +53 -0
  593. package/template/themes/preveris/src/kit.tsx +365 -0
  594. package/template/themes/preveris/src/site.ts +79 -0
  595. package/template/themes/preveris/src/styles.css +446 -0
  596. package/template/themes/sidibou/screenshot.jpg +0 -0
  597. package/template/themes/sidibou/snapify.theme.json +21 -0
  598. package/template/themes/sidibou/src/CeeSimulator.tsx +247 -0
  599. package/template/themes/sidibou/src/Footer.tsx +203 -0
  600. package/template/themes/sidibou/src/Header.tsx +324 -0
  601. package/template/themes/sidibou/src/Layout.tsx +53 -0
  602. package/template/themes/sidibou/src/NotFound.tsx +58 -0
  603. package/template/themes/sidibou/src/Post.tsx +26 -0
  604. package/template/themes/sidibou/src/SnapifyLogo.tsx +44 -0
  605. package/template/themes/sidibou/src/blocks/CollectionBlocks.tsx +711 -0
  606. package/template/themes/sidibou/src/blocks/ContentBlocks.tsx +318 -0
  607. package/template/themes/sidibou/src/blocks/ConversionBlocks.tsx +559 -0
  608. package/template/themes/sidibou/src/blocks/HeaderBlocks.tsx +341 -0
  609. package/template/themes/sidibou/src/index.tsx +54 -0
  610. package/template/themes/sidibou/src/kit.tsx +398 -0
  611. package/template/themes/sidibou/src/site.ts +28 -0
  612. package/template/themes/sidibou/src/styles.css +317 -0
  613. package/template/tsconfig.json +33 -0
  614. package/template/vite.config.ts +42 -0
@@ -0,0 +1,10 @@
1
+ <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 96 96" width="96" height="96" role="img" aria-label="Snapify">
2
+ <rect width="96" height="96" rx="22" fill="#00a89d"/>
3
+ <g transform="translate(14 14) scale(1.7)">
4
+ <rect x="7" y="9" width="26" height="22" rx="4" fill="none" stroke="#FFFFFF" stroke-width="2.4"/>
5
+ <path d="M7 15.5 H33" stroke="#FFFFFF" stroke-width="2.4"/>
6
+ <circle cx="11" cy="12.3" r="1.1" fill="#FFFFFF"/>
7
+ <circle cx="14.4" cy="12.3" r="1.1" fill="#FFFFFF"/>
8
+ <path d="M20 18.2 L21.6 22 L25.4 23.6 L21.6 25.2 L20 29 L18.4 25.2 L14.6 23.6 L18.4 22 Z" fill="#FFFFFF"/>
9
+ </g>
10
+ </svg>
@@ -0,0 +1,147 @@
1
+ -- Snapify
2
+ -- © 2026 NOVALABS WEB DESIGN — Tunisie
3
+ -- Contact : contact@novalabs.tn · +216 24 734 647
4
+ -- Tous droits réservés. Toute reproduction, modification ou diffusion sans autorisation écrite est interdite.
5
+ CREATE TABLE "analytics_events" (
6
+ "id" uuid PRIMARY KEY NOT NULL,
7
+ "kind" text NOT NULL,
8
+ "session_id" text NOT NULL,
9
+ "path" text NOT NULL,
10
+ "referrer" text,
11
+ "country" text,
12
+ "city" text,
13
+ "device" text NOT NULL,
14
+ "duration_sec" integer,
15
+ "ts" timestamp with time zone NOT NULL
16
+ );
17
+ --> statement-breakpoint
18
+ CREATE TABLE "form_submissions" (
19
+ "id" text PRIMARY KEY NOT NULL,
20
+ "form_id" text NOT NULL,
21
+ "payload" jsonb NOT NULL,
22
+ "ip" text,
23
+ "user_agent" text,
24
+ "read" boolean DEFAULT false NOT NULL,
25
+ "created_at" timestamp with time zone NOT NULL
26
+ );
27
+ --> statement-breakpoint
28
+ CREATE TABLE "forms" (
29
+ "id" text PRIMARY KEY NOT NULL,
30
+ "name" text NOT NULL,
31
+ "recipient_emails" text[] DEFAULT '{}' NOT NULL,
32
+ "success_path" text NOT NULL,
33
+ "fields" jsonb NOT NULL,
34
+ "honeypot_field" text,
35
+ "enabled" boolean DEFAULT true NOT NULL,
36
+ "position" integer DEFAULT 0 NOT NULL
37
+ );
38
+ --> statement-breakpoint
39
+ CREATE TABLE "media" (
40
+ "id" text PRIMARY KEY NOT NULL,
41
+ "filename" text NOT NULL,
42
+ "url" text NOT NULL,
43
+ "mime_type" text NOT NULL,
44
+ "size_bytes" bigint NOT NULL,
45
+ "alt" text,
46
+ "created_at" timestamp with time zone NOT NULL
47
+ );
48
+ --> statement-breakpoint
49
+ CREATE TABLE "menus" (
50
+ "id" text PRIMARY KEY NOT NULL,
51
+ "label" text NOT NULL,
52
+ "items" jsonb NOT NULL,
53
+ "updated_at" timestamp with time zone DEFAULT now() NOT NULL
54
+ );
55
+ --> statement-breakpoint
56
+ CREATE TABLE "pages" (
57
+ "id" text PRIMARY KEY NOT NULL,
58
+ "path" text NOT NULL,
59
+ "title" text NOT NULL,
60
+ "status" text NOT NULL,
61
+ "content_source" text NOT NULL,
62
+ "template" text NOT NULL,
63
+ "blocks" jsonb NOT NULL,
64
+ "seo" jsonb NOT NULL,
65
+ "position" integer DEFAULT 0 NOT NULL,
66
+ "published_at" timestamp with time zone,
67
+ "scheduled_at" timestamp with time zone,
68
+ "created_at" timestamp with time zone NOT NULL,
69
+ "updated_at" timestamp with time zone NOT NULL
70
+ );
71
+ --> statement-breakpoint
72
+ CREATE TABLE "posts" (
73
+ "id" text PRIMARY KEY NOT NULL,
74
+ "slug" text NOT NULL,
75
+ "title" text NOT NULL,
76
+ "excerpt" text DEFAULT '' NOT NULL,
77
+ "cover_image" text,
78
+ "blocks" jsonb NOT NULL,
79
+ "seo" jsonb NOT NULL,
80
+ "status" text NOT NULL,
81
+ "author" text,
82
+ "tags" text[] DEFAULT '{}' NOT NULL,
83
+ "published_at" timestamp with time zone,
84
+ "created_at" timestamp with time zone NOT NULL,
85
+ "updated_at" timestamp with time zone NOT NULL
86
+ );
87
+ --> statement-breakpoint
88
+ CREATE TABLE "redirects" (
89
+ "id" serial PRIMARY KEY NOT NULL,
90
+ "from_path" text NOT NULL,
91
+ "to_path" text NOT NULL,
92
+ "permanent" boolean DEFAULT true NOT NULL,
93
+ "position" integer DEFAULT 0 NOT NULL
94
+ );
95
+ --> statement-breakpoint
96
+ CREATE TABLE "revisions" (
97
+ "id" uuid PRIMARY KEY NOT NULL,
98
+ "entity_type" text NOT NULL,
99
+ "entity_id" text NOT NULL,
100
+ "label" text NOT NULL,
101
+ "snapshot" jsonb NOT NULL,
102
+ "author_email" text,
103
+ "created_at" timestamp with time zone DEFAULT now() NOT NULL
104
+ );
105
+ --> statement-breakpoint
106
+ CREATE TABLE "site_settings" (
107
+ "key" text PRIMARY KEY NOT NULL,
108
+ "value" jsonb NOT NULL,
109
+ "updated_at" timestamp with time zone DEFAULT now() NOT NULL
110
+ );
111
+ --> statement-breakpoint
112
+ CREATE TABLE "newsletter_subscribers" (
113
+ "id" text PRIMARY KEY NOT NULL,
114
+ "email" text NOT NULL,
115
+ "status" text NOT NULL,
116
+ "source" text,
117
+ "confirm_token" text,
118
+ "created_at" timestamp with time zone NOT NULL,
119
+ "confirmed_at" timestamp with time zone
120
+ );
121
+ --> statement-breakpoint
122
+ CREATE TABLE "admin_users" (
123
+ "id" text PRIMARY KEY NOT NULL,
124
+ "email" text NOT NULL,
125
+ "name" text NOT NULL,
126
+ "role" text NOT NULL,
127
+ "password_hash" text NOT NULL,
128
+ "salt" text NOT NULL,
129
+ "last_login_at" timestamp with time zone,
130
+ "created_at" timestamp with time zone DEFAULT now() NOT NULL
131
+ );
132
+ --> statement-breakpoint
133
+ CREATE INDEX "analytics_ts_idx" ON "analytics_events" USING btree ("ts");--> statement-breakpoint
134
+ CREATE INDEX "analytics_kind_ts_idx" ON "analytics_events" USING btree ("kind","ts");--> statement-breakpoint
135
+ CREATE INDEX "analytics_session_idx" ON "analytics_events" USING btree ("session_id");--> statement-breakpoint
136
+ CREATE INDEX "form_submissions_created_idx" ON "form_submissions" USING btree ("created_at");--> statement-breakpoint
137
+ CREATE INDEX "form_submissions_form_idx" ON "form_submissions" USING btree ("form_id");--> statement-breakpoint
138
+ CREATE INDEX "media_created_idx" ON "media" USING btree ("created_at");--> statement-breakpoint
139
+ CREATE UNIQUE INDEX "pages_path_uq" ON "pages" USING btree ("path");--> statement-breakpoint
140
+ CREATE INDEX "pages_status_idx" ON "pages" USING btree ("status");--> statement-breakpoint
141
+ CREATE UNIQUE INDEX "posts_slug_uq" ON "posts" USING btree ("slug");--> statement-breakpoint
142
+ CREATE INDEX "posts_status_idx" ON "posts" USING btree ("status","published_at");--> statement-breakpoint
143
+ CREATE UNIQUE INDEX "redirects_from_uq" ON "redirects" USING btree ("from_path");--> statement-breakpoint
144
+ CREATE INDEX "revisions_entity_idx" ON "revisions" USING btree ("entity_type","entity_id","created_at");--> statement-breakpoint
145
+ CREATE UNIQUE INDEX "subscribers_email_uq" ON "newsletter_subscribers" USING btree ("email");--> statement-breakpoint
146
+ CREATE INDEX "subscribers_token_idx" ON "newsletter_subscribers" USING btree ("confirm_token");--> statement-breakpoint
147
+ CREATE UNIQUE INDEX "admin_users_email_uq" ON "admin_users" USING btree ("email");
@@ -0,0 +1,5 @@
1
+ -- Snapify
2
+ -- © 2026 NOVALABS WEB DESIGN — Tunisie
3
+ -- Contact : contact@novalabs.tn · +216 24 734 647
4
+ -- Tous droits réservés. Toute reproduction, modification ou diffusion sans autorisation écrite est interdite.
5
+ ALTER TABLE "pages" ADD COLUMN "project" jsonb;
@@ -0,0 +1,23 @@
1
+ -- Snapify
2
+ -- © 2026 NOVALABS WEB DESIGN — Tunisie
3
+ -- Contact : contact@novalabs.tn · +216 24 734 647
4
+ CREATE TABLE IF NOT EXISTS "modules" (
5
+ "id" text PRIMARY KEY NOT NULL,
6
+ "version" text NOT NULL,
7
+ "enabled" boolean DEFAULT true NOT NULL,
8
+ "manifest" jsonb NOT NULL,
9
+ "signature" jsonb,
10
+ "license" jsonb,
11
+ "settings" jsonb NOT NULL,
12
+ "source" text NOT NULL,
13
+ "installed_at" timestamp with time zone DEFAULT now() NOT NULL,
14
+ "updated_at" timestamp with time zone DEFAULT now() NOT NULL
15
+ );
16
+ --> statement-breakpoint
17
+ CREATE TABLE IF NOT EXISTS "module_storage" (
18
+ "module_id" text NOT NULL,
19
+ "key" text NOT NULL,
20
+ "value" jsonb NOT NULL,
21
+ "updated_at" timestamp with time zone DEFAULT now() NOT NULL,
22
+ CONSTRAINT "module_storage_module_id_key_pk" PRIMARY KEY("module_id","key")
23
+ );
@@ -0,0 +1,4 @@
1
+ -- Snapify
2
+ -- © 2026 NOVALABS WEB DESIGN — Tunisie
3
+ -- Contact : contact@novalabs.tn · +216 24 734 647
4
+ ALTER TABLE "modules" ADD COLUMN IF NOT EXISTS "kind" text DEFAULT 'module' NOT NULL;
@@ -0,0 +1,82 @@
1
+ -- Snapify
2
+ -- © 2026 NOVALABS WEB DESIGN — Tunisie
3
+ -- Contact : contact@novalabs.tn · +216 24 734 647
4
+ ALTER TABLE "admin_users" ADD COLUMN IF NOT EXISTS "status" text DEFAULT 'active' NOT NULL;
5
+ --> statement-breakpoint
6
+ ALTER TABLE "admin_users" ADD COLUMN IF NOT EXISTS "title" text;
7
+ --> statement-breakpoint
8
+ ALTER TABLE "admin_users" ADD COLUMN IF NOT EXISTS "phone" text;
9
+ --> statement-breakpoint
10
+ ALTER TABLE "admin_users" ADD COLUMN IF NOT EXISTS "totp_secret" text;
11
+ --> statement-breakpoint
12
+ ALTER TABLE "admin_users" ADD COLUMN IF NOT EXISTS "totp_enabled" boolean DEFAULT false NOT NULL;
13
+ --> statement-breakpoint
14
+ ALTER TABLE "admin_users" ADD COLUMN IF NOT EXISTS "recovery_codes" jsonb DEFAULT '[]'::jsonb NOT NULL;
15
+ --> statement-breakpoint
16
+ ALTER TABLE "admin_users" ADD COLUMN IF NOT EXISTS "must_change_password" boolean DEFAULT false NOT NULL;
17
+ --> statement-breakpoint
18
+ ALTER TABLE "admin_users" ADD COLUMN IF NOT EXISTS "password_changed_at" timestamp with time zone;
19
+ --> statement-breakpoint
20
+ ALTER TABLE "admin_users" ADD COLUMN IF NOT EXISTS "last_login_ip" text;
21
+ --> statement-breakpoint
22
+ ALTER TABLE "admin_users" ADD COLUMN IF NOT EXISTS "login_count" integer DEFAULT 0 NOT NULL;
23
+ --> statement-breakpoint
24
+ ALTER TABLE "admin_users" ADD COLUMN IF NOT EXISTS "invited_by" text;
25
+ --> statement-breakpoint
26
+ CREATE TABLE IF NOT EXISTS "admin_sessions" (
27
+ "id" text PRIMARY KEY NOT NULL,
28
+ "user_id" text NOT NULL,
29
+ "created_at" timestamp with time zone DEFAULT now() NOT NULL,
30
+ "last_seen_at" timestamp with time zone DEFAULT now() NOT NULL,
31
+ "expires_at" timestamp with time zone NOT NULL,
32
+ "ip" text,
33
+ "user_agent" text,
34
+ "remember" boolean DEFAULT false NOT NULL,
35
+ "revoked_at" timestamp with time zone
36
+ );
37
+ --> statement-breakpoint
38
+ CREATE INDEX IF NOT EXISTS "admin_sessions_user_idx" ON "admin_sessions" USING btree ("user_id");
39
+ --> statement-breakpoint
40
+ CREATE INDEX IF NOT EXISTS "admin_sessions_expires_idx" ON "admin_sessions" USING btree ("expires_at");
41
+ --> statement-breakpoint
42
+ CREATE TABLE IF NOT EXISTS "audit_log" (
43
+ "id" bigint PRIMARY KEY GENERATED ALWAYS AS IDENTITY,
44
+ "ts" timestamp with time zone DEFAULT now() NOT NULL,
45
+ "user_id" text,
46
+ "user_email" text,
47
+ "action" text NOT NULL,
48
+ "target" text,
49
+ "detail" jsonb,
50
+ "ip" text,
51
+ "user_agent" text
52
+ );
53
+ --> statement-breakpoint
54
+ CREATE INDEX IF NOT EXISTS "audit_log_ts_idx" ON "audit_log" USING btree ("ts");
55
+ --> statement-breakpoint
56
+ CREATE INDEX IF NOT EXISTS "audit_log_user_idx" ON "audit_log" USING btree ("user_id","ts");
57
+ --> statement-breakpoint
58
+ CREATE INDEX IF NOT EXISTS "audit_log_action_idx" ON "audit_log" USING btree ("action");
59
+ --> statement-breakpoint
60
+ CREATE TABLE IF NOT EXISTS "mail_log" (
61
+ "id" bigint PRIMARY KEY GENERATED ALWAYS AS IDENTITY,
62
+ "ts" timestamp with time zone DEFAULT now() NOT NULL,
63
+ "kind" text NOT NULL,
64
+ "to_addr" text NOT NULL,
65
+ "subject" text NOT NULL,
66
+ "status" text NOT NULL,
67
+ "error" text
68
+ );
69
+ --> statement-breakpoint
70
+ CREATE INDEX IF NOT EXISTS "mail_log_ts_idx" ON "mail_log" USING btree ("ts");
71
+ --> statement-breakpoint
72
+ CREATE TABLE IF NOT EXISTS "auth_tokens" (
73
+ "id" text PRIMARY KEY NOT NULL,
74
+ "user_id" text NOT NULL,
75
+ "kind" text NOT NULL,
76
+ "created_at" timestamp with time zone DEFAULT now() NOT NULL,
77
+ "expires_at" timestamp with time zone NOT NULL,
78
+ "used_at" timestamp with time zone,
79
+ "created_by" text
80
+ );
81
+ --> statement-breakpoint
82
+ CREATE INDEX IF NOT EXISTS "auth_tokens_user_idx" ON "auth_tokens" USING btree ("user_id");
@@ -0,0 +1,16 @@
1
+ -- Snapify
2
+ -- © 2026 NOVALABS WEB DESIGN — Tunisie
3
+ -- Contact : contact@novalabs.tn · +216 24 734 647
4
+ CREATE TABLE IF NOT EXISTS "module_records" (
5
+ "module_id" text NOT NULL,
6
+ "collection" text NOT NULL,
7
+ "id" text NOT NULL,
8
+ "data" jsonb NOT NULL,
9
+ "created_at" timestamp with time zone DEFAULT now() NOT NULL,
10
+ "updated_at" timestamp with time zone DEFAULT now() NOT NULL,
11
+ CONSTRAINT "module_records_module_id_collection_id_pk" PRIMARY KEY("module_id","collection","id")
12
+ );
13
+ --> statement-breakpoint
14
+ CREATE INDEX IF NOT EXISTS "module_records_created_idx" ON "module_records" USING btree ("module_id","collection","created_at");
15
+ --> statement-breakpoint
16
+ CREATE INDEX IF NOT EXISTS "module_records_data_gin" ON "module_records" USING gin ("data" jsonb_path_ops);
@@ -0,0 +1,4 @@
1
+ -- Snapify
2
+ -- © 2026 NOVALABS WEB DESIGN — Tunisie
3
+ -- Contact : contact@novalabs.tn · +216 24 734 647
4
+ ALTER TABLE "admin_users" ADD COLUMN IF NOT EXISTS "avatar_url" text;
@@ -0,0 +1,264 @@
1
+ CREATE TABLE IF NOT EXISTS "platform_users" (
2
+ "id" text PRIMARY KEY NOT NULL,
3
+ "email" text NOT NULL,
4
+ "display_name" text NOT NULL,
5
+ "avatar_url" text,
6
+ "bio" text DEFAULT '' NOT NULL,
7
+ "password_hash" text NOT NULL,
8
+ "salt" text NOT NULL,
9
+ "role" text DEFAULT 'member' NOT NULL,
10
+ "email_verified_at" timestamp with time zone,
11
+ "created_at" timestamp with time zone DEFAULT now() NOT NULL,
12
+ "updated_at" timestamp with time zone DEFAULT now() NOT NULL
13
+ );
14
+ --> statement-breakpoint
15
+ CREATE UNIQUE INDEX IF NOT EXISTS "platform_users_email_uq" ON "platform_users" USING btree ("email");
16
+ --> statement-breakpoint
17
+ CREATE TABLE IF NOT EXISTS "platform_sessions" (
18
+ "id" text PRIMARY KEY NOT NULL,
19
+ "user_id" text NOT NULL,
20
+ "created_at" timestamp with time zone DEFAULT now() NOT NULL,
21
+ "last_seen_at" timestamp with time zone DEFAULT now() NOT NULL,
22
+ "expires_at" timestamp with time zone NOT NULL,
23
+ "ip" text,
24
+ "user_agent" text,
25
+ "revoked_at" timestamp with time zone
26
+ );
27
+ --> statement-breakpoint
28
+ CREATE INDEX IF NOT EXISTS "platform_sessions_user_idx" ON "platform_sessions" USING btree ("user_id");
29
+ --> statement-breakpoint
30
+ CREATE INDEX IF NOT EXISTS "platform_sessions_expires_idx" ON "platform_sessions" USING btree ("expires_at");
31
+ --> statement-breakpoint
32
+ CREATE TABLE IF NOT EXISTS "platform_auth_tokens" (
33
+ "id" text PRIMARY KEY NOT NULL,
34
+ "user_id" text NOT NULL,
35
+ "kind" text NOT NULL,
36
+ "token_hash" text NOT NULL,
37
+ "created_at" timestamp with time zone DEFAULT now() NOT NULL,
38
+ "expires_at" timestamp with time zone NOT NULL,
39
+ "used_at" timestamp with time zone
40
+ );
41
+ --> statement-breakpoint
42
+ CREATE INDEX IF NOT EXISTS "platform_auth_tokens_user_idx" ON "platform_auth_tokens" USING btree ("user_id");
43
+ --> statement-breakpoint
44
+ CREATE UNIQUE INDEX IF NOT EXISTS "platform_auth_tokens_hash_uq" ON "platform_auth_tokens" USING btree ("token_hash");
45
+ --> statement-breakpoint
46
+ CREATE TABLE IF NOT EXISTS "forum_categories" (
47
+ "id" text PRIMARY KEY NOT NULL,
48
+ "name" text NOT NULL,
49
+ "slug" text NOT NULL,
50
+ "description" text DEFAULT '' NOT NULL,
51
+ "icon" text DEFAULT 'message-circle' NOT NULL,
52
+ "position" integer DEFAULT 0 NOT NULL,
53
+ "created_at" timestamp with time zone DEFAULT now() NOT NULL
54
+ );
55
+ --> statement-breakpoint
56
+ CREATE UNIQUE INDEX IF NOT EXISTS "forum_categories_slug_uq" ON "forum_categories" USING btree ("slug");
57
+ --> statement-breakpoint
58
+ CREATE TABLE IF NOT EXISTS "forum_topics" (
59
+ "id" text PRIMARY KEY NOT NULL,
60
+ "category_id" text NOT NULL,
61
+ "author_id" text NOT NULL,
62
+ "title" text NOT NULL,
63
+ "slug" text NOT NULL,
64
+ "pinned" boolean DEFAULT false NOT NULL,
65
+ "locked" boolean DEFAULT false NOT NULL,
66
+ "views" integer DEFAULT 0 NOT NULL,
67
+ "last_post_at" timestamp with time zone DEFAULT now() NOT NULL,
68
+ "created_at" timestamp with time zone DEFAULT now() NOT NULL,
69
+ "updated_at" timestamp with time zone DEFAULT now() NOT NULL
70
+ );
71
+ --> statement-breakpoint
72
+ CREATE UNIQUE INDEX IF NOT EXISTS "forum_topics_slug_uq" ON "forum_topics" USING btree ("slug");
73
+ --> statement-breakpoint
74
+ CREATE INDEX IF NOT EXISTS "forum_topics_category_idx" ON "forum_topics" USING btree ("category_id","last_post_at");
75
+ --> statement-breakpoint
76
+ CREATE INDEX IF NOT EXISTS "forum_topics_author_idx" ON "forum_topics" USING btree ("author_id");
77
+ --> statement-breakpoint
78
+ CREATE TABLE IF NOT EXISTS "forum_posts" (
79
+ "id" text PRIMARY KEY NOT NULL,
80
+ "topic_id" text NOT NULL,
81
+ "author_id" text NOT NULL,
82
+ "body" text NOT NULL,
83
+ "edited_at" timestamp with time zone,
84
+ "created_at" timestamp with time zone DEFAULT now() NOT NULL
85
+ );
86
+ --> statement-breakpoint
87
+ CREATE INDEX IF NOT EXISTS "forum_posts_topic_idx" ON "forum_posts" USING btree ("topic_id","created_at");
88
+ --> statement-breakpoint
89
+ CREATE INDEX IF NOT EXISTS "forum_posts_author_idx" ON "forum_posts" USING btree ("author_id");
90
+ --> statement-breakpoint
91
+ CREATE TABLE IF NOT EXISTS "forum_likes" (
92
+ "post_id" text NOT NULL,
93
+ "user_id" text NOT NULL,
94
+ "created_at" timestamp with time zone DEFAULT now() NOT NULL,
95
+ CONSTRAINT "forum_likes_post_id_user_id_pk" PRIMARY KEY("post_id","user_id")
96
+ );
97
+ --> statement-breakpoint
98
+ CREATE TABLE IF NOT EXISTS "forum_subscriptions" (
99
+ "topic_id" text NOT NULL,
100
+ "user_id" text NOT NULL,
101
+ "created_at" timestamp with time zone DEFAULT now() NOT NULL,
102
+ CONSTRAINT "forum_subscriptions_topic_id_user_id_pk" PRIMARY KEY("topic_id","user_id")
103
+ );
104
+ --> statement-breakpoint
105
+ CREATE TABLE IF NOT EXISTS "forum_notifications" (
106
+ "id" text PRIMARY KEY NOT NULL,
107
+ "user_id" text NOT NULL,
108
+ "type" text NOT NULL,
109
+ "payload" jsonb DEFAULT '{}'::jsonb NOT NULL,
110
+ "read_at" timestamp with time zone,
111
+ "created_at" timestamp with time zone DEFAULT now() NOT NULL
112
+ );
113
+ --> statement-breakpoint
114
+ CREATE INDEX IF NOT EXISTS "forum_notifications_user_idx" ON "forum_notifications" USING btree ("user_id","created_at");
115
+ --> statement-breakpoint
116
+ CREATE TABLE IF NOT EXISTS "forum_reports" (
117
+ "id" text PRIMARY KEY NOT NULL,
118
+ "reporter_id" text NOT NULL,
119
+ "target_type" text NOT NULL,
120
+ "target_id" text NOT NULL,
121
+ "reason" text NOT NULL,
122
+ "status" text DEFAULT 'open' NOT NULL,
123
+ "created_at" timestamp with time zone DEFAULT now() NOT NULL,
124
+ "resolved_at" timestamp with time zone
125
+ );
126
+ --> statement-breakpoint
127
+ CREATE INDEX IF NOT EXISTS "forum_reports_status_idx" ON "forum_reports" USING btree ("status","created_at");
128
+ --> statement-breakpoint
129
+ CREATE TABLE IF NOT EXISTS "mp_publishers" (
130
+ "id" text PRIMARY KEY NOT NULL,
131
+ "user_id" text NOT NULL,
132
+ "display_name" text NOT NULL,
133
+ "website" text,
134
+ "payout_iban" text,
135
+ "flouci_payment_id" text,
136
+ "paid_at" timestamp with time zone,
137
+ "status" text DEFAULT 'pending_payment' NOT NULL,
138
+ "created_at" timestamp with time zone DEFAULT now() NOT NULL
139
+ );
140
+ --> statement-breakpoint
141
+ CREATE UNIQUE INDEX IF NOT EXISTS "mp_publishers_user_uq" ON "mp_publishers" USING btree ("user_id");
142
+ --> statement-breakpoint
143
+ CREATE TABLE IF NOT EXISTS "mp_products" (
144
+ "id" text PRIMARY KEY NOT NULL,
145
+ "publisher_id" text NOT NULL,
146
+ "kind" text NOT NULL,
147
+ "slug" text NOT NULL,
148
+ "name" text NOT NULL,
149
+ "short_desc" text DEFAULT '' NOT NULL,
150
+ "long_desc" text DEFAULT '' NOT NULL,
151
+ "category" text DEFAULT 'Autres' NOT NULL,
152
+ "price_millimes" integer DEFAULT 0 NOT NULL,
153
+ "status" text DEFAULT 'draft' NOT NULL,
154
+ "icon" text DEFAULT 'package' NOT NULL,
155
+ "screenshots" jsonb DEFAULT '[]'::jsonb NOT NULL,
156
+ "engines" jsonb DEFAULT '{"snapify":"^1.0.0"}'::jsonb NOT NULL,
157
+ "permissions" jsonb DEFAULT '[]'::jsonb NOT NULL,
158
+ "rejection_reason" text,
159
+ "sales_count" integer DEFAULT 0 NOT NULL,
160
+ "created_at" timestamp with time zone DEFAULT now() NOT NULL,
161
+ "updated_at" timestamp with time zone DEFAULT now() NOT NULL
162
+ );
163
+ --> statement-breakpoint
164
+ CREATE UNIQUE INDEX IF NOT EXISTS "mp_products_slug_uq" ON "mp_products" USING btree ("slug");
165
+ --> statement-breakpoint
166
+ CREATE INDEX IF NOT EXISTS "mp_products_status_idx" ON "mp_products" USING btree ("status","kind");
167
+ --> statement-breakpoint
168
+ CREATE INDEX IF NOT EXISTS "mp_products_publisher_idx" ON "mp_products" USING btree ("publisher_id");
169
+ --> statement-breakpoint
170
+ CREATE TABLE IF NOT EXISTS "mp_versions" (
171
+ "id" text PRIMARY KEY NOT NULL,
172
+ "product_id" text NOT NULL,
173
+ "version" text NOT NULL,
174
+ "changelog" text DEFAULT '' NOT NULL,
175
+ "package_path" text NOT NULL,
176
+ "sha256" text NOT NULL,
177
+ "size" integer DEFAULT 0 NOT NULL,
178
+ "signed" boolean DEFAULT false NOT NULL,
179
+ "created_at" timestamp with time zone DEFAULT now() NOT NULL
180
+ );
181
+ --> statement-breakpoint
182
+ CREATE UNIQUE INDEX IF NOT EXISTS "mp_versions_product_ver_uq" ON "mp_versions" USING btree ("product_id","version");
183
+ --> statement-breakpoint
184
+ CREATE INDEX IF NOT EXISTS "mp_versions_product_idx" ON "mp_versions" USING btree ("product_id");
185
+ --> statement-breakpoint
186
+ CREATE TABLE IF NOT EXISTS "mp_reviews" (
187
+ "id" text PRIMARY KEY NOT NULL,
188
+ "product_id" text NOT NULL,
189
+ "user_id" text NOT NULL,
190
+ "rating" integer NOT NULL,
191
+ "body" text DEFAULT '' NOT NULL,
192
+ "created_at" timestamp with time zone DEFAULT now() NOT NULL
193
+ );
194
+ --> statement-breakpoint
195
+ CREATE UNIQUE INDEX IF NOT EXISTS "mp_reviews_product_user_uq" ON "mp_reviews" USING btree ("product_id","user_id");
196
+ --> statement-breakpoint
197
+ CREATE INDEX IF NOT EXISTS "mp_reviews_product_idx" ON "mp_reviews" USING btree ("product_id");
198
+ --> statement-breakpoint
199
+ CREATE TABLE IF NOT EXISTS "mp_orders" (
200
+ "id" text PRIMARY KEY NOT NULL,
201
+ "buyer_id" text NOT NULL,
202
+ "total_millimes" integer NOT NULL,
203
+ "commission_millimes" integer DEFAULT 0 NOT NULL,
204
+ "status" text DEFAULT 'pending' NOT NULL,
205
+ "flouci_payment_id" text,
206
+ "flouci_tracking_id" text,
207
+ "created_at" timestamp with time zone DEFAULT now() NOT NULL,
208
+ "paid_at" timestamp with time zone
209
+ );
210
+ --> statement-breakpoint
211
+ CREATE INDEX IF NOT EXISTS "mp_orders_buyer_idx" ON "mp_orders" USING btree ("buyer_id");
212
+ --> statement-breakpoint
213
+ CREATE INDEX IF NOT EXISTS "mp_orders_status_idx" ON "mp_orders" USING btree ("status");
214
+ --> statement-breakpoint
215
+ CREATE TABLE IF NOT EXISTS "mp_order_items" (
216
+ "id" text PRIMARY KEY NOT NULL,
217
+ "order_id" text NOT NULL,
218
+ "product_id" text NOT NULL,
219
+ "version_id" text NOT NULL,
220
+ "unit_price_millimes" integer NOT NULL,
221
+ "license_key" text NOT NULL
222
+ );
223
+ --> statement-breakpoint
224
+ CREATE INDEX IF NOT EXISTS "mp_order_items_order_idx" ON "mp_order_items" USING btree ("order_id");
225
+ --> statement-breakpoint
226
+ CREATE INDEX IF NOT EXISTS "mp_order_items_product_idx" ON "mp_order_items" USING btree ("product_id");
227
+ --> statement-breakpoint
228
+ CREATE TABLE IF NOT EXISTS "mp_downloads" (
229
+ "id" text PRIMARY KEY NOT NULL,
230
+ "order_item_id" text NOT NULL,
231
+ "token" text NOT NULL,
232
+ "expires_at" timestamp with time zone NOT NULL,
233
+ "count" integer DEFAULT 0 NOT NULL,
234
+ "created_at" timestamp with time zone DEFAULT now() NOT NULL
235
+ );
236
+ --> statement-breakpoint
237
+ CREATE UNIQUE INDEX IF NOT EXISTS "mp_downloads_token_uq" ON "mp_downloads" USING btree ("token");
238
+ --> statement-breakpoint
239
+ CREATE INDEX IF NOT EXISTS "mp_downloads_item_idx" ON "mp_downloads" USING btree ("order_item_id");
240
+ --> statement-breakpoint
241
+ CREATE TABLE IF NOT EXISTS "mp_payouts" (
242
+ "id" text PRIMARY KEY NOT NULL,
243
+ "publisher_id" text NOT NULL,
244
+ "amount_millimes" integer NOT NULL,
245
+ "status" text DEFAULT 'requested' NOT NULL,
246
+ "period" text NOT NULL,
247
+ "note" text,
248
+ "created_at" timestamp with time zone DEFAULT now() NOT NULL,
249
+ "paid_at" timestamp with time zone
250
+ );
251
+ --> statement-breakpoint
252
+ CREATE INDEX IF NOT EXISTS "mp_payouts_publisher_idx" ON "mp_payouts" USING btree ("publisher_id","status");
253
+ --> statement-breakpoint
254
+ CREATE TABLE IF NOT EXISTS "mp_settings" (
255
+ "key" text PRIMARY KEY NOT NULL,
256
+ "value" jsonb NOT NULL,
257
+ "updated_at" timestamp with time zone DEFAULT now() NOT NULL
258
+ );
259
+ --> statement-breakpoint
260
+ CREATE TABLE IF NOT EXISTS "mp_carts" (
261
+ "user_id" text PRIMARY KEY NOT NULL,
262
+ "product_ids" jsonb DEFAULT '[]'::jsonb NOT NULL,
263
+ "updated_at" timestamp with time zone DEFAULT now() NOT NULL
264
+ );
@@ -0,0 +1,3 @@
1
+ ALTER TABLE "mp_versions" ADD COLUMN IF NOT EXISTS "validation_report" jsonb;
2
+ --> statement-breakpoint
3
+ ALTER TABLE "mp_versions" ADD COLUMN IF NOT EXISTS "module_id" text;
@@ -0,0 +1,77 @@
1
+ CREATE TABLE IF NOT EXISTS "sa_tickets" (
2
+ "id" text PRIMARY KEY NOT NULL,
3
+ "kind" text DEFAULT 'support' NOT NULL,
4
+ "status" text DEFAULT 'open' NOT NULL,
5
+ "priority" text DEFAULT 'normal' NOT NULL,
6
+ "subject" text NOT NULL,
7
+ "body" text DEFAULT '' NOT NULL,
8
+ "email" text,
9
+ "name" text,
10
+ "ref_type" text,
11
+ "ref_id" text,
12
+ "created_at" timestamp with time zone DEFAULT now() NOT NULL,
13
+ "updated_at" timestamp with time zone DEFAULT now() NOT NULL,
14
+ "resolved_at" timestamp with time zone
15
+ );
16
+ --> statement-breakpoint
17
+ CREATE INDEX IF NOT EXISTS "sa_tickets_status_idx" ON "sa_tickets" USING btree ("status","kind");
18
+ --> statement-breakpoint
19
+ CREATE TABLE IF NOT EXISTS "sa_newsletter_subscribers" (
20
+ "id" text PRIMARY KEY NOT NULL,
21
+ "email" text NOT NULL,
22
+ "name" text DEFAULT '' NOT NULL,
23
+ "source" text DEFAULT 'manual' NOT NULL,
24
+ "status" text DEFAULT 'active' NOT NULL,
25
+ "created_at" timestamp with time zone DEFAULT now() NOT NULL
26
+ );
27
+ --> statement-breakpoint
28
+ CREATE UNIQUE INDEX IF NOT EXISTS "sa_newsletter_email_uq" ON "sa_newsletter_subscribers" USING btree ("email");
29
+ --> statement-breakpoint
30
+ CREATE TABLE IF NOT EXISTS "sa_newsletter_campaigns" (
31
+ "id" text PRIMARY KEY NOT NULL,
32
+ "subject" text NOT NULL,
33
+ "html" text NOT NULL,
34
+ "status" text DEFAULT 'draft' NOT NULL,
35
+ "recipient_count" integer DEFAULT 0 NOT NULL,
36
+ "sent_at" timestamp with time zone,
37
+ "created_at" timestamp with time zone DEFAULT now() NOT NULL
38
+ );
39
+ --> statement-breakpoint
40
+ CREATE TABLE IF NOT EXISTS "sa_invoices" (
41
+ "id" text PRIMARY KEY NOT NULL,
42
+ "number" text NOT NULL,
43
+ "kind" text NOT NULL,
44
+ "ref_id" text,
45
+ "customer_name" text NOT NULL,
46
+ "customer_email" text NOT NULL,
47
+ "amount_millimes" integer NOT NULL,
48
+ "tax_millimes" integer DEFAULT 0 NOT NULL,
49
+ "status" text DEFAULT 'draft' NOT NULL,
50
+ "lines" jsonb DEFAULT '[]'::jsonb NOT NULL,
51
+ "notes" text DEFAULT '' NOT NULL,
52
+ "created_at" timestamp with time zone DEFAULT now() NOT NULL,
53
+ "sent_at" timestamp with time zone,
54
+ "paid_at" timestamp with time zone
55
+ );
56
+ --> statement-breakpoint
57
+ CREATE UNIQUE INDEX IF NOT EXISTS "sa_invoices_number_uq" ON "sa_invoices" USING btree ("number");
58
+ --> statement-breakpoint
59
+ CREATE INDEX IF NOT EXISTS "sa_invoices_status_idx" ON "sa_invoices" USING btree ("status","kind");
60
+ --> statement-breakpoint
61
+ CREATE TABLE IF NOT EXISTS "sa_payment_events" (
62
+ "id" text PRIMARY KEY NOT NULL,
63
+ "provider" text DEFAULT 'flouci' NOT NULL,
64
+ "kind" text NOT NULL,
65
+ "amount_millimes" integer NOT NULL,
66
+ "status" text NOT NULL,
67
+ "tracking_id" text,
68
+ "payment_id" text,
69
+ "ref_type" text,
70
+ "ref_id" text,
71
+ "meta" jsonb DEFAULT '{}'::jsonb NOT NULL,
72
+ "created_at" timestamp with time zone DEFAULT now() NOT NULL
73
+ );
74
+ --> statement-breakpoint
75
+ CREATE INDEX IF NOT EXISTS "sa_payment_events_ref_idx" ON "sa_payment_events" USING btree ("ref_type","ref_id");
76
+ --> statement-breakpoint
77
+ CREATE INDEX IF NOT EXISTS "sa_payment_events_created_idx" ON "sa_payment_events" USING btree ("created_at");
@@ -0,0 +1,13 @@
1
+ -- Snapify
2
+ -- © 2026 NOVALABS WEB DESIGN — Tunisie
3
+ -- Contact : contact@novalabs.tn · +216 24 734 647
4
+ -- Tous droits réservés. Toute reproduction, modification ou diffusion sans autorisation écrite est interdite.
5
+ -- Menus : identifiants libres (suppression d'éventuelles contraintes CHECK héritées).
6
+ ALTER TABLE "menus" DROP CONSTRAINT IF EXISTS "menus_id_check";
7
+ --> statement-breakpoint
8
+ -- Articles : statut « scheduled » et date de publication planifiée.
9
+ ALTER TABLE "posts" DROP CONSTRAINT IF EXISTS "posts_status_check";
10
+ --> statement-breakpoint
11
+ ALTER TABLE "posts" ADD CONSTRAINT "posts_status_check" CHECK ("status" IN ('draft', 'published', 'scheduled'));
12
+ --> statement-breakpoint
13
+ ALTER TABLE "posts" ADD COLUMN IF NOT EXISTS "scheduled_at" timestamp with time zone;