1
0
Fork 0
mirror of synced 2024-06-13 16:24:47 +12:00

Updated SDKs

This commit is contained in:
Eldad Fux 2020-04-05 23:39:45 +03:00
parent 8e06f261c5
commit 02c7f4a611
41 changed files with 482 additions and 438 deletions

View file

@ -130,7 +130,7 @@ return [
[
'key' => 'dart',
'name' => 'Dart',
'version' => '0.0.7',
'version' => '0.0.8',
'url' => 'https://github.com/appwrite/sdk-for-dart',
'enabled' => true,
'beta' => true,

View file

@ -0,0 +1 @@
# Change Log

View file

@ -31,6 +31,21 @@ To install with a CDN (content delivery network) add the following scripts to th
<script src="https://cdn.jsdelivr.net/npm/appwrite@1.0.0"></script>
```
## Getting Started
Initialise the Appwrite SDK in your code, and setup your API credentials:
```js
// Init your JS SDK
var appwrite = new Appwrite();
appwrite
.setEndpoint('http://localhost/v1') // Set only when using self-hosted solution
.setProject('455x34dfkj') // Your Appwrite Project UID
;
```
## Contribution

View file

@ -0,0 +1,4 @@
## 0.0.8
- Fixed compilation error in Client class
- Shorter description for package

View file

@ -3,7 +3,7 @@
![License](https://img.shields.io/github/license/appwrite/sdk-for-dart.svg?v=1)
![Version](https://img.shields.io/badge/api%20version-0.5.3-blue.svg?v=1)
**This SDK is compatible with Appwrite server version . For older versions, please check previous releases.**
**This SDK is compatible with Appwrite server version 0.5.3. For older versions, please check previous releases.**
Appwrite backend as a service cuts up to 70% of the time and costs required for building a modern application. We abstract and simplify common development tasks behind a REST APIs, to help you develop your app in a fast and secure way. For full API documentation and tutorials go to [https://appwrite.io/docs](https://appwrite.io/docs)
@ -13,17 +13,17 @@ Appwrite backend as a service cuts up to 70% of the time and costs required for
## Installation
Add this to your package's pubspec.yaml file:
Add this to your package's `pubspec.yaml` file:
```yml
dependencies:
appwrite: ^0.0.7
appwrite: ^0.0.8
```
You can install packages from the command line:
```bash
pub get
pub get appwrite
```
## Contribution

View file

@ -1,8 +1,9 @@
export 'package:appwrite/services/account.dart';
export 'package:appwrite/services/avatars.dart';
export 'package:appwrite/services/database.dart';
export 'package:appwrite/services/locale.dart';
export 'package:appwrite/services/storage.dart';
export 'package:appwrite/services/teams.dart';
export 'package:appwrite/client.dart';
export 'services/account.dart';
export 'services/avatars.dart';
export 'services/database.dart';
export 'services/locale.dart';
export 'services/storage.dart';
export 'services/teams.dart';
export 'client.dart';
export 'enums.dart';
export 'package:dio/dio.dart' show Response;

View file

@ -1,3 +1,6 @@
import 'dart:io';
import 'package:dio/adapter.dart';
import 'package:dio/dio.dart';
import 'package:dio_cookie_manager/dio_cookie_manager.dart';
import 'package:cookie_jar/cookie_jar.dart';
@ -8,95 +11,74 @@ class Client {
String endPoint;
Map<String, String> headers;
bool selfSigned;
Dio http;
Client() {
this.endPoint = 'https://appwrite.io/v1';
final Dio http;
Client({this.endPoint: 'https://appwrite.io/v1', this.selfSigned: false, Dio http}) : this.http = http ?? Dio() {
this.headers = {
'content-type': 'application/json',
'x-sdk-version': 'appwrite:dart:0.0.7',
'x-sdk-version': 'appwrite:dart:0.0.8',
};
this.selfSigned = false;
this.http = Dio();
assert(endPoint.startsWith(RegExp("http://|https://")), "endPoint $endPoint must start with 'http'");
this.http.options.baseUrl = this.endPoint;
this.http.options.validateStatus = (status) => status != 404;
this.http.interceptors.add(CookieManager(CookieJar()));
}
/// Your project ID
Client setProject(value) {
this.addHeader('X-Appwrite-Project', value);
addHeader('X-Appwrite-Project', value);
return this;
}
/// Your secret API key
Client setKey(value) {
this.addHeader('X-Appwrite-Key', value);
addHeader('X-Appwrite-Key', value);
return this;
}
Client setLocale(value) {
this.addHeader('X-Appwrite-Locale', value);
addHeader('X-Appwrite-Locale', value);
return this;
}
Client setMode(value) {
this.addHeader('X-Appwrite-Mode', value);
addHeader('X-Appwrite-Mode', value);
return this;
}
Client setSelfSigned({bool status = true}) {
this.selfSigned = status;
selfSigned = status;
return this;
}
Client setEndpoint(String endPoint)
{
Client setEndpoint(String endPoint) {
this.endPoint = endPoint;
this.http.options.baseUrl = this.endPoint;
return this;
}
Client addHeader(String key, String value) {
this.headers[key.toLowerCase()] = value.toLowerCase();
headers[key] = value;
return this;
}
Future<Response> call(HttpMethod method, {String path = '', Map<String, String> headers = const {}, Map<String, dynamic> params = const {}}) {
if(this.selfSigned) {
if(this.selfSigned) {
// Allow self signed requests
(http.httpClientAdapter as DefaultHttpClientAdapter).onHttpClientCreate = (HttpClient client) {
client.badCertificateCallback = (X509Certificate cert, String host, int port) => true;
return client;
};
}
String reqPath = path;
bool isGet = method == HttpMethod.get;
// Origin is hardcoded for testing
Options options = Options(
headers: {...this.headers, ...headers, "Origin": "http://localhost"},
method: method.name(),
);
if (isGet) {
path += "?";
params.forEach((k, v) {
path += "${k}=${v}&";
});
if (method == HttpMethod.get) {
return http.get(path, queryParameters: params, options: options);
} else {
return http.request(path, data: params, options: options);
}
if (!isGet)
return http.request(reqPath, data: params, options: options);
else
return http.request(reqPath, options: options);
}
}

View file

@ -2,7 +2,17 @@ enum HttpMethod {
get, post, put, delete, patch
}
extension HttpMethodString on HttpMethod{
extension HttpMethodString on HttpMethod {
String name(){
return this.toString().split('.').last.toUpperCase();
}
}
enum OrderType {
asc, desc
}
extension OrderTypeString on OrderType {
String name(){
return this.toString().split('.').last.toUpperCase();
}

View file

@ -1,9 +1,7 @@
import 'package:appwrite/client.dart';
import 'client.dart';
class Service {
Client client;
final Client client;
Service(Client client) {
this.client = client;
}
const Service(this.client);
}

View file

@ -1,24 +1,23 @@
import 'dart:html';
import "package:appwrite/service.dart";
import "package:appwrite/client.dart";
import 'package:dio/dio.dart';
import 'package:meta/meta.dart';
import "../client.dart";
import '../enums.dart';
import "../service.dart";
class Account extends Service {
Account(Client client): super(client);
Account(Client client): super(client);
/// Get currently logged in user data as JSON object.
Future<Response> get() async {
String path = '/account';
Future<Response> get() {
final String path = '/account';
Map<String, dynamic> params = {
};
final Map<String, dynamic> params = {
};
return await this.client.call(HttpMethod.get, path: path, params: params);
return this.client.call(HttpMethod.get, path: path, params: params);
}
/// 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
@ -26,95 +25,95 @@ class Account extends Service {
/// 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<Response> create({@required String email, @required String password, String name = null}) async {
String path = '/account';
Future<Response> create({@required String email, @required String password, String name = null}) {
final String path = '/account';
Map<String, dynamic> params = {
'email': email,
'password': password,
'name': name,
};
final Map<String, dynamic> params = {
'email': email,
'password': password,
'name': name,
};
return await this.client.call(HttpMethod.post, path: path, params: params);
return this.client.call(HttpMethod.post, path: path, params: params);
}
/// 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<Response> delete() async {
String path = '/account';
Future<Response> delete() {
final String path = '/account';
Map<String, dynamic> params = {
};
final Map<String, dynamic> params = {
};
return await this.client.call(HttpMethod.delete, path: path, params: params);
return this.client.call(HttpMethod.delete, path: path, params: params);
}
/// 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<Response> updateEmail({@required String email, @required String password}) async {
String path = '/account/email';
Future<Response> updateEmail({@required String email, @required String password}) {
final String path = '/account/email';
Map<String, dynamic> params = {
'email': email,
'password': password,
};
final Map<String, dynamic> params = {
'email': email,
'password': password,
};
return await this.client.call(HttpMethod.patch, path: path, params: params);
return this.client.call(HttpMethod.patch, path: path, params: params);
}
/// 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<Response> getLogs() async {
String path = '/account/logs';
Future<Response> getLogs() {
final String path = '/account/logs';
Map<String, dynamic> params = {
};
final Map<String, dynamic> params = {
};
return await this.client.call(HttpMethod.get, path: path, params: params);
return this.client.call(HttpMethod.get, path: path, params: params);
}
/// Update currently logged in user account name.
Future<Response> updateName({@required String name}) async {
String path = '/account/name';
Future<Response> updateName({@required String name}) {
final String path = '/account/name';
Map<String, dynamic> params = {
'name': name,
};
final Map<String, dynamic> params = {
'name': name,
};
return await this.client.call(HttpMethod.patch, path: path, params: params);
return this.client.call(HttpMethod.patch, path: path, params: params);
}
/// Update currently logged in user password. For validation, user is required
/// to pass the password twice.
Future<Response> updatePassword({@required String password, @required String oldPassword}) async {
String path = '/account/password';
Future<Response> updatePassword({@required String password, @required String oldPassword}) {
final String path = '/account/password';
Map<String, dynamic> params = {
'password': password,
'old-password': oldPassword,
};
final Map<String, dynamic> params = {
'password': password,
'old-password': oldPassword,
};
return await this.client.call(HttpMethod.patch, path: path, params: params);
return this.client.call(HttpMethod.patch, path: path, params: params);
}
/// Get currently logged in user preferences as a key-value object.
Future<Response> getPrefs() async {
String path = '/account/prefs';
Future<Response> getPrefs() {
final String path = '/account/prefs';
Map<String, dynamic> params = {
};
final Map<String, dynamic> params = {
};
return await this.client.call(HttpMethod.get, path: path, params: params);
return this.client.call(HttpMethod.get, path: path, params: params);
}
/// Update currently logged in user account preferences. You can pass only the
/// specific settings you wish to update.
Future<Response> updatePrefs({@required dynamic prefs}) async {
String path = '/account/prefs';
Future<Response> updatePrefs({@required dynamic prefs}) {
final String path = '/account/prefs';
Map<String, dynamic> params = {
'prefs': prefs,
};
final Map<String, dynamic> params = {
'prefs': prefs,
};
return await this.client.call(HttpMethod.patch, path: path, params: params);
return this.client.call(HttpMethod.patch, path: path, params: params);
}
/// 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
@ -122,15 +121,15 @@ class Account extends Service {
/// 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<Response> createRecovery({@required String email, @required String url}) async {
String path = '/account/recovery';
Future<Response> createRecovery({@required String email, @required String url}) {
final String path = '/account/recovery';
Map<String, dynamic> params = {
'email': email,
'url': url,
};
final Map<String, dynamic> params = {
'email': email,
'url': url,
};
return await this.client.call(HttpMethod.post, path: path, params: params);
return this.client.call(HttpMethod.post, path: path, params: params);
}
/// Use this endpoint to complete the user account password reset. Both the
/// **userId** and **secret** arguments will be passed as query parameters to
@ -141,74 +140,74 @@ 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<Response> updateRecovery({@required String userId, @required String secret, @required String passwordA, @required String passwordB}) async {
String path = '/account/recovery';
Future<Response> updateRecovery({@required String userId, @required String secret, @required String passwordA, @required String passwordB}) {
final String path = '/account/recovery';
Map<String, dynamic> params = {
'userId': userId,
'secret': secret,
'password-a': passwordA,
'password-b': passwordB,
};
final Map<String, dynamic> params = {
'userId': userId,
'secret': secret,
'password-a': passwordA,
'password-b': passwordB,
};
return await this.client.call(HttpMethod.put, path: path, params: params);
return this.client.call(HttpMethod.put, path: path, params: params);
}
/// Get currently logged in user list of active sessions across different
/// devices.
Future<Response> getSessions() async {
String path = '/account/sessions';
Future<Response> getSessions() {
final String path = '/account/sessions';
Map<String, dynamic> params = {
};
final Map<String, dynamic> params = {
};
return await this.client.call(HttpMethod.get, path: path, params: params);
return this.client.call(HttpMethod.get, path: path, params: params);
}
/// 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<Response> createSession({@required String email, @required String password}) async {
String path = '/account/sessions';
Future<Response> createSession({@required String email, @required String password}) {
final String path = '/account/sessions';
Map<String, dynamic> params = {
'email': email,
'password': password,
};
final Map<String, dynamic> params = {
'email': email,
'password': password,
};
return await this.client.call(HttpMethod.post, path: path, params: params);
return this.client.call(HttpMethod.post, path: path, params: params);
}
/// Delete all sessions from the user account and remove any sessions cookies
/// from the end client.
Future<Response> deleteSessions() async {
String path = '/account/sessions';
Future<Response> deleteSessions() {
final String path = '/account/sessions';
Map<String, dynamic> params = {
};
final Map<String, dynamic> params = {
};
return await this.client.call(HttpMethod.delete, path: path, params: params);
return this.client.call(HttpMethod.delete, path: path, params: params);
}
/// 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<Response> createOAuth2Session({@required String provider, @required String success, @required String failure}) async {
String path = '/account/sessions/oauth2/{provider}'.replaceAll(RegExp('{provider}'), provider);
Future<Response> createOAuth2Session({@required String provider, @required String success, @required String failure}) {
final String path = '/account/sessions/oauth2/{provider}'.replaceAll(RegExp('{provider}'), provider);
Map<String, dynamic> params = {
'success': success,
'failure': failure,
};
final Map<String, dynamic> params = {
'success': success,
'failure': failure,
};
return await this.client.call(HttpMethod.get, path: path, params: params);
return this.client.call(HttpMethod.get, path: path, params: params);
}
/// 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<Response> deleteSession({@required String sessionId}) async {
String path = '/account/sessions/{sessionId}'.replaceAll(RegExp('{sessionId}'), sessionId);
Future<Response> deleteSession({@required String sessionId}) {
final String path = '/account/sessions/{sessionId}'.replaceAll(RegExp('{sessionId}'), sessionId);
Map<String, dynamic> params = {
};
final Map<String, dynamic> params = {
};
return await this.client.call(HttpMethod.delete, path: path, params: params);
return this.client.call(HttpMethod.delete, path: path, params: params);
}
/// 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**
@ -223,27 +222,27 @@ 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<Response> createVerification({@required String url}) async {
String path = '/account/verification';
Future<Response> createVerification({@required String url}) {
final String path = '/account/verification';
Map<String, dynamic> params = {
'url': url,
};
final Map<String, dynamic> params = {
'url': url,
};
return await this.client.call(HttpMethod.post, path: path, params: params);
return this.client.call(HttpMethod.post, path: path, params: params);
}
/// 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<Response> updateVerification({@required String userId, @required String secret}) async {
String path = '/account/verification';
Future<Response> updateVerification({@required String userId, @required String secret}) {
final String path = '/account/verification';
Map<String, dynamic> params = {
'userId': userId,
'secret': secret,
};
final Map<String, dynamic> params = {
'userId': userId,
'secret': secret,
};
return await this.client.call(HttpMethod.put, path: path, params: params);
return this.client.call(HttpMethod.put, path: path, params: params);
}
}

View file

@ -1,98 +1,97 @@
import 'dart:html';
import "package:appwrite/service.dart";
import "package:appwrite/client.dart";
import 'package:dio/dio.dart';
import 'package:meta/meta.dart';
import "../client.dart";
import '../enums.dart';
import "../service.dart";
class Avatars extends Service {
Avatars(Client client): super(client);
Avatars(Client client): super(client);
/// 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<Response> getBrowser({@required String code, int width = 100, int height = 100, int quality = 100}) async {
String path = '/avatars/browsers/{code}'.replaceAll(RegExp('{code}'), code);
Future<Response> getBrowser({@required String code, int width = 100, int height = 100, int quality = 100}) {
final String path = '/avatars/browsers/{code}'.replaceAll(RegExp('{code}'), code);
Map<String, dynamic> params = {
'width': width,
'height': height,
'quality': quality,
};
final Map<String, dynamic> params = {
'width': width,
'height': height,
'quality': quality,
};
return await this.client.call(HttpMethod.get, path: path, params: params);
return this.client.call(HttpMethod.get, path: path, params: params);
}
/// 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<Response> getCreditCard({@required String code, int width = 100, int height = 100, int quality = 100}) async {
String path = '/avatars/credit-cards/{code}'.replaceAll(RegExp('{code}'), code);
Future<Response> getCreditCard({@required String code, int width = 100, int height = 100, int quality = 100}) {
final String path = '/avatars/credit-cards/{code}'.replaceAll(RegExp('{code}'), code);
Map<String, dynamic> params = {
'width': width,
'height': height,
'quality': quality,
};
final Map<String, dynamic> params = {
'width': width,
'height': height,
'quality': quality,
};
return await this.client.call(HttpMethod.get, path: path, params: params);
return this.client.call(HttpMethod.get, path: path, params: params);
}
/// Use this endpoint to fetch the favorite icon (AKA favicon) of a any remote
/// website URL.
Future<Response> getFavicon({@required String url}) async {
String path = '/avatars/favicon';
Future<Response> getFavicon({@required String url}) {
final String path = '/avatars/favicon';
Map<String, dynamic> params = {
'url': url,
};
final Map<String, dynamic> params = {
'url': url,
};
return await this.client.call(HttpMethod.get, path: path, params: params);
return this.client.call(HttpMethod.get, path: path, params: params);
}
/// 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<Response> getFlag({@required String code, int width = 100, int height = 100, int quality = 100}) async {
String path = '/avatars/flags/{code}'.replaceAll(RegExp('{code}'), code);
Future<Response> getFlag({@required String code, int width = 100, int height = 100, int quality = 100}) {
final String path = '/avatars/flags/{code}'.replaceAll(RegExp('{code}'), code);
Map<String, dynamic> params = {
'width': width,
'height': height,
'quality': quality,
};
final Map<String, dynamic> params = {
'width': width,
'height': height,
'quality': quality,
};
return await this.client.call(HttpMethod.get, path: path, params: params);
return this.client.call(HttpMethod.get, path: path, params: params);
}
/// 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<Response> getImage({@required String url, int width = 400, int height = 400}) async {
String path = '/avatars/image';
Future<Response> getImage({@required String url, int width = 400, int height = 400}) {
final String path = '/avatars/image';
Map<String, dynamic> params = {
'url': url,
'width': width,
'height': height,
};
final Map<String, dynamic> params = {
'url': url,
'width': width,
'height': height,
};
return await this.client.call(HttpMethod.get, path: path, params: params);
return this.client.call(HttpMethod.get, path: path, params: params);
}
/// 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<Response> getQR({@required String text, int size = 400, int margin = 1, int download = null}) async {
String path = '/avatars/qr';
Future<Response> getQR({@required String text, int size = 400, int margin = 1, int download = null}) {
final String path = '/avatars/qr';
Map<String, dynamic> params = {
'text': text,
'size': size,
'margin': margin,
'download': download,
};
final Map<String, dynamic> params = {
'text': text,
'size': size,
'margin': margin,
'download': download,
};
return await this.client.call(HttpMethod.get, path: path, params: params);
return this.client.call(HttpMethod.get, path: path, params: params);
}
}

View file

@ -1,82 +1,81 @@
import 'dart:html';
import "package:appwrite/service.dart";
import "package:appwrite/client.dart";
import 'package:dio/dio.dart';
import 'package:meta/meta.dart';
import "../client.dart";
import '../enums.dart';
import "../service.dart";
class Database extends Service {
Database(Client client): super(client);
Database(Client client): super(client);
/// 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<Response> listDocuments({@required String collectionId, List filters = const [], int offset = null, int limit = 50, String orderField = '\$id', String orderType = 'ASC', String orderCast = 'string', String search = null, int first = null, int last = null}) async {
String path = '/database/collections/{collectionId}/documents'.replaceAll(RegExp('{collectionId}'), collectionId);
Future<Response> listDocuments({@required String collectionId, List filters = const [], int offset = null, int limit = 50, String orderField = '\$id', String orderType = 'ASC', String orderCast = 'string', String search = null, int first = null, int last = null}) {
final String path = '/database/collections/{collectionId}/documents'.replaceAll(RegExp('{collectionId}'), collectionId);
Map<String, dynamic> params = {
'filters': filters,
'offset': offset,
'limit': limit,
'order-field': orderField,
'order-type': orderType,
'order-cast': orderCast,
'search': search,
'first': first,
'last': last,
};
final Map<String, dynamic> params = {
'filters': filters,
'offset': offset,
'limit': limit,
'order-field': orderField,
'order-type': orderType,
'order-cast': orderCast,
'search': search,
'first': first,
'last': last,
};
return await this.client.call(HttpMethod.get, path: path, params: params);
return this.client.call(HttpMethod.get, path: path, params: params);
}
/// Create a new Document.
Future<Response> createDocument({@required String collectionId, @required dynamic data, @required List read, @required List write, String parentDocument = null, String parentProperty = null, String parentPropertyType = 'assign'}) async {
String path = '/database/collections/{collectionId}/documents'.replaceAll(RegExp('{collectionId}'), collectionId);
Future<Response> createDocument({@required String collectionId, @required dynamic data, @required List read, @required List write, String parentDocument = null, String parentProperty = null, String parentPropertyType = 'assign'}) {
final String path = '/database/collections/{collectionId}/documents'.replaceAll(RegExp('{collectionId}'), collectionId);
Map<String, dynamic> params = {
'data': data,
'read': read,
'write': write,
'parentDocument': parentDocument,
'parentProperty': parentProperty,
'parentPropertyType': parentPropertyType,
};
final Map<String, dynamic> params = {
'data': data,
'read': read,
'write': write,
'parentDocument': parentDocument,
'parentProperty': parentProperty,
'parentPropertyType': parentPropertyType,
};
return await this.client.call(HttpMethod.post, path: path, params: params);
return this.client.call(HttpMethod.post, path: path, params: params);
}
/// Get document by its unique ID. This endpoint response returns a JSON object
/// with the document data.
Future<Response> getDocument({@required String collectionId, @required String documentId}) async {
String path = '/database/collections/{collectionId}/documents/{documentId}'.replaceAll(RegExp('{collectionId}'), collectionId).replaceAll(RegExp('{documentId}'), documentId);
Future<Response> getDocument({@required String collectionId, @required String documentId}) {
final String path = '/database/collections/{collectionId}/documents/{documentId}'.replaceAll(RegExp('{collectionId}'), collectionId).replaceAll(RegExp('{documentId}'), documentId);
Map<String, dynamic> params = {
};
final Map<String, dynamic> params = {
};
return await this.client.call(HttpMethod.get, path: path, params: params);
return this.client.call(HttpMethod.get, path: path, params: params);
}
Future<Response> updateDocument({@required String collectionId, @required String documentId, @required dynamic data, @required List read, @required List write}) async {
String path = '/database/collections/{collectionId}/documents/{documentId}'.replaceAll(RegExp('{collectionId}'), collectionId).replaceAll(RegExp('{documentId}'), documentId);
Future<Response> 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);
Map<String, dynamic> params = {
'data': data,
'read': read,
'write': write,
};
final Map<String, dynamic> params = {
'data': data,
'read': read,
'write': write,
};
return await this.client.call(HttpMethod.patch, path: path, params: params);
return this.client.call(HttpMethod.patch, path: path, params: params);
}
/// 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<Response> deleteDocument({@required String collectionId, @required String documentId}) async {
String path = '/database/collections/{collectionId}/documents/{documentId}'.replaceAll(RegExp('{collectionId}'), collectionId).replaceAll(RegExp('{documentId}'), documentId);
Future<Response> deleteDocument({@required String collectionId, @required String documentId}) {
final String path = '/database/collections/{collectionId}/documents/{documentId}'.replaceAll(RegExp('{collectionId}'), collectionId).replaceAll(RegExp('{documentId}'), documentId);
Map<String, dynamic> params = {
};
final Map<String, dynamic> params = {
};
return await this.client.call(HttpMethod.delete, path: path, params: params);
return this.client.call(HttpMethod.delete, path: path, params: params);
}
}

View file

@ -1,15 +1,14 @@
import 'dart:html';
import "package:appwrite/service.dart";
import "package:appwrite/client.dart";
import 'package:dio/dio.dart';
import 'package:meta/meta.dart';
import "../client.dart";
import '../enums.dart';
import "../service.dart";
class Locale extends Service {
Locale(Client client): super(client);
Locale(Client client): super(client);
/// Get the current user location based on IP. Returns an object with user
/// country code, country name, continent name, continent code, ip address and
@ -17,63 +16,63 @@ class Locale extends Service {
/// supported language.
///
/// ([IP Geolocation by DB-IP](https://db-ip.com))
Future<Response> get() async {
String path = '/locale';
Future<Response> get() {
final String path = '/locale';
Map<String, dynamic> params = {
};
final Map<String, dynamic> params = {
};
return await this.client.call(HttpMethod.get, path: path, params: params);
return this.client.call(HttpMethod.get, path: path, params: params);
}
/// List of all continents. You can use the locale header to get the data in a
/// supported language.
Future<Response> getContinents() async {
String path = '/locale/continents';
Future<Response> getContinents() {
final String path = '/locale/continents';
Map<String, dynamic> params = {
};
final Map<String, dynamic> params = {
};
return await this.client.call(HttpMethod.get, path: path, params: params);
return this.client.call(HttpMethod.get, path: path, params: params);
}
/// List of all countries. You can use the locale header to get the data in a
/// supported language.
Future<Response> getCountries() async {
String path = '/locale/countries';
Future<Response> getCountries() {
final String path = '/locale/countries';
Map<String, dynamic> params = {
};
final Map<String, dynamic> params = {
};
return await this.client.call(HttpMethod.get, path: path, params: params);
return this.client.call(HttpMethod.get, path: path, params: params);
}
/// 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<Response> getCountriesEU() async {
String path = '/locale/countries/eu';
Future<Response> getCountriesEU() {
final String path = '/locale/countries/eu';
Map<String, dynamic> params = {
};
final Map<String, dynamic> params = {
};
return await this.client.call(HttpMethod.get, path: path, params: params);
return this.client.call(HttpMethod.get, path: path, params: params);
}
/// List of all countries phone codes. You can use the locale header to get the
/// data in a supported language.
Future<Response> getCountriesPhones() async {
String path = '/locale/countries/phones';
Future<Response> getCountriesPhones() {
final String path = '/locale/countries/phones';
Map<String, dynamic> params = {
};
final Map<String, dynamic> params = {
};
return await this.client.call(HttpMethod.get, path: path, params: params);
return this.client.call(HttpMethod.get, path: path, params: params);
}
/// 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<Response> getCurrencies() async {
String path = '/locale/currencies';
Future<Response> getCurrencies() {
final String path = '/locale/currencies';
Map<String, dynamic> params = {
};
final Map<String, dynamic> params = {
};
return await this.client.call(HttpMethod.get, path: path, params: params);
return this.client.call(HttpMethod.get, path: path, params: params);
}
}

View file

@ -1,114 +1,113 @@
import 'dart:html';
import "package:appwrite/service.dart";
import "package:appwrite/client.dart";
import 'package:dio/dio.dart';
import 'package:meta/meta.dart';
import "../client.dart";
import '../enums.dart';
import "../service.dart";
class Storage extends Service {
Storage(Client client): super(client);
Storage(Client client): super(client);
/// 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<Response> listFiles({String search = null, int limit = 25, int offset = null, String orderType = 'ASC'}) async {
String path = '/storage/files';
Future<Response> listFiles({String search = null, int limit = 25, int offset = null, OrderType orderType = OrderType.asc}) {
final String path = '/storage/files';
Map<String, dynamic> params = {
'search': search,
'limit': limit,
'offset': offset,
'orderType': orderType,
};
final Map<String, dynamic> params = {
'search': search,
'limit': limit,
'offset': offset,
'orderType': orderType.name(),
};
return await this.client.call(HttpMethod.get, path: path, params: params);
return this.client.call(HttpMethod.get, path: path, params: params);
}
/// 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<Response> createFile({@required File file, @required List read, @required List write}) async {
String path = '/storage/files';
Future<Response> createFile({@required file, @required List read, @required List write}) {
final String path = '/storage/files';
Map<String, dynamic> params = {
'file': file,
'read': read,
'write': write,
};
final Map<String, dynamic> params = {
'file': file,
'read': read,
'write': write,
};
return await this.client.call(HttpMethod.post, path: path, params: params);
return this.client.call(HttpMethod.post, path: path, params: params);
}
/// Get file by its unique ID. This endpoint response returns a JSON object
/// with the file metadata.
Future<Response> getFile({@required String fileId}) async {
String path = '/storage/files/{fileId}'.replaceAll(RegExp('{fileId}'), fileId);
Future<Response> getFile({@required String fileId}) {
final String path = '/storage/files/{fileId}'.replaceAll(RegExp('{fileId}'), fileId);
Map<String, dynamic> params = {
};
final Map<String, dynamic> params = {
};
return await this.client.call(HttpMethod.get, path: path, params: params);
return this.client.call(HttpMethod.get, path: path, params: params);
}
/// Update file by its unique ID. Only users with write permissions have access
/// to update this resource.
Future<Response> updateFile({@required String fileId, @required List read, @required List write}) async {
String path = '/storage/files/{fileId}'.replaceAll(RegExp('{fileId}'), fileId);
Future<Response> updateFile({@required String fileId, @required List read, @required List write}) {
final String path = '/storage/files/{fileId}'.replaceAll(RegExp('{fileId}'), fileId);
Map<String, dynamic> params = {
'read': read,
'write': write,
};
final Map<String, dynamic> params = {
'read': read,
'write': write,
};
return await this.client.call(HttpMethod.put, path: path, params: params);
return this.client.call(HttpMethod.put, path: path, params: params);
}
/// Delete a file by its unique ID. Only users with write permissions have
/// access to delete this resource.
Future<Response> deleteFile({@required String fileId}) async {
String path = '/storage/files/{fileId}'.replaceAll(RegExp('{fileId}'), fileId);
Future<Response> deleteFile({@required String fileId}) {
final String path = '/storage/files/{fileId}'.replaceAll(RegExp('{fileId}'), fileId);
Map<String, dynamic> params = {
};
final Map<String, dynamic> params = {
};
return await this.client.call(HttpMethod.delete, path: path, params: params);
return this.client.call(HttpMethod.delete, path: path, params: params);
}
/// 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<Response> getFileDownload({@required String fileId}) async {
String path = '/storage/files/{fileId}/download'.replaceAll(RegExp('{fileId}'), fileId);
Future<Response> getFileDownload({@required String fileId}) {
final String path = '/storage/files/{fileId}/download'.replaceAll(RegExp('{fileId}'), fileId);
Map<String, dynamic> params = {
};
final Map<String, dynamic> params = {
};
return await this.client.call(HttpMethod.get, path: path, params: params);
return this.client.call(HttpMethod.get, path: path, params: params);
}
/// 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<Response> getFilePreview({@required String fileId, int width = null, int height = null, int quality = 100, String background = null, String output = null}) async {
String path = '/storage/files/{fileId}/preview'.replaceAll(RegExp('{fileId}'), fileId);
Future<Response> getFilePreview({@required String fileId, int width = null, int height = null, int quality = 100, String background = null, String output = null}) {
final String path = '/storage/files/{fileId}/preview'.replaceAll(RegExp('{fileId}'), fileId);
Map<String, dynamic> params = {
'width': width,
'height': height,
'quality': quality,
'background': background,
'output': output,
};
final Map<String, dynamic> params = {
'width': width,
'height': height,
'quality': quality,
'background': background,
'output': output,
};
return await this.client.call(HttpMethod.get, path: path, params: params);
return this.client.call(HttpMethod.get, path: path, params: params);
}
/// Get file content by its unique ID. This endpoint is similar to the download
/// method but returns with no 'Content-Disposition: attachment' header.
Future<Response> getFileView({@required String fileId, String as = null}) async {
String path = '/storage/files/{fileId}/view'.replaceAll(RegExp('{fileId}'), fileId);
Future<Response> getFileView({@required String fileId, String as = null}) {
final String path = '/storage/files/{fileId}/view'.replaceAll(RegExp('{fileId}'), fileId);
Map<String, dynamic> params = {
'as': as,
};
final Map<String, dynamic> params = {
'as': as,
};
return await this.client.call(HttpMethod.get, path: path, params: params);
return this.client.call(HttpMethod.get, path: path, params: params);
}
}

View file

@ -1,85 +1,84 @@
import 'dart:html';
import "package:appwrite/service.dart";
import "package:appwrite/client.dart";
import 'package:dio/dio.dart';
import 'package:meta/meta.dart';
import "../client.dart";
import '../enums.dart';
import "../service.dart";
class Teams extends Service {
Teams(Client client): super(client);
Teams(Client client): super(client);
/// 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<Response> list({String search = null, int limit = 25, int offset = null, String orderType = 'ASC'}) async {
String path = '/teams';
Future<Response> list({String search = null, int limit = 25, int offset = null, OrderType orderType = OrderType.asc}) {
final String path = '/teams';
Map<String, dynamic> params = {
'search': search,
'limit': limit,
'offset': offset,
'orderType': orderType,
};
final Map<String, dynamic> params = {
'search': search,
'limit': limit,
'offset': offset,
'orderType': orderType.name(),
};
return await this.client.call(HttpMethod.get, path: path, params: params);
return this.client.call(HttpMethod.get, path: path, params: params);
}
/// 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<Response> create({@required String name, List roles = const ["owner"]}) async {
String path = '/teams';
Future<Response> create({@required String name, List roles = const ["owner"]}) {
final String path = '/teams';
Map<String, dynamic> params = {
'name': name,
'roles': roles,
};
final Map<String, dynamic> params = {
'name': name,
'roles': roles,
};
return await this.client.call(HttpMethod.post, path: path, params: params);
return this.client.call(HttpMethod.post, path: path, params: params);
}
/// Get team by its unique ID. All team members have read access for this
/// resource.
Future<Response> get({@required String teamId}) async {
String path = '/teams/{teamId}'.replaceAll(RegExp('{teamId}'), teamId);
Future<Response> get({@required String teamId}) {
final String path = '/teams/{teamId}'.replaceAll(RegExp('{teamId}'), teamId);
Map<String, dynamic> params = {
};
final Map<String, dynamic> params = {
};
return await this.client.call(HttpMethod.get, path: path, params: params);
return this.client.call(HttpMethod.get, path: path, params: params);
}
/// Update team by its unique ID. Only team owners have write access for this
/// resource.
Future<Response> update({@required String teamId, @required String name}) async {
String path = '/teams/{teamId}'.replaceAll(RegExp('{teamId}'), teamId);
Future<Response> update({@required String teamId, @required String name}) {
final String path = '/teams/{teamId}'.replaceAll(RegExp('{teamId}'), teamId);
Map<String, dynamic> params = {
'name': name,
};
final Map<String, dynamic> params = {
'name': name,
};
return await this.client.call(HttpMethod.put, path: path, params: params);
return this.client.call(HttpMethod.put, path: path, params: params);
}
/// Delete team by its unique ID. Only team owners have write access for this
/// resource.
Future<Response> delete({@required String teamId}) async {
String path = '/teams/{teamId}'.replaceAll(RegExp('{teamId}'), teamId);
Future<Response> delete({@required String teamId}) {
final String path = '/teams/{teamId}'.replaceAll(RegExp('{teamId}'), teamId);
Map<String, dynamic> params = {
};
final Map<String, dynamic> params = {
};
return await this.client.call(HttpMethod.delete, path: path, params: params);
return this.client.call(HttpMethod.delete, path: path, params: params);
}
/// Get team members by the team unique ID. All team members have read access
/// for this list of resources.
Future<Response> getMemberships({@required String teamId}) async {
String path = '/teams/{teamId}/memberships'.replaceAll(RegExp('{teamId}'), teamId);
Future<Response> getMemberships({@required String teamId}) {
final String path = '/teams/{teamId}/memberships'.replaceAll(RegExp('{teamId}'), teamId);
Map<String, dynamic> params = {
};
final Map<String, dynamic> params = {
};
return await this.client.call(HttpMethod.get, path: path, params: params);
return this.client.call(HttpMethod.get, path: path, params: params);
}
/// 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
@ -94,40 +93,40 @@ 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<Response> createMembership({@required String teamId, @required String email, @required List roles, @required String url, String name = null}) async {
String path = '/teams/{teamId}/memberships'.replaceAll(RegExp('{teamId}'), teamId);
Future<Response> createMembership({@required String teamId, @required String email, @required List roles, @required String url, String name = null}) {
final String path = '/teams/{teamId}/memberships'.replaceAll(RegExp('{teamId}'), teamId);
Map<String, dynamic> params = {
'email': email,
'name': name,
'roles': roles,
'url': url,
};
final Map<String, dynamic> params = {
'email': email,
'name': name,
'roles': roles,
'url': url,
};
return await this.client.call(HttpMethod.post, path: path, params: params);
return this.client.call(HttpMethod.post, path: path, params: params);
}
/// 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<Response> deleteMembership({@required String teamId, @required String inviteId}) async {
String path = '/teams/{teamId}/memberships/{inviteId}'.replaceAll(RegExp('{teamId}'), teamId).replaceAll(RegExp('{inviteId}'), inviteId);
Future<Response> deleteMembership({@required String teamId, @required String inviteId}) {
final String path = '/teams/{teamId}/memberships/{inviteId}'.replaceAll(RegExp('{teamId}'), teamId).replaceAll(RegExp('{inviteId}'), inviteId);
Map<String, dynamic> params = {
};
final Map<String, dynamic> params = {
};
return await this.client.call(HttpMethod.delete, path: path, params: params);
return this.client.call(HttpMethod.delete, path: path, params: params);
}
/// 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<Response> updateMembershipStatus({@required String teamId, @required String inviteId, @required String userId, @required String secret}) async {
String path = '/teams/{teamId}/memberships/{inviteId}/status'.replaceAll(RegExp('{teamId}'), teamId).replaceAll(RegExp('{inviteId}'), inviteId);
Future<Response> 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);
Map<String, dynamic> params = {
'userId': userId,
'secret': secret,
};
final Map<String, dynamic> params = {
'userId': userId,
'secret': secret,
};
return await this.client.call(HttpMethod.patch, path: path, params: params);
return this.client.call(HttpMethod.patch, path: path, params: params);
}
}

View file

@ -1,11 +1,11 @@
name: appwrite
version: 0.0.7
version: 0.0.8
description: Appwrite backend as a service cuts up to 70% of the time and costs required for building a modern application. We abstract and simplify common development tasks behind a REST APIs, to help you develop your app in a fast and secure way. For full API documentation and tutorials go to [https://appwrite.io/docs](https://appwrite.io/docs)
author: Appwrite Team <team@appwrite.io>
homepage: https://github.com/appwrite/sdk-for-dart
environment:
sdk: '>=2.6.0 <3.0.0'
dependencies:
meta: ^1.1.8
dio: ^3.0.0
cookie_jar: ^1.0.0
dio_cookie_manager: ^1.0.0
dio_cookie_manager: ^1.0.0

View file

@ -0,0 +1 @@
# Change Log

View file

@ -3,7 +3,7 @@
![License](https://img.shields.io/github/license/appwrite/sdk-for-go.svg?v=1)
![Version](https://img.shields.io/badge/api%20version-0.5.3-blue.svg?v=1)
**This SDK is compatible with Appwrite server version . For older versions, please check previous releases.**
**This SDK is compatible with Appwrite server version 0.5.3. For older versions, please check previous releases.**
Appwrite backend as a service cuts up to 70% of the time and costs required for building a modern application. We abstract and simplify common development tasks behind a REST APIs, to help you develop your app in a fast and secure way. For full API documentation and tutorials go to [https://appwrite.io/docs](https://appwrite.io/docs)

View file

@ -0,0 +1 @@
# Change Log

View file

@ -0,0 +1 @@
# Change Log

View file

@ -0,0 +1 @@
# Change Log

View file

@ -3,7 +3,7 @@
![License](https://img.shields.io/github/license/appwrite/sdk-for-python.svg?v=1)
![Version](https://img.shields.io/badge/api%20version-0.5.3-blue.svg?v=1)
**This SDK is compatible with Appwrite server version . For older versions, please check previous releases.**
**This SDK is compatible with Appwrite server version 0.5.3. For older versions, please check previous releases.**
Appwrite backend as a service cuts up to 70% of the time and costs required for building a modern application. We abstract and simplify common development tasks behind a REST APIs, to help you develop your app in a fast and secure way. For full API documentation and tutorials go to [https://appwrite.io/docs](https://appwrite.io/docs)

View file

@ -0,0 +1 @@
# Change Log

View file

@ -3,7 +3,7 @@
![License](https://img.shields.io/github/license/appwrite/sdk-for-ruby.svg?v=1)
![Version](https://img.shields.io/badge/api%20version-0.5.3-blue.svg?v=1)
**This SDK is compatible with Appwrite server version . For older versions, please check previous releases.**
**This SDK is compatible with Appwrite server version 0.5.3. For older versions, please check previous releases.**
Appwrite backend as a service cuts up to 70% of the time and costs required for building a modern application. We abstract and simplify common development tasks behind a REST APIs, to help you develop your app in a fast and secure way. For full API documentation and tutorials go to [https://appwrite.io/docs](https://appwrite.io/docs)

View file

@ -0,0 +1 @@
# Change Log

View file

@ -31,6 +31,21 @@ To install with a CDN (content delivery network) add the following scripts to th
<script src="https://cdn.jsdelivr.net/npm/appwrite@1.0.29"></script>
```
## Getting Started
Initialise the Appwrite SDK in your code, and setup your API credentials:
```js
// Init your JS SDK
var appwrite = new Appwrite();
appwrite
.setEndpoint('http://localhost/v1') // Set only when using self-hosted solution
.setProject('455x34dfkj') // Your Appwrite Project UID
;
```
## Contribution

View file

@ -58,8 +58,10 @@ $cli
$result = realpath(__DIR__.'/..').'/sdks/'.$key.'-'.$language['key'];
$target = realpath(__DIR__.'/..').'/sdks/git/'.$language['key'].'/';
$readme = realpath(__DIR__ . '/../../docs/sdks/'.$language['key'].'.md');
$readme = realpath(__DIR__ . '/../../docs/sdks/'.$language['key'].'/README.md');
$readme = ($readme) ? file_get_contents($readme) : '';
$changelog = realpath(__DIR__ . '/../../docs/sdks/'.$language['key'].'/CHANGELOG.md');
$changelog = ($changelog) ? file_get_contents($changelog) : '# Change Log';
$warning = ($language['beta']) ? '**This SDK is compatible with Appwrite server version ' . $version . '. For older versions, please check previous releases.**' : '';
$license = 'BSD-3-Clause';
$licenseContent = 'Copyright (c) 2019 Appwrite (https://appwrite.io) and individual contributors.
@ -148,6 +150,7 @@ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
->setShareVia('appwrite_io')
->setWarning($warning)
->setReadme($readme)
->setChangelog($changelog)
;
try {

4
composer.lock generated
View file

@ -1622,7 +1622,7 @@
"source": {
"type": "git",
"url": "https://github.com/appwrite/sdk-generator",
"reference": "6b98e2620bf307f35070e883819e157fb24e2014"
"reference": "3b7389388f29c6e0cf53cf2233ee516fb20ad9f7"
},
"require": {
"ext-curl": "*",
@ -1652,7 +1652,7 @@
}
],
"description": "Appwrite PHP library for generating API SDKs for multiple programming languages and platforms",
"time": "2020-04-04T14:33:15+00:00"
"time": "2020-04-05T20:13:47+00:00"
},
{
"name": "doctrine/instantiator",

View file

@ -0,0 +1,4 @@
## 0.0.8
- Fixed compilation error in Client class
- Shorter description for package

View file

@ -0,0 +1 @@
# Change Log

View file

@ -0,0 +1 @@
# Change Log

View file

@ -0,0 +1 @@
# Change Log

View file

@ -0,0 +1 @@
# Change Log

View file

@ -0,0 +1 @@
# Change Log

View file

@ -0,0 +1 @@
# Change Log

View file

@ -0,0 +1 @@
# Change Log

View file

@ -0,0 +1 @@
# Change Log

View file

@ -0,0 +1 @@
# Change Log

View file

@ -0,0 +1 @@
# Change Log

View file

@ -0,0 +1 @@
# Change Log