From 0b3896d984b91d4be616a41f6af93fea35b14005 Mon Sep 17 00:00:00 2001 From: Jennie Robinson Faber Date: Thu, 9 Apr 2026 09:07:15 +0100 Subject: [PATCH] =?UTF-8?q?refactor(community):=20rename=20Community=20Con?= =?UTF-8?q?nections=20=E2=86=92=20Community=20Ecology?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Simplify the feature to pure discovery (filter by topic, see matching members, copy Slack handle). Drop the connection request/confirm flow entirely — Connection model, 7 API endpoints, useConnections composable, and TagInput component deleted. - Rename communityConnections → communityEcology in schema, API, pages - Delete legacy fields: offering, lookingFor, peerSupport - New /ecology page, /api/ecology/suggestions, community-ecology.patch - Nav: "Connections" → "Ecology", remove pending-count badge - Fix auth/member.get.js missing craftTags + communityEcology - Add community_ecology_updated activity log type - Expose slackHandle conditionally when offerPeerSupport is true - Add migration script at scripts/migrate-to-ecology.js (run before deploy) --- app/components/AppNavigation.vue | 38 +- app/components/TagInput.vue | 104 --- app/composables/useConnections.js | 32 - app/composables/useEcology.js | 6 + app/pages/admin/members/[id].vue | 6 - app/pages/connections.vue | 821 +----------------- app/pages/ecology.vue | 471 ++++++++++ app/pages/member/profile.vue | 601 ++++++------- app/pages/members/[id].vue | 124 +-- app/pages/members/index.vue | 51 +- app/utils/activityText.js | 4 + scripts/migrate-profile-fields.js | 163 ---- server/api/auth/member.get.js | 7 +- server/api/connections/[id]/confirm.post.js | 54 -- server/api/connections/[id]/hide.post.js | 48 - server/api/connections/[id]/withdraw.post.js | 43 - server/api/connections/index.get.js | 45 - server/api/connections/index.post.js | 108 --- server/api/connections/pending-count.get.js | 14 - server/api/connections/suggestions.get.js | 131 --- server/api/ecology/suggestions.get.js | 96 ++ server/api/members/[id].get.js | 41 +- server/api/members/directory.get.js | 100 +-- .../members/me/community-connections.patch.js | 95 -- .../api/members/me/community-ecology.patch.js | 70 ++ server/api/members/profile.patch.js | 2 +- .../fix-offering-lookingfor-structure.js | 62 -- .../migrate-community-connections.js | 213 ----- server/models/activityLog.js | 1 + server/models/connection.js | 22 - server/models/member.js | 35 +- server/utils/activityLog.js | 2 + server/utils/schemas.js | 27 +- 33 files changed, 1002 insertions(+), 2635 deletions(-) delete mode 100644 app/components/TagInput.vue delete mode 100644 app/composables/useConnections.js create mode 100644 app/composables/useEcology.js create mode 100644 app/pages/ecology.vue delete mode 100644 scripts/migrate-profile-fields.js delete mode 100644 server/api/connections/[id]/confirm.post.js delete mode 100644 server/api/connections/[id]/hide.post.js delete mode 100644 server/api/connections/[id]/withdraw.post.js delete mode 100644 server/api/connections/index.get.js delete mode 100644 server/api/connections/index.post.js delete mode 100644 server/api/connections/pending-count.get.js delete mode 100644 server/api/connections/suggestions.get.js create mode 100644 server/api/ecology/suggestions.get.js delete mode 100644 server/api/members/me/community-connections.patch.js create mode 100644 server/api/members/me/community-ecology.patch.js delete mode 100644 server/migrations/fix-offering-lookingfor-structure.js delete mode 100644 server/migrations/migrate-community-connections.js delete mode 100644 server/models/connection.js diff --git a/app/components/AppNavigation.vue b/app/components/AppNavigation.vue index 3095f8b..69fd95c 100644 --- a/app/components/AppNavigation.vue +++ b/app/components/AppNavigation.vue @@ -34,13 +34,8 @@ :to="item.path" :class="{ active: isActive(item.path) }" @click="handleNavigate" + >{{ item.label }} - {{ item.label }} - {{ pendingCount }} - @@ -134,21 +129,7 @@ const emit = defineEmits(["navigate"]); const route = useRoute(); const { isAuthenticated, logout } = useAuth(); -const { getPendingCount } = useConnections(); const isDev = import.meta.dev; -const pendingCount = ref(0); - -// Fetch pending connection count for authenticated users -onMounted(async () => { - if (isAuthenticated.value) { - try { - const data = await getPendingCount(); - pendingCount.value = data.count || 0; - } catch { - // Silently ignore — badge is non-critical - } - } -}); const handleNavigate = () => { if (props.isMobile) { @@ -192,7 +173,7 @@ const youItems = [ const exploreItems = [ { label: "Events", path: "/events" }, { label: "Members", path: "/members" }, - { label: "Connections", path: "/connections" }, + { label: "Ecology", path: "/ecology" }, { label: "Wiki", path: "https://wiki.ghostguild.org" }, { label: "About", path: "/about" }, ]; @@ -298,19 +279,4 @@ const exploreItems = [ .sidebar-meta a { color: var(--candle-dim); } - -.nav-badge { - display: inline-flex; - align-items: center; - justify-content: center; - min-width: 16px; - height: 16px; - padding: 0 4px; - margin-left: 6px; - font-size: 10px; - line-height: 1; - color: var(--bg); - background: var(--candle); - border-radius: 0; -} diff --git a/app/components/TagInput.vue b/app/components/TagInput.vue deleted file mode 100644 index ab77fcb..0000000 --- a/app/components/TagInput.vue +++ /dev/null @@ -1,104 +0,0 @@ - - - - - diff --git a/app/composables/useConnections.js b/app/composables/useConnections.js deleted file mode 100644 index 6bf3833..0000000 --- a/app/composables/useConnections.js +++ /dev/null @@ -1,32 +0,0 @@ -export const useConnections = () => { - const getSuggestions = (params = {}) => - $fetch('/api/connections/suggestions', { params }) - - const getMyConnections = () => - $fetch('/api/connections') - - const requestConnection = (recipientId) => - $fetch('/api/connections', { method: 'POST', body: { recipientId } }) - - const confirmConnection = (id) => - $fetch(`/api/connections/${id}/confirm`, { method: 'POST' }) - - const hideConnection = (id) => - $fetch(`/api/connections/${id}/hide`, { method: 'POST' }) - - const withdrawConnection = (id) => - $fetch(`/api/connections/${id}/withdraw`, { method: 'POST' }) - - const getPendingCount = () => - $fetch('/api/connections/pending-count') - - return { - getSuggestions, - getMyConnections, - requestConnection, - confirmConnection, - hideConnection, - withdrawConnection, - getPendingCount, - } -} diff --git a/app/composables/useEcology.js b/app/composables/useEcology.js new file mode 100644 index 0000000..ab7eec6 --- /dev/null +++ b/app/composables/useEcology.js @@ -0,0 +1,6 @@ +export const useEcology = () => { + const getSuggestions = (params = {}) => + $fetch('/api/ecology/suggestions', { params }) + + return { getSuggestions } +} diff --git a/app/pages/admin/members/[id].vue b/app/pages/admin/members/[id].vue index cd27787..ff3777b 100644 --- a/app/pages/admin/members/[id].vue +++ b/app/pages/admin/members/[id].vue @@ -143,12 +143,6 @@ {{ member.notifications?.updates !== false ? "On" : "Off" }} -
-
Peer support requests
-
- {{ member.notifications?.peerRequests !== false ? "On" : "Off" }} -
-
diff --git a/app/pages/connections.vue b/app/pages/connections.vue index b8ee40d..0b5f879 100644 --- a/app/pages/connections.vue +++ b/app/pages/connections.vue @@ -1,821 +1,4 @@ - - - - diff --git a/app/pages/ecology.vue b/app/pages/ecology.vue new file mode 100644 index 0000000..eed1daa --- /dev/null +++ b/app/pages/ecology.vue @@ -0,0 +1,471 @@ + + + + + diff --git a/app/pages/member/profile.vue b/app/pages/member/profile.vue index 645ad3f..dba68b7 100644 --- a/app/pages/member/profile.vue +++ b/app/pages/member/profile.vue @@ -1,12 +1,10 @@ + + -