collavre 0.1.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 (410) hide show
  1. checksums.yaml +7 -0
  2. data/README.md +221 -0
  3. data/Rakefile +8 -0
  4. data/app/assets/stylesheets/collavre/actiontext.css +577 -0
  5. data/app/assets/stylesheets/collavre/activity_logs.css +99 -0
  6. data/app/assets/stylesheets/collavre/comments_popup.css +692 -0
  7. data/app/assets/stylesheets/collavre/creatives.css +559 -0
  8. data/app/assets/stylesheets/collavre/dark_mode.css +118 -0
  9. data/app/assets/stylesheets/collavre/mention_menu.css +43 -0
  10. data/app/assets/stylesheets/collavre/popup.css +160 -0
  11. data/app/assets/stylesheets/collavre/print.css +37 -0
  12. data/app/assets/stylesheets/collavre/slide_view.css +79 -0
  13. data/app/assets/stylesheets/collavre/user_menu.css +34 -0
  14. data/app/channels/collavre/comments_presence_channel.rb +54 -0
  15. data/app/channels/collavre/slide_view_channel.rb +11 -0
  16. data/app/channels/collavre/topics_channel.rb +12 -0
  17. data/app/components/collavre/avatar_component.html.erb +15 -0
  18. data/app/components/collavre/avatar_component.rb +59 -0
  19. data/app/components/collavre/inbox/badge_component.html.erb +6 -0
  20. data/app/components/collavre/inbox/badge_component.rb +18 -0
  21. data/app/components/collavre/plans_timeline_component.html.erb +14 -0
  22. data/app/components/collavre/plans_timeline_component.rb +56 -0
  23. data/app/components/collavre/popup_menu_component.html.erb +6 -0
  24. data/app/components/collavre/popup_menu_component.rb +30 -0
  25. data/app/components/collavre/progress_filter_component.html.erb +5 -0
  26. data/app/components/collavre/progress_filter_component.rb +10 -0
  27. data/app/components/collavre/user_mention_menu_component.html.erb +3 -0
  28. data/app/components/collavre/user_mention_menu_component.rb +8 -0
  29. data/app/controllers/collavre/application_controller.rb +15 -0
  30. data/app/controllers/collavre/attachments_controller.rb +44 -0
  31. data/app/controllers/collavre/calendar_events_controller.rb +15 -0
  32. data/app/controllers/collavre/comment_read_pointers_controller.rb +80 -0
  33. data/app/controllers/collavre/comments/activity_logs_controller.rb +26 -0
  34. data/app/controllers/collavre/comments/reactions_controller.rb +82 -0
  35. data/app/controllers/collavre/comments_controller.rb +464 -0
  36. data/app/controllers/collavre/contacts_controller.rb +10 -0
  37. data/app/controllers/collavre/creative_expanded_states_controller.rb +27 -0
  38. data/app/controllers/collavre/creative_imports_controller.rb +24 -0
  39. data/app/controllers/collavre/creative_plans_controller.rb +69 -0
  40. data/app/controllers/collavre/creative_shares_controller.rb +79 -0
  41. data/app/controllers/collavre/creatives_controller.rb +535 -0
  42. data/app/controllers/collavre/devices_controller.rb +19 -0
  43. data/app/controllers/collavre/email_verifications_controller.rb +16 -0
  44. data/app/controllers/collavre/emails_controller.rb +11 -0
  45. data/app/controllers/collavre/github_auth_controller.rb +25 -0
  46. data/app/controllers/collavre/google_auth_controller.rb +43 -0
  47. data/app/controllers/collavre/inbox_items_controller.rb +64 -0
  48. data/app/controllers/collavre/invites_controller.rb +27 -0
  49. data/app/controllers/collavre/notion_auth_controller.rb +25 -0
  50. data/app/controllers/collavre/passwords_controller.rb +37 -0
  51. data/app/controllers/collavre/plans_controller.rb +110 -0
  52. data/app/controllers/collavre/sessions_controller.rb +57 -0
  53. data/app/controllers/collavre/topics_controller.rb +58 -0
  54. data/app/controllers/collavre/user_themes_controller.rb +58 -0
  55. data/app/controllers/collavre/users_controller.rb +390 -0
  56. data/app/helpers/collavre/application_helper.rb +4 -0
  57. data/app/helpers/collavre/comments_helper.rb +9 -0
  58. data/app/helpers/collavre/creatives_helper.rb +343 -0
  59. data/app/helpers/collavre/navigation_helper.rb +163 -0
  60. data/app/helpers/collavre/user_themes_helper.rb +4 -0
  61. data/app/javascript/collavre.js +26 -0
  62. data/app/javascript/components/InlineLexicalEditor.jsx +889 -0
  63. data/app/javascript/components/LinkPopup.jsx +112 -0
  64. data/app/javascript/components/creative_tree_row.js +503 -0
  65. data/app/javascript/components/plugins/attachment_cleanup_plugin.jsx +95 -0
  66. data/app/javascript/components/plugins/image_upload_plugin.jsx +162 -0
  67. data/app/javascript/controllers/click_target_controller.js +13 -0
  68. data/app/javascript/controllers/comment_controller.js +162 -0
  69. data/app/javascript/controllers/comments/__tests__/popup_controller.test.js +68 -0
  70. data/app/javascript/controllers/comments/form_controller.js +530 -0
  71. data/app/javascript/controllers/comments/list_controller.js +715 -0
  72. data/app/javascript/controllers/comments/mention_menu_controller.js +41 -0
  73. data/app/javascript/controllers/comments/popup_controller.js +385 -0
  74. data/app/javascript/controllers/comments/presence_controller.js +311 -0
  75. data/app/javascript/controllers/comments/topics_controller.js +338 -0
  76. data/app/javascript/controllers/common_popup_controller.js +55 -0
  77. data/app/javascript/controllers/creatives/drag_drop_controller.js +45 -0
  78. data/app/javascript/controllers/creatives/expansion_controller.js +222 -0
  79. data/app/javascript/controllers/creatives/import_controller.js +116 -0
  80. data/app/javascript/controllers/creatives/row_editor_controller.js +8 -0
  81. data/app/javascript/controllers/creatives/select_mode_controller.js +231 -0
  82. data/app/javascript/controllers/creatives/set_plan_modal_controller.js +107 -0
  83. data/app/javascript/controllers/creatives/tree_controller.js +218 -0
  84. data/app/javascript/controllers/index.js +79 -0
  85. data/app/javascript/controllers/link_creative_controller.js +91 -0
  86. data/app/javascript/controllers/popup_menu_controller.js +82 -0
  87. data/app/javascript/controllers/progress_filter_controller.js +35 -0
  88. data/app/javascript/controllers/reaction_picker_controller.js +107 -0
  89. data/app/javascript/controllers/share_invite_controller.js +15 -0
  90. data/app/javascript/controllers/share_user_search_controller.js +121 -0
  91. data/app/javascript/controllers/tabs_controller.js +43 -0
  92. data/app/javascript/creatives/drag_drop/dom.js +170 -0
  93. data/app/javascript/creatives/drag_drop/event_handlers.js +846 -0
  94. data/app/javascript/creatives/drag_drop/indicator.js +35 -0
  95. data/app/javascript/creatives/drag_drop/operations.js +116 -0
  96. data/app/javascript/creatives/drag_drop/state.js +31 -0
  97. data/app/javascript/creatives/tree_renderer.js +248 -0
  98. data/app/javascript/lib/api/__tests__/queue_manager.test.js +153 -0
  99. data/app/javascript/lib/api/creatives.js +79 -0
  100. data/app/javascript/lib/api/csrf_fetch.js +22 -0
  101. data/app/javascript/lib/api/drag_drop.js +31 -0
  102. data/app/javascript/lib/api/queue_manager.js +423 -0
  103. data/app/javascript/lib/apply_lexical_styles.js +15 -0
  104. data/app/javascript/lib/common_popup.js +195 -0
  105. data/app/javascript/lib/lexical/__tests__/action_text_attachment_node.test.jsx +91 -0
  106. data/app/javascript/lib/lexical/__tests__/attachment_payload.test.js +194 -0
  107. data/app/javascript/lib/lexical/action_text_attachment_node.js +459 -0
  108. data/app/javascript/lib/lexical/attachment_node.jsx +170 -0
  109. data/app/javascript/lib/lexical/attachment_payload.js +293 -0
  110. data/app/javascript/lib/lexical/dom_attachment_utils.js +66 -0
  111. data/app/javascript/lib/lexical/image_node.jsx +159 -0
  112. data/app/javascript/lib/lexical/style_attributes.js +40 -0
  113. data/app/javascript/lib/responsive_images.js +54 -0
  114. data/app/javascript/lib/turbo_stream_actions.js +33 -0
  115. data/app/javascript/lib/utils/markdown.js +23 -0
  116. data/app/javascript/modules/creative_guide.js +53 -0
  117. data/app/javascript/modules/creative_row_editor.js +1841 -0
  118. data/app/javascript/modules/creative_row_swipe.js +43 -0
  119. data/app/javascript/modules/creatives.js +15 -0
  120. data/app/javascript/modules/export_to_markdown.js +34 -0
  121. data/app/javascript/modules/inbox_panel.js +226 -0
  122. data/app/javascript/modules/lexical_inline_editor.jsx +133 -0
  123. data/app/javascript/modules/mention_menu.js +77 -0
  124. data/app/javascript/modules/plans_menu.js +39 -0
  125. data/app/javascript/modules/plans_timeline.js +397 -0
  126. data/app/javascript/modules/share_modal.js +73 -0
  127. data/app/javascript/modules/share_user_popup.js +77 -0
  128. data/app/javascript/modules/slide_view.js +163 -0
  129. data/app/javascript/services/cable.js +32 -0
  130. data/app/javascript/slide_view.js +2 -0
  131. data/app/javascript/utils/caret_position.js +42 -0
  132. data/app/javascript/utils/clipboard.js +40 -0
  133. data/app/jobs/collavre/ai_agent_job.rb +27 -0
  134. data/app/jobs/collavre/inbox_summary_job.rb +24 -0
  135. data/app/jobs/collavre/notion_export_job.rb +30 -0
  136. data/app/jobs/collavre/notion_sync_job.rb +48 -0
  137. data/app/jobs/collavre/permission_cache_cleanup_job.rb +36 -0
  138. data/app/jobs/collavre/permission_cache_job.rb +71 -0
  139. data/app/jobs/collavre/push_notification_job.rb +86 -0
  140. data/app/mailers/collavre/application_mailer.rb +17 -0
  141. data/app/mailers/collavre/creative_mailer.rb +9 -0
  142. data/app/mailers/collavre/email_verification_mailer.rb +20 -0
  143. data/app/mailers/collavre/inbox_mailer.rb +19 -0
  144. data/app/mailers/collavre/invitation_mailer.rb +16 -0
  145. data/app/mailers/collavre/passwords_mailer.rb +10 -0
  146. data/app/models/collavre/activity_log.rb +13 -0
  147. data/app/models/collavre/application_record.rb +5 -0
  148. data/app/models/collavre/calendar_event.rb +20 -0
  149. data/app/models/collavre/comment.rb +307 -0
  150. data/app/models/collavre/comment_presence_store.rb +30 -0
  151. data/app/models/collavre/comment_reaction.rb +11 -0
  152. data/app/models/collavre/comment_read_pointer.rb +26 -0
  153. data/app/models/collavre/contact.rb +23 -0
  154. data/app/models/collavre/creative.rb +413 -0
  155. data/app/models/collavre/creative_expanded_state.rb +11 -0
  156. data/app/models/collavre/creative_share.rb +122 -0
  157. data/app/models/collavre/creative_shares_cache.rb +18 -0
  158. data/app/models/collavre/current.rb +14 -0
  159. data/app/models/collavre/device.rb +13 -0
  160. data/app/models/collavre/email.rb +14 -0
  161. data/app/models/collavre/github_account.rb +10 -0
  162. data/app/models/collavre/github_repository_link.rb +19 -0
  163. data/app/models/collavre/inbox_item.rb +95 -0
  164. data/app/models/collavre/invitation.rb +22 -0
  165. data/app/models/collavre/label.rb +47 -0
  166. data/app/models/collavre/mcp_tool.rb +30 -0
  167. data/app/models/collavre/notion_account.rb +17 -0
  168. data/app/models/collavre/notion_block_link.rb +10 -0
  169. data/app/models/collavre/notion_page_link.rb +19 -0
  170. data/app/models/collavre/plan.rb +20 -0
  171. data/app/models/collavre/session.rb +24 -0
  172. data/app/models/collavre/system_setting.rb +144 -0
  173. data/app/models/collavre/tag.rb +10 -0
  174. data/app/models/collavre/task.rb +10 -0
  175. data/app/models/collavre/task_action.rb +10 -0
  176. data/app/models/collavre/topic.rb +12 -0
  177. data/app/models/collavre/user.rb +174 -0
  178. data/app/models/collavre/user_theme.rb +10 -0
  179. data/app/models/collavre/variation.rb +5 -0
  180. data/app/models/collavre/webauthn_credential.rb +11 -0
  181. data/app/services/collavre/ai_agent_service.rb +193 -0
  182. data/app/services/collavre/ai_client.rb +183 -0
  183. data/app/services/collavre/ai_system_prompt_renderer.rb +38 -0
  184. data/app/services/collavre/auto_theme_generator.rb +198 -0
  185. data/app/services/collavre/comment_link_formatter.rb +60 -0
  186. data/app/services/collavre/comments/action_executor.rb +262 -0
  187. data/app/services/collavre/comments/action_validator.rb +58 -0
  188. data/app/services/collavre/comments/calendar_command.rb +97 -0
  189. data/app/services/collavre/comments/command_processor.rb +37 -0
  190. data/app/services/collavre/comments/mcp_command.rb +109 -0
  191. data/app/services/collavre/comments/mcp_command_builder.rb +32 -0
  192. data/app/services/collavre/creatives/filter_pipeline.rb +196 -0
  193. data/app/services/collavre/creatives/filters/assignee_filter.rb +30 -0
  194. data/app/services/collavre/creatives/filters/base_filter.rb +24 -0
  195. data/app/services/collavre/creatives/filters/comment_filter.rb +21 -0
  196. data/app/services/collavre/creatives/filters/date_filter.rb +58 -0
  197. data/app/services/collavre/creatives/filters/progress_filter.rb +25 -0
  198. data/app/services/collavre/creatives/filters/search_filter.rb +28 -0
  199. data/app/services/collavre/creatives/filters/tag_filter.rb +16 -0
  200. data/app/services/collavre/creatives/importer.rb +47 -0
  201. data/app/services/collavre/creatives/index_query.rb +191 -0
  202. data/app/services/collavre/creatives/path_exporter.rb +131 -0
  203. data/app/services/collavre/creatives/permission_cache_builder.rb +194 -0
  204. data/app/services/collavre/creatives/permission_checker.rb +42 -0
  205. data/app/services/collavre/creatives/plan_tagger.rb +53 -0
  206. data/app/services/collavre/creatives/progress_service.rb +89 -0
  207. data/app/services/collavre/creatives/reorderer.rb +187 -0
  208. data/app/services/collavre/creatives/tree_builder.rb +231 -0
  209. data/app/services/collavre/creatives/tree_formatter.rb +36 -0
  210. data/app/services/collavre/gemini_parent_recommender.rb +77 -0
  211. data/app/services/collavre/github/client.rb +112 -0
  212. data/app/services/collavre/github/pull_request_analyzer.rb +280 -0
  213. data/app/services/collavre/github/pull_request_processor.rb +181 -0
  214. data/app/services/collavre/github/webhook_provisioner.rb +130 -0
  215. data/app/services/collavre/google_calendar_service.rb +149 -0
  216. data/app/services/collavre/link_preview_fetcher.rb +230 -0
  217. data/app/services/collavre/markdown_importer.rb +202 -0
  218. data/app/services/collavre/mcp_service.rb +217 -0
  219. data/app/services/collavre/notion_client.rb +231 -0
  220. data/app/services/collavre/notion_creative_exporter.rb +296 -0
  221. data/app/services/collavre/notion_service.rb +249 -0
  222. data/app/services/collavre/ppt_importer.rb +76 -0
  223. data/app/services/collavre/ruby_llm_interaction_logger.rb +34 -0
  224. data/app/services/collavre/system_events/context_builder.rb +41 -0
  225. data/app/services/collavre/system_events/dispatcher.rb +19 -0
  226. data/app/services/collavre/system_events/router.rb +72 -0
  227. data/app/services/collavre/tools/creative_retrieval_service.rb +138 -0
  228. data/app/views/admin/shared/_tabs.html.erb +4 -0
  229. data/app/views/collavre/comments/_activity_log_details.html.erb +23 -0
  230. data/app/views/collavre/comments/_comment.html.erb +147 -0
  231. data/app/views/collavre/comments/_comments_popup.html.erb +46 -0
  232. data/app/views/collavre/comments/_list.html.erb +10 -0
  233. data/app/views/collavre/comments/_presence_avatars.html.erb +8 -0
  234. data/app/views/collavre/comments/_reaction_picker.html.erb +15 -0
  235. data/app/views/collavre/comments/_read_receipts.html.erb +19 -0
  236. data/app/views/collavre/creatives/_add_button.html.erb +20 -0
  237. data/app/views/collavre/creatives/_delete_button.html.erb +12 -0
  238. data/app/views/collavre/creatives/_github_integration_modal.html.erb +77 -0
  239. data/app/views/collavre/creatives/_import_upload_zone.html.erb +10 -0
  240. data/app/views/collavre/creatives/_inline_edit_form.html.erb +89 -0
  241. data/app/views/collavre/creatives/_mobile_actions_menu.html.erb +24 -0
  242. data/app/views/collavre/creatives/_notion_integration_modal.html.erb +90 -0
  243. data/app/views/collavre/creatives/_set_plan_modal.html.erb +25 -0
  244. data/app/views/collavre/creatives/_share_button.html.erb +55 -0
  245. data/app/views/collavre/creatives/edit.html.erb +4 -0
  246. data/app/views/collavre/creatives/index.html.erb +192 -0
  247. data/app/views/collavre/creatives/new.html.erb +4 -0
  248. data/app/views/collavre/creatives/show.html.erb +29 -0
  249. data/app/views/collavre/creatives/slide_view.html.erb +20 -0
  250. data/app/views/collavre/email_verification_mailer/verify.html.erb +4 -0
  251. data/app/views/collavre/email_verification_mailer/verify.text.erb +2 -0
  252. data/app/views/collavre/emails/index.html.erb +19 -0
  253. data/app/views/collavre/emails/show.html.erb +5 -0
  254. data/app/views/collavre/inbox_items/_item.html.erb +18 -0
  255. data/app/views/collavre/inbox_items/_items.html.erb +3 -0
  256. data/app/views/collavre/inbox_items/_list.html.erb +7 -0
  257. data/app/views/collavre/inbox_items/index.html.erb +1 -0
  258. data/app/views/collavre/inbox_mailer/daily_summary.html.erb +11 -0
  259. data/app/views/collavre/inbox_mailer/daily_summary.text.erb +8 -0
  260. data/app/views/collavre/invitation_mailer/invite.html.erb +5 -0
  261. data/app/views/collavre/invitation_mailer/invite.text.erb +3 -0
  262. data/app/views/collavre/invites/show.html.erb +8 -0
  263. data/app/views/collavre/passwords/edit.html.erb +12 -0
  264. data/app/views/collavre/passwords/new.html.erb +17 -0
  265. data/app/views/collavre/passwords_mailer/reset.html.erb +4 -0
  266. data/app/views/collavre/passwords_mailer/reset.text.erb +2 -0
  267. data/app/views/collavre/sessions/new.html.erb +27 -0
  268. data/app/views/collavre/sessions/providers/_google.html.erb +7 -0
  269. data/app/views/collavre/sessions/providers/_passkey.html.erb +3 -0
  270. data/app/views/collavre/shared/_link_creative_modal.html.erb +6 -0
  271. data/app/views/collavre/shared/_navigation.html.erb +37 -0
  272. data/app/views/collavre/shared/navigation/_help_button.html.erb +1 -0
  273. data/app/views/collavre/shared/navigation/_inbox_button.html.erb +5 -0
  274. data/app/views/collavre/shared/navigation/_mobile_inbox_button.html.erb +3 -0
  275. data/app/views/collavre/shared/navigation/_mobile_plans_button.html.erb +1 -0
  276. data/app/views/collavre/shared/navigation/_panels.html.erb +18 -0
  277. data/app/views/collavre/shared/navigation/_plans_button.html.erb +3 -0
  278. data/app/views/collavre/shared/navigation/_search_form.html.erb +6 -0
  279. data/app/views/collavre/user_themes/index.html.erb +75 -0
  280. data/app/views/collavre/users/_app_header.html.erb +5 -0
  281. data/app/views/collavre/users/_contact_management.html.erb +77 -0
  282. data/app/views/collavre/users/_id_pwd_fields.html.erb +27 -0
  283. data/app/views/collavre/users/edit_ai.html.erb +79 -0
  284. data/app/views/collavre/users/edit_password.html.erb +27 -0
  285. data/app/views/collavre/users/index.html.erb +80 -0
  286. data/app/views/collavre/users/new.html.erb +33 -0
  287. data/app/views/collavre/users/new_ai.html.erb +87 -0
  288. data/app/views/collavre/users/passkeys.html.erb +43 -0
  289. data/app/views/collavre/users/show.html.erb +143 -0
  290. data/app/views/inbox/badge_component/_count.html.erb +2 -0
  291. data/app/views/layouts/collavre/slide.html.erb +29 -0
  292. data/config/locales/comments.en.yml +114 -0
  293. data/config/locales/comments.ko.yml +110 -0
  294. data/config/locales/contacts.en.yml +16 -0
  295. data/config/locales/contacts.ko.yml +16 -0
  296. data/config/locales/creatives.en.yml +183 -0
  297. data/config/locales/creatives.ko.yml +164 -0
  298. data/config/locales/invites.en.yml +19 -0
  299. data/config/locales/invites.ko.yml +17 -0
  300. data/config/locales/notifications.en.yml +8 -0
  301. data/config/locales/notifications.ko.yml +8 -0
  302. data/config/locales/plans.en.yml +12 -0
  303. data/config/locales/plans.ko.yml +19 -0
  304. data/config/locales/themes.en.yml +29 -0
  305. data/config/locales/themes.ko.yml +27 -0
  306. data/config/locales/users.en.yml +151 -0
  307. data/config/locales/users.ko.yml +146 -0
  308. data/config/routes.rb +92 -0
  309. data/db/migrate/20241201000000_create_notion_integrations.rb +29 -0
  310. data/db/migrate/20250128110017_create_creatives.rb +11 -0
  311. data/db/migrate/20250128120122_create_users.rb +11 -0
  312. data/db/migrate/20250128120123_create_sessions.rb +11 -0
  313. data/db/migrate/20250128123633_create_subscribers.rb +10 -0
  314. data/db/migrate/20250312000000_create_notion_block_links.rb +16 -0
  315. data/db/migrate/20250312010000_allow_multiple_notion_blocks_per_creative.rb +5 -0
  316. data/db/migrate/20250522115048_remove_name_from_creatives.rb +5 -0
  317. data/db/migrate/20250522190651_add_parent_id_to_creatives.rb +5 -0
  318. data/db/migrate/20250523133100_rename_inventory_count_to_progress.rb +13 -0
  319. data/db/migrate/20250523133101_add_sequence_to_creatives.rb +5 -0
  320. data/db/migrate/20250525205100_add_user_id_to_creatives.rb +10 -0
  321. data/db/migrate/20250527014217_create_creative_shares.rb +12 -0
  322. data/db/migrate/20250528142349_add_origin_id_to_creatives.rb +5 -0
  323. data/db/migrate/20250530060200_create_tags.rb +9 -0
  324. data/db/migrate/20250531105150_add_value_to_tags.rb +5 -0
  325. data/db/migrate/20250531140142_create_labels.rb +12 -0
  326. data/db/migrate/20250531140145_change_tag_to_label_reference.rb +6 -0
  327. data/db/migrate/20250601000000_create_comments.rb +10 -0
  328. data/db/migrate/20250601061830_drop_plans_and_variations.rb +6 -0
  329. data/db/migrate/20250604122600_add_owner_to_labels.rb +5 -0
  330. data/db/migrate/20250606000000_rename_email_address_to_email_in_users.rb +7 -0
  331. data/db/migrate/20250606150329_create_creative_hierarchies.rb +16 -0
  332. data/db/migrate/20250610142000_create_creative_expanded_states.rb +11 -0
  333. data/db/migrate/20250611030138_create_invitations.rb +15 -0
  334. data/db/migrate/20250611105524_create_inbox_items.rb +14 -0
  335. data/db/migrate/20250612150000_update_permissions.rb +43 -0
  336. data/db/migrate/20250612232913_add_email_verified_at_to_users.rb +5 -0
  337. data/db/migrate/20250616065905_add_avatar_to_users.rb +5 -0
  338. data/db/migrate/20250617092111_add_display_level_to_users.rb +5 -0
  339. data/db/migrate/20250620004558_create_emails.rb +13 -0
  340. data/db/migrate/20250621000000_create_comment_read_pointers.rb +11 -0
  341. data/db/migrate/20250622000000_add_completion_mark_to_users.rb +5 -0
  342. data/db/migrate/20250623000000_add_theme_to_users.rb +5 -0
  343. data/db/migrate/20250624000000_add_name_to_users.rb +18 -0
  344. data/db/migrate/20250714190000_create_devices.rb +17 -0
  345. data/db/migrate/20250715120000_add_notifications_enabled_to_users.rb +5 -0
  346. data/db/migrate/20250823000000_add_no_access_permission.rb +25 -0
  347. data/db/migrate/20250826000000_add_calendar_id_to_users.rb +5 -0
  348. data/db/migrate/20250827000000_add_google_oauth_tokens_to_users.rb +8 -0
  349. data/db/migrate/20250827061238_add_timezone_to_users.rb +5 -0
  350. data/db/migrate/20250828000000_create_calendar_events.rb +16 -0
  351. data/db/migrate/20250828060000_add_creative_to_calendar_events.rb +5 -0
  352. data/db/migrate/20250830141052_add_locale_to_users.rb +5 -0
  353. data/db/migrate/20250830141101_add_message_key_to_inbox_items.rb +6 -0
  354. data/db/migrate/20250902025423_remove_description_and_featured_image_from_creatives.rb +6 -0
  355. data/db/migrate/20250910000000_add_private_to_comments.rb +5 -0
  356. data/db/migrate/20250910105640_migrate_write_permissions_to_admin.rb +17 -0
  357. data/db/migrate/20250911084338_backfill_creative_in_comment_inbox_items.rb +27 -0
  358. data/db/migrate/20250923002959_deduplicate_device_fcm_tokens.rb +25 -0
  359. data/db/migrate/20250924000000_add_system_admin_to_users.rb +6 -0
  360. data/db/migrate/20250925000000_create_github_integrations.rb +26 -0
  361. data/db/migrate/20250927000000_add_webhook_secret_to_github_repository_links.rb +29 -0
  362. data/db/migrate/20250928000000_add_action_and_approver_to_comments.rb +6 -0
  363. data/db/migrate/20250928010000_add_action_execution_tracking_to_comments.rb +6 -0
  364. data/db/migrate/20250928105957_add_github_gemini_prompt_to_creatives.rb +5 -0
  365. data/db/migrate/20250929000000_add_comment_and_creative_refs_to_inbox_items.rb +6 -0
  366. data/db/migrate/20251001000001_create_contacts.rb +71 -0
  367. data/db/migrate/20251002000000_add_shared_by_to_creative_shares.rb +14 -0
  368. data/db/migrate/20251124120902_add_ai_fields_to_users.rb +7 -0
  369. data/db/migrate/20251124122218_add_created_by_id_to_users.rb +5 -0
  370. data/db/migrate/20251124124521_add_llm_api_key_to_users.rb +5 -0
  371. data/db/migrate/20251124130000_add_searchable_to_users.rb +6 -0
  372. data/db/migrate/20251125072705_migrate_linked_creative_children_to_origin.rb +28 -0
  373. data/db/migrate/20251126040752_add_description_to_creatives.rb +75 -0
  374. data/db/migrate/20251127000000_move_comments_from_linked_creatives_to_origins.rb +18 -0
  375. data/db/migrate/20251201073823_add_tools_to_users.rb +5 -0
  376. data/db/migrate/20251202062715_create_mcp_tools.rb +16 -0
  377. data/db/migrate/20251204125754_create_tasks_and_task_actions.rb +23 -0
  378. data/db/migrate/20251204125756_add_routing_expression_to_users.rb +5 -0
  379. data/db/migrate/20251204161133_set_default_routing_expression_for_ai_agents.rb +13 -0
  380. data/db/migrate/20251211033025_nullify_self_referencing_origins.rb +9 -0
  381. data/db/migrate/20251211080040_create_topics_and_add_topic_to_comments.rb +15 -0
  382. data/db/migrate/20251215143500_create_activity_logs.rb +16 -0
  383. data/db/migrate/20251222125727_create_webauthn_credentials.rb +14 -0
  384. data/db/migrate/20251222125839_add_webauthn_id_to_users.rb +5 -0
  385. data/db/migrate/20251223022315_create_comment_reactions.rb +13 -0
  386. data/db/migrate/20251223072625_create_user_themes.rb +11 -0
  387. data/db/migrate/20251230074456_add_creative_id_to_labels.rb +5 -0
  388. data/db/migrate/20251230113607_refactor_labels.rb +38 -0
  389. data/db/migrate/20251231010012_backfill_tags_for_labels.rb +15 -0
  390. data/db/migrate/20251231013234_drop_subscribers.rb +9 -0
  391. data/db/migrate/20260106090544_allow_null_user_id_in_creative_shares.rb +6 -0
  392. data/db/migrate/20260106160643_create_system_settings.rb +11 -0
  393. data/db/migrate/20260116000000_create_creative_shares_cache.rb +15 -0
  394. data/db/migrate/20260116000001_populate_creative_shares_cache.rb +23 -0
  395. data/db/migrate/20260119022933_make_source_share_id_nullable_in_creative_shares_caches.rb +7 -0
  396. data/db/migrate/20260119023446_populate_owner_cache_entries.rb +25 -0
  397. data/db/migrate/20260119100000_add_account_lockout_to_users.rb +6 -0
  398. data/db/migrate/20260119110000_add_last_active_at_to_sessions.rb +6 -0
  399. data/db/migrate/20260120045354_encrypt_oauth_tokens.rb +60 -0
  400. data/db/migrate/20260120162259_remove_fk_from_creative_shares_caches.rb +7 -0
  401. data/db/migrate/20260120163856_remove_timestamps_from_creative_shares_caches.rb +6 -0
  402. data/lib/collavre/configuration.rb +14 -0
  403. data/lib/collavre/engine.rb +77 -0
  404. data/lib/collavre/user_extensions.rb +29 -0
  405. data/lib/collavre/version.rb +3 -0
  406. data/lib/collavre.rb +26 -0
  407. data/lib/generators/collavre/install/install_generator.rb +105 -0
  408. data/lib/generators/collavre/install/templates/build.cjs.tt +100 -0
  409. data/lib/tasks/collavre_assets.rake +15 -0
  410. metadata +591 -0
