@bettertogether/community-engine-vue 0.1.7 → 0.2.3
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.
- package/README.md +140 -1
- package/dist/assets/BBadge.vue_vue_type_script_setup_true_lang-IIZ8QpjG-Z9WDKHqT.js +1 -0
- package/dist/assets/BCardText.vue_vue_type_script_setup_true_lang-Be6CD36N-B5JCTdmm.js +3 -0
- package/dist/assets/BFormSelect.vue_vue_type_script_setup_true_lang-BigptVap-B_HbOOZR.js +1 -0
- package/dist/assets/BRow.vue_vue_type_script_setup_true_lang-69TY75-8-DJdEdyx7.js +1 -0
- package/dist/assets/Communities-Cx4tT-bx.js +1 -0
- package/dist/assets/Communities-n33ssuUH.css +1 -0
- package/dist/assets/CommunityConversation-bBkYBs2k.css +1 -0
- package/dist/assets/CommunityConversation-jHAnv_Ps.js +1 -0
- package/dist/assets/CommunityConversations-rEDGS7To.js +1 -0
- package/dist/assets/CommunityEvent-CUdT0aT4.js +1 -0
- package/dist/assets/CommunityEvents-rsOgcxQr.js +1 -0
- package/dist/assets/CommunityHome-ChuTE2Nz.js +1 -0
- package/dist/assets/CommunityJoaTu-CpLIY_83.js +1 -0
- package/dist/assets/CommunityMembers-C3UtzQGp.css +1 -0
- package/dist/assets/CommunityMembers-DKf74ltl.js +1 -0
- package/dist/assets/CommunityPage-C5x23iQl.css +1 -0
- package/dist/assets/CommunityPage-CRYg9-rW.js +1 -0
- package/dist/assets/CommunityPages-IsLTNFC3.js +1 -0
- package/dist/assets/CommunityPost-BOnqqxVs.js +1 -0
- package/dist/assets/CommunityPost-BRYtkDSY.css +1 -0
- package/dist/assets/CommunityPosts-DY1olmcU.js +1 -0
- package/dist/assets/Error404-D10VQARe.js +1 -0
- package/dist/assets/EventCard-vfutXTdg.js +1 -0
- package/dist/assets/EventList-ChtehYcJ.js +1 -0
- package/dist/assets/ExtensionSlot-DJKbrq4c.js +1 -0
- package/dist/assets/PostList-BuHrBBqX.css +1 -0
- package/dist/assets/PostList-DYFgxlE8.js +1 -0
- package/dist/assets/SyncBadge-B1JBsdUk.js +1 -0
- package/dist/assets/SyncBadge-FNO-QLuu.css +1 -0
- package/dist/assets/UserPasswordNew-D_Djldm9.css +1 -0
- package/dist/assets/UserPasswordNew-al9bNBTZ.js +1 -0
- package/dist/assets/UserPasswordReset-42zs98RW.js +1 -0
- package/dist/assets/UserPasswordReset-D_6OQDZY.css +1 -0
- package/dist/assets/UserResendConfirmation-CGavYB81.js +1 -0
- package/dist/assets/UserResendConfirmation-DNTHcaar.css +1 -0
- package/dist/assets/UserSignIn-BIRb0HkV.js +1 -0
- package/dist/assets/UserSignIn-C-Pol8OD.css +1 -0
- package/dist/assets/UserSignUp-ChkKQAd2.css +1 -0
- package/dist/assets/UserSignUp-Df6o3vlO.js +1 -0
- package/dist/assets/better-together-logo-61cxo5d5.png +0 -0
- package/dist/assets/index-BFt-JKVh.css +5 -0
- package/dist/assets/index-COo3Jb7v.js +1088 -0
- package/dist/assets/nodefs-Bfyh92qg.js +1 -0
- package/dist/assets/opfs-ahp-BLzlXf6u.js +3 -0
- package/dist/assets/pglite-BdRI_ZYT.wasm +0 -0
- package/dist/assets/pglite-COscPi1Y.data +0 -0
- package/dist/assets/usePages-DDjDQRCy.js +1 -0
- package/dist/assets/usePosts-Bf2Ccwr4.js +1 -0
- package/{public → dist}/index.html +9 -19
- package/package.json +57 -45
- package/src/BtApp.vue +34 -43
- package/src/components/BtBrandingLogo.vue +10 -18
- package/src/components/BtHeader.vue +31 -89
- package/src/components/BtMainContent.vue +12 -43
- package/src/components/BtNavBar.vue +25 -38
- package/src/components/BtNavItem.vue +25 -58
- package/src/components/BtNavUser.vue +65 -86
- package/src/components/BtProfileForm.vue +48 -39
- package/src/components/BtUserNewPasswordForm.vue +52 -74
- package/src/components/BtUserResendConfirmationForm.vue +45 -83
- package/src/components/BtUserResetPasswordForm.vue +45 -77
- package/src/components/BtUserSignInForm.vue +59 -75
- package/src/components/BtUserSignUpForm.vue +90 -103
- package/src/components/CommunityForm.vue +47 -39
- package/src/components/community/CommunityCard.vue +113 -0
- package/src/components/community/CommunityHeader.vue +91 -0
- package/src/components/community/CommunityList.vue +59 -0
- package/src/components/community/MemberRoleRow.vue +107 -0
- package/src/components/conversation/ConversationCard.vue +49 -0
- package/src/components/conversation/ConversationDetail.vue +53 -0
- package/src/components/conversation/ConversationList.vue +51 -0
- package/src/components/conversation/MessageForm.vue +45 -0
- package/src/components/conversation/MessageItem.vue +43 -0
- package/src/components/conversation/MessageList.vue +39 -0
- package/src/components/event/EventCard.vue +82 -0
- package/src/components/event/EventForm.vue +99 -0
- package/src/components/event/EventList.vue +47 -0
- package/src/components/invitation/InvitationCard.vue +56 -0
- package/src/components/invitation/InvitationForm.vue +70 -0
- package/src/components/invitation/InvitationList.vue +51 -0
- package/src/components/joatu/AgreementCard.vue +57 -0
- package/src/components/joatu/AgreementList.vue +51 -0
- package/src/components/joatu/OfferCard.vue +65 -0
- package/src/components/joatu/OfferForm.vue +82 -0
- package/src/components/joatu/OfferList.vue +51 -0
- package/src/components/joatu/RequestCard.vue +65 -0
- package/src/components/joatu/RequestForm.vue +82 -0
- package/src/components/joatu/RequestList.vue +51 -0
- package/src/components/page/PageCard.vue +55 -0
- package/src/components/page/PageDetail.vue +35 -0
- package/src/components/page/PageList.vue +51 -0
- package/src/components/person/MemberList.vue +61 -0
- package/src/components/person/PersonAvatar.vue +54 -0
- package/src/components/person/PersonCard.vue +47 -0
- package/src/components/post/PostCard.vue +105 -0
- package/src/components/post/PostDetail.vue +98 -0
- package/src/components/post/PostForm.vue +84 -0
- package/src/components/post/PostList.vue +53 -0
- package/src/components/role/BlockButton.vue +44 -0
- package/src/components/role/RoleBadge.vue +19 -0
- package/src/components/role/RoleGate.vue +62 -0
- package/src/components/role/RoleSelector.vue +29 -0
- package/src/components/shared/ExtensionSlot.vue +27 -0
- package/src/components/sync/OfflineBanner.vue +49 -0
- package/src/components/sync/SyncBadge.vue +108 -0
- package/src/components/sync/SyncStatusBar.vue +121 -0
- package/src/composables/useCommunities.js +19 -0
- package/src/composables/useConversations.js +5 -0
- package/src/composables/useEvents.js +28 -0
- package/src/composables/useInvitations.js +10 -0
- package/src/composables/useJoaTuAgreements.js +11 -0
- package/src/composables/useJoaTuOffers.js +10 -0
- package/src/composables/useJoaTuRequests.js +10 -0
- package/src/composables/useMembers.js +30 -0
- package/src/composables/useMessages.js +5 -0
- package/src/composables/useNotifications.js +5 -0
- package/src/composables/usePages.js +6 -0
- package/src/composables/usePersonBlocks.js +65 -0
- package/src/composables/usePosts.js +27 -0
- package/src/composables/useResource.js +137 -0
- package/src/composables/useRoles.js +94 -0
- package/src/composables/useSyncStatus.js +22 -0
- package/src/composables/useToaster.js +20 -0
- package/src/context.js +18 -0
- package/src/db/client.js +343 -0
- package/src/db/migrations/001_initial.sql +131 -0
- package/src/db/migrations/003_conversations_invitations_pages_joatu.sql +76 -0
- package/src/db/sync.js +276 -0
- package/src/endpoints/BtApiAuth.js +1 -1
- package/src/endpoints/BtApiV1.js +1 -1
- package/src/extension.js +45 -0
- package/src/i18n/index.js +105 -0
- package/src/i18n/locales/en.json +275 -0
- package/src/i18n/locales/es.json +275 -0
- package/src/i18n/locales/fr.json +223 -0
- package/src/i18n/locales/uk.json +275 -0
- package/src/index.js +168 -22
- package/src/layouts/CommunityLayout.vue +89 -0
- package/src/main.js +16 -12
- package/src/mixins/error-handling.js +6 -15
- package/src/mixins/toaster.js +15 -10
- package/src/pages/Communities.vue +59 -0
- package/src/pages/Error404.vue +10 -14
- package/src/pages/Home.vue +11 -18
- package/src/pages/Me.vue +39 -59
- package/src/pages/UserPasswordNew.vue +12 -68
- package/src/pages/UserPasswordReset.vue +15 -64
- package/src/pages/UserResendConfirmation.vue +39 -113
- package/src/pages/UserSignIn.vue +18 -67
- package/src/pages/UserSignUp.vue +15 -64
- package/src/pages/community/CommunityConversation.vue +31 -0
- package/src/pages/community/CommunityConversations.vue +18 -0
- package/src/pages/community/CommunityEvent.vue +39 -0
- package/src/pages/community/CommunityEvents.vue +58 -0
- package/src/pages/community/CommunityHome.vue +49 -0
- package/src/pages/community/CommunityJoaTu.vue +115 -0
- package/src/pages/community/CommunityMembers.vue +23 -0
- package/src/pages/community/CommunityPage.vue +31 -0
- package/src/pages/community/CommunityPages.vue +25 -0
- package/src/pages/community/CommunityPost.vue +28 -0
- package/src/pages/community/CommunityPosts.vue +58 -0
- package/src/pages/community/CommunitySettingsPage.vue +117 -0
- package/src/pages/community/RoleManagerPage.vue +93 -0
- package/src/plugins/bootstrap-vue.js +5 -5
- package/src/plugins/font-awesome.js +3 -2
- package/src/plugins/index.js +9 -4
- package/src/plugins/progress.js +16 -0
- package/src/pwa/index.js +156 -0
- package/src/pwa/sw-helpers.js +130 -0
- package/src/router/communityRoutes.js +78 -0
- package/src/router/index.js +30 -144
- package/src/slot-registry.js +15 -0
- package/src/stores/auth.js +134 -0
- package/src/stores/communities.js +59 -0
- package/src/stores/index.js +5 -0
- package/src/stores/menus.js +14 -0
- package/src/stores/people.js +48 -0
- package/src/stores/sync.js +93 -0
- package/src/stylesheets/sync-indicators.scss +34 -0
- package/.env.sample +0 -1
- package/.eslintrc.js +0 -51
- package/.gitlab-ci.yml +0 -14
- package/.travis/.rbenv-gemsets +0 -1
- package/.travis/.ruby-version +0 -1
- package/.travis.yml +0 -31
- package/babel.config.js +0 -5
- package/cypress.json +0 -3
- package/deploy/build.sh +0 -8
- package/eslint.config.js +0 -16
- package/postcss.config.js +0 -5
- package/src/eslint.config.js +0 -16
- package/src/forms/BtProfileFormSchema.js +0 -19
- package/src/forms/BtUserConfirmationFormSchema.js +0 -20
- package/src/forms/BtUserNewPasswordFormSchema.js +0 -29
- package/src/forms/BtUserResetPasswordFormSchema.js +0 -20
- package/src/forms/BtUserSignInFormSchema.js +0 -29
- package/src/forms/BtUserSignUpFormSchema.js +0 -63
- package/src/forms/CommunityFormSchema.js +0 -19
- package/src/plugins/vue-form-generator.js +0 -4
- package/src/plugins/vue-loading.js +0 -10
- package/src/registerServiceWorker.js +0 -32
- package/src/store/index.js +0 -32
- package/src/store/modules/authentication.js +0 -170
- package/src/store/modules/communities.js +0 -98
- package/src/store/modules/community-engine.js +0 -14
- package/src/store/modules/menus.js +0 -52
- package/src/store/modules/people.js +0 -88
- package/src/vue.config.js +0 -0
- package/tests/e2e/.eslintrc.js +0 -12
- package/tests/e2e/plugins/index.js +0 -26
- package/tests/e2e/specs/home.js +0 -8
- package/tests/e2e/support/commands.js +0 -25
- package/tests/e2e/support/index.js +0 -20
- package/tests/unit/.eslintrc.js +0 -5
- package/tests/unit/example.spec.js +0 -13
- package/vue.config.js +0 -11
- package/webpack.config.js +0 -28
- /package/{public → dist}/_redirects +0 -0
- /package/{public → dist}/favicon.ico +0 -0
- /package/{public → dist}/img/favicon.ico +0 -0
- /package/{public → dist}/img/icons/android-chrome-192x192.png +0 -0
- /package/{public → dist}/img/icons/android-chrome-384x384.png +0 -0
- /package/{public → dist}/img/icons/apple-touch-icon.png +0 -0
- /package/{public → dist}/img/icons/favicon-16x16.png +0 -0
- /package/{public → dist}/img/icons/favicon-32x32.png +0 -0
- /package/{public → dist}/img/icons/favicon.ico +0 -0
- /package/{public → dist}/img/icons/mstile-150x150.png +0 -0
- /package/{public → dist}/img/icons/safari-pinned-tab.svg +0 -0
- /package/{public → dist}/robots.txt +0 -0
package/src/db/client.js
ADDED
|
@@ -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);
|