omnivore/packages/api/src/routers/article_router.ts
2022-05-28 22:00:01 +08:00

65 lines
2 KiB
TypeScript

/* eslint-disable @typescript-eslint/restrict-template-expressions */
/* eslint-disable @typescript-eslint/no-unsafe-member-access */
/* eslint-disable @typescript-eslint/no-unsafe-assignment */
/* eslint-disable @typescript-eslint/explicit-module-boundary-types */
import express from 'express'
import { CreateArticleErrorCode } from './../generated/graphql'
import { isSiteBlockedForParse } from './../utils/blocked'
import cors from 'cors'
import { buildLogger } from './../utils/logger'
import { corsConfig } from '../utils/corsConfig'
import { createPageSaveRequest } from '../services/create_page_save_request'
import { initModels } from '../server'
import { kx } from '../datalayer/knex_config'
import { getClaimsByToken } from '../utils/auth'
const logger = buildLogger('app.dispatch')
export function articleRouter() {
const router = express.Router()
router.options('/save', cors<express.Request>({ ...corsConfig, maxAge: 600 }))
router.post('/save', cors<express.Request>(corsConfig), async (req, res) => {
const { url } = req.body as {
url?: string
}
const token = req?.cookies?.auth || req?.headers?.authorization
const claims = await getClaimsByToken(token)
if (!claims) {
return res.status(401).send('UNAUTHORIZED')
}
const { uid } = claims
logger.info('Article saving request', {
body: req.body,
labels: {
source: 'SaveEndpoint',
userId: uid,
},
})
if (!url) {
return res.status(400).send({ errorCode: 'BAD_DATA' })
}
const models = initModels(kx, false)
const result = await createPageSaveRequest(uid, url, models)
if (isSiteBlockedForParse(url)) {
return res
.status(400)
.send({ errorCode: CreateArticleErrorCode.NotAllowedToParse })
}
if (result.errorCode) {
return res.status(400).send({ errorCode: result.errorCode })
}
return res.send({
articleSavingRequestId: result.id,
})
})
return router
}