|
| 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