mirror of
https://github.com/immich-app/immich
synced 2025-11-07 17:27:20 +00:00
MUST NOT validation
This commit is contained in:
parent
b1a2e7708e
commit
38d2a03836
8 changed files with 144 additions and 13 deletions
1
mobile/openapi/README.md
generated
1
mobile/openapi/README.md
generated
|
|
@ -577,6 +577,7 @@ Class | Method | HTTP request | Description
|
||||||
- [UpdateAlbumUserDto](doc//UpdateAlbumUserDto.md)
|
- [UpdateAlbumUserDto](doc//UpdateAlbumUserDto.md)
|
||||||
- [UpdateAssetDto](doc//UpdateAssetDto.md)
|
- [UpdateAssetDto](doc//UpdateAssetDto.md)
|
||||||
- [UpdateLibraryDto](doc//UpdateLibraryDto.md)
|
- [UpdateLibraryDto](doc//UpdateLibraryDto.md)
|
||||||
|
- [UploadOkDto](doc//UploadOkDto.md)
|
||||||
- [UsageByUserDto](doc//UsageByUserDto.md)
|
- [UsageByUserDto](doc//UsageByUserDto.md)
|
||||||
- [UserAdminCreateDto](doc//UserAdminCreateDto.md)
|
- [UserAdminCreateDto](doc//UserAdminCreateDto.md)
|
||||||
- [UserAdminDeleteDto](doc//UserAdminDeleteDto.md)
|
- [UserAdminDeleteDto](doc//UserAdminDeleteDto.md)
|
||||||
|
|
|
||||||
1
mobile/openapi/lib/api.dart
generated
1
mobile/openapi/lib/api.dart
generated
|
|
@ -344,6 +344,7 @@ part 'model/update_album_dto.dart';
|
||||||
part 'model/update_album_user_dto.dart';
|
part 'model/update_album_user_dto.dart';
|
||||||
part 'model/update_asset_dto.dart';
|
part 'model/update_asset_dto.dart';
|
||||||
part 'model/update_library_dto.dart';
|
part 'model/update_library_dto.dart';
|
||||||
|
part 'model/upload_ok_dto.dart';
|
||||||
part 'model/usage_by_user_dto.dart';
|
part 'model/usage_by_user_dto.dart';
|
||||||
part 'model/user_admin_create_dto.dart';
|
part 'model/user_admin_create_dto.dart';
|
||||||
part 'model/user_admin_delete_dto.dart';
|
part 'model/user_admin_delete_dto.dart';
|
||||||
|
|
|
||||||
8
mobile/openapi/lib/api/upload_api.dart
generated
8
mobile/openapi/lib/api/upload_api.dart
generated
|
|
@ -259,7 +259,7 @@ class UploadApi {
|
||||||
/// * [String] key:
|
/// * [String] key:
|
||||||
///
|
///
|
||||||
/// * [String] slug:
|
/// * [String] slug:
|
||||||
Future<Object?> resumeUpload(String contentLength, String id, String uploadComplete, String uploadDraftInteropVersion, String uploadOffset, { String? key, String? slug, }) async {
|
Future<UploadOkDto?> resumeUpload(String contentLength, String id, String uploadComplete, String uploadDraftInteropVersion, String uploadOffset, { String? key, String? slug, }) async {
|
||||||
final response = await resumeUploadWithHttpInfo(contentLength, id, uploadComplete, uploadDraftInteropVersion, uploadOffset, key: key, slug: slug, );
|
final response = await resumeUploadWithHttpInfo(contentLength, id, uploadComplete, uploadDraftInteropVersion, uploadOffset, key: key, slug: slug, );
|
||||||
if (response.statusCode >= HttpStatus.badRequest) {
|
if (response.statusCode >= HttpStatus.badRequest) {
|
||||||
throw ApiException(response.statusCode, await _decodeBodyBytes(response));
|
throw ApiException(response.statusCode, await _decodeBodyBytes(response));
|
||||||
|
|
@ -268,7 +268,7 @@ class UploadApi {
|
||||||
// At the time of writing this, `dart:convert` will throw an "Unexpected end of input"
|
// At the time of writing this, `dart:convert` will throw an "Unexpected end of input"
|
||||||
// FormatException when trying to decode an empty string.
|
// FormatException when trying to decode an empty string.
|
||||||
if (response.body.isNotEmpty && response.statusCode != HttpStatus.noContent) {
|
if (response.body.isNotEmpty && response.statusCode != HttpStatus.noContent) {
|
||||||
return await apiClient.deserializeAsync(await _decodeBodyBytes(response), 'Object',) as Object;
|
return await apiClient.deserializeAsync(await _decodeBodyBytes(response), 'UploadOkDto',) as UploadOkDto;
|
||||||
|
|
||||||
}
|
}
|
||||||
return null;
|
return null;
|
||||||
|
|
@ -358,7 +358,7 @@ class UploadApi {
|
||||||
/// * [String] key:
|
/// * [String] key:
|
||||||
///
|
///
|
||||||
/// * [String] slug:
|
/// * [String] slug:
|
||||||
Future<Object?> startUpload(String contentLength, String reprDigest, String uploadComplete, String uploadDraftInteropVersion, String xImmichAssetData, { String? key, String? slug, }) async {
|
Future<UploadOkDto?> startUpload(String contentLength, String reprDigest, String uploadComplete, String uploadDraftInteropVersion, String xImmichAssetData, { String? key, String? slug, }) async {
|
||||||
final response = await startUploadWithHttpInfo(contentLength, reprDigest, uploadComplete, uploadDraftInteropVersion, xImmichAssetData, key: key, slug: slug, );
|
final response = await startUploadWithHttpInfo(contentLength, reprDigest, uploadComplete, uploadDraftInteropVersion, xImmichAssetData, key: key, slug: slug, );
|
||||||
if (response.statusCode >= HttpStatus.badRequest) {
|
if (response.statusCode >= HttpStatus.badRequest) {
|
||||||
throw ApiException(response.statusCode, await _decodeBodyBytes(response));
|
throw ApiException(response.statusCode, await _decodeBodyBytes(response));
|
||||||
|
|
@ -367,7 +367,7 @@ class UploadApi {
|
||||||
// At the time of writing this, `dart:convert` will throw an "Unexpected end of input"
|
// At the time of writing this, `dart:convert` will throw an "Unexpected end of input"
|
||||||
// FormatException when trying to decode an empty string.
|
// FormatException when trying to decode an empty string.
|
||||||
if (response.body.isNotEmpty && response.statusCode != HttpStatus.noContent) {
|
if (response.body.isNotEmpty && response.statusCode != HttpStatus.noContent) {
|
||||||
return await apiClient.deserializeAsync(await _decodeBodyBytes(response), 'Object',) as Object;
|
return await apiClient.deserializeAsync(await _decodeBodyBytes(response), 'UploadOkDto',) as UploadOkDto;
|
||||||
|
|
||||||
}
|
}
|
||||||
return null;
|
return null;
|
||||||
|
|
|
||||||
2
mobile/openapi/lib/api_client.dart
generated
2
mobile/openapi/lib/api_client.dart
generated
|
|
@ -740,6 +740,8 @@ class ApiClient {
|
||||||
return UpdateAssetDto.fromJson(value);
|
return UpdateAssetDto.fromJson(value);
|
||||||
case 'UpdateLibraryDto':
|
case 'UpdateLibraryDto':
|
||||||
return UpdateLibraryDto.fromJson(value);
|
return UpdateLibraryDto.fromJson(value);
|
||||||
|
case 'UploadOkDto':
|
||||||
|
return UploadOkDto.fromJson(value);
|
||||||
case 'UsageByUserDto':
|
case 'UsageByUserDto':
|
||||||
return UsageByUserDto.fromJson(value);
|
return UsageByUserDto.fromJson(value);
|
||||||
case 'UserAdminCreateDto':
|
case 'UserAdminCreateDto':
|
||||||
|
|
|
||||||
99
mobile/openapi/lib/model/upload_ok_dto.dart
generated
Normal file
99
mobile/openapi/lib/model/upload_ok_dto.dart
generated
Normal file
|
|
@ -0,0 +1,99 @@
|
||||||
|
//
|
||||||
|
// 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 UploadOkDto {
|
||||||
|
/// Returns a new [UploadOkDto] instance.
|
||||||
|
UploadOkDto({
|
||||||
|
required this.id,
|
||||||
|
});
|
||||||
|
|
||||||
|
String id;
|
||||||
|
|
||||||
|
@override
|
||||||
|
bool operator ==(Object other) => identical(this, other) || other is UploadOkDto &&
|
||||||
|
other.id == id;
|
||||||
|
|
||||||
|
@override
|
||||||
|
int get hashCode =>
|
||||||
|
// ignore: unnecessary_parenthesis
|
||||||
|
(id.hashCode);
|
||||||
|
|
||||||
|
@override
|
||||||
|
String toString() => 'UploadOkDto[id=$id]';
|
||||||
|
|
||||||
|
Map<String, dynamic> toJson() {
|
||||||
|
final json = <String, dynamic>{};
|
||||||
|
json[r'id'] = this.id;
|
||||||
|
return json;
|
||||||
|
}
|
||||||
|
|
||||||
|
/// Returns a new [UploadOkDto] instance and imports its values from
|
||||||
|
/// [value] if it's a [Map], null otherwise.
|
||||||
|
// ignore: prefer_constructors_over_static_methods
|
||||||
|
static UploadOkDto? fromJson(dynamic value) {
|
||||||
|
upgradeDto(value, "UploadOkDto");
|
||||||
|
if (value is Map) {
|
||||||
|
final json = value.cast<String, dynamic>();
|
||||||
|
|
||||||
|
return UploadOkDto(
|
||||||
|
id: mapValueOfType<String>(json, r'id')!,
|
||||||
|
);
|
||||||
|
}
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
static List<UploadOkDto> listFromJson(dynamic json, {bool growable = false,}) {
|
||||||
|
final result = <UploadOkDto>[];
|
||||||
|
if (json is List && json.isNotEmpty) {
|
||||||
|
for (final row in json) {
|
||||||
|
final value = UploadOkDto.fromJson(row);
|
||||||
|
if (value != null) {
|
||||||
|
result.add(value);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return result.toList(growable: growable);
|
||||||
|
}
|
||||||
|
|
||||||
|
static Map<String, UploadOkDto> mapFromJson(dynamic json) {
|
||||||
|
final map = <String, UploadOkDto>{};
|
||||||
|
if (json is Map && json.isNotEmpty) {
|
||||||
|
json = json.cast<String, dynamic>(); // ignore: parameter_assignments
|
||||||
|
for (final entry in json.entries) {
|
||||||
|
final value = UploadOkDto.fromJson(entry.value);
|
||||||
|
if (value != null) {
|
||||||
|
map[entry.key] = value;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return map;
|
||||||
|
}
|
||||||
|
|
||||||
|
// maps a json object with a list of UploadOkDto-objects as value to a dart map
|
||||||
|
static Map<String, List<UploadOkDto>> mapListFromJson(dynamic json, {bool growable = false,}) {
|
||||||
|
final map = <String, List<UploadOkDto>>{};
|
||||||
|
if (json is Map && json.isNotEmpty) {
|
||||||
|
// ignore: parameter_assignments
|
||||||
|
json = json.cast<String, dynamic>();
|
||||||
|
for (final entry in json.entries) {
|
||||||
|
map[entry.key] = UploadOkDto.listFromJson(entry.value, growable: growable,);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return map;
|
||||||
|
}
|
||||||
|
|
||||||
|
/// The list of required keys that must be present in a JSON.
|
||||||
|
static const requiredKeys = <String>{
|
||||||
|
'id',
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
|
@ -17685,7 +17685,14 @@
|
||||||
"type": "object"
|
"type": "object"
|
||||||
},
|
},
|
||||||
"UploadOkDto": {
|
"UploadOkDto": {
|
||||||
"properties": {},
|
"properties": {
|
||||||
|
"id": {
|
||||||
|
"type": "string"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"required": [
|
||||||
|
"id"
|
||||||
|
],
|
||||||
"type": "object"
|
"type": "object"
|
||||||
},
|
},
|
||||||
"UsageByUserDto": {
|
"UsageByUserDto": {
|
||||||
|
|
|
||||||
|
|
@ -1595,7 +1595,9 @@ export type TimeBucketsResponseDto = {
|
||||||
export type TrashResponseDto = {
|
export type TrashResponseDto = {
|
||||||
count: number;
|
count: number;
|
||||||
};
|
};
|
||||||
export type UploadOkDto = {};
|
export type UploadOkDto = {
|
||||||
|
id: string;
|
||||||
|
};
|
||||||
export type UserUpdateMeDto = {
|
export type UserUpdateMeDto = {
|
||||||
avatarColor?: (UserAvatarColor) | null;
|
avatarColor?: (UserAvatarColor) | null;
|
||||||
email?: string;
|
email?: string;
|
||||||
|
|
|
||||||
|
|
@ -1,6 +1,7 @@
|
||||||
import { BadRequestException } from '@nestjs/common';
|
import { BadRequestException } from '@nestjs/common';
|
||||||
|
import { ApiProperty } from '@nestjs/swagger';
|
||||||
import { Expose, plainToInstance, Transform, Type } from 'class-transformer';
|
import { Expose, plainToInstance, Transform, Type } from 'class-transformer';
|
||||||
import { Equals, IsEnum, IsInt, IsNotEmpty, IsString, Min, ValidateIf, ValidateNested } from 'class-validator';
|
import { Equals, IsEmpty, IsEnum, IsInt, IsNotEmpty, IsString, Min, ValidateIf, ValidateNested } from 'class-validator';
|
||||||
import { ImmichHeader } from 'src/enum';
|
import { ImmichHeader } from 'src/enum';
|
||||||
import { Optional, ValidateBoolean, ValidateDate } from 'src/validation';
|
import { Optional, ValidateBoolean, ValidateDate } from 'src/validation';
|
||||||
import { parseDictionary } from 'structured-headers';
|
import { parseDictionary } from 'structured-headers';
|
||||||
|
|
@ -39,13 +40,14 @@ export enum StructuredBoolean {
|
||||||
}
|
}
|
||||||
|
|
||||||
export enum UploadHeader {
|
export enum UploadHeader {
|
||||||
UploadOffset = 'upload-offset',
|
|
||||||
ContentLength = 'content-length',
|
ContentLength = 'content-length',
|
||||||
UploadLength = 'upload-length',
|
ContentType = 'content-type',
|
||||||
UploadComplete = 'upload-complete',
|
|
||||||
UploadIncomplete = 'upload-incomplete',
|
|
||||||
InteropVersion = 'upload-draft-interop-version',
|
InteropVersion = 'upload-draft-interop-version',
|
||||||
ReprDigest = 'repr-digest',
|
ReprDigest = 'repr-digest',
|
||||||
|
UploadComplete = 'upload-complete',
|
||||||
|
UploadIncomplete = 'upload-incomplete',
|
||||||
|
UploadLength = 'upload-length',
|
||||||
|
UploadOffset = 'upload-offset',
|
||||||
}
|
}
|
||||||
|
|
||||||
class BaseRufhHeadersDto {
|
class BaseRufhHeadersDto {
|
||||||
|
|
@ -126,10 +128,14 @@ export class StartUploadDto extends BaseUploadHeadersDto {
|
||||||
@IsInt()
|
@IsInt()
|
||||||
@Type(() => Number)
|
@Type(() => Number)
|
||||||
uploadLength!: number;
|
uploadLength!: number;
|
||||||
|
|
||||||
|
@Expose({ name: UploadHeader.UploadOffset })
|
||||||
|
@IsEmpty()
|
||||||
|
uploadOffset: string | undefined;
|
||||||
}
|
}
|
||||||
|
|
||||||
export class ResumeUploadDto extends BaseUploadHeadersDto {
|
export class ResumeUploadDto extends BaseUploadHeadersDto {
|
||||||
@Expose({ name: 'content-type' })
|
@Expose({ name: UploadHeader.ContentType })
|
||||||
@ValidateIf((o) => o.version && o.version >= 6)
|
@ValidateIf((o) => o.version && o.version >= 6)
|
||||||
@Equals('application/partial-upload')
|
@Equals('application/partial-upload')
|
||||||
contentType!: string;
|
contentType!: string;
|
||||||
|
|
@ -148,8 +154,21 @@ export class ResumeUploadDto extends BaseUploadHeadersDto {
|
||||||
uploadOffset!: number;
|
uploadOffset!: number;
|
||||||
}
|
}
|
||||||
|
|
||||||
export class GetUploadStatusDto extends BaseRufhHeadersDto {}
|
export class GetUploadStatusDto extends BaseRufhHeadersDto {
|
||||||
|
@Expose({ name: UploadHeader.UploadComplete })
|
||||||
|
@IsEmpty()
|
||||||
|
uploadComplete: string | undefined;
|
||||||
|
|
||||||
|
@Expose({ name: UploadHeader.UploadIncomplete })
|
||||||
|
@IsEmpty()
|
||||||
|
uploadIncomplete: string | undefined;
|
||||||
|
|
||||||
|
@Expose({ name: UploadHeader.UploadOffset })
|
||||||
|
@IsEmpty()
|
||||||
|
uploadOffset: string | undefined;
|
||||||
|
}
|
||||||
|
|
||||||
export class UploadOkDto {
|
export class UploadOkDto {
|
||||||
|
@ApiProperty()
|
||||||
id!: string;
|
id!: string;
|
||||||
}
|
}
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue