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 @@ - - - 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',