mirror of
https://github.com/immich-app/immich.git
synced 2025-06-03 13:44:16 -04:00
chore: removed unused endpoint (#16167)
This commit is contained in:
parent
2c88ce8559
commit
7c26663013
@ -23,7 +23,6 @@ class ApiService implements Authentication {
|
|||||||
late MapApi mapApi;
|
late MapApi mapApi;
|
||||||
late PartnersApi partnersApi;
|
late PartnersApi partnersApi;
|
||||||
late PeopleApi peopleApi;
|
late PeopleApi peopleApi;
|
||||||
late AuditApi auditApi;
|
|
||||||
late SharedLinksApi sharedLinksApi;
|
late SharedLinksApi sharedLinksApi;
|
||||||
late SyncApi syncApi;
|
late SyncApi syncApi;
|
||||||
late SystemConfigApi systemConfigApi;
|
late SystemConfigApi systemConfigApi;
|
||||||
@ -56,7 +55,6 @@ class ApiService implements Authentication {
|
|||||||
mapApi = MapApi(_apiClient);
|
mapApi = MapApi(_apiClient);
|
||||||
partnersApi = PartnersApi(_apiClient);
|
partnersApi = PartnersApi(_apiClient);
|
||||||
peopleApi = PeopleApi(_apiClient);
|
peopleApi = PeopleApi(_apiClient);
|
||||||
auditApi = AuditApi(_apiClient);
|
|
||||||
sharedLinksApi = SharedLinksApi(_apiClient);
|
sharedLinksApi = SharedLinksApi(_apiClient);
|
||||||
syncApi = SyncApi(_apiClient);
|
syncApi = SyncApi(_apiClient);
|
||||||
systemConfigApi = SystemConfigApi(_apiClient);
|
systemConfigApi = SystemConfigApi(_apiClient);
|
||||||
|
3
mobile/openapi/README.md
generated
3
mobile/openapi/README.md
generated
@ -109,7 +109,6 @@ Class | Method | HTTP request | Description
|
|||||||
*AssetsApi* | [**updateAssets**](doc//AssetsApi.md#updateassets) | **PUT** /assets |
|
*AssetsApi* | [**updateAssets**](doc//AssetsApi.md#updateassets) | **PUT** /assets |
|
||||||
*AssetsApi* | [**uploadAsset**](doc//AssetsApi.md#uploadasset) | **POST** /assets |
|
*AssetsApi* | [**uploadAsset**](doc//AssetsApi.md#uploadasset) | **POST** /assets |
|
||||||
*AssetsApi* | [**viewAsset**](doc//AssetsApi.md#viewasset) | **GET** /assets/{id}/thumbnail |
|
*AssetsApi* | [**viewAsset**](doc//AssetsApi.md#viewasset) | **GET** /assets/{id}/thumbnail |
|
||||||
*AuditApi* | [**getAuditDeletes**](doc//AuditApi.md#getauditdeletes) | **GET** /audit/deletes |
|
|
||||||
*AuthenticationApi* | [**changePassword**](doc//AuthenticationApi.md#changepassword) | **POST** /auth/change-password |
|
*AuthenticationApi* | [**changePassword**](doc//AuthenticationApi.md#changepassword) | **POST** /auth/change-password |
|
||||||
*AuthenticationApi* | [**login**](doc//AuthenticationApi.md#login) | **POST** /auth/login |
|
*AuthenticationApi* | [**login**](doc//AuthenticationApi.md#login) | **POST** /auth/login |
|
||||||
*AuthenticationApi* | [**logout**](doc//AuthenticationApi.md#logout) | **POST** /auth/logout |
|
*AuthenticationApi* | [**logout**](doc//AuthenticationApi.md#logout) | **POST** /auth/logout |
|
||||||
@ -293,7 +292,6 @@ Class | Method | HTTP request | Description
|
|||||||
- [AssetStatsResponseDto](doc//AssetStatsResponseDto.md)
|
- [AssetStatsResponseDto](doc//AssetStatsResponseDto.md)
|
||||||
- [AssetTypeEnum](doc//AssetTypeEnum.md)
|
- [AssetTypeEnum](doc//AssetTypeEnum.md)
|
||||||
- [AudioCodec](doc//AudioCodec.md)
|
- [AudioCodec](doc//AudioCodec.md)
|
||||||
- [AuditDeletesResponseDto](doc//AuditDeletesResponseDto.md)
|
|
||||||
- [AvatarResponse](doc//AvatarResponse.md)
|
- [AvatarResponse](doc//AvatarResponse.md)
|
||||||
- [AvatarUpdate](doc//AvatarUpdate.md)
|
- [AvatarUpdate](doc//AvatarUpdate.md)
|
||||||
- [BulkIdResponseDto](doc//BulkIdResponseDto.md)
|
- [BulkIdResponseDto](doc//BulkIdResponseDto.md)
|
||||||
@ -317,7 +315,6 @@ Class | Method | HTTP request | Description
|
|||||||
- [DuplicateResponseDto](doc//DuplicateResponseDto.md)
|
- [DuplicateResponseDto](doc//DuplicateResponseDto.md)
|
||||||
- [EmailNotificationsResponse](doc//EmailNotificationsResponse.md)
|
- [EmailNotificationsResponse](doc//EmailNotificationsResponse.md)
|
||||||
- [EmailNotificationsUpdate](doc//EmailNotificationsUpdate.md)
|
- [EmailNotificationsUpdate](doc//EmailNotificationsUpdate.md)
|
||||||
- [EntityType](doc//EntityType.md)
|
|
||||||
- [ExifResponseDto](doc//ExifResponseDto.md)
|
- [ExifResponseDto](doc//ExifResponseDto.md)
|
||||||
- [FaceDto](doc//FaceDto.md)
|
- [FaceDto](doc//FaceDto.md)
|
||||||
- [FacialRecognitionConfig](doc//FacialRecognitionConfig.md)
|
- [FacialRecognitionConfig](doc//FacialRecognitionConfig.md)
|
||||||
|
@ -1,3 +0,0 @@
|
|||||||
description: This file stores settings for Dart & Flutter DevTools.
|
|
||||||
documentation: https://docs.flutter.dev/tools/devtools/extensions#configure-extension-enablement-states
|
|
||||||
extensions:
|
|
3
mobile/openapi/lib/api.dart
generated
3
mobile/openapi/lib/api.dart
generated
@ -34,7 +34,6 @@ part 'api/api_keys_api.dart';
|
|||||||
part 'api/activities_api.dart';
|
part 'api/activities_api.dart';
|
||||||
part 'api/albums_api.dart';
|
part 'api/albums_api.dart';
|
||||||
part 'api/assets_api.dart';
|
part 'api/assets_api.dart';
|
||||||
part 'api/audit_api.dart';
|
|
||||||
part 'api/authentication_api.dart';
|
part 'api/authentication_api.dart';
|
||||||
part 'api/deprecated_api.dart';
|
part 'api/deprecated_api.dart';
|
||||||
part 'api/download_api.dart';
|
part 'api/download_api.dart';
|
||||||
@ -106,7 +105,6 @@ part 'model/asset_stack_response_dto.dart';
|
|||||||
part 'model/asset_stats_response_dto.dart';
|
part 'model/asset_stats_response_dto.dart';
|
||||||
part 'model/asset_type_enum.dart';
|
part 'model/asset_type_enum.dart';
|
||||||
part 'model/audio_codec.dart';
|
part 'model/audio_codec.dart';
|
||||||
part 'model/audit_deletes_response_dto.dart';
|
|
||||||
part 'model/avatar_response.dart';
|
part 'model/avatar_response.dart';
|
||||||
part 'model/avatar_update.dart';
|
part 'model/avatar_update.dart';
|
||||||
part 'model/bulk_id_response_dto.dart';
|
part 'model/bulk_id_response_dto.dart';
|
||||||
@ -130,7 +128,6 @@ part 'model/duplicate_detection_config.dart';
|
|||||||
part 'model/duplicate_response_dto.dart';
|
part 'model/duplicate_response_dto.dart';
|
||||||
part 'model/email_notifications_response.dart';
|
part 'model/email_notifications_response.dart';
|
||||||
part 'model/email_notifications_update.dart';
|
part 'model/email_notifications_update.dart';
|
||||||
part 'model/entity_type.dart';
|
|
||||||
part 'model/exif_response_dto.dart';
|
part 'model/exif_response_dto.dart';
|
||||||
part 'model/face_dto.dart';
|
part 'model/face_dto.dart';
|
||||||
part 'model/facial_recognition_config.dart';
|
part 'model/facial_recognition_config.dart';
|
||||||
|
79
mobile/openapi/lib/api/audit_api.dart
generated
79
mobile/openapi/lib/api/audit_api.dart
generated
@ -1,79 +0,0 @@
|
|||||||
//
|
|
||||||
// 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 AuditApi {
|
|
||||||
AuditApi([ApiClient? apiClient]) : apiClient = apiClient ?? defaultApiClient;
|
|
||||||
|
|
||||||
final ApiClient apiClient;
|
|
||||||
|
|
||||||
/// Performs an HTTP 'GET /audit/deletes' operation and returns the [Response].
|
|
||||||
/// Parameters:
|
|
||||||
///
|
|
||||||
/// * [DateTime] after (required):
|
|
||||||
///
|
|
||||||
/// * [EntityType] entityType (required):
|
|
||||||
///
|
|
||||||
/// * [String] userId:
|
|
||||||
Future<Response> getAuditDeletesWithHttpInfo(DateTime after, EntityType entityType, { String? userId, }) async {
|
|
||||||
// ignore: prefer_const_declarations
|
|
||||||
final path = r'/audit/deletes';
|
|
||||||
|
|
||||||
// ignore: prefer_final_locals
|
|
||||||
Object? postBody;
|
|
||||||
|
|
||||||
final queryParams = <QueryParam>[];
|
|
||||||
final headerParams = <String, String>{};
|
|
||||||
final formParams = <String, String>{};
|
|
||||||
|
|
||||||
queryParams.addAll(_queryParams('', 'after', after));
|
|
||||||
queryParams.addAll(_queryParams('', 'entityType', entityType));
|
|
||||||
if (userId != null) {
|
|
||||||
queryParams.addAll(_queryParams('', 'userId', userId));
|
|
||||||
}
|
|
||||||
|
|
||||||
const contentTypes = <String>[];
|
|
||||||
|
|
||||||
|
|
||||||
return apiClient.invokeAPI(
|
|
||||||
path,
|
|
||||||
'GET',
|
|
||||||
queryParams,
|
|
||||||
postBody,
|
|
||||||
headerParams,
|
|
||||||
formParams,
|
|
||||||
contentTypes.isEmpty ? null : contentTypes.first,
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
/// Parameters:
|
|
||||||
///
|
|
||||||
/// * [DateTime] after (required):
|
|
||||||
///
|
|
||||||
/// * [EntityType] entityType (required):
|
|
||||||
///
|
|
||||||
/// * [String] userId:
|
|
||||||
Future<AuditDeletesResponseDto?> getAuditDeletes(DateTime after, EntityType entityType, { String? userId, }) async {
|
|
||||||
final response = await getAuditDeletesWithHttpInfo(after, entityType, userId: userId, );
|
|
||||||
if (response.statusCode >= HttpStatus.badRequest) {
|
|
||||||
throw ApiException(response.statusCode, await _decodeBodyBytes(response));
|
|
||||||
}
|
|
||||||
// When a remote server returns no body with a status of 204, we shall not decode it.
|
|
||||||
// At the time of writing this, `dart:convert` will throw an "Unexpected end of input"
|
|
||||||
// FormatException when trying to decode an empty string.
|
|
||||||
if (response.body.isNotEmpty && response.statusCode != HttpStatus.noContent) {
|
|
||||||
return await apiClient.deserializeAsync(await _decodeBodyBytes(response), 'AuditDeletesResponseDto',) as AuditDeletesResponseDto;
|
|
||||||
|
|
||||||
}
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
}
|
|
4
mobile/openapi/lib/api_client.dart
generated
4
mobile/openapi/lib/api_client.dart
generated
@ -266,8 +266,6 @@ class ApiClient {
|
|||||||
return AssetTypeEnumTypeTransformer().decode(value);
|
return AssetTypeEnumTypeTransformer().decode(value);
|
||||||
case 'AudioCodec':
|
case 'AudioCodec':
|
||||||
return AudioCodecTypeTransformer().decode(value);
|
return AudioCodecTypeTransformer().decode(value);
|
||||||
case 'AuditDeletesResponseDto':
|
|
||||||
return AuditDeletesResponseDto.fromJson(value);
|
|
||||||
case 'AvatarResponse':
|
case 'AvatarResponse':
|
||||||
return AvatarResponse.fromJson(value);
|
return AvatarResponse.fromJson(value);
|
||||||
case 'AvatarUpdate':
|
case 'AvatarUpdate':
|
||||||
@ -314,8 +312,6 @@ class ApiClient {
|
|||||||
return EmailNotificationsResponse.fromJson(value);
|
return EmailNotificationsResponse.fromJson(value);
|
||||||
case 'EmailNotificationsUpdate':
|
case 'EmailNotificationsUpdate':
|
||||||
return EmailNotificationsUpdate.fromJson(value);
|
return EmailNotificationsUpdate.fromJson(value);
|
||||||
case 'EntityType':
|
|
||||||
return EntityTypeTypeTransformer().decode(value);
|
|
||||||
case 'ExifResponseDto':
|
case 'ExifResponseDto':
|
||||||
return ExifResponseDto.fromJson(value);
|
return ExifResponseDto.fromJson(value);
|
||||||
case 'FaceDto':
|
case 'FaceDto':
|
||||||
|
3
mobile/openapi/lib/api_helper.dart
generated
3
mobile/openapi/lib/api_helper.dart
generated
@ -82,9 +82,6 @@ String parameterToString(dynamic value) {
|
|||||||
if (value is Colorspace) {
|
if (value is Colorspace) {
|
||||||
return ColorspaceTypeTransformer().encode(value).toString();
|
return ColorspaceTypeTransformer().encode(value).toString();
|
||||||
}
|
}
|
||||||
if (value is EntityType) {
|
|
||||||
return EntityTypeTypeTransformer().encode(value).toString();
|
|
||||||
}
|
|
||||||
if (value is ImageFormat) {
|
if (value is ImageFormat) {
|
||||||
return ImageFormatTypeTransformer().encode(value).toString();
|
return ImageFormatTypeTransformer().encode(value).toString();
|
||||||
}
|
}
|
||||||
|
109
mobile/openapi/lib/model/audit_deletes_response_dto.dart
generated
109
mobile/openapi/lib/model/audit_deletes_response_dto.dart
generated
@ -1,109 +0,0 @@
|
|||||||
//
|
|
||||||
// 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 AuditDeletesResponseDto {
|
|
||||||
/// Returns a new [AuditDeletesResponseDto] instance.
|
|
||||||
AuditDeletesResponseDto({
|
|
||||||
this.ids = const [],
|
|
||||||
required this.needsFullSync,
|
|
||||||
});
|
|
||||||
|
|
||||||
List<String> ids;
|
|
||||||
|
|
||||||
bool needsFullSync;
|
|
||||||
|
|
||||||
@override
|
|
||||||
bool operator ==(Object other) => identical(this, other) || other is AuditDeletesResponseDto &&
|
|
||||||
_deepEquality.equals(other.ids, ids) &&
|
|
||||||
other.needsFullSync == needsFullSync;
|
|
||||||
|
|
||||||
@override
|
|
||||||
int get hashCode =>
|
|
||||||
// ignore: unnecessary_parenthesis
|
|
||||||
(ids.hashCode) +
|
|
||||||
(needsFullSync.hashCode);
|
|
||||||
|
|
||||||
@override
|
|
||||||
String toString() => 'AuditDeletesResponseDto[ids=$ids, needsFullSync=$needsFullSync]';
|
|
||||||
|
|
||||||
Map<String, dynamic> toJson() {
|
|
||||||
final json = <String, dynamic>{};
|
|
||||||
json[r'ids'] = this.ids;
|
|
||||||
json[r'needsFullSync'] = this.needsFullSync;
|
|
||||||
return json;
|
|
||||||
}
|
|
||||||
|
|
||||||
/// Returns a new [AuditDeletesResponseDto] instance and imports its values from
|
|
||||||
/// [value] if it's a [Map], null otherwise.
|
|
||||||
// ignore: prefer_constructors_over_static_methods
|
|
||||||
static AuditDeletesResponseDto? fromJson(dynamic value) {
|
|
||||||
upgradeDto(value, "AuditDeletesResponseDto");
|
|
||||||
if (value is Map) {
|
|
||||||
final json = value.cast<String, dynamic>();
|
|
||||||
|
|
||||||
return AuditDeletesResponseDto(
|
|
||||||
ids: json[r'ids'] is Iterable
|
|
||||||
? (json[r'ids'] as Iterable).cast<String>().toList(growable: false)
|
|
||||||
: const [],
|
|
||||||
needsFullSync: mapValueOfType<bool>(json, r'needsFullSync')!,
|
|
||||||
);
|
|
||||||
}
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
|
|
||||||
static List<AuditDeletesResponseDto> listFromJson(dynamic json, {bool growable = false,}) {
|
|
||||||
final result = <AuditDeletesResponseDto>[];
|
|
||||||
if (json is List && json.isNotEmpty) {
|
|
||||||
for (final row in json) {
|
|
||||||
final value = AuditDeletesResponseDto.fromJson(row);
|
|
||||||
if (value != null) {
|
|
||||||
result.add(value);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return result.toList(growable: growable);
|
|
||||||
}
|
|
||||||
|
|
||||||
static Map<String, AuditDeletesResponseDto> mapFromJson(dynamic json) {
|
|
||||||
final map = <String, AuditDeletesResponseDto>{};
|
|
||||||
if (json is Map && json.isNotEmpty) {
|
|
||||||
json = json.cast<String, dynamic>(); // ignore: parameter_assignments
|
|
||||||
for (final entry in json.entries) {
|
|
||||||
final value = AuditDeletesResponseDto.fromJson(entry.value);
|
|
||||||
if (value != null) {
|
|
||||||
map[entry.key] = value;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return map;
|
|
||||||
}
|
|
||||||
|
|
||||||
// maps a json object with a list of AuditDeletesResponseDto-objects as value to a dart map
|
|
||||||
static Map<String, List<AuditDeletesResponseDto>> mapListFromJson(dynamic json, {bool growable = false,}) {
|
|
||||||
final map = <String, List<AuditDeletesResponseDto>>{};
|
|
||||||
if (json is Map && json.isNotEmpty) {
|
|
||||||
// ignore: parameter_assignments
|
|
||||||
json = json.cast<String, dynamic>();
|
|
||||||
for (final entry in json.entries) {
|
|
||||||
map[entry.key] = AuditDeletesResponseDto.listFromJson(entry.value, growable: growable,);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return map;
|
|
||||||
}
|
|
||||||
|
|
||||||
/// The list of required keys that must be present in a JSON.
|
|
||||||
static const requiredKeys = <String>{
|
|
||||||
'ids',
|
|
||||||
'needsFullSync',
|
|
||||||
};
|
|
||||||
}
|
|
||||||
|
|
85
mobile/openapi/lib/model/entity_type.dart
generated
85
mobile/openapi/lib/model/entity_type.dart
generated
@ -1,85 +0,0 @@
|
|||||||
//
|
|
||||||
// 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 EntityType {
|
|
||||||
/// Instantiate a new enum with the provided [value].
|
|
||||||
const EntityType._(this.value);
|
|
||||||
|
|
||||||
/// The underlying value of this enum member.
|
|
||||||
final String value;
|
|
||||||
|
|
||||||
@override
|
|
||||||
String toString() => value;
|
|
||||||
|
|
||||||
String toJson() => value;
|
|
||||||
|
|
||||||
static const ASSET = EntityType._(r'ASSET');
|
|
||||||
static const ALBUM = EntityType._(r'ALBUM');
|
|
||||||
|
|
||||||
/// List of all possible values in this [enum][EntityType].
|
|
||||||
static const values = <EntityType>[
|
|
||||||
ASSET,
|
|
||||||
ALBUM,
|
|
||||||
];
|
|
||||||
|
|
||||||
static EntityType? fromJson(dynamic value) => EntityTypeTypeTransformer().decode(value);
|
|
||||||
|
|
||||||
static List<EntityType> listFromJson(dynamic json, {bool growable = false,}) {
|
|
||||||
final result = <EntityType>[];
|
|
||||||
if (json is List && json.isNotEmpty) {
|
|
||||||
for (final row in json) {
|
|
||||||
final value = EntityType.fromJson(row);
|
|
||||||
if (value != null) {
|
|
||||||
result.add(value);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return result.toList(growable: growable);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/// Transformation class that can [encode] an instance of [EntityType] to String,
|
|
||||||
/// and [decode] dynamic data back to [EntityType].
|
|
||||||
class EntityTypeTypeTransformer {
|
|
||||||
factory EntityTypeTypeTransformer() => _instance ??= const EntityTypeTypeTransformer._();
|
|
||||||
|
|
||||||
const EntityTypeTypeTransformer._();
|
|
||||||
|
|
||||||
String encode(EntityType data) => data.value;
|
|
||||||
|
|
||||||
/// Decodes a [dynamic value][data] to a EntityType.
|
|
||||||
///
|
|
||||||
/// 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.
|
|
||||||
EntityType? decode(dynamic data, {bool allowNull = true}) {
|
|
||||||
if (data != null) {
|
|
||||||
switch (data) {
|
|
||||||
case r'ASSET': return EntityType.ASSET;
|
|
||||||
case r'ALBUM': return EntityType.ALBUM;
|
|
||||||
default:
|
|
||||||
if (!allowNull) {
|
|
||||||
throw ArgumentError('Unknown enum value to decode: $data');
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
|
|
||||||
/// Singleton [EntityTypeTypeTransformer] instance.
|
|
||||||
static EntityTypeTypeTransformer? _instance;
|
|
||||||
}
|
|
||||||
|
|
@ -2079,65 +2079,6 @@
|
|||||||
]
|
]
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"/audit/deletes": {
|
|
||||||
"get": {
|
|
||||||
"operationId": "getAuditDeletes",
|
|
||||||
"parameters": [
|
|
||||||
{
|
|
||||||
"name": "after",
|
|
||||||
"required": true,
|
|
||||||
"in": "query",
|
|
||||||
"schema": {
|
|
||||||
"format": "date-time",
|
|
||||||
"type": "string"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"name": "entityType",
|
|
||||||
"required": true,
|
|
||||||
"in": "query",
|
|
||||||
"schema": {
|
|
||||||
"$ref": "#/components/schemas/EntityType"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"name": "userId",
|
|
||||||
"required": false,
|
|
||||||
"in": "query",
|
|
||||||
"schema": {
|
|
||||||
"format": "uuid",
|
|
||||||
"type": "string"
|
|
||||||
}
|
|
||||||
}
|
|
||||||
],
|
|
||||||
"responses": {
|
|
||||||
"200": {
|
|
||||||
"content": {
|
|
||||||
"application/json": {
|
|
||||||
"schema": {
|
|
||||||
"$ref": "#/components/schemas/AuditDeletesResponseDto"
|
|
||||||
}
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"description": ""
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"security": [
|
|
||||||
{
|
|
||||||
"bearer": []
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"cookie": []
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"api_key": []
|
|
||||||
}
|
|
||||||
],
|
|
||||||
"tags": [
|
|
||||||
"Audit"
|
|
||||||
]
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"/auth/admin-sign-up": {
|
"/auth/admin-sign-up": {
|
||||||
"post": {
|
"post": {
|
||||||
"operationId": "signUpAdmin",
|
"operationId": "signUpAdmin",
|
||||||
@ -8643,24 +8584,6 @@
|
|||||||
],
|
],
|
||||||
"type": "string"
|
"type": "string"
|
||||||
},
|
},
|
||||||
"AuditDeletesResponseDto": {
|
|
||||||
"properties": {
|
|
||||||
"ids": {
|
|
||||||
"items": {
|
|
||||||
"type": "string"
|
|
||||||
},
|
|
||||||
"type": "array"
|
|
||||||
},
|
|
||||||
"needsFullSync": {
|
|
||||||
"type": "boolean"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"required": [
|
|
||||||
"ids",
|
|
||||||
"needsFullSync"
|
|
||||||
],
|
|
||||||
"type": "object"
|
|
||||||
},
|
|
||||||
"AvatarResponse": {
|
"AvatarResponse": {
|
||||||
"properties": {
|
"properties": {
|
||||||
"color": {
|
"color": {
|
||||||
@ -9075,13 +8998,6 @@
|
|||||||
},
|
},
|
||||||
"type": "object"
|
"type": "object"
|
||||||
},
|
},
|
||||||
"EntityType": {
|
|
||||||
"enum": [
|
|
||||||
"ASSET",
|
|
||||||
"ALBUM"
|
|
||||||
],
|
|
||||||
"type": "string"
|
|
||||||
},
|
|
||||||
"ExifResponseDto": {
|
"ExifResponseDto": {
|
||||||
"properties": {
|
"properties": {
|
||||||
"city": {
|
"city": {
|
||||||
|
@ -449,10 +449,6 @@ export type AssetMediaReplaceDto = {
|
|||||||
fileCreatedAt: string;
|
fileCreatedAt: string;
|
||||||
fileModifiedAt: string;
|
fileModifiedAt: string;
|
||||||
};
|
};
|
||||||
export type AuditDeletesResponseDto = {
|
|
||||||
ids: string[];
|
|
||||||
needsFullSync: boolean;
|
|
||||||
};
|
|
||||||
export type SignUpDto = {
|
export type SignUpDto = {
|
||||||
email: string;
|
email: string;
|
||||||
name: string;
|
name: string;
|
||||||
@ -1913,22 +1909,6 @@ export function playAssetVideo({ id, key }: {
|
|||||||
...opts
|
...opts
|
||||||
}));
|
}));
|
||||||
}
|
}
|
||||||
export function getAuditDeletes({ after, entityType, userId }: {
|
|
||||||
after: string;
|
|
||||||
entityType: EntityType;
|
|
||||||
userId?: string;
|
|
||||||
}, opts?: Oazapfts.RequestOpts) {
|
|
||||||
return oazapfts.ok(oazapfts.fetchJson<{
|
|
||||||
status: 200;
|
|
||||||
data: AuditDeletesResponseDto;
|
|
||||||
}>(`/audit/deletes${QS.query(QS.explode({
|
|
||||||
after,
|
|
||||||
entityType,
|
|
||||||
userId
|
|
||||||
}))}`, {
|
|
||||||
...opts
|
|
||||||
}));
|
|
||||||
}
|
|
||||||
export function signUpAdmin({ signUpDto }: {
|
export function signUpAdmin({ signUpDto }: {
|
||||||
signUpDto: SignUpDto;
|
signUpDto: SignUpDto;
|
||||||
}, opts?: Oazapfts.RequestOpts) {
|
}, opts?: Oazapfts.RequestOpts) {
|
||||||
@ -3499,10 +3479,6 @@ export enum AssetMediaSize {
|
|||||||
Preview = "preview",
|
Preview = "preview",
|
||||||
Thumbnail = "thumbnail"
|
Thumbnail = "thumbnail"
|
||||||
}
|
}
|
||||||
export enum EntityType {
|
|
||||||
Asset = "ASSET",
|
|
||||||
Album = "ALBUM"
|
|
||||||
}
|
|
||||||
export enum ManualJobName {
|
export enum ManualJobName {
|
||||||
PersonCleanup = "person-cleanup",
|
PersonCleanup = "person-cleanup",
|
||||||
TagCleanup = "tag-cleanup",
|
TagCleanup = "tag-cleanup",
|
||||||
|
@ -1,18 +0,0 @@
|
|||||||
import { Controller, Get, Query } from '@nestjs/common';
|
|
||||||
import { ApiTags } from '@nestjs/swagger';
|
|
||||||
import { AuditDeletesDto, AuditDeletesResponseDto } from 'src/dtos/audit.dto';
|
|
||||||
import { AuthDto } from 'src/dtos/auth.dto';
|
|
||||||
import { Auth, Authenticated } from 'src/middleware/auth.guard';
|
|
||||||
import { AuditService } from 'src/services/audit.service';
|
|
||||||
|
|
||||||
@ApiTags('Audit')
|
|
||||||
@Controller('audit')
|
|
||||||
export class AuditController {
|
|
||||||
constructor(private service: AuditService) {}
|
|
||||||
|
|
||||||
@Get('deletes')
|
|
||||||
@Authenticated()
|
|
||||||
getAuditDeletes(@Auth() auth: AuthDto, @Query() dto: AuditDeletesDto): Promise<AuditDeletesResponseDto> {
|
|
||||||
return this.service.getDeletes(auth, dto);
|
|
||||||
}
|
|
||||||
}
|
|
@ -4,7 +4,6 @@ import { APIKeyController } from 'src/controllers/api-key.controller';
|
|||||||
import { AppController } from 'src/controllers/app.controller';
|
import { AppController } from 'src/controllers/app.controller';
|
||||||
import { AssetMediaController } from 'src/controllers/asset-media.controller';
|
import { AssetMediaController } from 'src/controllers/asset-media.controller';
|
||||||
import { AssetController } from 'src/controllers/asset.controller';
|
import { AssetController } from 'src/controllers/asset.controller';
|
||||||
import { AuditController } from 'src/controllers/audit.controller';
|
|
||||||
import { AuthController } from 'src/controllers/auth.controller';
|
import { AuthController } from 'src/controllers/auth.controller';
|
||||||
import { DownloadController } from 'src/controllers/download.controller';
|
import { DownloadController } from 'src/controllers/download.controller';
|
||||||
import { DuplicateController } from 'src/controllers/duplicate.controller';
|
import { DuplicateController } from 'src/controllers/duplicate.controller';
|
||||||
@ -40,7 +39,6 @@ export const controllers = [
|
|||||||
AppController,
|
AppController,
|
||||||
AssetController,
|
AssetController,
|
||||||
AssetMediaController,
|
AssetMediaController,
|
||||||
AuditController,
|
|
||||||
AuthController,
|
AuthController,
|
||||||
DownloadController,
|
DownloadController,
|
||||||
DuplicateController,
|
DuplicateController,
|
||||||
|
@ -1,17 +1,7 @@
|
|||||||
import { BadRequestException } from '@nestjs/common';
|
import { BadRequestException } from '@nestjs/common';
|
||||||
import { FileReportItemDto } from 'src/dtos/audit.dto';
|
import { FileReportItemDto } from 'src/dtos/audit.dto';
|
||||||
import {
|
import { AssetFileType, AssetPathType, JobStatus, PersonPathType, UserPathType } from 'src/enum';
|
||||||
AssetFileType,
|
|
||||||
AssetPathType,
|
|
||||||
DatabaseAction,
|
|
||||||
EntityType,
|
|
||||||
JobStatus,
|
|
||||||
PersonPathType,
|
|
||||||
UserPathType,
|
|
||||||
} from 'src/enum';
|
|
||||||
import { AuditService } from 'src/services/audit.service';
|
import { AuditService } from 'src/services/audit.service';
|
||||||
import { auditStub } from 'test/fixtures/audit.stub';
|
|
||||||
import { authStub } from 'test/fixtures/auth.stub';
|
|
||||||
import { newTestService, ServiceMocks } from 'test/utils';
|
import { newTestService, ServiceMocks } from 'test/utils';
|
||||||
|
|
||||||
describe(AuditService.name, () => {
|
describe(AuditService.name, () => {
|
||||||
@ -33,40 +23,6 @@ describe(AuditService.name, () => {
|
|||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
|
||||||
describe('getDeletes', () => {
|
|
||||||
it('should require full sync if the request is older than 100 days', async () => {
|
|
||||||
mocks.audit.getAfter.mockResolvedValue([]);
|
|
||||||
|
|
||||||
const date = new Date(2022, 0, 1);
|
|
||||||
await expect(sut.getDeletes(authStub.admin, { after: date, entityType: EntityType.ASSET })).resolves.toEqual({
|
|
||||||
needsFullSync: true,
|
|
||||||
ids: [],
|
|
||||||
});
|
|
||||||
|
|
||||||
expect(mocks.audit.getAfter).toHaveBeenCalledWith(date, {
|
|
||||||
action: DatabaseAction.DELETE,
|
|
||||||
userIds: [authStub.admin.user.id],
|
|
||||||
entityType: EntityType.ASSET,
|
|
||||||
});
|
|
||||||
});
|
|
||||||
|
|
||||||
it('should get any new or updated assets and deleted ids', async () => {
|
|
||||||
mocks.audit.getAfter.mockResolvedValue([auditStub.delete.entityId]);
|
|
||||||
|
|
||||||
const date = new Date();
|
|
||||||
await expect(sut.getDeletes(authStub.admin, { after: date, entityType: EntityType.ASSET })).resolves.toEqual({
|
|
||||||
needsFullSync: false,
|
|
||||||
ids: ['asset-deleted'],
|
|
||||||
});
|
|
||||||
|
|
||||||
expect(mocks.audit.getAfter).toHaveBeenCalledWith(date, {
|
|
||||||
action: DatabaseAction.DELETE,
|
|
||||||
userIds: [authStub.admin.user.id],
|
|
||||||
entityType: EntityType.ASSET,
|
|
||||||
});
|
|
||||||
});
|
|
||||||
});
|
|
||||||
|
|
||||||
describe('getChecksums', () => {
|
describe('getChecksums', () => {
|
||||||
it('should fail if the file is not in the immich path', async () => {
|
it('should fail if the file is not in the immich path', async () => {
|
||||||
await expect(sut.getChecksums({ filenames: ['foo/bar'] })).rejects.toBeInstanceOf(BadRequestException);
|
await expect(sut.getChecksums({ filenames: ['foo/bar'] })).rejects.toBeInstanceOf(BadRequestException);
|
||||||
|
@ -4,22 +4,12 @@ import { resolve } from 'node:path';
|
|||||||
import { AUDIT_LOG_MAX_DURATION, JOBS_ASSET_PAGINATION_SIZE } from 'src/constants';
|
import { AUDIT_LOG_MAX_DURATION, JOBS_ASSET_PAGINATION_SIZE } from 'src/constants';
|
||||||
import { StorageCore } from 'src/cores/storage.core';
|
import { StorageCore } from 'src/cores/storage.core';
|
||||||
import { OnJob } from 'src/decorators';
|
import { OnJob } from 'src/decorators';
|
||||||
import {
|
import { FileChecksumDto, FileChecksumResponseDto, FileReportItemDto, PathEntityType } from 'src/dtos/audit.dto';
|
||||||
AuditDeletesDto,
|
|
||||||
AuditDeletesResponseDto,
|
|
||||||
FileChecksumDto,
|
|
||||||
FileChecksumResponseDto,
|
|
||||||
FileReportItemDto,
|
|
||||||
PathEntityType,
|
|
||||||
} from 'src/dtos/audit.dto';
|
|
||||||
import { AuthDto } from 'src/dtos/auth.dto';
|
|
||||||
import {
|
import {
|
||||||
AssetFileType,
|
AssetFileType,
|
||||||
AssetPathType,
|
AssetPathType,
|
||||||
DatabaseAction,
|
|
||||||
JobName,
|
JobName,
|
||||||
JobStatus,
|
JobStatus,
|
||||||
Permission,
|
|
||||||
PersonPathType,
|
PersonPathType,
|
||||||
QueueName,
|
QueueName,
|
||||||
StorageFolder,
|
StorageFolder,
|
||||||
@ -37,24 +27,6 @@ export class AuditService extends BaseService {
|
|||||||
return JobStatus.SUCCESS;
|
return JobStatus.SUCCESS;
|
||||||
}
|
}
|
||||||
|
|
||||||
async getDeletes(auth: AuthDto, dto: AuditDeletesDto): Promise<AuditDeletesResponseDto> {
|
|
||||||
const userId = dto.userId || auth.user.id;
|
|
||||||
await this.requireAccess({ auth, permission: Permission.TIMELINE_READ, ids: [userId] });
|
|
||||||
|
|
||||||
const audits = await this.auditRepository.getAfter(dto.after, {
|
|
||||||
userIds: [userId],
|
|
||||||
entityType: dto.entityType,
|
|
||||||
action: DatabaseAction.DELETE,
|
|
||||||
});
|
|
||||||
|
|
||||||
const duration = DateTime.now().diff(DateTime.fromJSDate(dto.after));
|
|
||||||
|
|
||||||
return {
|
|
||||||
needsFullSync: duration > AUDIT_LOG_MAX_DURATION,
|
|
||||||
ids: audits,
|
|
||||||
};
|
|
||||||
}
|
|
||||||
|
|
||||||
async getChecksums(dto: FileChecksumDto) {
|
async getChecksums(dto: FileChecksumDto) {
|
||||||
const results: FileChecksumResponseDto[] = [];
|
const results: FileChecksumResponseDto[] = [];
|
||||||
for (const filename of dto.filenames) {
|
for (const filename of dto.filenames) {
|
||||||
|
Loading…
x
Reference in New Issue
Block a user