source settings (add/edit)

This commit is contained in:
austinried
2025-12-10 20:21:43 +09:00
parent f7874bcead
commit 7f6ba4776a
6 changed files with 411 additions and 43 deletions

View File

@@ -4,6 +4,8 @@ import '../database.dart';
part 'sources_dao.g.dart';
typedef SourceSetting = ({Source source, SubsonicSetting subsonicSetting});
@DriftAccessor(include: {'../tables.drift'})
class SourcesDao extends DatabaseAccessor<SubtracksDatabase>
with _$SourcesDaoMixin {
@@ -16,7 +18,7 @@ class SourcesDao extends DatabaseAccessor<SubtracksDatabase>
.map((row) => row.read(sources.id));
}
Stream<List<(Source, SubsonicSetting)>> listSources() {
Stream<List<SourceSetting>> listSources() {
final query = select(sources).join([
innerJoin(
subsonicSettings,
@@ -24,18 +26,56 @@ class SourcesDao extends DatabaseAccessor<SubtracksDatabase>
),
]);
return query.watch().map(
(rows) => rows
.map(
(row) => (
row.readTable(sources),
row.readTable(subsonicSettings),
),
)
.toList(),
return query
.map(
(row) => (
source: row.readTable(sources),
subsonicSetting: row.readTable(subsonicSettings),
),
)
.watch();
}
Selectable<SourceSetting> getSource(int id) {
final query = select(sources).join([
innerJoin(
subsonicSettings,
sources.id.equalsExp(subsonicSettings.sourceId),
),
])..where(sources.id.equals(id));
return query.map(
(row) => (
source: row.readTable(sources),
subsonicSetting: row.readTable(subsonicSettings),
),
);
}
Future<void> deleteSource(int id) async {
await sources.deleteWhere((f) => f.id.equals(id));
}
Future<void> updateSource(Source source, SubsonicSetting subsonic) async {
await db.transaction(() async {
await sources.update().replace(source);
await subsonicSettings.update().replace(subsonic);
});
}
Future<void> createSource(
SourcesCompanion source,
SubsonicSettingsCompanion subsonic,
) async {
await db.transaction(() async {
final sourceId = await sources.insertOnConflictUpdate(source);
await subsonicSettings.insertOnConflictUpdate(
subsonic.copyWith(sourceId: Value(sourceId)),
);
});
}
Future<void> setActiveSource(int id) async {
await transaction(() async {
await db.managers.sources.update((o) => o(isActive: Value(null)));