Skip to content

Commit ba96418

Browse files
Merge pull request #46 from Nandgopal-R/test/integration-testing
feat: add /responses/received endpoint, fix auth cookies for local dev
2 parents 786cc3a + df73bce commit ba96418

3 files changed

Lines changed: 95 additions & 2 deletions

File tree

src/api/auth/index.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -33,12 +33,12 @@ export const auth = betterAuth({
3333
},
3434

3535
advanced: {
36-
useSecureCookies: true, // Must be true for production (HTTPS)
36+
useSecureCookies: process.env.NODE_ENV === "production",
3737
crossSubDomainCookies: {
3838
enabled: false, // Not subdomains, different domains entirely
3939
},
4040
defaultCookieAttributes: {
41-
sameSite: "none", // CRITICAL: Allow cross-site cookies (Vercel <-> Railway)
41+
sameSite: process.env.NODE_ENV === "production" ? "none" : "lax",
4242
},
4343
},
4444

src/api/form-response/controller.ts

Lines changed: 91 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -253,6 +253,97 @@ export async function getSubmittedResponse({
253253
};
254254
}
255255

256+
// Get all responses received for forms owned by the current user
257+
export async function getAllReceivedResponses({
258+
user,
259+
}: {
260+
user: { id: string };
261+
}) {
262+
const responses = await prisma.formResponse.findMany({
263+
where: {
264+
form: {
265+
ownerId: user.id,
266+
},
267+
},
268+
select: {
269+
id: true,
270+
formId: true,
271+
answers: true,
272+
isSubmitted: true,
273+
submittedAt: true,
274+
updatedAt: true,
275+
respondent: {
276+
select: {
277+
name: true,
278+
email: true,
279+
},
280+
},
281+
form: {
282+
select: {
283+
title: true,
284+
},
285+
},
286+
},
287+
orderBy: {
288+
updatedAt: "desc",
289+
},
290+
});
291+
292+
if (responses.length === 0) {
293+
logger.info(`No received responses found for user ${user.id}`);
294+
return {
295+
success: true,
296+
message: "No responses found",
297+
data: [],
298+
};
299+
}
300+
301+
// Collect all unique formIds to batch-fetch fields
302+
const formIds = [...new Set(responses.map((r) => r.formId))];
303+
const allFields = await prisma.formFields.findMany({
304+
where: { formId: { in: formIds } },
305+
select: { id: true, fieldName: true, formId: true },
306+
});
307+
308+
const fieldMapByForm: Record<string, Record<string, string>> = {};
309+
for (const f of allFields) {
310+
if (!fieldMapByForm[f.formId]) fieldMapByForm[f.formId] = {};
311+
fieldMapByForm[f.formId][f.id] = f.fieldName;
312+
}
313+
314+
const formattedResponses = responses.map((r) => {
315+
const fieldIdToNameMap = fieldMapByForm[r.formId] ?? {};
316+
const transformedAnswers: Record<string, unknown> = {};
317+
for (const [fieldId, value] of Object.entries(
318+
r.answers as Record<string, unknown>,
319+
)) {
320+
const fieldName = fieldIdToNameMap[fieldId] ?? fieldId;
321+
transformedAnswers[fieldName] = value;
322+
}
323+
324+
return {
325+
id: r.id,
326+
formId: r.formId,
327+
formName: r.form.title,
328+
responder: r.respondent?.name ?? "Anonymous",
329+
email: r.respondent?.email ?? "",
330+
answers: transformedAnswers,
331+
isSubmitted: r.isSubmitted,
332+
status: r.isSubmitted ? "Completed" : "Draft",
333+
createdAt: r.submittedAt ?? r.updatedAt,
334+
};
335+
});
336+
337+
logger.info(
338+
`Retrieved ${formattedResponses.length} received responses for user ${user.id}`,
339+
);
340+
return {
341+
success: true,
342+
message: "Responses retrieved successfully",
343+
data: formattedResponses,
344+
};
345+
}
346+
256347
// Get all responses submitted by the current user across all forms
257348
export async function getAllUserResponses({ user }: { user: { id: string } }) {
258349
const responses = await prisma.formResponse.findMany({

src/api/form-response/routes.ts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@ import {
77
} from "../../types/form-response";
88
import { requireAuth } from "../auth/requireAuth";
99
import {
10+
getAllReceivedResponses,
1011
getAllUserResponses,
1112
getResponseForFormOwner,
1213
getSubmittedResponse,
@@ -20,5 +21,6 @@ export const formResponseRoutes = new Elysia({ prefix: "/responses" })
2021
.post("/draft/:formId", submitResponse, formResponseDTO)
2122
.put("/resume/:responseId", resumeResponse, resumeResponseDTO)
2223
.get("/my", getAllUserResponses)
24+
.get("/received", getAllReceivedResponses)
2325
.get("/:formId", getResponseForFormOwner, formResponseForFormOwnerDTO)
2426
.get("/user/:formId", getSubmittedResponse, getSubmittedResponseDTO);

0 commit comments

Comments
 (0)