mirror of
https://github.com/immich-app/immich.git
synced 2026-05-18 03:10:24 +03:00
92bc22620b
add schemas sync variants formatting initial implementation use existing db, wip move to separate folder fix table definitions wip wiring it up repository pattern
415 lines
8.9 KiB
Swift
415 lines
8.9 KiB
Swift
import SQLiteData
|
|
|
|
extension QueryExpression where QueryValue: _OptionalProtocol {
|
|
// asserts column result cannot be nil
|
|
var unwrapped: SQLQueryExpression<QueryValue.Wrapped> {
|
|
SQLQueryExpression(self.queryFragment, as: QueryValue.Wrapped.self)
|
|
}
|
|
}
|
|
|
|
extension Date {
|
|
var unixTime: Date.UnixTimeRepresentation {
|
|
return Date.UnixTimeRepresentation(queryOutput: self)
|
|
}
|
|
}
|
|
|
|
@Table("asset_face_entity")
|
|
struct AssetFace: Identifiable {
|
|
let id: String
|
|
@Column("asset_id")
|
|
let assetId: RemoteAsset.ID
|
|
@Column("person_id")
|
|
let personId: Person.ID?
|
|
@Column("image_width")
|
|
let imageWidth: Int
|
|
@Column("image_height")
|
|
let imageHeight: Int
|
|
@Column("bounding_box_x1")
|
|
let boundingBoxX1: Int
|
|
@Column("bounding_box_y1")
|
|
let boundingBoxY1: Int
|
|
@Column("bounding_box_x2")
|
|
let boundingBoxX2: Int
|
|
@Column("bounding_box_y2")
|
|
let boundingBoxY2: Int
|
|
@Column("source_type")
|
|
let sourceType: SourceType
|
|
}
|
|
|
|
@Table("auth_user_entity")
|
|
struct AuthUser: Identifiable {
|
|
let id: String
|
|
let name: String
|
|
let email: String
|
|
@Column("is_admin")
|
|
let isAdmin: Bool
|
|
@Column("has_profile_image")
|
|
let hasProfileImage: Bool
|
|
@Column("profile_changed_at")
|
|
let profileChangedAt: Date
|
|
@Column("avatar_color")
|
|
let avatarColor: AvatarColor
|
|
@Column("quota_size_in_bytes")
|
|
let quotaSizeInBytes: Int
|
|
@Column("quota_usage_in_bytes")
|
|
let quotaUsageInBytes: Int
|
|
@Column("pin_code")
|
|
let pinCode: String?
|
|
}
|
|
|
|
@Table("local_album_entity")
|
|
struct LocalAlbum: Identifiable {
|
|
let id: String
|
|
@Column("backup_selection")
|
|
let backupSelection: BackupSelection
|
|
@Column("linked_remote_album_id")
|
|
let linkedRemoteAlbumId: RemoteAlbum.ID?
|
|
@Column("marker")
|
|
let marker_: Bool?
|
|
let name: String
|
|
@Column("is_ios_shared_album")
|
|
let isIosSharedAlbum: Bool
|
|
@Column("updated_at")
|
|
let updatedAt: Date
|
|
}
|
|
|
|
@Table("local_album_asset_entity")
|
|
struct LocalAlbumAsset {
|
|
let id: ID
|
|
@Column("marker")
|
|
let marker_: String?
|
|
|
|
@Selection
|
|
struct ID {
|
|
@Column("asset_id")
|
|
let assetId: String
|
|
@Column("album_id")
|
|
let albumId: String
|
|
}
|
|
}
|
|
|
|
@Table("local_asset_entity")
|
|
struct LocalAsset: Identifiable {
|
|
let id: String
|
|
let checksum: String?
|
|
@Column("created_at")
|
|
let createdAt: String
|
|
@Column("duration_in_seconds")
|
|
let durationInSeconds: Int?
|
|
let height: Int?
|
|
@Column("is_favorite")
|
|
let isFavorite: Bool
|
|
let name: String
|
|
let orientation: String
|
|
let type: AssetType
|
|
@Column("updated_at")
|
|
let updatedAt: String
|
|
let width: Int?
|
|
}
|
|
|
|
@Selection
|
|
struct LocalAssetCandidate {
|
|
let id: LocalAsset.ID
|
|
let type: AssetType
|
|
}
|
|
|
|
@Selection
|
|
struct LocalAssetDownloadData {
|
|
let checksum: String?
|
|
let createdAt: String
|
|
let filename: String
|
|
let livePhotoVideoId: RemoteAsset.ID?
|
|
let localId: LocalAsset.ID
|
|
let taskId: UploadTask.ID
|
|
let updatedAt: String
|
|
}
|
|
|
|
@Selection
|
|
struct LocalAssetUploadData {
|
|
let filename: String
|
|
let filePath: URL
|
|
let priority: Float
|
|
let taskId: UploadTask.ID
|
|
let type: AssetType
|
|
}
|
|
|
|
@Table("memory_asset_entity")
|
|
struct MemoryAsset {
|
|
let id: ID
|
|
|
|
@Selection
|
|
struct ID {
|
|
@Column("asset_id")
|
|
let assetId: String
|
|
@Column("album_id")
|
|
let albumId: String
|
|
}
|
|
}
|
|
|
|
@Table("memory_entity")
|
|
struct Memory: Identifiable {
|
|
let id: String
|
|
@Column("created_at")
|
|
let createdAt: Date
|
|
@Column("updated_at")
|
|
let updatedAt: Date
|
|
@Column("deleted_at")
|
|
let deletedAt: Date?
|
|
@Column("owner_id")
|
|
let ownerId: User.ID
|
|
let type: MemoryType
|
|
let data: String
|
|
@Column("is_saved")
|
|
let isSaved: Bool
|
|
@Column("memory_at")
|
|
let memoryAt: Date
|
|
@Column("seen_at")
|
|
let seenAt: Date?
|
|
@Column("show_at")
|
|
let showAt: Date?
|
|
@Column("hide_at")
|
|
let hideAt: Date?
|
|
}
|
|
|
|
@Table("partner_entity")
|
|
struct Partner {
|
|
let id: ID
|
|
@Column("in_timeline")
|
|
let inTimeline: Bool
|
|
|
|
@Selection
|
|
struct ID {
|
|
@Column("shared_by_id")
|
|
let sharedById: String
|
|
@Column("shared_with_id")
|
|
let sharedWithId: String
|
|
}
|
|
}
|
|
|
|
@Table("person_entity")
|
|
struct Person: Identifiable {
|
|
let id: String
|
|
@Column("created_at")
|
|
let createdAt: Date
|
|
@Column("updated_at")
|
|
let updatedAt: Date
|
|
@Column("owner_id")
|
|
let ownerId: String
|
|
let name: String
|
|
@Column("face_asset_id")
|
|
let faceAssetId: AssetFace.ID?
|
|
@Column("is_favorite")
|
|
let isFavorite: Bool
|
|
@Column("is_hidden")
|
|
let isHidden: Bool
|
|
let color: String?
|
|
@Column("birth_date")
|
|
let birthDate: Date?
|
|
}
|
|
|
|
@Table("remote_album_entity")
|
|
struct RemoteAlbum: Identifiable {
|
|
let id: String
|
|
@Column("created_at")
|
|
let createdAt: Date
|
|
let description: String?
|
|
@Column("is_activity_enabled")
|
|
let isActivityEnabled: Bool
|
|
let name: String
|
|
let order: Int
|
|
@Column("owner_id")
|
|
let ownerId: String
|
|
@Column("thumbnail_asset_id")
|
|
let thumbnailAssetId: RemoteAsset.ID?
|
|
@Column("updated_at")
|
|
let updatedAt: Date
|
|
}
|
|
|
|
@Table("remote_album_asset_entity")
|
|
struct RemoteAlbumAsset {
|
|
let id: ID
|
|
|
|
@Selection
|
|
struct ID {
|
|
@Column("asset_id")
|
|
let assetId: String
|
|
@Column("album_id")
|
|
let albumId: String
|
|
}
|
|
}
|
|
|
|
@Table("remote_album_user_entity")
|
|
struct RemoteAlbumUser {
|
|
let id: ID
|
|
let role: AlbumUserRole
|
|
|
|
@Selection
|
|
struct ID {
|
|
@Column("album_id")
|
|
let albumId: String
|
|
@Column("user_id")
|
|
let userId: String
|
|
}
|
|
}
|
|
|
|
@Table("remote_asset_entity")
|
|
struct RemoteAsset: Identifiable {
|
|
let id: String
|
|
let checksum: String
|
|
@Column("is_favorite")
|
|
let isFavorite: Bool
|
|
@Column("deleted_at")
|
|
let deletedAt: Date?
|
|
@Column("owner_id")
|
|
let ownerId: User.ID
|
|
@Column("local_date_time")
|
|
let localDateTime: Date?
|
|
@Column("thumb_hash")
|
|
let thumbHash: String?
|
|
@Column("library_id")
|
|
let libraryId: String?
|
|
@Column("live_photo_video_id")
|
|
let livePhotoVideoId: String?
|
|
@Column("stack_id")
|
|
let stackId: Stack.ID?
|
|
let visibility: AssetVisibility
|
|
}
|
|
|
|
@Table("remote_exif_entity")
|
|
struct RemoteExif {
|
|
@Column("asset_id", primaryKey: true)
|
|
let assetId: RemoteAsset.ID
|
|
let city: String?
|
|
let state: String?
|
|
let country: String?
|
|
@Column("date_time_original")
|
|
let dateTimeOriginal: Date?
|
|
let description: String?
|
|
let height: Int?
|
|
let width: Int?
|
|
@Column("exposure_time")
|
|
let exposureTime: String?
|
|
@Column("f_number")
|
|
let fNumber: Double?
|
|
@Column("file_size")
|
|
let fileSize: Int?
|
|
@Column("focal_length")
|
|
let focalLength: Double?
|
|
let latitude: Double?
|
|
let longitude: Double?
|
|
let iso: Int?
|
|
let make: String?
|
|
let model: String?
|
|
let lens: String?
|
|
let orientation: String?
|
|
@Column("time_zone")
|
|
let timeZone: String?
|
|
let rating: Int?
|
|
@Column("projection_type")
|
|
let projectionType: String?
|
|
}
|
|
|
|
@Table("stack_entity")
|
|
struct Stack: Identifiable {
|
|
let id: String
|
|
@Column("created_at")
|
|
let createdAt: Date
|
|
@Column("updated_at")
|
|
let updatedAt: Date
|
|
@Column("owner_id")
|
|
let ownerId: User.ID
|
|
@Column("primary_asset_id")
|
|
let primaryAssetId: String
|
|
}
|
|
|
|
@Table("store_entity")
|
|
struct Store: Identifiable {
|
|
let id: StoreKey
|
|
@Column("string_value")
|
|
let stringValue: String?
|
|
@Column("int_value")
|
|
let intValue: Int?
|
|
}
|
|
|
|
@Table("upload_tasks")
|
|
struct UploadTask: Identifiable {
|
|
let id: Int64
|
|
let attempts: Int
|
|
@Column("created_at", as: Date.UnixTimeRepresentation.self)
|
|
let createdAt: Date
|
|
@Column("file_path")
|
|
var filePath: URL?
|
|
@Column("is_live_photo")
|
|
let isLivePhoto: Bool?
|
|
@Column("last_error")
|
|
let lastError: UploadErrorCode?
|
|
@Column("live_photo_video_id")
|
|
let livePhotoVideoId: RemoteAsset.ID?
|
|
@Column("local_id")
|
|
var localId: LocalAsset.ID?
|
|
let method: UploadMethod
|
|
var priority: Float
|
|
@Column("retry_after", as: Date?.UnixTimeRepresentation.self)
|
|
let retryAfter: Date?
|
|
var status: TaskStatus
|
|
}
|
|
|
|
@Table("upload_task_stats")
|
|
struct UploadTaskStat {
|
|
@Column("pending_downloads")
|
|
let pendingDownloads: Int
|
|
@Column("pending_uploads")
|
|
let pendingUploads: Int
|
|
@Column("queued_downloads")
|
|
let queuedDownloads: Int
|
|
@Column("queued_uploads")
|
|
let queuedUploads: Int
|
|
@Column("failed_downloads")
|
|
let failedDownloads: Int
|
|
@Column("failed_uploads")
|
|
let failedUploads: Int
|
|
@Column("completed_uploads")
|
|
let completedUploads: Int
|
|
@Column("skipped_uploads")
|
|
let skippedUploads: Int
|
|
|
|
static let availableDownloadSlots = Self.select {
|
|
TaskConfig.maxPendingDownloads - ($0.pendingDownloads + $0.queuedDownloads)
|
|
}
|
|
|
|
static let availableUploadSlots = Self.select {
|
|
TaskConfig.maxPendingUploads - ($0.pendingUploads + $0.queuedUploads)
|
|
}
|
|
|
|
static let availableSlots = Self.select {
|
|
TaskConfig.maxPendingUploads + TaskConfig.maxPendingDownloads
|
|
- ($0.pendingDownloads + $0.queuedDownloads + $0.pendingUploads + $0.queuedUploads)
|
|
}
|
|
}
|
|
|
|
@Table("user_entity")
|
|
struct User: Identifiable {
|
|
let id: String
|
|
let name: String
|
|
let email: String
|
|
@Column("has_profile_image")
|
|
let hasProfileImage: Bool
|
|
@Column("profile_changed_at")
|
|
let profileChangedAt: Date
|
|
@Column("avatar_color")
|
|
let avatarColor: AvatarColor
|
|
}
|
|
|
|
@Table("user_metadata_entity")
|
|
struct UserMetadata {
|
|
let id: ID
|
|
let value: Data
|
|
|
|
@Selection
|
|
struct ID {
|
|
@Column("user_id")
|
|
let userId: String
|
|
let key: Date
|
|
}
|
|
}
|