diff --git a/app/components/PeerSupportBadge.vue b/app/components/PeerSupportBadge.vue
deleted file mode 100644
index 0bca82a..0000000
--- a/app/components/PeerSupportBadge.vue
+++ /dev/null
@@ -1,101 +0,0 @@
-
-
-
-
-
-
-
- {{ label }}
-
-
-
-
diff --git a/app/composables/usePeerSupport.js b/app/composables/usePeerSupport.js
deleted file mode 100644
index 125d75c..0000000
--- a/app/composables/usePeerSupport.js
+++ /dev/null
@@ -1,16 +0,0 @@
-export const usePeerSupport = () => {
- const updateSettings = async (settings) => {
- return await $fetch('/api/members/me/peer-support', {
- method: 'PATCH',
- body: settings
- });
- };
-
- const getSupporters = async (topic) => {
- return await $fetch('/api/peer-support', {
- query: topic ? { topic } : {}
- });
- };
-
- return { updateSettings, getSupporters };
-};
diff --git a/app/pages/peer-support.vue b/app/pages/peer-support.vue
deleted file mode 100644
index 1e26164..0000000
--- a/app/pages/peer-support.vue
+++ /dev/null
@@ -1,12 +0,0 @@
-
-
-
-
-
diff --git a/app/utils/activityText.js b/app/utils/activityText.js
index 006d3ae..7980b72 100644
--- a/app/utils/activityText.js
+++ b/app/utils/activityText.js
@@ -23,16 +23,6 @@ const formatters = {
link: null,
linkText: null
}),
- peer_support_enabled: (m) => ({
- text: m.topics?.length
- ? `Enabled peer support (${m.topics.join(', ')})`
- : 'Enabled peer support',
- icon: 'i-lucide-users'
- }),
- peer_support_disabled: () => ({
- text: 'Disabled peer support',
- icon: 'i-lucide-users'
- }),
circle_changed: (m) => ({
text: `Changed circle from ${circleLabel(m.from)} to ${circleLabel(m.to)}`,
icon: 'i-lucide-refresh-cw'
diff --git a/server/api/members/me/peer-support.patch.js b/server/api/members/me/peer-support.patch.js
deleted file mode 100644
index b56b27b..0000000
--- a/server/api/members/me/peer-support.patch.js
+++ /dev/null
@@ -1,97 +0,0 @@
-import Member from '../../../models/member.js'
-import { connectDB } from '../../../utils/mongoose.js'
-
-export default defineEventHandler(async (event) => {
- await connectDB()
- const member = await requireAuth(event)
-
- const body = await validateBody(event, peerSupportUpdateSchema)
-
- // Build update object for peer support settings
- const updateData = {
- 'peerSupport.enabled': body.enabled || false,
- 'peerSupport.skillTopics': body.skillTopics || [],
- 'peerSupport.supportTopics': body.supportTopics || [],
- 'peerSupport.availability': body.availability || '',
- 'peerSupport.personalMessage': body.personalMessage || '',
- 'peerSupport.slackUsername': body.slackUsername || '',
- }
-
- // If Slack username provided and peer support enabled, try to fetch Slack user ID
- if (body.enabled && body.slackUsername) {
- try {
- console.log(
- `[Peer Support] Attempting to fetch Slack user ID for: ${body.slackUsername}`,
- )
-
- const { getSlackService } = await import('../../../utils/slack.ts')
- const slackService = getSlackService()
-
- if (slackService) {
- console.log('[Peer Support] Slack service initialized, looking up user...')
- const slackUserId = await slackService.findUserIdByUsername(body.slackUsername)
-
- if (slackUserId) {
- updateData['slackUserId'] = slackUserId
- console.log(
- `[Peer Support] ✓ Found Slack user ID for ${body.slackUsername}: ${slackUserId}`,
- )
-
- console.log('[Peer Support] Opening DM channel...')
- const dmChannelId = await slackService.openDMChannel(slackUserId)
-
- if (dmChannelId) {
- updateData['peerSupport.slackDMChannelId'] = dmChannelId
- console.log(`[Peer Support] ✓ Got DM channel ID: ${dmChannelId}`)
- } else {
- console.warn('[Peer Support] Could not get DM channel ID')
- }
- } else {
- console.warn(
- `[Peer Support] Could not find Slack user ID for username: ${body.slackUsername}`,
- )
- }
- } else {
- console.log('[Peer Support] Slack service not configured, skipping user ID lookup')
- }
- } catch (error) {
- console.error('[Peer Support] Error fetching Slack user ID:', error.message)
- console.error('[Peer Support] Stack trace:', error.stack)
- // Continue anyway - we'll still save the username
- }
- }
-
- try {
- const updated = await Member.findByIdAndUpdate(
- member._id,
- { $set: updateData },
- { new: true, runValidators: true },
- )
-
- if (!updated) {
- throw createError({
- statusCode: 404,
- statusMessage: 'Member not found',
- })
- }
-
- if (body.enabled) {
- logActivity(member._id, 'peer_support_enabled', {
- topics: [...(body.skillTopics || []), ...(body.supportTopics || [])]
- })
- } else {
- logActivity(member._id, 'peer_support_disabled', {})
- }
-
- return {
- success: true,
- peerSupport: updated.peerSupport,
- }
- } catch (error) {
- console.error('Peer support update error:', error)
- throw createError({
- statusCode: 500,
- statusMessage: 'Failed to update peer support settings',
- })
- }
-})
diff --git a/server/api/members/profile.patch.js b/server/api/members/profile.patch.js
index 760c1d8..120a42d 100644
--- a/server/api/members/profile.patch.js
+++ b/server/api/members/profile.patch.js
@@ -31,8 +31,6 @@ export default defineEventHandler(async (event) => {
"bioPrivacy",
"locationPrivacy",
"socialLinksPrivacy",
- "offeringPrivacy",
- "lookingForPrivacy",
"craftTagsPrivacy",
"communityConnectionsPrivacy",
];
@@ -51,20 +49,6 @@ export default defineEventHandler(async (event) => {
updateData.craftTags = body.craftTags;
}
- // Handle offering and lookingFor separately (nested objects)
- if (body.offering !== undefined) {
- updateData.offering = {
- text: body.offering.text || "",
- tags: body.offering.tags || [],
- };
- }
- if (body.lookingFor !== undefined) {
- updateData.lookingFor = {
- text: body.lookingFor.text || "",
- tags: body.lookingFor.tags || [],
- };
- }
-
// Handle privacy settings
privacyFields.forEach((privacyField) => {
if (body[privacyField] !== undefined) {
@@ -107,8 +91,6 @@ export default defineEventHandler(async (event) => {
bio: member.bio,
location: member.location,
socialLinks: member.socialLinks,
- offering: member.offering,
- lookingFor: member.lookingFor,
craftTags: member.craftTags,
showInDirectory: member.showInDirectory,
notifications: member.notifications,
diff --git a/server/api/peer-support.get.js b/server/api/peer-support.get.js
deleted file mode 100644
index e99f68c..0000000
--- a/server/api/peer-support.get.js
+++ /dev/null
@@ -1,63 +0,0 @@
-import jwt from "jsonwebtoken";
-import Member from "../models/member.js";
-import { connectDB } from "../utils/mongoose.js";
-
-export default defineEventHandler(async (event) => {
- await connectDB();
-
- // Check if user is authenticated (optional for this endpoint)
- const token = getCookie(event, "auth-token");
- let isAuthenticated = false;
-
- if (token) {
- try {
- jwt.verify(token, useRuntimeConfig().jwtSecret);
- isAuthenticated = true;
- } catch (err) {
- isAuthenticated = false;
- }
- }
-
- const query = getQuery(event);
- const topic = query.topic;
-
- // Build query for peer supporters
- const dbQuery = {
- "peerSupport.enabled": true,
- status: "active",
- };
-
- // Filter by topic if specified
- if (topic) {
- dbQuery["peerSupport.topics"] = topic;
- }
-
- try {
- const supporters = await Member.find(dbQuery)
- .select(
- "name avatar circle peerSupport slackUserId createdAt"
- )
- .sort({ createdAt: -1 })
- .lean();
-
- // Get unique topics for filter options
- const allTopics = supporters
- .flatMap((supporter) => supporter.peerSupport?.topics || [])
- .filter((topic, index, self) => self.indexOf(topic) === index)
- .sort();
-
- return {
- supporters,
- totalCount: supporters.length,
- filters: {
- availableTopics: allTopics,
- },
- };
- } catch (error) {
- console.error("Peer support fetch error:", error);
- throw createError({
- statusCode: 500,
- statusMessage: "Failed to fetch peer supporters",
- });
- }
-});
diff --git a/server/models/activityLog.js b/server/models/activityLog.js
index da3acc2..f19ea88 100644
--- a/server/models/activityLog.js
+++ b/server/models/activityLog.js
@@ -5,8 +5,6 @@ const ACTIVITY_TYPES = [
'event_registered',
'event_cancelled',
'event_waitlisted',
- 'peer_support_enabled',
- 'peer_support_disabled',
'circle_changed',
'contribution_changed',
'email_changed',
diff --git a/server/utils/activityLog.js b/server/utils/activityLog.js
index 6916fc0..fa55180 100644
--- a/server/utils/activityLog.js
+++ b/server/utils/activityLog.js
@@ -5,8 +5,6 @@ export const ACTIVITY_TYPES = {
EVENT_REGISTERED: 'event_registered',
EVENT_CANCELLED: 'event_cancelled',
EVENT_WAITLISTED: 'event_waitlisted',
- PEER_SUPPORT_ENABLED: 'peer_support_enabled',
- PEER_SUPPORT_DISABLED: 'peer_support_disabled',
CIRCLE_CHANGED: 'circle_changed',
CONTRIBUTION_CHANGED: 'contribution_changed',
EMAIL_CHANGED: 'email_changed',
@@ -29,8 +27,6 @@ export const ACTIVITY_TYPE_DEFAULTS = {
event_registered: 'public',
event_cancelled: 'member',
event_waitlisted: 'member',
- peer_support_enabled: 'public',
- peer_support_disabled: 'member',
circle_changed: 'member',
contribution_changed: 'member',
email_changed: 'member',
diff --git a/tests/server/api/members-profile-patch.test.js b/tests/server/api/members-profile-patch.test.js
index d18436c..352624c 100644
--- a/tests/server/api/members-profile-patch.test.js
+++ b/tests/server/api/members-profile-patch.test.js
@@ -27,8 +27,6 @@ describe('members profile PATCH endpoint', () => {
bio: 'Updated bio',
location: 'NYC',
socialLinks: { twitter: '@test' },
- offering: { text: 'help', tags: ['code'] },
- lookingFor: { text: 'feedback', tags: ['design'] },
showInDirectory: true
}
@@ -137,21 +135,5 @@ describe('members profile PATCH endpoint', () => {
expect(setData).toHaveProperty('socialLinks')
})
- it('passes offering and lookingFor nested objects through', async () => {
- const event = createMockEvent({
- method: 'PATCH',
- path: '/api/members/profile',
- body: {
- offering: { text: 'mentoring', tags: ['code', 'design'] },
- lookingFor: { text: 'feedback', tags: ['art'] }
- }
- })
-
- await profilePatchHandler(event)
-
- const setData = Member.findByIdAndUpdate.mock.calls[0][1].$set
- expect(setData.offering).toEqual({ text: 'mentoring', tags: ['code', 'design'] })
- expect(setData.lookingFor).toEqual({ text: 'feedback', tags: ['art'] })
- })
})
})
diff --git a/tests/server/api/validation-phase3.test.js b/tests/server/api/validation-phase3.test.js
index cdf1218..d2acef8 100644
--- a/tests/server/api/validation-phase3.test.js
+++ b/tests/server/api/validation-phase3.test.js
@@ -15,7 +15,6 @@ import {
guestRegisterSchema,
eventPaymentSchema,
updateContributionSchema,
- peerSupportUpdateSchema,
seriesTicketPurchaseSchema,
seriesTicketEligibilitySchema,
adminSeriesCreateSchema,
@@ -305,29 +304,6 @@ describe('updateContributionSchema', () => {
})
})
-describe('peerSupportUpdateSchema', () => {
- it('accepts valid peer support data', () => {
- const result = peerSupportUpdateSchema.safeParse({
- enabled: true,
- skillTopics: ['game design', 'business'],
- slackUsername: 'jane'
- })
- expect(result.success).toBe(true)
- })
-
- it('accepts empty object', () => {
- const result = peerSupportUpdateSchema.safeParse({})
- expect(result.success).toBe(true)
- })
-
- it('rejects non-array skillTopics', () => {
- const result = peerSupportUpdateSchema.safeParse({
- skillTopics: 'not-an-array'
- })
- expect(result.success).toBe(false)
- })
-})
-
// --- Series schemas ---
describe('seriesTicketPurchaseSchema', () => {
@@ -505,7 +481,6 @@ describe('validateBody migration coverage', () => {
'events/[id]/guest-register.post.js',
'events/[id]/payment.post.js',
'members/update-contribution.post.js',
- 'members/me/peer-support.patch.js',
'series/[id]/tickets/purchase.post.js',
'series/[id]/tickets/check-eligibility.post.js',
'admin/series.post.js',