@@ -0,0 +1,146 @@
1
+ ---
2
+ ko:
3
+ collavre:
4
+ users:
5
+ app_header:
6
+ your_creativeness_is_coming: 당신의 창작물이 실현됩니다!
7
+ a_tracker_of_your_creatives: 문서처럼 작업 트리 리스트를 보면서 완료여부를 확인하세요.
8
+ new:
9
+ enter_your_name: 이름을 입력하세요
10
+ enter_your_email: 이메일을 입력하세요
11
+ enter_your_password: 비밀번호를 입력하세요
12
+ confirm_your_password: 비밀번호를 다시 입력하세요
13
+ sign_up: 회원가입
14
+ back_to_sign_in: 로그인 화면으로 돌아가기
15
+ success_sign_up: 회원가입이 완료되었습니다. 이메일을 확인해 인증해주세요.
16
+ add_ai_user: AI 에이전트 추가
17
+ details_ai_notice: 이 사용자는 AI 에이전트입니다. 설정 및 도구를 구성할 수 있습니다.
18
+ new_ai:
19
+ title: AI 에이전트 추가
20
+ id_label: 아이디
21
+ name_label: 이름
22
+ system_prompt_label: 시스템 프롬프트
23
+ vendor_label: LLM 벤더
24
+ model_label: 모델
25
+ api_key_label: API Key
26
+ api_key_help: 입력하면 시스템 기본값 대신 이 키가 사용됩니다. 암호화되어 저장됩니다.
27
+ searchable_label: 이 AI를 검색 및 멘션 가능하게 허용
28
+ searchable_help: 활성화하면 다른 사용자가 이름으로 이 AI를 찾고 멘션할 수 있습니다.
29
+ submit: AI 에이전트 추가
30
+ tools_note: 에이전트 생성 후 사용 가능한 도구를 확인하고 테스트할 수 있습니다.
31
+ create_ai:
32
+ success: AI 에이전트가 생성되었습니다.
33
+ edit_ai:
34
+ title: AI 에이전트 수정
35
+ link: 수정
36
+ not_an_ai: 이 사용자는 AI 에이전트가 아닙니다.
37
+ tools_title: 사용 가능한 도구
38
+ tools_description: 에이전트가 사용할 수 있는 도구 목록입니다.
39
+ no_tools_found: 사용 가능한 도구가 없습니다.
40
+ chat_title: 에이전트와 대화하기
41
+ chat_placeholder: 에이전트를 테스트하려면 메시지를 입력하세요...
42
+ update_ai:
43
+ success: AI 에이전트가 수정되었습니다.
44
+ sessions:
45
+ new:
46
+ forgot_password: 비밀번호를 잊으셨나요?
47
+ try_again_later: 잠시 후 다시 시도하세요.
48
+ try_another_email_or_password: 이메일 주소나 비밀번호를 다시 확인하세요.
49
+ email_not_verified: 이메일 인증 후에 로그인할 수 있습니다.
50
+ provider_disabled: 이 인증 방법은 현재 비활성화되어 있습니다.
51
+ account_locked: 로그인 시도 횟수 초과로 계정이 잠겼습니다. %{minutes}분 후에 다시 시도해 주세요.
52
+ account_locked_now: 로그인 시도 횟수 초과로 계정이 잠겼습니다. %{minutes}분 후에 다시 시도해 주세요.
53
+ sign_in_with_google: 구글 계정으로 로그인
54
+ sign_in_with_webauthn: 패스키로 로그인
55
+ webauthn:
56
+ passkeys: 패스키 (Passkeys)
57
+ add: 패스키 추가
58
+ manage: 패스키 관리
59
+ nickname: 기기 이름
60
+ register: 등록
61
+ registered_on: '등록일: %{date}'
62
+ credential_not_found: 등록된 패스키가 없습니다. 비밀번호로 로그인 후 프로필 설정에서 패스키를 등록해주세요.
63
+ not_supported: 이 기기 또는 브라우저에서는 패스키가 지원되지 않습니다.
64
+ date: 등록일
65
+ list_empty: 등록된 패스키가 없습니다.
66
+ confirm_delete: 이 패스키를 삭제하시겠습니까?
67
+ delete: 삭제
68
+ deleted: 패스키가 삭제되었습니다.
69
+ details: 사용자 정보
70
+ name: 이름
71
+ email: 이메일
72
+ change_password: 비밀번호 변경
73
+ tabs:
74
+ profile: 프로파일
75
+ user_management: 사용자 관리
76
+ profile: 프로파일
77
+ avatar: 아바타
78
+ avatar_url: 아바타 URL
79
+ current_avatar: 현재 아바타
80
+ new_avatar_preview: 새 아바타 미리보기
81
+ update_profile: 프로파일 업데이트
82
+ delete: 삭제
83
+ make_system_admin: 시스템 관리자 지정
84
+ make_normal_user: 일반 사용자로 변경
85
+ confirm_grant_system_admin: 이 사용자에게 시스템 관리자 권한을 부여할까요?
86
+ confirm_destroy: 사용자의 모든 정보를 삭제하시겠습니까?
87
+ index_title: 사용자 목록
88
+ push_token_present: 푸시 토큰 있음
89
+ push_token_absent: 푸시 토큰 없음
90
+ display_level: 최대 표시 레벨
91
+ completion_mark: 완료 표시 문자
92
+ theme: 테마
93
+ calendar_id: 캘린더 ID
94
+ notifications_enabled: 알림 사용
95
+ locale: 언어
96
+ locales:
97
+ en: 영어
98
+ ko: 한국어
99
+ timezone: 시간대
100
+ profile_updated: 프로파일이 업데이트되었습니다.
101
+ avatar_updated: 아바타가 변경되었습니다.
102
+ password_updated: 비밀번호가 성공적으로 변경되었습니다.
103
+ password_update_failed: 비밀번호 변경에 실패했습니다.
104
+ current_password_incorrect: 현재 비밀번호가 올바르지 않습니다.
105
+ current_password: 현재 비밀번호
106
+ new_password: 새 비밀번호
107
+ confirm_new_password: 새 비밀번호 확인
108
+ password_min_length_hint: 최소 %{count}자 이상
109
+ back: 뒤로가기
110
+ forgot_password: 비밀번호를 잊으셨나요?
111
+ send_password_reset_instructions: 비밀번호 재설정 이메일 보내기
112
+ email_verified: 이메일 인증이 완료되었습니다.
113
+ verification_invalid: 인증 링크가 유효하지 않거나 만료되었습니다.
114
+ email_verification:
115
+ invalid_token: 인증 링크가 유효하지 않거나 만료되었습니다.
116
+ admin_required: 시스템 관리자만 접근할 수 있습니다.
117
+ system_admin:
118
+ granted: 시스템 관리자 권한이 부여되었습니다.
119
+ revoked: 시스템 관리자 권한이 해제되었습니다.
120
+ failed: 사용자의 시스템 관리자 상태를 변경하지 못했습니다.
121
+ destroy:
122
+ success: 사용자와 모든 관련 데이터가 삭제되었습니다.
123
+ failure: 사용자를 삭제하지 못했습니다.
124
+ cannot_delete_self: 자신의 계정은 삭제할 수 없습니다.
125
+ not_authorized: AI 에이전트는 생성자 또는 시스템 관리자만 삭제할 수 있습니다.
126
+ delete_ai_user: AI 에이전트 삭제
127
+ confirm_ai: AI 에이전트의 모든 정보를 삭제하시겠습니까?
128
+ table:
129
+ avatar: 아바타
130
+ name: 이름
131
+ email: 이메일
132
+ last_login_at: 마지막 로그인
133
+ last_login_unknown: 로그인 기록 없음
134
+ push_token: 푸시 토큰
135
+ notifications: 알림 설정
136
+ notifications_enabled: 사용
137
+ notifications_disabled: 사용 안 함
138
+ notifications_unset: 설정되지 않음
139
+ actions: 작업
140
+ current_user: 현재 사용자
141
+ system_admin: 시스템 관리자
142
+ user_mailer:
143
+ email_verification:
144
+ subject: 이메일 인증
145
+ message_html: 아래 링크 %{link} 를 클릭하여 이메일을 인증하세요.
146
+ message_text: '다음 링크를 방문하여 이메일을 인증하세요: %{link}'
data/config/routes.rb ADDED
@@ -0,0 +1,92 @@
1
+ Collavre::Engine.routes.draw do
2
+ # Authentication routes
3
+ resource :session, only: [ :new, :create, :destroy ]
4
+ resources :passwords, param: :token, only: [ :new, :create, :edit, :update ]
5
+ resources :users, only: [ :index, :new, :create, :show, :edit, :update, :destroy ] do
6
+ collection do
7
+ get :new_ai
8
+ post :create_ai
9
+ get :search
10
+ get :exists
11
+ end
12
+ member do
13
+ get :edit_ai
14
+ patch :update_ai
15
+ patch :grant_system_admin
16
+ patch :revoke_system_admin
17
+ get :edit_password
18
+ patch :update_password
19
+ get :passkeys
20
+ patch :notification_settings
21
+ end
22
+ end
23
+ get "/email_verification/:token", to: "email_verifications#show", as: :email_verification
24
+
25
+ # OAuth callback routes (paths match OmniAuth provider names)
26
+ match "/auth/google_oauth2/callback", to: "google_auth#callback", via: [ :get, :post ]
27
+ match "/auth/github/callback", to: "github_auth#callback", via: [ :get, :post ]
28
+ match "/auth/notion/callback", to: "notion_auth#callback", via: [ :get, :post ]
29
+
30
+ delete "/attachments/:signed_id", to: "attachments#destroy", as: :attachment
31
+
32
+ resources :calendar_events, only: [ :destroy ]
33
+ resources :contacts, only: [ :destroy ]
34
+ resources :devices, only: [ :create ]
35
+
36
+ resources :inbox_items, path: "inbox", only: [ :index, :update, :destroy ] do
37
+ get :count, on: :collection
38
+ end
39
+
40
+ resources :plans, only: [ :create, :destroy, :index ]
41
+
42
+ resources :user_themes, only: [ :index, :create, :destroy ] do
43
+ member do
44
+ post :apply
45
+ end
46
+ end
47
+
48
+ resources :creative_imports, only: [ :create ]
49
+ resource :creative_plan, only: [ :create, :destroy ], controller: "creative_plans"
50
+
51
+ resources :creatives do
52
+ resources :creative_shares, only: [ :create, :destroy ]
53
+ resources :topics, only: [ :index, :create, :destroy ]
54
+ resources :comments, only: [ :index, :create, :destroy, :show, :update ] do
55
+ member do
56
+ post :convert
57
+ post :approve
58
+ patch :update_action
59
+ delete :reactions, to: "comments/reactions#destroy"
60
+ end
61
+
62
+ resources :reactions, only: [ :create ], module: :comments
63
+ resource :activity_log, only: [ :show ], module: :comments
64
+
65
+ collection do
66
+ get :participants
67
+ post :move
68
+ end
69
+ end
70
+ collection do
71
+ post :reorder
72
+ post :link_drop
73
+ get :append_as_parent, to: "creatives#append_as_parent", as: :append_as_parent_creative
74
+ get :append_below, to: "creatives#append_below", as: :append_below_creative
75
+ get :export_markdown
76
+ end
77
+ member do
78
+ get :children
79
+ post :share, to: "creatives#share", as: :share_creative
80
+ post :request_permission, to: "creatives#request_permission"
81
+ post :unconvert
82
+ get :parent_suggestions
83
+ get :slide_view
84
+ end
85
+ end
86
+
87
+ resources :emails, only: [ :index, :show ]
88
+ resource :invite, only: [ :show, :create ]
89
+
90
+ post "/creative_expanded_states/toggle", to: "creative_expanded_states#toggle"
91
+ post "/comment_read_pointers/update", to: "comment_read_pointers#update"
92
+ end
@@ -0,0 +1,29 @@
1
+ class CreateNotionIntegrations < ActiveRecord::Migration[8.0]
2
+ def change
3
+ create_table :notion_accounts do |t|
4
+ t.references :user, null: false, foreign_key: true, index: { unique: true }
5
+ t.string :notion_uid, null: false
6
+ t.string :workspace_name
7
+ t.string :workspace_id
8
+ t.string :bot_id
9
+ t.string :token, null: false
10
+ t.datetime :token_expires_at
11
+ t.timestamps
12
+ end
13
+
14
+ create_table :notion_page_links do |t|
15
+ t.references :creative, null: false, foreign_key: true
16
+ t.references :notion_account, null: false, foreign_key: true
17
+ t.string :page_id, null: false
18
+ t.string :page_title
19
+ t.string :page_url
20
+ t.string :parent_page_id
21
+ t.datetime :last_synced_at
22
+ t.timestamps
23
+ end
24
+
25
+ add_index :notion_accounts, :notion_uid, unique: true
26
+ add_index :notion_page_links, :page_id, unique: true
27
+ add_index :notion_page_links, [ :creative_id, :page_id ], unique: true, name: "index_notion_links_on_creative_and_page"
28
+ end
29
+ end
@@ -0,0 +1,11 @@
1
+ class CreateCreatives < ActiveRecord::Migration[8.0]
2
+ def change
3
+ create_table :creatives do |t|
4
+ t.string :name
5
+ t.text :description
6
+ t.string :featured_image
7
+ t.integer :inventory_count
8
+ t.timestamps
9
+ end
10
+ end
11
+ end
@@ -0,0 +1,11 @@
1
+ class CreateUsers < ActiveRecord::Migration[8.0]
2
+ def change
3
+ create_table :users do |t|
4
+ t.string :email_address, null: false
5
+ t.string :password_digest, null: false
6
+
7
+ t.timestamps
8
+ end
9
+ add_index :users, :email_address, unique: true
10
+ end
11
+ end
@@ -0,0 +1,11 @@
1
+ class CreateSessions < ActiveRecord::Migration[8.0]
2
+ def change
3
+ create_table :sessions do |t|
4
+ t.references :user, null: false, foreign_key: true
5
+ t.string :ip_address
6
+ t.string :user_agent
7
+
8
+ t.timestamps
9
+ end
10
+ end
11
+ end
@@ -0,0 +1,10 @@
1
+ class CreateSubscribers < ActiveRecord::Migration[8.0]
2
+ def change
3
+ create_table :subscribers do |t|
4
+ t.belongs_to :creative, null: false, foreign_key: true
5
+ t.string :email
6
+
7
+ t.timestamps
8
+ end
9
+ end
10
+ end
@@ -0,0 +1,16 @@
1
+ class CreateNotionBlockLinks < ActiveRecord::Migration[8.0]
2
+ def change
3
+ create_table :notion_block_links do |t|
4
+ t.references :notion_page_link, null: false, foreign_key: true, index: false
5
+ t.references :creative, null: false, foreign_key: true, index: false
6
+ t.string :block_id, null: false
7
+ t.string :content_hash
8
+ t.timestamps
9
+ end
10
+
11
+ add_index :notion_block_links, :notion_page_link_id, name: "index_notion_block_links_on_notion_page_link_id"
12
+ add_index :notion_block_links, :creative_id
13
+ add_index :notion_block_links, [ :notion_page_link_id, :creative_id ], unique: true, name: "index_notion_block_links_on_page_link_and_creative"
14
+ add_index :notion_block_links, [ :notion_page_link_id, :block_id ], unique: true, name: "index_notion_block_links_on_page_link_and_block"
15
+ end
16
+ end
@@ -0,0 +1,5 @@
1
+ class AllowMultipleNotionBlocksPerCreative < ActiveRecord::Migration[8.0]
2
+ def change
3
+ remove_index :notion_block_links, name: "index_notion_block_links_on_page_link_and_creative"
4
+ end
5
+ end
@@ -0,0 +1,5 @@
1
+ class RemoveNameFromCreatives < ActiveRecord::Migration[7.0]
2
+ def change
3
+ remove_column :creatives, :name, :string
4
+ end
5
+ end
@@ -0,0 +1,5 @@
1
+ class AddParentIdToCreatives < ActiveRecord::Migration[6.0]
2
+ def change
3
+ add_reference :creatives, :parent, foreign_key: { to_table: :creatives }, index: true
4
+ end
5
+ end
@@ -0,0 +1,13 @@
1
+ class RenameInventoryCountToProgress < ActiveRecord::Migration[7.0]
2
+ def up
3
+ rename_column :creatives, :inventory_count, :progress
4
+ change_column :creatives, :progress, :float, using: 'progress::float', default: 0.0
5
+ change_column_default :creatives, :progress, 0.0
6
+ end
7
+
8
+ def down
9
+ change_column_default :creatives, :progress, nil
10
+ change_column :creatives, :progress, :integer, using: 'progress::integer'
11
+ rename_column :creatives, :progress, :inventory_count
12
+ end
13
+ end
@@ -0,0 +1,5 @@
1
+ class AddSequenceToCreatives < ActiveRecord::Migration[8.0]
2
+ def change
3
+ add_column :creatives, :sequence, :integer, default: 0, null: false
4
+ end
5
+ end
@@ -0,0 +1,10 @@
1
+ class AddUserIdToCreatives < ActiveRecord::Migration[8.0]
2
+ def up
3
+ add_reference :creatives, :user, foreign_key: true, null: true
4
+ # No NOT NULL constraint; user_id can remain null
5
+ end
6
+
7
+ def down
8
+ remove_reference :creatives, :user, foreign_key: true
9
+ end
10
+ end
@@ -0,0 +1,12 @@
1
+ class CreateCreativeShares < ActiveRecord::Migration[6.1]
2
+ def change
3
+ create_table :creative_shares do |t|
4
+ t.references :creative, null: false, foreign_key: true
5
+ t.references :user, null: false, foreign_key: true
6
+ t.integer :permission, null: false, default: 0
7
+
8
+ t.timestamps
9
+ end
10
+ add_index :creative_shares, [ :creative_id, :user_id ], unique: true
11
+ end
12
+ end
@@ -0,0 +1,5 @@
1
+ class AddOriginIdToCreatives < ActiveRecord::Migration[8.0]
2
+ def change
3
+ add_reference :creatives, :origin, foreign_key: { to_table: :creatives }, null: true
4
+ end
5
+ end
@@ -0,0 +1,9 @@
1
+ class CreateTags < ActiveRecord::Migration[7.0]
2
+ def change
3
+ create_table :tags do |t|
4
+ t.references :taggable, polymorphic: true, null: false
5
+ t.integer :creative_id, null: false
6
+ t.timestamps
7
+ end
8
+ end
9
+ end
@@ -0,0 +1,5 @@
1
+ class AddValueToTags < ActiveRecord::Migration[8.0]
2
+ def change
3
+ add_column :tags, :value, :string
4
+ end
5
+ end
@@ -0,0 +1,12 @@
1
+ class CreateLabels < ActiveRecord::Migration[8.0]
2
+ def change
3
+ create_table :labels do |t|
4
+ t.string :type
5
+ t.string :name
6
+ t.string :value
7
+ t.date :target_date
8
+
9
+ t.timestamps
10
+ end
11
+ end
12
+ end
@@ -0,0 +1,6 @@
1
+ class ChangeTagToLabelReference < ActiveRecord::Migration[7.0]
2
+ def change
3
+ remove_reference :tags, :taggable, polymorphic: true, index: true
4
+ add_reference :tags, :label, foreign_key: true
5
+ end
6
+ end
@@ -0,0 +1,10 @@
1
+ class CreateComments < ActiveRecord::Migration[7.0]
2
+ def change
3
+ create_table :comments, if_not_exists: true do |t|
4
+ t.references :creative, null: false, foreign_key: true
5
+ t.references :user, foreign_key: true
6
+ t.text :content, null: false
7
+ t.timestamps
8
+ end
9
+ end
10
+ end
@@ -0,0 +1,6 @@
1
+ class DropPlansAndVariations < ActiveRecord::Migration[6.1]
2
+ def change
3
+ drop_table :plans, if_exists: true
4
+ drop_table :variations, if_exists: true
5
+ end
6
+ end
@@ -0,0 +1,5 @@
1
+ class AddOwnerToLabels < ActiveRecord::Migration[6.1]
2
+ def change
3
+ add_reference :labels, :owner, foreign_key: { to_table: :users }
4
+ end
5
+ end
@@ -0,0 +1,7 @@
1
+ class RenameEmailAddressToEmailInUsers < ActiveRecord::Migration[8.0]
2
+ def change
3
+ remove_index :users, name: :index_users_on_email_address
4
+ rename_column :users, :email_address, :email
5
+ add_index :users, :email, unique: true
6
+ end
7
+ end
@@ -0,0 +1,16 @@
1
+ class CreateCreativeHierarchies < ActiveRecord::Migration[8.0]
2
+ def change
3
+ create_table :creative_hierarchies, id: false do |t|
4
+ t.integer :ancestor_id, null: false
5
+ t.integer :descendant_id, null: false
6
+ t.integer :generations, null: false
7
+ end
8
+
9
+ add_index :creative_hierarchies, [ :ancestor_id, :descendant_id, :generations ],
10
+ unique: true,
11
+ name: "creative_anc_desc_idx"
12
+
13
+ add_index :creative_hierarchies, [ :descendant_id ],
14
+ name: "creative_desc_idx"
15
+ end
16
+ end
@@ -0,0 +1,11 @@
1
+ class CreateCreativeExpandedStates < ActiveRecord::Migration[8.0]
2
+ def change
3
+ create_table :creative_expanded_states do |t|
4
+ t.references :creative, null: true, foreign_key: true
5
+ t.references :user, null: false, foreign_key: true
6
+ t.json :expanded_status, null: false, default: {}
7
+ t.timestamps
8
+ end
9
+ add_index :creative_expanded_states, [ :creative_id, :user_id ], unique: true
10
+ end
11
+ end
@@ -0,0 +1,15 @@
1
+ class CreateInvitations < ActiveRecord::Migration[8.0]
2
+ def change
3
+ create_table :invitations do |t|
4
+ t.string :email
5
+ t.references :inviter, null: false, foreign_key: { to_table: :users }
6
+ t.references :creative, null: false, foreign_key: true
7
+ t.integer :permission
8
+ t.datetime :expires_at
9
+ t.datetime :clicked_at
10
+ t.datetime :accepted_at
11
+
12
+ t.timestamps
13
+ end
14
+ end
15
+ end
@@ -0,0 +1,14 @@
1
+ class CreateInboxItems < ActiveRecord::Migration[8.0]
2
+ def change
3
+ create_table :inbox_items do |t|
4
+ t.text :message
5
+ t.references :owner, null: false, foreign_key: { to_table: :users }
6
+ t.string :link
7
+ t.string :state, default: "new", null: false
8
+
9
+ t.timestamps
10
+ end
11
+
12
+ add_index :inbox_items, :state
13
+ end
14
+ end
@@ -0,0 +1,43 @@
1
+ class UpdatePermissions < ActiveRecord::Migration[6.1]
2
+ def up
3
+ execute <<~SQL
4
+ UPDATE creative_shares
5
+ SET permission = CASE permission
6
+ WHEN 1 THEN 0
7
+ WHEN 2 THEN 2
8
+ WHEN 3 THEN 2
9
+ ELSE permission
10
+ END
11
+ SQL
12
+ execute <<~SQL
13
+ UPDATE invitations
14
+ SET permission = CASE permission
15
+ WHEN 1 THEN 0
16
+ WHEN 2 THEN 2
17
+ WHEN 3 THEN 2
18
+ ELSE permission
19
+ END
20
+ SQL
21
+ end
22
+
23
+ def down
24
+ execute <<~SQL
25
+ UPDATE creative_shares
26
+ SET permission = CASE permission
27
+ WHEN 0 THEN 1
28
+ WHEN 1 THEN 2
29
+ WHEN 2 THEN 3
30
+ ELSE permission
31
+ END
32
+ SQL
33
+ execute <<~SQL
34
+ UPDATE invitations
35
+ SET permission = CASE permission
36
+ WHEN 0 THEN 1
37
+ WHEN 1 THEN 2
38
+ WHEN 2 THEN 3
39
+ ELSE permission
40
+ END
41
+ SQL
42
+ end
43
+ end
@@ -0,0 +1,5 @@
1
+ class AddEmailVerifiedAtToUsers < ActiveRecord::Migration[8.0]
2
+ def change
3
+ add_column :users, :email_verified_at, :datetime
4
+ end
5
+ end
@@ -0,0 +1,5 @@
1
+ class AddAvatarToUsers < ActiveRecord::Migration[8.0]
2
+ def change
3
+ add_column :users, :avatar_url, :string
4
+ end
5
+ end
@@ -0,0 +1,5 @@
1
+ class AddDisplayLevelToUsers < ActiveRecord::Migration[8.0]
2
+ def change
3
+ add_column :users, :display_level, :integer, default: 6, null: false
4
+ end
5
+ end
@@ -0,0 +1,13 @@
1
+ class CreateEmails < ActiveRecord::Migration[8.0]
2
+ def change
3
+ create_table :emails do |t|
4
+ t.references :user, null: true, foreign_key: true
5
+ t.string :email, null: false
6
+ t.string :subject, null: false
7
+ t.text :body
8
+ t.string :event, null: false
9
+
10
+ t.timestamps
11
+ end
12
+ end
13
+ end
@@ -0,0 +1,11 @@
1
+ class CreateCommentReadPointers < ActiveRecord::Migration[8.0]
2
+ def change
3
+ create_table :comment_read_pointers do |t|
4
+ t.references :user, null: false, foreign_key: true
5
+ t.references :creative, null: false, foreign_key: true
6
+ t.integer :last_read_comment_id
7
+ t.timestamps
8
+ end
9
+ add_index :comment_read_pointers, [ :user_id, :creative_id ], unique: true
10
+ end
11
+ end
@@ -0,0 +1,5 @@
1
+ class AddCompletionMarkToUsers < ActiveRecord::Migration[8.0]
2
+ def change
3
+ add_column :users, :completion_mark, :string, default: "", null: false
4
+ end
5
+ end
@@ -0,0 +1,5 @@
1
+ class AddThemeToUsers < ActiveRecord::Migration[7.1]
2
+ def change
3
+ add_column :users, :theme, :string
4
+ end
5
+ end