Documentation, Basic Login Workflow
This commit is contained in:
@@ -1,61 +1,51 @@
|
||||
import 'dart:async';
|
||||
|
||||
// ignore: uri_does_not_exist
|
||||
import 'cookie_client_stub.dart'
|
||||
// ignore: uri_does_not_exist
|
||||
if (dart.library.html) 'browser_cookie_client.dart'
|
||||
// ignore: uri_does_not_exist
|
||||
if (dart.library.io) 'io_cookie_client.dart';
|
||||
import 'package:imagini/api/cookie_client/cookie_client.dart'
|
||||
if (dart.library.html) 'package:imagini/api/cookie_client/browser_cookie_client.dart'
|
||||
if (dart.library.io) 'package:imagini/api/cookie_client/io_cookie_client.dart';
|
||||
|
||||
import 'package:meta/meta.dart';
|
||||
import 'package:imagini/core/storage_client/base_storage_client.dart';
|
||||
import 'package:graphql_flutter/graphql_flutter.dart';
|
||||
import 'package:imagini/graphql/imagini_graphql.dart';
|
||||
|
||||
class APIProvider{
|
||||
String _server, _accessToken, _refreshToken;
|
||||
|
||||
GraphQLClient _client;
|
||||
HttpLink httpLink;
|
||||
// CookieLink cookieLink;
|
||||
static const String _GRAPHQL_ENDPOINT = "/query";
|
||||
|
||||
APIProvider({
|
||||
@required String server,
|
||||
String accessToken,
|
||||
String refreshToken
|
||||
}) {
|
||||
_server = server;
|
||||
_accessToken = accessToken;
|
||||
_refreshToken = refreshToken;
|
||||
BaseStorageClient _storage;
|
||||
GraphQLClient _client;
|
||||
HttpLink httpLink;
|
||||
|
||||
APIProvider(BaseStorageClient storage) {
|
||||
_storage = storage;
|
||||
init();
|
||||
}
|
||||
|
||||
Future<void> init() async {
|
||||
String _server = await _storage.get("server");
|
||||
|
||||
httpLink = HttpLink(_server + _GRAPHQL_ENDPOINT,
|
||||
httpClient: getCookieClient(),
|
||||
httpClient: getCookieClient(_storage),
|
||||
);
|
||||
|
||||
// cookieLink = CookieLink(_updateAccessToken, _updateRefreshToken);
|
||||
_client = GraphQLClient(
|
||||
cache: GraphQLCache(),
|
||||
link: httpLink,
|
||||
);
|
||||
}
|
||||
|
||||
// void _updateAccessToken(_accessToken) {
|
||||
// print("Updating Access Token: $_accessToken");
|
||||
// this._accessToken = _accessToken;
|
||||
// }
|
||||
|
||||
// void _updateRefreshToken(_refreshToken) {
|
||||
// print("Updating Refresh Token: $_accessToken");
|
||||
// this._refreshToken = _refreshToken;
|
||||
// }
|
||||
|
||||
Future<Login$Query$AuthResponse> login([
|
||||
Future<QueryResult> login(
|
||||
String username,
|
||||
String password,
|
||||
]) async {
|
||||
String server,
|
||||
) async {
|
||||
assert(
|
||||
(username != null && password != null)
|
||||
(username != null && password != null && server != null)
|
||||
);
|
||||
|
||||
// Initialize Connection
|
||||
await _storage.set("server", server);
|
||||
await init();
|
||||
|
||||
QueryResult response = await _client.query(
|
||||
QueryOptions(
|
||||
document: LoginQuery().document,
|
||||
@@ -65,79 +55,27 @@ class APIProvider{
|
||||
},
|
||||
)
|
||||
);
|
||||
|
||||
final loginResponse = Login$Query.fromJson(response.data);
|
||||
return loginResponse.login;
|
||||
return response;
|
||||
}
|
||||
|
||||
Future<Me$Query$User> me() async {
|
||||
Future<QueryResult> me() async {
|
||||
QueryResult response = await _client.query(
|
||||
QueryOptions(
|
||||
document: MeQuery().document,
|
||||
)
|
||||
);
|
||||
|
||||
final meResponse = Me$Query.fromJson(response.data);
|
||||
return meResponse.me;
|
||||
return response;
|
||||
}
|
||||
|
||||
Future<String> mediaItems([
|
||||
String startDate,
|
||||
String endDate,
|
||||
String albumID,
|
||||
List<String> tagID,
|
||||
String type, // TODO: Make enum
|
||||
int page,
|
||||
]) async {
|
||||
// Query:
|
||||
// /api/v1/MediaItems
|
||||
// Derive Params:
|
||||
// startDate:
|
||||
// &createdAt=>2020-10-10T10:10:10
|
||||
// endDate:
|
||||
// &createdAt=<2020-10-10T10:10:10
|
||||
// albumID:
|
||||
// &albumID=9b1deb4d-3b7d-4bad-9bdd-2b0d7b3dcb6d
|
||||
// tagID:
|
||||
// &tagID=9b1deb4d-3b7d-4bad-9bdd-2b0d7b3dcb6d,9b1deb4d-3b7d-4bad-9bdd-2b0d7b3dcb6d
|
||||
// type:
|
||||
// &type=Photos
|
||||
// &type=Videos
|
||||
// page:
|
||||
// &page=4
|
||||
Future<QueryResult> mediaItems() async {
|
||||
QueryResult response = await _client.query(
|
||||
QueryOptions(
|
||||
document: MediaItemsQuery().document,
|
||||
)
|
||||
);
|
||||
|
||||
// Returns:
|
||||
// {
|
||||
//
|
||||
// }
|
||||
|
||||
return null;
|
||||
}
|
||||
|
||||
Future<String> tags([
|
||||
int page
|
||||
]) async {
|
||||
// Query:
|
||||
// /api/v1/Tags
|
||||
// Derive Params:
|
||||
// page:
|
||||
// &page=4
|
||||
return null;
|
||||
}
|
||||
|
||||
Future<String> albums([
|
||||
int page
|
||||
]) async {
|
||||
// Query:
|
||||
// /api/v1/Albums
|
||||
// Derive Params:
|
||||
// page:
|
||||
// &page=4
|
||||
return null;
|
||||
}
|
||||
|
||||
Future<String> me() async {
|
||||
return null;
|
||||
print(response);
|
||||
return response;
|
||||
}
|
||||
|
||||
void dispose() {}
|
||||
|
||||
@@ -1,30 +0,0 @@
|
||||
import 'package:http/browser_client.dart';
|
||||
import "package:http/http.dart";
|
||||
|
||||
BaseClient getCookieClient() => ClientWithCookies();
|
||||
|
||||
class ClientWithCookies extends BrowserClient {
|
||||
String _accessToken = "asdasdasd";
|
||||
String _refreshToken;
|
||||
|
||||
@override
|
||||
Future<StreamedResponse> send(BaseRequest request) async {
|
||||
request.headers.addAll({
|
||||
'X-Imagini-AccessToken': _accessToken,
|
||||
'X-Imagini-RefreshToken': _refreshToken,
|
||||
});
|
||||
|
||||
return super.send(request).then((response) {
|
||||
if (response.headers.containsKey("x-imagini-accesstoken")) {
|
||||
this._accessToken = response.headers["x-imagini-accesstoken"];
|
||||
}
|
||||
if (response.headers.containsKey("x-imagini-refreshtoken")) {
|
||||
this._refreshToken = response.headers["x-imagini-refreshtoken"];
|
||||
}
|
||||
|
||||
print("Access Token: $_accessToken");
|
||||
print("Refresh Token: $_refreshToken");
|
||||
return response;
|
||||
});
|
||||
}
|
||||
}
|
||||
36
web_native/lib/api/cookie_client/browser_cookie_client.dart
Normal file
36
web_native/lib/api/cookie_client/browser_cookie_client.dart
Normal file
@@ -0,0 +1,36 @@
|
||||
import 'package:http/browser_client.dart';
|
||||
import "package:http/http.dart";
|
||||
import "package:imagini/core/storage_client/base_storage_client.dart";
|
||||
|
||||
BaseClient getCookieClient(storage) => ClientWithCookies(storage);
|
||||
|
||||
class ClientWithCookies extends BrowserClient {
|
||||
BaseStorageClient _storage;
|
||||
|
||||
ClientWithCookies(BaseStorageClient storage) {
|
||||
_storage = storage;
|
||||
}
|
||||
|
||||
@override
|
||||
Future<StreamedResponse> send(BaseRequest request) async {
|
||||
String _accessToken = await _storage.get("accessToken");
|
||||
String _refreshToken = await _storage.get("refreshToken");
|
||||
|
||||
request.headers.addAll({
|
||||
'X-Imagini-AccessToken': _accessToken,
|
||||
'X-Imagini-RefreshToken': _refreshToken,
|
||||
});
|
||||
|
||||
return super.send(request).then((response) async {
|
||||
// We've been told to update our access token
|
||||
if (response.headers.containsKey("x-imagini-accesstoken")) {
|
||||
await _storage.set("accessToken", response.headers["x-imagini-accesstoken"]);
|
||||
}
|
||||
// We've been told to update our refresh token
|
||||
if (response.headers.containsKey("x-imagini-refreshtoken")) {
|
||||
await _storage.set("refreshToken", response.headers["x-imagini-refreshtoken"]);
|
||||
}
|
||||
return response;
|
||||
});
|
||||
}
|
||||
}
|
||||
@@ -1,4 +1,4 @@
|
||||
import 'package:http/http.dart';
|
||||
|
||||
BaseClient getCookieClient() => throw UnsupportedError(
|
||||
BaseClient getCookieClient(storage) => throw UnsupportedError(
|
||||
'Cannot create a client without dart:html or dart:io.');
|
||||
43
web_native/lib/api/cookie_client/io_cookie_client.dart
Normal file
43
web_native/lib/api/cookie_client/io_cookie_client.dart
Normal file
@@ -0,0 +1,43 @@
|
||||
import 'package:http/io_client.dart';
|
||||
import "package:http/http.dart";
|
||||
import "package:imagini/core/storage_client/base_storage_client.dart";
|
||||
|
||||
BaseClient getCookieClient(storage) => IOClientWithCookies(storage);
|
||||
|
||||
class IOClientWithCookies extends IOClient {
|
||||
BaseStorageClient _storage;
|
||||
|
||||
IOClientWithCookies(BaseStorageClient storage) {
|
||||
_storage = storage;
|
||||
}
|
||||
|
||||
@override
|
||||
Future<IOStreamedResponse> send(BaseRequest request) async {
|
||||
String _accessToken = await _storage.get("accessToken");
|
||||
String _refreshToken = await _storage.get("refreshToken");
|
||||
|
||||
request.headers.addAll({
|
||||
'X-Imagini-AccessToken': _accessToken,
|
||||
'X-Imagini-RefreshToken': _refreshToken,
|
||||
});
|
||||
|
||||
return super.send(request).then((response) async {
|
||||
// We've been told to update our access token
|
||||
if (response.headers.containsKey("x-imagini-accesstoken")) {
|
||||
await _storage.set("accessToken", response.headers["x-imagini-accesstoken"]);
|
||||
}
|
||||
// We've been told to update our refresh token
|
||||
if (response.headers.containsKey("x-imagini-refreshtoken")) {
|
||||
await _storage.set("refreshToken", response.headers["x-imagini-refreshtoken"]);
|
||||
}
|
||||
|
||||
_accessToken = await _storage.get("accessToken");
|
||||
_refreshToken = await _storage.get("refreshToken");
|
||||
|
||||
print("Access Token: $_accessToken");
|
||||
print("Refresh Token: $_refreshToken");
|
||||
|
||||
return response;
|
||||
});
|
||||
}
|
||||
}
|
||||
@@ -1,12 +1,35 @@
|
||||
import 'dart:async';
|
||||
import 'package:imagini/api/api_provider.dart';
|
||||
import 'package:imagini/graphql/imagini_graphql.dart';
|
||||
import 'package:graphql_flutter/graphql_flutter.dart';
|
||||
|
||||
class ImaginiAPIRepository {
|
||||
APIProvider _apiProvider;
|
||||
|
||||
ImaginiAPIRepository(this._apiProvider);
|
||||
|
||||
Stream<Login$Query$AuthResponse> login(String user, password) {
|
||||
return Stream.fromFuture(_apiProvider.login(user, password));
|
||||
Stream<bool> login(String user, password, server) {
|
||||
return Stream.fromFuture(_apiProvider.login(user, password, server).then((QueryResult resp) {
|
||||
if (resp.exception != null)
|
||||
return false;
|
||||
|
||||
final loginResponse = Login$Query.fromJson(resp.data);
|
||||
if (loginResponse.login.result == AuthResult.failure)
|
||||
return false;
|
||||
|
||||
return true;
|
||||
}));
|
||||
}
|
||||
|
||||
Stream<QueryResult> me() {
|
||||
return Stream.fromFuture(_apiProvider.me());
|
||||
}
|
||||
|
||||
Stream<bool> isAuthenticated() {
|
||||
return Stream.fromFuture(_apiProvider.me().then((QueryResult resp) {
|
||||
if (resp.exception != null)
|
||||
return false;
|
||||
return true;
|
||||
}));
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,28 +0,0 @@
|
||||
import 'package:http/io_client.dart';
|
||||
import "package:http/http.dart";
|
||||
|
||||
BaseClient getCookieClient() => IOClientWithCookies();
|
||||
|
||||
class IOClientWithCookies extends IOClient {
|
||||
String _accessToken;
|
||||
String _refreshToken;
|
||||
|
||||
@override
|
||||
Future<IOStreamedResponse> send(BaseRequest request) async {
|
||||
// String cookie = await getCookie();
|
||||
// String getCookieString(String _) => cookie;
|
||||
// request.headers.update('cookie', getCookieString);
|
||||
return super.send(request).then((response) {
|
||||
if (response.headers.containsKey("x-imagini-accesstoken")) {
|
||||
this._accessToken = response.headers["x-imagini-accesstoken"];
|
||||
}
|
||||
if (response.headers.containsKey("x-imagini-refreshtoken")) {
|
||||
this._refreshToken = response.headers["x-imagini-refreshtoken"];
|
||||
}
|
||||
|
||||
print("Access Token: $_accessToken");
|
||||
print("Refresh Token: $_refreshToken");
|
||||
return response;
|
||||
});
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user