Files
Compass/backend/api/src/update-connection-interests.ts
2026-02-24 18:00:12 +01:00

103 lines
3.6 KiB
TypeScript
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
import {APIHandler} from 'api/helpers/endpoint'
import {Notification} from 'common/notifications'
import {getNotificationDestinationsForUser} from 'common/user-notification-preferences'
import {createT} from 'shared/locale'
import {sendMobileNotifications, sendWebNotifications} from 'shared/mobile'
import {getProfile} from 'shared/profiles/supabase'
import {createSupabaseDirectClient} from 'shared/supabase/init'
import {insertNotificationToSupabase} from 'shared/supabase/notifications'
import {getPrivateUser, getUser} from 'shared/utils'
export const updateConnectionInterests: APIHandler<'update-connection-interest'> = async (
props,
auth,
) => {
const {targetUserId, connectionType, seeking} = props
const pg = createSupabaseDirectClient()
if (!connectionType) {
throw new Error('Invalid connection type')
}
if (seeking) {
await pg.query(
`INSERT INTO connection_interests (user_id, target_user_id, connection_type)
VALUES ($1, $2, $3)
ON CONFLICT (user_id, target_user_id, connection_type) DO NOTHING`,
[auth.uid, targetUserId, connectionType],
)
const matchingInterest = await pg.oneOrNone(
`SELECT 1 FROM connection_interests
WHERE user_id = $1 AND target_user_id = $2 AND connection_type = $3`,
[targetUserId, auth.uid, connectionType],
)
if (matchingInterest) {
const targetPrivateUser = await getPrivateUser(targetUserId)
const currentUser = await getUser(auth.uid)
const currentUserProfile = await getProfile(auth.uid)
if (targetPrivateUser && currentUser && currentUserProfile) {
const {sendToBrowser} = getNotificationDestinationsForUser(
targetPrivateUser,
'connection_interest_match',
)
if (sendToBrowser) {
const notification: Notification = {
id: `${auth.uid}-${targetUserId}-${connectionType}-${Date.now()}`,
userId: targetUserId,
reason: 'connection_interest_match',
createdTime: Date.now(),
isSeen: false,
sourceType: 'connection_interest_match',
sourceUpdateType: 'created',
sourceUserName: currentUser.name,
sourceUserUsername: currentUser.username,
sourceUserAvatarUrl: currentUserProfile.pinned_url ?? currentUser.avatarUrl,
sourceText: connectionType,
data: {
connectionType,
},
}
await insertNotificationToSupabase(notification, pg)
}
const t = createT(targetPrivateUser.locale)
const type = t(`profile.relationship.${connectionType}`, connectionType).toLowerCase()
const payload = {
title: t('notifications.connection.mutual_title', 'Its mutual 🎉'),
body: t(
'notifications.connection.mutual_body',
'You and {name} are both interested in a {type}. Start the conversation.',
{
name: currentUser.name,
type,
},
),
url: `/${currentUser.username}`,
}
try {
await sendWebNotifications(pg, targetUserId, JSON.stringify(payload))
} catch (err) {
console.error('Failed to send web notification:', err)
}
try {
await sendMobileNotifications(pg, targetUserId, payload)
} catch (err) {
console.error('Failed to send mobile notification:', err)
}
}
}
} else {
await pg.query(
'DELETE FROM connection_interests WHERE user_id = $1 AND target_user_id = $2 AND connection_type = $3',
[auth.uid, targetUserId, connectionType],
)
}
return {success: true}
}