Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion README.md
Original file line number Diff line number Diff line change
Expand Up @@ -44,7 +44,7 @@ and Parse Server [issue #1582](https://github.com/ParsePlatform/parse-server/iss
## Installation

1. Clone the repo: `git clone git@github.com:parse-server-modules/parse-files-utils.git`
2. cd into repo: `cd parse-file-utils`
2. cd into repo: `cd parse-files-utils`
3. Install dependencies: `npm install`

## Usage
Expand Down
5 changes: 5 additions & 0 deletions config.example.js
Original file line number Diff line number Diff line change
Expand Up @@ -25,6 +25,11 @@ module.exports = {
gcs_keyFilename: "credentials.json",
gcs_bucket: "BUCKET_NAME",

// For Azure configuration
azure_account: "STORAGE_ACCOUNT_NAME",
azure_container: "BLOB_CONTAINER",
azure_accessKey: "ACCESS_KEY",

// Or set filesAdapter to a Parse Server file adapter
// filesAdapter: new FileAdapter({
// filesSubDirectory: './downloaded_files'
Expand Down
88 changes: 76 additions & 12 deletions lib/index.js
Original file line number Diff line number Diff line change
Expand Up @@ -73,7 +73,7 @@ function onlyFiles(schemas) {
return schemas.map(function(schema) {
var fileFields = Object.keys(schema.fields).filter(function(key){
var value = schema.fields[key];
return value.type == "File";
return value.type == "File" || value.type == "Array";
});
if (fileFields.length > 0) {
return {
Expand Down Expand Up @@ -102,6 +102,80 @@ function getAllObjects(baseQuery) {
return next();
}

// Cases covered:
// i - It is a single File
// ii - It is a single Array with no files
// iii - It is a single Array with only files
// iv - There are multiple Arrays with only files
// v - There are multiple Arrays with no files
// vi - There are multiple Arrays with file and non-file elements

var ARRAY_WITH_FILES = 1;
var ARRAY_NO_FILES = 2;
var FILE = 3;

function check(element, schema) {
var toRet = FILE;
var hasArray = false;
var hasFile = false;
var data = [];
var fields = schema.fields;


fields.forEach(function(key) {
if(Array.isArray(element.get(key))) {
hasArray = true;
element.get(key).forEach(function(item) {
if(item instanceof Parse.File) {
hasFile = true;
var fName = item._name;
var fUrl = item._url;
data.push({
className: schema.className,
objectId: item.id,
fieldName: key,
fileName: fName,
url: fUrl
});
}
});
}
});

if(hasArray && hasFile) toRet = ARRAY_WITH_FILES;
else if(hasArray) toRet = ARRAY_NO_FILES;

var returnObj = {
code: toRet,
data: data,
};

return returnObj;
}

function checkArrays(result, schema) {
var status = check(result, schema);
if(status.code === ARRAY_WITH_FILES) {
return status.data
}
else if(status.code === ARRAY_NO_FILES) {
return []
}
else {
return schema.fields.map(function(field){
var fName = result.get(field) ? result.get(field).name() : 'DELETE';
var fUrl = result.get(field) ? result.get(field).url() : 'DELETE';
return {
className: schema.className,
objectId: result.id,
fieldName: field,
fileName: fName,
url: fUrl
}
})
}
}

function getObjectsWithFilesFromSchema(schema) {
var query = new Parse.Query(schema.className);
query.select(schema.fields.concat('createdAt'));
Expand All @@ -116,17 +190,7 @@ function getObjectsWithFilesFromSchema(schema) {
return getAllObjects(query).then(function(results) {
return results.reduce(function(current, result){
return current.concat(
schema.fields.map(function(field){
var fName = result.get(field) ? result.get(field).name() : 'DELETE';
var fUrl = result.get(field) ? result.get(field).url() : 'DELETE';
return {
className: schema.className,
objectId: result.id,
fieldName: field,
fileName: fName,
url: fUrl
}
})
checkArrays(result, schema)
);
}, []);
});
Expand Down
2 changes: 1 addition & 1 deletion lib/transfer.js
Original file line number Diff line number Diff line change
Expand Up @@ -142,7 +142,7 @@ function _processFiles(files, handler) {
}, callback)
.then(callback, callback);
} else {
callback();
process.nextTick(callback);
}
}, function(error) {
if (error) {
Expand Down