spb/cancerindex
Public
TypeScript 97.2%
SQL 1.5%
CSS 0.6%
JavaScript 0.5%
1import { sql } from 'drizzle-orm';2import type { FastifyPluginAsyncZod } from 'fastify-type-provider-zod';3import { z } from 'zod';4import { resolvePublication } from '../lib/resolve.js';5import { AnyRecord, camel, ok, respond } from '../lib/respond.js';6import { pluck } from '../lib/sources.js';78export const publicationRoutes: FastifyPluginAsyncZod = async (app) => {9 app.get('/publications/:pmid', { schema: { tags: ['publications'], summary: 'Publication with entity edges (method, confidence, status). Abstracts are truncated; follow the PubMed link.', params: z.object({ pmid: z.string().min(1).describe('PMID or CI-PUB-… id') }), response: ok(AnyRecord) } }, async (req) => {10 const { id } = await resolvePublication(app.db, req.params.pmid);11 const [pub, edges, source] = await Promise.all([12 app.db.execute<Record<string, unknown>>(sql`SELECT * FROM publications WHERE id = ${id}`),13 app.db.execute<Record<string, unknown>>(sql`14 SELECT e.entity_type, e.entity_id, e.method, e.confidence, e.status, e.source_id,15 CASE e.entity_type WHEN 'cancer' THEN (SELECT canonical_name FROM cancers WHERE id = e.entity_id) WHEN 'gene' THEN (SELECT symbol FROM genes WHERE id = e.entity_id)16 WHEN 'drug' THEN (SELECT name FROM drugs WHERE id = e.entity_id) WHEN 'variant' THEN (SELECT name FROM variants WHERE id = e.entity_id) WHEN 'trial' THEN (SELECT nct_id FROM clinical_trials WHERE id = e.entity_id) END AS entity_name,17 CASE e.entity_type WHEN 'cancer' THEN (SELECT slug FROM cancers WHERE id = e.entity_id) WHEN 'gene' THEN (SELECT symbol FROM genes WHERE id = e.entity_id)18 WHEN 'drug' THEN (SELECT slug FROM drugs WHERE id = e.entity_id) WHEN 'variant' THEN (SELECT slug FROM variants WHERE id = e.entity_id) WHEN 'trial' THEN (SELECT nct_id FROM clinical_trials WHERE id = e.entity_id) END AS entity_slug19 FROM publication_entity_edges e WHERE e.publication_id = ${id} ORDER BY e.entity_type, e.status, e.entity_id`),20 app.db.execute<{ source_id: string; retrieved_at: string }>(sql`SELECT sr.source_id, sr.retrieved_at FROM publications p JOIN source_records sr ON sr.id = p.source_record_id WHERE p.id = ${id}`),21 ]);22 const p = camel<Record<string, unknown>>(pub[0]!);23 const abstract = typeof p.abstract === 'string' ? p.abstract : null;24 const data = {25 ...p,26 abstract: abstract && abstract.length > 600 ? `${abstract.slice(0, 600)}…` : abstract,27 abstractTruncated: !!abstract && abstract.length > 600,28 links: { pubmed: p.pmid ? `https://pubmed.ncbi.nlm.nih.gov/${p.pmid as string}/` : null, doi: p.doi ? `https://doi.org/${p.doi as string}` : null, pmc: p.pmcid ? `https://www.ncbi.nlm.nih.gov/pmc/articles/${p.pmcid as string}/` : null },29 provenance: source[0] ? { sourceId: source[0].source_id, retrievedAt: source[0].retrieved_at, category: 'published_evidence' } : null,30 edges: edges.map((e) => camel(e)),31 };32 return respond(app, data, [source[0]?.source_id ?? 'pubmed', ...pluck(edges, 'source_id')]);33 });34};35