fix types

This commit is contained in:
shenlong-tanwen
2025-09-04 01:58:02 +05:30
parent 82c93cf325
commit 254ca4a13d
6 changed files with 161 additions and 189 deletions
@@ -6,33 +6,33 @@ enum RemoteAssetMetadataKey {
final String key; final String key;
const RemoteAssetMetadataKey(this.key); const RemoteAssetMetadataKey(this.key);
factory RemoteAssetMetadataKey.fromKey(String key) {
switch (key) {
case "mobile-app":
return RemoteAssetMetadataKey.mobileApp;
default:
throw ArgumentError("Unknown AssetMetadataKey key: $key");
}
}
} }
class RemoteAssetMetadata { class RemoteAssetMetadataItem {
final String? cloudId; final RemoteAssetMetadataKey key;
final Object value;
const RemoteAssetMetadata({this.cloudId}); const RemoteAssetMetadataItem({required this.key, required this.value});
Map<String, dynamic> toMap() { Map<String, Object?> toMap() {
final mobileAppValue = {}; return {'key': key.key, 'value': value};
if (cloudId != null) { }
mobileAppValue["iCloudId"] = cloudId;
} String toJson() => json.encode(toMap());
}
return {
"metadata": [ class RemoteAssetMobileAppMetadata {
{"key": RemoteAssetMetadataKey.mobileApp.key, "value": mobileAppValue}, final String? cloudId;
],
}; const RemoteAssetMobileAppMetadata({this.cloudId});
Map<String, Object?> toMap() {
final map = <String, Object?>{};
if (cloudId != null) {
map["iCloudId"] = cloudId;
}
return map;
} }
String toJson() => json.encode(toMap()); String toJson() => json.encode(toMap());
@@ -24,7 +24,7 @@ Future<void> migrateCloudIds(ProviderContainer ref) async {
for (final mapping in mappingsToUpdate) { for (final mapping in mappingsToUpdate) {
final mobileMeta = AssetMetadataUpsertItemDto( final mobileMeta = AssetMetadataUpsertItemDto(
key: AssetMetadataKey.mobileApp, key: AssetMetadataKey.mobileApp,
value: {"iCloudId": mapping.cloudId}, value: RemoteAssetMobileAppMetadata(cloudId: mapping.cloudId).toMap(),
); );
await assetApi.updateAssetMetadata(mapping.assetId, AssetMetadataUpsertDto(items: [mobileMeta])); await assetApi.updateAssetMetadata(mapping.assetId, AssetMetadataUpsertDto(items: [mobileMeta]));
} }
@@ -52,7 +52,7 @@ Future<List<_CloudIdMapping>> _fetchCloudIdMappings(Drift drift) async {
leftOuterJoin( leftOuterJoin(
drift.remoteAssetMetadataEntity, drift.remoteAssetMetadataEntity,
drift.remoteAssetMetadataEntity.assetId.equalsExp(drift.remoteAssetEntity.id) & drift.remoteAssetMetadataEntity.assetId.equalsExp(drift.remoteAssetEntity.id) &
drift.remoteAssetMetadataEntity.key.equalsValue(RemoteAssetMetadataKey.mobileApp), drift.remoteAssetMetadataEntity.key.equals(RemoteAssetMetadataKey.mobileApp.key),
useColumns: false, useColumns: false,
), ),
]) ])
@@ -1,6 +1,7 @@
import 'dart:convert';
import 'package:drift/drift.dart'; import 'package:drift/drift.dart';
import 'package:drift/extensions/json1.dart'; import 'package:drift/extensions/json1.dart';
import 'package:immich_mobile/domain/models/asset/asset_metadata.model.dart';
import 'package:immich_mobile/infrastructure/entities/remote_asset.entity.dart'; import 'package:immich_mobile/infrastructure/entities/remote_asset.entity.dart';
import 'package:immich_mobile/infrastructure/utils/drift_default.mixin.dart'; import 'package:immich_mobile/infrastructure/utils/drift_default.mixin.dart';
@@ -12,26 +13,17 @@ class RemoteAssetMetadataEntity extends Table with DriftDefaultsMixin {
TextColumn get assetId => text().references(RemoteAssetEntity, #id, onDelete: KeyAction.cascade)(); TextColumn get assetId => text().references(RemoteAssetEntity, #id, onDelete: KeyAction.cascade)();
TextColumn get key => text().map(const RemoteAssetMetadataKeyConverter())(); TextColumn get key => text()();
TextColumn get cloudId => text().generatedAs(key.jsonExtract(r'$.iCloudId'), stored: true)();
BlobColumn get value => blob().map(assetMetadataConverter)(); BlobColumn get value => blob().map(assetMetadataConverter)();
TextColumn get cloudId => text().generatedAs(key.jsonExtract(r'$.iCloudId'), stored: true)();
@override @override
Set<Column> get primaryKey => {assetId, key}; Set<Column> get primaryKey => {assetId, key};
} }
class RemoteAssetMetadataKeyConverter extends TypeConverter<RemoteAssetMetadataKey, String> {
const RemoteAssetMetadataKeyConverter();
@override
RemoteAssetMetadataKey fromSql(String fromDb) => RemoteAssetMetadataKey.fromKey(fromDb);
@override
String toSql(RemoteAssetMetadataKey value) => value.key;
}
final JsonTypeConverter2<Map<String, Object?>, Uint8List, Object?> assetMetadataConverter = TypeConverter.jsonb( final JsonTypeConverter2<Map<String, Object?>, Uint8List, Object?> assetMetadataConverter = TypeConverter.jsonb(
fromJson: (json) => json as Map<String, Object?>, fromJson: (json) => json as Map<String, Object?>,
toJson: (value) => jsonEncode(value),
); );
@@ -3,26 +3,24 @@
import 'package:drift/drift.dart' as i0; import 'package:drift/drift.dart' as i0;
import 'package:immich_mobile/infrastructure/entities/remote_asset_metadata.entity.drift.dart' import 'package:immich_mobile/infrastructure/entities/remote_asset_metadata.entity.drift.dart'
as i1; as i1;
import 'package:immich_mobile/domain/models/asset/asset_metadata.model.dart' import 'dart:typed_data' as i2;
as i2;
import 'dart:typed_data' as i3;
import 'package:immich_mobile/infrastructure/entities/remote_asset_metadata.entity.dart' import 'package:immich_mobile/infrastructure/entities/remote_asset_metadata.entity.dart'
as i4; as i3;
import 'package:drift/extensions/json1.dart' as i5; import 'package:drift/extensions/json1.dart' as i4;
import 'package:immich_mobile/infrastructure/entities/remote_asset.entity.drift.dart' import 'package:immich_mobile/infrastructure/entities/remote_asset.entity.drift.dart'
as i6; as i5;
import 'package:drift/internal/modular.dart' as i7; import 'package:drift/internal/modular.dart' as i6;
typedef $$RemoteAssetMetadataEntityTableCreateCompanionBuilder = typedef $$RemoteAssetMetadataEntityTableCreateCompanionBuilder =
i1.RemoteAssetMetadataEntityCompanion Function({ i1.RemoteAssetMetadataEntityCompanion Function({
required String assetId, required String assetId,
required i2.RemoteAssetMetadataKey key, required String key,
required Map<String, Object?> value, required Map<String, Object?> value,
}); });
typedef $$RemoteAssetMetadataEntityTableUpdateCompanionBuilder = typedef $$RemoteAssetMetadataEntityTableUpdateCompanionBuilder =
i1.RemoteAssetMetadataEntityCompanion Function({ i1.RemoteAssetMetadataEntityCompanion Function({
i0.Value<String> assetId, i0.Value<String> assetId,
i0.Value<i2.RemoteAssetMetadataKey> key, i0.Value<String> key,
i0.Value<Map<String, Object?>> value, i0.Value<Map<String, Object?>> value,
}); });
@@ -39,31 +37,31 @@ final class $$RemoteAssetMetadataEntityTableReferences
super.$_typedResult, super.$_typedResult,
); );
static i6.$RemoteAssetEntityTable _assetIdTable(i0.GeneratedDatabase db) => static i5.$RemoteAssetEntityTable _assetIdTable(i0.GeneratedDatabase db) =>
i7.ReadDatabaseContainer(db) i6.ReadDatabaseContainer(db)
.resultSet<i6.$RemoteAssetEntityTable>('remote_asset_entity') .resultSet<i5.$RemoteAssetEntityTable>('remote_asset_entity')
.createAlias( .createAlias(
i0.$_aliasNameGenerator( i0.$_aliasNameGenerator(
i7.ReadDatabaseContainer(db) i6.ReadDatabaseContainer(db)
.resultSet<i1.$RemoteAssetMetadataEntityTable>( .resultSet<i1.$RemoteAssetMetadataEntityTable>(
'remote_asset_metadata_entity', 'remote_asset_metadata_entity',
) )
.assetId, .assetId,
i7.ReadDatabaseContainer( i6.ReadDatabaseContainer(
db, db,
).resultSet<i6.$RemoteAssetEntityTable>('remote_asset_entity').id, ).resultSet<i5.$RemoteAssetEntityTable>('remote_asset_entity').id,
), ),
); );
i6.$$RemoteAssetEntityTableProcessedTableManager get assetId { i5.$$RemoteAssetEntityTableProcessedTableManager get assetId {
final $_column = $_itemColumn<String>('asset_id')!; final $_column = $_itemColumn<String>('asset_id')!;
final manager = i6 final manager = i5
.$$RemoteAssetEntityTableTableManager( .$$RemoteAssetEntityTableTableManager(
$_db, $_db,
i7.ReadDatabaseContainer( i6.ReadDatabaseContainer(
$_db, $_db,
).resultSet<i6.$RemoteAssetEntityTable>('remote_asset_entity'), ).resultSet<i5.$RemoteAssetEntityTable>('remote_asset_entity'),
) )
.filter((f) => f.id.sqlEquals($_column)); .filter((f) => f.id.sqlEquals($_column));
final item = $_typedResult.readTableOrNull(_assetIdTable($_db)); final item = $_typedResult.readTableOrNull(_assetIdTable($_db));
@@ -84,13 +82,18 @@ class $$RemoteAssetMetadataEntityTableFilterComposer
super.$addJoinBuilderToRootComposer, super.$addJoinBuilderToRootComposer,
super.$removeJoinBuilderFromRootComposer, super.$removeJoinBuilderFromRootComposer,
}); });
i0.ColumnWithTypeConverterFilters< i0.ColumnFilters<String> get key => $composableBuilder(
i2.RemoteAssetMetadataKey,
i2.RemoteAssetMetadataKey,
String
>
get key => $composableBuilder(
column: $table.key, column: $table.key,
builder: (column) => i0.ColumnFilters(column),
);
i0.ColumnWithTypeConverterFilters<
Map<String, Object?>,
Map<String, Object>,
i2.Uint8List
>
get value => $composableBuilder(
column: $table.value,
builder: (column) => i0.ColumnWithTypeConverterFilters(column), builder: (column) => i0.ColumnWithTypeConverterFilters(column),
); );
@@ -99,34 +102,24 @@ class $$RemoteAssetMetadataEntityTableFilterComposer
builder: (column) => i0.ColumnFilters(column), builder: (column) => i0.ColumnFilters(column),
); );
i0.ColumnWithTypeConverterFilters< i5.$$RemoteAssetEntityTableFilterComposer get assetId {
Map<String, Object?>, final i5.$$RemoteAssetEntityTableFilterComposer composer = $composerBuilder(
Map<String, Object>,
i3.Uint8List
>
get value => $composableBuilder(
column: $table.value,
builder: (column) => i0.ColumnWithTypeConverterFilters(column),
);
i6.$$RemoteAssetEntityTableFilterComposer get assetId {
final i6.$$RemoteAssetEntityTableFilterComposer composer = $composerBuilder(
composer: this, composer: this,
getCurrentColumn: (t) => t.assetId, getCurrentColumn: (t) => t.assetId,
referencedTable: i7.ReadDatabaseContainer( referencedTable: i6.ReadDatabaseContainer(
$db, $db,
).resultSet<i6.$RemoteAssetEntityTable>('remote_asset_entity'), ).resultSet<i5.$RemoteAssetEntityTable>('remote_asset_entity'),
getReferencedColumn: (t) => t.id, getReferencedColumn: (t) => t.id,
builder: builder:
( (
joinBuilder, { joinBuilder, {
$addJoinBuilderToRootComposer, $addJoinBuilderToRootComposer,
$removeJoinBuilderFromRootComposer, $removeJoinBuilderFromRootComposer,
}) => i6.$$RemoteAssetEntityTableFilterComposer( }) => i5.$$RemoteAssetEntityTableFilterComposer(
$db: $db, $db: $db,
$table: i7.ReadDatabaseContainer( $table: i6.ReadDatabaseContainer(
$db, $db,
).resultSet<i6.$RemoteAssetEntityTable>('remote_asset_entity'), ).resultSet<i5.$RemoteAssetEntityTable>('remote_asset_entity'),
$addJoinBuilderToRootComposer: $addJoinBuilderToRootComposer, $addJoinBuilderToRootComposer: $addJoinBuilderToRootComposer,
joinBuilder: joinBuilder, joinBuilder: joinBuilder,
$removeJoinBuilderFromRootComposer: $removeJoinBuilderFromRootComposer:
@@ -152,35 +145,35 @@ class $$RemoteAssetMetadataEntityTableOrderingComposer
builder: (column) => i0.ColumnOrderings(column), builder: (column) => i0.ColumnOrderings(column),
); );
i0.ColumnOrderings<i2.Uint8List> get value => $composableBuilder(
column: $table.value,
builder: (column) => i0.ColumnOrderings(column),
);
i0.ColumnOrderings<String> get cloudId => $composableBuilder( i0.ColumnOrderings<String> get cloudId => $composableBuilder(
column: $table.cloudId, column: $table.cloudId,
builder: (column) => i0.ColumnOrderings(column), builder: (column) => i0.ColumnOrderings(column),
); );
i0.ColumnOrderings<i3.Uint8List> get value => $composableBuilder( i5.$$RemoteAssetEntityTableOrderingComposer get assetId {
column: $table.value, final i5.$$RemoteAssetEntityTableOrderingComposer composer =
builder: (column) => i0.ColumnOrderings(column),
);
i6.$$RemoteAssetEntityTableOrderingComposer get assetId {
final i6.$$RemoteAssetEntityTableOrderingComposer composer =
$composerBuilder( $composerBuilder(
composer: this, composer: this,
getCurrentColumn: (t) => t.assetId, getCurrentColumn: (t) => t.assetId,
referencedTable: i7.ReadDatabaseContainer( referencedTable: i6.ReadDatabaseContainer(
$db, $db,
).resultSet<i6.$RemoteAssetEntityTable>('remote_asset_entity'), ).resultSet<i5.$RemoteAssetEntityTable>('remote_asset_entity'),
getReferencedColumn: (t) => t.id, getReferencedColumn: (t) => t.id,
builder: builder:
( (
joinBuilder, { joinBuilder, {
$addJoinBuilderToRootComposer, $addJoinBuilderToRootComposer,
$removeJoinBuilderFromRootComposer, $removeJoinBuilderFromRootComposer,
}) => i6.$$RemoteAssetEntityTableOrderingComposer( }) => i5.$$RemoteAssetEntityTableOrderingComposer(
$db: $db, $db: $db,
$table: i7.ReadDatabaseContainer( $table: i6.ReadDatabaseContainer(
$db, $db,
).resultSet<i6.$RemoteAssetEntityTable>('remote_asset_entity'), ).resultSet<i5.$RemoteAssetEntityTable>('remote_asset_entity'),
$addJoinBuilderToRootComposer: $addJoinBuilderToRootComposer, $addJoinBuilderToRootComposer: $addJoinBuilderToRootComposer,
joinBuilder: joinBuilder, joinBuilder: joinBuilder,
$removeJoinBuilderFromRootComposer: $removeJoinBuilderFromRootComposer:
@@ -201,36 +194,35 @@ class $$RemoteAssetMetadataEntityTableAnnotationComposer
super.$addJoinBuilderToRootComposer, super.$addJoinBuilderToRootComposer,
super.$removeJoinBuilderFromRootComposer, super.$removeJoinBuilderFromRootComposer,
}); });
i0.GeneratedColumnWithTypeConverter<i2.RemoteAssetMetadataKey, String> i0.GeneratedColumn<String> get key =>
get key =>
$composableBuilder(column: $table.key, builder: (column) => column); $composableBuilder(column: $table.key, builder: (column) => column);
i0.GeneratedColumnWithTypeConverter<Map<String, Object?>, i2.Uint8List>
get value =>
$composableBuilder(column: $table.value, builder: (column) => column);
i0.GeneratedColumn<String> get cloudId => i0.GeneratedColumn<String> get cloudId =>
$composableBuilder(column: $table.cloudId, builder: (column) => column); $composableBuilder(column: $table.cloudId, builder: (column) => column);
i0.GeneratedColumnWithTypeConverter<Map<String, Object?>, i3.Uint8List> i5.$$RemoteAssetEntityTableAnnotationComposer get assetId {
get value => final i5.$$RemoteAssetEntityTableAnnotationComposer composer =
$composableBuilder(column: $table.value, builder: (column) => column);
i6.$$RemoteAssetEntityTableAnnotationComposer get assetId {
final i6.$$RemoteAssetEntityTableAnnotationComposer composer =
$composerBuilder( $composerBuilder(
composer: this, composer: this,
getCurrentColumn: (t) => t.assetId, getCurrentColumn: (t) => t.assetId,
referencedTable: i7.ReadDatabaseContainer( referencedTable: i6.ReadDatabaseContainer(
$db, $db,
).resultSet<i6.$RemoteAssetEntityTable>('remote_asset_entity'), ).resultSet<i5.$RemoteAssetEntityTable>('remote_asset_entity'),
getReferencedColumn: (t) => t.id, getReferencedColumn: (t) => t.id,
builder: builder:
( (
joinBuilder, { joinBuilder, {
$addJoinBuilderToRootComposer, $addJoinBuilderToRootComposer,
$removeJoinBuilderFromRootComposer, $removeJoinBuilderFromRootComposer,
}) => i6.$$RemoteAssetEntityTableAnnotationComposer( }) => i5.$$RemoteAssetEntityTableAnnotationComposer(
$db: $db, $db: $db,
$table: i7.ReadDatabaseContainer( $table: i6.ReadDatabaseContainer(
$db, $db,
).resultSet<i6.$RemoteAssetEntityTable>('remote_asset_entity'), ).resultSet<i5.$RemoteAssetEntityTable>('remote_asset_entity'),
$addJoinBuilderToRootComposer: $addJoinBuilderToRootComposer, $addJoinBuilderToRootComposer: $addJoinBuilderToRootComposer,
joinBuilder: joinBuilder, joinBuilder: joinBuilder,
$removeJoinBuilderFromRootComposer: $removeJoinBuilderFromRootComposer:
@@ -284,8 +276,7 @@ class $$RemoteAssetMetadataEntityTableTableManager
updateCompanionCallback: updateCompanionCallback:
({ ({
i0.Value<String> assetId = const i0.Value.absent(), i0.Value<String> assetId = const i0.Value.absent(),
i0.Value<i2.RemoteAssetMetadataKey> key = i0.Value<String> key = const i0.Value.absent(),
const i0.Value.absent(),
i0.Value<Map<String, Object?>> value = const i0.Value.absent(), i0.Value<Map<String, Object?>> value = const i0.Value.absent(),
}) => i1.RemoteAssetMetadataEntityCompanion( }) => i1.RemoteAssetMetadataEntityCompanion(
assetId: assetId, assetId: assetId,
@@ -295,7 +286,7 @@ class $$RemoteAssetMetadataEntityTableTableManager
createCompanionCallback: createCompanionCallback:
({ ({
required String assetId, required String assetId,
required i2.RemoteAssetMetadataKey key, required String key,
required Map<String, Object?> value, required Map<String, Object?> value,
}) => i1.RemoteAssetMetadataEntityCompanion.insert( }) => i1.RemoteAssetMetadataEntityCompanion.insert(
assetId: assetId, assetId: assetId,
@@ -379,7 +370,7 @@ i0.Index get uQRemoteAssetMetadataCloudId => i0.Index(
'CREATE UNIQUE INDEX IF NOT EXISTS UQ_remote_asset_metadata_cloud_id ON remote_asset_metadata_entity (cloud_id) WHERE("key" = \'mobile-app\')', 'CREATE UNIQUE INDEX IF NOT EXISTS UQ_remote_asset_metadata_cloud_id ON remote_asset_metadata_entity (cloud_id) WHERE("key" = \'mobile-app\')',
); );
class $RemoteAssetMetadataEntityTable extends i4.RemoteAssetMetadataEntity class $RemoteAssetMetadataEntityTable extends i3.RemoteAssetMetadataEntity
with with
i0.TableInfo< i0.TableInfo<
$RemoteAssetMetadataEntityTable, $RemoteAssetMetadataEntityTable,
@@ -403,20 +394,29 @@ class $RemoteAssetMetadataEntityTable extends i4.RemoteAssetMetadataEntity
'REFERENCES remote_asset_entity (id) ON DELETE CASCADE', 'REFERENCES remote_asset_entity (id) ON DELETE CASCADE',
), ),
); );
static const i0.VerificationMeta _keyMeta = const i0.VerificationMeta('key');
@override
late final i0.GeneratedColumn<String> key = i0.GeneratedColumn<String>(
'key',
aliasedName,
false,
type: i0.DriftSqlType.string,
requiredDuringInsert: true,
);
@override @override
late final i0.GeneratedColumnWithTypeConverter< late final i0.GeneratedColumnWithTypeConverter<
i2.RemoteAssetMetadataKey, Map<String, Object?>,
String i2.Uint8List
> >
key = value =
i0.GeneratedColumn<String>( i0.GeneratedColumn<i2.Uint8List>(
'key', 'value',
aliasedName, aliasedName,
false, false,
type: i0.DriftSqlType.string, type: i0.DriftSqlType.blob,
requiredDuringInsert: true, requiredDuringInsert: true,
).withConverter<i2.RemoteAssetMetadataKey>( ).withConverter<Map<String, Object?>>(
i1.$RemoteAssetMetadataEntityTable.$converterkey, i1.$RemoteAssetMetadataEntityTable.$convertervalue,
); );
static const i0.VerificationMeta _cloudIdMeta = const i0.VerificationMeta( static const i0.VerificationMeta _cloudIdMeta = const i0.VerificationMeta(
'cloudId', 'cloudId',
@@ -427,29 +427,14 @@ class $RemoteAssetMetadataEntityTable extends i4.RemoteAssetMetadataEntity
aliasedName, aliasedName,
false, false,
generatedAs: i0.GeneratedAs( generatedAs: i0.GeneratedAs(
i5.JsonExtensions(key).jsonExtract(r'$.iCloudId'), i4.JsonExtensions(key).jsonExtract(r'$.iCloudId'),
false, true,
), ),
type: i0.DriftSqlType.string, type: i0.DriftSqlType.string,
requiredDuringInsert: false, requiredDuringInsert: false,
); );
@override @override
late final i0.GeneratedColumnWithTypeConverter< List<i0.GeneratedColumn> get $columns => [assetId, key, value, cloudId];
Map<String, Object?>,
i3.Uint8List
>
value =
i0.GeneratedColumn<i3.Uint8List>(
'value',
aliasedName,
false,
type: i0.DriftSqlType.blob,
requiredDuringInsert: true,
).withConverter<Map<String, Object?>>(
i1.$RemoteAssetMetadataEntityTable.$convertervalue,
);
@override
List<i0.GeneratedColumn> get $columns => [assetId, key, cloudId, value];
@override @override
String get aliasedName => _alias ?? actualTableName; String get aliasedName => _alias ?? actualTableName;
@override @override
@@ -470,6 +455,14 @@ class $RemoteAssetMetadataEntityTable extends i4.RemoteAssetMetadataEntity
} else if (isInserting) { } else if (isInserting) {
context.missing(_assetIdMeta); context.missing(_assetIdMeta);
} }
if (data.containsKey('key')) {
context.handle(
_keyMeta,
key.isAcceptableOrUnknown(data['key']!, _keyMeta),
);
} else if (isInserting) {
context.missing(_keyMeta);
}
if (data.containsKey('cloud_id')) { if (data.containsKey('cloud_id')) {
context.handle( context.handle(
_cloudIdMeta, _cloudIdMeta,
@@ -492,15 +485,9 @@ class $RemoteAssetMetadataEntityTable extends i4.RemoteAssetMetadataEntity
i0.DriftSqlType.string, i0.DriftSqlType.string,
data['${effectivePrefix}asset_id'], data['${effectivePrefix}asset_id'],
)!, )!,
key: i1.$RemoteAssetMetadataEntityTable.$converterkey.fromSql( key: attachedDatabase.typeMapping.read(
attachedDatabase.typeMapping.read(
i0.DriftSqlType.string,
data['${effectivePrefix}key'],
)!,
),
cloudId: attachedDatabase.typeMapping.read(
i0.DriftSqlType.string, i0.DriftSqlType.string,
data['${effectivePrefix}cloud_id'], data['${effectivePrefix}key'],
)!, )!,
value: i1.$RemoteAssetMetadataEntityTable.$convertervalue.fromSql( value: i1.$RemoteAssetMetadataEntityTable.$convertervalue.fromSql(
attachedDatabase.typeMapping.read( attachedDatabase.typeMapping.read(
@@ -508,6 +495,10 @@ class $RemoteAssetMetadataEntityTable extends i4.RemoteAssetMetadataEntity
data['${effectivePrefix}value'], data['${effectivePrefix}value'],
)!, )!,
), ),
cloudId: attachedDatabase.typeMapping.read(
i0.DriftSqlType.string,
data['${effectivePrefix}cloud_id'],
)!,
); );
} }
@@ -516,10 +507,8 @@ class $RemoteAssetMetadataEntityTable extends i4.RemoteAssetMetadataEntity
return $RemoteAssetMetadataEntityTable(attachedDatabase, alias); return $RemoteAssetMetadataEntityTable(attachedDatabase, alias);
} }
static i0.TypeConverter<i2.RemoteAssetMetadataKey, String> $converterkey = static i0.JsonTypeConverter2<Map<String, Object?>, i2.Uint8List, Object?>
const i4.RemoteAssetMetadataKeyConverter(); $convertervalue = i3.assetMetadataConverter;
static i0.JsonTypeConverter2<Map<String, Object?>, i3.Uint8List, Object?>
$convertervalue = i4.assetMetadataConverter;
@override @override
bool get withoutRowId => true; bool get withoutRowId => true;
@override @override
@@ -529,26 +518,22 @@ class $RemoteAssetMetadataEntityTable extends i4.RemoteAssetMetadataEntity
class RemoteAssetMetadataEntityData extends i0.DataClass class RemoteAssetMetadataEntityData extends i0.DataClass
implements i0.Insertable<i1.RemoteAssetMetadataEntityData> { implements i0.Insertable<i1.RemoteAssetMetadataEntityData> {
final String assetId; final String assetId;
final i2.RemoteAssetMetadataKey key; final String key;
final String cloudId;
final Map<String, Object?> value; final Map<String, Object?> value;
final String cloudId;
const RemoteAssetMetadataEntityData({ const RemoteAssetMetadataEntityData({
required this.assetId, required this.assetId,
required this.key, required this.key,
required this.cloudId,
required this.value, required this.value,
required this.cloudId,
}); });
@override @override
Map<String, i0.Expression> toColumns(bool nullToAbsent) { Map<String, i0.Expression> toColumns(bool nullToAbsent) {
final map = <String, i0.Expression>{}; final map = <String, i0.Expression>{};
map['asset_id'] = i0.Variable<String>(assetId); map['asset_id'] = i0.Variable<String>(assetId);
map['key'] = i0.Variable<String>(key);
{ {
map['key'] = i0.Variable<String>( map['value'] = i0.Variable<i2.Uint8List>(
i1.$RemoteAssetMetadataEntityTable.$converterkey.toSql(key),
);
}
{
map['value'] = i0.Variable<i3.Uint8List>(
i1.$RemoteAssetMetadataEntityTable.$convertervalue.toSql(value), i1.$RemoteAssetMetadataEntityTable.$convertervalue.toSql(value),
); );
} }
@@ -562,11 +547,11 @@ class RemoteAssetMetadataEntityData extends i0.DataClass
serializer ??= i0.driftRuntimeOptions.defaultSerializer; serializer ??= i0.driftRuntimeOptions.defaultSerializer;
return RemoteAssetMetadataEntityData( return RemoteAssetMetadataEntityData(
assetId: serializer.fromJson<String>(json['assetId']), assetId: serializer.fromJson<String>(json['assetId']),
key: serializer.fromJson<i2.RemoteAssetMetadataKey>(json['key']), key: serializer.fromJson<String>(json['key']),
cloudId: serializer.fromJson<String>(json['cloudId']),
value: i1.$RemoteAssetMetadataEntityTable.$convertervalue.fromJson( value: i1.$RemoteAssetMetadataEntityTable.$convertervalue.fromJson(
serializer.fromJson<Object?>(json['value']), serializer.fromJson<Object?>(json['value']),
), ),
cloudId: serializer.fromJson<String>(json['cloudId']),
); );
} }
@override @override
@@ -574,52 +559,52 @@ class RemoteAssetMetadataEntityData extends i0.DataClass
serializer ??= i0.driftRuntimeOptions.defaultSerializer; serializer ??= i0.driftRuntimeOptions.defaultSerializer;
return <String, dynamic>{ return <String, dynamic>{
'assetId': serializer.toJson<String>(assetId), 'assetId': serializer.toJson<String>(assetId),
'key': serializer.toJson<i2.RemoteAssetMetadataKey>(key), 'key': serializer.toJson<String>(key),
'cloudId': serializer.toJson<String>(cloudId),
'value': serializer.toJson<Object?>( 'value': serializer.toJson<Object?>(
i1.$RemoteAssetMetadataEntityTable.$convertervalue.toJson(value), i1.$RemoteAssetMetadataEntityTable.$convertervalue.toJson(value),
), ),
'cloudId': serializer.toJson<String>(cloudId),
}; };
} }
i1.RemoteAssetMetadataEntityData copyWith({ i1.RemoteAssetMetadataEntityData copyWith({
String? assetId, String? assetId,
i2.RemoteAssetMetadataKey? key, String? key,
String? cloudId,
Map<String, Object?>? value, Map<String, Object?>? value,
String? cloudId,
}) => i1.RemoteAssetMetadataEntityData( }) => i1.RemoteAssetMetadataEntityData(
assetId: assetId ?? this.assetId, assetId: assetId ?? this.assetId,
key: key ?? this.key, key: key ?? this.key,
cloudId: cloudId ?? this.cloudId,
value: value ?? this.value, value: value ?? this.value,
cloudId: cloudId ?? this.cloudId,
); );
@override @override
String toString() { String toString() {
return (StringBuffer('RemoteAssetMetadataEntityData(') return (StringBuffer('RemoteAssetMetadataEntityData(')
..write('assetId: $assetId, ') ..write('assetId: $assetId, ')
..write('key: $key, ') ..write('key: $key, ')
..write('cloudId: $cloudId, ') ..write('value: $value, ')
..write('value: $value') ..write('cloudId: $cloudId')
..write(')')) ..write(')'))
.toString(); .toString();
} }
@override @override
int get hashCode => Object.hash(assetId, key, cloudId, value); int get hashCode => Object.hash(assetId, key, value, cloudId);
@override @override
bool operator ==(Object other) => bool operator ==(Object other) =>
identical(this, other) || identical(this, other) ||
(other is i1.RemoteAssetMetadataEntityData && (other is i1.RemoteAssetMetadataEntityData &&
other.assetId == this.assetId && other.assetId == this.assetId &&
other.key == this.key && other.key == this.key &&
other.cloudId == this.cloudId && other.value == this.value &&
other.value == this.value); other.cloudId == this.cloudId);
} }
class RemoteAssetMetadataEntityCompanion class RemoteAssetMetadataEntityCompanion
extends i0.UpdateCompanion<i1.RemoteAssetMetadataEntityData> { extends i0.UpdateCompanion<i1.RemoteAssetMetadataEntityData> {
final i0.Value<String> assetId; final i0.Value<String> assetId;
final i0.Value<i2.RemoteAssetMetadataKey> key; final i0.Value<String> key;
final i0.Value<Map<String, Object?>> value; final i0.Value<Map<String, Object?>> value;
const RemoteAssetMetadataEntityCompanion({ const RemoteAssetMetadataEntityCompanion({
this.assetId = const i0.Value.absent(), this.assetId = const i0.Value.absent(),
@@ -628,7 +613,7 @@ class RemoteAssetMetadataEntityCompanion
}); });
RemoteAssetMetadataEntityCompanion.insert({ RemoteAssetMetadataEntityCompanion.insert({
required String assetId, required String assetId,
required i2.RemoteAssetMetadataKey key, required String key,
required Map<String, Object?> value, required Map<String, Object?> value,
}) : assetId = i0.Value(assetId), }) : assetId = i0.Value(assetId),
key = i0.Value(key), key = i0.Value(key),
@@ -636,7 +621,7 @@ class RemoteAssetMetadataEntityCompanion
static i0.Insertable<i1.RemoteAssetMetadataEntityData> custom({ static i0.Insertable<i1.RemoteAssetMetadataEntityData> custom({
i0.Expression<String>? assetId, i0.Expression<String>? assetId,
i0.Expression<String>? key, i0.Expression<String>? key,
i0.Expression<i3.Uint8List>? value, i0.Expression<i2.Uint8List>? value,
}) { }) {
return i0.RawValuesInsertable({ return i0.RawValuesInsertable({
if (assetId != null) 'asset_id': assetId, if (assetId != null) 'asset_id': assetId,
@@ -647,7 +632,7 @@ class RemoteAssetMetadataEntityCompanion
i1.RemoteAssetMetadataEntityCompanion copyWith({ i1.RemoteAssetMetadataEntityCompanion copyWith({
i0.Value<String>? assetId, i0.Value<String>? assetId,
i0.Value<i2.RemoteAssetMetadataKey>? key, i0.Value<String>? key,
i0.Value<Map<String, Object?>>? value, i0.Value<Map<String, Object?>>? value,
}) { }) {
return i1.RemoteAssetMetadataEntityCompanion( return i1.RemoteAssetMetadataEntityCompanion(
@@ -664,12 +649,10 @@ class RemoteAssetMetadataEntityCompanion
map['asset_id'] = i0.Variable<String>(assetId.value); map['asset_id'] = i0.Variable<String>(assetId.value);
} }
if (key.present) { if (key.present) {
map['key'] = i0.Variable<String>( map['key'] = i0.Variable<String>(key.value);
i1.$RemoteAssetMetadataEntityTable.$converterkey.toSql(key.value),
);
} }
if (value.present) { if (value.present) {
map['value'] = i0.Variable<i3.Uint8List>( map['value'] = i0.Variable<i2.Uint8List>(
i1.$RemoteAssetMetadataEntityTable.$convertervalue.toSql(value.value), i1.$RemoteAssetMetadataEntityTable.$convertervalue.toSql(value.value),
); );
} }
@@ -2,7 +2,6 @@ import 'dart:convert';
import 'package:drift/drift.dart'; import 'package:drift/drift.dart';
import 'package:immich_mobile/domain/models/album/album.model.dart'; import 'package:immich_mobile/domain/models/album/album.model.dart';
import 'package:immich_mobile/domain/models/asset/asset_metadata.model.dart';
import 'package:immich_mobile/domain/models/asset/base_asset.model.dart'; import 'package:immich_mobile/domain/models/asset/base_asset.model.dart';
import 'package:immich_mobile/domain/models/memory.model.dart'; import 'package:immich_mobile/domain/models/memory.model.dart';
import 'package:immich_mobile/domain/models/user_metadata.model.dart'; import 'package:immich_mobile/domain/models/user_metadata.model.dart';
@@ -22,7 +21,7 @@ import 'package:immich_mobile/infrastructure/entities/user.entity.drift.dart';
import 'package:immich_mobile/infrastructure/entities/user_metadata.entity.drift.dart'; import 'package:immich_mobile/infrastructure/entities/user_metadata.entity.drift.dart';
import 'package:immich_mobile/infrastructure/repositories/db.repository.dart'; import 'package:immich_mobile/infrastructure/repositories/db.repository.dart';
import 'package:logging/logging.dart'; import 'package:logging/logging.dart';
import 'package:openapi/api.dart' as api show AssetVisibility, AlbumUserRole, UserMetadataKey, AssetMetadataKey; import 'package:openapi/api.dart' as api show AssetVisibility, AlbumUserRole, UserMetadataKey;
import 'package:openapi/api.dart' hide AssetVisibility, AlbumUserRole, UserMetadataKey, AssetMetadataKey; import 'package:openapi/api.dart' hide AssetVisibility, AlbumUserRole, UserMetadataKey, AssetMetadataKey;
class SyncStreamRepository extends DriftDatabaseRepository { class SyncStreamRepository extends DriftDatabaseRepository {
@@ -201,8 +200,8 @@ class SyncStreamRepository extends DriftDatabaseRepository {
await _db.batch((batch) { await _db.batch((batch) {
for (final metadata in data) { for (final metadata in data) {
final companion = RemoteAssetMetadataEntityCompanion( final companion = RemoteAssetMetadataEntityCompanion(
key: Value(metadata.key.toRemoteAssetMetadataKey()), key: Value(metadata.key.value),
value: Value(jsonDecode(metadata.value as String)), value: Value(metadata.value as Map<String, Object?>),
); );
batch.insert( batch.insert(
@@ -613,10 +612,3 @@ extension on String {
} }
} }
} }
extension on api.AssetMetadataKey {
RemoteAssetMetadataKey toRemoteAssetMetadataKey() => switch (this) {
api.AssetMetadataKey.mobileApp => RemoteAssetMetadataKey.mobileApp,
_ => throw Exception('Unknown AssetMetadataKey value: $this'),
};
}
+6 -1
View File
@@ -365,7 +365,12 @@ class UploadService {
'fileModifiedAt': modifiedAt.toUtc().toIso8601String(), 'fileModifiedAt': modifiedAt.toUtc().toIso8601String(),
'isFavorite': isFavorite?.toString() ?? 'false', 'isFavorite': isFavorite?.toString() ?? 'false',
'duration': '0', 'duration': '0',
'metadata': RemoteAssetMetadata(cloudId: cloudId).toJson(), 'metadata': jsonEncode([
RemoteAssetMetadataItem(
key: RemoteAssetMetadataKey.mobileApp,
value: RemoteAssetMobileAppMetadata(cloudId: cloudId).toMap(),
),
]),
if (fields != null) ...fields, if (fields != null) ...fields,
}; };