You've already forked immich
mirror of
https://github.com/immich-app/immich.git
synced 2025-08-09 23:17:29 +02:00
feat(server): Import face regions from metadata (#6455)
* feat: faces-from-metadata - Import face regions from metadata Implements immich-app#1692. - OpenAPI spec changes to accomodate metadata face import configs. New settings to enable the feature. - Updates admin UI compoments - ML faces detection/recognition & Exif/Metadata faces compatibility Signed-off-by: BugFest <bugfest.dev@pm.me> * chore(web): remove unused file confirm-enable-import-faces * chore(web): format metadata-settings * fix(server): faces-from-metadata tests and format * fix(server): code refinements, nullable face asset sourceType * fix(server): Add RegionInfo to ImmichTags interface * fix(server): deleteAllFaces sourceType param can be undefined * fix(server): exiftool-vendored 27.0.0 moves readArgs into ExifToolOptions * fix(server): rename isImportFacesFromMetadataEnabled to isFaceImportEnabled * fix(server): simplify sourceType conditional * fix(server): small fixes * fix(server): handling sourceType * fix(server): sourceType enum * fix(server): refactor metadata applyTaggedFaces * fix(server): create/update signature changes * fix(server): reduce computational cost of Person.getManyByName * fix(server): use faceList instead of faceSet * fix(server): Skip regions without Name defined * fix(mobile): Update open-api (face assets feature changes) * fix(server): Face-Person reconciliation with map/index * fix(server): tags.RegionInfo.AppliedToDimensions must be defined to process face-region * fix(server): fix shared-link.service.ts format * fix(mobile): Update open-api after branch update * simplify * fix(server): minor fixes * fix(server): person create/update methods type enforcement * fix(server): style fixes * fix(server): remove unused metadata code * fix(server): metadata faces unit tests * fix(server): top level config metadata category * fix(server): rename upsertFaces to replaceFaces * fix(server): remove sourceType when unnecessary * fix(server): sourceType as ENUM * fix(server): format fixes * fix(server): fix tests after sourceType ENUM change * fix(server): remove unnecessary JobItem cast * fix(server): fix asset enum imports * fix(open-api): add metadata config * fix(mobile): update open-api after metadata open-api spec changes * fix(web): update web/api metadata config * fix(server): remove duplicated sourceType def * fix(server): update generated sql queries * fix(e2e): tests for metadata face import feature * fix(web): Fix check:typescript * fix(e2e): update subproject ref * fix(server): revert format changes to pass format checks after ci * fix(mobile): update open-api * fix(server,movile,open-api,mobile): sourceType as DB data type * fix(e2e): upload face asset after enabling metadata face import * fix(web): simplify metadata admin settings and i18n keys * Update person.repository.ts Co-authored-by: Jason Rasmussen <jason@rasm.me> * fix(server): asset_faces.sourceType column not nullable * fix(server): simplified syntax * fix(e2e): use SDK for everything except the endpoint being tested * fix(e2e): fix test format * chore: clean up * chore: clean up * chore: update e2e/test-assets --------- Signed-off-by: BugFest <bugfest.dev@pm.me> Co-authored-by: mertalev <101130780+mertalev@users.noreply.github.com> Co-authored-by: Jason Rasmussen <jason@rasm.me>
This commit is contained in:
3
mobile/openapi/lib/api.dart
generated
3
mobile/openapi/lib/api.dart
generated
@@ -221,11 +221,13 @@ part 'model/shared_link_type.dart';
|
||||
part 'model/sign_up_dto.dart';
|
||||
part 'model/smart_info_response_dto.dart';
|
||||
part 'model/smart_search_dto.dart';
|
||||
part 'model/source_type.dart';
|
||||
part 'model/stack_create_dto.dart';
|
||||
part 'model/stack_response_dto.dart';
|
||||
part 'model/stack_update_dto.dart';
|
||||
part 'model/system_config_dto.dart';
|
||||
part 'model/system_config_f_fmpeg_dto.dart';
|
||||
part 'model/system_config_faces_dto.dart';
|
||||
part 'model/system_config_image_dto.dart';
|
||||
part 'model/system_config_job_dto.dart';
|
||||
part 'model/system_config_library_dto.dart';
|
||||
@@ -234,6 +236,7 @@ part 'model/system_config_library_watch_dto.dart';
|
||||
part 'model/system_config_logging_dto.dart';
|
||||
part 'model/system_config_machine_learning_dto.dart';
|
||||
part 'model/system_config_map_dto.dart';
|
||||
part 'model/system_config_metadata_dto.dart';
|
||||
part 'model/system_config_new_version_check_dto.dart';
|
||||
part 'model/system_config_notifications_dto.dart';
|
||||
part 'model/system_config_o_auth_dto.dart';
|
||||
|
6
mobile/openapi/lib/api_client.dart
generated
6
mobile/openapi/lib/api_client.dart
generated
@@ -497,6 +497,8 @@ class ApiClient {
|
||||
return SmartInfoResponseDto.fromJson(value);
|
||||
case 'SmartSearchDto':
|
||||
return SmartSearchDto.fromJson(value);
|
||||
case 'SourceType':
|
||||
return SourceTypeTypeTransformer().decode(value);
|
||||
case 'StackCreateDto':
|
||||
return StackCreateDto.fromJson(value);
|
||||
case 'StackResponseDto':
|
||||
@@ -507,6 +509,8 @@ class ApiClient {
|
||||
return SystemConfigDto.fromJson(value);
|
||||
case 'SystemConfigFFmpegDto':
|
||||
return SystemConfigFFmpegDto.fromJson(value);
|
||||
case 'SystemConfigFacesDto':
|
||||
return SystemConfigFacesDto.fromJson(value);
|
||||
case 'SystemConfigImageDto':
|
||||
return SystemConfigImageDto.fromJson(value);
|
||||
case 'SystemConfigJobDto':
|
||||
@@ -523,6 +527,8 @@ class ApiClient {
|
||||
return SystemConfigMachineLearningDto.fromJson(value);
|
||||
case 'SystemConfigMapDto':
|
||||
return SystemConfigMapDto.fromJson(value);
|
||||
case 'SystemConfigMetadataDto':
|
||||
return SystemConfigMetadataDto.fromJson(value);
|
||||
case 'SystemConfigNewVersionCheckDto':
|
||||
return SystemConfigNewVersionCheckDto.fromJson(value);
|
||||
case 'SystemConfigNotificationsDto':
|
||||
|
3
mobile/openapi/lib/api_helper.dart
generated
3
mobile/openapi/lib/api_helper.dart
generated
@@ -127,6 +127,9 @@ String parameterToString(dynamic value) {
|
||||
if (value is SharedLinkType) {
|
||||
return SharedLinkTypeTypeTransformer().encode(value).toString();
|
||||
}
|
||||
if (value is SourceType) {
|
||||
return SourceTypeTypeTransformer().encode(value).toString();
|
||||
}
|
||||
if (value is TimeBucketSize) {
|
||||
return TimeBucketSizeTypeTransformer().encode(value).toString();
|
||||
}
|
||||
|
@@ -21,6 +21,7 @@ class AssetFaceResponseDto {
|
||||
required this.imageHeight,
|
||||
required this.imageWidth,
|
||||
required this.person,
|
||||
this.sourceType,
|
||||
});
|
||||
|
||||
int boundingBoxX1;
|
||||
@@ -39,6 +40,14 @@ class AssetFaceResponseDto {
|
||||
|
||||
PersonResponseDto? person;
|
||||
|
||||
///
|
||||
/// Please note: This property should have been non-nullable! Since the specification file
|
||||
/// does not include a default value (using the "default:" property), however, the generated
|
||||
/// source code must fall back to having a nullable type.
|
||||
/// Consider adding a "default:" property in the specification file to hide this note.
|
||||
///
|
||||
SourceType? sourceType;
|
||||
|
||||
@override
|
||||
bool operator ==(Object other) => identical(this, other) || other is AssetFaceResponseDto &&
|
||||
other.boundingBoxX1 == boundingBoxX1 &&
|
||||
@@ -48,7 +57,8 @@ class AssetFaceResponseDto {
|
||||
other.id == id &&
|
||||
other.imageHeight == imageHeight &&
|
||||
other.imageWidth == imageWidth &&
|
||||
other.person == person;
|
||||
other.person == person &&
|
||||
other.sourceType == sourceType;
|
||||
|
||||
@override
|
||||
int get hashCode =>
|
||||
@@ -60,10 +70,11 @@ class AssetFaceResponseDto {
|
||||
(id.hashCode) +
|
||||
(imageHeight.hashCode) +
|
||||
(imageWidth.hashCode) +
|
||||
(person == null ? 0 : person!.hashCode);
|
||||
(person == null ? 0 : person!.hashCode) +
|
||||
(sourceType == null ? 0 : sourceType!.hashCode);
|
||||
|
||||
@override
|
||||
String toString() => 'AssetFaceResponseDto[boundingBoxX1=$boundingBoxX1, boundingBoxX2=$boundingBoxX2, boundingBoxY1=$boundingBoxY1, boundingBoxY2=$boundingBoxY2, id=$id, imageHeight=$imageHeight, imageWidth=$imageWidth, person=$person]';
|
||||
String toString() => 'AssetFaceResponseDto[boundingBoxX1=$boundingBoxX1, boundingBoxX2=$boundingBoxX2, boundingBoxY1=$boundingBoxY1, boundingBoxY2=$boundingBoxY2, id=$id, imageHeight=$imageHeight, imageWidth=$imageWidth, person=$person, sourceType=$sourceType]';
|
||||
|
||||
Map<String, dynamic> toJson() {
|
||||
final json = <String, dynamic>{};
|
||||
@@ -79,6 +90,11 @@ class AssetFaceResponseDto {
|
||||
} else {
|
||||
// json[r'person'] = null;
|
||||
}
|
||||
if (this.sourceType != null) {
|
||||
json[r'sourceType'] = this.sourceType;
|
||||
} else {
|
||||
// json[r'sourceType'] = null;
|
||||
}
|
||||
return json;
|
||||
}
|
||||
|
||||
@@ -98,6 +114,7 @@ class AssetFaceResponseDto {
|
||||
imageHeight: mapValueOfType<int>(json, r'imageHeight')!,
|
||||
imageWidth: mapValueOfType<int>(json, r'imageWidth')!,
|
||||
person: PersonResponseDto.fromJson(json[r'person']),
|
||||
sourceType: SourceType.fromJson(json[r'sourceType']),
|
||||
);
|
||||
}
|
||||
return null;
|
||||
|
@@ -20,6 +20,7 @@ class AssetFaceWithoutPersonResponseDto {
|
||||
required this.id,
|
||||
required this.imageHeight,
|
||||
required this.imageWidth,
|
||||
this.sourceType,
|
||||
});
|
||||
|
||||
int boundingBoxX1;
|
||||
@@ -36,6 +37,14 @@ class AssetFaceWithoutPersonResponseDto {
|
||||
|
||||
int imageWidth;
|
||||
|
||||
///
|
||||
/// Please note: This property should have been non-nullable! Since the specification file
|
||||
/// does not include a default value (using the "default:" property), however, the generated
|
||||
/// source code must fall back to having a nullable type.
|
||||
/// Consider adding a "default:" property in the specification file to hide this note.
|
||||
///
|
||||
SourceType? sourceType;
|
||||
|
||||
@override
|
||||
bool operator ==(Object other) => identical(this, other) || other is AssetFaceWithoutPersonResponseDto &&
|
||||
other.boundingBoxX1 == boundingBoxX1 &&
|
||||
@@ -44,7 +53,8 @@ class AssetFaceWithoutPersonResponseDto {
|
||||
other.boundingBoxY2 == boundingBoxY2 &&
|
||||
other.id == id &&
|
||||
other.imageHeight == imageHeight &&
|
||||
other.imageWidth == imageWidth;
|
||||
other.imageWidth == imageWidth &&
|
||||
other.sourceType == sourceType;
|
||||
|
||||
@override
|
||||
int get hashCode =>
|
||||
@@ -55,10 +65,11 @@ class AssetFaceWithoutPersonResponseDto {
|
||||
(boundingBoxY2.hashCode) +
|
||||
(id.hashCode) +
|
||||
(imageHeight.hashCode) +
|
||||
(imageWidth.hashCode);
|
||||
(imageWidth.hashCode) +
|
||||
(sourceType == null ? 0 : sourceType!.hashCode);
|
||||
|
||||
@override
|
||||
String toString() => 'AssetFaceWithoutPersonResponseDto[boundingBoxX1=$boundingBoxX1, boundingBoxX2=$boundingBoxX2, boundingBoxY1=$boundingBoxY1, boundingBoxY2=$boundingBoxY2, id=$id, imageHeight=$imageHeight, imageWidth=$imageWidth]';
|
||||
String toString() => 'AssetFaceWithoutPersonResponseDto[boundingBoxX1=$boundingBoxX1, boundingBoxX2=$boundingBoxX2, boundingBoxY1=$boundingBoxY1, boundingBoxY2=$boundingBoxY2, id=$id, imageHeight=$imageHeight, imageWidth=$imageWidth, sourceType=$sourceType]';
|
||||
|
||||
Map<String, dynamic> toJson() {
|
||||
final json = <String, dynamic>{};
|
||||
@@ -69,6 +80,11 @@ class AssetFaceWithoutPersonResponseDto {
|
||||
json[r'id'] = this.id;
|
||||
json[r'imageHeight'] = this.imageHeight;
|
||||
json[r'imageWidth'] = this.imageWidth;
|
||||
if (this.sourceType != null) {
|
||||
json[r'sourceType'] = this.sourceType;
|
||||
} else {
|
||||
// json[r'sourceType'] = null;
|
||||
}
|
||||
return json;
|
||||
}
|
||||
|
||||
@@ -87,6 +103,7 @@ class AssetFaceWithoutPersonResponseDto {
|
||||
id: mapValueOfType<String>(json, r'id')!,
|
||||
imageHeight: mapValueOfType<int>(json, r'imageHeight')!,
|
||||
imageWidth: mapValueOfType<int>(json, r'imageWidth')!,
|
||||
sourceType: SourceType.fromJson(json[r'sourceType']),
|
||||
);
|
||||
}
|
||||
return null;
|
||||
|
10
mobile/openapi/lib/model/server_features_dto.dart
generated
10
mobile/openapi/lib/model/server_features_dto.dart
generated
@@ -17,6 +17,7 @@ class ServerFeaturesDto {
|
||||
required this.duplicateDetection,
|
||||
required this.email,
|
||||
required this.facialRecognition,
|
||||
required this.importFaces,
|
||||
required this.map,
|
||||
required this.oauth,
|
||||
required this.oauthAutoLaunch,
|
||||
@@ -36,6 +37,8 @@ class ServerFeaturesDto {
|
||||
|
||||
bool facialRecognition;
|
||||
|
||||
bool importFaces;
|
||||
|
||||
bool map;
|
||||
|
||||
bool oauth;
|
||||
@@ -60,6 +63,7 @@ class ServerFeaturesDto {
|
||||
other.duplicateDetection == duplicateDetection &&
|
||||
other.email == email &&
|
||||
other.facialRecognition == facialRecognition &&
|
||||
other.importFaces == importFaces &&
|
||||
other.map == map &&
|
||||
other.oauth == oauth &&
|
||||
other.oauthAutoLaunch == oauthAutoLaunch &&
|
||||
@@ -77,6 +81,7 @@ class ServerFeaturesDto {
|
||||
(duplicateDetection.hashCode) +
|
||||
(email.hashCode) +
|
||||
(facialRecognition.hashCode) +
|
||||
(importFaces.hashCode) +
|
||||
(map.hashCode) +
|
||||
(oauth.hashCode) +
|
||||
(oauthAutoLaunch.hashCode) +
|
||||
@@ -88,7 +93,7 @@ class ServerFeaturesDto {
|
||||
(trash.hashCode);
|
||||
|
||||
@override
|
||||
String toString() => 'ServerFeaturesDto[configFile=$configFile, duplicateDetection=$duplicateDetection, email=$email, facialRecognition=$facialRecognition, map=$map, oauth=$oauth, oauthAutoLaunch=$oauthAutoLaunch, passwordLogin=$passwordLogin, reverseGeocoding=$reverseGeocoding, search=$search, sidecar=$sidecar, smartSearch=$smartSearch, trash=$trash]';
|
||||
String toString() => 'ServerFeaturesDto[configFile=$configFile, duplicateDetection=$duplicateDetection, email=$email, facialRecognition=$facialRecognition, importFaces=$importFaces, map=$map, oauth=$oauth, oauthAutoLaunch=$oauthAutoLaunch, passwordLogin=$passwordLogin, reverseGeocoding=$reverseGeocoding, search=$search, sidecar=$sidecar, smartSearch=$smartSearch, trash=$trash]';
|
||||
|
||||
Map<String, dynamic> toJson() {
|
||||
final json = <String, dynamic>{};
|
||||
@@ -96,6 +101,7 @@ class ServerFeaturesDto {
|
||||
json[r'duplicateDetection'] = this.duplicateDetection;
|
||||
json[r'email'] = this.email;
|
||||
json[r'facialRecognition'] = this.facialRecognition;
|
||||
json[r'importFaces'] = this.importFaces;
|
||||
json[r'map'] = this.map;
|
||||
json[r'oauth'] = this.oauth;
|
||||
json[r'oauthAutoLaunch'] = this.oauthAutoLaunch;
|
||||
@@ -120,6 +126,7 @@ class ServerFeaturesDto {
|
||||
duplicateDetection: mapValueOfType<bool>(json, r'duplicateDetection')!,
|
||||
email: mapValueOfType<bool>(json, r'email')!,
|
||||
facialRecognition: mapValueOfType<bool>(json, r'facialRecognition')!,
|
||||
importFaces: mapValueOfType<bool>(json, r'importFaces')!,
|
||||
map: mapValueOfType<bool>(json, r'map')!,
|
||||
oauth: mapValueOfType<bool>(json, r'oauth')!,
|
||||
oauthAutoLaunch: mapValueOfType<bool>(json, r'oauthAutoLaunch')!,
|
||||
@@ -180,6 +187,7 @@ class ServerFeaturesDto {
|
||||
'duplicateDetection',
|
||||
'email',
|
||||
'facialRecognition',
|
||||
'importFaces',
|
||||
'map',
|
||||
'oauth',
|
||||
'oauthAutoLaunch',
|
||||
|
85
mobile/openapi/lib/model/source_type.dart
generated
Normal file
85
mobile/openapi/lib/model/source_type.dart
generated
Normal file
@@ -0,0 +1,85 @@
|
||||
//
|
||||
// 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 SourceType {
|
||||
/// Instantiate a new enum with the provided [value].
|
||||
const SourceType._(this.value);
|
||||
|
||||
/// The underlying value of this enum member.
|
||||
final String value;
|
||||
|
||||
@override
|
||||
String toString() => value;
|
||||
|
||||
String toJson() => value;
|
||||
|
||||
static const machineLearning = SourceType._(r'machine-learning');
|
||||
static const exif = SourceType._(r'exif');
|
||||
|
||||
/// List of all possible values in this [enum][SourceType].
|
||||
static const values = <SourceType>[
|
||||
machineLearning,
|
||||
exif,
|
||||
];
|
||||
|
||||
static SourceType? fromJson(dynamic value) => SourceTypeTypeTransformer().decode(value);
|
||||
|
||||
static List<SourceType> listFromJson(dynamic json, {bool growable = false,}) {
|
||||
final result = <SourceType>[];
|
||||
if (json is List && json.isNotEmpty) {
|
||||
for (final row in json) {
|
||||
final value = SourceType.fromJson(row);
|
||||
if (value != null) {
|
||||
result.add(value);
|
||||
}
|
||||
}
|
||||
}
|
||||
return result.toList(growable: growable);
|
||||
}
|
||||
}
|
||||
|
||||
/// Transformation class that can [encode] an instance of [SourceType] to String,
|
||||
/// and [decode] dynamic data back to [SourceType].
|
||||
class SourceTypeTypeTransformer {
|
||||
factory SourceTypeTypeTransformer() => _instance ??= const SourceTypeTypeTransformer._();
|
||||
|
||||
const SourceTypeTypeTransformer._();
|
||||
|
||||
String encode(SourceType data) => data.value;
|
||||
|
||||
/// Decodes a [dynamic value][data] to a SourceType.
|
||||
///
|
||||
/// 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.
|
||||
SourceType? decode(dynamic data, {bool allowNull = true}) {
|
||||
if (data != null) {
|
||||
switch (data) {
|
||||
case r'machine-learning': return SourceType.machineLearning;
|
||||
case r'exif': return SourceType.exif;
|
||||
default:
|
||||
if (!allowNull) {
|
||||
throw ArgumentError('Unknown enum value to decode: $data');
|
||||
}
|
||||
}
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
/// Singleton [SourceTypeTypeTransformer] instance.
|
||||
static SourceTypeTypeTransformer? _instance;
|
||||
}
|
||||
|
10
mobile/openapi/lib/model/system_config_dto.dart
generated
10
mobile/openapi/lib/model/system_config_dto.dart
generated
@@ -20,6 +20,7 @@ class SystemConfigDto {
|
||||
required this.logging,
|
||||
required this.machineLearning,
|
||||
required this.map,
|
||||
required this.metadata,
|
||||
required this.newVersionCheck,
|
||||
required this.notifications,
|
||||
required this.oauth,
|
||||
@@ -46,6 +47,8 @@ class SystemConfigDto {
|
||||
|
||||
SystemConfigMapDto map;
|
||||
|
||||
SystemConfigMetadataDto metadata;
|
||||
|
||||
SystemConfigNewVersionCheckDto newVersionCheck;
|
||||
|
||||
SystemConfigNotificationsDto notifications;
|
||||
@@ -75,6 +78,7 @@ class SystemConfigDto {
|
||||
other.logging == logging &&
|
||||
other.machineLearning == machineLearning &&
|
||||
other.map == map &&
|
||||
other.metadata == metadata &&
|
||||
other.newVersionCheck == newVersionCheck &&
|
||||
other.notifications == notifications &&
|
||||
other.oauth == oauth &&
|
||||
@@ -96,6 +100,7 @@ class SystemConfigDto {
|
||||
(logging.hashCode) +
|
||||
(machineLearning.hashCode) +
|
||||
(map.hashCode) +
|
||||
(metadata.hashCode) +
|
||||
(newVersionCheck.hashCode) +
|
||||
(notifications.hashCode) +
|
||||
(oauth.hashCode) +
|
||||
@@ -108,7 +113,7 @@ class SystemConfigDto {
|
||||
(user.hashCode);
|
||||
|
||||
@override
|
||||
String toString() => 'SystemConfigDto[ffmpeg=$ffmpeg, image=$image, job=$job, library_=$library_, logging=$logging, machineLearning=$machineLearning, map=$map, newVersionCheck=$newVersionCheck, notifications=$notifications, oauth=$oauth, passwordLogin=$passwordLogin, reverseGeocoding=$reverseGeocoding, server=$server, storageTemplate=$storageTemplate, theme=$theme, trash=$trash, user=$user]';
|
||||
String toString() => 'SystemConfigDto[ffmpeg=$ffmpeg, image=$image, job=$job, library_=$library_, logging=$logging, machineLearning=$machineLearning, map=$map, metadata=$metadata, newVersionCheck=$newVersionCheck, notifications=$notifications, oauth=$oauth, passwordLogin=$passwordLogin, reverseGeocoding=$reverseGeocoding, server=$server, storageTemplate=$storageTemplate, theme=$theme, trash=$trash, user=$user]';
|
||||
|
||||
Map<String, dynamic> toJson() {
|
||||
final json = <String, dynamic>{};
|
||||
@@ -119,6 +124,7 @@ class SystemConfigDto {
|
||||
json[r'logging'] = this.logging;
|
||||
json[r'machineLearning'] = this.machineLearning;
|
||||
json[r'map'] = this.map;
|
||||
json[r'metadata'] = this.metadata;
|
||||
json[r'newVersionCheck'] = this.newVersionCheck;
|
||||
json[r'notifications'] = this.notifications;
|
||||
json[r'oauth'] = this.oauth;
|
||||
@@ -147,6 +153,7 @@ class SystemConfigDto {
|
||||
logging: SystemConfigLoggingDto.fromJson(json[r'logging'])!,
|
||||
machineLearning: SystemConfigMachineLearningDto.fromJson(json[r'machineLearning'])!,
|
||||
map: SystemConfigMapDto.fromJson(json[r'map'])!,
|
||||
metadata: SystemConfigMetadataDto.fromJson(json[r'metadata'])!,
|
||||
newVersionCheck: SystemConfigNewVersionCheckDto.fromJson(json[r'newVersionCheck'])!,
|
||||
notifications: SystemConfigNotificationsDto.fromJson(json[r'notifications'])!,
|
||||
oauth: SystemConfigOAuthDto.fromJson(json[r'oauth'])!,
|
||||
@@ -211,6 +218,7 @@ class SystemConfigDto {
|
||||
'logging',
|
||||
'machineLearning',
|
||||
'map',
|
||||
'metadata',
|
||||
'newVersionCheck',
|
||||
'notifications',
|
||||
'oauth',
|
||||
|
98
mobile/openapi/lib/model/system_config_faces_dto.dart
generated
Normal file
98
mobile/openapi/lib/model/system_config_faces_dto.dart
generated
Normal file
@@ -0,0 +1,98 @@
|
||||
//
|
||||
// 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 SystemConfigFacesDto {
|
||||
/// Returns a new [SystemConfigFacesDto] instance.
|
||||
SystemConfigFacesDto({
|
||||
required this.import_,
|
||||
});
|
||||
|
||||
bool import_;
|
||||
|
||||
@override
|
||||
bool operator ==(Object other) => identical(this, other) || other is SystemConfigFacesDto &&
|
||||
other.import_ == import_;
|
||||
|
||||
@override
|
||||
int get hashCode =>
|
||||
// ignore: unnecessary_parenthesis
|
||||
(import_.hashCode);
|
||||
|
||||
@override
|
||||
String toString() => 'SystemConfigFacesDto[import_=$import_]';
|
||||
|
||||
Map<String, dynamic> toJson() {
|
||||
final json = <String, dynamic>{};
|
||||
json[r'import'] = this.import_;
|
||||
return json;
|
||||
}
|
||||
|
||||
/// Returns a new [SystemConfigFacesDto] instance and imports its values from
|
||||
/// [value] if it's a [Map], null otherwise.
|
||||
// ignore: prefer_constructors_over_static_methods
|
||||
static SystemConfigFacesDto? fromJson(dynamic value) {
|
||||
if (value is Map) {
|
||||
final json = value.cast<String, dynamic>();
|
||||
|
||||
return SystemConfigFacesDto(
|
||||
import_: mapValueOfType<bool>(json, r'import')!,
|
||||
);
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
static List<SystemConfigFacesDto> listFromJson(dynamic json, {bool growable = false,}) {
|
||||
final result = <SystemConfigFacesDto>[];
|
||||
if (json is List && json.isNotEmpty) {
|
||||
for (final row in json) {
|
||||
final value = SystemConfigFacesDto.fromJson(row);
|
||||
if (value != null) {
|
||||
result.add(value);
|
||||
}
|
||||
}
|
||||
}
|
||||
return result.toList(growable: growable);
|
||||
}
|
||||
|
||||
static Map<String, SystemConfigFacesDto> mapFromJson(dynamic json) {
|
||||
final map = <String, SystemConfigFacesDto>{};
|
||||
if (json is Map && json.isNotEmpty) {
|
||||
json = json.cast<String, dynamic>(); // ignore: parameter_assignments
|
||||
for (final entry in json.entries) {
|
||||
final value = SystemConfigFacesDto.fromJson(entry.value);
|
||||
if (value != null) {
|
||||
map[entry.key] = value;
|
||||
}
|
||||
}
|
||||
}
|
||||
return map;
|
||||
}
|
||||
|
||||
// maps a json object with a list of SystemConfigFacesDto-objects as value to a dart map
|
||||
static Map<String, List<SystemConfigFacesDto>> mapListFromJson(dynamic json, {bool growable = false,}) {
|
||||
final map = <String, List<SystemConfigFacesDto>>{};
|
||||
if (json is Map && json.isNotEmpty) {
|
||||
// ignore: parameter_assignments
|
||||
json = json.cast<String, dynamic>();
|
||||
for (final entry in json.entries) {
|
||||
map[entry.key] = SystemConfigFacesDto.listFromJson(entry.value, growable: growable,);
|
||||
}
|
||||
}
|
||||
return map;
|
||||
}
|
||||
|
||||
/// The list of required keys that must be present in a JSON.
|
||||
static const requiredKeys = <String>{
|
||||
'import',
|
||||
};
|
||||
}
|
||||
|
98
mobile/openapi/lib/model/system_config_metadata_dto.dart
generated
Normal file
98
mobile/openapi/lib/model/system_config_metadata_dto.dart
generated
Normal file
@@ -0,0 +1,98 @@
|
||||
//
|
||||
// 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 SystemConfigMetadataDto {
|
||||
/// Returns a new [SystemConfigMetadataDto] instance.
|
||||
SystemConfigMetadataDto({
|
||||
required this.faces,
|
||||
});
|
||||
|
||||
SystemConfigFacesDto faces;
|
||||
|
||||
@override
|
||||
bool operator ==(Object other) => identical(this, other) || other is SystemConfigMetadataDto &&
|
||||
other.faces == faces;
|
||||
|
||||
@override
|
||||
int get hashCode =>
|
||||
// ignore: unnecessary_parenthesis
|
||||
(faces.hashCode);
|
||||
|
||||
@override
|
||||
String toString() => 'SystemConfigMetadataDto[faces=$faces]';
|
||||
|
||||
Map<String, dynamic> toJson() {
|
||||
final json = <String, dynamic>{};
|
||||
json[r'faces'] = this.faces;
|
||||
return json;
|
||||
}
|
||||
|
||||
/// Returns a new [SystemConfigMetadataDto] instance and imports its values from
|
||||
/// [value] if it's a [Map], null otherwise.
|
||||
// ignore: prefer_constructors_over_static_methods
|
||||
static SystemConfigMetadataDto? fromJson(dynamic value) {
|
||||
if (value is Map) {
|
||||
final json = value.cast<String, dynamic>();
|
||||
|
||||
return SystemConfigMetadataDto(
|
||||
faces: SystemConfigFacesDto.fromJson(json[r'faces'])!,
|
||||
);
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
static List<SystemConfigMetadataDto> listFromJson(dynamic json, {bool growable = false,}) {
|
||||
final result = <SystemConfigMetadataDto>[];
|
||||
if (json is List && json.isNotEmpty) {
|
||||
for (final row in json) {
|
||||
final value = SystemConfigMetadataDto.fromJson(row);
|
||||
if (value != null) {
|
||||
result.add(value);
|
||||
}
|
||||
}
|
||||
}
|
||||
return result.toList(growable: growable);
|
||||
}
|
||||
|
||||
static Map<String, SystemConfigMetadataDto> mapFromJson(dynamic json) {
|
||||
final map = <String, SystemConfigMetadataDto>{};
|
||||
if (json is Map && json.isNotEmpty) {
|
||||
json = json.cast<String, dynamic>(); // ignore: parameter_assignments
|
||||
for (final entry in json.entries) {
|
||||
final value = SystemConfigMetadataDto.fromJson(entry.value);
|
||||
if (value != null) {
|
||||
map[entry.key] = value;
|
||||
}
|
||||
}
|
||||
}
|
||||
return map;
|
||||
}
|
||||
|
||||
// maps a json object with a list of SystemConfigMetadataDto-objects as value to a dart map
|
||||
static Map<String, List<SystemConfigMetadataDto>> mapListFromJson(dynamic json, {bool growable = false,}) {
|
||||
final map = <String, List<SystemConfigMetadataDto>>{};
|
||||
if (json is Map && json.isNotEmpty) {
|
||||
// ignore: parameter_assignments
|
||||
json = json.cast<String, dynamic>();
|
||||
for (final entry in json.entries) {
|
||||
map[entry.key] = SystemConfigMetadataDto.listFromJson(entry.value, growable: growable,);
|
||||
}
|
||||
}
|
||||
return map;
|
||||
}
|
||||
|
||||
/// The list of required keys that must be present in a JSON.
|
||||
static const requiredKeys = <String>{
|
||||
'faces',
|
||||
};
|
||||
}
|
||||
|
Reference in New Issue
Block a user