overleaf/services/filestore/app/coffee/FSPersistorManager.coffee

90 lines
3.7 KiB
CoffeeScript
Raw Normal View History

logger = require("logger-sharelatex")
fs = require("fs")
LocalFileWriter = require("./LocalFileWriter")
2014-12-19 16:58:04 +00:00
rimraf = require("rimraf")
response = require ("response")
2014-03-01 15:10:47 +00:00
filterName = (key) ->
return key.replace /\//g, "_"
2014-03-01 15:10:47 +00:00
2014-03-01 15:10:47 +00:00
module.exports =
sendFile: ( location, target, source, callback = (err)->) ->
2014-03-01 15:10:47 +00:00
filteredTarget = filterName target
logger.log location:location, target:filteredTarget, source:source, "sending file"
fs.rename source, "#{location}/#{filteredTarget}", (err) ->
2014-03-01 15:23:11 +00:00
if err!=null
logger.err err:err, location:location, target:filteredTarget, source:source, "Error on put of file"
callback err
sendStream: ( location, target, sourceStream, callback = (err)->) ->
2014-03-04 14:45:32 +00:00
logger.log location:location, target:target, "sending file stream"
sourceStream.on "error", (err)->
2014-03-04 14:45:32 +00:00
logger.err location:location, target:target, err:err "error on stream to send"
LocalFileWriter.writeStream sourceStream, null, (err, fsPath)=>
if err?
logger.err location:location, target:target, fsPath:fsPath, err:err, "something went wrong writing stream to disk"
return callback err
@sendFile location, target, fsPath, callback
2015-02-26 11:32:05 +00:00
getFileStream: (location, name, _callback = (err, res)->) ->
callback = (args...) ->
_callback(args...)
_callback = () ->
2014-03-01 15:10:47 +00:00
filteredName = filterName name
logger.log location:location, name:filteredName, "getting file"
sourceStream = fs.createReadStream "#{location}/#{filteredName}"
sourceStream.on 'error', (err) ->
logger.err err:err, location:location, name:name, "Error reading from file"
if err.code = 'ENOENT'
callback null, response().html('NoSuchKey: file not found\n')
else
callback err
sourceStream.on 'readable', () ->
2015-02-26 11:32:05 +00:00
# This can be called multiple times, but the callback wrapper
# ensures the callback is only called once
callback null, sourceStream
copyFile: (location, fromName, toName, callback = (err)->)->
2014-03-01 15:10:47 +00:00
filteredFromName=filterName fromName
filteredToName=filterName toName
logger.log location:location, fromName:filteredFromName, toName:filteredToName, "copying file"
sourceStream = fs.createReadStream "#{location}/#{filteredFromName}"
sourceStream.on 'error', (err) ->
2014-03-01 15:10:47 +00:00
logger.err err:err, location:location, key:filteredFromName, "Error reading from file"
callback err
2014-03-01 15:10:47 +00:00
targetStream = fs.createWriteStream "#{location}/#{filteredToName}"
targetStream.on 'error', (err) ->
2014-03-01 15:10:47 +00:00
logger.err err:err, location:location, key:filteredToName, "Error writing to file"
callback err
targetStream.on 'finish', () ->
callback null
sourceStream.pipe targetStream
deleteFile: (location, name, callback)->
2014-03-01 15:10:47 +00:00
filteredName = filterName name
logger.log location:location, name:filteredName, "delete file"
fs.unlink "#{location}/#{filteredName}", (err) ->
2014-12-22 11:11:31 +00:00
if err?
logger.err err:err, location:location, name:filteredName, "Error on delete."
callback err
else
callback()
deleteDirectory: (location, name, callback = (err)->)->
2014-12-19 16:58:04 +00:00
filteredName = filterName name.replace(/\/$/,'')
rimraf "#{location}/#{filteredName}", (err) ->
2014-12-22 11:11:31 +00:00
if err?
2014-12-19 16:58:04 +00:00
logger.err err:err, location:location, name:filteredName, "Error on rimraf rmdir."
callback err
else
callback()
checkIfFileExists:(location, name, callback = (err,exists)->)->
2014-03-01 15:10:47 +00:00
filteredName = filterName name
logger.log location:location, name:filteredName, "checking if file exists"
fs.exists "#{location}/#{filteredName}", (exists) ->
logger.log location:location, name:filteredName, exists:exists, "checked if file exists"
callback null, exists