SPB Git forge

spb/cancerindex

Public
37commits 1branches 0releases
2.9 MBsize
maindefault branch
10 days agolast push
TypeScript 97.2% SQL 1.5% CSS 0.6% JavaScript 0.5%
3.0 KB · 35 lines typescript
Raw Blame History
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