adserver-dashboard 1.0.0

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 (525) hide show
  1. package/.ci/staging.yml +191 -0
  2. package/.dockerignore +117 -0
  3. package/.env +40 -0
  4. package/.env.staging +38 -0
  5. package/.gitlab-ci.yml +16 -0
  6. package/DEMO_STATUS.md +579 -0
  7. package/Dockerfile +61 -0
  8. package/Influence-MW-AdServer-12-02-2026/client/index.html +17 -0
  9. package/Influence-MW-AdServer-12-02-2026/client/public/favicon.png +0 -0
  10. package/Influence-MW-AdServer-12-02-2026/client/src/App.tsx +91 -0
  11. package/Influence-MW-AdServer-12-02-2026/client/src/components/advanced-map-drawer.tsx +1131 -0
  12. package/Influence-MW-AdServer-12-02-2026/client/src/components/ai-recommendation-panel.tsx +379 -0
  13. package/Influence-MW-AdServer-12-02-2026/client/src/components/app-sidebar.tsx +183 -0
  14. package/Influence-MW-AdServer-12-02-2026/client/src/components/auto-optimize-button.tsx +184 -0
  15. package/Influence-MW-AdServer-12-02-2026/client/src/components/availability-drawer.tsx +385 -0
  16. package/Influence-MW-AdServer-12-02-2026/client/src/components/brand-insights-panel.tsx +87 -0
  17. package/Influence-MW-AdServer-12-02-2026/client/src/components/create-agency-drawer.tsx +198 -0
  18. package/Influence-MW-AdServer-12-02-2026/client/src/components/create-brand-drawer.tsx +275 -0
  19. package/Influence-MW-AdServer-12-02-2026/client/src/components/creative-assignment.tsx +526 -0
  20. package/Influence-MW-AdServer-12-02-2026/client/src/components/data-table-toolbar.tsx +148 -0
  21. package/Influence-MW-AdServer-12-02-2026/client/src/components/data-table.tsx +158 -0
  22. package/Influence-MW-AdServer-12-02-2026/client/src/components/filter-drawer.tsx +356 -0
  23. package/Influence-MW-AdServer-12-02-2026/client/src/components/form-insights-panel.tsx +82 -0
  24. package/Influence-MW-AdServer-12-02-2026/client/src/components/geography-selector.tsx +699 -0
  25. package/Influence-MW-AdServer-12-02-2026/client/src/components/header-user-menu.tsx +178 -0
  26. package/Influence-MW-AdServer-12-02-2026/client/src/components/history-drawer.tsx +313 -0
  27. package/Influence-MW-AdServer-12-02-2026/client/src/components/inventory-availability-section.tsx +176 -0
  28. package/Influence-MW-AdServer-12-02-2026/client/src/components/inventory-format-drawer.tsx +173 -0
  29. package/Influence-MW-AdServer-12-02-2026/client/src/components/inventory-selector.tsx +401 -0
  30. package/Influence-MW-AdServer-12-02-2026/client/src/components/manual-inventory-drawer.tsx +368 -0
  31. package/Influence-MW-AdServer-12-02-2026/client/src/components/mapbox-map.tsx +368 -0
  32. package/Influence-MW-AdServer-12-02-2026/client/src/components/market-insights-panel.tsx +202 -0
  33. package/Influence-MW-AdServer-12-02-2026/client/src/components/media-owner-drawer.tsx +217 -0
  34. package/Influence-MW-AdServer-12-02-2026/client/src/components/metric-card.tsx +58 -0
  35. package/Influence-MW-AdServer-12-02-2026/client/src/components/page-header.tsx +27 -0
  36. package/Influence-MW-AdServer-12-02-2026/client/src/components/player-status-indicator.tsx +137 -0
  37. package/Influence-MW-AdServer-12-02-2026/client/src/components/poi-targeting-drawer.tsx +298 -0
  38. package/Influence-MW-AdServer-12-02-2026/client/src/components/recommendation-score-badge.tsx +102 -0
  39. package/Influence-MW-AdServer-12-02-2026/client/src/components/recommended-inventories-panel.tsx +248 -0
  40. package/Influence-MW-AdServer-12-02-2026/client/src/components/searchable-combobox.tsx +134 -0
  41. package/Influence-MW-AdServer-12-02-2026/client/src/components/signal-visualizations.tsx +407 -0
  42. package/Influence-MW-AdServer-12-02-2026/client/src/components/status-badge.tsx +35 -0
  43. package/Influence-MW-AdServer-12-02-2026/client/src/components/theme-provider.tsx +73 -0
  44. package/Influence-MW-AdServer-12-02-2026/client/src/components/theme-toggle.tsx +37 -0
  45. package/Influence-MW-AdServer-12-02-2026/client/src/components/traffic-slider.tsx +75 -0
  46. package/Influence-MW-AdServer-12-02-2026/client/src/components/ui/accordion.tsx +56 -0
  47. package/Influence-MW-AdServer-12-02-2026/client/src/components/ui/alert-dialog.tsx +139 -0
  48. package/Influence-MW-AdServer-12-02-2026/client/src/components/ui/alert.tsx +59 -0
  49. package/Influence-MW-AdServer-12-02-2026/client/src/components/ui/aspect-ratio.tsx +5 -0
  50. package/Influence-MW-AdServer-12-02-2026/client/src/components/ui/avatar.tsx +51 -0
  51. package/Influence-MW-AdServer-12-02-2026/client/src/components/ui/badge.tsx +38 -0
  52. package/Influence-MW-AdServer-12-02-2026/client/src/components/ui/breadcrumb.tsx +115 -0
  53. package/Influence-MW-AdServer-12-02-2026/client/src/components/ui/button.tsx +62 -0
  54. package/Influence-MW-AdServer-12-02-2026/client/src/components/ui/calendar.tsx +68 -0
  55. package/Influence-MW-AdServer-12-02-2026/client/src/components/ui/card.tsx +85 -0
  56. package/Influence-MW-AdServer-12-02-2026/client/src/components/ui/carousel.tsx +260 -0
  57. package/Influence-MW-AdServer-12-02-2026/client/src/components/ui/chart.tsx +365 -0
  58. package/Influence-MW-AdServer-12-02-2026/client/src/components/ui/checkbox.tsx +28 -0
  59. package/Influence-MW-AdServer-12-02-2026/client/src/components/ui/collapsible.tsx +11 -0
  60. package/Influence-MW-AdServer-12-02-2026/client/src/components/ui/command.tsx +151 -0
  61. package/Influence-MW-AdServer-12-02-2026/client/src/components/ui/context-menu.tsx +198 -0
  62. package/Influence-MW-AdServer-12-02-2026/client/src/components/ui/dialog.tsx +122 -0
  63. package/Influence-MW-AdServer-12-02-2026/client/src/components/ui/drawer.tsx +118 -0
  64. package/Influence-MW-AdServer-12-02-2026/client/src/components/ui/dropdown-menu.tsx +198 -0
  65. package/Influence-MW-AdServer-12-02-2026/client/src/components/ui/form.tsx +178 -0
  66. package/Influence-MW-AdServer-12-02-2026/client/src/components/ui/hover-card.tsx +29 -0
  67. package/Influence-MW-AdServer-12-02-2026/client/src/components/ui/input-otp.tsx +69 -0
  68. package/Influence-MW-AdServer-12-02-2026/client/src/components/ui/input.tsx +23 -0
  69. package/Influence-MW-AdServer-12-02-2026/client/src/components/ui/label.tsx +24 -0
  70. package/Influence-MW-AdServer-12-02-2026/client/src/components/ui/menubar.tsx +256 -0
  71. package/Influence-MW-AdServer-12-02-2026/client/src/components/ui/navigation-menu.tsx +128 -0
  72. package/Influence-MW-AdServer-12-02-2026/client/src/components/ui/pagination.tsx +117 -0
  73. package/Influence-MW-AdServer-12-02-2026/client/src/components/ui/popover.tsx +29 -0
  74. package/Influence-MW-AdServer-12-02-2026/client/src/components/ui/progress.tsx +28 -0
  75. package/Influence-MW-AdServer-12-02-2026/client/src/components/ui/radio-group.tsx +42 -0
  76. package/Influence-MW-AdServer-12-02-2026/client/src/components/ui/resizable.tsx +45 -0
  77. package/Influence-MW-AdServer-12-02-2026/client/src/components/ui/scroll-area.tsx +46 -0
  78. package/Influence-MW-AdServer-12-02-2026/client/src/components/ui/select.tsx +160 -0
  79. package/Influence-MW-AdServer-12-02-2026/client/src/components/ui/separator.tsx +29 -0
  80. package/Influence-MW-AdServer-12-02-2026/client/src/components/ui/sheet.tsx +140 -0
  81. package/Influence-MW-AdServer-12-02-2026/client/src/components/ui/sidebar.tsx +727 -0
  82. package/Influence-MW-AdServer-12-02-2026/client/src/components/ui/skeleton.tsx +15 -0
  83. package/Influence-MW-AdServer-12-02-2026/client/src/components/ui/slider.tsx +26 -0
  84. package/Influence-MW-AdServer-12-02-2026/client/src/components/ui/switch.tsx +27 -0
  85. package/Influence-MW-AdServer-12-02-2026/client/src/components/ui/table.tsx +117 -0
  86. package/Influence-MW-AdServer-12-02-2026/client/src/components/ui/tabs.tsx +53 -0
  87. package/Influence-MW-AdServer-12-02-2026/client/src/components/ui/textarea.tsx +22 -0
  88. package/Influence-MW-AdServer-12-02-2026/client/src/components/ui/toast.tsx +127 -0
  89. package/Influence-MW-AdServer-12-02-2026/client/src/components/ui/toaster.tsx +33 -0
  90. package/Influence-MW-AdServer-12-02-2026/client/src/components/ui/toggle-group.tsx +61 -0
  91. package/Influence-MW-AdServer-12-02-2026/client/src/components/ui/toggle.tsx +43 -0
  92. package/Influence-MW-AdServer-12-02-2026/client/src/components/ui/tooltip.tsx +30 -0
  93. package/Influence-MW-AdServer-12-02-2026/client/src/components/vendor-stores-modal.tsx +336 -0
  94. package/Influence-MW-AdServer-12-02-2026/client/src/components/venue-type-drawer.tsx +359 -0
  95. package/Influence-MW-AdServer-12-02-2026/client/src/components/venue-type-selector.tsx +436 -0
  96. package/Influence-MW-AdServer-12-02-2026/client/src/hooks/use-mobile.tsx +19 -0
  97. package/Influence-MW-AdServer-12-02-2026/client/src/hooks/use-toast.ts +191 -0
  98. package/Influence-MW-AdServer-12-02-2026/client/src/index.css +244 -0
  99. package/Influence-MW-AdServer-12-02-2026/client/src/lib/queryClient.ts +57 -0
  100. package/Influence-MW-AdServer-12-02-2026/client/src/lib/utils.ts +39 -0
  101. package/Influence-MW-AdServer-12-02-2026/client/src/lib/venue-taxonomy.ts +532 -0
  102. package/Influence-MW-AdServer-12-02-2026/client/src/main.tsx +5 -0
  103. package/Influence-MW-AdServer-12-02-2026/client/src/pages/assign-creative.tsx +781 -0
  104. package/Influence-MW-AdServer-12-02-2026/client/src/pages/content-hub.tsx +995 -0
  105. package/Influence-MW-AdServer-12-02-2026/client/src/pages/custom-pois.tsx +431 -0
  106. package/Influence-MW-AdServer-12-02-2026/client/src/pages/dashboard.tsx +620 -0
  107. package/Influence-MW-AdServer-12-02-2026/client/src/pages/deal-detail.tsx +1062 -0
  108. package/Influence-MW-AdServer-12-02-2026/client/src/pages/deal-form.tsx +1570 -0
  109. package/Influence-MW-AdServer-12-02-2026/client/src/pages/deals.tsx +716 -0
  110. package/Influence-MW-AdServer-12-02-2026/client/src/pages/edit-creative-assignment.tsx +1051 -0
  111. package/Influence-MW-AdServer-12-02-2026/client/src/pages/geotargeting.tsx +675 -0
  112. package/Influence-MW-AdServer-12-02-2026/client/src/pages/integrations.tsx +425 -0
  113. package/Influence-MW-AdServer-12-02-2026/client/src/pages/line-item-creatives.tsx +622 -0
  114. package/Influence-MW-AdServer-12-02-2026/client/src/pages/line-item-form.tsx +3132 -0
  115. package/Influence-MW-AdServer-12-02-2026/client/src/pages/line-items.tsx +530 -0
  116. package/Influence-MW-AdServer-12-02-2026/client/src/pages/not-found.tsx +21 -0
  117. package/Influence-MW-AdServer-12-02-2026/client/src/pages/proof-of-play-upload.tsx +479 -0
  118. package/Influence-MW-AdServer-12-02-2026/client/src/pages/proof-of-play.tsx +880 -0
  119. package/Influence-MW-AdServer-12-02-2026/client/src/pages/reports.tsx +235 -0
  120. package/Influence-MW-AdServer-12-02-2026/client/src/pages/settings.tsx +652 -0
  121. package/Influence-MW-AdServer-12-02-2026/client/src/pages/signal-form.tsx +1117 -0
  122. package/Influence-MW-AdServer-12-02-2026/client/src/pages/signals.tsx +366 -0
  123. package/Influence-MW-AdServer-12-02-2026/client/src/pages/tags.tsx +332 -0
  124. package/Influence-MW-AdServer-12-02-2026/client/src/pages/venues.tsx +381 -0
  125. package/Influence-MW-AdServer-12-02-2026/client/src/types/mapbox-gl-draw.d.ts +37 -0
  126. package/Influence-MW-AdServer-12-02-2026/client/src/types/react-simple-maps.d.ts +57 -0
  127. package/Influence-MW-AdServer-12-02-2026/components.json +20 -0
  128. package/Influence-MW-AdServer-12-02-2026/docs/PRD.md +3373 -0
  129. package/Influence-MW-AdServer-12-02-2026/docs/influence-feature-mapping.csv +498 -0
  130. package/Influence-MW-AdServer-12-02-2026/drizzle.config.ts +14 -0
  131. package/Influence-MW-AdServer-12-02-2026/package-lock.json +9672 -0
  132. package/Influence-MW-AdServer-12-02-2026/package.json +118 -0
  133. package/Influence-MW-AdServer-12-02-2026/postcss.config.js +6 -0
  134. package/Influence-MW-AdServer-12-02-2026/replit.md +91 -0
  135. package/Influence-MW-AdServer-12-02-2026/script/build.ts +67 -0
  136. package/Influence-MW-AdServer-12-02-2026/scripts/create-miro-diagrams.cjs +318 -0
  137. package/Influence-MW-AdServer-12-02-2026/scripts/create-remaining-diagrams.cjs +270 -0
  138. package/Influence-MW-AdServer-12-02-2026/server/index.ts +103 -0
  139. package/Influence-MW-AdServer-12-02-2026/server/recommendation-service.ts +319 -0
  140. package/Influence-MW-AdServer-12-02-2026/server/routes.ts +1890 -0
  141. package/Influence-MW-AdServer-12-02-2026/server/static.ts +19 -0
  142. package/Influence-MW-AdServer-12-02-2026/server/storage.ts +2058 -0
  143. package/Influence-MW-AdServer-12-02-2026/server/vite.ts +58 -0
  144. package/Influence-MW-AdServer-12-02-2026/shared/schema.ts +1595 -0
  145. package/Influence-MW-AdServer-12-02-2026/tailwind.config.ts +107 -0
  146. package/Influence-MW-AdServer-12-02-2026/tsconfig.json +23 -0
  147. package/Influence-MW-AdServer-12-02-2026/vite.config.ts +40 -0
  148. package/LINE_ITEM_BUDGET_FIELD_MAPPING.md +178 -0
  149. package/PCM/.env.example +92 -0
  150. package/PCM/README.md +558 -0
  151. package/PCM/docs/TEST_CASES.md +422 -0
  152. package/PCM/index.js +106 -0
  153. package/PCM/package-lock.json +3282 -0
  154. package/PCM/package.json +32 -0
  155. package/PCM/replit.md +64 -0
  156. package/PCM/schema.sql +495 -0
  157. package/PCM/scripts/export-schema.js +183 -0
  158. package/PCM/scripts/seed-comprehensive.js +631 -0
  159. package/PCM/scripts/seed-production.js +477 -0
  160. package/PCM/src/config/db.js +56 -0
  161. package/PCM/src/config/swagger.js +5975 -0
  162. package/PCM/src/dto/EmailRequestDTO.js +166 -0
  163. package/PCM/src/middleware/errorHandler.js +52 -0
  164. package/PCM/src/middleware/logger.js +26 -0
  165. package/PCM/src/migrations/001_add_campaign_mode_fields.sql +36 -0
  166. package/PCM/src/migrations/002_create_deal_id_counters.sql +22 -0
  167. package/PCM/src/migrations/003_update_publishers_column.sql +15 -0
  168. package/PCM/src/migrations/004_add_direct_dealtype_and_advertiser.sql +5 -0
  169. package/PCM/src/migrations/005_add_programmatic_fields_and_update_enums.sql +31 -0
  170. package/PCM/src/migrations/006_add_line_item_programmatic_fields.sql +12 -0
  171. package/PCM/src/migrations/007_add_line_item_direct_fields.sql +15 -0
  172. package/PCM/src/migrations/008_add_inventory_fields.sql +45 -0
  173. package/PCM/src/migrations/009_move_inventory_fields_to_metadata.sql +32 -0
  174. package/PCM/src/migrations/010_add_draft_status_and_line_items_count.sql +23 -0
  175. package/PCM/src/migrations/011_add_planning_field.sql +21 -0
  176. package/PCM/src/migrations/012_fix_inventory_composite_pk.sql +17 -0
  177. package/PCM/src/migrations/013_make_external_id_optional.sql +3 -0
  178. package/PCM/src/migrations/014_create_change_history.sql +38 -0
  179. package/PCM/src/migrations/016_create_publisher_insertion_orders.sql +33 -0
  180. package/PCM/src/migrations/017_fix_line_item_id_fk_reference.sql +86 -0
  181. package/PCM/src/migrations/018_create_approval_tables.sql +44 -0
  182. package/PCM/src/migrations/019_add_encrypted_token_column.sql +2 -0
  183. package/PCM/src/migrations/020_add_rejection_reason_to_deals.sql +10 -0
  184. package/PCM/src/migrations/021_add_publisher_external_id_to_inventories.sql +12 -0
  185. package/PCM/src/migrations/022_add_line_item_extended_fields.sql +24 -0
  186. package/PCM/src/migrations/023_add_base_price_fields.sql +8 -0
  187. package/PCM/src/migrations/run-migrations.js +46 -0
  188. package/PCM/src/models/ApprovalOTP.js +51 -0
  189. package/PCM/src/models/ApprovalToken.js +79 -0
  190. package/PCM/src/models/ChangeHistory.js +107 -0
  191. package/PCM/src/models/Deal.js +186 -0
  192. package/PCM/src/models/DealIdCounter.js +28 -0
  193. package/PCM/src/models/LineItem.js +227 -0
  194. package/PCM/src/models/LineItemCreative.js +89 -0
  195. package/PCM/src/models/LineItemInventory.js +115 -0
  196. package/PCM/src/models/PublisherInsertionOrder.js +93 -0
  197. package/PCM/src/models/TransactionHistory.js +34 -0
  198. package/PCM/src/models/associations.js +81 -0
  199. package/PCM/src/routes/approval.js +321 -0
  200. package/PCM/src/routes/creatives.js +437 -0
  201. package/PCM/src/routes/deals.js +1638 -0
  202. package/PCM/src/routes/digitalSignage.js +242 -0
  203. package/PCM/src/routes/insertionOrders.js +380 -0
  204. package/PCM/src/routes/lineItems.js +926 -0
  205. package/PCM/src/routes/system.js +384 -0
  206. package/PCM/src/services/ApprovalService.js +885 -0
  207. package/PCM/src/services/CampaignImportConverter.js +631 -0
  208. package/PCM/src/services/CampaignModeService.js +273 -0
  209. package/PCM/src/services/CampaignStatusService.js +395 -0
  210. package/PCM/src/services/ChangeHistoryService.js +316 -0
  211. package/PCM/src/services/DealIdService.js +94 -0
  212. package/PCM/src/services/DealResponseFormatter.js +90 -0
  213. package/PCM/src/services/EmailNotificationService.js +315 -0
  214. package/PCM/src/services/LineItemResponseFormatter.js +122 -0
  215. package/PCM/src/services/LineItemStatusService.js +380 -0
  216. package/PCM/src/tests/comprehensiveTestRunner.js +360 -0
  217. package/PCM/src/tests/comprehensiveTests.js +1277 -0
  218. package/PCM/src/tests/dealTypeUnitTests.js +1058 -0
  219. package/PCM/src/tests/testRunner.js +248 -0
  220. package/PCM/src/utils/caseConverter.js +92 -0
  221. package/PCM/src/utils/dealCalculations.js +206 -0
  222. package/PCM/src/utils/lineItemPayloadNormalizer.js +41 -0
  223. package/PCM/src/utils/payloadNormalizer.js +34 -0
  224. package/PCM/src/utils/sourceNormalizer.js +56 -0
  225. package/PCM/src/validators/creativeValidator.js +27 -0
  226. package/PCM/src/validators/dealValidator.js +203 -0
  227. package/PCM/src/validators/lineItemValidator.js +489 -0
  228. package/PCM/tests/approval-flows.test.js +238 -0
  229. package/PCM/tests/approval-workflow.test.js +291 -0
  230. package/PCM/tests/campaign-import-converter.test.js +543 -0
  231. package/PCM/tests/campaign-import-e2e.test.js +520 -0
  232. package/PCM/tests/campaign-status.test.js +539 -0
  233. package/PCM/tests/direct-publisher-split-reimport.test.js +460 -0
  234. package/PCM/tests/e2e/digital-signage.test.js +145 -0
  235. package/PCM/tests/e2e/search-filter-pagination.test.js +399 -0
  236. package/PCM/tests/e2e-comprehensive.test.js +3446 -0
  237. package/PCM/tests/edge-cases.test.js +340 -0
  238. package/PCM/tests/line-item-status.test.js +340 -0
  239. package/PCM/tests/seller-account-external-ids.test.js +877 -0
  240. package/PCM/tests/source-validation.test.js +324 -0
  241. package/PRD.md +3373 -0
  242. package/README.md +186 -0
  243. package/client/index.html +35 -0
  244. package/client/public/DEMO_STATUS.md +579 -0
  245. package/client/public/img/MW-logo-trans_1754045676555.png +0 -0
  246. package/client/public/locales/ar/approval.json +144 -0
  247. package/client/public/locales/ar/buyer.json +61 -0
  248. package/client/public/locales/ar/campaigns.json +1 -0
  249. package/client/public/locales/ar/common.json +218 -0
  250. package/client/public/locales/ar/contentHub.json +266 -0
  251. package/client/public/locales/ar/creatives.json +79 -0
  252. package/client/public/locales/ar/dashboard.json +57 -0
  253. package/client/public/locales/ar/deals.json +886 -0
  254. package/client/public/locales/ar/dsp.json +131 -0
  255. package/client/public/locales/ar/inventory.json +201 -0
  256. package/client/public/locales/ar/lineItems.json +553 -0
  257. package/client/public/locales/ar/navigation.json +48 -0
  258. package/client/public/locales/ar/wizard.json +1 -0
  259. package/client/public/locales/en/approval.json +144 -0
  260. package/client/public/locales/en/buyer.json +65 -0
  261. package/client/public/locales/en/campaigns.json +1 -0
  262. package/client/public/locales/en/common.json +218 -0
  263. package/client/public/locales/en/contentHub.json +266 -0
  264. package/client/public/locales/en/creatives.json +79 -0
  265. package/client/public/locales/en/dashboard.json +57 -0
  266. package/client/public/locales/en/deals.json +886 -0
  267. package/client/public/locales/en/dsp.json +131 -0
  268. package/client/public/locales/en/inventory.json +201 -0
  269. package/client/public/locales/en/lineItems.json +659 -0
  270. package/client/public/locales/en/navigation.json +48 -0
  271. package/client/public/locales/en/wizard.json +1 -0
  272. package/client/public/locales/ja/approval.json +144 -0
  273. package/client/public/locales/ja/buyer.json +61 -0
  274. package/client/public/locales/ja/campaigns.json +1 -0
  275. package/client/public/locales/ja/common.json +218 -0
  276. package/client/public/locales/ja/contentHub.json +266 -0
  277. package/client/public/locales/ja/creatives.json +79 -0
  278. package/client/public/locales/ja/dashboard.json +57 -0
  279. package/client/public/locales/ja/deals.json +886 -0
  280. package/client/public/locales/ja/dsp.json +131 -0
  281. package/client/public/locales/ja/inventory.json +201 -0
  282. package/client/public/locales/ja/lineItems.json +553 -0
  283. package/client/public/locales/ja/navigation.json +48 -0
  284. package/client/public/locales/ja/wizard.json +1 -0
  285. package/client/public/locales/zh/approval.json +144 -0
  286. package/client/public/locales/zh/buyer.json +61 -0
  287. package/client/public/locales/zh/campaigns.json +1 -0
  288. package/client/public/locales/zh/common.json +218 -0
  289. package/client/public/locales/zh/contentHub.json +266 -0
  290. package/client/public/locales/zh/creatives.json +79 -0
  291. package/client/public/locales/zh/dashboard.json +57 -0
  292. package/client/public/locales/zh/deals.json +886 -0
  293. package/client/public/locales/zh/dsp.json +131 -0
  294. package/client/public/locales/zh/inventory.json +201 -0
  295. package/client/public/locales/zh/lineItems.json +553 -0
  296. package/client/public/locales/zh/navigation.json +48 -0
  297. package/client/public/locales/zh/wizard.json +1 -0
  298. package/client/public/manifest.json +36 -0
  299. package/client/src/App.tsx +464 -0
  300. package/client/src/components/app-sidebar.tsx +312 -0
  301. package/client/src/components/approval/approval-decision-form.test.tsx +294 -0
  302. package/client/src/components/approval/approval-decision-form.tsx +326 -0
  303. package/client/src/components/approval/approval-sheet.tsx +631 -0
  304. package/client/src/components/approval/line-item-details-sheet.tsx +371 -0
  305. package/client/src/components/approval/otp-verification.test.tsx +337 -0
  306. package/client/src/components/approval/otp-verification.tsx +180 -0
  307. package/client/src/components/content-hub/bulk-transcode-dialog.tsx +379 -0
  308. package/client/src/components/content-hub/content-hub-manager-v2.tsx +574 -0
  309. package/client/src/components/content-hub/content-hub-manager.tsx +330 -0
  310. package/client/src/components/content-hub/creative-card.tsx +456 -0
  311. package/client/src/components/content-hub/creative-detail-sheet.tsx +685 -0
  312. package/client/src/components/content-hub/creative-filters.tsx +457 -0
  313. package/client/src/components/content-hub/creative-grid.tsx +329 -0
  314. package/client/src/components/content-hub/creative-selector.tsx +415 -0
  315. package/client/src/components/content-hub/creative-upload.tsx +547 -0
  316. package/client/src/components/content-hub/folder-dialogs.tsx +445 -0
  317. package/client/src/components/content-hub/folder-list.tsx +280 -0
  318. package/client/src/components/content-hub/review-dialogs.tsx +268 -0
  319. package/client/src/components/content-hub/transcode-dialog.tsx +226 -0
  320. package/client/src/components/creative-library/creative-details-view.tsx +446 -0
  321. package/client/src/components/creative-library/creative-filters-panel.tsx +203 -0
  322. package/client/src/components/creative-library/creative-list.tsx +360 -0
  323. package/client/src/components/creative-library/creative-status-badge.tsx +71 -0
  324. package/client/src/components/creative-library/folder-card.tsx +78 -0
  325. package/client/src/components/creative-library/index.ts +27 -0
  326. package/client/src/components/creative-library/new-creative-card.tsx +211 -0
  327. package/client/src/components/creative-library/upload-creative-dialog.tsx +261 -0
  328. package/client/src/components/dashboard-overview.tsx +109 -0
  329. package/client/src/components/deals/approval-history-panel.test.tsx +240 -0
  330. package/client/src/components/deals/approval-history-panel.tsx +156 -0
  331. package/client/src/components/deals/deal-status-badge.tsx +92 -0
  332. package/client/src/components/deals/import-from-planner-dialog.tsx +399 -0
  333. package/client/src/components/deals/market-insights-panel.tsx +237 -0
  334. package/client/src/components/deals/reopen-deal-sheet.tsx +191 -0
  335. package/client/src/components/deals/request-approval-sheet.test.tsx +323 -0
  336. package/client/src/components/deals/request-approval-sheet.tsx +136 -0
  337. package/client/src/components/deals/resend-approval-sheet.tsx +201 -0
  338. package/client/src/components/direct-campaigns/campaign-card.tsx +283 -0
  339. package/client/src/components/direct-campaigns/deal-filter-panel.tsx +325 -0
  340. package/client/src/components/inventory/advanced-filters-panel.tsx +273 -0
  341. package/client/src/components/inventory/csv-upload-modal.tsx +639 -0
  342. package/client/src/components/inventory/inventory-availability-view.tsx +486 -0
  343. package/client/src/components/inventory/inventory-details-sheet.tsx +376 -0
  344. package/client/src/components/inventory/inventory-map-view.tsx +596 -0
  345. package/client/src/components/inventory/inventory-settings-menu.tsx +52 -0
  346. package/client/src/components/language-switcher.tsx +53 -0
  347. package/client/src/components/line-items/campaign-forecast-panel.tsx +138 -0
  348. package/client/src/components/line-items/form-insights.tsx +89 -0
  349. package/client/src/components/line-items/geofencing/LocationCsvUploadDrawer.tsx +100 -0
  350. package/client/src/components/line-items/geofencing/POIDropdown.tsx +379 -0
  351. package/client/src/components/line-items/geofencing/SelectedLocationsSidebar.tsx +436 -0
  352. package/client/src/components/line-items/geofencing/ViewFileLocationDrawer.tsx +199 -0
  353. package/client/src/components/line-items/geofencing/components/ExistingFilesTab.tsx +268 -0
  354. package/client/src/components/line-items/geofencing/components/TemplateDownloadSection.tsx +59 -0
  355. package/client/src/components/line-items/geofencing/components/UploadTab.tsx +215 -0
  356. package/client/src/components/line-items/geofencing-map.tsx +1270 -0
  357. package/client/src/components/line-items/inventory-availability-section.tsx +178 -0
  358. package/client/src/components/line-items/line-item-schedule-manager.tsx +313 -0
  359. package/client/src/components/line-items/manual-inventory-drawer.tsx +346 -0
  360. package/client/src/components/line-items/planner-inventory-card.tsx +495 -0
  361. package/client/src/components/line-items/planner-schedule-grid.tsx +495 -0
  362. package/client/src/components/line-items/schedule-rule-editor.tsx +649 -0
  363. package/client/src/components/line-items/schedule-rule-types.ts +122 -0
  364. package/client/src/components/line-items/steps/creatives-step.tsx +681 -0
  365. package/client/src/components/line-items/steps/inventory-schedule-step.tsx +1596 -0
  366. package/client/src/components/line-items/steps/inventory-step.tsx +1533 -0
  367. package/client/src/components/line-items/steps/line-item-details-step.tsx +916 -0
  368. package/client/src/components/line-items/steps/schedule-step.tsx +273 -0
  369. package/client/src/components/line-items/steps/summary-step.tsx +680 -0
  370. package/client/src/components/line-items/steps/targeting-step.tsx +1708 -0
  371. package/client/src/components/product-switcher.tsx +105 -0
  372. package/client/src/components/protected-route.tsx +49 -0
  373. package/client/src/components/skip-link.tsx +22 -0
  374. package/client/src/components/stat-card.tsx +53 -0
  375. package/client/src/components/status-badge.tsx +96 -0
  376. package/client/src/components/ui/hierarchical-venue-selector.tsx +389 -0
  377. package/client/src/components/ui/toaster.tsx +111 -0
  378. package/client/src/contexts/auth-context.tsx +181 -0
  379. package/client/src/contexts/sidebar-state.tsx +50 -0
  380. package/client/src/contexts/theme-context.tsx +66 -0
  381. package/client/src/data/campaign-data.json +107 -0
  382. package/client/src/data/countries.json +22 -0
  383. package/client/src/hooks/use-approval.ts +366 -0
  384. package/client/src/hooks/use-keyboard-shortcuts.ts +74 -0
  385. package/client/src/hooks/use-media-query.ts +46 -0
  386. package/client/src/hooks/use-mobile.tsx +19 -0
  387. package/client/src/hooks/use-page-title.ts +21 -0
  388. package/client/src/hooks/use-toast.ts +195 -0
  389. package/client/src/index.css +694 -0
  390. package/client/src/lib/__tests__/accessibility.test.ts +104 -0
  391. package/client/src/lib/__tests__/date-utils.test.ts +199 -0
  392. package/client/src/lib/__tests__/dsp-buyer-api.test.ts +127 -0
  393. package/client/src/lib/__tests__/dsp-buyer-integration.test.ts +247 -0
  394. package/client/src/lib/__tests__/storage-utils.test.ts +167 -0
  395. package/client/src/lib/__tests__/utils.test.ts +57 -0
  396. package/client/src/lib/accessibility.ts +141 -0
  397. package/client/src/lib/api-config.ts +9 -0
  398. package/client/src/lib/auth-service.ts +209 -0
  399. package/client/src/lib/campaign-creative-api.ts +82 -0
  400. package/client/src/lib/company-api.ts +61 -0
  401. package/client/src/lib/content-hub-api.ts +407 -0
  402. package/client/src/lib/creative-mapper.ts +61 -0
  403. package/client/src/lib/date-utils.ts +119 -0
  404. package/client/src/lib/deal-helpers.ts +220 -0
  405. package/client/src/lib/dsp-buyer-api.ts +196 -0
  406. package/client/src/lib/geo-import-api.ts +151 -0
  407. package/client/src/lib/google-poi-api.ts +305 -0
  408. package/client/src/lib/i18n/__tests__/formatting.test.ts +202 -0
  409. package/client/src/lib/i18n/formatting.ts +130 -0
  410. package/client/src/lib/i18n/index.ts +8 -0
  411. package/client/src/lib/i18n-compat.ts +76 -0
  412. package/client/src/lib/influence-deals-api.ts +896 -0
  413. package/client/src/lib/inventory-api.ts +399 -0
  414. package/client/src/lib/oauth-service.ts +678 -0
  415. package/client/src/lib/poi-types.ts +75 -0
  416. package/client/src/lib/queryClient.ts +144 -0
  417. package/client/src/lib/recommendation-api.ts +380 -0
  418. package/client/src/lib/storage-utils.ts +104 -0
  419. package/client/src/lib/tolgee.ts +85 -0
  420. package/client/src/lib/utils.ts +0 -0
  421. package/client/src/main.tsx +67 -0
  422. package/client/src/mapbox-draw-modes.d.ts +32 -0
  423. package/client/src/pages/all-folders.tsx +203 -0
  424. package/client/src/pages/auth-callback.tsx +115 -0
  425. package/client/src/pages/buyer-form.tsx +339 -0
  426. package/client/src/pages/buyer-list.tsx +622 -0
  427. package/client/src/pages/content-hub.tsx +1358 -0
  428. package/client/src/pages/create-deal.tsx +2093 -0
  429. package/client/src/pages/creative-assignment-page.tsx +548 -0
  430. package/client/src/pages/creatives.tsx +5 -0
  431. package/client/src/pages/custom-pois.tsx +425 -0
  432. package/client/src/pages/dashboard.tsx +615 -0
  433. package/client/src/pages/deal-history.tsx +434 -0
  434. package/client/src/pages/deal-line-items.tsx +1703 -0
  435. package/client/src/pages/demo-status.tsx +113 -0
  436. package/client/src/pages/direct-campaign-details.tsx +361 -0
  437. package/client/src/pages/direct-campaigns-new.tsx +824 -0
  438. package/client/src/pages/dsp-form.tsx +803 -0
  439. package/client/src/pages/dsp-list.tsx +239 -0
  440. package/client/src/pages/folder-content.tsx +336 -0
  441. package/client/src/pages/integrations.tsx +429 -0
  442. package/client/src/pages/line-item-creatives.tsx +789 -0
  443. package/client/src/pages/line-item-detail-page.tsx +684 -0
  444. package/client/src/pages/line-item-form-page.tsx +3261 -0
  445. package/client/src/pages/line-item-wizard.tsx +1207 -0
  446. package/client/src/pages/login.tsx +154 -0
  447. package/client/src/pages/not-found.tsx +23 -0
  448. package/client/src/pages/proof-of-play.tsx +397 -0
  449. package/client/src/pages/public-approval.tsx +551 -0
  450. package/client/src/pages/reports.tsx +231 -0
  451. package/client/src/pages/settings.tsx +760 -0
  452. package/client/src/pages/signals.tsx +389 -0
  453. package/client/src/pages/tags.tsx +318 -0
  454. package/client/src/pages/test-results.tsx +328 -0
  455. package/client/src/store/hooks.ts +5 -0
  456. package/client/src/store/index.ts +15 -0
  457. package/client/src/store/mapMarkerLocationsSlice.ts +241 -0
  458. package/client/src/styles/design-tokens.css +324 -0
  459. package/client/src/test/setup.ts +261 -0
  460. package/client/src/test/test-utils.tsx +40 -0
  461. package/client/src/types/approval.ts +221 -0
  462. package/client/src/types/content-hub.ts +209 -0
  463. package/client/src/types/geofencing.ts +67 -0
  464. package/client/src/types/transcoding.ts +140 -0
  465. package/client/src/vite-env.d.ts +18 -0
  466. package/components.json +20 -0
  467. package/creative-api.json +1 -0
  468. package/docs/AI_REFERENCE.md +459 -0
  469. package/docs/MWDesign-Prompt.md +132 -0
  470. package/docs/MWDesign-System.md +344 -0
  471. package/docs/test-plan.md +277 -0
  472. package/e2e/AUTONOMOUS-TESTING.md +406 -0
  473. package/e2e/README.md +219 -0
  474. package/e2e/autonomous-flow.spec.ts +308 -0
  475. package/e2e/debug-sso.spec.ts +163 -0
  476. package/e2e/direct-campaigns.spec.ts +219 -0
  477. package/e2e/explore-sso.spec.ts +149 -0
  478. package/e2e/fixtures/auth.ts +26 -0
  479. package/e2e/fixtures/enhanced-test.ts +331 -0
  480. package/e2e/pagination.spec.ts +280 -0
  481. package/e2e/view-toggle.spec.ts +312 -0
  482. package/generated-icon.png +0 -0
  483. package/i18next-scanner.config.cjs +46 -0
  484. package/package.json +141 -0
  485. package/playwright.config.ts +93 -0
  486. package/postcss.config.js +6 -0
  487. package/replit.md +196 -0
  488. package/screenshot-after-login.png +0 -0
  489. package/screenshot-contenthub-grid.png +0 -0
  490. package/screenshot-contenthub-list-fixed.png +0 -0
  491. package/screenshot-contenthub-list.png +0 -0
  492. package/screenshot-create-deal.png +0 -0
  493. package/screenshot-dashboard.png +0 -0
  494. package/screenshot-deals.png +0 -0
  495. package/screenshot-login-filled.png +0 -0
  496. package/screenshot-login.png +0 -0
  497. package/screenshot.mjs +24 -0
  498. package/scripts/deploy-stg.sh +185 -0
  499. package/shared/direct-io-schema.ts +383 -0
  500. package/shared/schema.ts +439 -0
  501. package/shared/screen-types.ts +149 -0
  502. package/springdocDefault.json +1 -0
  503. package/swagger-ui-bundle.js +2 -0
  504. package/swagger-ui-init.js +10316 -0
  505. package/tailwind.config.ts +282 -0
  506. package/terraform/README.md +306 -0
  507. package/terraform/cloudfront.tf +289 -0
  508. package/terraform/ecs.tf +727 -0
  509. package/terraform/environments/dev.tfvars +59 -0
  510. package/terraform/environments/production.tfvars +60 -0
  511. package/terraform/main.tf +47 -0
  512. package/terraform/outputs.tf +145 -0
  513. package/terraform/s3.tf +192 -0
  514. package/terraform/variables.tf +226 -0
  515. package/terraform/waf.tf +165 -0
  516. package/terraform-frontend/.terraform.lock.hcl +25 -0
  517. package/terraform-frontend/README.md +85 -0
  518. package/terraform-frontend/cloudfront.tf +125 -0
  519. package/terraform-frontend/main.tf +31 -0
  520. package/terraform-frontend/outputs.tf +24 -0
  521. package/terraform-frontend/terraform.tfvars +12 -0
  522. package/terraform-frontend/variables.tf +53 -0
  523. package/tsconfig.json +23 -0
  524. package/vite.config.ts +226 -0
  525. package/vitest.config.ts +56 -0
