Fix examples and SDK for Immich v2 API compatibility
Some checks failed
Integration Tests / integration-test (push) Failing after 6s

- Fix AssetUploadStatus serialization to use snake_case (created/duplicate/rejected)
- Fix AssetOrder serialization to use lowercase (asc/desc)
- Add file_created_at/file_modified_at to UploadAssetBuilder
- Fix AddAssetsBuilder response type to Vec<Value> instead of AlbumResponse
- Fix ServerAbout model - version is String not ServerVersion struct
- Update upload_photos.rs to handle duplicate responses correctly
- Update server_info.rs to display new ServerAbout fields
- Update AGENTS.md with new example list
This commit is contained in:
Joakim Hulthe
2026-04-14 20:18:41 +00:00
parent 2e7db3b35a
commit c39e0a5058
6 changed files with 104 additions and 11 deletions

View File

@@ -186,10 +186,66 @@ pub struct ServerFeatures {
#[derive(Debug, Clone, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct ServerAbout {
/// Version information
pub version: ServerVersion,
/// Version string
/// Server version (e.g., "v2.7.5")
pub version: String,
/// URL to version information
pub version_url: String,
/// Build identifier
#[serde(skip_serializing_if = "Option::is_none")]
pub build: Option<String>,
/// Build URL
#[serde(skip_serializing_if = "Option::is_none")]
pub build_url: Option<String>,
/// Build image name
#[serde(skip_serializing_if = "Option::is_none")]
pub build_image: Option<String>,
/// Build image URL
#[serde(skip_serializing_if = "Option::is_none")]
pub build_image_url: Option<String>,
/// ExifTool version
#[serde(skip_serializing_if = "Option::is_none")]
pub exiftool: Option<String>,
/// FFmpeg version
#[serde(skip_serializing_if = "Option::is_none")]
pub ffmpeg: Option<String>,
/// ImageMagick version
#[serde(skip_serializing_if = "Option::is_none")]
pub imagemagick: Option<String>,
/// libvips version
#[serde(skip_serializing_if = "Option::is_none")]
pub libvips: Option<String>,
/// Node.js version
#[serde(skip_serializing_if = "Option::is_none")]
pub nodejs: Option<String>,
/// Repository name
#[serde(skip_serializing_if = "Option::is_none")]
pub repository: Option<String>,
/// Repository URL
#[serde(skip_serializing_if = "Option::is_none")]
pub repository_url: Option<String>,
/// Source commit hash
#[serde(skip_serializing_if = "Option::is_none")]
pub source_commit: Option<String>,
/// Source reference (branch/tag)
#[serde(skip_serializing_if = "Option::is_none")]
pub source_ref: Option<String>,
/// Source URL
#[serde(skip_serializing_if = "Option::is_none")]
pub source_url: Option<String>,
/// Third-party bug/feature URL
#[serde(skip_serializing_if = "Option::is_none")]
pub third_party_bug_feature_url: Option<String>,
/// Third-party documentation URL
#[serde(skip_serializing_if = "Option::is_none")]
pub third_party_documentation_url: Option<String>,
/// Third-party source URL
#[serde(skip_serializing_if = "Option::is_none")]
pub third_party_source_url: Option<String>,
/// Third-party support URL
#[serde(skip_serializing_if = "Option::is_none")]
pub third_party_support_url: Option<String>,
/// Whether the server is licensed
pub licensed: bool,
}
/// Create album request
@@ -248,7 +304,7 @@ pub struct AssetUploadResponse {
/// Asset upload status
#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq)]
#[serde(rename_all = "SCREAMING_SNAKE_CASE")]
#[serde(rename_all = "snake_case")]
pub enum AssetUploadStatus {
/// Upload created new asset
Created,
@@ -284,7 +340,7 @@ pub struct ApiKeyResponse {
/// Asset order enumeration
#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq)]
#[serde(rename_all = "SCREAMING_SNAKE_CASE")]
#[serde(rename_all = "lowercase")]
pub enum AssetOrder {
/// Oldest first
Asc,