overleaf/services/filestore/app/coffee/FileHandler.coffee

85 lines
3 KiB
CoffeeScript

settings = require("settings-sharelatex")
PersistorManager = require("./PersistorManager")
LocalFileWriter = require("./LocalFileWriter")
logger = require("logger-sharelatex")
FileConverter = require("./FileConverter")
KeyBuilder = require("./KeyBuilder")
async = require("async")
ImageOptimiser = require("./ImageOptimiser")
module.exports =
insertFile: (bucket, key, stream, callback)->
convetedKey = KeyBuilder.getConvertedFolderKey(key)
PersistorManager.deleteDirectory bucket, convetedKey, (error) ->
return callback(error) if error?
PersistorManager.sendStream bucket, key, stream, callback
deleteFile: (bucket, key, callback)->
convetedKey = KeyBuilder.getConvertedFolderKey(key)
async.parallel [
(done)-> PersistorManager.deleteFile bucket, key, done
(done)-> PersistorManager.deleteDirectory bucket, convetedKey, done
], callback
getFile: (bucket, key, opts = {}, callback)->
logger.log bucket:bucket, key:key, opts:opts, "getting file"
if !opts.format? and !opts.style?
@_getStandardFile bucket, key, opts, callback
else
@_getConvertedFile bucket, key, opts, callback
_getStandardFile: (bucket, key, opts, callback)->
PersistorManager.getFileStream bucket, key, opts, (err, fileStream)->
if err?
logger.err bucket:bucket, key:key, opts:opts, "error getting fileStream"
callback err, fileStream
_getConvertedFile: (bucket, key, opts, callback)->
convetedKey = KeyBuilder.addCachingToKey(key, opts)
PersistorManager.checkIfFileExists bucket, convetedKey, (err, exists)=>
if exists
PersistorManager.getFileStream bucket, convetedKey, callback
else
@_getConvertedFileAndCache bucket, key, convetedKey, opts, callback
_getConvertedFileAndCache: (bucket, key, convetedKey, opts, callback)->
self = @
convertedFsPath = ""
async.series [
(cb)->
self._convertFile bucket, key, opts, (err, fileSystemPath)->
convertedFsPath = fileSystemPath
cb err
(cb)->
ImageOptimiser.compressPng convertedFsPath, cb
(cb)->
PersistorManager.sendFile bucket, convetedKey, convertedFsPath, cb
], (err)->
if err?
return callback(err)
PersistorManager.getFileStream bucket, convetedKey, callback
_convertFile: (bucket, origonalKey, opts, callback)->
@_writeS3FileToDisk bucket, origonalKey, (err, origonalFsPath)->
done = (err, destPath)->
if err?
logger.err err:err, bucket:bucket, origonalKey:origonalKey, opts:opts, "error converting file"
return callback(err)
LocalFileWriter.deleteFile origonalFsPath, ->
callback(err, destPath)
if opts.format?
FileConverter.convert origonalFsPath, opts.format, done
else if opts.style == "thumbnail"
FileConverter.thumbnail origonalFsPath, done
else if opts.style == "preview"
FileConverter.preview origonalFsPath, done
else
throw new Error("should have specified opts to convert file with #{JSON.stringify(opts)}")
_writeS3FileToDisk: (bucket, key, callback)->
PersistorManager.getFileStream bucket, key, (err, fileStream)->
LocalFileWriter.writeStream fileStream, key, callback