This commit is contained in:
Fabian Freund
2025-02-03 15:09:04 +01:00
parent 36acd46318
commit 025ecaf2e3
132 changed files with 4431 additions and 1644 deletions
@@ -1,4 +1,7 @@
import 'dart:convert';
import 'package:drift/drift.dart';
import 'package:lensai/extensions/nullable.dart';
import 'package:lensai/features/user/data/database/database.dart';
part 'setting.g.dart';
@@ -7,12 +10,16 @@ part 'setting.g.dart';
class SettingDao extends DatabaseAccessor<UserDatabase> with _$SettingDaoMixin {
SettingDao(super.attachedDatabase);
Future<int> updateSetting(String key, Object? value) {
final driftvalue = (value != null) ? DriftAny(value) : null;
Future<int> updateSetting(String key, String? partitionKey, Object? value) {
final normalizedValue = (value is Iterable) ? jsonEncode(value) : value;
final driftvalue = normalizedValue
.mapNotNull((normalizedValue) => DriftAny(normalizedValue));
return db.setting.insertOne(
SettingCompanion.insert(
key: key,
partitionKey: Value(partitionKey),
value: Value(driftvalue),
),
onConflict: DoUpdate(
@@ -21,7 +28,12 @@ class SettingDao extends DatabaseAccessor<UserDatabase> with _$SettingDaoMixin {
);
}
Selectable<MapEntry<String, DriftAny?>> allSettings() {
return db.setting.select().map((row) => MapEntry(row.key, row.value));
Selectable<MapEntry<String, DriftAny?>> allSettingsOfPartitionKey(
String? partitionKey,
) {
final query = db.setting.select()
..where((r) => r.partitionKey.equalsNullable(partitionKey));
return query.map((row) => MapEntry(row.key, row.value));
}
}
@@ -4,12 +4,15 @@ import 'package:lensai/features/user/data/database/daos/setting.dart';
part 'database.g.dart';
@DriftDatabase(include: {
'database.drift'
}, daos: [
SettingDao,
CacheDao,
])
@DriftDatabase(
include: {
'database.drift',
},
daos: [
SettingDao,
CacheDao,
],
)
class UserDatabase extends _$UserDatabase {
@override
final int schemaVersion = 1;
@@ -1,5 +1,6 @@
CREATE TABLE setting (
"key" TEXT PRIMARY KEY NOT NULL,
partition_key TEXT,
"value" ANY
) STRICT;
@@ -13,13 +13,18 @@ class Setting extends Table with TableInfo<Setting, SettingData> {
type: DriftSqlType.string,
requiredDuringInsert: true,
$customConstraints: 'PRIMARY KEY NOT NULL');
late final GeneratedColumn<String> partitionKey = GeneratedColumn<String>(
'partition_key', aliasedName, true,
type: DriftSqlType.string,
requiredDuringInsert: false,
$customConstraints: '');
late final GeneratedColumn<DriftAny> value = GeneratedColumn<DriftAny>(
'value', aliasedName, true,
type: DriftSqlType.any,
requiredDuringInsert: false,
$customConstraints: '');
@override
List<GeneratedColumn> get $columns => [key, value];
List<GeneratedColumn> get $columns => [key, partitionKey, value];
@override
String get aliasedName => _alias ?? actualTableName;
@override
@@ -33,6 +38,8 @@ class Setting extends Table with TableInfo<Setting, SettingData> {
return SettingData(
key: attachedDatabase.typeMapping
.read(DriftSqlType.string, data['${effectivePrefix}key'])!,
partitionKey: attachedDatabase.typeMapping
.read(DriftSqlType.string, data['${effectivePrefix}partition_key']),
value: attachedDatabase.typeMapping
.read(DriftSqlType.any, data['${effectivePrefix}value']),
);
@@ -51,12 +58,16 @@ class Setting extends Table with TableInfo<Setting, SettingData> {
class SettingData extends DataClass implements Insertable<SettingData> {
final String key;
final String? partitionKey;
final DriftAny? value;
const SettingData({required this.key, this.value});
const SettingData({required this.key, this.partitionKey, this.value});
@override
Map<String, Expression> toColumns(bool nullToAbsent) {
final map = <String, Expression>{};
map['key'] = Variable<String>(key);
if (!nullToAbsent || partitionKey != null) {
map['partition_key'] = Variable<String>(partitionKey);
}
if (!nullToAbsent || value != null) {
map['value'] = Variable<DriftAny>(value);
}
@@ -68,6 +79,7 @@ class SettingData extends DataClass implements Insertable<SettingData> {
serializer ??= driftRuntimeOptions.defaultSerializer;
return SettingData(
key: serializer.fromJson<String>(json['key']),
partitionKey: serializer.fromJson<String?>(json['partition_key']),
value: serializer.fromJson<DriftAny?>(json['value']),
);
}
@@ -76,19 +88,27 @@ class SettingData extends DataClass implements Insertable<SettingData> {
serializer ??= driftRuntimeOptions.defaultSerializer;
return <String, dynamic>{
'key': serializer.toJson<String>(key),
'partition_key': serializer.toJson<String?>(partitionKey),
'value': serializer.toJson<DriftAny?>(value),
};
}
SettingData copyWith(
{String? key, Value<DriftAny?> value = const Value.absent()}) =>
{String? key,
Value<String?> partitionKey = const Value.absent(),
Value<DriftAny?> value = const Value.absent()}) =>
SettingData(
key: key ?? this.key,
partitionKey:
partitionKey.present ? partitionKey.value : this.partitionKey,
value: value.present ? value.value : this.value,
);
SettingData copyWithCompanion(SettingCompanion data) {
return SettingData(
key: data.key.present ? data.key.value : this.key,
partitionKey: data.partitionKey.present
? data.partitionKey.value
: this.partitionKey,
value: data.value.present ? data.value.value : this.value,
);
}
@@ -97,51 +117,62 @@ class SettingData extends DataClass implements Insertable<SettingData> {
String toString() {
return (StringBuffer('SettingData(')
..write('key: $key, ')
..write('partitionKey: $partitionKey, ')
..write('value: $value')
..write(')'))
.toString();
}
@override
int get hashCode => Object.hash(key, value);
int get hashCode => Object.hash(key, partitionKey, value);
@override
bool operator ==(Object other) =>
identical(this, other) ||
(other is SettingData &&
other.key == this.key &&
other.partitionKey == this.partitionKey &&
other.value == this.value);
}
class SettingCompanion extends UpdateCompanion<SettingData> {
final Value<String> key;
final Value<String?> partitionKey;
final Value<DriftAny?> value;
final Value<int> rowid;
const SettingCompanion({
this.key = const Value.absent(),
this.partitionKey = const Value.absent(),
this.value = const Value.absent(),
this.rowid = const Value.absent(),
});
SettingCompanion.insert({
required String key,
this.partitionKey = const Value.absent(),
this.value = const Value.absent(),
this.rowid = const Value.absent(),
}) : key = Value(key);
static Insertable<SettingData> custom({
Expression<String>? key,
Expression<String>? partitionKey,
Expression<DriftAny>? value,
Expression<int>? rowid,
}) {
return RawValuesInsertable({
if (key != null) 'key': key,
if (partitionKey != null) 'partition_key': partitionKey,
if (value != null) 'value': value,
if (rowid != null) 'rowid': rowid,
});
}
SettingCompanion copyWith(
{Value<String>? key, Value<DriftAny?>? value, Value<int>? rowid}) {
{Value<String>? key,
Value<String?>? partitionKey,
Value<DriftAny?>? value,
Value<int>? rowid}) {
return SettingCompanion(
key: key ?? this.key,
partitionKey: partitionKey ?? this.partitionKey,
value: value ?? this.value,
rowid: rowid ?? this.rowid,
);
@@ -153,6 +184,9 @@ class SettingCompanion extends UpdateCompanion<SettingData> {
if (key.present) {
map['key'] = Variable<String>(key.value);
}
if (partitionKey.present) {
map['partition_key'] = Variable<String>(partitionKey.value);
}
if (value.present) {
map['value'] = Variable<DriftAny>(value.value);
}
@@ -166,6 +200,7 @@ class SettingCompanion extends UpdateCompanion<SettingData> {
String toString() {
return (StringBuffer('SettingCompanion(')
..write('key: $key, ')
..write('partitionKey: $partitionKey, ')
..write('value: $value, ')
..write('rowid: $rowid')
..write(')'))
@@ -396,11 +431,13 @@ abstract class _$UserDatabase extends GeneratedDatabase {
typedef $SettingCreateCompanionBuilder = SettingCompanion Function({
required String key,
Value<String?> partitionKey,
Value<DriftAny?> value,
Value<int> rowid,
});
typedef $SettingUpdateCompanionBuilder = SettingCompanion Function({
Value<String> key,
Value<String?> partitionKey,
Value<DriftAny?> value,
Value<int> rowid,
});
@@ -416,6 +453,9 @@ class $SettingFilterComposer extends Composer<_$UserDatabase, Setting> {
ColumnFilters<String> get key => $composableBuilder(
column: $table.key, builder: (column) => ColumnFilters(column));
ColumnFilters<String> get partitionKey => $composableBuilder(
column: $table.partitionKey, builder: (column) => ColumnFilters(column));
ColumnFilters<DriftAny> get value => $composableBuilder(
column: $table.value, builder: (column) => ColumnFilters(column));
}
@@ -431,6 +471,10 @@ class $SettingOrderingComposer extends Composer<_$UserDatabase, Setting> {
ColumnOrderings<String> get key => $composableBuilder(
column: $table.key, builder: (column) => ColumnOrderings(column));
ColumnOrderings<String> get partitionKey => $composableBuilder(
column: $table.partitionKey,
builder: (column) => ColumnOrderings(column));
ColumnOrderings<DriftAny> get value => $composableBuilder(
column: $table.value, builder: (column) => ColumnOrderings(column));
}
@@ -446,6 +490,9 @@ class $SettingAnnotationComposer extends Composer<_$UserDatabase, Setting> {
GeneratedColumn<String> get key =>
$composableBuilder(column: $table.key, builder: (column) => column);
GeneratedColumn<String> get partitionKey => $composableBuilder(
column: $table.partitionKey, builder: (column) => column);
GeneratedColumn<DriftAny> get value =>
$composableBuilder(column: $table.value, builder: (column) => column);
}
@@ -474,21 +521,25 @@ class $SettingTableManager extends RootTableManager<
$SettingAnnotationComposer($db: db, $table: table),
updateCompanionCallback: ({
Value<String> key = const Value.absent(),
Value<String?> partitionKey = const Value.absent(),
Value<DriftAny?> value = const Value.absent(),
Value<int> rowid = const Value.absent(),
}) =>
SettingCompanion(
key: key,
partitionKey: partitionKey,
value: value,
rowid: rowid,
),
createCompanionCallback: ({
required String key,
Value<String?> partitionKey = const Value.absent(),
Value<DriftAny?> value = const Value.absent(),
Value<int> rowid = const Value.absent(),
}) =>
SettingCompanion.insert(
key: key,
partitionKey: partitionKey,
value: value,
rowid: rowid,
),