Skip to content

Commit 888c50b

Browse files
committed
Merge pull request #1 from yllieth/upload-helper
add uploadFileHelper
2 parents 7a7133c + 78b7880 commit 888c50b

10 files changed

+171
-30
lines changed

.jshintrc

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@
1919
"trailing": true,
2020
"smarttabs": true,
2121
"globals": {
22-
"angular": false
22+
"angular": false,
23+
"formFactory": true
2324
}
2425
}

README.md

Lines changed: 40 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,7 @@ angular.module('YourAngularApplication', ['predicsis.jsSDK'])
2020
predicsisAPIProvider.setBaseUrl('https://predicsis_api_host');
2121
predicsisAPIProvider.setOauthToken('4V83j2BWgcPONK8Xw8P7953yPvnTzz784V83j2BWgcPONK8Xw8P7953yPvnTzz78');
2222
})
23-
23+
2424
.controller('ExampleCtrl', function(predicsisAPI) {
2525
var self = this;
2626
predicsisAPI.Datasets.all().then(function(datasetList) { self.datasets = datasetList; });
@@ -47,7 +47,7 @@ angular.module('YourAngularApplication', ['predicsis.jsSDK'])
4747
});
4848
```
4949

50-
Default values:
50+
Default values:
5151
- api endpoint: `https://api.predicsis.com`
5252
- error handler: `throw Error(response);`
5353
- oauth access token: `no-token-defined`
@@ -79,13 +79,13 @@ return api.Datasets.getChildren(project.learning_dataset_id).then(function(child
7979
dataset_id: children.train.id
8080
});
8181
})
82-
82+
8383
// create the model from preparation rules set
8484
.then(function(preparationRulesRet) {
8585
preparationRulesSet = preparationRulesRet
8686
return api.Models.createClassifier(preparationRulesRet.id);
8787
})
88-
88+
8989
// generate reports
9090
.then(function(classifier) {
9191
classifier = classifier
@@ -95,7 +95,7 @@ return api.Datasets.getChildren(project.learning_dataset_id).then(function(child
9595
api.Reports.createUnivariateSupervisedReport(project)
9696
]);
9797
})
98-
98+
9999
//update project
100100
.then(function(reports) {
101101
return api.Projects.update(project.id, {
@@ -104,7 +104,7 @@ return api.Datasets.getChildren(project.learning_dataset_id).then(function(child
104104
report_ids: reportIds
105105
});
106106
})
107-
107+
108108
//return classifier
109109
.then(function() {
110110
return classifier;
@@ -118,21 +118,42 @@ See the [SDK documentation](http://yllieth.github.io/predicsis_ml_sdk-javascript
118118
## Available services
119119
API resources | Helpers
120120
------------------|---------
121-
Dataset |
122-
Dictionary |
123-
Jobs |
124-
Modality |
121+
Dataset |
122+
Dictionary |
123+
Jobs |
124+
Modality |
125125
Model | Model helper
126-
Oauth token |
127-
Oauth application |
128-
Preparation rules |
126+
Oauth token |
127+
Oauth application |
128+
Preparation rules |
129129
Project | Project helper
130-
Report |
131-
Source |
132-
Upload |
133-
User |
134-
User settings |
135-
Variable |
130+
Report |
131+
Source |
132+
Upload | S3 file helper
133+
User |
134+
User settings |
135+
Variable |
136+
137+
## Upload a file to S3
138+
139+
```javascript
140+
//Get an HTML5 File instance
141+
fileInput.addEventListener('change', function(evt) {
142+
var file = evt.target.files[0];
143+
s3FileHelper
144+
.upload(file, function progressHandler(event) {
145+
//Update a progress bar using standard XMLHttpRequestProgressEvent
146+
})
147+
.then(function(params) {
148+
//file successfully uploaded to s3
149+
var filename = params.filename;
150+
var key = params.key;//S3 key
151+
})
152+
.catch(function(err){
153+
154+
});
155+
});
156+
```
136157

137158
## Run this project locally
138159

bower.json

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,8 @@
22
"name": "predicsis_ml_sdk-javascript",
33
"version": "0.1.5",
44
"authors": [
5-
"Yllieth <[email protected]>"
5+
"Yllieth <[email protected]>",
6+
"Dehau"
67
],
78
"description": "Javascript SDK for PredicSis ML API",
89
"keywords": [
@@ -17,7 +18,8 @@
1718
"license": "MIT",
1819
"dependencies": {
1920
"angular": "1.3.14",
20-
"restangular": "1.4.0"
21+
"restangular": "1.4.0",
22+
"formfactory": "~0.2.0"
2123
},
2224
"main": "dist/predicsis-jsSDK.js",
2325
"ignore": [

dist/predicsis-jsSDK.js

Lines changed: 62 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -58,6 +58,7 @@ angular.module('predicsis.jsSDK', ['restangular'])
5858
_restangular: Restangular,
5959
setOauthToken: function(token) {
6060
self.setOauthToken(token);
61+
Restangular.setDefaultHeaders({ accept: 'application/json', Authorization: token });
6162
},
6263
setErrorHandler: function(handler) {
6364
self.setErrorHandler(handler);
@@ -771,7 +772,7 @@ angular.module('predicsis.jsSDK')
771772
* @return {Promise} New modalities set
772773
*/
773774
this.create = function(params) {
774-
return jobsHelper.wrapAsyncPromise(modalities().post({source: params}));
775+
return jobsHelper.wrapAsyncPromise(modalities().post({modalities_set: params}));
775776
};
776777

777778
/**
@@ -2774,13 +2775,13 @@ angular.module('predicsis.jsSDK')
27742775
* </ul>
27752776
*/
27762777
this.getCurrentState = function(project) {
2777-
if (project.scoreset_ids.length > 0) {
2778+
if (project.scoreset_ids && project.scoreset_ids.length) {
27782779
//Scored files
27792780
return {
27802781
view: 'project.deploy-overview',
27812782
properties: {projectId: project.id}
27822783
};
2783-
} else if (project.scoring_dataset_ids.length > 0) {
2784+
} else if (project.scoring_dataset_ids && project.scoring_dataset_ids.length) {
27842785
//Deploy
27852786
return {
27862787
view: 'project.format-score',
@@ -2983,3 +2984,61 @@ angular.module('predicsis.jsSDK')
29832984
});
29842985
};
29852986
});
2987+
2988+
/**
2989+
* @ngdoc service
2990+
* @name predicsis.jsSDK.s3FileHelper
2991+
* @require $injector
2992+
*/
2993+
angular.module('predicsis.jsSDK')
2994+
.service('s3FileHelper', function($injector) {
2995+
'use strict';
2996+
2997+
var Upload = $injector.get('Uploads');
2998+
var $q = $injector.get('$q');
2999+
3000+
/**
3001+
* @ngdoc function
3002+
* @methodOf predicsis.jsSDK.s3FileHelper
3003+
* @name upload
3004+
* @description upload a file to S3
3005+
*
3006+
* @param {Object} file html5 File instance
3007+
* @return {Promise}
3008+
*/
3009+
this.upload = function(file, progressHandler) {
3010+
var deferred = $q.defer();
3011+
Upload.getCredentials('s3')
3012+
.then(function(credential) {
3013+
var key = credential.key.replace('${filename}', file.name);
3014+
var form = formFactory({
3015+
key: key,
3016+
AWSAccessKeyId: credential.aws_access_key_id,
3017+
'Content-Type': 'multipart/form-data',
3018+
success_action_status: 201,
3019+
acl: 'private',
3020+
policy: credential.policy,
3021+
signature: credential.signature
3022+
}, {
3023+
file: file
3024+
});
3025+
var xhr2 = new XMLHttpRequest();
3026+
xhr2.open('POST', credential.s3_endpoint, true);
3027+
if(progressHandler) {
3028+
xhr2.upload.addEventListener('progress', progressHandler);
3029+
}
3030+
xhr2.addEventListener('load', function() {
3031+
if(xhr2.status === 201) {
3032+
deferred.resolve({filename: file.name, key: key});
3033+
} else {
3034+
deferred.reject({status: xhr2.status, err: xhr2.responseText});
3035+
}
3036+
});
3037+
xhr2.addEventListener('error', function(err) {
3038+
deferred.reject(err);
3039+
});
3040+
xhr2.send(form);
3041+
});
3042+
return deferred.promise;
3043+
};
3044+
});

dist/predicsis-jsSDK.min.js

Lines changed: 1 addition & 1 deletion
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

dist/predicsis-jsSDK.min.js.map

Lines changed: 1 addition & 1 deletion
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

lib/helper/projectsHelper.js

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -63,13 +63,13 @@ angular.module('predicsis.jsSDK')
6363
* </ul>
6464
*/
6565
this.getCurrentState = function(project) {
66-
if (project.scoreset_ids.length > 0) {
66+
if (project.scoreset_ids && project.scoreset_ids.length) {
6767
//Scored files
6868
return {
6969
view: 'project.deploy-overview',
7070
properties: {projectId: project.id}
7171
};
72-
} else if (project.scoring_dataset_ids.length > 0) {
72+
} else if (project.scoring_dataset_ids && project.scoring_dataset_ids.length) {
7373
//Deploy
7474
return {
7575
view: 'project.format-score',

lib/helper/s3FileHelper.js

Lines changed: 57 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,57 @@
1+
/**
2+
* @ngdoc service
3+
* @name predicsis.jsSDK.s3FileHelper
4+
* @require $injector
5+
*/
6+
angular.module('predicsis.jsSDK')
7+
.service('s3FileHelper', function($injector) {
8+
'use strict';
9+
10+
var Upload = $injector.get('Uploads');
11+
var $q = $injector.get('$q');
12+
13+
/**
14+
* @ngdoc function
15+
* @methodOf predicsis.jsSDK.s3FileHelper
16+
* @name upload
17+
* @description upload a file to S3
18+
*
19+
* @param {Object} file html5 File instance
20+
* @return {Promise}
21+
*/
22+
this.upload = function(file, progressHandler) {
23+
var deferred = $q.defer();
24+
Upload.getCredentials('s3')
25+
.then(function(credential) {
26+
var key = credential.key.replace('${filename}', file.name);
27+
var form = formFactory({
28+
key: key,
29+
AWSAccessKeyId: credential.aws_access_key_id,
30+
'Content-Type': 'multipart/form-data',
31+
success_action_status: 201,
32+
acl: 'private',
33+
policy: credential.policy,
34+
signature: credential.signature
35+
}, {
36+
file: file
37+
});
38+
var xhr2 = new XMLHttpRequest();
39+
xhr2.open('POST', credential.s3_endpoint, true);
40+
if(progressHandler) {
41+
xhr2.upload.addEventListener('progress', progressHandler);
42+
}
43+
xhr2.addEventListener('load', function() {
44+
if(xhr2.status === 201) {
45+
deferred.resolve({filename: file.name, key: key});
46+
} else {
47+
deferred.reject({status: xhr2.status, err: xhr2.responseText});
48+
}
49+
});
50+
xhr2.addEventListener('error', function(err) {
51+
deferred.reject(err);
52+
});
53+
xhr2.send(form);
54+
});
55+
return deferred.promise;
56+
};
57+
});

lib/model/Modalities.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -60,7 +60,7 @@ angular.module('predicsis.jsSDK')
6060
* @return {Promise} New modalities set
6161
*/
6262
this.create = function(params) {
63-
return jobsHelper.wrapAsyncPromise(modalities().post({source: params}));
63+
return jobsHelper.wrapAsyncPromise(modalities().post({modalities_set: params}));
6464
};
6565

6666
/**

lib/predicsis-jsSDK.js

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -58,6 +58,7 @@ angular.module('predicsis.jsSDK', ['restangular'])
5858
_restangular: Restangular,
5959
setOauthToken: function(token) {
6060
self.setOauthToken(token);
61+
Restangular.setDefaultHeaders({ accept: 'application/json', Authorization: token });
6162
},
6263
setErrorHandler: function(handler) {
6364
self.setErrorHandler(handler);

0 commit comments

Comments
 (0)