diff --git a/lib/api/client.dart b/lib/api/client.dart index 20d90de..7799d4c 100644 --- a/lib/api/client.dart +++ b/lib/api/client.dart @@ -51,7 +51,12 @@ abstract class _EHApi { @DELETE('/token') Future> deleteToken({@Query("token") String? token}); @GET('/token') - Future> getToken({@Query("token") String? token}); + Future> getToken({@Query("token") String? token}); + + @GET('/file/{id}') + Future getFile(@Path("id") int id); + @GET('/file/random') + Future getRandomFile({@Query("is_nsfw") bool? isNsfw, @Query("is_ad") bool? isAd, @Query("thumb") bool? thumb}); } class EHApi extends __EHApi { diff --git a/lib/api/client.g.dart b/lib/api/client.g.dart index bb018f5..514ca3b 100644 --- a/lib/api/client.g.dart +++ b/lib/api/client.g.dart @@ -203,14 +203,14 @@ class __EHApi implements _EHApi { } @override - Future> getToken({String? token}) async { + Future> getToken({String? token}) async { const _extra = {}; final queryParameters = {r'token': token}; queryParameters.removeWhere((k, v) => v == null); final _headers = {}; final Map? _data = null; - final _result = await _dio - .fetch>(_setStreamType>(Options( + final _result = await _dio.fetch>( + _setStreamType>(Options( method: 'GET', headers: _headers, extra: _extra, @@ -226,13 +226,78 @@ class __EHApi implements _EHApi { _dio.options.baseUrl, baseUrl, )))); - final value = ApiResult.fromJson( + final value = ApiResult.fromJson( _result.data!, - (json) => Token.fromJson(json as Map), + (json) => TokenWithUserInfo.fromJson(json as Map), ); return value; } + @override + Future> getFile(int id) async { + const _extra = {}; + final queryParameters = {}; + final _headers = {}; + final Map? _data = null; + final _result = + await _dio.fetch(_setStreamType>(Options( + method: 'GET', + headers: _headers, + extra: _extra, + ) + .compose( + _dio.options, + '/file/${id}', + queryParameters: queryParameters, + data: _data, + ) + .copyWith( + baseUrl: _combineBaseUrls( + _dio.options.baseUrl, + baseUrl, + )))); + final value = _result.data; + final httpResponse = HttpResponse(value, _result); + return httpResponse; + } + + @override + Future> getRandomFile({ + bool? isNsfw, + bool? isAd, + bool? thumb, + }) async { + const _extra = {}; + final queryParameters = { + r'is_nsfw': isNsfw, + r'is_ad': isAd, + r'thumb': thumb, + }; + queryParameters.removeWhere((k, v) => v == null); + final _headers = {}; + final Map? _data = null; + final _result = + await _dio.fetch(_setStreamType>(Options( + method: 'GET', + headers: _headers, + extra: _extra, + ) + .compose( + _dio.options, + '/file/random', + queryParameters: queryParameters, + data: _data, + ) + .copyWith( + baseUrl: _combineBaseUrls( + _dio.options.baseUrl, + baseUrl, + )))); + final value = _result.data; + final httpResponse = HttpResponse(value, _result); + return httpResponse; + } + RequestOptions _setStreamType(RequestOptions requestOptions) { if (T != dynamic && !(requestOptions.responseType == ResponseType.bytes || diff --git a/lib/api/token.dart b/lib/api/token.dart index 8e8eef7..cd8dce0 100644 --- a/lib/api/token.dart +++ b/lib/api/token.dart @@ -1,4 +1,5 @@ import 'package:json_annotation/json_annotation.dart'; +import 'user.dart'; part 'token.g.dart'; @@ -25,3 +26,20 @@ class Token { factory Token.fromJson(Map json) => _$TokenFromJson(json); Map toJson() => _$TokenToJson(this); } + +@JsonSerializable() +class TokenWithUserInfo { + const TokenWithUserInfo({ + required this.token, + required this.name, + required this.isAdmin, + required this.permissions, + }); + final Token token; + final String name; + @JsonKey(name: 'is_admin') + final bool isAdmin; + final UserPermission permissions; + factory TokenWithUserInfo.fromJson(Map json) => _$TokenWithUserInfoFromJson(json); + Map toJson() => _$TokenWithUserInfoToJson(this); +} diff --git a/lib/api/token.g.dart b/lib/api/token.g.dart index 3f9aec2..d991315 100644 --- a/lib/api/token.g.dart +++ b/lib/api/token.g.dart @@ -23,3 +23,26 @@ Map _$TokenToJson(Token instance) => { 'http_only': instance.httpOnly, 'secure': instance.secure, }; + +TokenWithUserInfo _$TokenWithUserInfoFromJson(Map json) => + TokenWithUserInfo( + token: Token.fromJson(json['token'] as Map), + name: json['name'] as String, + isAdmin: json['is_admin'] as bool, + permissions: $enumDecode(_$UserPermissionEnumMap, json['permissions']), + ); + +Map _$TokenWithUserInfoToJson(TokenWithUserInfo instance) => + { + 'token': instance.token, + 'name': instance.name, + 'is_admin': instance.isAdmin, + 'permissions': _$UserPermissionEnumMap[instance.permissions]!, + }; + +const _$UserPermissionEnumMap = { + UserPermission.none: 0, + UserPermission.readGallery: 1, + UserPermission.editGallery: 2, + UserPermission.all: 3, +};