@bettertogether/community-engine-vue 0.1.6 → 0.2.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (229) hide show
  1. package/README.md +140 -1
  2. package/dist/assets/BBadge.vue_vue_type_script_setup_true_lang-IIZ8QpjG-Z9WDKHqT.js +1 -0
  3. package/dist/assets/BCardText.vue_vue_type_script_setup_true_lang-Be6CD36N-B5JCTdmm.js +3 -0
  4. package/dist/assets/BFormSelect.vue_vue_type_script_setup_true_lang-BigptVap-B_HbOOZR.js +1 -0
  5. package/dist/assets/BRow.vue_vue_type_script_setup_true_lang-69TY75-8-DJdEdyx7.js +1 -0
  6. package/dist/assets/Communities-Cx4tT-bx.js +1 -0
  7. package/dist/assets/Communities-n33ssuUH.css +1 -0
  8. package/dist/assets/CommunityConversation-bBkYBs2k.css +1 -0
  9. package/dist/assets/CommunityConversation-jHAnv_Ps.js +1 -0
  10. package/dist/assets/CommunityConversations-rEDGS7To.js +1 -0
  11. package/dist/assets/CommunityEvent-CUdT0aT4.js +1 -0
  12. package/dist/assets/CommunityEvents-rsOgcxQr.js +1 -0
  13. package/dist/assets/CommunityHome-ChuTE2Nz.js +1 -0
  14. package/dist/assets/CommunityJoaTu-CpLIY_83.js +1 -0
  15. package/dist/assets/CommunityMembers-C3UtzQGp.css +1 -0
  16. package/dist/assets/CommunityMembers-DKf74ltl.js +1 -0
  17. package/dist/assets/CommunityPage-C5x23iQl.css +1 -0
  18. package/dist/assets/CommunityPage-CRYg9-rW.js +1 -0
  19. package/dist/assets/CommunityPages-IsLTNFC3.js +1 -0
  20. package/dist/assets/CommunityPost-BOnqqxVs.js +1 -0
  21. package/dist/assets/CommunityPost-BRYtkDSY.css +1 -0
  22. package/dist/assets/CommunityPosts-DY1olmcU.js +1 -0
  23. package/dist/assets/Error404-D10VQARe.js +1 -0
  24. package/dist/assets/EventCard-vfutXTdg.js +1 -0
  25. package/dist/assets/EventList-ChtehYcJ.js +1 -0
  26. package/dist/assets/ExtensionSlot-DJKbrq4c.js +1 -0
  27. package/dist/assets/PostList-BuHrBBqX.css +1 -0
  28. package/dist/assets/PostList-DYFgxlE8.js +1 -0
  29. package/dist/assets/SyncBadge-B1JBsdUk.js +1 -0
  30. package/dist/assets/SyncBadge-FNO-QLuu.css +1 -0
  31. package/dist/assets/UserPasswordNew-D_Djldm9.css +1 -0
  32. package/dist/assets/UserPasswordNew-al9bNBTZ.js +1 -0
  33. package/dist/assets/UserPasswordReset-42zs98RW.js +1 -0
  34. package/dist/assets/UserPasswordReset-D_6OQDZY.css +1 -0
  35. package/dist/assets/UserResendConfirmation-CGavYB81.js +1 -0
  36. package/dist/assets/UserResendConfirmation-DNTHcaar.css +1 -0
  37. package/dist/assets/UserSignIn-BIRb0HkV.js +1 -0
  38. package/dist/assets/UserSignIn-C-Pol8OD.css +1 -0
  39. package/dist/assets/UserSignUp-ChkKQAd2.css +1 -0
  40. package/dist/assets/UserSignUp-Df6o3vlO.js +1 -0
  41. package/dist/assets/better-together-logo-61cxo5d5.png +0 -0
  42. package/dist/assets/index-BFt-JKVh.css +5 -0
  43. package/dist/assets/index-COo3Jb7v.js +1088 -0
  44. package/dist/assets/nodefs-Bfyh92qg.js +1 -0
  45. package/dist/assets/opfs-ahp-BLzlXf6u.js +3 -0
  46. package/dist/assets/pglite-BdRI_ZYT.wasm +0 -0
  47. package/dist/assets/pglite-COscPi1Y.data +0 -0
  48. package/dist/assets/usePages-DDjDQRCy.js +1 -0
  49. package/dist/assets/usePosts-Bf2Ccwr4.js +1 -0
  50. package/{public → dist}/index.html +9 -19
  51. package/package.json +57 -45
  52. package/src/BtApp.vue +34 -43
  53. package/src/components/BtBrandingLogo.vue +10 -18
  54. package/src/components/BtHeader.vue +34 -84
  55. package/src/components/BtMainContent.vue +12 -43
  56. package/src/components/BtNavBar.vue +25 -38
  57. package/src/components/BtNavItem.vue +25 -58
  58. package/src/components/BtNavUser.vue +65 -86
  59. package/src/components/BtProfileForm.vue +48 -39
  60. package/src/components/BtUserNewPasswordForm.vue +52 -74
  61. package/src/components/BtUserResendConfirmationForm.vue +45 -83
  62. package/src/components/BtUserResetPasswordForm.vue +45 -77
  63. package/src/components/BtUserSignInForm.vue +59 -75
  64. package/src/components/BtUserSignUpForm.vue +90 -103
  65. package/src/components/CommunityForm.vue +47 -39
  66. package/src/components/community/CommunityCard.vue +113 -0
  67. package/src/components/community/CommunityHeader.vue +91 -0
  68. package/src/components/community/CommunityList.vue +59 -0
  69. package/src/components/community/MemberRoleRow.vue +107 -0
  70. package/src/components/conversation/ConversationCard.vue +49 -0
  71. package/src/components/conversation/ConversationDetail.vue +53 -0
  72. package/src/components/conversation/ConversationList.vue +51 -0
  73. package/src/components/conversation/MessageForm.vue +45 -0
  74. package/src/components/conversation/MessageItem.vue +43 -0
  75. package/src/components/conversation/MessageList.vue +39 -0
  76. package/src/components/event/EventCard.vue +82 -0
  77. package/src/components/event/EventForm.vue +99 -0
  78. package/src/components/event/EventList.vue +47 -0
  79. package/src/components/invitation/InvitationCard.vue +56 -0
  80. package/src/components/invitation/InvitationForm.vue +70 -0
  81. package/src/components/invitation/InvitationList.vue +51 -0
  82. package/src/components/joatu/AgreementCard.vue +57 -0
  83. package/src/components/joatu/AgreementList.vue +51 -0
  84. package/src/components/joatu/OfferCard.vue +65 -0
  85. package/src/components/joatu/OfferForm.vue +82 -0
  86. package/src/components/joatu/OfferList.vue +51 -0
  87. package/src/components/joatu/RequestCard.vue +65 -0
  88. package/src/components/joatu/RequestForm.vue +82 -0
  89. package/src/components/joatu/RequestList.vue +51 -0
  90. package/src/components/page/PageCard.vue +55 -0
  91. package/src/components/page/PageDetail.vue +35 -0
  92. package/src/components/page/PageList.vue +51 -0
  93. package/src/components/person/MemberList.vue +61 -0
  94. package/src/components/person/PersonAvatar.vue +54 -0
  95. package/src/components/person/PersonCard.vue +47 -0
  96. package/src/components/post/PostCard.vue +105 -0
  97. package/src/components/post/PostDetail.vue +98 -0
  98. package/src/components/post/PostForm.vue +84 -0
  99. package/src/components/post/PostList.vue +53 -0
  100. package/src/components/role/BlockButton.vue +44 -0
  101. package/src/components/role/RoleBadge.vue +19 -0
  102. package/src/components/role/RoleGate.vue +62 -0
  103. package/src/components/role/RoleSelector.vue +29 -0
  104. package/src/components/shared/ExtensionSlot.vue +27 -0
  105. package/src/components/sync/OfflineBanner.vue +49 -0
  106. package/src/components/sync/SyncBadge.vue +108 -0
  107. package/src/components/sync/SyncStatusBar.vue +121 -0
  108. package/src/composables/useCommunities.js +19 -0
  109. package/src/composables/useConversations.js +5 -0
  110. package/src/composables/useEvents.js +28 -0
  111. package/src/composables/useInvitations.js +10 -0
  112. package/src/composables/useJoaTuAgreements.js +11 -0
  113. package/src/composables/useJoaTuOffers.js +10 -0
  114. package/src/composables/useJoaTuRequests.js +10 -0
  115. package/src/composables/useMembers.js +30 -0
  116. package/src/composables/useMessages.js +5 -0
  117. package/src/composables/useNotifications.js +5 -0
  118. package/src/composables/usePages.js +6 -0
  119. package/src/composables/usePersonBlocks.js +65 -0
  120. package/src/composables/usePosts.js +27 -0
  121. package/src/composables/useResource.js +137 -0
  122. package/src/composables/useRoles.js +94 -0
  123. package/src/composables/useSyncStatus.js +22 -0
  124. package/src/composables/useToaster.js +20 -0
  125. package/src/context.js +18 -0
  126. package/src/db/client.js +343 -0
  127. package/src/db/migrations/001_initial.sql +131 -0
  128. package/src/db/migrations/003_conversations_invitations_pages_joatu.sql +76 -0
  129. package/src/db/sync.js +276 -0
  130. package/src/endpoints/BtApiAuth.js +1 -1
  131. package/src/endpoints/BtApiV1.js +1 -1
  132. package/src/extension.js +45 -0
  133. package/src/i18n/index.js +103 -0
  134. package/src/i18n/locales/en.json +275 -0
  135. package/src/i18n/locales/es.json +275 -0
  136. package/src/i18n/locales/fr.json +223 -0
  137. package/src/i18n/locales/uk.json +275 -0
  138. package/src/index.js +168 -22
  139. package/src/layouts/CommunityLayout.vue +89 -0
  140. package/src/main.js +16 -12
  141. package/src/mixins/error-handling.js +6 -15
  142. package/src/mixins/toaster.js +15 -10
  143. package/src/pages/Communities.vue +59 -0
  144. package/src/pages/Error404.vue +10 -14
  145. package/src/pages/Home.vue +11 -18
  146. package/src/pages/Me.vue +39 -59
  147. package/src/pages/UserPasswordNew.vue +12 -68
  148. package/src/pages/UserPasswordReset.vue +15 -64
  149. package/src/pages/UserResendConfirmation.vue +39 -113
  150. package/src/pages/UserSignIn.vue +18 -67
  151. package/src/pages/UserSignUp.vue +15 -64
  152. package/src/pages/community/CommunityConversation.vue +31 -0
  153. package/src/pages/community/CommunityConversations.vue +18 -0
  154. package/src/pages/community/CommunityEvent.vue +39 -0
  155. package/src/pages/community/CommunityEvents.vue +58 -0
  156. package/src/pages/community/CommunityHome.vue +49 -0
  157. package/src/pages/community/CommunityJoaTu.vue +115 -0
  158. package/src/pages/community/CommunityMembers.vue +23 -0
  159. package/src/pages/community/CommunityPage.vue +31 -0
  160. package/src/pages/community/CommunityPages.vue +25 -0
  161. package/src/pages/community/CommunityPost.vue +28 -0
  162. package/src/pages/community/CommunityPosts.vue +58 -0
  163. package/src/pages/community/CommunitySettingsPage.vue +117 -0
  164. package/src/pages/community/RoleManagerPage.vue +93 -0
  165. package/src/plugins/bootstrap-vue.js +5 -5
  166. package/src/plugins/font-awesome.js +3 -2
  167. package/src/plugins/index.js +9 -4
  168. package/src/plugins/progress.js +16 -0
  169. package/src/pwa/index.js +156 -0
  170. package/src/pwa/sw-helpers.js +130 -0
  171. package/src/router/communityRoutes.js +78 -0
  172. package/src/router/index.js +30 -144
  173. package/src/slot-registry.js +15 -0
  174. package/src/stores/auth.js +134 -0
  175. package/src/stores/communities.js +59 -0
  176. package/src/stores/index.js +5 -0
  177. package/src/stores/menus.js +14 -0
  178. package/src/stores/people.js +48 -0
  179. package/src/stores/sync.js +93 -0
  180. package/src/stylesheets/sync-indicators.scss +34 -0
  181. package/.env.sample +0 -1
  182. package/.eslintrc.js +0 -51
  183. package/.gitlab-ci.yml +0 -14
  184. package/.travis/.rbenv-gemsets +0 -1
  185. package/.travis/.ruby-version +0 -1
  186. package/.travis.yml +0 -31
  187. package/babel.config.js +0 -5
  188. package/cypress.json +0 -3
  189. package/deploy/build.sh +0 -8
  190. package/eslint.config.js +0 -16
  191. package/postcss.config.js +0 -5
  192. package/src/eslint.config.js +0 -16
  193. package/src/forms/BtProfileFormSchema.js +0 -19
  194. package/src/forms/BtUserConfirmationFormSchema.js +0 -20
  195. package/src/forms/BtUserNewPasswordFormSchema.js +0 -29
  196. package/src/forms/BtUserResetPasswordFormSchema.js +0 -20
  197. package/src/forms/BtUserSignInFormSchema.js +0 -29
  198. package/src/forms/BtUserSignUpFormSchema.js +0 -63
  199. package/src/forms/CommunityFormSchema.js +0 -19
  200. package/src/plugins/vue-form-generator.js +0 -4
  201. package/src/plugins/vue-loading.js +0 -10
  202. package/src/registerServiceWorker.js +0 -32
  203. package/src/store/index.js +0 -32
  204. package/src/store/modules/authentication.js +0 -170
  205. package/src/store/modules/communities.js +0 -98
  206. package/src/store/modules/community-engine.js +0 -14
  207. package/src/store/modules/menus.js +0 -52
  208. package/src/store/modules/people.js +0 -88
  209. package/tests/e2e/.eslintrc.js +0 -12
  210. package/tests/e2e/plugins/index.js +0 -26
  211. package/tests/e2e/specs/home.js +0 -8
  212. package/tests/e2e/support/commands.js +0 -25
  213. package/tests/e2e/support/index.js +0 -20
  214. package/tests/unit/.eslintrc.js +0 -5
  215. package/tests/unit/example.spec.js +0 -13
  216. package/vue.config.js +0 -11
  217. package/webpack.config.js +0 -28
  218. /package/{public → dist}/_redirects +0 -0
  219. /package/{public → dist}/favicon.ico +0 -0
  220. /package/{public → dist}/img/favicon.ico +0 -0
  221. /package/{public → dist}/img/icons/android-chrome-192x192.png +0 -0
  222. /package/{public → dist}/img/icons/android-chrome-384x384.png +0 -0
  223. /package/{public → dist}/img/icons/apple-touch-icon.png +0 -0
  224. /package/{public → dist}/img/icons/favicon-16x16.png +0 -0
  225. /package/{public → dist}/img/icons/favicon-32x32.png +0 -0
  226. /package/{public → dist}/img/icons/favicon.ico +0 -0
  227. /package/{public → dist}/img/icons/mstile-150x150.png +0 -0
  228. /package/{public → dist}/img/icons/safari-pinned-tab.svg +0 -0
  229. /package/{public → dist}/robots.txt +0 -0
