diff --git a/packages/api/src/resolvers/article/index.ts b/packages/api/src/resolvers/article/index.ts index a7cd6c906..5731faf4e 100644 --- a/packages/api/src/resolvers/article/index.ts +++ b/packages/api/src/resolvers/article/index.ts @@ -68,6 +68,7 @@ import { validatedDate, } from '../../utils/helpers' import { + getDistillerResult, htmlToMarkdown, ParsedContentPuppeteer, parsePreparedContent, @@ -106,6 +107,12 @@ import { saveSearchHistory } from '../../services/search_history' import { parsedContentToPage } from '../../services/save_page' import * as httpContext from 'express-http-context' +enum ArticleFormat { + Markdown = 'markdown', + Html = 'html', + Distiller = 'distiller', +} + export type PartialArticle = Omit< Article, | 'updatedAt' @@ -413,7 +420,9 @@ export const getArticleResolver: ResolverFn< return { errorCodes: [ArticleErrorCode.Unauthorized] } } - const includeOriginalHtml = !!graphqlFields(info).article.originalHtml + const includeOriginalHtml = + format === ArticleFormat.Distiller || + !!graphqlFields(info).article.originalHtml analytics.track({ userId: claims?.uid, @@ -449,8 +458,17 @@ export const getArticleResolver: ResolverFn< page.content = UNPARSEABLE_CONTENT } - if (format === 'markdown') { + if (format === ArticleFormat.Markdown) { page.content = htmlToMarkdown(page.content) + } else if (format === ArticleFormat.Distiller) { + if (!page.originalHtml) { + return { errorCodes: [ArticleErrorCode.BadData] } + } + const distillerResult = await getDistillerResult(page.originalHtml) + if (!distillerResult) { + return { errorCodes: [ArticleErrorCode.BadData] } + } + page.content = distillerResult } return { diff --git a/packages/api/src/utils/parser.ts b/packages/api/src/utils/parser.ts index 8fd3a4d30..e0b6e15b0 100644 --- a/packages/api/src/utils/parser.ts +++ b/packages/api/src/utils/parser.ts @@ -485,3 +485,23 @@ const nhm = new NodeHtmlMarkdown( export const htmlToMarkdown = (html: string) => { return nhm.translate(/* html */ html) } + +export const getDistillerResult = async ( + html: string +): Promise => { + try { + const url = process.env.DISTILLER_URL + if (!url) { + console.log('No distiller url') + return undefined + } + + const response = await axios.post(url, html, { + timeout: 5000, + }) + return response.data + } catch (e) { + console.log('Error parsing by distiller', e) + return undefined + } +}