@@ -0,0 +1,282 @@
1
+ import type { Config } from "tailwindcss";
2
+
3
+ export default {
4
+ darkMode: ["class"],
5
+ content: [
6
+ "./client/index.html",
7
+ "./client/src/**/*.{js,jsx,ts,tsx}",
8
+ "./node_modules/@moving-walls/design-system/dist/**/*.{js,mjs}",
9
+ ],
10
+ theme: {
11
+ extend: {
12
+ spacing: {
13
+ '18': '4.5rem', // 72px - for header height
14
+ },
15
+ borderRadius: {
16
+ lg: ".5625rem", /* 9px */
17
+ md: ".375rem", /* 6px */
18
+ sm: ".1875rem", /* 3px */
19
+ "2xs": "var(--radius-2xs)",
20
+ xs: "var(--radius-xs)",
21
+ s: "var(--radius-s)",
22
+ m: "var(--radius-m)",
23
+ l: "var(--radius-l)",
24
+ xl: "var(--radius-xl)",
25
+ "2xl": "var(--radius-2xl)",
26
+ "3xl": "var(--radius-3xl)",
27
+ "4xl": "var(--radius-4xl)",
28
+ "5xl": "var(--radius-5xl)",
29
+ },
30
+ colors: {
31
+ // Moving Walls Brand Colors
32
+ "container-border": "var(--color-container-border)",
33
+ "mw-primary": {
34
+ 50: "var(--color-mw-primary-50)",
35
+ 100: "var(--color-mw-primary-100)",
36
+ 200: "var(--color-mw-primary-200)",
37
+ 300: "var(--color-mw-primary-300)",
38
+ 400: "var(--color-mw-primary-400)",
39
+ 500: "var(--color-mw-primary-500)",
40
+ 600: "var(--color-mw-primary-600)",
41
+ 700: "var(--color-mw-primary-700)",
42
+ 800: "var(--color-mw-primary-800)",
43
+ 900: "var(--color-mw-primary-900)",
44
+ },
45
+ "mw-secondary": {
46
+ 50: "var(--color-mw-secondary-50)",
47
+ 100: "var(--color-mw-secondary-100)",
48
+ 200: "var(--color-mw-secondary-200)",
49
+ 300: "var(--color-mw-secondary-300)",
50
+ 400: "var(--color-mw-secondary-400)",
51
+ 500: "var(--color-mw-secondary-500)",
52
+ 600: "var(--color-mw-secondary-600)",
53
+ 700: "var(--color-mw-secondary-700)",
54
+ 800: "var(--color-mw-secondary-800)",
55
+ 900: "var(--color-mw-secondary-900)",
56
+ },
57
+ "mw-neutral": {
58
+ 50: "var(--color-mw-neutral-50)",
59
+ 100: "var(--color-mw-neutral-100)",
60
+ 200: "var(--color-mw-neutral-200)",
61
+ 300: "var(--color-mw-neutral-300)",
62
+ 400: "var(--color-mw-neutral-400)",
63
+ 500: "var(--color-mw-neutral-500)",
64
+ 600: "var(--color-mw-neutral-600)",
65
+ 700: "var(--color-mw-neutral-700)",
66
+ 800: "var(--color-mw-neutral-800)",
67
+ 900: "var(--color-mw-neutral-900)",
68
+ },
69
+ "mw-success": {
70
+ 50: "var(--color-mw-success-50)",
71
+ 100: "var(--color-mw-success-100)",
72
+ 200: "var(--color-mw-success-200)",
73
+ 300: "var(--color-mw-success-300)",
74
+ 400: "var(--color-mw-success-400)",
75
+ 500: "var(--color-mw-success-500)",
76
+ 600: "var(--color-mw-success-600)",
77
+ 700: "var(--color-mw-success-700)",
78
+ 800: "var(--color-mw-success-800)",
79
+ 900: "var(--color-mw-success-900)",
80
+ },
81
+ "mw-error": {
82
+ 50: "var(--color-mw-error-50)",
83
+ 100: "var(--color-mw-error-100)",
84
+ 200: "var(--color-mw-error-200)",
85
+ 300: "var(--color-mw-error-300)",
86
+ 400: "var(--color-mw-error-400)",
87
+ 500: "var(--color-mw-error-500)",
88
+ 600: "var(--color-mw-error-600)",
89
+ 700: "var(--color-mw-error-700)",
90
+ 800: "var(--color-mw-error-800)",
91
+ 900: "var(--color-mw-error-900)",
92
+ },
93
+ "mw-warning": {
94
+ 50: "var(--color-mw-warning-50)",
95
+ 100: "var(--color-mw-warning-100)",
96
+ 200: "var(--color-mw-warning-200)",
97
+ 300: "var(--color-mw-warning-300)",
98
+ 400: "var(--color-mw-warning-400)",
99
+ 500: "var(--color-mw-warning-500)",
100
+ 600: "var(--color-mw-warning-600)",
101
+ 700: "var(--color-mw-warning-700)",
102
+ 800: "var(--color-mw-warning-800)",
103
+ 900: "var(--color-mw-warning-900)",
104
+ },
105
+ "mw-info": {
106
+ 50: "var(--color-mw-info-50)",
107
+ 100: "var(--color-mw-info-100)",
108
+ 200: "var(--color-mw-info-200)",
109
+ 300: "var(--color-mw-info-300)",
110
+ 400: "var(--color-mw-info-400)",
111
+ 500: "var(--color-mw-info-500)",
112
+ 600: "var(--color-mw-info-600)",
113
+ 700: "var(--color-mw-info-700)",
114
+ 800: "var(--color-mw-info-800)",
115
+ 900: "var(--color-mw-info-900)",
116
+ },
117
+ // Extended palettes (aligned with mw-planner-FE)
118
+ "mw-purple": {
119
+ 50: "var(--color-mw-purple-50, #ece1eb)",
120
+ 500: "var(--color-mw-purple-500, #7e537a)",
121
+ 600: "var(--color-mw-purple-600, #5f3e5c)",
122
+ },
123
+ "mw-purple-warning": {
124
+ 50: "var(--color-mw-purple-warning-50, #f3ebfe)",
125
+ 500: "var(--color-mw-purple-warning-500, #8a38f5)",
126
+ },
127
+ "mw-orange-warning": {
128
+ 50: "var(--color-mw-orange-warning-50, #fef1eb)",
129
+ 500: "var(--color-mw-orange-warning-500, #f57738)",
130
+ 800: "var(--color-mw-orange-warning-800, #883d1b)",
131
+ },
132
+ "mw-light-green": {
133
+ 50: "var(--color-mw-light-green-50, #f3f7e8)",
134
+ 500: "var(--color-mw-light-green-500, #8bc24b)",
135
+ 600: "var(--color-mw-light-green-600, #7cb243)",
136
+ },
137
+ "mw-blush-grey": {
138
+ 50: "var(--color-mw-blush-grey-50, #c8d7dc)",
139
+ 500: "var(--color-mw-blush-grey-500, #486a74)",
140
+ },
141
+ "mw-teal": {
142
+ 600: "var(--color-mw-teal-600, #0c6e64)",
143
+ },
144
+ "mw-dark-grey": {
145
+ 50: "var(--color-mw-dark-grey-50, #f2f2f2)",
146
+ 100: "var(--color-mw-dark-grey-100, #d7d7d7)",
147
+ },
148
+ // Backward-compat aliases for design system components using legacy names
149
+ "mw-gray": {
150
+ 50: "var(--color-mw-neutral-50)",
151
+ 100: "var(--color-mw-neutral-100)",
152
+ 200: "var(--color-mw-neutral-200)",
153
+ 300: "var(--color-mw-neutral-300)",
154
+ 400: "var(--color-mw-neutral-400)",
155
+ 500: "var(--color-mw-neutral-500)",
156
+ 600: "var(--color-mw-neutral-600)",
157
+ 700: "var(--color-mw-neutral-700)",
158
+ 800: "var(--color-mw-neutral-800)",
159
+ 900: "var(--color-mw-neutral-900)",
160
+ },
161
+ "mw-blue": {
162
+ 50: "var(--color-mw-primary-50)",
163
+ 100: "var(--color-mw-primary-100)",
164
+ 200: "var(--color-mw-primary-200)",
165
+ 300: "var(--color-mw-primary-300)",
166
+ 400: "var(--color-mw-primary-400)",
167
+ 500: "var(--color-mw-primary-500)",
168
+ 600: "var(--color-mw-primary-600)",
169
+ 700: "var(--color-mw-primary-700)",
170
+ 800: "var(--color-mw-primary-800)",
171
+ 900: "var(--color-mw-primary-900)",
172
+ },
173
+ // Flat / base colors (regular buttons)
174
+ background: "hsl(var(--background) / <alpha-value>)",
175
+ foreground: "hsl(var(--foreground) / <alpha-value>)",
176
+ border: "hsl(var(--border) / <alpha-value>)",
177
+ input: "hsl(var(--input) / <alpha-value>)",
178
+ card: {
179
+ DEFAULT: "hsl(var(--card) / <alpha-value>)",
180
+ foreground: "hsl(var(--card-foreground) / <alpha-value>)",
181
+ border: "hsl(var(--card-border) / <alpha-value>)",
182
+ },
183
+ popover: {
184
+ DEFAULT: "hsl(var(--popover) / <alpha-value>)",
185
+ foreground: "hsl(var(--popover-foreground) / <alpha-value>)",
186
+ border: "hsl(var(--popover-border) / <alpha-value>)",
187
+ },
188
+ primary: {
189
+ DEFAULT: "hsl(var(--primary) / <alpha-value>)",
190
+ foreground: "hsl(var(--primary-foreground) / <alpha-value>)",
191
+ border: "var(--primary-border)",
192
+ },
193
+ secondary: {
194
+ DEFAULT: "hsl(var(--secondary) / <alpha-value>)",
195
+ foreground: "hsl(var(--secondary-foreground) / <alpha-value>)",
196
+ border: "var(--secondary-border)",
197
+ },
198
+ muted: {
199
+ DEFAULT: "hsl(var(--muted) / <alpha-value>)",
200
+ foreground: "hsl(var(--muted-foreground) / <alpha-value>)",
201
+ border: "var(--muted-border)",
202
+ },
203
+ accent: {
204
+ DEFAULT: "hsl(var(--accent) / <alpha-value>)",
205
+ foreground: "hsl(var(--accent-foreground) / <alpha-value>)",
206
+ border: "var(--accent-border)",
207
+ },
208
+ destructive: {
209
+ DEFAULT: "hsl(var(--destructive) / <alpha-value>)",
210
+ foreground: "hsl(var(--destructive-foreground) / <alpha-value>)",
211
+ border: "var(--destructive-border)",
212
+ },
213
+ ring: "hsl(var(--ring) / <alpha-value>)",
214
+ chart: {
215
+ "1": "hsl(var(--chart-1) / <alpha-value>)",
216
+ "2": "hsl(var(--chart-2) / <alpha-value>)",
217
+ "3": "hsl(var(--chart-3) / <alpha-value>)",
218
+ "4": "hsl(var(--chart-4) / <alpha-value>)",
219
+ "5": "hsl(var(--chart-5) / <alpha-value>)",
220
+ },
221
+ sidebar: {
222
+ ring: "hsl(var(--sidebar-ring) / <alpha-value>)",
223
+ DEFAULT: "hsl(var(--sidebar) / <alpha-value>)",
224
+ foreground: "hsl(var(--sidebar-foreground) / <alpha-value>)",
225
+ border: "hsl(var(--sidebar-border) / <alpha-value>)",
226
+ },
227
+ "sidebar-primary": {
228
+ DEFAULT: "hsl(var(--sidebar-primary) / <alpha-value>)",
229
+ foreground: "hsl(var(--sidebar-primary-foreground) / <alpha-value>)",
230
+ border: "var(--sidebar-primary-border)",
231
+ },
232
+ "sidebar-accent": {
233
+ DEFAULT: "hsl(var(--sidebar-accent) / <alpha-value>)",
234
+ foreground: "hsl(var(--sidebar-accent-foreground) / <alpha-value>)",
235
+ border: "var(--sidebar-accent-border)"
236
+ },
237
+ status: {
238
+ online: "rgb(34 197 94)",
239
+ away: "rgb(245 158 11)",
240
+ busy: "rgb(239 68 68)",
241
+ offline: "rgb(156 163 175)",
242
+ },
243
+ success: {
244
+ DEFAULT: "hsl(var(--success) / <alpha-value>)",
245
+ foreground: "hsl(var(--success-foreground) / <alpha-value>)",
246
+ },
247
+ warning: {
248
+ DEFAULT: "hsl(var(--warning) / <alpha-value>)",
249
+ foreground: "hsl(var(--warning-foreground) / <alpha-value>)",
250
+ },
251
+ error: {
252
+ DEFAULT: "hsl(var(--error) / <alpha-value>)",
253
+ foreground: "hsl(var(--error-foreground) / <alpha-value>)",
254
+ },
255
+ info: {
256
+ DEFAULT: "hsl(var(--info) / <alpha-value>)",
257
+ foreground: "hsl(var(--info-foreground) / <alpha-value>)",
258
+ },
259
+ },
260
+ fontFamily: {
261
+ sans: ["Poppins", "var(--font-sans)", "ui-sans-serif", "system-ui", "-apple-system", "BlinkMacSystemFont", "Segoe UI", "Roboto", "sans-serif"],
262
+ serif: ["var(--font-serif)"],
263
+ mono: ["var(--font-mono)"],
264
+ },
265
+ keyframes: {
266
+ "accordion-down": {
267
+ from: { height: "0" },
268
+ to: { height: "var(--radix-accordion-content-height)" },
269
+ },
270
+ "accordion-up": {
271
+ from: { height: "var(--radix-accordion-content-height)" },
272
+ to: { height: "0" },
273
+ },
274
+ },
275
+ animation: {
276
+ "accordion-down": "accordion-down 0.2s ease-out",
277
+ "accordion-up": "accordion-up 0.2s ease-out",
278
+ },
279
+ },
280
+ },
281
+ plugins: [require("tailwindcss-animate"), require("@tailwindcss/typography")],
282
+ } satisfies Config;
@@ -0,0 +1,306 @@
1
+ # Terraform Infrastructure for Ad Server Platform
2
+
3
+ This directory contains Terraform configurations for deploying the Ad Server platform to AWS with CloudFront CDN.
4
+
5
+ ## Architecture Overview
6
+
7
+ The infrastructure includes:
8
+ - **CloudFront** - Global CDN for frontend and static assets
9
+ - **S3** - Storage for frontend build and creative assets
10
+ - **ECS Fargate** - Containerized backend API
11
+ - **Application Load Balancer** - Traffic distribution for ECS
12
+ - **WAF** - Web Application Firewall for security
13
+ - **ACM** - SSL/TLS certificates
14
+ - **Route53** - DNS management
15
+ - **ECR** - Docker image registry
16
+ - **CloudWatch** - Logging and monitoring
17
+
18
+ ## Prerequisites
19
+
20
+ 1. **AWS Account** with appropriate permissions
21
+ 2. **Terraform** >= 1.0 installed
22
+ 3. **AWS CLI** configured with credentials
23
+ 4. **Route53 Hosted Zone** for your domain
24
+ 5. **PostgreSQL Database** (Neon, RDS, or external)
25
+
26
+ ## File Structure
27
+
28
+ ```
29
+ terraform/
30
+ ├── main.tf # Provider and backend configuration
31
+ ├── variables.tf # Variable definitions
32
+ ├── outputs.tf # Output values
33
+ ├── s3.tf # S3 buckets for frontend and assets
34
+ ├── cloudfront.tf # CloudFront distribution
35
+ ├── ecs.tf # ECS cluster, tasks, and services
36
+ ├── waf.tf # WAF rules and configuration
37
+ ├── environments/
38
+ │ ├── dev.tfvars # Development environment
39
+ │ └── production.tfvars # Production environment
40
+ └── README.md # This file
41
+ ```
42
+
43
+ ## Quick Start
44
+
45
+ ### 1. Initialize Terraform
46
+
47
+ ```bash
48
+ cd terraform
49
+ terraform init
50
+ ```
51
+
52
+ ### 2. Create S3 Backend (First Time Only)
53
+
54
+ Before running Terraform, create the S3 bucket and DynamoDB table for state management:
55
+
56
+ ```bash
57
+ aws s3api create-bucket \
58
+ --bucket adserver-terraform-state \
59
+ --region us-east-1
60
+
61
+ aws s3api put-bucket-versioning \
62
+ --bucket adserver-terraform-state \
63
+ --versioning-configuration Status=Enabled
64
+
65
+ aws dynamodb create-table \
66
+ --table-name adserver-terraform-locks \
67
+ --attribute-definitions AttributeName=LockID,AttributeType=S \
68
+ --key-schema AttributeName=LockID,KeyType=HASH \
69
+ --billing-mode PAY_PER_REQUEST \
70
+ --region us-east-1
71
+ ```
72
+
73
+ ### 3. Configure Environment Variables
74
+
75
+ Edit the appropriate `.tfvars` file:
76
+
77
+ ```bash
78
+ # For development
79
+ nano environments/dev.tfvars
80
+
81
+ # For production
82
+ nano environments/production.tfvars
83
+ ```
84
+
85
+ Update the following values:
86
+ - `hosted_zone_id` - Your Route53 Hosted Zone ID
87
+ - `domain_name` - Your domain name
88
+ - `database_url` - Your PostgreSQL connection string
89
+ - `session_secret` - A secure random string
90
+
91
+ ### 4. Plan Deployment
92
+
93
+ ```bash
94
+ # Development
95
+ terraform plan -var-file=environments/dev.tfvars
96
+
97
+ # Production
98
+ terraform plan -var-file=environments/production.tfvars
99
+ ```
100
+
101
+ ### 5. Apply Configuration
102
+
103
+ ```bash
104
+ # Development
105
+ terraform apply -var-file=environments/dev.tfvars
106
+
107
+ # Production
108
+ terraform apply -var-file=environments/production.tfvars
109
+ ```
110
+
111
+ ## Deployment Workflow
112
+
113
+ ### Initial Setup
114
+
115
+ 1. **Deploy Infrastructure**
116
+ ```bash
117
+ terraform apply -var-file=environments/production.tfvars
118
+ ```
119
+
120
+ 2. **Build and Push Docker Image**
121
+ ```bash
122
+ # Get ECR login
123
+ aws ecr get-login-password --region us-east-1 | \
124
+ docker login --username AWS --password-stdin <ECR_URL>
125
+
126
+ # Build image
127
+ docker build -t adserver:latest .
128
+
129
+ # Tag and push
130
+ docker tag adserver:latest <ECR_URL>:latest
131
+ docker push <ECR_URL>:latest
132
+ ```
133
+
134
+ 3. **Deploy Frontend to S3**
135
+ ```bash
136
+ # Build frontend
137
+ cd adserver
138
+ npm run build
139
+
140
+ # Sync to S3
141
+ aws s3 sync dist/client s3://adserver-prod-frontend/ --delete
142
+
143
+ # Invalidate CloudFront cache
144
+ aws cloudfront create-invalidation \
145
+ --distribution-id <DISTRIBUTION_ID> \
146
+ --paths "/*"
147
+ ```
148
+
149
+ ### CI/CD Integration
150
+
151
+ The GitLab CI/CD pipeline (`.gitlab-ci.yml`) automatically:
152
+ 1. Builds the Docker image
153
+ 2. Pushes to ECR
154
+ 3. Updates ECS service
155
+ 4. Deploys frontend to S3
156
+ 5. Invalidates CloudFront cache
157
+
158
+ ## Resource Naming Convention
159
+
160
+ Resources are named using the pattern:
161
+ ```
162
+ {project_name}-{environment}-{resource_type}
163
+ ```
164
+
165
+ Example: `adserver-production-cluster`
166
+
167
+ ## Cost Optimization
168
+
169
+ ### Development Environment
170
+ - Reduced ECS task resources (512 CPU, 1024 Memory)
171
+ - Single ECS task instance
172
+ - Disabled auto-scaling
173
+ - Disabled WAF
174
+ - Shorter log retention (7 days)
175
+ - No access logs
176
+
177
+ ### Production Environment
178
+ - Higher ECS task resources (1024 CPU, 2048 Memory)
179
+ - Multiple ECS task instances (3+)
180
+ - Enabled auto-scaling
181
+ - Enabled WAF protection
182
+ - Longer log retention (90 days)
183
+ - Access logs enabled
184
+
185
+ ## Security Best Practices
186
+
187
+ 1. **Secrets Management**
188
+ - Store sensitive values in AWS Secrets Manager
189
+ - Use environment variables for ECS tasks
190
+ - Never commit secrets to version control
191
+
192
+ 2. **Network Security**
193
+ - ECS tasks in private subnets
194
+ - ALB in public subnets
195
+ - Security groups restrict access
196
+ - VPC endpoints for AWS services
197
+
198
+ 3. **WAF Protection**
199
+ - Rate limiting enabled
200
+ - AWS managed rule sets
201
+ - SQL injection prevention
202
+ - Known bad inputs blocking
203
+
204
+ 4. **Encryption**
205
+ - S3 buckets encrypted (AES256)
206
+ - CloudFront HTTPS only
207
+ - Secrets Manager encryption
208
+ - ECS task encryption
209
+
210
+ ## Monitoring and Logging
211
+
212
+ ### CloudWatch Logs
213
+ - ECS container logs: `/ecs/adserver-{env}`
214
+ - WAF logs: `/aws/wafv2/adserver-{env}`
215
+
216
+ ### CloudWatch Metrics
217
+ - ECS service metrics (CPU, Memory, Tasks)
218
+ - ALB metrics (Request count, Target health)
219
+ - CloudFront metrics (Requests, Bytes)
220
+ - WAF metrics (Blocked requests, Rate limits)
221
+
222
+ ### Alarms (Optional)
223
+ Create CloudWatch alarms for:
224
+ - High CPU/Memory utilization
225
+ - Failed health checks
226
+ - 4xx/5xx error rates
227
+ - WAF blocked requests
228
+
229
+ ## Troubleshooting
230
+
231
+ ### ECS Tasks Not Starting
232
+ 1. Check CloudWatch logs for errors
233
+ 2. Verify ECR image exists
234
+ 3. Check security group rules
235
+ 4. Verify IAM roles have correct permissions
236
+
237
+ ### CloudFront Not Serving Content
238
+ 1. Check S3 bucket policy
239
+ 2. Verify Origin Access Control configuration
240
+ 3. Check CloudFront distribution status
241
+ 4. Review CloudFront error responses
242
+
243
+ ### Database Connection Issues
244
+ 1. Verify database URL in Secrets Manager
245
+ 2. Check ECS task security group
246
+ 3. Verify database security group allows ECS
247
+ 4. Test database connectivity from ECS task
248
+
249
+ ## Updating Infrastructure
250
+
251
+ ### Modify Variables
252
+ ```bash
253
+ # Edit tfvars file
254
+ nano environments/production.tfvars
255
+
256
+ # Plan changes
257
+ terraform plan -var-file=environments/production.tfvars
258
+
259
+ # Apply changes
260
+ terraform apply -var-file=environments/production.tfvars
261
+ ```
262
+
263
+ ### Update ECS Service
264
+ ```bash
265
+ # Force new deployment with latest image
266
+ aws ecs update-service \
267
+ --cluster adserver-production-cluster \
268
+ --service adserver-production-service \
269
+ --force-new-deployment
270
+ ```
271
+
272
+ ### Invalidate CloudFront Cache
273
+ ```bash
274
+ aws cloudfront create-invalidation \
275
+ --distribution-id <DISTRIBUTION_ID> \
276
+ --paths "/*"
277
+ ```
278
+
279
+ ## Cleanup
280
+
281
+ To destroy all resources:
282
+
283
+ ```bash
284
+ # Development
285
+ terraform destroy -var-file=environments/dev.tfvars
286
+
287
+ # Production
288
+ terraform destroy -var-file=environments/production.tfvars
289
+ ```
290
+
291
+ **Warning**: This will delete all resources including data in S3 buckets. Make backups before destroying production infrastructure.
292
+
293
+ ## Support
294
+
295
+ For issues or questions:
296
+ - Check CloudWatch logs
297
+ - Review Terraform plan output
298
+ - Consult AWS documentation
299
+ - Contact DevOps team
300
+
301
+ ## Additional Resources
302
+
303
+ - [AWS CloudFront Documentation](https://docs.aws.amazon.com/cloudfront/)
304
+ - [AWS ECS Documentation](https://docs.aws.amazon.com/ecs/)
305
+ - [Terraform AWS Provider](https://registry.terraform.io/providers/hashicorp/aws/latest/docs)
306
+ - [AWS WAF Documentation](https://docs.aws.amazon.com/waf/)