From da1c73d33fd80038350419e5694f2eaf82c5006e Mon Sep 17 00:00:00 2001 From: Eldad Fux Date: Sat, 11 Apr 2020 13:02:21 +0300 Subject: [PATCH] Updated SDKs --- .../examples/account/create-o-auth2session.md | 8 +- app/sdks/console-javascript/src/sdk.js | 44 +---- app/sdks/console-javascript/src/sdk.min.js | 9 +- .../.dart_tool/package_config.json | 2 +- app/sdks/flutter-dart/.packages | 2 +- .../examples/account/create-o-auth2session.md | 2 - .../doc/examples/storage/create-file.md | 2 +- .../doc/examples/storage/get-file-download.md | 9 +- .../doc/examples/storage/get-file-preview.md | 9 +- .../doc/examples/storage/get-file-view.md | 9 +- app/sdks/flutter-dart/lib/client.dart | 4 + .../flutter-dart/lib/services/account.dart | 178 ++++++++++++++++-- .../flutter-dart/lib/services/avatars.dart | 60 +++++- .../flutter-dart/lib/services/database.dart | 48 ++++- .../flutter-dart/lib/services/locale.dart | 60 +++++- .../flutter-dart/lib/services/storage.dart | 100 ++++++---- app/sdks/flutter-dart/lib/services/teams.dart | 90 ++++++++- .../examples/account/create-o-auth2session.md | 8 +- app/sdks/web-javascript/src/sdk.js | 44 +---- app/sdks/web-javascript/src/sdk.min.js | 9 +- composer.lock | 12 +- 21 files changed, 500 insertions(+), 209 deletions(-) diff --git a/app/sdks/console-javascript/docs/examples/account/create-o-auth2session.md b/app/sdks/console-javascript/docs/examples/account/create-o-auth2session.md index f4577b551f..b66e4360c6 100644 --- a/app/sdks/console-javascript/docs/examples/account/create-o-auth2session.md +++ b/app/sdks/console-javascript/docs/examples/account/create-o-auth2session.md @@ -5,6 +5,10 @@ sdk .setKey('919c2d18fb5d4...a2ae413da83346ad2') // Your secret API key ; -let result = sdk.account.createOAuth2Session('bitbucket', 'https://example.com', 'https://example.com'); +let promise = sdk.account.createOAuth2Session('bitbucket'); -console.log(result); // Resource URL +promise.then(function (response) { + console.log(response); // Success +}, function (error) { + console.log(error); // Failure +}); \ No newline at end of file diff --git a/app/sdks/console-javascript/src/sdk.js b/app/sdks/console-javascript/src/sdk.js index f707b7f779..e037406e41 100644 --- a/app/sdks/console-javascript/src/sdk.js +++ b/app/sdks/console-javascript/src/sdk.js @@ -286,28 +286,6 @@ } }(window.document); - let iframe = function(method, url, params) { - let form = document.createElement('form'); - - form.setAttribute('method', method); - form.setAttribute('action', config.endpoint + url); - - for(let key in params) { - if(params.hasOwnProperty(key)) { - let hiddenField = document.createElement("input"); - hiddenField.setAttribute("type", "hidden"); - hiddenField.setAttribute("name", key); - hiddenField.setAttribute("value", params[key]); - - form.appendChild(hiddenField); - } - } - - document.body.appendChild(form); - - return form.submit(); - }; - let account = { /** @@ -768,21 +746,13 @@ * @param {string} success * @param {string} failure * @throws {Error} - * @return {string} + * @return {Promise} */ - createOAuth2Session: function(provider, success, failure) { + createOAuth2Session: function(provider, success = 'https://localhost:2444/auth/oauth2/success', failure = 'https://localhost:2444/auth/oauth2/failure') { if(provider === undefined) { throw new Error('Missing required parameter: "provider"'); } - if(success === undefined) { - throw new Error('Missing required parameter: "success"'); - } - - if(failure === undefined) { - throw new Error('Missing required parameter: "failure"'); - } - let path = '/account/sessions/oauth2/{provider}'.replace(new RegExp('{provider}', 'g'), provider); let payload = {}; @@ -800,8 +770,8 @@ payload['key'] = config.key; let query = Object.keys(payload).map(key => key + '=' + encodeURIComponent(payload[key])).join('&'); - - return config.endpoint + path + ((query) ? '?' + query : ''); + + window.location = config.endpoint + path + ((query) ? '?' + query : ''); }, /** @@ -3231,7 +3201,7 @@ payload['key'] = config.key; let query = Object.keys(payload).map(key => key + '=' + encodeURIComponent(payload[key])).join('&'); - + return config.endpoint + path + ((query) ? '?' + query : ''); }, @@ -3286,7 +3256,7 @@ payload['key'] = config.key; let query = Object.keys(payload).map(key => key + '=' + encodeURIComponent(payload[key])).join('&'); - + return config.endpoint + path + ((query) ? '?' + query : ''); }, @@ -3319,7 +3289,7 @@ payload['key'] = config.key; let query = Object.keys(payload).map(key => key + '=' + encodeURIComponent(payload[key])).join('&'); - + return config.endpoint + path + ((query) ? '?' + query : ''); } }; diff --git a/app/sdks/console-javascript/src/sdk.min.js b/app/sdks/console-javascript/src/sdk.min.js index ee58ad1ee3..d24b9d9fe1 100644 --- a/app/sdks/console-javascript/src/sdk.min.js +++ b/app/sdks/console-javascript/src/sdk.min.js @@ -12,8 +12,7 @@ request.setRequestHeader(key,headers[key])}} request.onload=function(){if(4===request.readyState&&399>=request.status){let data=request.response;let contentType=this.getResponseHeader('content-type')||'';contentType=contentType.substring(0,contentType.indexOf(';'));switch(contentType){case 'application/json':data=JSON.parse(data);break} let cookieFallback=this.getResponseHeader('X-Fallback-Cookies')||'';if(window.localStorage&&cookieFallback){window.console.warn('Appwrite is using localStorage for session management. Increase your security by adding a custom domain as your API endpoint.');window.localStorage.setItem('cookieFallback',cookieFallback)} resolve(data)}else{reject(new Error(request.statusText))}};if(progress){request.addEventListener('progress',progress);request.upload.addEventListener('progress',progress,!1)} -request.onerror=function(){reject(new Error("Network Error"))};request.send(params)})};return{'get':function(path,headers={},params={}){return call('GET',path+((Object.keys(params).length>0)?'?'+buildQuery(params):''),headers,{})},'post':function(path,headers={},params={},progress=null){return call('POST',path,headers,params,progress)},'put':function(path,headers={},params={},progress=null){return call('PUT',path,headers,params,progress)},'patch':function(path,headers={},params={},progress=null){return call('PATCH',path,headers,params,progress)},'delete':function(path,headers={},params={},progress=null){return call('DELETE',path,headers,params,progress)},'addGlobalParam':addGlobalParam,'addGlobalHeader':addGlobalHeader}}(window.document);let iframe=function(method,url,params){let form=document.createElement('form');form.setAttribute('method',method);form.setAttribute('action',config.endpoint+url);for(let key in params){if(params.hasOwnProperty(key)){let hiddenField=document.createElement("input");hiddenField.setAttribute("type","hidden");hiddenField.setAttribute("name",key);hiddenField.setAttribute("value",params[key]);form.appendChild(hiddenField)}} -document.body.appendChild(form);return form.submit()};let account={get:function(){let path='/account';let payload={};return http.get(path,{'content-type':'application/json',},payload)},create:function(email,password,name=''){if(email===undefined){throw new Error('Missing required parameter: "email"')} +request.onerror=function(){reject(new Error("Network Error"))};request.send(params)})};return{'get':function(path,headers={},params={}){return call('GET',path+((Object.keys(params).length>0)?'?'+buildQuery(params):''),headers,{})},'post':function(path,headers={},params={},progress=null){return call('POST',path,headers,params,progress)},'put':function(path,headers={},params={},progress=null){return call('PUT',path,headers,params,progress)},'patch':function(path,headers={},params={},progress=null){return call('PATCH',path,headers,params,progress)},'delete':function(path,headers={},params={},progress=null){return call('DELETE',path,headers,params,progress)},'addGlobalParam':addGlobalParam,'addGlobalHeader':addGlobalHeader}}(window.document);let account={get:function(){let path='/account';let payload={};return http.get(path,{'content-type':'application/json',},payload)},create:function(email,password,name=''){if(email===undefined){throw new Error('Missing required parameter: "email"')} if(password===undefined){throw new Error('Missing required parameter: "password"')} let path='/account';let payload={};if(email){payload.email=email} if(password){payload.password=password} @@ -46,12 +45,10 @@ return http.put(path,{'content-type':'application/json',},payload)},getSessions: if(password===undefined){throw new Error('Missing required parameter: "password"')} let path='/account/sessions';let payload={};if(email){payload.email=email} if(password){payload.password=password} -return http.post(path,{'content-type':'application/json',},payload)},deleteSessions:function(){let path='/account/sessions';let payload={};return http.delete(path,{'content-type':'application/json',},payload)},createOAuth2Session:function(provider,success,failure){if(provider===undefined){throw new Error('Missing required parameter: "provider"')} -if(success===undefined){throw new Error('Missing required parameter: "success"')} -if(failure===undefined){throw new Error('Missing required parameter: "failure"')} +return http.post(path,{'content-type':'application/json',},payload)},deleteSessions:function(){let path='/account/sessions';let payload={};return http.delete(path,{'content-type':'application/json',},payload)},createOAuth2Session:function(provider,success='https://localhost:2444/auth/oauth2/success',failure='https://localhost:2444/auth/oauth2/failure'){if(provider===undefined){throw new Error('Missing required parameter: "provider"')} let path='/account/sessions/oauth2/{provider}'.replace(new RegExp('{provider}','g'),provider);let payload={};if(success){payload.success=success} if(failure){payload.failure=failure} -payload.project=config.project;payload.key=config.key;let query=Object.keys(payload).map(key=>key+'='+encodeURIComponent(payload[key])).join('&');return config.endpoint+path+((query)?'?'+query:'')},deleteSession:function(sessionId){if(sessionId===undefined){throw new Error('Missing required parameter: "sessionId"')} +payload.project=config.project;payload.key=config.key;let query=Object.keys(payload).map(key=>key+'='+encodeURIComponent(payload[key])).join('&');window.location=config.endpoint+path+((query)?'?'+query:'')},deleteSession:function(sessionId){if(sessionId===undefined){throw new Error('Missing required parameter: "sessionId"')} let path='/account/sessions/{sessionId}'.replace(new RegExp('{sessionId}','g'),sessionId);let payload={};return http.delete(path,{'content-type':'application/json',},payload)},createVerification:function(url){if(url===undefined){throw new Error('Missing required parameter: "url"')} let path='/account/verification';let payload={};if(url){payload.url=url} return http.post(path,{'content-type':'application/json',},payload)},updateVerification:function(userId,secret){if(userId===undefined){throw new Error('Missing required parameter: "userId"')} diff --git a/app/sdks/flutter-dart/.dart_tool/package_config.json b/app/sdks/flutter-dart/.dart_tool/package_config.json index dd31636666..89964f528b 100644 --- a/app/sdks/flutter-dart/.dart_tool/package_config.json +++ b/app/sdks/flutter-dart/.dart_tool/package_config.json @@ -242,7 +242,7 @@ "languageVersion": "2.6" } ], - "generated": "2020-04-10T08:34:20.591152Z", + "generated": "2020-04-11T09:32:46.431074Z", "generator": "pub", "generatorVersion": "2.7.2" } diff --git a/app/sdks/flutter-dart/.packages b/app/sdks/flutter-dart/.packages index 0277c387b3..b747ae5d6b 100644 --- a/app/sdks/flutter-dart/.packages +++ b/app/sdks/flutter-dart/.packages @@ -1,4 +1,4 @@ -# Generated by pub on 2020-04-10 11:34:20.573255. +# Generated by pub on 2020-04-11 12:32:46.410814. archive:file:///Users/eldadfux/.pub-cache/hosted/pub.dartlang.org/archive-2.0.11/lib/ args:file:///Users/eldadfux/.pub-cache/hosted/pub.dartlang.org/args-1.5.2/lib/ async:file:///Users/eldadfux/.pub-cache/hosted/pub.dartlang.org/async-2.4.0/lib/ diff --git a/app/sdks/flutter-dart/doc/examples/account/create-o-auth2session.md b/app/sdks/flutter-dart/doc/examples/account/create-o-auth2session.md index 83da4ddc07..2745fc48bd 100644 --- a/app/sdks/flutter-dart/doc/examples/account/create-o-auth2session.md +++ b/app/sdks/flutter-dart/doc/examples/account/create-o-auth2session.md @@ -10,8 +10,6 @@ client Future result = account.createOAuth2Session( provider: 'bitbucket', - success: 'https://example.com', - failure: 'https://example.com', ); result diff --git a/app/sdks/flutter-dart/doc/examples/storage/create-file.md b/app/sdks/flutter-dart/doc/examples/storage/create-file.md index 5fbdff2387..bc78bd1e71 100644 --- a/app/sdks/flutter-dart/doc/examples/storage/create-file.md +++ b/app/sdks/flutter-dart/doc/examples/storage/create-file.md @@ -10,7 +10,7 @@ client ; Future result = storage.createFile( - file: null, + file: new File('./image.jpg'), read: [], write: [], ); diff --git a/app/sdks/flutter-dart/doc/examples/storage/get-file-download.md b/app/sdks/flutter-dart/doc/examples/storage/get-file-download.md index 77b78a757b..e00cdc9022 100644 --- a/app/sdks/flutter-dart/doc/examples/storage/get-file-download.md +++ b/app/sdks/flutter-dart/doc/examples/storage/get-file-download.md @@ -8,13 +8,8 @@ client .setProject('5df5acd0d48c2') // Your project ID ; -Future result = storage.getFileDownload( +String result = storage.getFileDownload( fileId: '[FILE_ID]', ); -result - .then((response) { - print(response); - }).catchError((error) { - print(error); - }); \ No newline at end of file +print(result); // Resource URL string diff --git a/app/sdks/flutter-dart/doc/examples/storage/get-file-preview.md b/app/sdks/flutter-dart/doc/examples/storage/get-file-preview.md index 85e24d7d9a..5297ab8342 100644 --- a/app/sdks/flutter-dart/doc/examples/storage/get-file-preview.md +++ b/app/sdks/flutter-dart/doc/examples/storage/get-file-preview.md @@ -8,13 +8,8 @@ client .setProject('5df5acd0d48c2') // Your project ID ; -Future result = storage.getFilePreview( +String result = storage.getFilePreview( fileId: '[FILE_ID]', ); -result - .then((response) { - print(response); - }).catchError((error) { - print(error); - }); \ No newline at end of file +print(result); // Resource URL string diff --git a/app/sdks/flutter-dart/doc/examples/storage/get-file-view.md b/app/sdks/flutter-dart/doc/examples/storage/get-file-view.md index 985b73839d..13b1de4822 100644 --- a/app/sdks/flutter-dart/doc/examples/storage/get-file-view.md +++ b/app/sdks/flutter-dart/doc/examples/storage/get-file-view.md @@ -8,13 +8,8 @@ client .setProject('5df5acd0d48c2') // Your project ID ; -Future result = storage.getFileView( +String result = storage.getFileView( fileId: '[FILE_ID]', ); -result - .then((response) { - print(response); - }).catchError((error) { - print(error); - }); \ No newline at end of file +print(result); // Resource URL string diff --git a/app/sdks/flutter-dart/lib/client.dart b/app/sdks/flutter-dart/lib/client.dart index ce09936018..cf89da7267 100644 --- a/app/sdks/flutter-dart/lib/client.dart +++ b/app/sdks/flutter-dart/lib/client.dart @@ -120,6 +120,10 @@ class Client { method: method.name(), ); + if(headers['content-type'] == 'multipart/form-data') { + FormData data = FormData.fromMap(params); + } + if (method == HttpMethod.get) { return http.get(path, queryParameters: params, options: options); } else { diff --git a/app/sdks/flutter-dart/lib/services/account.dart b/app/sdks/flutter-dart/lib/services/account.dart index 68d0229e64..ea87290a8e 100644 --- a/app/sdks/flutter-dart/lib/services/account.dart +++ b/app/sdks/flutter-dart/lib/services/account.dart @@ -12,21 +12,32 @@ import "../service.dart"; class Account extends Service { Account(Client client): super(client); + /// Get Account + /// /// Get currently logged in user data as JSON object. + /// Future get() { final String path = '/account'; final Map params = { }; - return client.call(HttpMethod.get, path: path, params: params); + final Map headers = { + 'content-type': 'application/json', + }; + + return client.call(HttpMethod.get, path: path, params: params, headers: headers); } + + /// Create Account + /// /// Use this endpoint to allow a new user to register a new account in your /// project. After the user registration completes successfully, you can use /// the [/account/verfication](/docs/account#createVerification) route to start /// verifying the user email address. To allow your new user to login to his /// new account, you need to create a new [account /// session](/docs/account#createSession). + /// Future create({@required String email, @required String password, String name = ''}) { final String path = '/account'; @@ -36,25 +47,41 @@ class Account extends Service { 'name': name, }; - return client.call(HttpMethod.post, path: path, params: params); + final Map headers = { + 'content-type': 'application/json', + }; + + return client.call(HttpMethod.post, path: path, params: params, headers: headers); } + + /// Delete Account + /// /// Delete a currently logged in user account. Behind the scene, the user /// record is not deleted but permanently blocked from any access. This is done /// to avoid deleted accounts being overtaken by new users with the same email /// address. Any user-related resources like documents or storage files should /// be deleted separately. + /// Future delete() { final String path = '/account'; final Map params = { }; - return client.call(HttpMethod.delete, path: path, params: params); + final Map headers = { + 'content-type': 'application/json', + }; + + return client.call(HttpMethod.delete, path: path, params: params, headers: headers); } + + /// Update Account Email + /// /// Update currently logged in user account email address. After changing user /// address, user confirmation status is being reset and a new confirmation /// mail is sent. For security measures, user password is required to complete /// this request. + /// Future updateEmail({@required String email, @required String password}) { final String path = '/account/email'; @@ -63,19 +90,35 @@ class Account extends Service { 'password': password, }; - return client.call(HttpMethod.patch, path: path, params: params); + final Map headers = { + 'content-type': 'application/json', + }; + + return client.call(HttpMethod.patch, path: path, params: params, headers: headers); } + + /// Get Account Logs + /// /// Get currently logged in user list of latest security activity logs. Each /// log returns user IP address, location and date and time of log. + /// Future getLogs() { final String path = '/account/logs'; final Map params = { }; - return client.call(HttpMethod.get, path: path, params: params); + final Map headers = { + 'content-type': 'application/json', + }; + + return client.call(HttpMethod.get, path: path, params: params, headers: headers); } + + /// Update Account Name + /// /// Update currently logged in user account name. + /// Future updateName({@required String name}) { final String path = '/account/name'; @@ -83,10 +126,18 @@ class Account extends Service { 'name': name, }; - return client.call(HttpMethod.patch, path: path, params: params); + final Map headers = { + 'content-type': 'application/json', + }; + + return client.call(HttpMethod.patch, path: path, params: params, headers: headers); } + + /// Update Account Password + /// /// Update currently logged in user password. For validation, user is required /// to pass the password twice. + /// Future updatePassword({@required String password, @required String oldPassword}) { final String path = '/account/password'; @@ -95,19 +146,35 @@ class Account extends Service { 'old-password': oldPassword, }; - return client.call(HttpMethod.patch, path: path, params: params); + final Map headers = { + 'content-type': 'application/json', + }; + + return client.call(HttpMethod.patch, path: path, params: params, headers: headers); } + + /// Get Account Preferences + /// /// Get currently logged in user preferences as a key-value object. + /// Future getPrefs() { final String path = '/account/prefs'; final Map params = { }; - return client.call(HttpMethod.get, path: path, params: params); + final Map headers = { + 'content-type': 'application/json', + }; + + return client.call(HttpMethod.get, path: path, params: params, headers: headers); } + + /// Update Account Preferences + /// /// Update currently logged in user account preferences. You can pass only the /// specific settings you wish to update. + /// Future updatePrefs({@required dynamic prefs}) { final String path = '/account/prefs'; @@ -115,14 +182,22 @@ class Account extends Service { 'prefs': prefs, }; - return client.call(HttpMethod.patch, path: path, params: params); + final Map headers = { + 'content-type': 'application/json', + }; + + return client.call(HttpMethod.patch, path: path, params: params, headers: headers); } + + /// Create Password Recovery + /// /// Sends the user an email with a temporary secret key for password reset. /// When the user clicks the confirmation link he is redirected back to your /// app password reset URL with the secret key and email address values /// attached to the URL query string. Use the query string params to submit a /// request to the [PUT /account/recovery](/docs/account#updateRecovery) /// endpoint to complete the process. + /// Future createRecovery({@required String email, @required String url}) { final String path = '/account/recovery'; @@ -131,8 +206,15 @@ class Account extends Service { 'url': url, }; - return client.call(HttpMethod.post, path: path, params: params); + final Map headers = { + 'content-type': 'application/json', + }; + + return client.call(HttpMethod.post, path: path, params: params, headers: headers); } + + /// Complete Password Recovery + /// /// Use this endpoint to complete the user account password reset. Both the /// **userId** and **secret** arguments will be passed as query parameters to /// the redirect URL you have provided when sending your request to the [POST @@ -142,6 +224,7 @@ class Account extends Service { /// Attack](https://github.com/OWASP/CheatSheetSeries/blob/master/cheatsheets/Unvalidated_Redirects_and_Forwards_Cheat_Sheet.md) /// the only valid redirect URLs are the ones from domains you have set when /// adding your platforms in the console interface. + /// Future updateRecovery({@required String userId, @required String secret, @required String passwordA, @required String passwordB}) { final String path = '/account/recovery'; @@ -152,20 +235,36 @@ class Account extends Service { 'password-b': passwordB, }; - return client.call(HttpMethod.put, path: path, params: params); + final Map headers = { + 'content-type': 'application/json', + }; + + return client.call(HttpMethod.put, path: path, params: params, headers: headers); } + + /// Get Account Sessions + /// /// Get currently logged in user list of active sessions across different /// devices. + /// Future getSessions() { final String path = '/account/sessions'; final Map params = { }; - return client.call(HttpMethod.get, path: path, params: params); + final Map headers = { + 'content-type': 'application/json', + }; + + return client.call(HttpMethod.get, path: path, params: params, headers: headers); } + + /// Create Account Session + /// /// Allow the user to login into his account by providing a valid email and /// password combination. This route will create a new session for the user. + /// Future createSession({@required String email, @required String password}) { final String path = '/account/sessions'; @@ -174,23 +273,39 @@ class Account extends Service { 'password': password, }; - return client.call(HttpMethod.post, path: path, params: params); + final Map headers = { + 'content-type': 'application/json', + }; + + return client.call(HttpMethod.post, path: path, params: params, headers: headers); } + + /// Delete All Account Sessions + /// /// Delete all sessions from the user account and remove any sessions cookies /// from the end client. + /// Future deleteSessions() { final String path = '/account/sessions'; final Map params = { }; - return client.call(HttpMethod.delete, path: path, params: params); + final Map headers = { + 'content-type': 'application/json', + }; + + return client.call(HttpMethod.delete, path: path, params: params, headers: headers); } + + /// Create Account Session with OAuth2 + /// /// Allow the user to login to his account using the OAuth2 provider of his /// choice. Each OAuth2 provider should be enabled from the Appwrite console /// first. Use the success and failure arguments to provide a redirect URL's /// back to your app when login is completed. - Future createOAuth2Session({@required String provider, @required String success, @required String failure}) { + /// + Future createOAuth2Session({@required String provider, String success = 'https://localhost:2444/auth/oauth2/success', String failure = 'https://localhost:2444/auth/oauth2/failure'}) { final String path = '/account/sessions/oauth2/{provider}'.replaceAll(RegExp('{provider}'), provider); final Map params = { @@ -214,20 +329,30 @@ class Account extends Service { Uri url = Uri.parse(value); List cookies = [new Cookie(url.queryParameters['key'], url.queryParameters['secret'])]; client.cookieJar.saveFromResponse(Uri.parse(client.endPoint), cookies); - }).catchError((error) { - }); + }); } + + /// Delete Account Session + /// /// Use this endpoint to log out the currently logged in user from all his /// account sessions across all his different devices. When using the option id /// argument, only the session unique ID provider will be deleted. + /// Future deleteSession({@required String sessionId}) { final String path = '/account/sessions/{sessionId}'.replaceAll(RegExp('{sessionId}'), sessionId); final Map params = { }; - return client.call(HttpMethod.delete, path: path, params: params); + final Map headers = { + 'content-type': 'application/json', + }; + + return client.call(HttpMethod.delete, path: path, params: params, headers: headers); } + + /// Create Email Verification + /// /// Use this endpoint to send a verification message to your user email address /// to confirm they are the valid owners of that address. Both the **userId** /// and **secret** arguments will be passed as query parameters to the URL you @@ -241,6 +366,7 @@ class Account extends Service { /// Attack](https://github.com/OWASP/CheatSheetSeries/blob/master/cheatsheets/Unvalidated_Redirects_and_Forwards_Cheat_Sheet.md) /// the only valid redirect URLs are the ones from domains you have set when /// adding your platforms in the console interface. + /// Future createVerification({@required String url}) { final String path = '/account/verification'; @@ -248,12 +374,20 @@ class Account extends Service { 'url': url, }; - return client.call(HttpMethod.post, path: path, params: params); + final Map headers = { + 'content-type': 'application/json', + }; + + return client.call(HttpMethod.post, path: path, params: params, headers: headers); } + + /// Complete Email Verification + /// /// Use this endpoint to complete the user email verification process. Use both /// the **userId** and **secret** parameters that were attached to your app URL /// to verify the user email ownership. If confirmed this route will return a /// 200 status code. + /// Future updateVerification({@required String userId, @required String secret}) { final String path = '/account/verification'; @@ -262,6 +396,10 @@ class Account extends Service { 'secret': secret, }; - return client.call(HttpMethod.put, path: path, params: params); + final Map headers = { + 'content-type': 'application/json', + }; + + return client.call(HttpMethod.put, path: path, params: params, headers: headers); } } \ No newline at end of file diff --git a/app/sdks/flutter-dart/lib/services/avatars.dart b/app/sdks/flutter-dart/lib/services/avatars.dart index 70b2b959bb..90439b7ece 100644 --- a/app/sdks/flutter-dart/lib/services/avatars.dart +++ b/app/sdks/flutter-dart/lib/services/avatars.dart @@ -3,7 +3,6 @@ import 'dart:io'; import 'package:dio/dio.dart'; import 'package:meta/meta.dart'; -import 'package:flutter_web_auth/flutter_web_auth.dart'; import "../client.dart"; import '../enums.dart'; @@ -12,10 +11,13 @@ import "../service.dart"; class Avatars extends Service { Avatars(Client client): super(client); + /// Get Browser Icon + /// /// You can use this endpoint to show different browser icons to your users. /// The code argument receives the browser code as it appears in your user /// /account/sessions endpoint. Use width, height and quality arguments to /// change the output settings. + /// Future getBrowser({@required String code, int width = 100, int height = 100, int quality = 100}) { final String path = '/avatars/browsers/{code}'.replaceAll(RegExp('{code}'), code); @@ -25,12 +27,20 @@ class Avatars extends Service { 'quality': quality, }; - return client.call(HttpMethod.get, path: path, params: params); + final Map headers = { + 'content-type': 'application/json', + }; + + return client.call(HttpMethod.get, path: path, params: params, headers: headers); } + + /// Get Credit Card Icon + /// /// Need to display your users with your billing method or their payment /// methods? The credit card endpoint will return you the icon of the credit /// card provider you need. Use width, height and quality arguments to change /// the output settings. + /// Future getCreditCard({@required String code, int width = 100, int height = 100, int quality = 100}) { final String path = '/avatars/credit-cards/{code}'.replaceAll(RegExp('{code}'), code); @@ -40,10 +50,18 @@ class Avatars extends Service { 'quality': quality, }; - return client.call(HttpMethod.get, path: path, params: params); + final Map headers = { + 'content-type': 'application/json', + }; + + return client.call(HttpMethod.get, path: path, params: params, headers: headers); } + + /// Get Favicon + /// /// Use this endpoint to fetch the favorite icon (AKA favicon) of a any remote /// website URL. + /// Future getFavicon({@required String url}) { final String path = '/avatars/favicon'; @@ -51,11 +69,19 @@ class Avatars extends Service { 'url': url, }; - return client.call(HttpMethod.get, path: path, params: params); + final Map headers = { + 'content-type': 'application/json', + }; + + return client.call(HttpMethod.get, path: path, params: params, headers: headers); } + + /// Get Country Flag + /// /// You can use this endpoint to show different country flags icons to your /// users. The code argument receives the 2 letter country code. Use width, /// height and quality arguments to change the output settings. + /// Future getFlag({@required String code, int width = 100, int height = 100, int quality = 100}) { final String path = '/avatars/flags/{code}'.replaceAll(RegExp('{code}'), code); @@ -65,12 +91,20 @@ class Avatars extends Service { 'quality': quality, }; - return client.call(HttpMethod.get, path: path, params: params); + final Map headers = { + 'content-type': 'application/json', + }; + + return client.call(HttpMethod.get, path: path, params: params, headers: headers); } + + /// Get Image from URL + /// /// Use this endpoint to fetch a remote image URL and crop it to any image size /// you want. This endpoint is very useful if you need to crop and display /// remote images in your app or in case you want to make sure a 3rd party /// image is properly served using a TLS protocol. + /// Future getImage({@required String url, int width = 400, int height = 400}) { final String path = '/avatars/image'; @@ -80,10 +114,18 @@ class Avatars extends Service { 'height': height, }; - return client.call(HttpMethod.get, path: path, params: params); + final Map headers = { + 'content-type': 'application/json', + }; + + return client.call(HttpMethod.get, path: path, params: params, headers: headers); } + + /// Get QR Code + /// /// Converts a given plain text to a QR code image. You can use the query /// parameters to change the size and style of the resulting image. + /// Future getQR({@required String text, int size = 400, int margin = 1, int download = 0}) { final String path = '/avatars/qr'; @@ -94,6 +136,10 @@ class Avatars extends Service { 'download': download, }; - return client.call(HttpMethod.get, path: path, params: params); + final Map headers = { + 'content-type': 'application/json', + }; + + return client.call(HttpMethod.get, path: path, params: params, headers: headers); } } \ No newline at end of file diff --git a/app/sdks/flutter-dart/lib/services/database.dart b/app/sdks/flutter-dart/lib/services/database.dart index 1e72c19c25..59a4e6d089 100644 --- a/app/sdks/flutter-dart/lib/services/database.dart +++ b/app/sdks/flutter-dart/lib/services/database.dart @@ -3,7 +3,6 @@ import 'dart:io'; import 'package:dio/dio.dart'; import 'package:meta/meta.dart'; -import 'package:flutter_web_auth/flutter_web_auth.dart'; import "../client.dart"; import '../enums.dart'; @@ -12,10 +11,13 @@ import "../service.dart"; class Database extends Service { Database(Client client): super(client); + /// List Documents + /// /// Get a list of all the user documents. You can use the query params to /// filter your results. On admin mode, this endpoint will return a list of all /// of the project documents. [Learn more about different API /// modes](/docs/admin). + /// Future listDocuments({@required String collectionId, List filters = const [], int offset = 0, int limit = 50, String orderField = '\$id', String orderType = 'ASC', String orderCast = 'string', String search = '', int first = 0, int last = 0}) { final String path = '/database/collections/{collectionId}/documents'.replaceAll(RegExp('{collectionId}'), collectionId); @@ -31,9 +33,17 @@ class Database extends Service { 'last': last, }; - return client.call(HttpMethod.get, path: path, params: params); + final Map headers = { + 'content-type': 'application/json', + }; + + return client.call(HttpMethod.get, path: path, params: params, headers: headers); } + + /// Create Document + /// /// Create a new Document. + /// Future createDocument({@required String collectionId, @required dynamic data, @required List read, @required List write, String parentDocument = '', String parentProperty = '', String parentPropertyType = 'assign'}) { final String path = '/database/collections/{collectionId}/documents'.replaceAll(RegExp('{collectionId}'), collectionId); @@ -46,18 +56,32 @@ class Database extends Service { 'parentPropertyType': parentPropertyType, }; - return client.call(HttpMethod.post, path: path, params: params); + final Map headers = { + 'content-type': 'application/json', + }; + + return client.call(HttpMethod.post, path: path, params: params, headers: headers); } + + /// Get Document + /// /// Get document by its unique ID. This endpoint response returns a JSON object /// with the document data. + /// Future getDocument({@required String collectionId, @required String documentId}) { final String path = '/database/collections/{collectionId}/documents/{documentId}'.replaceAll(RegExp('{collectionId}'), collectionId).replaceAll(RegExp('{documentId}'), documentId); final Map params = { }; - return client.call(HttpMethod.get, path: path, params: params); + final Map headers = { + 'content-type': 'application/json', + }; + + return client.call(HttpMethod.get, path: path, params: params, headers: headers); } + + /// Update Document Future updateDocument({@required String collectionId, @required String documentId, @required dynamic data, @required List read, @required List write}) { final String path = '/database/collections/{collectionId}/documents/{documentId}'.replaceAll(RegExp('{collectionId}'), collectionId).replaceAll(RegExp('{documentId}'), documentId); @@ -67,17 +91,29 @@ class Database extends Service { 'write': write, }; - return client.call(HttpMethod.patch, path: path, params: params); + final Map headers = { + 'content-type': 'application/json', + }; + + return client.call(HttpMethod.patch, path: path, params: params, headers: headers); } + + /// Delete Document + /// /// Delete document by its unique ID. This endpoint deletes only the parent /// documents, his attributes and relations to other documents. Child documents /// **will not** be deleted. + /// Future deleteDocument({@required String collectionId, @required String documentId}) { final String path = '/database/collections/{collectionId}/documents/{documentId}'.replaceAll(RegExp('{collectionId}'), collectionId).replaceAll(RegExp('{documentId}'), documentId); final Map params = { }; - return client.call(HttpMethod.delete, path: path, params: params); + final Map headers = { + 'content-type': 'application/json', + }; + + return client.call(HttpMethod.delete, path: path, params: params, headers: headers); } } \ No newline at end of file diff --git a/app/sdks/flutter-dart/lib/services/locale.dart b/app/sdks/flutter-dart/lib/services/locale.dart index e8b7b51116..e61ee2bc75 100644 --- a/app/sdks/flutter-dart/lib/services/locale.dart +++ b/app/sdks/flutter-dart/lib/services/locale.dart @@ -3,7 +3,6 @@ import 'dart:io'; import 'package:dio/dio.dart'; import 'package:meta/meta.dart'; -import 'package:flutter_web_auth/flutter_web_auth.dart'; import "../client.dart"; import '../enums.dart'; @@ -12,69 +11,116 @@ import "../service.dart"; class Locale extends Service { Locale(Client client): super(client); + /// Get User Locale + /// /// Get the current user location based on IP. Returns an object with user /// country code, country name, continent name, continent code, ip address and /// suggested currency. You can use the locale header to get the data in a /// supported language. /// /// ([IP Geolocation by DB-IP](https://db-ip.com)) + /// Future get() { final String path = '/locale'; final Map params = { }; - return client.call(HttpMethod.get, path: path, params: params); + final Map headers = { + 'content-type': 'application/json', + }; + + return client.call(HttpMethod.get, path: path, params: params, headers: headers); } + + /// List Countries + /// /// List of all continents. You can use the locale header to get the data in a /// supported language. + /// Future getContinents() { final String path = '/locale/continents'; final Map params = { }; - return client.call(HttpMethod.get, path: path, params: params); + final Map headers = { + 'content-type': 'application/json', + }; + + return client.call(HttpMethod.get, path: path, params: params, headers: headers); } + + /// List Countries + /// /// List of all countries. You can use the locale header to get the data in a /// supported language. + /// Future getCountries() { final String path = '/locale/countries'; final Map params = { }; - return client.call(HttpMethod.get, path: path, params: params); + final Map headers = { + 'content-type': 'application/json', + }; + + return client.call(HttpMethod.get, path: path, params: params, headers: headers); } + + /// List EU Countries + /// /// List of all countries that are currently members of the EU. You can use the /// locale header to get the data in a supported language. + /// Future getCountriesEU() { final String path = '/locale/countries/eu'; final Map params = { }; - return client.call(HttpMethod.get, path: path, params: params); + final Map headers = { + 'content-type': 'application/json', + }; + + return client.call(HttpMethod.get, path: path, params: params, headers: headers); } + + /// List Countries Phone Codes + /// /// List of all countries phone codes. You can use the locale header to get the /// data in a supported language. + /// Future getCountriesPhones() { final String path = '/locale/countries/phones'; final Map params = { }; - return client.call(HttpMethod.get, path: path, params: params); + final Map headers = { + 'content-type': 'application/json', + }; + + return client.call(HttpMethod.get, path: path, params: params, headers: headers); } + + /// List Currencies + /// /// List of all currencies, including currency symol, name, plural, and decimal /// digits for all major and minor currencies. You can use the locale header to /// get the data in a supported language. + /// Future getCurrencies() { final String path = '/locale/currencies'; final Map params = { }; - return client.call(HttpMethod.get, path: path, params: params); + final Map headers = { + 'content-type': 'application/json', + }; + + return client.call(HttpMethod.get, path: path, params: params, headers: headers); } } \ No newline at end of file diff --git a/app/sdks/flutter-dart/lib/services/storage.dart b/app/sdks/flutter-dart/lib/services/storage.dart index dc02fccb3d..1e309a4d4d 100644 --- a/app/sdks/flutter-dart/lib/services/storage.dart +++ b/app/sdks/flutter-dart/lib/services/storage.dart @@ -3,7 +3,6 @@ import 'dart:io'; import 'package:dio/dio.dart'; import 'package:meta/meta.dart'; -import 'package:flutter_web_auth/flutter_web_auth.dart'; import "../client.dart"; import '../enums.dart'; @@ -12,9 +11,12 @@ import "../service.dart"; class Storage extends Service { Storage(Client client): super(client); + /// List Files + /// /// Get a list of all the user files. You can use the query params to filter /// your results. On admin mode, this endpoint will return a list of all of the /// project files. [Learn more about different API modes](/docs/admin). + /// Future listFiles({String search = '', int limit = 25, int offset = 0, OrderType orderType = OrderType.asc}) { final String path = '/storage/files'; @@ -25,12 +27,20 @@ class Storage extends Service { 'orderType': orderType.name(), }; - return client.call(HttpMethod.get, path: path, params: params); + final Map headers = { + 'content-type': 'application/json', + }; + + return client.call(HttpMethod.get, path: path, params: params, headers: headers); } + + /// Create File + /// /// Create a new file. The user who creates the file will automatically be /// assigned to read and write access unless he has passed custom values for /// read and write arguments. - Future createFile({@required file, @required List read, @required List write}) { + /// + Future createFile({@required File file, @required List read, @required List write}) { final String path = '/storage/files'; final Map params = { @@ -39,20 +49,36 @@ class Storage extends Service { 'write': write, }; - return client.call(HttpMethod.post, path: path, params: params); + final Map headers = { + 'content-type': 'multipart/form-data', + }; + + return client.call(HttpMethod.post, path: path, params: params, headers: headers); } + + /// Get File + /// /// Get file by its unique ID. This endpoint response returns a JSON object /// with the file metadata. + /// Future getFile({@required String fileId}) { final String path = '/storage/files/{fileId}'.replaceAll(RegExp('{fileId}'), fileId); final Map params = { }; - return client.call(HttpMethod.get, path: path, params: params); + final Map headers = { + 'content-type': 'application/json', + }; + + return client.call(HttpMethod.get, path: path, params: params, headers: headers); } + + /// Update File + /// /// Update file by its unique ID. Only users with write permissions have access /// to update this resource. + /// Future updateFile({@required String fileId, @required List read, @required List write}) { final String path = '/storage/files/{fileId}'.replaceAll(RegExp('{fileId}'), fileId); @@ -61,22 +87,38 @@ class Storage extends Service { 'write': write, }; - return client.call(HttpMethod.put, path: path, params: params); + final Map headers = { + 'content-type': 'application/json', + }; + + return client.call(HttpMethod.put, path: path, params: params, headers: headers); } + + /// Delete File + /// /// Delete a file by its unique ID. Only users with write permissions have /// access to delete this resource. + /// Future deleteFile({@required String fileId}) { final String path = '/storage/files/{fileId}'.replaceAll(RegExp('{fileId}'), fileId); final Map params = { }; - return client.call(HttpMethod.delete, path: path, params: params); + final Map headers = { + 'content-type': 'application/json', + }; + + return client.call(HttpMethod.delete, path: path, params: params, headers: headers); } + + /// Get File for Download + /// /// Get file content by its unique ID. The endpoint response return with a /// 'Content-Disposition: attachment' header that tells the browser to start /// downloading the file to user downloads directory. - Future getFileDownload({@required String fileId}) { + /// + String getFileDownload({@required String fileId}) { final String path = '/storage/files/{fileId}/download'.replaceAll(RegExp('{fileId}'), fileId); final Map params = { @@ -91,21 +133,17 @@ class Storage extends Service { queryParameters:params, ); - return FlutterWebAuth.authenticate( - url: url.toString(), - callbackUrlScheme: "appwrite-callback" - ).then((value) { - Uri url = Uri.parse(value); - List cookies = [new Cookie(url.queryParameters['key'], url.queryParameters['secret'])]; - client.cookieJar.saveFromResponse(Uri.parse(client.endPoint), cookies); - }).catchError((error) { - }); + return Uri.toString(); } + + /// Get File Preview + /// /// Get a file preview image. Currently, this method supports preview for image /// files (jpg, png, and gif), other supported formats, like pdf, docs, slides, /// and spreadsheets, will return the file icon image. You can also pass query /// string arguments for cutting and resizing your preview image. - Future getFilePreview({@required String fileId, int width = 0, int height = 0, int quality = 100, String background = '', String output = ''}) { + /// + String getFilePreview({@required String fileId, int width = 0, int height = 0, int quality = 100, String background = '', String output = ''}) { final String path = '/storage/files/{fileId}/preview'.replaceAll(RegExp('{fileId}'), fileId); final Map params = { @@ -125,19 +163,15 @@ class Storage extends Service { queryParameters:params, ); - return FlutterWebAuth.authenticate( - url: url.toString(), - callbackUrlScheme: "appwrite-callback" - ).then((value) { - Uri url = Uri.parse(value); - List cookies = [new Cookie(url.queryParameters['key'], url.queryParameters['secret'])]; - client.cookieJar.saveFromResponse(Uri.parse(client.endPoint), cookies); - }).catchError((error) { - }); + return Uri.toString(); } + + /// Get File for View + /// /// Get file content by its unique ID. This endpoint is similar to the download /// method but returns with no 'Content-Disposition: attachment' header. - Future getFileView({@required String fileId, String as = ''}) { + /// + String getFileView({@required String fileId, String as = ''}) { final String path = '/storage/files/{fileId}/view'.replaceAll(RegExp('{fileId}'), fileId); final Map params = { @@ -153,14 +187,6 @@ class Storage extends Service { queryParameters:params, ); - return FlutterWebAuth.authenticate( - url: url.toString(), - callbackUrlScheme: "appwrite-callback" - ).then((value) { - Uri url = Uri.parse(value); - List cookies = [new Cookie(url.queryParameters['key'], url.queryParameters['secret'])]; - client.cookieJar.saveFromResponse(Uri.parse(client.endPoint), cookies); - }).catchError((error) { - }); + return Uri.toString(); } } \ No newline at end of file diff --git a/app/sdks/flutter-dart/lib/services/teams.dart b/app/sdks/flutter-dart/lib/services/teams.dart index 5a93a85c0e..2297369eb9 100644 --- a/app/sdks/flutter-dart/lib/services/teams.dart +++ b/app/sdks/flutter-dart/lib/services/teams.dart @@ -3,7 +3,6 @@ import 'dart:io'; import 'package:dio/dio.dart'; import 'package:meta/meta.dart'; -import 'package:flutter_web_auth/flutter_web_auth.dart'; import "../client.dart"; import '../enums.dart'; @@ -12,9 +11,12 @@ import "../service.dart"; class Teams extends Service { Teams(Client client): super(client); + /// List Teams + /// /// Get a list of all the current user teams. You can use the query params to /// filter your results. On admin mode, this endpoint will return a list of all /// of the project teams. [Learn more about different API modes](/docs/admin). + /// Future list({String search = '', int limit = 25, int offset = 0, OrderType orderType = OrderType.asc}) { final String path = '/teams'; @@ -25,12 +27,20 @@ class Teams extends Service { 'orderType': orderType.name(), }; - return client.call(HttpMethod.get, path: path, params: params); + final Map headers = { + 'content-type': 'application/json', + }; + + return client.call(HttpMethod.get, path: path, params: params, headers: headers); } + + /// Create Team + /// /// Create a new team. The user who creates the team will automatically be /// assigned as the owner of the team. The team owner can invite new members, /// who will be able add new owners and update or delete the team from your /// project. + /// Future create({@required String name, List roles = const ["owner"]}) { final String path = '/teams'; @@ -39,20 +49,36 @@ class Teams extends Service { 'roles': roles, }; - return client.call(HttpMethod.post, path: path, params: params); + final Map headers = { + 'content-type': 'application/json', + }; + + return client.call(HttpMethod.post, path: path, params: params, headers: headers); } + + /// Get Team + /// /// Get team by its unique ID. All team members have read access for this /// resource. + /// Future get({@required String teamId}) { final String path = '/teams/{teamId}'.replaceAll(RegExp('{teamId}'), teamId); final Map params = { }; - return client.call(HttpMethod.get, path: path, params: params); + final Map headers = { + 'content-type': 'application/json', + }; + + return client.call(HttpMethod.get, path: path, params: params, headers: headers); } + + /// Update Team + /// /// Update team by its unique ID. Only team owners have write access for this /// resource. + /// Future update({@required String teamId, @required String name}) { final String path = '/teams/{teamId}'.replaceAll(RegExp('{teamId}'), teamId); @@ -60,28 +86,51 @@ class Teams extends Service { 'name': name, }; - return client.call(HttpMethod.put, path: path, params: params); + final Map headers = { + 'content-type': 'application/json', + }; + + return client.call(HttpMethod.put, path: path, params: params, headers: headers); } + + /// Delete Team + /// /// Delete team by its unique ID. Only team owners have write access for this /// resource. + /// Future delete({@required String teamId}) { final String path = '/teams/{teamId}'.replaceAll(RegExp('{teamId}'), teamId); final Map params = { }; - return client.call(HttpMethod.delete, path: path, params: params); + final Map headers = { + 'content-type': 'application/json', + }; + + return client.call(HttpMethod.delete, path: path, params: params, headers: headers); } + + /// Get Team Memberships + /// /// Get team members by the team unique ID. All team members have read access /// for this list of resources. + /// Future getMemberships({@required String teamId}) { final String path = '/teams/{teamId}/memberships'.replaceAll(RegExp('{teamId}'), teamId); final Map params = { }; - return client.call(HttpMethod.get, path: path, params: params); + final Map headers = { + 'content-type': 'application/json', + }; + + return client.call(HttpMethod.get, path: path, params: params, headers: headers); } + + /// Create Team Membership + /// /// Use this endpoint to invite a new member to join your team. An email with a /// link to join the team will be sent to the new member email address if the /// member doesn't exist in the project it will be created automatically. @@ -95,6 +144,7 @@ class Teams extends Service { /// Attacks](https://github.com/OWASP/CheatSheetSeries/blob/master/cheatsheets/Unvalidated_Redirects_and_Forwards_Cheat_Sheet.md) /// the only valid redirect URL's are the once from domains you have set when /// added your platforms in the console interface. + /// Future createMembership({@required String teamId, @required String email, @required List roles, @required String url, String name = ''}) { final String path = '/teams/{teamId}/memberships'.replaceAll(RegExp('{teamId}'), teamId); @@ -105,22 +155,38 @@ class Teams extends Service { 'url': url, }; - return client.call(HttpMethod.post, path: path, params: params); + final Map headers = { + 'content-type': 'application/json', + }; + + return client.call(HttpMethod.post, path: path, params: params, headers: headers); } + + /// Delete Team Membership + /// /// This endpoint allows a user to leave a team or for a team owner to delete /// the membership of any other team member. You can also use this endpoint to /// delete a user membership even if he didn't accept it. + /// Future deleteMembership({@required String teamId, @required String inviteId}) { final String path = '/teams/{teamId}/memberships/{inviteId}'.replaceAll(RegExp('{teamId}'), teamId).replaceAll(RegExp('{inviteId}'), inviteId); final Map params = { }; - return client.call(HttpMethod.delete, path: path, params: params); + final Map headers = { + 'content-type': 'application/json', + }; + + return client.call(HttpMethod.delete, path: path, params: params, headers: headers); } + + /// Update Team Membership Status + /// /// Use this endpoint to allow a user to accept an invitation to join a team /// after he is being redirected back to your app from the invitation email he /// was sent. + /// Future updateMembershipStatus({@required String teamId, @required String inviteId, @required String userId, @required String secret}) { final String path = '/teams/{teamId}/memberships/{inviteId}/status'.replaceAll(RegExp('{teamId}'), teamId).replaceAll(RegExp('{inviteId}'), inviteId); @@ -129,6 +195,10 @@ class Teams extends Service { 'secret': secret, }; - return client.call(HttpMethod.patch, path: path, params: params); + final Map headers = { + 'content-type': 'application/json', + }; + + return client.call(HttpMethod.patch, path: path, params: params, headers: headers); } } \ No newline at end of file diff --git a/app/sdks/web-javascript/docs/examples/account/create-o-auth2session.md b/app/sdks/web-javascript/docs/examples/account/create-o-auth2session.md index ee4b20402d..611df2173d 100644 --- a/app/sdks/web-javascript/docs/examples/account/create-o-auth2session.md +++ b/app/sdks/web-javascript/docs/examples/account/create-o-auth2session.md @@ -4,6 +4,10 @@ sdk .setProject('5df5acd0d48c2') // Your project ID ; -let result = sdk.account.createOAuth2Session('bitbucket', 'https://example.com', 'https://example.com'); +let promise = sdk.account.createOAuth2Session('bitbucket'); -console.log(result); // Resource URL +promise.then(function (response) { + console.log(response); // Success +}, function (error) { + console.log(error); // Failure +}); \ No newline at end of file diff --git a/app/sdks/web-javascript/src/sdk.js b/app/sdks/web-javascript/src/sdk.js index 99726f5958..5b3d3e55a3 100644 --- a/app/sdks/web-javascript/src/sdk.js +++ b/app/sdks/web-javascript/src/sdk.js @@ -286,28 +286,6 @@ } }(window.document); - let iframe = function(method, url, params) { - let form = document.createElement('form'); - - form.setAttribute('method', method); - form.setAttribute('action', config.endpoint + url); - - for(let key in params) { - if(params.hasOwnProperty(key)) { - let hiddenField = document.createElement("input"); - hiddenField.setAttribute("type", "hidden"); - hiddenField.setAttribute("name", key); - hiddenField.setAttribute("value", params[key]); - - form.appendChild(hiddenField); - } - } - - document.body.appendChild(form); - - return form.submit(); - }; - let account = { /** @@ -768,21 +746,13 @@ * @param {string} success * @param {string} failure * @throws {Error} - * @return {string} + * @return {Promise} */ - createOAuth2Session: function(provider, success, failure) { + createOAuth2Session: function(provider, success = 'https://localhost:2444/auth/oauth2/success', failure = 'https://localhost:2444/auth/oauth2/failure') { if(provider === undefined) { throw new Error('Missing required parameter: "provider"'); } - if(success === undefined) { - throw new Error('Missing required parameter: "success"'); - } - - if(failure === undefined) { - throw new Error('Missing required parameter: "failure"'); - } - let path = '/account/sessions/oauth2/{provider}'.replace(new RegExp('{provider}', 'g'), provider); let payload = {}; @@ -798,8 +768,8 @@ payload['project'] = config.project; let query = Object.keys(payload).map(key => key + '=' + encodeURIComponent(payload[key])).join('&'); - - return config.endpoint + path + ((query) ? '?' + query : ''); + + window.location = config.endpoint + path + ((query) ? '?' + query : ''); }, /** @@ -1743,7 +1713,7 @@ payload['project'] = config.project; let query = Object.keys(payload).map(key => key + '=' + encodeURIComponent(payload[key])).join('&'); - + return config.endpoint + path + ((query) ? '?' + query : ''); }, @@ -1796,7 +1766,7 @@ payload['project'] = config.project; let query = Object.keys(payload).map(key => key + '=' + encodeURIComponent(payload[key])).join('&'); - + return config.endpoint + path + ((query) ? '?' + query : ''); }, @@ -1827,7 +1797,7 @@ payload['project'] = config.project; let query = Object.keys(payload).map(key => key + '=' + encodeURIComponent(payload[key])).join('&'); - + return config.endpoint + path + ((query) ? '?' + query : ''); } }; diff --git a/app/sdks/web-javascript/src/sdk.min.js b/app/sdks/web-javascript/src/sdk.min.js index 338db55e7c..29204764d1 100644 --- a/app/sdks/web-javascript/src/sdk.min.js +++ b/app/sdks/web-javascript/src/sdk.min.js @@ -12,8 +12,7 @@ request.setRequestHeader(key,headers[key])}} request.onload=function(){if(4===request.readyState&&399>=request.status){let data=request.response;let contentType=this.getResponseHeader('content-type')||'';contentType=contentType.substring(0,contentType.indexOf(';'));switch(contentType){case 'application/json':data=JSON.parse(data);break} let cookieFallback=this.getResponseHeader('X-Fallback-Cookies')||'';if(window.localStorage&&cookieFallback){window.console.warn('Appwrite is using localStorage for session management. Increase your security by adding a custom domain as your API endpoint.');window.localStorage.setItem('cookieFallback',cookieFallback)} resolve(data)}else{reject(new Error(request.statusText))}};if(progress){request.addEventListener('progress',progress);request.upload.addEventListener('progress',progress,!1)} -request.onerror=function(){reject(new Error("Network Error"))};request.send(params)})};return{'get':function(path,headers={},params={}){return call('GET',path+((Object.keys(params).length>0)?'?'+buildQuery(params):''),headers,{})},'post':function(path,headers={},params={},progress=null){return call('POST',path,headers,params,progress)},'put':function(path,headers={},params={},progress=null){return call('PUT',path,headers,params,progress)},'patch':function(path,headers={},params={},progress=null){return call('PATCH',path,headers,params,progress)},'delete':function(path,headers={},params={},progress=null){return call('DELETE',path,headers,params,progress)},'addGlobalParam':addGlobalParam,'addGlobalHeader':addGlobalHeader}}(window.document);let iframe=function(method,url,params){let form=document.createElement('form');form.setAttribute('method',method);form.setAttribute('action',config.endpoint+url);for(let key in params){if(params.hasOwnProperty(key)){let hiddenField=document.createElement("input");hiddenField.setAttribute("type","hidden");hiddenField.setAttribute("name",key);hiddenField.setAttribute("value",params[key]);form.appendChild(hiddenField)}} -document.body.appendChild(form);return form.submit()};let account={get:function(){let path='/account';let payload={};return http.get(path,{'content-type':'application/json',},payload)},create:function(email,password,name=''){if(email===undefined){throw new Error('Missing required parameter: "email"')} +request.onerror=function(){reject(new Error("Network Error"))};request.send(params)})};return{'get':function(path,headers={},params={}){return call('GET',path+((Object.keys(params).length>0)?'?'+buildQuery(params):''),headers,{})},'post':function(path,headers={},params={},progress=null){return call('POST',path,headers,params,progress)},'put':function(path,headers={},params={},progress=null){return call('PUT',path,headers,params,progress)},'patch':function(path,headers={},params={},progress=null){return call('PATCH',path,headers,params,progress)},'delete':function(path,headers={},params={},progress=null){return call('DELETE',path,headers,params,progress)},'addGlobalParam':addGlobalParam,'addGlobalHeader':addGlobalHeader}}(window.document);let account={get:function(){let path='/account';let payload={};return http.get(path,{'content-type':'application/json',},payload)},create:function(email,password,name=''){if(email===undefined){throw new Error('Missing required parameter: "email"')} if(password===undefined){throw new Error('Missing required parameter: "password"')} let path='/account';let payload={};if(email){payload.email=email} if(password){payload.password=password} @@ -46,12 +45,10 @@ return http.put(path,{'content-type':'application/json',},payload)},getSessions: if(password===undefined){throw new Error('Missing required parameter: "password"')} let path='/account/sessions';let payload={};if(email){payload.email=email} if(password){payload.password=password} -return http.post(path,{'content-type':'application/json',},payload)},deleteSessions:function(){let path='/account/sessions';let payload={};return http.delete(path,{'content-type':'application/json',},payload)},createOAuth2Session:function(provider,success,failure){if(provider===undefined){throw new Error('Missing required parameter: "provider"')} -if(success===undefined){throw new Error('Missing required parameter: "success"')} -if(failure===undefined){throw new Error('Missing required parameter: "failure"')} +return http.post(path,{'content-type':'application/json',},payload)},deleteSessions:function(){let path='/account/sessions';let payload={};return http.delete(path,{'content-type':'application/json',},payload)},createOAuth2Session:function(provider,success='https://localhost:2444/auth/oauth2/success',failure='https://localhost:2444/auth/oauth2/failure'){if(provider===undefined){throw new Error('Missing required parameter: "provider"')} let path='/account/sessions/oauth2/{provider}'.replace(new RegExp('{provider}','g'),provider);let payload={};if(success){payload.success=success} if(failure){payload.failure=failure} -payload.project=config.project;let query=Object.keys(payload).map(key=>key+'='+encodeURIComponent(payload[key])).join('&');return config.endpoint+path+((query)?'?'+query:'')},deleteSession:function(sessionId){if(sessionId===undefined){throw new Error('Missing required parameter: "sessionId"')} +payload.project=config.project;let query=Object.keys(payload).map(key=>key+'='+encodeURIComponent(payload[key])).join('&');window.location=config.endpoint+path+((query)?'?'+query:'')},deleteSession:function(sessionId){if(sessionId===undefined){throw new Error('Missing required parameter: "sessionId"')} let path='/account/sessions/{sessionId}'.replace(new RegExp('{sessionId}','g'),sessionId);let payload={};return http.delete(path,{'content-type':'application/json',},payload)},createVerification:function(url){if(url===undefined){throw new Error('Missing required parameter: "url"')} let path='/account/verification';let payload={};if(url){payload.url=url} return http.post(path,{'content-type':'application/json',},payload)},updateVerification:function(userId,secret){if(userId===undefined){throw new Error('Missing required parameter: "userId"')} diff --git a/composer.lock b/composer.lock index d37b63fe9b..abac9063d7 100644 --- a/composer.lock +++ b/composer.lock @@ -1622,7 +1622,7 @@ "source": { "type": "git", "url": "https://github.com/appwrite/sdk-generator", - "reference": "3e1012da0fec5559f0859816b4c3fecea23fe808" + "reference": "a139044dd98eccf9c909977b8fcfd39faedc876d" }, "require": { "ext-curl": "*", @@ -1652,7 +1652,7 @@ } ], "description": "Appwrite PHP library for generating API SDKs for multiple programming languages and platforms", - "time": "2020-04-10T08:25:22+00:00" + "time": "2020-04-11T09:38:34+00:00" }, { "name": "doctrine/instantiator", @@ -1979,12 +1979,12 @@ "source": { "type": "git", "url": "https://github.com/phpDocumentor/ReflectionCommon.git", - "reference": "b0843c8cbcc2dc5eda5158e583c7199a5e44c86d" + "reference": "74a67151cce1fe4aa5960636ae510ddf1faefdb3" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/phpDocumentor/ReflectionCommon/zipball/b0843c8cbcc2dc5eda5158e583c7199a5e44c86d", - "reference": "b0843c8cbcc2dc5eda5158e583c7199a5e44c86d", + "url": "https://api.github.com/repos/phpDocumentor/ReflectionCommon/zipball/74a67151cce1fe4aa5960636ae510ddf1faefdb3", + "reference": "74a67151cce1fe4aa5960636ae510ddf1faefdb3", "shasum": "" }, "require": { @@ -2023,7 +2023,7 @@ "reflection", "static analysis" ], - "time": "2019-12-20T12:45:35+00:00" + "time": "2020-04-10T20:41:10+00:00" }, { "name": "phpdocumentor/reflection-docblock",