@@ -0,0 +1,343 @@
1
+ import { PGlite } from '@electric-sql/pglite'
2
+
3
+ // SQL migration inlined to avoid Vite ?raw import complexity
4
+ const migrationSql = `
5
+ CREATE TABLE IF NOT EXISTS people (
6
+ id TEXT PRIMARY KEY,
7
+ slug TEXT,
8
+ identifier TEXT,
9
+ name TEXT,
10
+ privacy TEXT DEFAULT 'public',
11
+ locale TEXT,
12
+ time_zone TEXT,
13
+ profile_image_url TEXT,
14
+ cover_image_url TEXT,
15
+ email TEXT,
16
+ handle TEXT,
17
+ notify_by_email INTEGER DEFAULT 0,
18
+ receive_messages INTEGER DEFAULT 0,
19
+ _sync_status TEXT NOT NULL DEFAULT 'local',
20
+ _local_updated TEXT NOT NULL DEFAULT (strftime('%Y-%m-%dT%H:%M:%fZ','now')),
21
+ _server_at TEXT
22
+ );
23
+
24
+ CREATE TABLE IF NOT EXISTS communities (
25
+ id TEXT PRIMARY KEY,
26
+ slug TEXT,
27
+ identifier TEXT,
28
+ name TEXT,
29
+ description TEXT,
30
+ privacy TEXT DEFAULT 'public',
31
+ protected INTEGER DEFAULT 0,
32
+ host INTEGER DEFAULT 0,
33
+ profile_image_url TEXT,
34
+ cover_image_url TEXT,
35
+ logo_url TEXT,
36
+ creator_id TEXT,
37
+ _sync_status TEXT NOT NULL DEFAULT 'local',
38
+ _local_updated TEXT NOT NULL DEFAULT (strftime('%Y-%m-%dT%H:%M:%fZ','now')),
39
+ _server_at TEXT
40
+ );
41
+
42
+ CREATE TABLE IF NOT EXISTS posts (
43
+ id TEXT PRIMARY KEY,
44
+ slug TEXT,
45
+ title TEXT,
46
+ content TEXT,
47
+ privacy TEXT DEFAULT 'public',
48
+ published_at TEXT,
49
+ author_id TEXT,
50
+ community_id TEXT,
51
+ _sync_status TEXT NOT NULL DEFAULT 'local',
52
+ _local_updated TEXT NOT NULL DEFAULT (strftime('%Y-%m-%dT%H:%M:%fZ','now')),
53
+ _server_at TEXT
54
+ );
55
+
56
+ CREATE TABLE IF NOT EXISTS events (
57
+ id TEXT PRIMARY KEY,
58
+ slug TEXT,
59
+ name TEXT,
60
+ description TEXT,
61
+ starts_at TEXT,
62
+ ends_at TEXT,
63
+ privacy TEXT DEFAULT 'public',
64
+ community_id TEXT,
65
+ _sync_status TEXT NOT NULL DEFAULT 'local',
66
+ _local_updated TEXT NOT NULL DEFAULT (strftime('%Y-%m-%dT%H:%M:%fZ','now')),
67
+ _server_at TEXT
68
+ );
69
+
70
+ CREATE TABLE IF NOT EXISTS conversations (
71
+ id TEXT PRIMARY KEY,
72
+ subject TEXT,
73
+ community_id TEXT,
74
+ creator_id TEXT,
75
+ _sync_status TEXT NOT NULL DEFAULT 'local',
76
+ _local_updated TEXT NOT NULL DEFAULT (strftime('%Y-%m-%dT%H:%M:%fZ','now')),
77
+ _server_at TEXT
78
+ );
79
+
80
+ CREATE TABLE IF NOT EXISTS messages (
81
+ id TEXT PRIMARY KEY,
82
+ content TEXT,
83
+ conversation_id TEXT,
84
+ author_id TEXT,
85
+ _sync_status TEXT NOT NULL DEFAULT 'local',
86
+ _local_updated TEXT NOT NULL DEFAULT (strftime('%Y-%m-%dT%H:%M:%fZ','now')),
87
+ _server_at TEXT
88
+ );
89
+
90
+ CREATE TABLE IF NOT EXISTS notifications (
91
+ id TEXT PRIMARY KEY,
92
+ message TEXT,
93
+ read INTEGER DEFAULT 0,
94
+ notifiable_type TEXT,
95
+ notifiable_id TEXT,
96
+ person_id TEXT,
97
+ created_at TEXT,
98
+ _sync_status TEXT NOT NULL DEFAULT 'local',
99
+ _local_updated TEXT NOT NULL DEFAULT (strftime('%Y-%m-%dT%H:%M:%fZ','now')),
100
+ _server_at TEXT
101
+ );
102
+
103
+ CREATE TABLE IF NOT EXISTS navigation_areas (
104
+ id TEXT PRIMARY KEY,
105
+ slug TEXT,
106
+ name TEXT,
107
+ position TEXT,
108
+ _sync_status TEXT NOT NULL DEFAULT 'local',
109
+ _local_updated TEXT NOT NULL DEFAULT (strftime('%Y-%m-%dT%H:%M:%fZ','now')),
110
+ _server_at TEXT
111
+ );
112
+
113
+ CREATE TABLE IF NOT EXISTS navigation_items (
114
+ id TEXT PRIMARY KEY,
115
+ label TEXT,
116
+ url TEXT,
117
+ path TEXT,
118
+ external INTEGER DEFAULT 0,
119
+ sort_order INTEGER DEFAULT 0,
120
+ navigation_area_id TEXT,
121
+ _sync_status TEXT NOT NULL DEFAULT 'local',
122
+ _local_updated TEXT NOT NULL DEFAULT (strftime('%Y-%m-%dT%H:%M:%fZ','now')),
123
+ _server_at TEXT
124
+ );
125
+
126
+ CREATE TABLE IF NOT EXISTS _schema_versions (
127
+ version INTEGER PRIMARY KEY,
128
+ applied_at TEXT NOT NULL DEFAULT (strftime('%Y-%m-%dT%H:%M:%fZ','now'))
129
+ );
130
+
131
+ INSERT OR IGNORE INTO _schema_versions (version) VALUES (1);
132
+ `
133
+
134
+ const migration2Sql = `
135
+ CREATE TABLE IF NOT EXISTS person_community_memberships (
136
+ id TEXT PRIMARY KEY,
137
+ person_id TEXT NOT NULL,
138
+ community_id TEXT NOT NULL,
139
+ role TEXT DEFAULT 'member',
140
+ joined_at TEXT,
141
+ left_at TEXT,
142
+ _sync_status TEXT NOT NULL DEFAULT 'local',
143
+ _local_updated TEXT NOT NULL DEFAULT (strftime('%Y-%m-%dT%H:%M:%fZ','now')),
144
+ _server_at TEXT
145
+ );
146
+
147
+ CREATE TABLE IF NOT EXISTS uploads (
148
+ id TEXT PRIMARY KEY,
149
+ url TEXT,
150
+ content_type TEXT,
151
+ filename TEXT,
152
+ filesize INTEGER,
153
+ attachable_type TEXT,
154
+ attachable_id TEXT,
155
+ _sync_status TEXT NOT NULL DEFAULT 'local',
156
+ _local_updated TEXT NOT NULL DEFAULT (strftime('%Y-%m-%dT%H:%M:%fZ','now')),
157
+ _server_at TEXT
158
+ );
159
+
160
+ INSERT OR IGNORE INTO _schema_versions (version) VALUES (2);
161
+ `
162
+
163
+ const migration3Sql = `
164
+ CREATE TABLE IF NOT EXISTS invitations (
165
+ id TEXT PRIMARY KEY,
166
+ email TEXT,
167
+ name TEXT,
168
+ token TEXT,
169
+ status TEXT NOT NULL DEFAULT 'pending',
170
+ message TEXT,
171
+ community_id TEXT,
172
+ inviter_id TEXT,
173
+ invitee_id TEXT,
174
+ expires_at TEXT,
175
+ _sync_status TEXT NOT NULL DEFAULT 'local',
176
+ _local_updated TEXT NOT NULL DEFAULT (strftime('%Y-%m-%dT%H:%M:%fZ','now')),
177
+ _server_at TEXT
178
+ );
179
+
180
+ CREATE TABLE IF NOT EXISTS pages (
181
+ id TEXT PRIMARY KEY,
182
+ slug TEXT,
183
+ title TEXT,
184
+ content TEXT,
185
+ privacy TEXT DEFAULT 'public',
186
+ published_at TEXT,
187
+ community_id TEXT,
188
+ author_id TEXT,
189
+ _sync_status TEXT NOT NULL DEFAULT 'local',
190
+ _local_updated TEXT NOT NULL DEFAULT (strftime('%Y-%m-%dT%H:%M:%fZ','now')),
191
+ _server_at TEXT
192
+ );
193
+
194
+ CREATE TABLE IF NOT EXISTS joa_tu_offers (
195
+ id TEXT PRIMARY KEY,
196
+ title TEXT NOT NULL,
197
+ description TEXT,
198
+ time_credits INTEGER NOT NULL DEFAULT 1,
199
+ status TEXT NOT NULL DEFAULT 'open',
200
+ category TEXT,
201
+ community_id TEXT,
202
+ offerer_id TEXT,
203
+ _sync_status TEXT NOT NULL DEFAULT 'local',
204
+ _local_updated TEXT NOT NULL DEFAULT (strftime('%Y-%m-%dT%H:%M:%fZ','now')),
205
+ _server_at TEXT
206
+ );
207
+
208
+ CREATE TABLE IF NOT EXISTS joa_tu_requests (
209
+ id TEXT PRIMARY KEY,
210
+ title TEXT NOT NULL,
211
+ description TEXT,
212
+ time_credits INTEGER NOT NULL DEFAULT 1,
213
+ status TEXT NOT NULL DEFAULT 'open',
214
+ category TEXT,
215
+ community_id TEXT,
216
+ requester_id TEXT,
217
+ _sync_status TEXT NOT NULL DEFAULT 'local',
218
+ _local_updated TEXT NOT NULL DEFAULT (strftime('%Y-%m-%dT%H:%M:%fZ','now')),
219
+ _server_at TEXT
220
+ );
221
+
222
+ CREATE TABLE IF NOT EXISTS joa_tu_agreements (
223
+ id TEXT PRIMARY KEY,
224
+ time_credits INTEGER NOT NULL DEFAULT 1,
225
+ status TEXT NOT NULL DEFAULT 'pending',
226
+ notes TEXT,
227
+ offer_id TEXT,
228
+ request_id TEXT,
229
+ provider_id TEXT,
230
+ receiver_id TEXT,
231
+ community_id TEXT,
232
+ agreed_at TEXT,
233
+ completed_at TEXT,
234
+ _sync_status TEXT NOT NULL DEFAULT 'local',
235
+ _local_updated TEXT NOT NULL DEFAULT (strftime('%Y-%m-%dT%H:%M:%fZ','now')),
236
+ _server_at TEXT
237
+ );
238
+
239
+ INSERT OR IGNORE INTO _schema_versions (version) VALUES (3);
240
+ `
241
+
242
+ const migration4Sql = `
243
+ CREATE TABLE IF NOT EXISTS roles (
244
+ id TEXT PRIMARY KEY,
245
+ name TEXT NOT NULL,
246
+ slug TEXT NOT NULL,
247
+ description TEXT,
248
+ resource_type TEXT,
249
+ resource_id TEXT,
250
+ _sync_status TEXT NOT NULL DEFAULT 'local',
251
+ _local_updated TEXT NOT NULL DEFAULT (strftime('%Y-%m-%dT%H:%M:%fZ','now')),
252
+ _server_at TEXT
253
+ );
254
+
255
+ CREATE TABLE IF NOT EXISTS person_roles (
256
+ id TEXT PRIMARY KEY,
257
+ person_id TEXT NOT NULL,
258
+ role_id TEXT NOT NULL,
259
+ resource_type TEXT,
260
+ resource_id TEXT,
261
+ granted_at TEXT NOT NULL DEFAULT (strftime('%Y-%m-%dT%H:%M:%fZ','now')),
262
+ granted_by_id TEXT,
263
+ _sync_status TEXT NOT NULL DEFAULT 'local',
264
+ _local_updated TEXT NOT NULL DEFAULT (strftime('%Y-%m-%dT%H:%M:%fZ','now')),
265
+ _server_at TEXT
266
+ );
267
+
268
+ CREATE TABLE IF NOT EXISTS person_blocks (
269
+ id TEXT PRIMARY KEY,
270
+ blocker_id TEXT NOT NULL,
271
+ blocked_id TEXT NOT NULL,
272
+ reason TEXT,
273
+ created_at TEXT NOT NULL DEFAULT (strftime('%Y-%m-%dT%H:%M:%fZ','now')),
274
+ _sync_status TEXT NOT NULL DEFAULT 'local',
275
+ _local_updated TEXT NOT NULL DEFAULT (strftime('%Y-%m-%dT%H:%M:%fZ','now')),
276
+ _server_at TEXT
277
+ );
278
+
279
+ INSERT OR IGNORE INTO _schema_versions (version) VALUES (4);
280
+ `
281
+
282
+ // Extension migrations registered by companion packages before getDb() is first called
283
+ const _extensionMigrations = [] // { version: number, sql: string }[]
284
+
285
+ export function registerExtensionMigration(version, sql) {
286
+ _extensionMigrations.push({ version, sql })
287
+ }
288
+
289
+ let _db = null
290
+ let _initPromise = null
291
+
292
+ async function applyMigrations(db) {
293
+ await db.exec(`
294
+ CREATE TABLE IF NOT EXISTS _schema_versions (
295
+ version INTEGER PRIMARY KEY,
296
+ applied_at TEXT NOT NULL DEFAULT (strftime('%Y-%m-%dT%H:%M:%fZ','now'))
297
+ );
298
+ `)
299
+ const { rows } = await db.query('SELECT MAX(version) AS v FROM _schema_versions')
300
+ const currentVersion = rows[0]?.v ?? 0
301
+
302
+ if (currentVersion < 1) {
303
+ await db.exec(migrationSql)
304
+ }
305
+
306
+ if (currentVersion < 2) {
307
+ await db.exec(migration2Sql)
308
+ }
309
+
310
+ if (currentVersion < 3) {
311
+ await db.exec(migration3Sql)
312
+ }
313
+
314
+ if (currentVersion < 4) {
315
+ await db.exec(migration4Sql)
316
+ }
317
+
318
+ // Extension migrations (sorted by version, registered before first getDb() call)
319
+ const sortedExtMigrations = [..._extensionMigrations].sort((a, b) => a.version - b.version)
320
+ for (const { version, sql } of sortedExtMigrations) {
321
+ if (currentVersion < version) {
322
+ await db.exec(sql)
323
+ }
324
+ }
325
+ }
326
+
327
+ async function initDb() {
328
+ const db = new PGlite('idb://community-engine')
329
+ await applyMigrations(db)
330
+ return db
331
+ }
332
+
333
+ export async function getDb() {
334
+ if (_db) return _db
335
+ if (!_initPromise) _initPromise = initDb()
336
+ _db = await _initPromise
337
+ return _db
338
+ }
339
+
340
+ export function resetDb() {
341
+ _db = null
342
+ _initPromise = null
343
+ }
@@ -0,0 +1,131 @@
1
+ -- Initial local schema for community-engine-vue
2
+ -- Mirrors the JSON:API resources exposed by the Rails community-engine
3
+
4
+ CREATE TABLE IF NOT EXISTS people (
5
+ id TEXT PRIMARY KEY,
6
+ slug TEXT,
7
+ identifier TEXT,
8
+ name TEXT,
9
+ privacy TEXT DEFAULT 'public',
10
+ locale TEXT,
11
+ time_zone TEXT,
12
+ profile_image_url TEXT,
13
+ cover_image_url TEXT,
14
+ email TEXT,
15
+ handle TEXT,
16
+ notify_by_email INTEGER DEFAULT 0,
17
+ receive_messages INTEGER DEFAULT 0,
18
+ _sync_status TEXT NOT NULL DEFAULT 'local',
19
+ _local_updated TEXT NOT NULL DEFAULT (strftime('%Y-%m-%dT%H:%M:%fZ','now')),
20
+ _server_at TEXT
21
+ );
22
+
23
+ CREATE TABLE IF NOT EXISTS communities (
24
+ id TEXT PRIMARY KEY,
25
+ slug TEXT,
26
+ identifier TEXT,
27
+ name TEXT,
28
+ description TEXT,
29
+ privacy TEXT DEFAULT 'public',
30
+ protected INTEGER DEFAULT 0,
31
+ host INTEGER DEFAULT 0,
32
+ profile_image_url TEXT,
33
+ cover_image_url TEXT,
34
+ logo_url TEXT,
35
+ creator_id TEXT,
36
+ _sync_status TEXT NOT NULL DEFAULT 'local',
37
+ _local_updated TEXT NOT NULL DEFAULT (strftime('%Y-%m-%dT%H:%M:%fZ','now')),
38
+ _server_at TEXT
39
+ );
40
+
41
+ CREATE TABLE IF NOT EXISTS posts (
42
+ id TEXT PRIMARY KEY,
43
+ slug TEXT,
44
+ title TEXT,
45
+ content TEXT,
46
+ privacy TEXT DEFAULT 'public',
47
+ published_at TEXT,
48
+ author_id TEXT,
49
+ community_id TEXT,
50
+ _sync_status TEXT NOT NULL DEFAULT 'local',
51
+ _local_updated TEXT NOT NULL DEFAULT (strftime('%Y-%m-%dT%H:%M:%fZ','now')),
52
+ _server_at TEXT
53
+ );
54
+
55
+ CREATE TABLE IF NOT EXISTS events (
56
+ id TEXT PRIMARY KEY,
57
+ slug TEXT,
58
+ name TEXT,
59
+ description TEXT,
60
+ starts_at TEXT,
61
+ ends_at TEXT,
62
+ privacy TEXT DEFAULT 'public',
63
+ community_id TEXT,
64
+ _sync_status TEXT NOT NULL DEFAULT 'local',
65
+ _local_updated TEXT NOT NULL DEFAULT (strftime('%Y-%m-%dT%H:%M:%fZ','now')),
66
+ _server_at TEXT
67
+ );
68
+
69
+ CREATE TABLE IF NOT EXISTS conversations (
70
+ id TEXT PRIMARY KEY,
71
+ subject TEXT,
72
+ community_id TEXT,
73
+ creator_id TEXT,
74
+ _sync_status TEXT NOT NULL DEFAULT 'local',
75
+ _local_updated TEXT NOT NULL DEFAULT (strftime('%Y-%m-%dT%H:%M:%fZ','now')),
76
+ _server_at TEXT
77
+ );
78
+
79
+ CREATE TABLE IF NOT EXISTS messages (
80
+ id TEXT PRIMARY KEY,
81
+ content TEXT,
82
+ conversation_id TEXT,
83
+ author_id TEXT,
84
+ _sync_status TEXT NOT NULL DEFAULT 'local',
85
+ _local_updated TEXT NOT NULL DEFAULT (strftime('%Y-%m-%dT%H:%M:%fZ','now')),
86
+ _server_at TEXT
87
+ );
88
+
89
+ CREATE TABLE IF NOT EXISTS notifications (
90
+ id TEXT PRIMARY KEY,
91
+ message TEXT,
92
+ read INTEGER DEFAULT 0,
93
+ notifiable_type TEXT,
94
+ notifiable_id TEXT,
95
+ person_id TEXT,
96
+ created_at TEXT,
97
+ _sync_status TEXT NOT NULL DEFAULT 'local',
98
+ _local_updated TEXT NOT NULL DEFAULT (strftime('%Y-%m-%dT%H:%M:%fZ','now')),
99
+ _server_at TEXT
100
+ );
101
+
102
+ CREATE TABLE IF NOT EXISTS navigation_areas (
103
+ id TEXT PRIMARY KEY,
104
+ slug TEXT,
105
+ name TEXT,
106
+ position TEXT,
107
+ _sync_status TEXT NOT NULL DEFAULT 'local',
108
+ _local_updated TEXT NOT NULL DEFAULT (strftime('%Y-%m-%dT%H:%M:%fZ','now')),
109
+ _server_at TEXT
110
+ );
111
+
112
+ CREATE TABLE IF NOT EXISTS navigation_items (
113
+ id TEXT PRIMARY KEY,
114
+ label TEXT,
115
+ url TEXT,
116
+ path TEXT,
117
+ external INTEGER DEFAULT 0,
118
+ sort_order INTEGER DEFAULT 0,
119
+ navigation_area_id TEXT,
120
+ _sync_status TEXT NOT NULL DEFAULT 'local',
121
+ _local_updated TEXT NOT NULL DEFAULT (strftime('%Y-%m-%dT%H:%M:%fZ','now')),
122
+ _server_at TEXT
123
+ );
124
+
125
+ -- Schema version tracking
126
+ CREATE TABLE IF NOT EXISTS _schema_versions (
127
+ version INTEGER PRIMARY KEY,
128
+ applied_at TEXT NOT NULL DEFAULT (strftime('%Y-%m-%dT%H:%M:%fZ','now'))
129
+ );
130
+
131
+ INSERT OR IGNORE INTO _schema_versions (version) VALUES (1);
@@ -0,0 +1,76 @@
1
+ CREATE TABLE IF NOT EXISTS invitations (
2
+ id TEXT PRIMARY KEY,
3
+ email TEXT,
4
+ name TEXT,
5
+ token TEXT,
6
+ status TEXT NOT NULL DEFAULT 'pending',
7
+ message TEXT,
8
+ community_id TEXT,
9
+ inviter_id TEXT,
10
+ invitee_id TEXT,
11
+ expires_at TEXT,
12
+ _sync_status TEXT NOT NULL DEFAULT 'local',
13
+ _local_updated TEXT NOT NULL DEFAULT (strftime('%Y-%m-%dT%H:%M:%fZ','now')),
14
+ _server_at TEXT
15
+ );
16
+
17
+ CREATE TABLE IF NOT EXISTS pages (
18
+ id TEXT PRIMARY KEY,
19
+ slug TEXT,
20
+ title TEXT,
21
+ content TEXT,
22
+ privacy TEXT DEFAULT 'public',
23
+ published_at TEXT,
24
+ community_id TEXT,
25
+ author_id TEXT,
26
+ _sync_status TEXT NOT NULL DEFAULT 'local',
27
+ _local_updated TEXT NOT NULL DEFAULT (strftime('%Y-%m-%dT%H:%M:%fZ','now')),
28
+ _server_at TEXT
29
+ );
30
+
31
+ CREATE TABLE IF NOT EXISTS joa_tu_offers (
32
+ id TEXT PRIMARY KEY,
33
+ title TEXT NOT NULL,
34
+ description TEXT,
35
+ time_credits INTEGER NOT NULL DEFAULT 1,
36
+ status TEXT NOT NULL DEFAULT 'open',
37
+ category TEXT,
38
+ community_id TEXT,
39
+ offerer_id TEXT,
40
+ _sync_status TEXT NOT NULL DEFAULT 'local',
41
+ _local_updated TEXT NOT NULL DEFAULT (strftime('%Y-%m-%dT%H:%M:%fZ','now')),
42
+ _server_at TEXT
43
+ );
44
+
45
+ CREATE TABLE IF NOT EXISTS joa_tu_requests (
46
+ id TEXT PRIMARY KEY,
47
+ title TEXT NOT NULL,
48
+ description TEXT,
49
+ time_credits INTEGER NOT NULL DEFAULT 1,
50
+ status TEXT NOT NULL DEFAULT 'open',
51
+ category TEXT,
52
+ community_id TEXT,
53
+ requester_id TEXT,
54
+ _sync_status TEXT NOT NULL DEFAULT 'local',
55
+ _local_updated TEXT NOT NULL DEFAULT (strftime('%Y-%m-%dT%H:%M:%fZ','now')),
56
+ _server_at TEXT
57
+ );
58
+
59
+ CREATE TABLE IF NOT EXISTS joa_tu_agreements (
60
+ id TEXT PRIMARY KEY,
61
+ time_credits INTEGER NOT NULL DEFAULT 1,
62
+ status TEXT NOT NULL DEFAULT 'pending',
63
+ notes TEXT,
64
+ offer_id TEXT,
65
+ request_id TEXT,
66
+ provider_id TEXT,
67
+ receiver_id TEXT,
68
+ community_id TEXT,
69
+ agreed_at TEXT,
70
+ completed_at TEXT,
71
+ _sync_status TEXT NOT NULL DEFAULT 'local',
72
+ _local_updated TEXT NOT NULL DEFAULT (strftime('%Y-%m-%dT%H:%M:%fZ','now')),
73
+ _server_at TEXT
74
+ );
75
+
76
+ INSERT OR IGNORE INTO _schema_versions (version) VALUES (3);