63 lines
2.4 KiB
TypeScript
63 lines
2.4 KiB
TypeScript
import type { ApiSession, SessionPayload } from "../../services/api/sessions";
|
|
import type { ApiTrack } from "../../services/api/tracks";
|
|
|
|
/** Resolved Q&A flag (supports legacy `qnaEnabled` on older session documents). */
|
|
export function effectiveEnableQnA(s: ApiSession): boolean {
|
|
if (typeof s.enableQnA === "boolean") return s.enableQnA;
|
|
const legacy = (s as ApiSession & { qnaEnabled?: boolean }).qnaEnabled;
|
|
if (typeof legacy === "boolean") return legacy;
|
|
return true;
|
|
}
|
|
|
|
export function effectiveEnableQnP(s: ApiSession): boolean {
|
|
if (typeof s.enableQnP === "boolean") return s.enableQnP;
|
|
return true;
|
|
}
|
|
|
|
export function sessionToPayload(s: ApiSession): SessionPayload {
|
|
const trackRaw = s.track;
|
|
let track: string | null = null;
|
|
if (trackRaw && typeof trackRaw === "object" && "_id" in trackRaw) track = String((trackRaw as ApiTrack)._id);
|
|
else if (typeof trackRaw === "string" && trackRaw.trim()) track = trackRaw;
|
|
|
|
const speakers = (s.speakers || []).map((x) => (typeof x === "string" ? x : x._id));
|
|
const keyPersons =
|
|
Array.isArray(s.keyPersons) && s.keyPersons.length
|
|
? s.keyPersons
|
|
.map((kp) => {
|
|
const speakerId =
|
|
typeof kp.speaker === "object" && kp.speaker && "_id" in kp.speaker
|
|
? String(kp.speaker._id)
|
|
: String(kp.speaker || "");
|
|
if (!speakerId) return null;
|
|
return { speaker: speakerId, role: String(kp.role || "Speaker").trim() || "Speaker" };
|
|
})
|
|
.filter((x): x is { speaker: string; role: string } => Boolean(x))
|
|
: speakers.map((speaker) => ({ speaker, role: "Speaker" }));
|
|
|
|
return {
|
|
title: s.title,
|
|
description: s.description ?? "",
|
|
type: s.type,
|
|
startTime: s.startTime,
|
|
endTime: s.endTime,
|
|
location: s.location,
|
|
track,
|
|
speakers,
|
|
keyPersons,
|
|
moderator: s.moderator ?? null,
|
|
capacity: s.capacity,
|
|
status: s.status,
|
|
resources: s.resources,
|
|
audienceFeedbackEnabled: s.audienceFeedbackEnabled,
|
|
audienceRatingsEnabled: s.audienceRatingsEnabled,
|
|
audienceKeyPersonsEnabled: s.audienceKeyPersonsEnabled,
|
|
audienceMySessionsEnabled: s.audienceMySessionsEnabled,
|
|
audienceAgendaEnabled: s.audienceAgendaEnabled,
|
|
audienceFeedbackForm: s.audienceFeedbackForm ?? null,
|
|
audienceRatingsForm: s.audienceRatingsForm ?? null,
|
|
enableQnA: effectiveEnableQnA(s),
|
|
enableQnP: effectiveEnableQnP(s),
|
|
};
|
|
}
|