//import coldbox.system.orm.hibernate.*; component extends="coldbox.system.orm.hibernate.VirtualEntityService" cache=true autowire=true singleton { property name="SecurityManager" inject="model"; property name="UserService" inject="model"; property name="flickrkeys" inject="coldbox:setting:flickrkeys"; property name="htmlbaseURL" inject="coldbox:setting:htmlbaseURL"; public any function init() { return this; } public void function setup() onDIComplete{ variables.sConsumerKey = flickrkeys.key; variables.sConsumerSecret = flickrkeys.secret; variables.sTokenEndpoint = 'http://www.flickr.com/services/oauth/request_token'; variables.sAuthorizationEndpoint = 'http://www.flickr.com/services/oauth/authorize'; variables.sCallbackURL = htmlbaseURL & 'Flickr/Auth/Redirect'; variables.sAccessTokenEndpoint = 'http://www.flickr.com/services/oauth/access_token'; variables.FlickrAPIEndpoint = 'http://api.flickr.com/services/rest'; variables.oReqSigMethodSHA = CreateObject("component", "model.oauth.oauthsignaturemethod_hmac_sha1"); variables.oConsumer = CreateObject("component", "model.oauth.oauthconsumer").init(sKey = variables.sConsumerKey, sSecret = variables.sConsumerSecret); } public string function getFlickrAuthorizeURL(Required String oauth_token, Required String oauth_token_secret) { var sCallbackURL = sCallbackURL & "?" & "key=" & sConsumerKey & "&" & "secret=" & sConsumerSecret & "&" & "token=" & oauth_token & "&" & "token_secret=" & oauth_token_secret & "&" & "endpoint=" & URLEncodedFormat(sAuthorizationEndpoint); var sAuthURL = sAuthorizationEndpoint & "?oauth_token=" & oauth_token & "&" & "oauth_callback=" & URLEncodedFormat(sCallbackURL) & "&perms=write"; return sAuthURL; } public any function getEmptyToken() { return CreateObject("component", "model.oauth.oauthtoken").createEmptyToken(); } public any function getOToken(Required String Token, Required String Secret) { return CreateObject("component", "model.oauth.oauthtoken").init( sKey = Token, sSecret = Secret ); } public any function getUserOToken(Required User) { return getOToken( User.getFlickr_oAuth_Token(), User.getFlickr_oAuth_Token_Secret() ); } public struct function getRequestTokens() { var oToken = getEmptyToken(); var oReq = getRequest(oToken=oToken,sHttpURL=variables.sTokenEndpoint); var tokenStrings = processRequest( oReq, false ); return queryStringToStruct(tokenStrings.filecontent); } public struct function getAccessTokens(Required String Verifier, Required String Token, Required String Secret) { var oToken = getOToken( Token=Token, Secret=Secret ); var stParameters = { oauth_verifier = Verifier }; var oReq = getRequest( oToken=oToken, sHttpURL=variables.sAccessTokenEndpoint, stParameters=stParameters ); var tokenStrings = processRequest( oReq, false ); return queryStringToStruct(tokenStrings.filecontent); } // http://www.flickr.com/services/api/flickr.people.getPhotos.html public any function people_getPhotos(Required User, Numeric safe_search, min_upload_date, max_upload_date, max_taken_date, Numeric content_type, Numeric privacy_filter, String extras, Numeric per_page=15, Numeric page=1) { var oToken = getUserOToken( User ); var stParameters = getParams(argumentCollection=arguments); stParameters.method = 'flickr.people.getPhotos'; stParameters.user_id = User.getFlickr_User_ID(); var oReq = getRequest(oToken=oToken,sHttpURL=variables.FlickrAPIEndpoint,stParameters=stParameters); return processRequest( oReq ); } // http://www.flickr.com/services/api/flickr.photosets.getList.html public struct function photosets_getList(Required User, Numeric page, Numeric per_page) { var oToken = getUserOToken( User ); var stParameters = getParams(argumentCollection=arguments); stParameters.method = 'flickr.photosets.getList'; stParameters.user_id = User.getFlickr_User_ID(); var oReq = getRequest(oToken=oToken,sHttpURL=variables.FlickrAPIEndpoint,stParameters=stParameters); return processRequest( oReq ).photosets; } // http://www.flickr.com/services/api/flickr.photosets.getPhotos.html public struct function photosets_getPhotos(Required User, Required String Photoset_ID, String extras, Numeric privacy_filter, Numeric per_page, Numeric page, String media='photos') { var oToken = getUserOToken( User ); var stParameters = getParams(argumentCollection=arguments); stParameters.method = 'flickr.photosets.getPhotos'; var oReq = getRequest(oToken=oToken,sHttpURL=variables.FlickrAPIEndpoint,stParameters=stParameters); return processRequest( oReq ).photoset; } // http://www.flickr.com/services/api/flickr.photos.search.html public struct function photos_search(Required User, String tags, String tag_mode, string text, String min_upload_date, String max_upload_date, String min_taken_date, String max_taken_date, String license, String sort='date-posted-desc', Numeric privacy_filter, String bbox, Numeric accuracy, Numeric safe_search, Numeric content_type, String machine_tags, String machine_tag_mode, String group_id, String contacts, String woe_id, Numeric per_page, Numeric page) { var oToken = getUserOToken( User ); var stParameters = getParams(argumentCollection=arguments); stParameters.method = 'flickr.photos.search'; stParameters.user_id = User.getFlickr_User_ID(); var oReq = getRequest(oToken=oToken,sHttpURL=variables.FlickrAPIEndpoint,stParameters=stParameters); return processRequest( oReq ).photos; } // super simple wrapper method dumbed down public struct function getPhotos(Required User, String Photoset_ID='', String Tags='') { if(Len(arguments.Photoset_ID)) { return photosets_getPhotos(argumentCollection=arguments); } else { return photos_search( User=User, User_ID=User.getFlickr_User_ID(), Tags=Tags); } } // http://www.flickr.com/services/api/flickr.people.getInfo.html public struct function people_getInfo(Required User) { var oToken = getUserOToken( User ); var stParameters = getParams(argumentCollection=arguments); stParameters.method = 'flickr.people.getInfo'; stParameters.user_id = User.getFlickr_User_ID(); var oReq = getRequest(oToken=oToken,sHttpURL=variables.FlickrAPIEndpoint,stParameters=stParameters); return processRequest( oReq ).person; } // taken from CFLickr public string function getPhotoUrl(Required Struct Photo, String size='') { var format = 'jpg'; var secret = arguments.photo.secret; var farm = arguments.photo.farm; var srvr = arguments.photo.server; var id = structKeyExists(arguments.photo, 'primary') ? arguments.photo.primary : arguments.photo.id; arguments.size = lcase(arguments.size); if( arguments.size EQ 'o' ) { try { format = arguments.photo.originalformat; secret = arguments.photo.originalsecret; } catch(Any e) {} } if(len(arguments.size)) { arguments.size = "_" & arguments.size; } return 'http://farm#farm#.static.flickr.com/#srvr#/#id#_#secret##arguments.size#.#format#'; } // Constructs an oAuth Request and signs it. private any function getRequest(Required oToken, Required String sHttpURL, String sHttpMethod='GET', Struct stParameters={}) { var oReq = CreateObject("component", "model.oauth.oauthrequest").fromConsumerAndToken( oConsumer = variables.oConsumer, oToken = arguments.oToken, stParameters = arguments.stParameters, sHttpMethod = arguments.sHttpMethod, sHttpURL = arguments.sHttpURL); oReq.signRequest(oSignatureMethod = variables.oReqSigMethodSHA, oConsumer = variables.oConsumer, oToken = arguments.oToken); return oReq; } // Sends the HTTP request. private any function callRequest(Required oReq) { // Send a normal GET request if( oReq.getHttpMethod() eq 'GET' ) { var resp = new Http(url=oReq.getString(),method=oReq.getHttpMethod()).send().getPrefix(); } else { // Break apart the params to cfhttpparams, attach them for POST requests. var httpService = new Http(url=oReq.getHttpURL(),method=oReq.getHttpMethod()); var oReqParams = oReq.getParameterKeys(); for( var Param in oReqParams ) { httpService.addParam(type="formfield",name=Param,value=oReq.getParameter(Param)); } var resp = httpService.send().getPrefix(); } return resp; } // Formats a Reponse private any function formatResponse(Required Any Response) { var resp = deserializeJson(Response.fileContent); var fixed = fixJsonResponse(resp); return fixed; } // method taken from CFLickr to format reponses from Flickr private any function fixJsonResponse(Required Struct data) { var i = 0; if(isStruct(data) AND structKeyList(data) IS "_content") { return data._content; } for(i in data) { if(isStruct(data[i])) { data[i] = fixJsonResponse(data[i]); } else if(isArray(data[i])) { for(var j=1; j<=arraylen(data[i]); j++) { data[i][j] = fixJsonResponse(data[i][j]); } } else if(i IS "_content" AND isSimpleValue(data[i])) { data["value"] = data[i]; structDelete(data, "_content"); } } return data; } // Generic method to call a request and format it by default private any function processRequest(Required oReq,Boolean Format=true) { var RequestResponse = callRequest( oReq ); if( Format ) { RequestResponse = formatResponse(RequestResponse); } return RequestResponse; } // Returns default parameters and constructs additional ones private struct function getParams() { var params = { api_key = variables.sConsumerKey, format='json', nojsoncallback=1 }; for(var key in arguments) { if( !IsNull(arguments[key]) && key neq 'User') { params[key] = arguments[key]; } }; return params; } // http://www.cflib.org/udf/StructToQueryString private struct function queryStringToStruct(Required String QueryString) { //var to hold the final structure var struct = StructNew(); //vars for use in the loop, so we don't have to evaluate lists and arrays more than once var i = 1; var pairi = ""; var keyi = ""; var valuei = ""; var qsarray = ""; var qs = arguments.QueryString;// default querystring value //put the query string into an array for easier looping qsarray = listToArray(qs, "&"); //now, loop over the array and build the struct for(i = 1; i lte arrayLen(qsarray); i = i + 1) { pairi = qsarray[i];// current pair keyi = listFirst(pairi, "=");// current key valuei = urlDecode(listLast(pairi, "="));// current value // check if key already added to struct if(structKeyExists(struct, keyi)) { struct[keyi] = listAppend(struct[keyi], valuei);// add value to list } else { structInsert(struct, keyi, valuei);// add new key/value pair } } // return the struct return struct; } }