Skip to content

Commit e49a7b0

Browse files
committed
Add backend support for setting compatibility answers
1 parent e904a79 commit e49a7b0

File tree

4 files changed

+61
-7
lines changed

4 files changed

+61
-7
lines changed

backend/api/src/app.ts

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@ import {blockUser, unblockUser} from './block-user'
1212
import {getCompatibleProfilesHandler} from './compatible-profiles'
1313
import {createComment} from './create-comment'
1414
import {createCompatibilityQuestion} from './create-compatibility-question'
15+
import {setCompatibilityAnswer} from './set-compatibility-answer'
1516
import {createProfile} from './create-profile'
1617
import {createUser} from './create-user'
1718
import {getCompatibilityQuestions} from './get-compatibililty-questions'
@@ -170,6 +171,7 @@ const handlers: { [k in APIPath]: APIHandler<k> } = {
170171
'create-comment': createComment,
171172
'hide-comment': hideComment,
172173
'create-compatibility-question': createCompatibilityQuestion,
174+
'set-compatibility-answer': setCompatibilityAnswer,
173175
'create-vote': createVote,
174176
'vote': vote,
175177
'contact': contact,
@@ -188,7 +190,7 @@ const handlers: { [k in APIPath]: APIHandler<k> } = {
188190
'set-last-online-time': setLastOnlineTime,
189191
'save-subscription': saveSubscription,
190192
'create-bookmarked-search': createBookmarkedSearch,
191-
'delete-bookmarked-search': deleteBookmarkedSearch,
193+
'delete-bookmarked-search': deleteBookmarkedSearch,
192194
}
193195

194196
Object.entries(handlers).forEach(([path, handler]) => {
Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,34 @@
1+
import {APIHandler} from './helpers/endpoint'
2+
import {createSupabaseDirectClient} from 'shared/supabase/init'
3+
import {Row} from 'common/supabase/utils'
4+
5+
export const setCompatibilityAnswer: APIHandler<'set-compatibility-answer'> = async (
6+
{questionId, multipleChoice, prefChoices, importance, explanation},
7+
auth
8+
) => {
9+
const pg = createSupabaseDirectClient()
10+
11+
const result = await pg.one<Row<'compatibility_answers'>>({
12+
text: `
13+
INSERT INTO compatibility_answers
14+
(creator_id, question_id, multiple_choice, pref_choices, importance, explanation)
15+
VALUES ($1, $2, $3, $4, $5, $6)
16+
ON CONFLICT (question_id, creator_id)
17+
DO UPDATE SET multiple_choice = EXCLUDED.multiple_choice,
18+
pref_choices = EXCLUDED.pref_choices,
19+
importance = EXCLUDED.importance,
20+
explanation = EXCLUDED.explanation
21+
RETURNING *
22+
`,
23+
values: [
24+
auth.uid,
25+
questionId,
26+
multipleChoice,
27+
prefChoices,
28+
importance,
29+
explanation ?? null,
30+
],
31+
})
32+
33+
return result
34+
}

common/src/api/schema.ts

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -515,6 +515,21 @@ export const API = (_apiTypeCheck = {
515515
options: z.record(z.string(), z.number()),
516516
}),
517517
},
518+
'set-compatibility-answer': {
519+
method: 'POST',
520+
authed: true,
521+
rateLimited: true,
522+
returns: {} as Row<'compatibility_answers'>,
523+
props: z
524+
.object({
525+
questionId: z.number(),
526+
multipleChoice: z.number(),
527+
prefChoices: z.array(z.number()),
528+
importance: z.number(),
529+
explanation: z.string().nullable().optional(),
530+
})
531+
.strict(),
532+
},
518533
'create-vote': {
519534
method: 'POST',
520535
authed: true,

web/components/answers/answer-compatibility-question-content.tsx

Lines changed: 9 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@ import {Tooltip} from 'web/components/widgets/tooltip'
1616
import {QuestionWithCountType} from 'web/hooks/use-questions'
1717
import {track} from 'web/lib/service/analytics'
1818
import {db} from 'web/lib/supabase/db'
19+
import {api} from 'web/lib/api'
1920
import {filterKeys} from '../questions-form'
2021
import toast from "react-hot-toast";
2122

@@ -58,18 +59,20 @@ export const submitCompatibilityAnswer = async (
5859
} as CompatibilityAnswerSubmitType
5960

6061
try {
61-
await run(
62-
db.from('compatibility_answers').upsert(input, {
63-
onConflict: 'question_id,creator_id',
64-
})
65-
);
62+
await api('set-compatibility-answer', {
63+
questionId: input.question_id,
64+
multipleChoice: input.multiple_choice,
65+
prefChoices: input.pref_choices ?? [],
66+
importance: input.importance,
67+
explanation: input.explanation ?? null,
68+
})
6669

6770
// Track only if upsert succeeds
6871
track('answer compatibility question', {
6972
...newAnswer,
7073
});
7174
} catch (error) {
72-
console.error('Failed to upsert compatibility_answers:', error);
75+
console.error('Failed to set compatibility answer:', error);
7376
toast.error('Error submitting. Try again?')
7477
}
7578
}

0 commit comments

Comments
 (0)