chore: commit all current changes

This commit is contained in:
2026-02-28 15:13:21 -05:00
parent a53a5222c1
commit 0615534f4b
6 changed files with 248 additions and 9 deletions

View File

@@ -1,6 +1,7 @@
import { edenTreaty } from '@elysiajs/eden';
import type { App } from '@/lib/server/api/app';
import type {
CompanyAiReportDetail,
CompanyAnalysis,
Filing,
Holding,
@@ -184,6 +185,13 @@ export async function getCompanyAnalysis(ticker: string) {
return await unwrapData<{ analysis: CompanyAnalysis }>(result, 'Unable to fetch company analysis');
}
export async function getCompanyAiReport(accessionNumber: string) {
const normalizedAccession = accessionNumber.trim();
const result = await client.api.analysis.reports[normalizedAccession].get();
return await unwrapData<{ report: CompanyAiReportDetail }>(result, 'Unable to fetch AI summary');
}
export async function queueFilingSync(input: { ticker: string; limit?: number }) {
const result = await client.api.filings.sync.post(input);
return await unwrapData<{ task: Task }>(result, 'Unable to queue filing sync');

View File

@@ -4,7 +4,7 @@ import { auth } from '@/lib/auth';
import { requireAuthenticatedSession } from '@/lib/server/auth-session';
import { asErrorMessage, jsonError } from '@/lib/server/http';
import { buildPortfolioSummary } from '@/lib/server/portfolio';
import { listFilingsRecords } from '@/lib/server/repos/filings';
import { getFilingByAccession, listFilingsRecords } from '@/lib/server/repos/filings';
import {
deleteHoldingByIdRecord,
listUserHoldings,
@@ -386,6 +386,47 @@ export const app = new Elysia({ prefix: '/api' })
ticker: t.String({ minLength: 1 })
})
})
.get('/analysis/reports/:accessionNumber', async ({ params }) => {
const { response } = await requireAuthenticatedSession();
if (response) {
return response;
}
const accessionNumber = params.accessionNumber?.trim() ?? '';
if (accessionNumber.length < 4) {
return jsonError('Invalid accession number');
}
const filing = await getFilingByAccession(accessionNumber);
if (!filing) {
return jsonError('AI summary not found', 404);
}
const summary = filing.analysis?.text ?? filing.analysis?.legacyInsights ?? '';
if (!summary) {
return jsonError('AI summary not found', 404);
}
return Response.json({
report: {
accessionNumber: filing.accession_number,
ticker: filing.ticker,
companyName: filing.company_name,
filingDate: filing.filing_date,
filingType: filing.filing_type,
provider: filing.analysis?.provider ?? 'unknown',
model: filing.analysis?.model ?? 'unknown',
summary,
filingUrl: filing.filing_url,
submissionUrl: filing.submission_url ?? null,
primaryDocument: filing.primary_document ?? null
}
});
}, {
params: t.Object({
accessionNumber: t.String({ minLength: 4 })
})
})
.get('/filings', async ({ query }) => {
const { response } = await requireAuthenticatedSession();
if (response) {

View File

@@ -113,6 +113,14 @@ export type CompanyAiReport = {
summary: string;
};
export type CompanyAiReportDetail = CompanyAiReport & {
ticker: string;
companyName: string;
filingUrl: string | null;
submissionUrl: string | null;
primaryDocument: string | null;
};
export type CompanyAnalysis = {
company: {
ticker: string;