fix: print response to understand email delivery

This commit is contained in:
Harshith Mullapudi 2025-09-01 19:43:21 +05:30
parent de94f67f7b
commit 0b88a2cd49
5 changed files with 85 additions and 6 deletions

View File

@ -23,6 +23,7 @@ interface EpisodeFact {
interface EpisodeFactsResponse { interface EpisodeFactsResponse {
facts: EpisodeFact[]; facts: EpisodeFact[];
invalidFacts: EpisodeFact[];
} }
export function LogDetails({ export function LogDetails({
@ -33,6 +34,7 @@ export function LogDetails({
log, log,
}: LogDetailsProps) { }: LogDetailsProps) {
const [facts, setFacts] = useState<any[]>([]); const [facts, setFacts] = useState<any[]>([]);
const [invalidFacts, setInvalidFacts] = useState<any[]>([]);
const [factsLoading, setFactsLoading] = useState(false); const [factsLoading, setFactsLoading] = useState(false);
const fetcher = useFetcher<EpisodeFactsResponse>(); const fetcher = useFetcher<EpisodeFactsResponse>();
@ -50,6 +52,7 @@ export function LogDetails({
setFactsLoading(false); setFactsLoading(false);
const response = fetcher.data; const response = fetcher.data;
setFacts(response.facts); setFacts(response.facts);
setInvalidFacts(response.invalidFacts);
} }
}, [fetcher.data, fetcher.state]); }, [fetcher.data, fetcher.state]);
@ -122,6 +125,33 @@ export function LogDetails({
<span> <span>
Valid: {new Date(fact.validAt).toLocaleString()} Valid: {new Date(fact.validAt).toLocaleString()}
</span> </span>
{fact.invalidAt && (
<span>
Invalid:{" "}
{new Date(fact.invalidAt).toLocaleString()}
</span>
)}
{Object.keys(fact.attributes).length > 0 && (
<Badge variant="secondary" className="text-xs">
{Object.keys(fact.attributes).length} attributes
</Badge>
)}
</div>
</div>
))}
{invalidFacts.map((fact) => (
<div
key={fact.uuid}
className="bg-grayAlpha-100 rounded-md p-3"
>
<p className="mb-1 text-sm">{fact.fact}</p>
<div className="text-muted-foreground flex items-center gap-2 text-xs">
{fact.invalidAt && (
<span>
Invalid:{" "}
{new Date(fact.invalidAt).toLocaleString()}
</span>
)}
{Object.keys(fact.attributes).length > 0 && ( {Object.keys(fact.attributes).length > 0 && (
<Badge variant="secondary" className="text-xs"> <Badge variant="secondary" className="text-xs">
{Object.keys(fact.attributes).length} attributes {Object.keys(fact.attributes).length} attributes

View File

@ -48,9 +48,10 @@ export async function createWorkspace(
}); });
try { try {
await sendEmail({ email: "welcome", to: user.email }); const response = await sendEmail({ email: "welcome", to: user.email });
logger.info(`${JSON.stringify(response)}`);
} catch (e) { } catch (e) {
logger.error("Error sending email"); logger.error(`Error sending email: ${e}`);
} }
return workspace; return workspace;

View File

@ -86,7 +86,9 @@ export async function scheduleEmail(
export async function sendEmail(data: DeliverEmail) { export async function sendEmail(data: DeliverEmail) {
try { try {
return client.send(data); const response = client.send(data);
return response;
} catch (e) { } catch (e) {
logger.error(`Error: ${e}`); logger.error(`Error: ${e}`);
} }

View File

@ -1,4 +1,7 @@
import { getEpisodeStatements } from "~/services/graphModels/episode"; import {
getEpisodeStatements,
getStatementsInvalidatedByEpisode,
} from "~/services/graphModels/episode";
export async function getEpisodeFacts(episodeUuid: string, userId: string) { export async function getEpisodeFacts(episodeUuid: string, userId: string) {
try { try {
@ -7,13 +10,27 @@ export async function getEpisodeFacts(episodeUuid: string, userId: string) {
userId, userId,
}); });
const invalidFacts = await getStatementsInvalidatedByEpisode({
episodeUuid,
userId,
});
return { return {
success: true, success: true,
facts: facts.map(fact => ({ facts: facts.map((fact) => ({
uuid: fact.uuid, uuid: fact.uuid,
fact: fact.fact, fact: fact.fact,
createdAt: fact.createdAt.toISOString(), createdAt: fact.createdAt.toISOString(),
validAt: fact.validAt.toISOString(), validAt: fact.validAt.toISOString(),
invalidAt: fact.invalidAt ? fact.invalidAt.toISOString() : null,
attributes: fact.attributes,
})),
invalidFacts: invalidFacts.map((fact) => ({
uuid: fact.uuid,
fact: fact.fact,
createdAt: fact.createdAt.toISOString(),
validAt: fact.validAt.toISOString(),
invalidAt: fact.invalidAt ? fact.invalidAt.toISOString() : null,
attributes: fact.attributes, attributes: fact.attributes,
})), })),
}; };
@ -25,4 +42,4 @@ export async function getEpisodeFacts(episodeUuid: string, userId: string) {
facts: [], facts: [],
}; };
} }
} }

View File

@ -315,6 +315,35 @@ export async function getEpisodeStatements(params: {
userId: params.userId, userId: params.userId,
}); });
return result.map((record) => {
const stmt = record.get("stmt").properties;
return {
uuid: stmt.uuid,
fact: stmt.fact,
factEmbedding: stmt.factEmbedding,
createdAt: new Date(stmt.createdAt),
validAt: new Date(stmt.validAt),
invalidAt: stmt.invalidAt ? new Date(stmt.invalidAt) : null,
attributes: stmt.attributesJson ? JSON.parse(stmt.attributesJson) : {},
userId: stmt.userId,
};
});
}
export async function getStatementsInvalidatedByEpisode(params: {
episodeUuid: string;
userId: string;
}) {
const query = `
MATCH (stmt:Statement {invalidatedBy: $episodeUuid})
RETURN stmt
`;
const result = await runQuery(query, {
episodeUuid: params.episodeUuid,
});
return result.map((record) => { return result.map((record) => {
const stmt = record.get("stmt").properties; const stmt = record.get("stmt").properties;
return { return {