This function is the first step to get out data following GDPR about the transportability of data. Details: https://gdpr-info.eu/art-20-gdpr/ Signed-off-by: Sheogorath <sheogorath@shivering-isles.com>
		
			
				
	
	
		
			128 lines
		
	
	
		
			3.5 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
			
		
		
	
	
			128 lines
		
	
	
		
			3.5 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
| 'use strict'
 | |
| 
 | |
| const archiver = require('archiver')
 | |
| const async = require('async')
 | |
| const Router = require('express').Router
 | |
| 
 | |
| const response = require('../response')
 | |
| const config = require('../config')
 | |
| const models = require('../models')
 | |
| const logger = require('../logger')
 | |
| const {generateAvatar} = require('../letter-avatars')
 | |
| 
 | |
| const UserRouter = module.exports = Router()
 | |
| 
 | |
| // get me info
 | |
| UserRouter.get('/me', function (req, res) {
 | |
|   if (req.isAuthenticated()) {
 | |
|     models.User.findOne({
 | |
|       where: {
 | |
|         id: req.user.id
 | |
|       }
 | |
|     }).then(function (user) {
 | |
|       if (!user) { return response.errorNotFound(res) }
 | |
|       var profile = models.User.getProfile(user)
 | |
|       res.send({
 | |
|         status: 'ok',
 | |
|         id: req.user.id,
 | |
|         name: profile.name,
 | |
|         photo: profile.photo
 | |
|       })
 | |
|     }).catch(function (err) {
 | |
|       logger.error('read me failed: ' + err)
 | |
|       return response.errorInternalError(res)
 | |
|     })
 | |
|   } else {
 | |
|     res.send({
 | |
|       status: 'forbidden'
 | |
|     })
 | |
|   }
 | |
| })
 | |
| 
 | |
| // delete the currently authenticated user
 | |
| UserRouter.get('/me/delete/:token?', function (req, res) {
 | |
|   if (req.isAuthenticated()) {
 | |
|     models.User.findOne({
 | |
|       where: {
 | |
|         id: req.user.id
 | |
|       }
 | |
|     }).then(function (user) {
 | |
|       if (!user) {
 | |
|         return response.errorNotFound(res)
 | |
|       }
 | |
|       if (user.deleteToken === req.params.token) {
 | |
|         user.destroy().then(function () {
 | |
|           res.redirect(config.serverURL + '/')
 | |
|         })
 | |
|       } else {
 | |
|         return response.errorForbidden(res)
 | |
|       }
 | |
|     }).catch(function (err) {
 | |
|       logger.error('delete user failed: ' + err)
 | |
|       return response.errorInternalError(res)
 | |
|     })
 | |
|   } else {
 | |
|     return response.errorForbidden(res)
 | |
|   }
 | |
| })
 | |
| 
 | |
| // export the data of the authenticated user
 | |
| UserRouter.get('/me/export', function (req, res) {
 | |
|   if (req.isAuthenticated()) {
 | |
|     // let output = fs.createWriteStream(__dirname + '/example.zip');
 | |
|     let archive = archiver('zip', {
 | |
|       zlib: { level: 3 } // Sets the compression level.
 | |
|     })
 | |
|     res.setHeader('Content-Type', 'application/zip')
 | |
|     res.attachment('archive.zip')
 | |
|     archive.pipe(res)
 | |
|     archive.on('error', function (err) {
 | |
|       logger.error('export user data failed: ' + err)
 | |
|       return response.errorInternalError(res)
 | |
|     })
 | |
|     models.User.findOne({
 | |
|       where: {
 | |
|         id: req.user.id
 | |
|       }
 | |
|     }).then(function (user) {
 | |
|       models.Note.findAll({
 | |
|         where: {
 | |
|           ownerId: user.id
 | |
|         }
 | |
|       }).then(function (notes) {
 | |
|         let list = []
 | |
|         async.each(notes, function (note, callback) {
 | |
|           let title
 | |
|           let extension = ''
 | |
|           do {
 | |
|             title = note.title + extension
 | |
|             extension++
 | |
|           } while (list.indexOf(title) !== -1)
 | |
| 
 | |
|           list.push(title)
 | |
|           logger.debug('Write: ' + title + '.md')
 | |
|           archive.append(Buffer.from(note.content), { name: title + '.md', date: note.lastchangeAt })
 | |
|           callback(null, null)
 | |
|         }, function (err) {
 | |
|           if (err) {
 | |
|             return response.errorInternalError(res)
 | |
|           }
 | |
| 
 | |
|           archive.finalize()
 | |
|         })
 | |
|       })
 | |
|     }).catch(function (err) {
 | |
|       logger.error('export user data failed: ' + err)
 | |
|       return response.errorInternalError(res)
 | |
|     })
 | |
|   } else {
 | |
|     return response.errorForbidden(res)
 | |
|   }
 | |
| })
 | |
| 
 | |
| UserRouter.get('/user/:username/avatar.svg', function (req, res, next) {
 | |
|   res.setHeader('Content-Type', 'image/svg+xml')
 | |
|   res.setHeader('Cache-Control', 'public, max-age=86400')
 | |
|   res.send(generateAvatar(req.params.username))
 | |
| })
 |