feat: mobile editing

This commit is contained in:
bwees
2026-01-20 10:23:43 -06:00
parent e54678e0d6
commit 4fcc88487c
55 changed files with 2817 additions and 816 deletions

View File

@@ -21,6 +21,7 @@ function dart {
patch --no-backup-if-mismatch -u ../mobile/openapi/lib/api_client.dart <./patch/api_client.dart.patch
patch --no-backup-if-mismatch -u ../mobile/openapi/lib/api.dart <./patch/api.dart.patch
patch --no-backup-if-mismatch -u ../mobile/openapi/pubspec.yaml <./patch/pubspec_immich_mobile.yaml.patch
patch --no-backup-if-mismatch -u ../mobile/openapi/lib/model/asset_edit_action_list_dto_edits_inner.dart <./patch/asset_edit_action_list_dto_edits_inner.dart.patch
# Don't include analysis_options.yaml for the generated openapi files
# so that language servers can properly exclude the mobile/openapi directory
rm ../mobile/openapi/analysis_options.yaml

View File

@@ -15954,12 +15954,10 @@
"AssetDeltaSyncDto": {
"properties": {
"updatedAfter": {
"description": "Sync assets updated after this date",
"format": "date-time",
"type": "string"
},
"userIds": {
"description": "User IDs to sync",
"items": {
"format": "uuid",
"type": "string"
@@ -15976,18 +15974,15 @@
"AssetDeltaSyncResponseDto": {
"properties": {
"deleted": {
"description": "Deleted asset IDs",
"items": {
"type": "string"
},
"type": "array"
},
"needsFullSync": {
"description": "Whether full sync is needed",
"type": "boolean"
},
"upserted": {
"description": "Upserted assets",
"items": {
"$ref": "#/components/schemas/AssetResponseDto"
},
@@ -16338,22 +16333,18 @@
"AssetFullSyncDto": {
"properties": {
"lastId": {
"description": "Last asset ID (pagination)",
"format": "uuid",
"type": "string"
},
"limit": {
"description": "Maximum number of assets to return",
"minimum": 1,
"type": "integer"
},
"updatedUntil": {
"description": "Sync assets updated until this date",
"format": "date-time",
"type": "string"
},
"userId": {
"description": "Filter by user ID",
"format": "uuid",
"type": "string"
}
@@ -22266,7 +22257,6 @@
"SyncAckDeleteDto": {
"properties": {
"types": {
"description": "Sync entity types to delete acks for",
"items": {
"$ref": "#/components/schemas/SyncEntityType"
},
@@ -22278,7 +22268,6 @@
"SyncAckDto": {
"properties": {
"ack": {
"description": "Acknowledgment ID",
"type": "string"
},
"type": {
@@ -22286,8 +22275,7 @@
{
"$ref": "#/components/schemas/SyncEntityType"
}
],
"description": "Sync entity type"
]
}
},
"required": [
@@ -22299,7 +22287,6 @@
"SyncAckSetDto": {
"properties": {
"acks": {
"description": "Acknowledgment IDs (max 1000)",
"items": {
"type": "string"
},
@@ -22319,7 +22306,6 @@
"SyncAlbumDeleteV1": {
"properties": {
"albumId": {
"description": "Album ID",
"type": "string"
}
},
@@ -22331,11 +22317,9 @@
"SyncAlbumToAssetDeleteV1": {
"properties": {
"albumId": {
"description": "Album ID",
"type": "string"
},
"assetId": {
"description": "Asset ID",
"type": "string"
}
},
@@ -22348,11 +22332,9 @@
"SyncAlbumToAssetV1": {
"properties": {
"albumId": {
"description": "Album ID",
"type": "string"
},
"assetId": {
"description": "Asset ID",
"type": "string"
}
},
@@ -22365,11 +22347,9 @@
"SyncAlbumUserDeleteV1": {
"properties": {
"albumId": {
"description": "Album ID",
"type": "string"
},
"userId": {
"description": "User ID",
"type": "string"
}
},
@@ -22382,7 +22362,6 @@
"SyncAlbumUserV1": {
"properties": {
"albumId": {
"description": "Album ID",
"type": "string"
},
"role": {
@@ -22390,11 +22369,9 @@
{
"$ref": "#/components/schemas/AlbumUserRole"
}
],
"description": "Album user role"
]
},
"userId": {
"description": "User ID",
"type": "string"
}
},
@@ -22408,24 +22385,19 @@
"SyncAlbumV1": {
"properties": {
"createdAt": {
"description": "Created at",
"format": "date-time",
"type": "string"
},
"description": {
"description": "Album description",
"type": "string"
},
"id": {
"description": "Album ID",
"type": "string"
},
"isActivityEnabled": {
"description": "Is activity enabled",
"type": "boolean"
},
"name": {
"description": "Album name",
"type": "string"
},
"order": {
@@ -22436,16 +22408,13 @@
]
},
"ownerId": {
"description": "Owner ID",
"type": "string"
},
"thumbnailAssetId": {
"description": "Thumbnail asset ID",
"nullable": true,
"type": "string"
},
"updatedAt": {
"description": "Updated at",
"format": "date-time",
"type": "string"
}
@@ -22466,7 +22435,6 @@
"SyncAssetDeleteV1": {
"properties": {
"assetId": {
"description": "Asset ID",
"type": "string"
}
},
@@ -22475,136 +22443,153 @@
],
"type": "object"
},
"SyncAssetEditDeleteV1": {
"properties": {
"assetId": {
"type": "string"
}
},
"required": [
"assetId"
],
"type": "object"
},
"SyncAssetEditV1": {
"properties": {
"action": {
"allOf": [
{
"$ref": "#/components/schemas/AssetEditAction"
}
]
},
"assetId": {
"type": "string"
},
"id": {
"type": "string"
},
"parameters": {
"type": "object"
},
"sequence": {
"type": "integer"
}
},
"required": [
"action",
"assetId",
"id",
"parameters",
"sequence"
],
"type": "object"
},
"SyncAssetExifV1": {
"properties": {
"assetId": {
"description": "Asset ID",
"type": "string"
},
"city": {
"description": "City",
"nullable": true,
"type": "string"
},
"country": {
"description": "Country",
"nullable": true,
"type": "string"
},
"dateTimeOriginal": {
"description": "Date time original",
"format": "date-time",
"nullable": true,
"type": "string"
},
"description": {
"description": "Description",
"nullable": true,
"type": "string"
},
"exifImageHeight": {
"description": "Exif image height",
"nullable": true,
"type": "integer"
},
"exifImageWidth": {
"description": "Exif image width",
"nullable": true,
"type": "integer"
},
"exposureTime": {
"description": "Exposure time",
"nullable": true,
"type": "string"
},
"fNumber": {
"description": "F number",
"format": "double",
"nullable": true,
"type": "number"
},
"fileSizeInByte": {
"description": "File size in byte",
"nullable": true,
"type": "integer"
},
"focalLength": {
"description": "Focal length",
"format": "double",
"nullable": true,
"type": "number"
},
"fps": {
"description": "FPS",
"format": "double",
"nullable": true,
"type": "number"
},
"iso": {
"description": "ISO",
"nullable": true,
"type": "integer"
},
"latitude": {
"description": "Latitude",
"format": "double",
"nullable": true,
"type": "number"
},
"lensModel": {
"description": "Lens model",
"nullable": true,
"type": "string"
},
"longitude": {
"description": "Longitude",
"format": "double",
"nullable": true,
"type": "number"
},
"make": {
"description": "Make",
"nullable": true,
"type": "string"
},
"model": {
"description": "Model",
"nullable": true,
"type": "string"
},
"modifyDate": {
"description": "Modify date",
"format": "date-time",
"nullable": true,
"type": "string"
},
"orientation": {
"description": "Orientation",
"nullable": true,
"type": "string"
},
"profileDescription": {
"description": "Profile description",
"nullable": true,
"type": "string"
},
"projectionType": {
"description": "Projection type",
"nullable": true,
"type": "string"
},
"rating": {
"description": "Rating",
"nullable": true,
"type": "integer"
},
"state": {
"description": "State",
"nullable": true,
"type": "string"
},
"timeZone": {
"description": "Time zone",
"nullable": true,
"type": "string"
}
@@ -22641,7 +22626,6 @@
"SyncAssetFaceDeleteV1": {
"properties": {
"assetFaceId": {
"description": "Asset face ID",
"type": "string"
}
},
@@ -22653,7 +22637,6 @@
"SyncAssetFaceV1": {
"properties": {
"assetId": {
"description": "Asset ID",
"type": "string"
},
"boundingBoxX1": {
@@ -22669,7 +22652,6 @@
"type": "integer"
},
"id": {
"description": "Asset face ID",
"type": "string"
},
"imageHeight": {
@@ -22679,12 +22661,10 @@
"type": "integer"
},
"personId": {
"description": "Person ID",
"nullable": true,
"type": "string"
},
"sourceType": {
"description": "Source type",
"type": "string"
}
},
@@ -22705,11 +22685,9 @@
"SyncAssetMetadataDeleteV1": {
"properties": {
"assetId": {
"description": "Asset ID",
"type": "string"
},
"key": {
"description": "Key",
"type": "string"
}
},
@@ -22722,15 +22700,12 @@
"SyncAssetMetadataV1": {
"properties": {
"assetId": {
"description": "Asset ID",
"type": "string"
},
"key": {
"description": "Key",
"type": "string"
},
"value": {
"description": "Value",
"type": "object"
}
},
@@ -22744,80 +22719,64 @@
"SyncAssetV1": {
"properties": {
"checksum": {
"description": "Checksum",
"type": "string"
},
"deletedAt": {
"description": "Deleted at",
"format": "date-time",
"nullable": true,
"type": "string"
},
"duration": {
"description": "Duration",
"nullable": true,
"type": "string"
},
"fileCreatedAt": {
"description": "File created at",
"format": "date-time",
"nullable": true,
"type": "string"
},
"fileModifiedAt": {
"description": "File modified at",
"format": "date-time",
"nullable": true,
"type": "string"
},
"height": {
"description": "Asset height",
"nullable": true,
"type": "integer"
},
"id": {
"description": "Asset ID",
"type": "string"
},
"isEdited": {
"description": "Is edited",
"type": "boolean"
},
"isFavorite": {
"description": "Is favorite",
"type": "boolean"
},
"libraryId": {
"description": "Library ID",
"nullable": true,
"type": "string"
},
"livePhotoVideoId": {
"description": "Live photo video ID",
"nullable": true,
"type": "string"
},
"localDateTime": {
"description": "Local date time",
"format": "date-time",
"nullable": true,
"type": "string"
},
"originalFileName": {
"description": "Original file name",
"type": "string"
},
"ownerId": {
"description": "Owner ID",
"type": "string"
},
"stackId": {
"description": "Stack ID",
"nullable": true,
"type": "string"
},
"thumbhash": {
"description": "Thumbhash",
"nullable": true,
"type": "string"
},
@@ -22826,19 +22785,16 @@
{
"$ref": "#/components/schemas/AssetTypeEnum"
}
],
"description": "Asset type"
]
},
"visibility": {
"allOf": [
{
"$ref": "#/components/schemas/AssetVisibility"
}
],
"description": "Asset visibility"
]
},
"width": {
"description": "Asset width",
"nullable": true,
"type": "integer"
}
@@ -22874,46 +22830,36 @@
"$ref": "#/components/schemas/UserAvatarColor"
}
],
"description": "User avatar color",
"nullable": true
},
"deletedAt": {
"description": "User deleted at",
"format": "date-time",
"nullable": true,
"type": "string"
},
"email": {
"description": "User email",
"type": "string"
},
"hasProfileImage": {
"description": "User has profile image",
"type": "boolean"
},
"id": {
"description": "User ID",
"type": "string"
},
"isAdmin": {
"description": "User is admin",
"type": "boolean"
},
"name": {
"description": "User name",
"type": "string"
},
"oauthId": {
"description": "User OAuth ID",
"type": "string"
},
"pinCode": {
"description": "User pin code",
"nullable": true,
"type": "string"
},
"profileChangedAt": {
"description": "User profile changed at",
"format": "date-time",
"type": "string"
},
@@ -22925,7 +22871,6 @@
"type": "integer"
},
"storageLabel": {
"description": "User storage label",
"nullable": true,
"type": "string"
}
@@ -22952,7 +22897,6 @@
"type": "object"
},
"SyncEntityType": {
"description": "Sync entity type",
"enum": [
"AuthUserV1",
"UserV1",
@@ -22960,6 +22904,8 @@
"AssetV1",
"AssetDeleteV1",
"AssetExifV1",
"AssetEditV1",
"AssetEditDeleteV1",
"AssetMetadataV1",
"AssetMetadataDeleteV1",
"PartnerV1",
@@ -23007,11 +22953,9 @@
"SyncMemoryAssetDeleteV1": {
"properties": {
"assetId": {
"description": "Asset ID",
"type": "string"
},
"memoryId": {
"description": "Memory ID",
"type": "string"
}
},
@@ -23024,11 +22968,9 @@
"SyncMemoryAssetV1": {
"properties": {
"assetId": {
"description": "Asset ID",
"type": "string"
},
"memoryId": {
"description": "Memory ID",
"type": "string"
}
},
@@ -23041,7 +22983,6 @@
"SyncMemoryDeleteV1": {
"properties": {
"memoryId": {
"description": "Memory ID",
"type": "string"
}
},
@@ -23053,51 +22994,41 @@
"SyncMemoryV1": {
"properties": {
"createdAt": {
"description": "Created at",
"format": "date-time",
"type": "string"
},
"data": {
"description": "Data",
"type": "object"
},
"deletedAt": {
"description": "Deleted at",
"format": "date-time",
"nullable": true,
"type": "string"
},
"hideAt": {
"description": "Hide at",
"format": "date-time",
"nullable": true,
"type": "string"
},
"id": {
"description": "Memory ID",
"type": "string"
},
"isSaved": {
"description": "Is saved",
"type": "boolean"
},
"memoryAt": {
"description": "Memory at",
"format": "date-time",
"type": "string"
},
"ownerId": {
"description": "Owner ID",
"type": "string"
},
"seenAt": {
"description": "Seen at",
"format": "date-time",
"nullable": true,
"type": "string"
},
"showAt": {
"description": "Show at",
"format": "date-time",
"nullable": true,
"type": "string"
@@ -23107,11 +23038,9 @@
{
"$ref": "#/components/schemas/MemoryType"
}
],
"description": "Memory type"
]
},
"updatedAt": {
"description": "Updated at",
"format": "date-time",
"type": "string"
}
@@ -23135,11 +23064,9 @@
"SyncPartnerDeleteV1": {
"properties": {
"sharedById": {
"description": "Shared by ID",
"type": "string"
},
"sharedWithId": {
"description": "Shared with ID",
"type": "string"
}
},
@@ -23152,15 +23079,12 @@
"SyncPartnerV1": {
"properties": {
"inTimeline": {
"description": "In timeline",
"type": "boolean"
},
"sharedById": {
"description": "Shared by ID",
"type": "string"
},
"sharedWithId": {
"description": "Shared with ID",
"type": "string"
}
},
@@ -23174,7 +23098,6 @@
"SyncPersonDeleteV1": {
"properties": {
"personId": {
"description": "Person ID",
"type": "string"
}
},
@@ -23186,48 +23109,38 @@
"SyncPersonV1": {
"properties": {
"birthDate": {
"description": "Birth date",
"format": "date-time",
"nullable": true,
"type": "string"
},
"color": {
"description": "Color",
"nullable": true,
"type": "string"
},
"createdAt": {
"description": "Created at",
"format": "date-time",
"type": "string"
},
"faceAssetId": {
"description": "Face asset ID",
"nullable": true,
"type": "string"
},
"id": {
"description": "Person ID",
"type": "string"
},
"isFavorite": {
"description": "Is favorite",
"type": "boolean"
},
"isHidden": {
"description": "Is hidden",
"type": "boolean"
},
"name": {
"description": "Person name",
"type": "string"
},
"ownerId": {
"description": "Owner ID",
"type": "string"
},
"updatedAt": {
"description": "Updated at",
"format": "date-time",
"type": "string"
}
@@ -23247,7 +23160,6 @@
"type": "object"
},
"SyncRequestType": {
"description": "Sync request types",
"enum": [
"AlbumsV1",
"AlbumUsersV1",
@@ -23256,6 +23168,7 @@
"AlbumAssetExifsV1",
"AssetsV1",
"AssetExifsV1",
"AssetEditsV1",
"AssetMetadataV1",
"AuthUsersV1",
"MemoriesV1",
@@ -23279,7 +23192,6 @@
"SyncStackDeleteV1": {
"properties": {
"stackId": {
"description": "Stack ID",
"type": "string"
}
},
@@ -23291,24 +23203,19 @@
"SyncStackV1": {
"properties": {
"createdAt": {
"description": "Created at",
"format": "date-time",
"type": "string"
},
"id": {
"description": "Stack ID",
"type": "string"
},
"ownerId": {
"description": "Owner ID",
"type": "string"
},
"primaryAssetId": {
"description": "Primary asset ID",
"type": "string"
},
"updatedAt": {
"description": "Updated at",
"format": "date-time",
"type": "string"
}
@@ -23325,11 +23232,9 @@
"SyncStreamDto": {
"properties": {
"reset": {
"description": "Reset sync state",
"type": "boolean"
},
"types": {
"description": "Sync request types",
"items": {
"$ref": "#/components/schemas/SyncRequestType"
},
@@ -23344,7 +23249,6 @@
"SyncUserDeleteV1": {
"properties": {
"userId": {
"description": "User ID",
"type": "string"
}
},
@@ -23360,11 +23264,9 @@
{
"$ref": "#/components/schemas/UserMetadataKey"
}
],
"description": "User metadata key"
]
},
"userId": {
"description": "User ID",
"type": "string"
}
},
@@ -23381,15 +23283,12 @@
{
"$ref": "#/components/schemas/UserMetadataKey"
}
],
"description": "User metadata key"
]
},
"userId": {
"description": "User ID",
"type": "string"
},
"value": {
"description": "User metadata value",
"type": "object"
}
},
@@ -23408,33 +23307,26 @@
"$ref": "#/components/schemas/UserAvatarColor"
}
],
"description": "User avatar color",
"nullable": true
},
"deletedAt": {
"description": "User deleted at",
"format": "date-time",
"nullable": true,
"type": "string"
},
"email": {
"description": "User email",
"type": "string"
},
"hasProfileImage": {
"description": "User has profile image",
"type": "boolean"
},
"id": {
"description": "User ID",
"type": "string"
},
"name": {
"description": "User name",
"type": "string"
},
"profileChangedAt": {
"description": "User profile changed at",
"format": "date-time",
"type": "string"
}
@@ -25333,7 +25225,6 @@
"type": "object"
},
"UserMetadataKey": {
"description": "User metadata key",
"enum": [
"preferences",
"license",

View File

@@ -0,0 +1,20 @@
--- /tmp/asset_edit_orig.dart 2026-01-20 10:38:05
+++ /tmp/asset_edit_final.dart 2026-01-20 10:40:33
@@ -19,7 +19,7 @@
AssetEditAction action;
- MirrorParameters parameters;
+ Map<String, dynamic> parameters;
@override
bool operator ==(Object other) => identical(this, other) || other is AssetEditActionListDtoEditsInner &&
@@ -62,7 +62,7 @@
return AssetEditActionListDtoEditsInner(
action: AssetEditAction.fromJson(json[r'action'])!,
- parameters: MirrorParameters.fromJson(json[r'parameters'])!,
+ parameters: json[r'parameters'],
);
}
return null;

View File

@@ -2955,6 +2955,16 @@ export type SyncAssetDeleteV1 = {
/** Asset ID */
assetId: string;
};
export type SyncAssetEditDeleteV1 = {
assetId: string;
};
export type SyncAssetEditV1 = {
action: AssetEditAction;
assetId: string;
id: string;
parameters: object;
sequence: number;
};
export type SyncAssetExifV1 = {
/** Asset ID */
assetId: string;
@@ -7178,6 +7188,8 @@ export enum SyncEntityType {
AssetV1 = "AssetV1",
AssetDeleteV1 = "AssetDeleteV1",
AssetExifV1 = "AssetExifV1",
AssetEditV1 = "AssetEditV1",
AssetEditDeleteV1 = "AssetEditDeleteV1",
AssetMetadataV1 = "AssetMetadataV1",
AssetMetadataDeleteV1 = "AssetMetadataDeleteV1",
PartnerV1 = "PartnerV1",
@@ -7228,6 +7240,7 @@ export enum SyncRequestType {
AlbumAssetExifsV1 = "AlbumAssetExifsV1",
AssetsV1 = "AssetsV1",
AssetExifsV1 = "AssetExifsV1",
AssetEditsV1 = "AssetEditsV1",
AssetMetadataV1 = "AssetMetadataV1",
AuthUsersV1 = "AuthUsersV1",
MemoriesV1 = "MemoriesV1",