Skip to content

Commit ff50190

Browse files
committed
adding upload code - server side
1 parent 1dc45cf commit ff50190

File tree

7 files changed

+623
-1
lines changed

7 files changed

+623
-1
lines changed

data/token.json

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
{"token_type":"Bearer","expires_in":1799,"access_token":"85RXW0LXdMQM9W6jHT5AxqWGwQYv"}

package.json

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,14 @@
66
"dependencies": {
77
"express": "*",
88
"request": "*",
9-
"serve-favicon": "*"
9+
"serve-favicon": "*",
10+
"body-parser": ">= 1.11.0",
11+
"formidable": ">= 1.0.17",
12+
"fs": ">= 0.0.2",
13+
"unirest": ">= 0.4.0",
14+
"async": ">= 0.9.0",
15+
"util": ">= 0.10.3",
16+
"path": ">=0.11.14"
17+
1018
}
1119
}

routes/lmv.js

Lines changed: 287 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,287 @@
1+
//
2+
// Copyright (c) Autodesk, Inc. All rights reserved
3+
//
4+
// Node.js server workflow
5+
// by Cyrille Fauvel - Autodesk Developer Network (ADN)
6+
// January 2015
7+
//
8+
// Permission to use, copy, modify, and distribute this software in
9+
// object code form for any purpose and without fee is hereby granted,
10+
// provided that the above copyright notice appears in all copies and
11+
// that both that copyright notice and the limited warranty and
12+
// restricted rights notice below appear in all supporting
13+
// documentation.
14+
//
15+
// AUTODESK PROVIDES THIS PROGRAM "AS IS" AND WITH ALL FAULTS.
16+
// AUTODESK SPECIFICALLY DISCLAIMS ANY IMPLIED WARRANTY OF
17+
// MERCHANTABILITY OR FITNESS FOR A PARTICULAR USE. AUTODESK, INC.
18+
// DOES NOT WARRANT THAT THE OPERATION OF THE PROGRAM WILL BE
19+
// UNINTERRUPTED OR ERROR FREE.
20+
//
21+
var express =require ('express') ;
22+
var request =require ('request') ;
23+
// unirest (http://unirest.io/) or SuperAgent (http://visionmedia.github.io/superagent/)
24+
var unirest =require('unirest') ;
25+
var events =require('events') ;
26+
var util =require ('util') ;
27+
var path =require ('path') ;
28+
var fs =require ('fs') ;
29+
var credentials =require ('../credentials') ;
30+
31+
// LMV object
32+
function Lmv (bucketName) {
33+
events.EventEmitter.call (this) ;
34+
this.bucket =bucketName ;
35+
this.creds =credentials ;
36+
}
37+
//Lmv.prototype.__proto__ =events.EventEmitter.prototype ;
38+
util.inherits (Lmv, events.EventEmitter) ;
39+
40+
/*static*/ Lmv.getToken =function () {
41+
try {
42+
var data =fs.readFileSync ('data/token.json') ;
43+
var authResponse =JSON.parse (data) ;
44+
return (authResponse.access_token) ;
45+
} catch ( err ) {
46+
console.log (err) ;
47+
}
48+
return ('') ;
49+
} ;
50+
51+
// POST /authentication/v1/authenticate
52+
/*static*/ Lmv.refreshToken =function () {
53+
console.log ('Refreshing Autodesk Service token') ;
54+
var params ={
55+
client_id: credentials.ClientId,
56+
client_secret: credentials.ClientSecret,
57+
grant_type: 'client_credentials'
58+
} ;
59+
var endpoint =credentials.BaseUrl + '/authentication/v1/authenticate' ;
60+
unirest.post (endpoint)
61+
.header ('Accept', 'application/json')
62+
.type ('application/x-www-form-urlencoded')
63+
.send (params)
64+
.end (function (response) {
65+
try {
66+
if ( response.statusCode != 200 )
67+
throw response ;
68+
var authResponse =response.body ;
69+
console.log ('Token: ' + JSON.stringify (authResponse)) ;
70+
//authResponse.expires_at =Math.floor (Date.now () / 1000) + authResponse.expires_in ;
71+
fs.writeFile ('data/token.json', JSON.stringify (authResponse), function (err) {
72+
if ( err )
73+
throw err ;
74+
}) ;
75+
} catch ( err ) {
76+
fs.unlinkSync ('data/token.json') ;
77+
console.log ('Token: ERROR! (' + response.statusCode + ')') ;
78+
}
79+
})
80+
;
81+
} ;
82+
83+
// GET /oss/v1/buckets/:bucket/details
84+
Lmv.prototype.checkBucket =function () {
85+
var self =this ;
86+
unirest.get (self.creds.BaseUrl + '/oss/v1/buckets/' + self.bucket + '/details')
87+
.header ('Accept', 'application/json')
88+
.header ('Content-Type', 'application/json')
89+
.header ('Authorization', 'Bearer ' + Lmv.getToken ())
90+
//.query (params)
91+
.end (function (response) {
92+
try {
93+
if ( response.statusCode != 200 )
94+
throw response ;
95+
self.emit ('success', response.raw_body) ;
96+
} catch ( err ) {
97+
self.emit ('fail', err) ;
98+
}
99+
})
100+
;
101+
return (this) ;
102+
} ;
103+
104+
// POST /oss/v1/buckets
105+
Lmv.prototype.createBucket =function (policy) {
106+
policy =policy || 'transient' ;
107+
var self =this ;
108+
unirest.post (self.creds.BaseUrl + '/oss/v1/buckets')
109+
.header ('Accept', 'application/json')
110+
.header ('Content-Type', 'application/json')
111+
.header ('Authorization', 'Bearer ' + Lmv.getToken ())
112+
.send ({ 'bucketKey': self.bucket, 'policy': policy })
113+
.end (function (response) {
114+
try {
115+
if ( response.statusCode != 200 || !response.raw_body.hasOwnProperty ('key') )
116+
throw response ;
117+
self.emit ('success', response.raw_body) ;
118+
} catch ( err ) {
119+
self.emit ('fail', err) ;
120+
}
121+
})
122+
;
123+
return (this) ;
124+
} ;
125+
126+
Lmv.prototype.createBucketIfNotExist =function (policy) {
127+
policy =policy || 'transient' ;
128+
var self =this ;
129+
130+
unirest.get (self.creds.BaseUrl + '/oss/v1/buckets/' + self.bucket + '/details')
131+
.header ('Accept', 'application/json')
132+
.header ('Content-Type', 'application/json')
133+
.header ('Authorization', 'Bearer ' + Lmv.getToken ())
134+
//.query (params)
135+
.end (function (response) {
136+
try {
137+
if ( response.statusCode != 200 )
138+
throw response ;
139+
try {
140+
self.emit ('success', response.raw_body) ;
141+
} catch ( err ) {
142+
}
143+
} catch ( err ) {
144+
//- We need to create one if error == 404 (404 Not Found)
145+
if ( Number.isInteger (err.statusCode) && err.statusCode == 404 ) {
146+
unirest.post (self.creds.BaseUrl + '/oss/v1/buckets')
147+
.header ('Accept', 'application/json')
148+
.header ('Content-Type', 'application/json')
149+
.header ('Authorization', 'Bearer ' + Lmv.getToken ())
150+
.send ({ 'bucketKey': self.bucket, 'policy': policy })
151+
.end (function (response) {
152+
try {
153+
if ( response.statusCode != 200 || !response.raw_body.hasOwnProperty ('key') )
154+
throw response ;
155+
try {
156+
self.emit ('success', response.raw_body) ;
157+
} catch ( err ) {
158+
}
159+
} catch ( err ) {
160+
self.emit ('fail', err) ;
161+
}
162+
})
163+
;
164+
} else {
165+
self.emit ('fail', err) ;
166+
}
167+
}
168+
})
169+
;
170+
return (this) ;
171+
} ;
172+
173+
// PUT /oss/v1/buckets/:bucket/objects/:filename
174+
Lmv.prototype.uploadFile =function (filename) {
175+
var self =this ;
176+
var serverFile =path.normalize (__dirname + '/../' + filename) ;
177+
var localFile =path.basename (filename) ;
178+
179+
var file =fs.readFile (serverFile, function (err, data) {
180+
if ( err )
181+
return (self.emit ('fail', err)) ;
182+
183+
var endpoint ='/oss/v1/buckets/' + self.bucket + '/objects/' + localFile.replace (/ /g, '+') ;
184+
unirest.put (self.creds.BaseUrl + endpoint)
185+
.headers ({
186+
'Accept': 'application/json',
187+
'Content-Type': 'application/octet-stream',
188+
'Authorization': ('Bearer ' + Lmv.getToken ())
189+
})
190+
.send (data)
191+
.end (function (response) {
192+
try {
193+
if ( response.statusCode != 200 )
194+
throw response ;
195+
try {
196+
self.emit ('success', response.raw_body) ;
197+
} catch ( err ) {
198+
}
199+
} catch ( err ) {
200+
self.emit ('fail', err) ;
201+
}
202+
})
203+
;
204+
}) ;
205+
return (this) ;
206+
} ;
207+
208+
// POST /viewingservice/v1/register
209+
Lmv.prototype.register =function (urn) {
210+
var self =this ;
211+
var desc ={ 'urn': new Buffer (urn).toString ('base64') } ;
212+
213+
unirest.post (self.creds.BaseUrl + '/viewingservice/v1/register')
214+
.headers ({
215+
'Accept': 'application/json',
216+
'Content-Type': 'application/json',
217+
'Authorization': ('Bearer ' + Lmv.getToken ())
218+
})
219+
.send (desc)
220+
.end (function (response) {
221+
try {
222+
if ( response.statusCode != 200 && response.statusCode != 201 )
223+
throw response ;
224+
try {
225+
self.emit ('success', { 'urn': desc.urn, 'response': response.body }) ;
226+
} catch ( err ) {
227+
}
228+
} catch ( err ) {
229+
self.emit ('fail', err) ;
230+
}
231+
})
232+
;
233+
return (this) ;
234+
} ;
235+
236+
Lmv.prototype.status =function (urn, params) {
237+
var self =this ;
238+
params =params || {} ;
239+
240+
var endpoint ='/viewingservice/v1/' + urn + '/status' ;
241+
unirest.get (self.creds.BaseUrl + endpoint)
242+
.headers ({
243+
'Accept': 'application/json',
244+
'Content-Type': 'application/json',
245+
'Authorization': ('Bearer ' + Lmv.getToken ())
246+
})
247+
.query (params)
248+
.end (function (response) {
249+
try {
250+
if ( response.statusCode != 200 )
251+
throw response ;
252+
try {
253+
self.emit ('success', response.body) ;
254+
} catch ( err ) {
255+
}
256+
} catch ( err ) {
257+
self.emit ('fail', err) ;
258+
}
259+
})
260+
;
261+
return (this) ;
262+
} ;
263+
264+
var router =express.Router () ;
265+
router.Lmv =Lmv ;
266+
module.exports =router ;
267+
268+
// Utility
269+
if ( !Number.isInteger ) {
270+
Number.isInteger =function isInteger (nVal) {
271+
return (
272+
typeof nVal === 'number'
273+
&& isFinite (nVal)
274+
&& nVal > -9007199254740992
275+
&& nVal < 9007199254740992
276+
&& Math.floor (nVal) === nVal
277+
) ;
278+
} ;
279+
}
280+
281+
// Initialization
282+
function initializeApp () {
283+
var seconds =1700 ; // Service returns 1799 seconds bearer token
284+
setInterval (Lmv.refreshToken, seconds * 1000) ;
285+
Lmv.refreshToken () ; // and now!
286+
}
287+
initializeApp () ;

0 commit comments

Comments
 (0)