Files
sdk-for-flutter/lib/services/databases.dart

253 lines
7.9 KiB
Dart

part of '../appwrite.dart';
/// The Databases service allows you to create structured collections of
/// documents, query and filter lists of documents
class Databases extends Service {
/// Initializes a [Databases] service
Databases(super.client);
/// Get a list of all the user's documents in a given collection. You can use
/// the query params to filter your results.
Future<models.DocumentList> listDocuments({
required String databaseId,
required String collectionId,
List<String>? queries,
}) async {
final String apiPath =
'/databases/{databaseId}/collections/{collectionId}/documents'
.replaceAll('{databaseId}', databaseId)
.replaceAll('{collectionId}', collectionId);
final Map<String, dynamic> apiParams = {'queries': queries};
final Map<String, String> apiHeaders = {};
final res = await client.call(
HttpMethod.get,
path: apiPath,
params: apiParams,
headers: apiHeaders,
);
return models.DocumentList.fromMap(res.data);
}
/// Create a new Document. Before using this route, you should create a new
/// collection resource using either a [server
/// integration](https://appwrite.io/docs/server/databases#databasesCreateCollection)
/// API or directly from your database console.
Future<models.Document> createDocument({
required String databaseId,
required String collectionId,
required String documentId,
required Map data,
List<String>? permissions,
}) async {
final String apiPath =
'/databases/{databaseId}/collections/{collectionId}/documents'
.replaceAll('{databaseId}', databaseId)
.replaceAll('{collectionId}', collectionId);
final Map<String, dynamic> apiParams = {
'documentId': documentId,
'data': data,
'permissions': permissions,
};
final Map<String, String> apiHeaders = {'content-type': 'application/json'};
final res = await client.call(
HttpMethod.post,
path: apiPath,
params: apiParams,
headers: apiHeaders,
);
return models.Document.fromMap(res.data);
}
/// Get a document by its unique ID. This endpoint response returns a JSON
/// object with the document data.
Future<models.Document> getDocument({
required String databaseId,
required String collectionId,
required String documentId,
List<String>? queries,
}) async {
final String apiPath =
'/databases/{databaseId}/collections/{collectionId}/documents/{documentId}'
.replaceAll('{databaseId}', databaseId)
.replaceAll('{collectionId}', collectionId)
.replaceAll('{documentId}', documentId);
final Map<String, dynamic> apiParams = {'queries': queries};
final Map<String, String> apiHeaders = {};
final res = await client.call(
HttpMethod.get,
path: apiPath,
params: apiParams,
headers: apiHeaders,
);
return models.Document.fromMap(res.data);
}
/// **WARNING: Experimental Feature** - This endpoint is experimental and not
/// yet officially supported. It may be subject to breaking changes or removal
/// in future versions.
///
/// Create or update a Document. Before using this route, you should create a
/// new collection resource using either a [server
/// integration](https://appwrite.io/docs/server/databases#databasesCreateCollection)
/// API or directly from your database console.
Future<models.Document> upsertDocument({
required String databaseId,
required String collectionId,
required String documentId,
required Map data,
List<String>? permissions,
}) async {
final String apiPath =
'/databases/{databaseId}/collections/{collectionId}/documents/{documentId}'
.replaceAll('{databaseId}', databaseId)
.replaceAll('{collectionId}', collectionId)
.replaceAll('{documentId}', documentId);
final Map<String, dynamic> apiParams = {
'data': data,
'permissions': permissions,
};
final Map<String, String> apiHeaders = {'content-type': 'application/json'};
final res = await client.call(
HttpMethod.put,
path: apiPath,
params: apiParams,
headers: apiHeaders,
);
return models.Document.fromMap(res.data);
}
/// Update a document by its unique ID. Using the patch method you can pass
/// only specific fields that will get updated.
Future<models.Document> updateDocument({
required String databaseId,
required String collectionId,
required String documentId,
Map? data,
List<String>? permissions,
}) async {
final String apiPath =
'/databases/{databaseId}/collections/{collectionId}/documents/{documentId}'
.replaceAll('{databaseId}', databaseId)
.replaceAll('{collectionId}', collectionId)
.replaceAll('{documentId}', documentId);
final Map<String, dynamic> apiParams = {
'data': data,
'permissions': permissions,
};
final Map<String, String> apiHeaders = {'content-type': 'application/json'};
final res = await client.call(
HttpMethod.patch,
path: apiPath,
params: apiParams,
headers: apiHeaders,
);
return models.Document.fromMap(res.data);
}
/// Delete a document by its unique ID.
Future deleteDocument({
required String databaseId,
required String collectionId,
required String documentId,
}) async {
final String apiPath =
'/databases/{databaseId}/collections/{collectionId}/documents/{documentId}'
.replaceAll('{databaseId}', databaseId)
.replaceAll('{collectionId}', collectionId)
.replaceAll('{documentId}', documentId);
final Map<String, dynamic> apiParams = {};
final Map<String, String> apiHeaders = {'content-type': 'application/json'};
final res = await client.call(
HttpMethod.delete,
path: apiPath,
params: apiParams,
headers: apiHeaders,
);
return res.data;
}
/// Decrement a specific attribute of a document by a given value.
Future<models.Document> decrementDocumentAttribute({
required String databaseId,
required String collectionId,
required String documentId,
required String attribute,
double? value,
double? min,
}) async {
final String apiPath =
'/databases/{databaseId}/collections/{collectionId}/documents/{documentId}/{attribute}/decrement'
.replaceAll('{databaseId}', databaseId)
.replaceAll('{collectionId}', collectionId)
.replaceAll('{documentId}', documentId)
.replaceAll('{attribute}', attribute);
final Map<String, dynamic> apiParams = {'value': value, 'min': min};
final Map<String, String> apiHeaders = {'content-type': 'application/json'};
final res = await client.call(
HttpMethod.patch,
path: apiPath,
params: apiParams,
headers: apiHeaders,
);
return models.Document.fromMap(res.data);
}
/// Increment a specific attribute of a document by a given value.
Future<models.Document> incrementDocumentAttribute({
required String databaseId,
required String collectionId,
required String documentId,
required String attribute,
double? value,
double? max,
}) async {
final String apiPath =
'/databases/{databaseId}/collections/{collectionId}/documents/{documentId}/{attribute}/increment'
.replaceAll('{databaseId}', databaseId)
.replaceAll('{collectionId}', collectionId)
.replaceAll('{documentId}', documentId)
.replaceAll('{attribute}', attribute);
final Map<String, dynamic> apiParams = {'value': value, 'max': max};
final Map<String, String> apiHeaders = {'content-type': 'application/json'};
final res = await client.call(
HttpMethod.patch,
path: apiPath,
params: apiParams,
headers: apiHeaders,
);
return models.Document.fromMap(res.data);
}
}