feat: faster access checks

This commit is contained in:
Jason Rasmussen
2025-09-11 14:06:27 -04:00
parent 722a464e23
commit 42e1e0c66a
17 changed files with 324 additions and 101 deletions
+1
View File
@@ -68,6 +68,7 @@ part 'model/api_key_create_dto.dart';
part 'model/api_key_create_response_dto.dart';
part 'model/api_key_response_dto.dart';
part 'model/api_key_update_dto.dart';
part 'model/access_hint.dart';
part 'model/activity_create_dto.dart';
part 'model/activity_response_dto.dart';
part 'model/activity_statistics_response_dto.dart';
+10 -3
View File
@@ -1247,12 +1247,14 @@ class AssetsApi {
///
/// * [String] id (required):
///
/// * [AccessHint] hint:
///
/// * [String] key:
///
/// * [AssetMediaSize] size:
///
/// * [String] slug:
Future<Response> viewAssetWithHttpInfo(String id, { String? key, AssetMediaSize? size, String? slug, }) async {
Future<Response> viewAssetWithHttpInfo(String id, { AccessHint? hint, String? key, AssetMediaSize? size, String? slug, }) async {
// ignore: prefer_const_declarations
final apiPath = r'/assets/{id}/thumbnail'
.replaceAll('{id}', id);
@@ -1264,6 +1266,9 @@ class AssetsApi {
final headerParams = <String, String>{};
final formParams = <String, String>{};
if (hint != null) {
queryParams.addAll(_queryParams('', 'hint', hint));
}
if (key != null) {
queryParams.addAll(_queryParams('', 'key', key));
}
@@ -1294,13 +1299,15 @@ class AssetsApi {
///
/// * [String] id (required):
///
/// * [AccessHint] hint:
///
/// * [String] key:
///
/// * [AssetMediaSize] size:
///
/// * [String] slug:
Future<MultipartFile?> viewAsset(String id, { String? key, AssetMediaSize? size, String? slug, }) async {
final response = await viewAssetWithHttpInfo(id, key: key, size: size, slug: slug, );
Future<MultipartFile?> viewAsset(String id, { AccessHint? hint, String? key, AssetMediaSize? size, String? slug, }) async {
final response = await viewAssetWithHttpInfo(id, hint: hint, key: key, size: size, slug: slug, );
if (response.statusCode >= HttpStatus.badRequest) {
throw ApiException(response.statusCode, await _decodeBodyBytes(response));
}
+2
View File
@@ -190,6 +190,8 @@ class ApiClient {
return APIKeyResponseDto.fromJson(value);
case 'APIKeyUpdateDto':
return APIKeyUpdateDto.fromJson(value);
case 'AccessHint':
return AccessHintTypeTransformer().decode(value);
case 'ActivityCreateDto':
return ActivityCreateDto.fromJson(value);
case 'ActivityResponseDto':
+3
View File
@@ -55,6 +55,9 @@ String parameterToString(dynamic value) {
if (value is DateTime) {
return value.toUtc().toIso8601String();
}
if (value is AccessHint) {
return AccessHintTypeTransformer().encode(value).toString();
}
if (value is AlbumUserRole) {
return AlbumUserRoleTypeTransformer().encode(value).toString();
}
+91
View File
@@ -0,0 +1,91 @@
//
// AUTO-GENERATED FILE, DO NOT MODIFY!
//
// @dart=2.18
// ignore_for_file: unused_element, unused_import
// ignore_for_file: always_put_required_named_parameters_first
// ignore_for_file: constant_identifier_names
// ignore_for_file: lines_longer_than_80_chars
part of openapi.api;
class AccessHint {
/// Instantiate a new enum with the provided [value].
const AccessHint._(this.value);
/// The underlying value of this enum member.
final String value;
@override
String toString() => value;
String toJson() => value;
static const owner = AccessHint._(r'owner');
static const album = AccessHint._(r'album');
static const partner = AccessHint._(r'partner');
static const sharedLink = AccessHint._(r'sharedLink');
/// List of all possible values in this [enum][AccessHint].
static const values = <AccessHint>[
owner,
album,
partner,
sharedLink,
];
static AccessHint? fromJson(dynamic value) => AccessHintTypeTransformer().decode(value);
static List<AccessHint> listFromJson(dynamic json, {bool growable = false,}) {
final result = <AccessHint>[];
if (json is List && json.isNotEmpty) {
for (final row in json) {
final value = AccessHint.fromJson(row);
if (value != null) {
result.add(value);
}
}
}
return result.toList(growable: growable);
}
}
/// Transformation class that can [encode] an instance of [AccessHint] to String,
/// and [decode] dynamic data back to [AccessHint].
class AccessHintTypeTransformer {
factory AccessHintTypeTransformer() => _instance ??= const AccessHintTypeTransformer._();
const AccessHintTypeTransformer._();
String encode(AccessHint data) => data.value;
/// Decodes a [dynamic value][data] to a AccessHint.
///
/// If [allowNull] is true and the [dynamic value][data] cannot be decoded successfully,
/// then null is returned. However, if [allowNull] is false and the [dynamic value][data]
/// cannot be decoded successfully, then an [UnimplementedError] is thrown.
///
/// The [allowNull] is very handy when an API changes and a new enum value is added or removed,
/// and users are still using an old app with the old code.
AccessHint? decode(dynamic data, {bool allowNull = true}) {
if (data != null) {
switch (data) {
case r'owner': return AccessHint.owner;
case r'album': return AccessHint.album;
case r'partner': return AccessHint.partner;
case r'sharedLink': return AccessHint.sharedLink;
default:
if (!allowNull) {
throw ArgumentError('Unknown enum value to decode: $data');
}
}
}
return null;
}
/// Singleton [AccessHintTypeTransformer] instance.
static AccessHintTypeTransformer? _instance;
}