123 lines
		
	
	
		
			4.3 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
			
		
		
	
	
			123 lines
		
	
	
		
			4.3 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
const models = require('../../models')
 | 
						|
const logger = require('../../logger')
 | 
						|
const config = require('../../config')
 | 
						|
const errors = require('../../errors')
 | 
						|
const fs = require('fs')
 | 
						|
const shortId = require('shortid')
 | 
						|
const markdownpdf = require('markdown-pdf')
 | 
						|
const moment = require('moment')
 | 
						|
const querystring = require('querystring')
 | 
						|
 | 
						|
exports.getInfo = function getInfo (req, res, note) {
 | 
						|
  const body = note.content
 | 
						|
  const extracted = models.Note.extractMeta(body)
 | 
						|
  const markdown = extracted.markdown
 | 
						|
  const meta = models.Note.parseMeta(extracted.meta)
 | 
						|
  const createtime = note.createdAt
 | 
						|
  const updatetime = note.lastchangeAt
 | 
						|
  const title = models.Note.decodeTitle(note.title)
 | 
						|
  const data = {
 | 
						|
    title: meta.title || title,
 | 
						|
    description: meta.description || (markdown ? models.Note.generateDescription(markdown) : null),
 | 
						|
    viewcount: note.viewcount,
 | 
						|
    createtime: createtime,
 | 
						|
    updatetime: updatetime
 | 
						|
  }
 | 
						|
  res.set({
 | 
						|
    'Access-Control-Allow-Origin': '*', // allow CORS as API
 | 
						|
    'Access-Control-Allow-Headers': 'Range',
 | 
						|
    'Access-Control-Expose-Headers': 'Cache-Control, Content-Encoding, Content-Range',
 | 
						|
    'Cache-Control': 'private', // only cache by client
 | 
						|
    'X-Robots-Tag': 'noindex, nofollow' // prevent crawling
 | 
						|
  })
 | 
						|
  res.send(data)
 | 
						|
}
 | 
						|
 | 
						|
exports.createPDF = function createPDF (req, res, note) {
 | 
						|
  const url = config.serverURL || 'http://' + req.get('host')
 | 
						|
  const body = note.content
 | 
						|
  const extracted = models.Note.extractMeta(body)
 | 
						|
  let content = extracted.markdown
 | 
						|
  const title = models.Note.decodeTitle(note.title)
 | 
						|
 | 
						|
  if (!fs.existsSync(config.tmpPath)) {
 | 
						|
    fs.mkdirSync(config.tmpPath)
 | 
						|
  }
 | 
						|
  const path = config.tmpPath + '/' + Date.now() + '.pdf'
 | 
						|
  content = content.replace(/\]\(\//g, '](' + url + '/')
 | 
						|
  markdownpdf().from.string(content).to(path, function () {
 | 
						|
    if (!fs.existsSync(path)) {
 | 
						|
      logger.error('PDF seems to not be generated as expected. File doesn\'t exist: ' + path)
 | 
						|
      return errors.errorInternalError(res)
 | 
						|
    }
 | 
						|
    const stream = fs.createReadStream(path)
 | 
						|
    let filename = title
 | 
						|
    // Be careful of special characters
 | 
						|
    filename = encodeURIComponent(filename)
 | 
						|
    // Ideally this should strip them
 | 
						|
    res.setHeader('Content-disposition', 'attachment; filename="' + filename + '.pdf"')
 | 
						|
    res.setHeader('Cache-Control', 'private')
 | 
						|
    res.setHeader('Content-Type', 'application/pdf; charset=UTF-8')
 | 
						|
    res.setHeader('X-Robots-Tag', 'noindex, nofollow') // prevent crawling
 | 
						|
    stream.pipe(res)
 | 
						|
    fs.unlinkSync(path)
 | 
						|
  })
 | 
						|
}
 | 
						|
 | 
						|
exports.createGist = function createGist (req, res, note) {
 | 
						|
  const data = {
 | 
						|
    client_id: config.github.clientID,
 | 
						|
    redirect_uri: config.serverURL + '/auth/github/callback/' + models.Note.encodeNoteId(note.id) + '/gist',
 | 
						|
    scope: 'gist',
 | 
						|
    state: shortId.generate()
 | 
						|
  }
 | 
						|
  const query = querystring.stringify(data)
 | 
						|
  res.redirect('https://github.com/login/oauth/authorize?' + query)
 | 
						|
}
 | 
						|
 | 
						|
exports.getRevision = function getRevision (req, res, note) {
 | 
						|
  const actionId = req.params.actionId
 | 
						|
  if (actionId) {
 | 
						|
    const time = moment(parseInt(actionId))
 | 
						|
    if (time.isValid()) {
 | 
						|
      models.Revision.getPatchedNoteRevisionByTime(note, time, function (err, content) {
 | 
						|
        if (err) {
 | 
						|
          logger.error(err)
 | 
						|
          return errors.errorInternalError(res)
 | 
						|
        }
 | 
						|
        if (!content) {
 | 
						|
          return errors.errorNotFound(res)
 | 
						|
        }
 | 
						|
        res.set({
 | 
						|
          'Access-Control-Allow-Origin': '*', // allow CORS as API
 | 
						|
          'Access-Control-Allow-Headers': 'Range',
 | 
						|
          'Access-Control-Expose-Headers': 'Cache-Control, Content-Encoding, Content-Range',
 | 
						|
          'Cache-Control': 'private', // only cache by client
 | 
						|
          'X-Robots-Tag': 'noindex, nofollow' // prevent crawling
 | 
						|
        })
 | 
						|
        res.send(content)
 | 
						|
      })
 | 
						|
    } else {
 | 
						|
      return errors.errorNotFound(res)
 | 
						|
    }
 | 
						|
  } else {
 | 
						|
    models.Revision.getNoteRevisions(note, function (err, data) {
 | 
						|
      if (err) {
 | 
						|
        logger.error(err)
 | 
						|
        return errors.errorInternalError(res)
 | 
						|
      }
 | 
						|
      const out = {
 | 
						|
        revision: data
 | 
						|
      }
 | 
						|
      res.set({
 | 
						|
        'Access-Control-Allow-Origin': '*', // allow CORS as API
 | 
						|
        'Access-Control-Allow-Headers': 'Range',
 | 
						|
        'Access-Control-Expose-Headers': 'Cache-Control, Content-Encoding, Content-Range',
 | 
						|
        'Cache-Control': 'private', // only cache by client
 | 
						|
        'X-Robots-Tag': 'noindex, nofollow' // prevent crawling
 | 
						|
      })
 | 
						|
      res.send(out)
 | 
						|
    })
 | 
						|
  }
 | 
						|
}
 |