update bangs
This commit is contained in:
@@ -25,12 +25,13 @@ import 'package:weblibre/features/bangs/data/database/daos/bang.dart';
|
||||
import 'package:weblibre/features/bangs/data/database/daos/sync.dart';
|
||||
import 'package:weblibre/features/bangs/data/database/database.drift.dart';
|
||||
import 'package:weblibre/features/bangs/data/database/database.steps.dart';
|
||||
import 'package:weblibre/features/bangs/data/database/definitions.drift.dart';
|
||||
import 'package:weblibre/features/search/domain/fts_tokenizer.dart';
|
||||
|
||||
@DriftDatabase(include: {'definitions.drift'}, daos: [BangDao, SyncDao])
|
||||
class BangDatabase extends $BangDatabase with PrefixQueryBuilderMixin {
|
||||
@override
|
||||
final int schemaVersion = 4;
|
||||
final int schemaVersion = 5;
|
||||
|
||||
@override
|
||||
final int ftsTokenLimit = 6;
|
||||
@@ -71,13 +72,55 @@ class BangDatabase extends $BangDatabase with PrefixQueryBuilderMixin {
|
||||
await validateDatabaseSchema();
|
||||
}
|
||||
|
||||
await customStatement('PRAGMA foreign_keys = ON');
|
||||
|
||||
if (details.hadUpgrade && details.versionBefore != null) {
|
||||
if (details.versionBefore! < 3) {
|
||||
await bang.deleteWhere((t) => t.group.equals(3));
|
||||
await bangTriggers.deleteWhere((t) => t.group.equals(3));
|
||||
await bangSync.deleteWhere((t) => t.group.equals(3));
|
||||
await bangFrequency.deleteWhere((t) => t.group.equals(3));
|
||||
await bangHistory.deleteWhere((t) => t.group.equals(3));
|
||||
} else if (details.versionBefore! < 5) {
|
||||
await bang.deleteWhere((t) => t.group.equals(1));
|
||||
await bangTriggers.deleteWhere((t) => t.group.equals(1));
|
||||
await bangSync.deleteWhere((t) => t.group.equals(1));
|
||||
await bangFrequency.deleteWhere((t) => t.group.equals(1));
|
||||
await bangHistory.deleteWhere((t) => t.group.equals(1));
|
||||
|
||||
await (bang.update()..where((t) => t.group.isBiggerThanValue(0)))
|
||||
.write(
|
||||
BangCompanion.custom(group: bang.group - const Constant(1)),
|
||||
);
|
||||
await (bangTriggers.update()
|
||||
..where((t) => t.group.isBiggerThanValue(0)))
|
||||
.write(
|
||||
BangTriggersCompanion.custom(
|
||||
group: bangTriggers.group - const Constant(1),
|
||||
),
|
||||
);
|
||||
await (bangSync.update()..where((t) => t.group.isBiggerThanValue(0)))
|
||||
.write(
|
||||
BangSyncCompanion.custom(
|
||||
group: bangSync.group - const Constant(1),
|
||||
),
|
||||
);
|
||||
await (bangFrequency.update()
|
||||
..where((t) => t.group.isBiggerThanValue(0)))
|
||||
.write(
|
||||
BangFrequencyCompanion.custom(
|
||||
group: bangFrequency.group - const Constant(1),
|
||||
),
|
||||
);
|
||||
await (bangHistory.update()
|
||||
..where((t) => t.group.isBiggerThanValue(0)))
|
||||
.write(
|
||||
BangHistoryCompanion.custom(
|
||||
group: bangHistory.group - const Constant(1),
|
||||
),
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
await customStatement('PRAGMA foreign_keys = ON');
|
||||
},
|
||||
);
|
||||
|
||||
@@ -88,11 +131,13 @@ class BangDatabase extends $BangDatabase with PrefixQueryBuilderMixin {
|
||||
//Too many changes, we switch to a new database
|
||||
},
|
||||
from2To3: (m, schema) async {
|
||||
final bangAtV3 = schema.bang;
|
||||
await m.addColumn(bangAtV3, bangAtV3.searxngApi);
|
||||
await m.addColumn(schema.bang, schema.bang.searxngApi);
|
||||
},
|
||||
from3To4: (m, schema) async {
|
||||
await m.alterTable(TableMigration(schema.bangHistory));
|
||||
},
|
||||
from4To5: (m, schema) async {
|
||||
await m.addColumn(schema.bang, schema.bang.snapDomain);
|
||||
},
|
||||
);
|
||||
}
|
||||
|
||||
@@ -1045,10 +1045,263 @@ i1.GeneratedColumn<int> _column_40(String aliasedName) =>
|
||||
true,
|
||||
type: i1.DriftSqlType.int,
|
||||
);
|
||||
|
||||
final class Schema5 extends i0.VersionedSchema {
|
||||
Schema5({required super.database}) : super(version: 5);
|
||||
@override
|
||||
late final List<i1.DatabaseSchemaEntity> entities = [
|
||||
bang,
|
||||
bangTriggers,
|
||||
idxBangTriggersLookup,
|
||||
bangTriggersAfterInsert,
|
||||
bangTriggersAfterUpdate,
|
||||
bangSync,
|
||||
bangFrequency,
|
||||
bangHistory,
|
||||
bangFts,
|
||||
bangTriggersFts,
|
||||
bangDataView,
|
||||
bangAfterInsert,
|
||||
bangAfterDelete,
|
||||
bangAfterUpdate,
|
||||
bangTriggersAfterInsertFts,
|
||||
bangTriggersAfterDeleteFts,
|
||||
bangTriggersAfterUpdateFts,
|
||||
];
|
||||
late final Shape15 bang = Shape15(
|
||||
source: i0.VersionedTable(
|
||||
entityName: 'bang',
|
||||
withoutRowId: false,
|
||||
isStrict: false,
|
||||
tableConstraints: ['PRIMARY KEY("trigger", "group")'],
|
||||
columns: [
|
||||
_column_0,
|
||||
_column_1,
|
||||
_column_2,
|
||||
_column_3,
|
||||
_column_4,
|
||||
_column_5,
|
||||
_column_6,
|
||||
_column_7,
|
||||
_column_26,
|
||||
_column_32,
|
||||
_column_41,
|
||||
],
|
||||
attachedDatabase: database,
|
||||
),
|
||||
alias: null,
|
||||
);
|
||||
late final Shape7 bangTriggers = Shape7(
|
||||
source: i0.VersionedTable(
|
||||
entityName: 'bang_triggers',
|
||||
withoutRowId: false,
|
||||
isStrict: false,
|
||||
tableConstraints: [
|
||||
'PRIMARY KEY("trigger", "group", additional_trigger)',
|
||||
'FOREIGN KEY("trigger", "group")REFERENCES bang("trigger", "group")ON DELETE CASCADE',
|
||||
],
|
||||
columns: [_column_0, _column_1, _column_28],
|
||||
attachedDatabase: database,
|
||||
),
|
||||
alias: null,
|
||||
);
|
||||
final i1.Index idxBangTriggersLookup = i1.Index(
|
||||
'idx_bang_triggers_lookup',
|
||||
'CREATE INDEX idx_bang_triggers_lookup ON bang_triggers (additional_trigger, "group")',
|
||||
);
|
||||
final i1.Trigger bangTriggersAfterInsert = i1.Trigger(
|
||||
'CREATE TRIGGER bang_triggers_after_insert AFTER INSERT ON bang WHEN new.additional_triggers IS NOT NULL BEGIN INSERT INTO bang_triggers ("trigger", "group", additional_trigger) SELECT new."trigger", new."group", json_each.value FROM json_each(new.additional_triggers);END',
|
||||
'bang_triggers_after_insert',
|
||||
);
|
||||
final i1.Trigger bangTriggersAfterUpdate = i1.Trigger(
|
||||
'CREATE TRIGGER bang_triggers_after_update AFTER UPDATE ON bang BEGIN DELETE FROM bang_triggers WHERE "trigger" = old."trigger" AND "group" = old."group";INSERT INTO bang_triggers ("trigger", "group", additional_trigger) SELECT new."trigger", new."group", json_each.value FROM json_each(new.additional_triggers)WHERE new.additional_triggers IS NOT NULL;END',
|
||||
'bang_triggers_after_update',
|
||||
);
|
||||
late final Shape11 bangSync = Shape11(
|
||||
source: i0.VersionedTable(
|
||||
entityName: 'bang_sync',
|
||||
withoutRowId: false,
|
||||
isStrict: false,
|
||||
tableConstraints: [],
|
||||
columns: [_column_8, _column_33],
|
||||
attachedDatabase: database,
|
||||
),
|
||||
alias: null,
|
||||
);
|
||||
late final Shape12 bangFrequency = Shape12(
|
||||
source: i0.VersionedTable(
|
||||
entityName: 'bang_frequency',
|
||||
withoutRowId: false,
|
||||
isStrict: false,
|
||||
tableConstraints: [
|
||||
'PRIMARY KEY("trigger", "group")',
|
||||
'FOREIGN KEY("trigger", "group")REFERENCES bang("trigger", "group")ON DELETE CASCADE',
|
||||
],
|
||||
columns: [_column_0, _column_1, _column_10, _column_34],
|
||||
attachedDatabase: database,
|
||||
),
|
||||
alias: null,
|
||||
);
|
||||
late final Shape13 bangHistory = Shape13(
|
||||
source: i0.VersionedTable(
|
||||
entityName: 'bang_history',
|
||||
withoutRowId: false,
|
||||
isStrict: false,
|
||||
tableConstraints: [
|
||||
'FOREIGN KEY("trigger", "group")REFERENCES bang("trigger", "group")ON DELETE CASCADE',
|
||||
],
|
||||
columns: [_column_12, _column_0, _column_1, _column_35],
|
||||
attachedDatabase: database,
|
||||
),
|
||||
alias: null,
|
||||
);
|
||||
late final Shape4 bangFts = Shape4(
|
||||
source: i0.VersionedVirtualTable(
|
||||
entityName: 'bang_fts',
|
||||
moduleAndArgs:
|
||||
'fts5(trigger, website_name, content=bang, prefix=\'2 3\')',
|
||||
columns: [_column_36, _column_37],
|
||||
attachedDatabase: database,
|
||||
),
|
||||
alias: null,
|
||||
);
|
||||
late final Shape8 bangTriggersFts = Shape8(
|
||||
source: i0.VersionedVirtualTable(
|
||||
entityName: 'bang_triggers_fts',
|
||||
moduleAndArgs:
|
||||
'fts5(additional_trigger, content=bang_triggers, prefix=\'2 3\')',
|
||||
columns: [_column_38],
|
||||
attachedDatabase: database,
|
||||
),
|
||||
alias: null,
|
||||
);
|
||||
late final Shape16 bangDataView = Shape16(
|
||||
source: i0.VersionedView(
|
||||
entityName: 'bang_data_view',
|
||||
createViewStmt:
|
||||
'CREATE VIEW bang_data_view AS SELECT b.*, bf.frequency, bf.last_used FROM bang AS b LEFT JOIN bang_frequency AS bf ON b."trigger" = bf."trigger" AND b."group" = bf."group";',
|
||||
columns: [
|
||||
_column_16,
|
||||
_column_17,
|
||||
_column_18,
|
||||
_column_19,
|
||||
_column_20,
|
||||
_column_21,
|
||||
_column_22,
|
||||
_column_23,
|
||||
_column_30,
|
||||
_column_39,
|
||||
_column_42,
|
||||
_column_24,
|
||||
_column_40,
|
||||
],
|
||||
attachedDatabase: database,
|
||||
),
|
||||
alias: null,
|
||||
);
|
||||
final i1.Trigger bangAfterInsert = i1.Trigger(
|
||||
'CREATE TRIGGER bang_after_insert AFTER INSERT ON bang BEGIN INSERT INTO bang_fts ("rowid", "trigger", website_name) VALUES (new."rowid", new."trigger", new.website_name);END',
|
||||
'bang_after_insert',
|
||||
);
|
||||
final i1.Trigger bangAfterDelete = i1.Trigger(
|
||||
'CREATE TRIGGER bang_after_delete AFTER DELETE ON bang BEGIN INSERT INTO bang_fts (bang_fts, "rowid", "trigger", website_name) VALUES (\'delete\', old."rowid", old."trigger", old.website_name);END',
|
||||
'bang_after_delete',
|
||||
);
|
||||
final i1.Trigger bangAfterUpdate = i1.Trigger(
|
||||
'CREATE TRIGGER bang_after_update AFTER UPDATE ON bang BEGIN INSERT INTO bang_fts (bang_fts, "rowid", "trigger", website_name) VALUES (\'delete\', old."rowid", old."trigger", old.website_name);INSERT INTO bang_fts ("rowid", "trigger", website_name) VALUES (new."rowid", new."trigger", new.website_name);END',
|
||||
'bang_after_update',
|
||||
);
|
||||
final i1.Trigger bangTriggersAfterInsertFts = i1.Trigger(
|
||||
'CREATE TRIGGER bang_triggers_after_insert_fts AFTER INSERT ON bang_triggers BEGIN INSERT INTO bang_triggers_fts ("rowid", additional_trigger) VALUES (new."rowid", new.additional_trigger);END',
|
||||
'bang_triggers_after_insert_fts',
|
||||
);
|
||||
final i1.Trigger bangTriggersAfterDeleteFts = i1.Trigger(
|
||||
'CREATE TRIGGER bang_triggers_after_delete_fts AFTER DELETE ON bang_triggers BEGIN INSERT INTO bang_triggers_fts (bang_triggers_fts, "rowid", additional_trigger) VALUES (\'delete\', old."rowid", old.additional_trigger);END',
|
||||
'bang_triggers_after_delete_fts',
|
||||
);
|
||||
final i1.Trigger bangTriggersAfterUpdateFts = i1.Trigger(
|
||||
'CREATE TRIGGER bang_triggers_after_update_fts AFTER UPDATE ON bang_triggers BEGIN INSERT INTO bang_triggers_fts (bang_triggers_fts, "rowid", additional_trigger) VALUES (\'delete\', old."rowid", old.additional_trigger);INSERT INTO bang_triggers_fts ("rowid", additional_trigger) VALUES (new."rowid", new.additional_trigger);END',
|
||||
'bang_triggers_after_update_fts',
|
||||
);
|
||||
}
|
||||
|
||||
class Shape15 extends i0.VersionedTable {
|
||||
Shape15({required super.source, required super.alias}) : super.aliased();
|
||||
i1.GeneratedColumn<String> get trigger =>
|
||||
columnsByName['trigger']! as i1.GeneratedColumn<String>;
|
||||
i1.GeneratedColumn<int> get group =>
|
||||
columnsByName['group']! as i1.GeneratedColumn<int>;
|
||||
i1.GeneratedColumn<String> get websiteName =>
|
||||
columnsByName['website_name']! as i1.GeneratedColumn<String>;
|
||||
i1.GeneratedColumn<String> get domain =>
|
||||
columnsByName['domain']! as i1.GeneratedColumn<String>;
|
||||
i1.GeneratedColumn<String> get urlTemplate =>
|
||||
columnsByName['url_template']! as i1.GeneratedColumn<String>;
|
||||
i1.GeneratedColumn<String> get category =>
|
||||
columnsByName['category']! as i1.GeneratedColumn<String>;
|
||||
i1.GeneratedColumn<String> get subCategory =>
|
||||
columnsByName['sub_category']! as i1.GeneratedColumn<String>;
|
||||
i1.GeneratedColumn<String> get format =>
|
||||
columnsByName['format']! as i1.GeneratedColumn<String>;
|
||||
i1.GeneratedColumn<String> get additionalTriggers =>
|
||||
columnsByName['additional_triggers']! as i1.GeneratedColumn<String>;
|
||||
i1.GeneratedColumn<int> get searxngApi =>
|
||||
columnsByName['searxng_api']! as i1.GeneratedColumn<int>;
|
||||
i1.GeneratedColumn<String> get snapDomain =>
|
||||
columnsByName['snap_domain']! as i1.GeneratedColumn<String>;
|
||||
}
|
||||
|
||||
i1.GeneratedColumn<String> _column_41(String aliasedName) =>
|
||||
i1.GeneratedColumn<String>(
|
||||
'snap_domain',
|
||||
aliasedName,
|
||||
true,
|
||||
type: i1.DriftSqlType.string,
|
||||
$customConstraints: '',
|
||||
);
|
||||
|
||||
class Shape16 extends i0.VersionedView {
|
||||
Shape16({required super.source, required super.alias}) : super.aliased();
|
||||
i1.GeneratedColumn<String> get trigger =>
|
||||
columnsByName['trigger']! as i1.GeneratedColumn<String>;
|
||||
i1.GeneratedColumn<int> get group =>
|
||||
columnsByName['group']! as i1.GeneratedColumn<int>;
|
||||
i1.GeneratedColumn<String> get websiteName =>
|
||||
columnsByName['website_name']! as i1.GeneratedColumn<String>;
|
||||
i1.GeneratedColumn<String> get domain =>
|
||||
columnsByName['domain']! as i1.GeneratedColumn<String>;
|
||||
i1.GeneratedColumn<String> get urlTemplate =>
|
||||
columnsByName['url_template']! as i1.GeneratedColumn<String>;
|
||||
i1.GeneratedColumn<String> get category =>
|
||||
columnsByName['category']! as i1.GeneratedColumn<String>;
|
||||
i1.GeneratedColumn<String> get subCategory =>
|
||||
columnsByName['sub_category']! as i1.GeneratedColumn<String>;
|
||||
i1.GeneratedColumn<String> get format =>
|
||||
columnsByName['format']! as i1.GeneratedColumn<String>;
|
||||
i1.GeneratedColumn<String> get additionalTriggers =>
|
||||
columnsByName['additional_triggers']! as i1.GeneratedColumn<String>;
|
||||
i1.GeneratedColumn<int> get searxngApi =>
|
||||
columnsByName['searxng_api']! as i1.GeneratedColumn<int>;
|
||||
i1.GeneratedColumn<String> get snapDomain =>
|
||||
columnsByName['snap_domain']! as i1.GeneratedColumn<String>;
|
||||
i1.GeneratedColumn<int> get frequency =>
|
||||
columnsByName['frequency']! as i1.GeneratedColumn<int>;
|
||||
i1.GeneratedColumn<int> get lastUsed =>
|
||||
columnsByName['last_used']! as i1.GeneratedColumn<int>;
|
||||
}
|
||||
|
||||
i1.GeneratedColumn<String> _column_42(String aliasedName) =>
|
||||
i1.GeneratedColumn<String>(
|
||||
'snap_domain',
|
||||
aliasedName,
|
||||
true,
|
||||
type: i1.DriftSqlType.string,
|
||||
);
|
||||
i0.MigrationStepWithVersion migrationSteps({
|
||||
required Future<void> Function(i1.Migrator m, Schema2 schema) from1To2,
|
||||
required Future<void> Function(i1.Migrator m, Schema3 schema) from2To3,
|
||||
required Future<void> Function(i1.Migrator m, Schema4 schema) from3To4,
|
||||
required Future<void> Function(i1.Migrator m, Schema5 schema) from4To5,
|
||||
}) {
|
||||
return (currentVersion, database) async {
|
||||
switch (currentVersion) {
|
||||
@@ -1067,6 +1320,11 @@ i0.MigrationStepWithVersion migrationSteps({
|
||||
final migrator = i1.Migrator(database, schema);
|
||||
await from3To4(migrator, schema);
|
||||
return 4;
|
||||
case 4:
|
||||
final schema = Schema5(database: database);
|
||||
final migrator = i1.Migrator(database, schema);
|
||||
await from4To5(migrator, schema);
|
||||
return 5;
|
||||
default:
|
||||
throw ArgumentError.value('Unknown migration from $currentVersion');
|
||||
}
|
||||
@@ -1077,10 +1335,12 @@ i1.OnUpgrade stepByStep({
|
||||
required Future<void> Function(i1.Migrator m, Schema2 schema) from1To2,
|
||||
required Future<void> Function(i1.Migrator m, Schema3 schema) from2To3,
|
||||
required Future<void> Function(i1.Migrator m, Schema4 schema) from3To4,
|
||||
required Future<void> Function(i1.Migrator m, Schema5 schema) from4To5,
|
||||
}) => i0.VersionedSchema.stepByStepHelper(
|
||||
step: migrationSteps(
|
||||
from1To2: from1To2,
|
||||
from2To3: from2To3,
|
||||
from3To4: from3To4,
|
||||
from4To5: from4To5,
|
||||
),
|
||||
);
|
||||
|
||||
@@ -16,6 +16,7 @@ CREATE TABLE bang (
|
||||
format TEXT MAPPED BY `const BangFormatConverter()`,
|
||||
additional_triggers TEXT MAPPED BY `const TriggerListConverter()`,
|
||||
searxng_api BOOL NOT NULL DEFAULT FALSE,
|
||||
snap_domain TEXT,
|
||||
PRIMARY KEY ("trigger", "group")
|
||||
) WITH Bang;
|
||||
|
||||
|
||||
@@ -26,6 +26,7 @@ typedef $BangTableCreateCompanionBuilder =
|
||||
i0.Value<Set<i1.BangFormat>?> format,
|
||||
i0.Value<Set<String>?> additionalTriggers,
|
||||
i0.Value<bool> searxngApi,
|
||||
i0.Value<String?> snapDomain,
|
||||
i0.Value<int> rowid,
|
||||
});
|
||||
typedef $BangTableUpdateCompanionBuilder =
|
||||
@@ -40,6 +41,7 @@ typedef $BangTableUpdateCompanionBuilder =
|
||||
i0.Value<Set<i1.BangFormat>?> format,
|
||||
i0.Value<Set<String>?> additionalTriggers,
|
||||
i0.Value<bool> searxngApi,
|
||||
i0.Value<String?> snapDomain,
|
||||
i0.Value<int> rowid,
|
||||
});
|
||||
|
||||
@@ -108,6 +110,11 @@ class $BangTableFilterComposer
|
||||
column: $table.searxngApi,
|
||||
builder: (column) => i0.ColumnFilters(column),
|
||||
);
|
||||
|
||||
i0.ColumnFilters<String> get snapDomain => $composableBuilder(
|
||||
column: $table.snapDomain,
|
||||
builder: (column) => i0.ColumnFilters(column),
|
||||
);
|
||||
}
|
||||
|
||||
class $BangTableOrderingComposer
|
||||
@@ -168,6 +175,11 @@ class $BangTableOrderingComposer
|
||||
column: $table.searxngApi,
|
||||
builder: (column) => i0.ColumnOrderings(column),
|
||||
);
|
||||
|
||||
i0.ColumnOrderings<String> get snapDomain => $composableBuilder(
|
||||
column: $table.snapDomain,
|
||||
builder: (column) => i0.ColumnOrderings(column),
|
||||
);
|
||||
}
|
||||
|
||||
class $BangTableAnnotationComposer
|
||||
@@ -219,6 +231,11 @@ class $BangTableAnnotationComposer
|
||||
column: $table.searxngApi,
|
||||
builder: (column) => column,
|
||||
);
|
||||
|
||||
i0.GeneratedColumn<String> get snapDomain => $composableBuilder(
|
||||
column: $table.snapDomain,
|
||||
builder: (column) => column,
|
||||
);
|
||||
}
|
||||
|
||||
class $BangTableTableManager
|
||||
@@ -263,6 +280,7 @@ class $BangTableTableManager
|
||||
i0.Value<Set<String>?> additionalTriggers =
|
||||
const i0.Value.absent(),
|
||||
i0.Value<bool> searxngApi = const i0.Value.absent(),
|
||||
i0.Value<String?> snapDomain = const i0.Value.absent(),
|
||||
i0.Value<int> rowid = const i0.Value.absent(),
|
||||
}) => i3.BangCompanion(
|
||||
trigger: trigger,
|
||||
@@ -275,6 +293,7 @@ class $BangTableTableManager
|
||||
format: format,
|
||||
additionalTriggers: additionalTriggers,
|
||||
searxngApi: searxngApi,
|
||||
snapDomain: snapDomain,
|
||||
rowid: rowid,
|
||||
),
|
||||
createCompanionCallback:
|
||||
@@ -290,6 +309,7 @@ class $BangTableTableManager
|
||||
i0.Value<Set<String>?> additionalTriggers =
|
||||
const i0.Value.absent(),
|
||||
i0.Value<bool> searxngApi = const i0.Value.absent(),
|
||||
i0.Value<String?> snapDomain = const i0.Value.absent(),
|
||||
i0.Value<int> rowid = const i0.Value.absent(),
|
||||
}) => i3.BangCompanion.insert(
|
||||
trigger: trigger,
|
||||
@@ -302,6 +322,7 @@ class $BangTableTableManager
|
||||
format: format,
|
||||
additionalTriggers: additionalTriggers,
|
||||
searxngApi: searxngApi,
|
||||
snapDomain: snapDomain,
|
||||
rowid: rowid,
|
||||
),
|
||||
withReferenceMapper: (p0) => p0
|
||||
@@ -1394,6 +1415,14 @@ class BangTable extends i0.Table with i0.TableInfo<BangTable, i1.Bang> {
|
||||
$customConstraints: 'NOT NULL DEFAULT FALSE',
|
||||
defaultValue: const i0.CustomExpression('FALSE'),
|
||||
);
|
||||
late final i0.GeneratedColumn<String> snapDomain = i0.GeneratedColumn<String>(
|
||||
'snap_domain',
|
||||
aliasedName,
|
||||
true,
|
||||
type: i0.DriftSqlType.string,
|
||||
requiredDuringInsert: false,
|
||||
$customConstraints: '',
|
||||
);
|
||||
@override
|
||||
List<i0.GeneratedColumn> get $columns => [
|
||||
trigger,
|
||||
@@ -1406,6 +1435,7 @@ class BangTable extends i0.Table with i0.TableInfo<BangTable, i1.Bang> {
|
||||
format,
|
||||
additionalTriggers,
|
||||
searxngApi,
|
||||
snapDomain,
|
||||
];
|
||||
@override
|
||||
String get aliasedName => _alias ?? actualTableName;
|
||||
@@ -1464,6 +1494,10 @@ class BangTable extends i0.Table with i0.TableInfo<BangTable, i1.Bang> {
|
||||
data['${effectivePrefix}additional_triggers'],
|
||||
),
|
||||
),
|
||||
snapDomain: attachedDatabase.typeMapping.read(
|
||||
i0.DriftSqlType.string,
|
||||
data['${effectivePrefix}snap_domain'],
|
||||
),
|
||||
);
|
||||
}
|
||||
|
||||
@@ -1497,6 +1531,7 @@ class BangCompanion extends i0.UpdateCompanion<i1.Bang> {
|
||||
final i0.Value<Set<i1.BangFormat>?> format;
|
||||
final i0.Value<Set<String>?> additionalTriggers;
|
||||
final i0.Value<bool> searxngApi;
|
||||
final i0.Value<String?> snapDomain;
|
||||
final i0.Value<int> rowid;
|
||||
const BangCompanion({
|
||||
this.trigger = const i0.Value.absent(),
|
||||
@@ -1509,6 +1544,7 @@ class BangCompanion extends i0.UpdateCompanion<i1.Bang> {
|
||||
this.format = const i0.Value.absent(),
|
||||
this.additionalTriggers = const i0.Value.absent(),
|
||||
this.searxngApi = const i0.Value.absent(),
|
||||
this.snapDomain = const i0.Value.absent(),
|
||||
this.rowid = const i0.Value.absent(),
|
||||
});
|
||||
BangCompanion.insert({
|
||||
@@ -1522,6 +1558,7 @@ class BangCompanion extends i0.UpdateCompanion<i1.Bang> {
|
||||
this.format = const i0.Value.absent(),
|
||||
this.additionalTriggers = const i0.Value.absent(),
|
||||
this.searxngApi = const i0.Value.absent(),
|
||||
this.snapDomain = const i0.Value.absent(),
|
||||
this.rowid = const i0.Value.absent(),
|
||||
}) : trigger = i0.Value(trigger),
|
||||
group = i0.Value(group),
|
||||
@@ -1539,6 +1576,7 @@ class BangCompanion extends i0.UpdateCompanion<i1.Bang> {
|
||||
i0.Expression<String>? format,
|
||||
i0.Expression<String>? additionalTriggers,
|
||||
i0.Expression<bool>? searxngApi,
|
||||
i0.Expression<String>? snapDomain,
|
||||
i0.Expression<int>? rowid,
|
||||
}) {
|
||||
return i0.RawValuesInsertable({
|
||||
@@ -1552,6 +1590,7 @@ class BangCompanion extends i0.UpdateCompanion<i1.Bang> {
|
||||
if (format != null) 'format': format,
|
||||
if (additionalTriggers != null) 'additional_triggers': additionalTriggers,
|
||||
if (searxngApi != null) 'searxng_api': searxngApi,
|
||||
if (snapDomain != null) 'snap_domain': snapDomain,
|
||||
if (rowid != null) 'rowid': rowid,
|
||||
});
|
||||
}
|
||||
@@ -1567,6 +1606,7 @@ class BangCompanion extends i0.UpdateCompanion<i1.Bang> {
|
||||
i0.Value<Set<i1.BangFormat>?>? format,
|
||||
i0.Value<Set<String>?>? additionalTriggers,
|
||||
i0.Value<bool>? searxngApi,
|
||||
i0.Value<String?>? snapDomain,
|
||||
i0.Value<int>? rowid,
|
||||
}) {
|
||||
return i3.BangCompanion(
|
||||
@@ -1580,6 +1620,7 @@ class BangCompanion extends i0.UpdateCompanion<i1.Bang> {
|
||||
format: format ?? this.format,
|
||||
additionalTriggers: additionalTriggers ?? this.additionalTriggers,
|
||||
searxngApi: searxngApi ?? this.searxngApi,
|
||||
snapDomain: snapDomain ?? this.snapDomain,
|
||||
rowid: rowid ?? this.rowid,
|
||||
);
|
||||
}
|
||||
@@ -1625,6 +1666,9 @@ class BangCompanion extends i0.UpdateCompanion<i1.Bang> {
|
||||
if (searxngApi.present) {
|
||||
map['searxng_api'] = i0.Variable<bool>(searxngApi.value);
|
||||
}
|
||||
if (snapDomain.present) {
|
||||
map['snap_domain'] = i0.Variable<String>(snapDomain.value);
|
||||
}
|
||||
if (rowid.present) {
|
||||
map['rowid'] = i0.Variable<int>(rowid.value);
|
||||
}
|
||||
@@ -1644,6 +1688,7 @@ class BangCompanion extends i0.UpdateCompanion<i1.Bang> {
|
||||
..write('format: $format, ')
|
||||
..write('additionalTriggers: $additionalTriggers, ')
|
||||
..write('searxngApi: $searxngApi, ')
|
||||
..write('snapDomain: $snapDomain, ')
|
||||
..write('rowid: $rowid')
|
||||
..write(')'))
|
||||
.toString();
|
||||
@@ -3033,6 +3078,7 @@ class BangDataView extends i0.ViewInfo<i3.BangDataView, i6.BangData>
|
||||
format,
|
||||
additionalTriggers,
|
||||
searxngApi,
|
||||
snapDomain,
|
||||
frequency,
|
||||
lastUsed,
|
||||
];
|
||||
@@ -3097,6 +3143,10 @@ class BangDataView extends i0.ViewInfo<i3.BangDataView, i6.BangData>
|
||||
data['${effectivePrefix}additional_triggers'],
|
||||
),
|
||||
),
|
||||
snapDomain: attachedDatabase.typeMapping.read(
|
||||
i0.DriftSqlType.string,
|
||||
data['${effectivePrefix}snap_domain'],
|
||||
),
|
||||
frequency: attachedDatabase.typeMapping.read(
|
||||
i0.DriftSqlType.int,
|
||||
data['${effectivePrefix}frequency'],
|
||||
@@ -3177,6 +3227,12 @@ class BangDataView extends i0.ViewInfo<i3.BangDataView, i6.BangData>
|
||||
'CHECK ("searxng_api" IN (0, 1))',
|
||||
),
|
||||
);
|
||||
late final i0.GeneratedColumn<String> snapDomain = i0.GeneratedColumn<String>(
|
||||
'snap_domain',
|
||||
aliasedName,
|
||||
true,
|
||||
type: i0.DriftSqlType.string,
|
||||
);
|
||||
late final i0.GeneratedColumn<int> frequency = i0.GeneratedColumn<int>(
|
||||
'frequency',
|
||||
aliasedName,
|
||||
@@ -3265,6 +3321,7 @@ class DefinitionsDrift extends i7.ModularAccessor {
|
||||
additionalTriggers: i3.BangTable.$converteradditionalTriggers.fromSql(
|
||||
row.readNullable<String>('additional_triggers'),
|
||||
),
|
||||
snapDomain: row.readNullable<String>('snap_domain'),
|
||||
frequency: row.readNullable<int>('frequency'),
|
||||
lastUsed: row.readNullable<DateTime>('last_used'),
|
||||
),
|
||||
@@ -3292,6 +3349,7 @@ class DefinitionsDrift extends i7.ModularAccessor {
|
||||
additionalTriggers: i3.BangTable.$converteradditionalTriggers.fromSql(
|
||||
row.readNullable<String>('additional_triggers'),
|
||||
),
|
||||
snapDomain: row.readNullable<String>('snap_domain'),
|
||||
frequency: row.readNullable<int>('frequency'),
|
||||
lastUsed: row.readNullable<DateTime>('last_used'),
|
||||
),
|
||||
|
||||
@@ -21,6 +21,7 @@ import 'package:copy_with_extension/copy_with_extension.dart';
|
||||
import 'package:drift/drift.dart' show Expression, Insertable, Value;
|
||||
import 'package:fast_equatable/fast_equatable.dart';
|
||||
import 'package:json_annotation/json_annotation.dart';
|
||||
import 'package:nullability/nullability.dart';
|
||||
import 'package:weblibre/extensions/uri.dart';
|
||||
import 'package:weblibre/features/bangs/data/database/definitions.drift.dart';
|
||||
import 'package:weblibre/features/bangs/data/models/bang_group.dart';
|
||||
@@ -42,6 +43,10 @@ enum BangFormat {
|
||||
///with one or the other.
|
||||
@JsonValue('url_encode_space_to_plus')
|
||||
urlEncodeSpaceToPlus,
|
||||
|
||||
///When the bang is invoked with no query, open the snap domain (ad) instead of any path given in the template
|
||||
@JsonValue('open_snap_domain')
|
||||
openSnapDomain,
|
||||
}
|
||||
|
||||
@JsonSerializable()
|
||||
@@ -84,6 +89,10 @@ class Bang with FastEquatable implements Insertable<Bang> {
|
||||
@JsonKey(name: 'ts')
|
||||
final Set<String>? additionalTriggers;
|
||||
|
||||
///Additional triggers that invoke this bang
|
||||
@JsonKey(name: 'ad')
|
||||
final String? snapDomain;
|
||||
|
||||
@JsonKey(defaultValue: false)
|
||||
final bool searxngApi;
|
||||
|
||||
@@ -102,8 +111,16 @@ class Bang with FastEquatable implements Insertable<Bang> {
|
||||
}
|
||||
|
||||
Uri getTemplateUrl(String? query) {
|
||||
final url = (query != null)
|
||||
? urlTemplate.replaceAll(_templateQueryPlaceholder, formatQuery(query))
|
||||
final queryEmpty = query.isEmpty;
|
||||
|
||||
if (queryEmpty && format?.contains(BangFormat.openSnapDomain) == true) {
|
||||
if (snapDomain.isNotEmpty) {
|
||||
return Uri.parse(snapDomain!);
|
||||
}
|
||||
}
|
||||
|
||||
final url = (!queryEmpty)
|
||||
? urlTemplate.replaceAll(_templateQueryPlaceholder, formatQuery(query!))
|
||||
: urlTemplate;
|
||||
|
||||
var template = Uri.parse(url);
|
||||
@@ -113,8 +130,8 @@ class Bang with FastEquatable implements Insertable<Bang> {
|
||||
).replace(path: template.path, query: template.query);
|
||||
}
|
||||
|
||||
if (format?.contains(BangFormat.openBasePath) == true) {
|
||||
return template.base;
|
||||
if (queryEmpty && format?.contains(BangFormat.openBasePath) == true) {
|
||||
template = template.base;
|
||||
}
|
||||
|
||||
return template;
|
||||
@@ -139,6 +156,7 @@ class Bang with FastEquatable implements Insertable<Bang> {
|
||||
this.subCategory,
|
||||
this.format,
|
||||
this.additionalTriggers,
|
||||
this.snapDomain,
|
||||
});
|
||||
|
||||
factory Bang.fromJson(Map<String, dynamic> json) => _$BangFromJson(json);
|
||||
@@ -156,6 +174,7 @@ class Bang with FastEquatable implements Insertable<Bang> {
|
||||
subCategory,
|
||||
format,
|
||||
additionalTriggers,
|
||||
snapDomain,
|
||||
searxngApi,
|
||||
];
|
||||
|
||||
@@ -171,6 +190,7 @@ class Bang with FastEquatable implements Insertable<Bang> {
|
||||
subCategory: Value.absentIfNull(subCategory),
|
||||
format: Value.absentIfNull(format),
|
||||
additionalTriggers: Value.absentIfNull(additionalTriggers),
|
||||
snapDomain: Value.absentIfNull(snapDomain),
|
||||
).toColumns(nullToAbsent);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -27,6 +27,8 @@ abstract class _$BangCWProxy {
|
||||
|
||||
Bang additionalTriggers(Set<String>? additionalTriggers);
|
||||
|
||||
Bang snapDomain(String? snapDomain);
|
||||
|
||||
/// Creates a new instance with the provided field values.
|
||||
/// Passing `null` to a nullable field nullifies it, while `null` for a non-nullable field is ignored. To update a single field use `Bang(...).copyWith.fieldName(value)`.
|
||||
///
|
||||
@@ -45,6 +47,7 @@ abstract class _$BangCWProxy {
|
||||
String? subCategory,
|
||||
Set<BangFormat>? format,
|
||||
Set<String>? additionalTriggers,
|
||||
String? snapDomain,
|
||||
});
|
||||
}
|
||||
|
||||
@@ -86,6 +89,9 @@ class _$BangCWProxyImpl implements _$BangCWProxy {
|
||||
Bang additionalTriggers(Set<String>? additionalTriggers) =>
|
||||
call(additionalTriggers: additionalTriggers);
|
||||
|
||||
@override
|
||||
Bang snapDomain(String? snapDomain) => call(snapDomain: snapDomain);
|
||||
|
||||
@override
|
||||
/// Creates a new instance with the provided field values.
|
||||
/// Passing `null` to a nullable field nullifies it, while `null` for a non-nullable field is ignored. To update a single field use `Bang(...).copyWith.fieldName(value)`.
|
||||
@@ -105,6 +111,7 @@ class _$BangCWProxyImpl implements _$BangCWProxy {
|
||||
Object? subCategory = const $CopyWithPlaceholder(),
|
||||
Object? format = const $CopyWithPlaceholder(),
|
||||
Object? additionalTriggers = const $CopyWithPlaceholder(),
|
||||
Object? snapDomain = const $CopyWithPlaceholder(),
|
||||
}) {
|
||||
return Bang(
|
||||
websiteName:
|
||||
@@ -150,6 +157,10 @@ class _$BangCWProxyImpl implements _$BangCWProxy {
|
||||
? _value.additionalTriggers
|
||||
// ignore: cast_nullable_to_non_nullable
|
||||
: additionalTriggers as Set<String>?,
|
||||
snapDomain: snapDomain == const $CopyWithPlaceholder()
|
||||
? _value.snapDomain
|
||||
// ignore: cast_nullable_to_non_nullable
|
||||
: snapDomain as String?,
|
||||
);
|
||||
}
|
||||
}
|
||||
@@ -179,6 +190,7 @@ Bang _$BangFromJson(Map<String, dynamic> json) => Bang(
|
||||
additionalTriggers: (json['ts'] as List<dynamic>?)
|
||||
?.map((e) => e as String)
|
||||
.toSet(),
|
||||
snapDomain: json['ad'] as String?,
|
||||
);
|
||||
|
||||
Map<String, dynamic> _$BangToJson(Bang instance) => <String, dynamic>{
|
||||
@@ -190,6 +202,7 @@ Map<String, dynamic> _$BangToJson(Bang instance) => <String, dynamic>{
|
||||
'sc': instance.subCategory,
|
||||
'fmt': instance.format?.map((e) => _$BangFormatEnumMap[e]!).toList(),
|
||||
'ts': instance.additionalTriggers?.toList(),
|
||||
'ad': instance.snapDomain,
|
||||
'searxngApi': instance.searxngApi,
|
||||
};
|
||||
|
||||
@@ -197,4 +210,5 @@ const _$BangFormatEnumMap = {
|
||||
BangFormat.openBasePath: 'open_base_path',
|
||||
BangFormat.urlEncodePlaceholder: 'url_encode_placeholder',
|
||||
BangFormat.urlEncodeSpaceToPlus: 'url_encode_space_to_plus',
|
||||
BangFormat.openSnapDomain: 'open_snap_domain',
|
||||
};
|
||||
|
||||
@@ -46,6 +46,7 @@ class BangData extends Bang {
|
||||
super.subCategory,
|
||||
super.format,
|
||||
super.additionalTriggers,
|
||||
super.snapDomain,
|
||||
int? frequency,
|
||||
this.lastUsed,
|
||||
this.icon,
|
||||
@@ -62,6 +63,7 @@ class BangData extends Bang {
|
||||
super.subCategory,
|
||||
super.format,
|
||||
super.additionalTriggers,
|
||||
super.snapDomain,
|
||||
int? frequency,
|
||||
this.lastUsed,
|
||||
this.icon,
|
||||
|
||||
@@ -25,6 +25,8 @@ abstract class _$BangDataCWProxy {
|
||||
|
||||
BangData additionalTriggers(Set<String>? additionalTriggers);
|
||||
|
||||
BangData snapDomain(String? snapDomain);
|
||||
|
||||
BangData frequency(int? frequency);
|
||||
|
||||
BangData lastUsed(DateTime? lastUsed);
|
||||
@@ -48,6 +50,7 @@ abstract class _$BangDataCWProxy {
|
||||
String? subCategory,
|
||||
Set<BangFormat>? format,
|
||||
Set<String>? additionalTriggers,
|
||||
String? snapDomain,
|
||||
int? frequency,
|
||||
DateTime? lastUsed,
|
||||
BrowserIcon? icon,
|
||||
@@ -89,6 +92,9 @@ class _$BangDataCWProxyImpl implements _$BangDataCWProxy {
|
||||
BangData additionalTriggers(Set<String>? additionalTriggers) =>
|
||||
call(additionalTriggers: additionalTriggers);
|
||||
|
||||
@override
|
||||
BangData snapDomain(String? snapDomain) => call(snapDomain: snapDomain);
|
||||
|
||||
@override
|
||||
BangData frequency(int? frequency) => call(frequency: frequency);
|
||||
|
||||
@@ -116,6 +122,7 @@ class _$BangDataCWProxyImpl implements _$BangDataCWProxy {
|
||||
Object? subCategory = const $CopyWithPlaceholder(),
|
||||
Object? format = const $CopyWithPlaceholder(),
|
||||
Object? additionalTriggers = const $CopyWithPlaceholder(),
|
||||
Object? snapDomain = const $CopyWithPlaceholder(),
|
||||
Object? frequency = const $CopyWithPlaceholder(),
|
||||
Object? lastUsed = const $CopyWithPlaceholder(),
|
||||
Object? icon = const $CopyWithPlaceholder(),
|
||||
@@ -160,6 +167,10 @@ class _$BangDataCWProxyImpl implements _$BangDataCWProxy {
|
||||
? _value.additionalTriggers
|
||||
// ignore: cast_nullable_to_non_nullable
|
||||
: additionalTriggers as Set<String>?,
|
||||
snapDomain: snapDomain == const $CopyWithPlaceholder()
|
||||
? _value.snapDomain
|
||||
// ignore: cast_nullable_to_non_nullable
|
||||
: snapDomain as String?,
|
||||
frequency: frequency == const $CopyWithPlaceholder()
|
||||
? _value.frequency
|
||||
// ignore: cast_nullable_to_non_nullable
|
||||
|
||||
@@ -23,11 +23,6 @@ enum BangGroup {
|
||||
'https://raw.githubusercontent.com/FaFre/bangs/main/data/bangs.json',
|
||||
bundled: 'assets/bangs/bangs.json',
|
||||
),
|
||||
assistant(
|
||||
remote:
|
||||
'https://raw.githubusercontent.com/FaFre/bangs/main/data/assistant_bangs.json',
|
||||
bundled: 'assets/bangs/assistant_bangs.json',
|
||||
),
|
||||
kagi(
|
||||
remote:
|
||||
'https://raw.githubusercontent.com/FaFre/bangs/main/data/kagi_bangs.json',
|
||||
|
||||
@@ -46,7 +46,13 @@ class BangKey {
|
||||
|
||||
static BangKey? tryFromString(String key) {
|
||||
try {
|
||||
final [group, trigger] = key.split('::');
|
||||
var [group, trigger] = key.split('::');
|
||||
|
||||
//Migrate to schema v5
|
||||
if (group == 'assistant') {
|
||||
group = BangGroup.kagi.name;
|
||||
}
|
||||
|
||||
return BangKey(
|
||||
group: BangGroup.values.firstWhere((g) => g.name == group),
|
||||
trigger: trigger,
|
||||
|
||||
@@ -107,6 +107,7 @@ class EditBangScreen extends HookConsumerWidget {
|
||||
category: category.value,
|
||||
subCategory: subCategory.value,
|
||||
additionalTriggers: initialBang?.additionalTriggers,
|
||||
snapDomain: initialBang?.snapDomain,
|
||||
format: formatFlags.value.isNotEmpty
|
||||
? formatFlags.value
|
||||
: null,
|
||||
|
||||
@@ -59,11 +59,6 @@ class BangSettingsScreen extends HookConsumerWidget {
|
||||
title: 'General Bangs',
|
||||
subtitle: 'Sync on demand from GitHub',
|
||||
),
|
||||
const BangGroupListTile(
|
||||
group: BangGroup.assistant,
|
||||
title: 'Assistant Bangs',
|
||||
subtitle: 'Sync on-demand from GitHub',
|
||||
),
|
||||
const BangGroupListTile(
|
||||
group: BangGroup.kagi,
|
||||
title: 'Kagi Bangs',
|
||||
|
||||
Reference in New Issue
Block a user