import { parseFiles } from '../file/util.mjs' import { parseArticles, parseArticle } from './util.mjs' import { upload } from '../media/upload.mjs' export default class ArticleRoutes { constructor(opts = {}) { Object.assign(this, { upload: upload, }) } /** GET: /api/articles/[path] */ async getArticle(ctx) { let res = await ctx.db.safeCallProc('common.article_get_single', [ctx.params.path]) let out = { article: parseArticle(res.results[0][0]), files: parseFiles(res.results[1]), } ctx.body = out } /** GET: /api/auth/articles */ async auth_getAllArticles(ctx) { let res = await ctx.db.safeCallProc('common.article_auth_get_all', [ ctx.state.auth_token, Math.max(ctx.query.get('page') || 1, 1), Math.min(ctx.query.get('per_page') || 10, 25) ]) let out = { articles: parseArticles(res.results[0]), total_articles: res.results[0][0].total_articles, } ctx.body = out } async private_getUpdateArticle(ctx, body = null, banner = null, media = null) { let params = [ ctx.state.auth_token, ctx.params.path ] if (body) { params = params.concat([ body.name, body.page_id === 'null' ? null : Number(body.page_id), body.path, body.content, new Date(body.publish_at), Number(body.admin_id), body.is_featured === 'true' ? 1 : 0, 0, ]) if (banner) { params = params.concat([ banner.filename, banner.type, banner.path, banner.size, banner.preview.base64, banner.sizes.small.avif.path.replace(/_small\.avif$/, ''), JSON.stringify(banner.sizes), 0, ]) } else { params = params.concat([ null, null, null, null, null, null, null, null, ]) } if (media) { params = params.concat([ media.filename, media.type, media.path, media.size, media.preview.base64, media.sizes.small.avif.path.replace(/_small\.avif$/, ''), JSON.stringify(media.sizes), 0, ]) } else { params = params.concat([ null, null, null, null, null, null, null, null, ]) } } console.log(params) let res = await ctx.db.safeCallProc('common.article_auth_get_update_create', params) let out = { article: parseArticle(res.results[0][0]), files: parseFiles(res.results[1]), staff: res.results[2], } if (out.article) { if (out.article.content[0] === '{') { try { out.article.content = JSON.parse(out.article.content) } catch (err) { out.article.content = { time: new Date().getTime(), blocks: [ {id: '1', type: 'paragraph', data: { text: 'Error parsing article content: ' + err.message }}, ], version: '2.25.0' } } } else if (out.article.content) { out.article.content = { time: new Date().getTime(), blocks: [ {id: '1', type: 'htmlraw', data: { html: out.article.content }}, ], version: '2.25.0' } } } else { out.article = { publish_at: new Date() } } ctx.body = out } /** GET: /api/auth/articles/:path */ auth_getSingleArticle(ctx) { return this.private_getUpdateArticle(ctx) } /** PUT: /api/auth/articles/:path */ async auth_updateCreateSingleArticle(ctx) { console.log(ctx.req.body) let newBanner = null let newMedia = null let promises = [] if (ctx.req.files.banner) { promises.push( this.upload(ctx.req.files.banner) .then(res => { newBanner = res }) ) } if (ctx.req.files.media) { promises.push( this.upload(ctx.req.files.media) .then(res => { newMedia = res }) ) } await Promise.all(promises) return this.private_getUpdateArticle(ctx, ctx.req.body, newBanner, newMedia) } /** DELETE: /api/auth/articles/:path */ async auth_removeSingleArticle(ctx) { let params = [ ctx.state.auth_token, ctx.params.path, // Article data null, null, null, null, null, null, null, 1, // Banner data null, null, null, null, null, null, null, 1, // Media data null, null, null, null, null, null, null, 1, ] await ctx.db.safeCallProc('article_auth_get_update_create', params) ctx.status = 204 } }