diff --git a/lib/core/database/app_database.dart b/lib/core/database/app_database.dart index 8b8d576..33d7622 100644 --- a/lib/core/database/app_database.dart +++ b/lib/core/database/app_database.dart @@ -6,12 +6,12 @@ import 'package:lazurite/core/database/tables.dart'; part 'app_database.g.dart'; -@DriftDatabase(tables: [Accounts, CachedProfiles, CachedPosts, Settings, SavedFeeds, SearchHistory, Drafts]) +@DriftDatabase(tables: [Accounts, CachedProfiles, CachedPosts, Settings, SavedFeeds, SearchHistory, Drafts, SavedPosts]) class AppDatabase extends _$AppDatabase { AppDatabase({QueryExecutor? executor}) : super(executor ?? _openConnection()); @override - int get schemaVersion => 5; + int get schemaVersion => 6; @override MigrationStrategy get migration => MigrationStrategy( @@ -35,6 +35,9 @@ class AppDatabase extends _$AppDatabase { if (from < 5) { await migrator.createTable(drafts); } + if (from < 6) { + await migrator.createTable(savedPosts); + } }, ); @@ -214,4 +217,57 @@ class AppDatabase extends _$AppDatabase { Future deleteAllDrafts(String accountDid) async { return (delete(drafts)..where((d) => d.accountDid.equals(accountDid))).go(); } + + Future> getSavedPosts(String accountDid) async { + return (select(savedPosts) + ..where((s) => s.accountDid.equals(accountDid)) + ..orderBy([(s) => OrderingTerm.desc(s.savedAt)])) + .get(); + } + + Future getSavedPost(String accountDid, String postUri) async { + return (select( + savedPosts, + )..where((s) => s.accountDid.equals(accountDid) & s.postUri.equals(postUri))).getSingleOrNull(); + } + + Future isPostSaved(String accountDid, String postUri) async { + final saved = await getSavedPost(accountDid, postUri); + return saved != null; + } + + Future savePost(SavedPostsCompanion post) async { + return into(savedPosts).insert(post); + } + + Future unsavePost(String accountDid, String postUri) async { + return (delete(savedPosts)..where((s) => s.accountDid.equals(accountDid) & s.postUri.equals(postUri))).go(); + } + + Future unsavePostById(int id) async { + return (delete(savedPosts)..where((s) => s.id.equals(id))).go(); + } + + Future deleteAllSavedPosts(String accountDid) async { + return (delete(savedPosts)..where((s) => s.accountDid.equals(accountDid))).go(); + } + + Stream> watchSavedPosts(String accountDid) { + return (select(savedPosts) + ..where((s) => s.accountDid.equals(accountDid)) + ..orderBy([(s) => OrderingTerm.desc(s.savedAt)])) + .watch(); + } + + Stream watchIsPostSaved(String accountDid, String postUri) { + return (select(savedPosts)..where((s) => s.accountDid.equals(accountDid) & s.postUri.equals(postUri))) + .watchSingleOrNull() + .map((saved) => saved != null); + } + + Stream> watchSavedPostUris(String accountDid) { + return (select( + savedPosts, + )..where((s) => s.accountDid.equals(accountDid))).watch().map((posts) => posts.map((p) => p.postUri).toSet()); + } } diff --git a/lib/core/database/app_database.g.dart b/lib/core/database/app_database.g.dart index 7ef101c..547a70a 100644 --- a/lib/core/database/app_database.g.dart +++ b/lib/core/database/app_database.g.dart @@ -26,7 +26,9 @@ class $AccountsTable extends Accounts with TableInfo<$AccountsTable, Account> { type: DriftSqlType.string, requiredDuringInsert: true, ); - static const VerificationMeta _displayNameMeta = const VerificationMeta('displayName'); + static const VerificationMeta _displayNameMeta = const VerificationMeta( + 'displayName', + ); @override late final GeneratedColumn displayName = GeneratedColumn( 'display_name', @@ -35,7 +37,9 @@ class $AccountsTable extends Accounts with TableInfo<$AccountsTable, Account> { type: DriftSqlType.string, requiredDuringInsert: false, ); - static const VerificationMeta _serviceMeta = const VerificationMeta('service'); + static const VerificationMeta _serviceMeta = const VerificationMeta( + 'service', + ); @override late final GeneratedColumn service = GeneratedColumn( 'service', @@ -44,7 +48,9 @@ class $AccountsTable extends Accounts with TableInfo<$AccountsTable, Account> { type: DriftSqlType.string, requiredDuringInsert: false, ); - static const VerificationMeta _accessTokenMeta = const VerificationMeta('accessToken'); + static const VerificationMeta _accessTokenMeta = const VerificationMeta( + 'accessToken', + ); @override late final GeneratedColumn accessToken = GeneratedColumn( 'access_token', @@ -53,7 +59,9 @@ class $AccountsTable extends Accounts with TableInfo<$AccountsTable, Account> { type: DriftSqlType.string, requiredDuringInsert: true, ); - static const VerificationMeta _refreshTokenMeta = const VerificationMeta('refreshToken'); + static const VerificationMeta _refreshTokenMeta = const VerificationMeta( + 'refreshToken', + ); @override late final GeneratedColumn refreshToken = GeneratedColumn( 'refresh_token', @@ -62,7 +70,9 @@ class $AccountsTable extends Accounts with TableInfo<$AccountsTable, Account> { type: DriftSqlType.string, requiredDuringInsert: false, ); - static const VerificationMeta _dpopPublicKeyMeta = const VerificationMeta('dpopPublicKey'); + static const VerificationMeta _dpopPublicKeyMeta = const VerificationMeta( + 'dpopPublicKey', + ); @override late final GeneratedColumn dpopPublicKey = GeneratedColumn( 'dpop_public_key', @@ -71,7 +81,9 @@ class $AccountsTable extends Accounts with TableInfo<$AccountsTable, Account> { type: DriftSqlType.string, requiredDuringInsert: false, ); - static const VerificationMeta _dpopPrivateKeyMeta = const VerificationMeta('dpopPrivateKey'); + static const VerificationMeta _dpopPrivateKeyMeta = const VerificationMeta( + 'dpopPrivateKey', + ); @override late final GeneratedColumn dpopPrivateKey = GeneratedColumn( 'dpop_private_key', @@ -80,7 +92,9 @@ class $AccountsTable extends Accounts with TableInfo<$AccountsTable, Account> { type: DriftSqlType.string, requiredDuringInsert: false, ); - static const VerificationMeta _dpopNonceMeta = const VerificationMeta('dpopNonce'); + static const VerificationMeta _dpopNonceMeta = const VerificationMeta( + 'dpopNonce', + ); @override late final GeneratedColumn dpopNonce = GeneratedColumn( 'dpop_nonce', @@ -89,7 +103,9 @@ class $AccountsTable extends Accounts with TableInfo<$AccountsTable, Account> { type: DriftSqlType.string, requiredDuringInsert: false, ); - static const VerificationMeta _expiresAtMeta = const VerificationMeta('expiresAt'); + static const VerificationMeta _expiresAtMeta = const VerificationMeta( + 'expiresAt', + ); @override late final GeneratedColumn expiresAt = GeneratedColumn( 'expires_at', @@ -98,7 +114,9 @@ class $AccountsTable extends Accounts with TableInfo<$AccountsTable, Account> { type: DriftSqlType.dateTime, requiredDuringInsert: false, ); - static const VerificationMeta _createdAtMeta = const VerificationMeta('createdAt'); + static const VerificationMeta _createdAtMeta = const VerificationMeta( + 'createdAt', + ); @override late final GeneratedColumn createdAt = GeneratedColumn( 'created_at', @@ -108,7 +126,9 @@ class $AccountsTable extends Accounts with TableInfo<$AccountsTable, Account> { requiredDuringInsert: false, defaultValue: currentDateAndTime, ); - static const VerificationMeta _updatedAtMeta = const VerificationMeta('updatedAt'); + static const VerificationMeta _updatedAtMeta = const VerificationMeta( + 'updatedAt', + ); @override late final GeneratedColumn updatedAt = GeneratedColumn( 'updated_at', @@ -139,56 +159,104 @@ class $AccountsTable extends Accounts with TableInfo<$AccountsTable, Account> { String get actualTableName => $name; static const String $name = 'accounts'; @override - VerificationContext validateIntegrity(Insertable instance, {bool isInserting = false}) { + VerificationContext validateIntegrity( + Insertable instance, { + bool isInserting = false, + }) { final context = VerificationContext(); final data = instance.toColumns(true); if (data.containsKey('did')) { - context.handle(_didMeta, did.isAcceptableOrUnknown(data['did']!, _didMeta)); + context.handle( + _didMeta, + did.isAcceptableOrUnknown(data['did']!, _didMeta), + ); } else if (isInserting) { context.missing(_didMeta); } if (data.containsKey('handle')) { - context.handle(_handleMeta, handle.isAcceptableOrUnknown(data['handle']!, _handleMeta)); + context.handle( + _handleMeta, + handle.isAcceptableOrUnknown(data['handle']!, _handleMeta), + ); } else if (isInserting) { context.missing(_handleMeta); } if (data.containsKey('display_name')) { - context.handle(_displayNameMeta, displayName.isAcceptableOrUnknown(data['display_name']!, _displayNameMeta)); + context.handle( + _displayNameMeta, + displayName.isAcceptableOrUnknown( + data['display_name']!, + _displayNameMeta, + ), + ); } if (data.containsKey('service')) { - context.handle(_serviceMeta, service.isAcceptableOrUnknown(data['service']!, _serviceMeta)); + context.handle( + _serviceMeta, + service.isAcceptableOrUnknown(data['service']!, _serviceMeta), + ); } if (data.containsKey('access_token')) { - context.handle(_accessTokenMeta, accessToken.isAcceptableOrUnknown(data['access_token']!, _accessTokenMeta)); + context.handle( + _accessTokenMeta, + accessToken.isAcceptableOrUnknown( + data['access_token']!, + _accessTokenMeta, + ), + ); } else if (isInserting) { context.missing(_accessTokenMeta); } if (data.containsKey('refresh_token')) { - context.handle(_refreshTokenMeta, refreshToken.isAcceptableOrUnknown(data['refresh_token']!, _refreshTokenMeta)); + context.handle( + _refreshTokenMeta, + refreshToken.isAcceptableOrUnknown( + data['refresh_token']!, + _refreshTokenMeta, + ), + ); } if (data.containsKey('dpop_public_key')) { context.handle( _dpopPublicKeyMeta, - dpopPublicKey.isAcceptableOrUnknown(data['dpop_public_key']!, _dpopPublicKeyMeta), + dpopPublicKey.isAcceptableOrUnknown( + data['dpop_public_key']!, + _dpopPublicKeyMeta, + ), ); } if (data.containsKey('dpop_private_key')) { context.handle( _dpopPrivateKeyMeta, - dpopPrivateKey.isAcceptableOrUnknown(data['dpop_private_key']!, _dpopPrivateKeyMeta), + dpopPrivateKey.isAcceptableOrUnknown( + data['dpop_private_key']!, + _dpopPrivateKeyMeta, + ), ); } if (data.containsKey('dpop_nonce')) { - context.handle(_dpopNonceMeta, dpopNonce.isAcceptableOrUnknown(data['dpop_nonce']!, _dpopNonceMeta)); + context.handle( + _dpopNonceMeta, + dpopNonce.isAcceptableOrUnknown(data['dpop_nonce']!, _dpopNonceMeta), + ); } if (data.containsKey('expires_at')) { - context.handle(_expiresAtMeta, expiresAt.isAcceptableOrUnknown(data['expires_at']!, _expiresAtMeta)); + context.handle( + _expiresAtMeta, + expiresAt.isAcceptableOrUnknown(data['expires_at']!, _expiresAtMeta), + ); } if (data.containsKey('created_at')) { - context.handle(_createdAtMeta, createdAt.isAcceptableOrUnknown(data['created_at']!, _createdAtMeta)); + context.handle( + _createdAtMeta, + createdAt.isAcceptableOrUnknown(data['created_at']!, _createdAtMeta), + ); } if (data.containsKey('updated_at')) { - context.handle(_updatedAtMeta, updatedAt.isAcceptableOrUnknown(data['updated_at']!, _updatedAtMeta)); + context.handle( + _updatedAtMeta, + updatedAt.isAcceptableOrUnknown(data['updated_at']!, _updatedAtMeta), + ); } return context; } @@ -199,21 +267,54 @@ class $AccountsTable extends Accounts with TableInfo<$AccountsTable, Account> { Account map(Map data, {String? tablePrefix}) { final effectivePrefix = tablePrefix != null ? '$tablePrefix.' : ''; return Account( - did: attachedDatabase.typeMapping.read(DriftSqlType.string, data['${effectivePrefix}did'])!, - handle: attachedDatabase.typeMapping.read(DriftSqlType.string, data['${effectivePrefix}handle'])!, - displayName: attachedDatabase.typeMapping.read(DriftSqlType.string, data['${effectivePrefix}display_name']), - service: attachedDatabase.typeMapping.read(DriftSqlType.string, data['${effectivePrefix}service']), - accessToken: attachedDatabase.typeMapping.read(DriftSqlType.string, data['${effectivePrefix}access_token'])!, - refreshToken: attachedDatabase.typeMapping.read(DriftSqlType.string, data['${effectivePrefix}refresh_token']), - dpopPublicKey: attachedDatabase.typeMapping.read(DriftSqlType.string, data['${effectivePrefix}dpop_public_key']), + did: attachedDatabase.typeMapping.read( + DriftSqlType.string, + data['${effectivePrefix}did'], + )!, + handle: attachedDatabase.typeMapping.read( + DriftSqlType.string, + data['${effectivePrefix}handle'], + )!, + displayName: attachedDatabase.typeMapping.read( + DriftSqlType.string, + data['${effectivePrefix}display_name'], + ), + service: attachedDatabase.typeMapping.read( + DriftSqlType.string, + data['${effectivePrefix}service'], + ), + accessToken: attachedDatabase.typeMapping.read( + DriftSqlType.string, + data['${effectivePrefix}access_token'], + )!, + refreshToken: attachedDatabase.typeMapping.read( + DriftSqlType.string, + data['${effectivePrefix}refresh_token'], + ), + dpopPublicKey: attachedDatabase.typeMapping.read( + DriftSqlType.string, + data['${effectivePrefix}dpop_public_key'], + ), dpopPrivateKey: attachedDatabase.typeMapping.read( DriftSqlType.string, data['${effectivePrefix}dpop_private_key'], ), - dpopNonce: attachedDatabase.typeMapping.read(DriftSqlType.string, data['${effectivePrefix}dpop_nonce']), - expiresAt: attachedDatabase.typeMapping.read(DriftSqlType.dateTime, data['${effectivePrefix}expires_at']), - createdAt: attachedDatabase.typeMapping.read(DriftSqlType.dateTime, data['${effectivePrefix}created_at'])!, - updatedAt: attachedDatabase.typeMapping.read(DriftSqlType.dateTime, data['${effectivePrefix}updated_at'])!, + dpopNonce: attachedDatabase.typeMapping.read( + DriftSqlType.string, + data['${effectivePrefix}dpop_nonce'], + ), + expiresAt: attachedDatabase.typeMapping.read( + DriftSqlType.dateTime, + data['${effectivePrefix}expires_at'], + ), + createdAt: attachedDatabase.typeMapping.read( + DriftSqlType.dateTime, + data['${effectivePrefix}created_at'], + )!, + updatedAt: attachedDatabase.typeMapping.read( + DriftSqlType.dateTime, + data['${effectivePrefix}updated_at'], + )!, ); } @@ -286,20 +387,37 @@ class Account extends DataClass implements Insertable { return AccountsCompanion( did: Value(did), handle: Value(handle), - displayName: displayName == null && nullToAbsent ? const Value.absent() : Value(displayName), - service: service == null && nullToAbsent ? const Value.absent() : Value(service), + displayName: displayName == null && nullToAbsent + ? const Value.absent() + : Value(displayName), + service: service == null && nullToAbsent + ? const Value.absent() + : Value(service), accessToken: Value(accessToken), - refreshToken: refreshToken == null && nullToAbsent ? const Value.absent() : Value(refreshToken), - dpopPublicKey: dpopPublicKey == null && nullToAbsent ? const Value.absent() : Value(dpopPublicKey), - dpopPrivateKey: dpopPrivateKey == null && nullToAbsent ? const Value.absent() : Value(dpopPrivateKey), - dpopNonce: dpopNonce == null && nullToAbsent ? const Value.absent() : Value(dpopNonce), - expiresAt: expiresAt == null && nullToAbsent ? const Value.absent() : Value(expiresAt), + refreshToken: refreshToken == null && nullToAbsent + ? const Value.absent() + : Value(refreshToken), + dpopPublicKey: dpopPublicKey == null && nullToAbsent + ? const Value.absent() + : Value(dpopPublicKey), + dpopPrivateKey: dpopPrivateKey == null && nullToAbsent + ? const Value.absent() + : Value(dpopPrivateKey), + dpopNonce: dpopNonce == null && nullToAbsent + ? const Value.absent() + : Value(dpopNonce), + expiresAt: expiresAt == null && nullToAbsent + ? const Value.absent() + : Value(expiresAt), createdAt: Value(createdAt), updatedAt: Value(updatedAt), ); } - factory Account.fromJson(Map json, {ValueSerializer? serializer}) { + factory Account.fromJson( + Map json, { + ValueSerializer? serializer, + }) { serializer ??= driftRuntimeOptions.defaultSerializer; return Account( did: serializer.fromJson(json['did']), @@ -355,8 +473,12 @@ class Account extends DataClass implements Insertable { service: service.present ? service.value : this.service, accessToken: accessToken ?? this.accessToken, refreshToken: refreshToken.present ? refreshToken.value : this.refreshToken, - dpopPublicKey: dpopPublicKey.present ? dpopPublicKey.value : this.dpopPublicKey, - dpopPrivateKey: dpopPrivateKey.present ? dpopPrivateKey.value : this.dpopPrivateKey, + dpopPublicKey: dpopPublicKey.present + ? dpopPublicKey.value + : this.dpopPublicKey, + dpopPrivateKey: dpopPrivateKey.present + ? dpopPrivateKey.value + : this.dpopPrivateKey, dpopNonce: dpopNonce.present ? dpopNonce.value : this.dpopNonce, expiresAt: expiresAt.present ? expiresAt.value : this.expiresAt, createdAt: createdAt ?? this.createdAt, @@ -366,12 +488,22 @@ class Account extends DataClass implements Insertable { return Account( did: data.did.present ? data.did.value : this.did, handle: data.handle.present ? data.handle.value : this.handle, - displayName: data.displayName.present ? data.displayName.value : this.displayName, + displayName: data.displayName.present + ? data.displayName.value + : this.displayName, service: data.service.present ? data.service.value : this.service, - accessToken: data.accessToken.present ? data.accessToken.value : this.accessToken, - refreshToken: data.refreshToken.present ? data.refreshToken.value : this.refreshToken, - dpopPublicKey: data.dpopPublicKey.present ? data.dpopPublicKey.value : this.dpopPublicKey, - dpopPrivateKey: data.dpopPrivateKey.present ? data.dpopPrivateKey.value : this.dpopPrivateKey, + accessToken: data.accessToken.present + ? data.accessToken.value + : this.accessToken, + refreshToken: data.refreshToken.present + ? data.refreshToken.value + : this.refreshToken, + dpopPublicKey: data.dpopPublicKey.present + ? data.dpopPublicKey.value + : this.dpopPublicKey, + dpopPrivateKey: data.dpopPrivateKey.present + ? data.dpopPrivateKey.value + : this.dpopPrivateKey, dpopNonce: data.dpopNonce.present ? data.dpopNonce.value : this.dpopNonce, expiresAt: data.expiresAt.present ? data.expiresAt.value : this.expiresAt, createdAt: data.createdAt.present ? data.createdAt.value : this.createdAt, @@ -607,7 +739,8 @@ class AccountsCompanion extends UpdateCompanion { } } -class $CachedProfilesTable extends CachedProfiles with TableInfo<$CachedProfilesTable, CachedProfile> { +class $CachedProfilesTable extends CachedProfiles + with TableInfo<$CachedProfilesTable, CachedProfile> { @override final GeneratedDatabase attachedDatabase; final String? _alias; @@ -630,7 +763,9 @@ class $CachedProfilesTable extends CachedProfiles with TableInfo<$CachedProfiles type: DriftSqlType.string, requiredDuringInsert: true, ); - static const VerificationMeta _payloadMeta = const VerificationMeta('payload'); + static const VerificationMeta _payloadMeta = const VerificationMeta( + 'payload', + ); @override late final GeneratedColumn payload = GeneratedColumn( 'payload', @@ -639,7 +774,9 @@ class $CachedProfilesTable extends CachedProfiles with TableInfo<$CachedProfiles type: DriftSqlType.string, requiredDuringInsert: true, ); - static const VerificationMeta _fetchedAtMeta = const VerificationMeta('fetchedAt'); + static const VerificationMeta _fetchedAtMeta = const VerificationMeta( + 'fetchedAt', + ); @override late final GeneratedColumn fetchedAt = GeneratedColumn( 'fetched_at', @@ -657,26 +794,41 @@ class $CachedProfilesTable extends CachedProfiles with TableInfo<$CachedProfiles String get actualTableName => $name; static const String $name = 'cached_profiles'; @override - VerificationContext validateIntegrity(Insertable instance, {bool isInserting = false}) { + VerificationContext validateIntegrity( + Insertable instance, { + bool isInserting = false, + }) { final context = VerificationContext(); final data = instance.toColumns(true); if (data.containsKey('did')) { - context.handle(_didMeta, did.isAcceptableOrUnknown(data['did']!, _didMeta)); + context.handle( + _didMeta, + did.isAcceptableOrUnknown(data['did']!, _didMeta), + ); } else if (isInserting) { context.missing(_didMeta); } if (data.containsKey('handle')) { - context.handle(_handleMeta, handle.isAcceptableOrUnknown(data['handle']!, _handleMeta)); + context.handle( + _handleMeta, + handle.isAcceptableOrUnknown(data['handle']!, _handleMeta), + ); } else if (isInserting) { context.missing(_handleMeta); } if (data.containsKey('payload')) { - context.handle(_payloadMeta, payload.isAcceptableOrUnknown(data['payload']!, _payloadMeta)); + context.handle( + _payloadMeta, + payload.isAcceptableOrUnknown(data['payload']!, _payloadMeta), + ); } else if (isInserting) { context.missing(_payloadMeta); } if (data.containsKey('fetched_at')) { - context.handle(_fetchedAtMeta, fetchedAt.isAcceptableOrUnknown(data['fetched_at']!, _fetchedAtMeta)); + context.handle( + _fetchedAtMeta, + fetchedAt.isAcceptableOrUnknown(data['fetched_at']!, _fetchedAtMeta), + ); } return context; } @@ -687,10 +839,22 @@ class $CachedProfilesTable extends CachedProfiles with TableInfo<$CachedProfiles CachedProfile map(Map data, {String? tablePrefix}) { final effectivePrefix = tablePrefix != null ? '$tablePrefix.' : ''; return CachedProfile( - did: attachedDatabase.typeMapping.read(DriftSqlType.string, data['${effectivePrefix}did'])!, - handle: attachedDatabase.typeMapping.read(DriftSqlType.string, data['${effectivePrefix}handle'])!, - payload: attachedDatabase.typeMapping.read(DriftSqlType.string, data['${effectivePrefix}payload'])!, - fetchedAt: attachedDatabase.typeMapping.read(DriftSqlType.dateTime, data['${effectivePrefix}fetched_at'])!, + did: attachedDatabase.typeMapping.read( + DriftSqlType.string, + data['${effectivePrefix}did'], + )!, + handle: attachedDatabase.typeMapping.read( + DriftSqlType.string, + data['${effectivePrefix}handle'], + )!, + payload: attachedDatabase.typeMapping.read( + DriftSqlType.string, + data['${effectivePrefix}payload'], + )!, + fetchedAt: attachedDatabase.typeMapping.read( + DriftSqlType.dateTime, + data['${effectivePrefix}fetched_at'], + )!, ); } @@ -705,7 +869,12 @@ class CachedProfile extends DataClass implements Insertable { final String handle; final String payload; final DateTime fetchedAt; - const CachedProfile({required this.did, required this.handle, required this.payload, required this.fetchedAt}); + const CachedProfile({ + required this.did, + required this.handle, + required this.payload, + required this.fetchedAt, + }); @override Map toColumns(bool nullToAbsent) { final map = {}; @@ -725,7 +894,10 @@ class CachedProfile extends DataClass implements Insertable { ); } - factory CachedProfile.fromJson(Map json, {ValueSerializer? serializer}) { + factory CachedProfile.fromJson( + Map json, { + ValueSerializer? serializer, + }) { serializer ??= driftRuntimeOptions.defaultSerializer; return CachedProfile( did: serializer.fromJson(json['did']), @@ -745,7 +917,12 @@ class CachedProfile extends DataClass implements Insertable { }; } - CachedProfile copyWith({String? did, String? handle, String? payload, DateTime? fetchedAt}) => CachedProfile( + CachedProfile copyWith({ + String? did, + String? handle, + String? payload, + DateTime? fetchedAt, + }) => CachedProfile( did: did ?? this.did, handle: handle ?? this.handle, payload: payload ?? this.payload, @@ -871,7 +1048,8 @@ class CachedProfilesCompanion extends UpdateCompanion { } } -class $CachedPostsTable extends CachedPosts with TableInfo<$CachedPostsTable, CachedPost> { +class $CachedPostsTable extends CachedPosts + with TableInfo<$CachedPostsTable, CachedPost> { @override final GeneratedDatabase attachedDatabase; final String? _alias; @@ -885,7 +1063,9 @@ class $CachedPostsTable extends CachedPosts with TableInfo<$CachedPostsTable, Ca type: DriftSqlType.string, requiredDuringInsert: true, ); - static const VerificationMeta _authorDidMeta = const VerificationMeta('authorDid'); + static const VerificationMeta _authorDidMeta = const VerificationMeta( + 'authorDid', + ); @override late final GeneratedColumn authorDid = GeneratedColumn( 'author_did', @@ -894,7 +1074,9 @@ class $CachedPostsTable extends CachedPosts with TableInfo<$CachedPostsTable, Ca type: DriftSqlType.string, requiredDuringInsert: true, ); - static const VerificationMeta _payloadMeta = const VerificationMeta('payload'); + static const VerificationMeta _payloadMeta = const VerificationMeta( + 'payload', + ); @override late final GeneratedColumn payload = GeneratedColumn( 'payload', @@ -903,7 +1085,9 @@ class $CachedPostsTable extends CachedPosts with TableInfo<$CachedPostsTable, Ca type: DriftSqlType.string, requiredDuringInsert: true, ); - static const VerificationMeta _createdAtMeta = const VerificationMeta('createdAt'); + static const VerificationMeta _createdAtMeta = const VerificationMeta( + 'createdAt', + ); @override late final GeneratedColumn createdAt = GeneratedColumn( 'created_at', @@ -912,7 +1096,9 @@ class $CachedPostsTable extends CachedPosts with TableInfo<$CachedPostsTable, Ca type: DriftSqlType.dateTime, requiredDuringInsert: false, ); - static const VerificationMeta _fetchedAtMeta = const VerificationMeta('fetchedAt'); + static const VerificationMeta _fetchedAtMeta = const VerificationMeta( + 'fetchedAt', + ); @override late final GeneratedColumn fetchedAt = GeneratedColumn( 'fetched_at', @@ -923,36 +1109,60 @@ class $CachedPostsTable extends CachedPosts with TableInfo<$CachedPostsTable, Ca defaultValue: currentDateAndTime, ); @override - List get $columns => [uri, authorDid, payload, createdAt, fetchedAt]; + List get $columns => [ + uri, + authorDid, + payload, + createdAt, + fetchedAt, + ]; @override String get aliasedName => _alias ?? actualTableName; @override String get actualTableName => $name; static const String $name = 'cached_posts'; @override - VerificationContext validateIntegrity(Insertable instance, {bool isInserting = false}) { + VerificationContext validateIntegrity( + Insertable instance, { + bool isInserting = false, + }) { final context = VerificationContext(); final data = instance.toColumns(true); if (data.containsKey('uri')) { - context.handle(_uriMeta, uri.isAcceptableOrUnknown(data['uri']!, _uriMeta)); + context.handle( + _uriMeta, + uri.isAcceptableOrUnknown(data['uri']!, _uriMeta), + ); } else if (isInserting) { context.missing(_uriMeta); } if (data.containsKey('author_did')) { - context.handle(_authorDidMeta, authorDid.isAcceptableOrUnknown(data['author_did']!, _authorDidMeta)); + context.handle( + _authorDidMeta, + authorDid.isAcceptableOrUnknown(data['author_did']!, _authorDidMeta), + ); } else if (isInserting) { context.missing(_authorDidMeta); } if (data.containsKey('payload')) { - context.handle(_payloadMeta, payload.isAcceptableOrUnknown(data['payload']!, _payloadMeta)); + context.handle( + _payloadMeta, + payload.isAcceptableOrUnknown(data['payload']!, _payloadMeta), + ); } else if (isInserting) { context.missing(_payloadMeta); } if (data.containsKey('created_at')) { - context.handle(_createdAtMeta, createdAt.isAcceptableOrUnknown(data['created_at']!, _createdAtMeta)); + context.handle( + _createdAtMeta, + createdAt.isAcceptableOrUnknown(data['created_at']!, _createdAtMeta), + ); } if (data.containsKey('fetched_at')) { - context.handle(_fetchedAtMeta, fetchedAt.isAcceptableOrUnknown(data['fetched_at']!, _fetchedAtMeta)); + context.handle( + _fetchedAtMeta, + fetchedAt.isAcceptableOrUnknown(data['fetched_at']!, _fetchedAtMeta), + ); } return context; } @@ -963,11 +1173,26 @@ class $CachedPostsTable extends CachedPosts with TableInfo<$CachedPostsTable, Ca CachedPost map(Map data, {String? tablePrefix}) { final effectivePrefix = tablePrefix != null ? '$tablePrefix.' : ''; return CachedPost( - uri: attachedDatabase.typeMapping.read(DriftSqlType.string, data['${effectivePrefix}uri'])!, - authorDid: attachedDatabase.typeMapping.read(DriftSqlType.string, data['${effectivePrefix}author_did'])!, - payload: attachedDatabase.typeMapping.read(DriftSqlType.string, data['${effectivePrefix}payload'])!, - createdAt: attachedDatabase.typeMapping.read(DriftSqlType.dateTime, data['${effectivePrefix}created_at']), - fetchedAt: attachedDatabase.typeMapping.read(DriftSqlType.dateTime, data['${effectivePrefix}fetched_at'])!, + uri: attachedDatabase.typeMapping.read( + DriftSqlType.string, + data['${effectivePrefix}uri'], + )!, + authorDid: attachedDatabase.typeMapping.read( + DriftSqlType.string, + data['${effectivePrefix}author_did'], + )!, + payload: attachedDatabase.typeMapping.read( + DriftSqlType.string, + data['${effectivePrefix}payload'], + )!, + createdAt: attachedDatabase.typeMapping.read( + DriftSqlType.dateTime, + data['${effectivePrefix}created_at'], + ), + fetchedAt: attachedDatabase.typeMapping.read( + DriftSqlType.dateTime, + data['${effectivePrefix}fetched_at'], + )!, ); } @@ -1008,12 +1233,17 @@ class CachedPost extends DataClass implements Insertable { uri: Value(uri), authorDid: Value(authorDid), payload: Value(payload), - createdAt: createdAt == null && nullToAbsent ? const Value.absent() : Value(createdAt), + createdAt: createdAt == null && nullToAbsent + ? const Value.absent() + : Value(createdAt), fetchedAt: Value(fetchedAt), ); } - factory CachedPost.fromJson(Map json, {ValueSerializer? serializer}) { + factory CachedPost.fromJson( + Map json, { + ValueSerializer? serializer, + }) { serializer ??= driftRuntimeOptions.defaultSerializer; return CachedPost( uri: serializer.fromJson(json['uri']), @@ -1071,7 +1301,8 @@ class CachedPost extends DataClass implements Insertable { } @override - int get hashCode => Object.hash(uri, authorDid, payload, createdAt, fetchedAt); + int get hashCode => + Object.hash(uri, authorDid, payload, createdAt, fetchedAt); @override bool operator ==(Object other) => identical(this, other) || @@ -1182,7 +1413,8 @@ class CachedPostsCompanion extends UpdateCompanion { } } -class $SettingsTable extends Settings with TableInfo<$SettingsTable, SettingsEntry> { +class $SettingsTable extends Settings + with TableInfo<$SettingsTable, SettingsEntry> { @override final GeneratedDatabase attachedDatabase; final String? _alias; @@ -1205,7 +1437,9 @@ class $SettingsTable extends Settings with TableInfo<$SettingsTable, SettingsEnt type: DriftSqlType.string, requiredDuringInsert: true, ); - static const VerificationMeta _updatedAtMeta = const VerificationMeta('updatedAt'); + static const VerificationMeta _updatedAtMeta = const VerificationMeta( + 'updatedAt', + ); @override late final GeneratedColumn updatedAt = GeneratedColumn( 'updated_at', @@ -1223,21 +1457,33 @@ class $SettingsTable extends Settings with TableInfo<$SettingsTable, SettingsEnt String get actualTableName => $name; static const String $name = 'settings'; @override - VerificationContext validateIntegrity(Insertable instance, {bool isInserting = false}) { + VerificationContext validateIntegrity( + Insertable instance, { + bool isInserting = false, + }) { final context = VerificationContext(); final data = instance.toColumns(true); if (data.containsKey('key')) { - context.handle(_keyMeta, key.isAcceptableOrUnknown(data['key']!, _keyMeta)); + context.handle( + _keyMeta, + key.isAcceptableOrUnknown(data['key']!, _keyMeta), + ); } else if (isInserting) { context.missing(_keyMeta); } if (data.containsKey('value')) { - context.handle(_valueMeta, value.isAcceptableOrUnknown(data['value']!, _valueMeta)); + context.handle( + _valueMeta, + value.isAcceptableOrUnknown(data['value']!, _valueMeta), + ); } else if (isInserting) { context.missing(_valueMeta); } if (data.containsKey('updated_at')) { - context.handle(_updatedAtMeta, updatedAt.isAcceptableOrUnknown(data['updated_at']!, _updatedAtMeta)); + context.handle( + _updatedAtMeta, + updatedAt.isAcceptableOrUnknown(data['updated_at']!, _updatedAtMeta), + ); } return context; } @@ -1248,9 +1494,18 @@ class $SettingsTable extends Settings with TableInfo<$SettingsTable, SettingsEnt SettingsEntry map(Map data, {String? tablePrefix}) { final effectivePrefix = tablePrefix != null ? '$tablePrefix.' : ''; return SettingsEntry( - key: attachedDatabase.typeMapping.read(DriftSqlType.string, data['${effectivePrefix}key'])!, - value: attachedDatabase.typeMapping.read(DriftSqlType.string, data['${effectivePrefix}value'])!, - updatedAt: attachedDatabase.typeMapping.read(DriftSqlType.dateTime, data['${effectivePrefix}updated_at'])!, + key: attachedDatabase.typeMapping.read( + DriftSqlType.string, + data['${effectivePrefix}key'], + )!, + value: attachedDatabase.typeMapping.read( + DriftSqlType.string, + data['${effectivePrefix}value'], + )!, + updatedAt: attachedDatabase.typeMapping.read( + DriftSqlType.dateTime, + data['${effectivePrefix}updated_at'], + )!, ); } @@ -1264,7 +1519,11 @@ class SettingsEntry extends DataClass implements Insertable { final String key; final String value; final DateTime updatedAt; - const SettingsEntry({required this.key, required this.value, required this.updatedAt}); + const SettingsEntry({ + required this.key, + required this.value, + required this.updatedAt, + }); @override Map toColumns(bool nullToAbsent) { final map = {}; @@ -1275,10 +1534,17 @@ class SettingsEntry extends DataClass implements Insertable { } SettingsCompanion toCompanion(bool nullToAbsent) { - return SettingsCompanion(key: Value(key), value: Value(value), updatedAt: Value(updatedAt)); + return SettingsCompanion( + key: Value(key), + value: Value(value), + updatedAt: Value(updatedAt), + ); } - factory SettingsEntry.fromJson(Map json, {ValueSerializer? serializer}) { + factory SettingsEntry.fromJson( + Map json, { + ValueSerializer? serializer, + }) { serializer ??= driftRuntimeOptions.defaultSerializer; return SettingsEntry( key: serializer.fromJson(json['key']), @@ -1297,7 +1563,11 @@ class SettingsEntry extends DataClass implements Insertable { } SettingsEntry copyWith({String? key, String? value, DateTime? updatedAt}) => - SettingsEntry(key: key ?? this.key, value: value ?? this.value, updatedAt: updatedAt ?? this.updatedAt); + SettingsEntry( + key: key ?? this.key, + value: value ?? this.value, + updatedAt: updatedAt ?? this.updatedAt, + ); SettingsEntry copyWithCompanion(SettingsCompanion data) { return SettingsEntry( key: data.key.present ? data.key.value : this.key, @@ -1403,7 +1673,8 @@ class SettingsCompanion extends UpdateCompanion { } } -class $SavedFeedsTable extends SavedFeeds with TableInfo<$SavedFeedsTable, SavedFeedEntry> { +class $SavedFeedsTable extends SavedFeeds + with TableInfo<$SavedFeedsTable, SavedFeedEntry> { @override final GeneratedDatabase attachedDatabase; final String? _alias; @@ -1417,7 +1688,9 @@ class $SavedFeedsTable extends SavedFeeds with TableInfo<$SavedFeedsTable, Saved type: DriftSqlType.string, requiredDuringInsert: true, ); - static const VerificationMeta _accountDidMeta = const VerificationMeta('accountDid'); + static const VerificationMeta _accountDidMeta = const VerificationMeta( + 'accountDid', + ); @override late final GeneratedColumn accountDid = GeneratedColumn( 'account_did', @@ -1452,10 +1725,14 @@ class $SavedFeedsTable extends SavedFeeds with TableInfo<$SavedFeedsTable, Saved false, type: DriftSqlType.bool, requiredDuringInsert: false, - defaultConstraints: GeneratedColumn.constraintIsAlways('CHECK ("pinned" IN (0, 1))'), + defaultConstraints: GeneratedColumn.constraintIsAlways( + 'CHECK ("pinned" IN (0, 1))', + ), defaultValue: const Constant(false), ); - static const VerificationMeta _sortOrderMeta = const VerificationMeta('sortOrder'); + static const VerificationMeta _sortOrderMeta = const VerificationMeta( + 'sortOrder', + ); @override late final GeneratedColumn sortOrder = GeneratedColumn( 'sort_order', @@ -1465,7 +1742,9 @@ class $SavedFeedsTable extends SavedFeeds with TableInfo<$SavedFeedsTable, Saved requiredDuringInsert: false, defaultValue: const Constant(0), ); - static const VerificationMeta _updatedAtMeta = const VerificationMeta('updatedAt'); + static const VerificationMeta _updatedAtMeta = const VerificationMeta( + 'updatedAt', + ); @override late final GeneratedColumn updatedAt = GeneratedColumn( 'updated_at', @@ -1476,14 +1755,25 @@ class $SavedFeedsTable extends SavedFeeds with TableInfo<$SavedFeedsTable, Saved defaultValue: currentDateAndTime, ); @override - List get $columns => [id, accountDid, type, value, pinned, sortOrder, updatedAt]; + List get $columns => [ + id, + accountDid, + type, + value, + pinned, + sortOrder, + updatedAt, + ]; @override String get aliasedName => _alias ?? actualTableName; @override String get actualTableName => $name; static const String $name = 'saved_feeds'; @override - VerificationContext validateIntegrity(Insertable instance, {bool isInserting = false}) { + VerificationContext validateIntegrity( + Insertable instance, { + bool isInserting = false, + }) { final context = VerificationContext(); final data = instance.toColumns(true); if (data.containsKey('id')) { @@ -1492,28 +1782,46 @@ class $SavedFeedsTable extends SavedFeeds with TableInfo<$SavedFeedsTable, Saved context.missing(_idMeta); } if (data.containsKey('account_did')) { - context.handle(_accountDidMeta, accountDid.isAcceptableOrUnknown(data['account_did']!, _accountDidMeta)); + context.handle( + _accountDidMeta, + accountDid.isAcceptableOrUnknown(data['account_did']!, _accountDidMeta), + ); } else if (isInserting) { context.missing(_accountDidMeta); } if (data.containsKey('type')) { - context.handle(_typeMeta, type.isAcceptableOrUnknown(data['type']!, _typeMeta)); + context.handle( + _typeMeta, + type.isAcceptableOrUnknown(data['type']!, _typeMeta), + ); } else if (isInserting) { context.missing(_typeMeta); } if (data.containsKey('value')) { - context.handle(_valueMeta, value.isAcceptableOrUnknown(data['value']!, _valueMeta)); + context.handle( + _valueMeta, + value.isAcceptableOrUnknown(data['value']!, _valueMeta), + ); } else if (isInserting) { context.missing(_valueMeta); } if (data.containsKey('pinned')) { - context.handle(_pinnedMeta, pinned.isAcceptableOrUnknown(data['pinned']!, _pinnedMeta)); + context.handle( + _pinnedMeta, + pinned.isAcceptableOrUnknown(data['pinned']!, _pinnedMeta), + ); } if (data.containsKey('sort_order')) { - context.handle(_sortOrderMeta, sortOrder.isAcceptableOrUnknown(data['sort_order']!, _sortOrderMeta)); + context.handle( + _sortOrderMeta, + sortOrder.isAcceptableOrUnknown(data['sort_order']!, _sortOrderMeta), + ); } if (data.containsKey('updated_at')) { - context.handle(_updatedAtMeta, updatedAt.isAcceptableOrUnknown(data['updated_at']!, _updatedAtMeta)); + context.handle( + _updatedAtMeta, + updatedAt.isAcceptableOrUnknown(data['updated_at']!, _updatedAtMeta), + ); } return context; } @@ -1524,13 +1832,34 @@ class $SavedFeedsTable extends SavedFeeds with TableInfo<$SavedFeedsTable, Saved SavedFeedEntry map(Map data, {String? tablePrefix}) { final effectivePrefix = tablePrefix != null ? '$tablePrefix.' : ''; return SavedFeedEntry( - id: attachedDatabase.typeMapping.read(DriftSqlType.string, data['${effectivePrefix}id'])!, - accountDid: attachedDatabase.typeMapping.read(DriftSqlType.string, data['${effectivePrefix}account_did'])!, - type: attachedDatabase.typeMapping.read(DriftSqlType.string, data['${effectivePrefix}type'])!, - value: attachedDatabase.typeMapping.read(DriftSqlType.string, data['${effectivePrefix}value'])!, - pinned: attachedDatabase.typeMapping.read(DriftSqlType.bool, data['${effectivePrefix}pinned'])!, - sortOrder: attachedDatabase.typeMapping.read(DriftSqlType.int, data['${effectivePrefix}sort_order'])!, - updatedAt: attachedDatabase.typeMapping.read(DriftSqlType.dateTime, data['${effectivePrefix}updated_at'])!, + id: attachedDatabase.typeMapping.read( + DriftSqlType.string, + data['${effectivePrefix}id'], + )!, + accountDid: attachedDatabase.typeMapping.read( + DriftSqlType.string, + data['${effectivePrefix}account_did'], + )!, + type: attachedDatabase.typeMapping.read( + DriftSqlType.string, + data['${effectivePrefix}type'], + )!, + value: attachedDatabase.typeMapping.read( + DriftSqlType.string, + data['${effectivePrefix}value'], + )!, + pinned: attachedDatabase.typeMapping.read( + DriftSqlType.bool, + data['${effectivePrefix}pinned'], + )!, + sortOrder: attachedDatabase.typeMapping.read( + DriftSqlType.int, + data['${effectivePrefix}sort_order'], + )!, + updatedAt: attachedDatabase.typeMapping.read( + DriftSqlType.dateTime, + data['${effectivePrefix}updated_at'], + )!, ); } @@ -1582,7 +1911,10 @@ class SavedFeedEntry extends DataClass implements Insertable { ); } - factory SavedFeedEntry.fromJson(Map json, {ValueSerializer? serializer}) { + factory SavedFeedEntry.fromJson( + Map json, { + ValueSerializer? serializer, + }) { serializer ??= driftRuntimeOptions.defaultSerializer; return SavedFeedEntry( id: serializer.fromJson(json['id']), @@ -1628,7 +1960,9 @@ class SavedFeedEntry extends DataClass implements Insertable { SavedFeedEntry copyWithCompanion(SavedFeedsCompanion data) { return SavedFeedEntry( id: data.id.present ? data.id.value : this.id, - accountDid: data.accountDid.present ? data.accountDid.value : this.accountDid, + accountDid: data.accountDid.present + ? data.accountDid.value + : this.accountDid, type: data.type.present ? data.type.value : this.type, value: data.value.present ? data.value.value : this.value, pinned: data.pinned.present ? data.pinned.value : this.pinned, @@ -1652,7 +1986,8 @@ class SavedFeedEntry extends DataClass implements Insertable { } @override - int get hashCode => Object.hash(id, accountDid, type, value, pinned, sortOrder, updatedAt); + int get hashCode => + Object.hash(id, accountDid, type, value, pinned, sortOrder, updatedAt); @override bool operator ==(Object other) => identical(this, other) || @@ -1788,7 +2123,8 @@ class SavedFeedsCompanion extends UpdateCompanion { } } -class $SearchHistoryTable extends SearchHistory with TableInfo<$SearchHistoryTable, SearchHistoryEntry> { +class $SearchHistoryTable extends SearchHistory + with TableInfo<$SearchHistoryTable, SearchHistoryEntry> { @override final GeneratedDatabase attachedDatabase; final String? _alias; @@ -1802,7 +2138,9 @@ class $SearchHistoryTable extends SearchHistory with TableInfo<$SearchHistoryTab hasAutoIncrement: true, type: DriftSqlType.int, requiredDuringInsert: false, - defaultConstraints: GeneratedColumn.constraintIsAlways('PRIMARY KEY AUTOINCREMENT'), + defaultConstraints: GeneratedColumn.constraintIsAlways( + 'PRIMARY KEY AUTOINCREMENT', + ), ); static const VerificationMeta _queryMeta = const VerificationMeta('query'); @override @@ -1822,7 +2160,9 @@ class $SearchHistoryTable extends SearchHistory with TableInfo<$SearchHistoryTab type: DriftSqlType.string, requiredDuringInsert: true, ); - static const VerificationMeta _searchedAtMeta = const VerificationMeta('searchedAt'); + static const VerificationMeta _searchedAtMeta = const VerificationMeta( + 'searchedAt', + ); @override late final GeneratedColumn searchedAt = GeneratedColumn( 'searched_at', @@ -1832,7 +2172,9 @@ class $SearchHistoryTable extends SearchHistory with TableInfo<$SearchHistoryTab requiredDuringInsert: false, defaultValue: currentDateAndTime, ); - static const VerificationMeta _accountDidMeta = const VerificationMeta('accountDid'); + static const VerificationMeta _accountDidMeta = const VerificationMeta( + 'accountDid', + ); @override late final GeneratedColumn accountDid = GeneratedColumn( 'account_did', @@ -1842,34 +2184,55 @@ class $SearchHistoryTable extends SearchHistory with TableInfo<$SearchHistoryTab requiredDuringInsert: true, ); @override - List get $columns => [id, query, type, searchedAt, accountDid]; + List get $columns => [ + id, + query, + type, + searchedAt, + accountDid, + ]; @override String get aliasedName => _alias ?? actualTableName; @override String get actualTableName => $name; static const String $name = 'search_history'; @override - VerificationContext validateIntegrity(Insertable instance, {bool isInserting = false}) { + VerificationContext validateIntegrity( + Insertable instance, { + bool isInserting = false, + }) { final context = VerificationContext(); final data = instance.toColumns(true); if (data.containsKey('id')) { context.handle(_idMeta, id.isAcceptableOrUnknown(data['id']!, _idMeta)); } if (data.containsKey('query')) { - context.handle(_queryMeta, query.isAcceptableOrUnknown(data['query']!, _queryMeta)); + context.handle( + _queryMeta, + query.isAcceptableOrUnknown(data['query']!, _queryMeta), + ); } else if (isInserting) { context.missing(_queryMeta); } if (data.containsKey('type')) { - context.handle(_typeMeta, type.isAcceptableOrUnknown(data['type']!, _typeMeta)); + context.handle( + _typeMeta, + type.isAcceptableOrUnknown(data['type']!, _typeMeta), + ); } else if (isInserting) { context.missing(_typeMeta); } if (data.containsKey('searched_at')) { - context.handle(_searchedAtMeta, searchedAt.isAcceptableOrUnknown(data['searched_at']!, _searchedAtMeta)); + context.handle( + _searchedAtMeta, + searchedAt.isAcceptableOrUnknown(data['searched_at']!, _searchedAtMeta), + ); } if (data.containsKey('account_did')) { - context.handle(_accountDidMeta, accountDid.isAcceptableOrUnknown(data['account_did']!, _accountDidMeta)); + context.handle( + _accountDidMeta, + accountDid.isAcceptableOrUnknown(data['account_did']!, _accountDidMeta), + ); } else if (isInserting) { context.missing(_accountDidMeta); } @@ -1882,11 +2245,26 @@ class $SearchHistoryTable extends SearchHistory with TableInfo<$SearchHistoryTab SearchHistoryEntry map(Map data, {String? tablePrefix}) { final effectivePrefix = tablePrefix != null ? '$tablePrefix.' : ''; return SearchHistoryEntry( - id: attachedDatabase.typeMapping.read(DriftSqlType.int, data['${effectivePrefix}id'])!, - query: attachedDatabase.typeMapping.read(DriftSqlType.string, data['${effectivePrefix}query'])!, - type: attachedDatabase.typeMapping.read(DriftSqlType.string, data['${effectivePrefix}type'])!, - searchedAt: attachedDatabase.typeMapping.read(DriftSqlType.dateTime, data['${effectivePrefix}searched_at'])!, - accountDid: attachedDatabase.typeMapping.read(DriftSqlType.string, data['${effectivePrefix}account_did'])!, + id: attachedDatabase.typeMapping.read( + DriftSqlType.int, + data['${effectivePrefix}id'], + )!, + query: attachedDatabase.typeMapping.read( + DriftSqlType.string, + data['${effectivePrefix}query'], + )!, + type: attachedDatabase.typeMapping.read( + DriftSqlType.string, + data['${effectivePrefix}type'], + )!, + searchedAt: attachedDatabase.typeMapping.read( + DriftSqlType.dateTime, + data['${effectivePrefix}searched_at'], + )!, + accountDid: attachedDatabase.typeMapping.read( + DriftSqlType.string, + data['${effectivePrefix}account_did'], + )!, ); } @@ -1896,7 +2274,8 @@ class $SearchHistoryTable extends SearchHistory with TableInfo<$SearchHistoryTab } } -class SearchHistoryEntry extends DataClass implements Insertable { +class SearchHistoryEntry extends DataClass + implements Insertable { final int id; final String query; final String type; @@ -1930,7 +2309,10 @@ class SearchHistoryEntry extends DataClass implements Insertable json, {ValueSerializer? serializer}) { + factory SearchHistoryEntry.fromJson( + Map json, { + ValueSerializer? serializer, + }) { serializer ??= driftRuntimeOptions.defaultSerializer; return SearchHistoryEntry( id: serializer.fromJson(json['id']), @@ -1952,21 +2334,30 @@ class SearchHistoryEntry extends DataClass implements Insertable - SearchHistoryEntry( - id: id ?? this.id, - query: query ?? this.query, - type: type ?? this.type, - searchedAt: searchedAt ?? this.searchedAt, - accountDid: accountDid ?? this.accountDid, - ); + SearchHistoryEntry copyWith({ + int? id, + String? query, + String? type, + DateTime? searchedAt, + String? accountDid, + }) => SearchHistoryEntry( + id: id ?? this.id, + query: query ?? this.query, + type: type ?? this.type, + searchedAt: searchedAt ?? this.searchedAt, + accountDid: accountDid ?? this.accountDid, + ); SearchHistoryEntry copyWithCompanion(SearchHistoryCompanion data) { return SearchHistoryEntry( id: data.id.present ? data.id.value : this.id, query: data.query.present ? data.query.value : this.query, type: data.type.present ? data.type.value : this.type, - searchedAt: data.searchedAt.present ? data.searchedAt.value : this.searchedAt, - accountDid: data.accountDid.present ? data.accountDid.value : this.accountDid, + searchedAt: data.searchedAt.present + ? data.searchedAt.value + : this.searchedAt, + accountDid: data.accountDid.present + ? data.accountDid.value + : this.accountDid, ); } @@ -2097,9 +2488,13 @@ class $DraftsTable extends Drafts with TableInfo<$DraftsTable, DraftEntry> { hasAutoIncrement: true, type: DriftSqlType.int, requiredDuringInsert: false, - defaultConstraints: GeneratedColumn.constraintIsAlways('PRIMARY KEY AUTOINCREMENT'), + defaultConstraints: GeneratedColumn.constraintIsAlways( + 'PRIMARY KEY AUTOINCREMENT', + ), + ); + static const VerificationMeta _accountDidMeta = const VerificationMeta( + 'accountDid', ); - static const VerificationMeta _accountDidMeta = const VerificationMeta('accountDid'); @override late final GeneratedColumn accountDid = GeneratedColumn( 'account_did', @@ -2108,7 +2503,9 @@ class $DraftsTable extends Drafts with TableInfo<$DraftsTable, DraftEntry> { type: DriftSqlType.string, requiredDuringInsert: true, ); - static const VerificationMeta _contentMeta = const VerificationMeta('content'); + static const VerificationMeta _contentMeta = const VerificationMeta( + 'content', + ); @override late final GeneratedColumn content = GeneratedColumn( 'content', @@ -2117,7 +2514,9 @@ class $DraftsTable extends Drafts with TableInfo<$DraftsTable, DraftEntry> { type: DriftSqlType.string, requiredDuringInsert: true, ); - static const VerificationMeta _replyUriMeta = const VerificationMeta('replyUri'); + static const VerificationMeta _replyUriMeta = const VerificationMeta( + 'replyUri', + ); @override late final GeneratedColumn replyUri = GeneratedColumn( 'reply_uri', @@ -2126,7 +2525,9 @@ class $DraftsTable extends Drafts with TableInfo<$DraftsTable, DraftEntry> { type: DriftSqlType.string, requiredDuringInsert: false, ); - static const VerificationMeta _replyCidMeta = const VerificationMeta('replyCid'); + static const VerificationMeta _replyCidMeta = const VerificationMeta( + 'replyCid', + ); @override late final GeneratedColumn replyCid = GeneratedColumn( 'reply_cid', @@ -2135,7 +2536,9 @@ class $DraftsTable extends Drafts with TableInfo<$DraftsTable, DraftEntry> { type: DriftSqlType.string, requiredDuringInsert: false, ); - static const VerificationMeta _rootUriMeta = const VerificationMeta('rootUri'); + static const VerificationMeta _rootUriMeta = const VerificationMeta( + 'rootUri', + ); @override late final GeneratedColumn rootUri = GeneratedColumn( 'root_uri', @@ -2144,7 +2547,9 @@ class $DraftsTable extends Drafts with TableInfo<$DraftsTable, DraftEntry> { type: DriftSqlType.string, requiredDuringInsert: false, ); - static const VerificationMeta _rootCidMeta = const VerificationMeta('rootCid'); + static const VerificationMeta _rootCidMeta = const VerificationMeta( + 'rootCid', + ); @override late final GeneratedColumn rootCid = GeneratedColumn( 'root_cid', @@ -2153,7 +2558,9 @@ class $DraftsTable extends Drafts with TableInfo<$DraftsTable, DraftEntry> { type: DriftSqlType.string, requiredDuringInsert: false, ); - static const VerificationMeta _embedJsonMeta = const VerificationMeta('embedJson'); + static const VerificationMeta _embedJsonMeta = const VerificationMeta( + 'embedJson', + ); @override late final GeneratedColumn embedJson = GeneratedColumn( 'embed_json', @@ -2162,7 +2569,9 @@ class $DraftsTable extends Drafts with TableInfo<$DraftsTable, DraftEntry> { type: DriftSqlType.string, requiredDuringInsert: false, ); - static const VerificationMeta _mediaPathsMeta = const VerificationMeta('mediaPaths'); + static const VerificationMeta _mediaPathsMeta = const VerificationMeta( + 'mediaPaths', + ); @override late final GeneratedColumn mediaPaths = GeneratedColumn( 'media_paths', @@ -2171,7 +2580,9 @@ class $DraftsTable extends Drafts with TableInfo<$DraftsTable, DraftEntry> { type: DriftSqlType.string, requiredDuringInsert: false, ); - static const VerificationMeta _createdAtMeta = const VerificationMeta('createdAt'); + static const VerificationMeta _createdAtMeta = const VerificationMeta( + 'createdAt', + ); @override late final GeneratedColumn createdAt = GeneratedColumn( 'created_at', @@ -2181,7 +2592,9 @@ class $DraftsTable extends Drafts with TableInfo<$DraftsTable, DraftEntry> { requiredDuringInsert: false, defaultValue: currentDateAndTime, ); - static const VerificationMeta _updatedAtMeta = const VerificationMeta('updatedAt'); + static const VerificationMeta _updatedAtMeta = const VerificationMeta( + 'updatedAt', + ); @override late final GeneratedColumn updatedAt = GeneratedColumn( 'updated_at', @@ -2191,7 +2604,9 @@ class $DraftsTable extends Drafts with TableInfo<$DraftsTable, DraftEntry> { requiredDuringInsert: false, defaultValue: currentDateAndTime, ); - static const VerificationMeta _scheduledAtMeta = const VerificationMeta('scheduledAt'); + static const VerificationMeta _scheduledAtMeta = const VerificationMeta( + 'scheduledAt', + ); @override late final GeneratedColumn scheduledAt = GeneratedColumn( 'scheduled_at', @@ -2221,48 +2636,87 @@ class $DraftsTable extends Drafts with TableInfo<$DraftsTable, DraftEntry> { String get actualTableName => $name; static const String $name = 'drafts'; @override - VerificationContext validateIntegrity(Insertable instance, {bool isInserting = false}) { + VerificationContext validateIntegrity( + Insertable instance, { + bool isInserting = false, + }) { final context = VerificationContext(); final data = instance.toColumns(true); if (data.containsKey('id')) { context.handle(_idMeta, id.isAcceptableOrUnknown(data['id']!, _idMeta)); } if (data.containsKey('account_did')) { - context.handle(_accountDidMeta, accountDid.isAcceptableOrUnknown(data['account_did']!, _accountDidMeta)); + context.handle( + _accountDidMeta, + accountDid.isAcceptableOrUnknown(data['account_did']!, _accountDidMeta), + ); } else if (isInserting) { context.missing(_accountDidMeta); } if (data.containsKey('content')) { - context.handle(_contentMeta, content.isAcceptableOrUnknown(data['content']!, _contentMeta)); + context.handle( + _contentMeta, + content.isAcceptableOrUnknown(data['content']!, _contentMeta), + ); } else if (isInserting) { context.missing(_contentMeta); } if (data.containsKey('reply_uri')) { - context.handle(_replyUriMeta, replyUri.isAcceptableOrUnknown(data['reply_uri']!, _replyUriMeta)); + context.handle( + _replyUriMeta, + replyUri.isAcceptableOrUnknown(data['reply_uri']!, _replyUriMeta), + ); } if (data.containsKey('reply_cid')) { - context.handle(_replyCidMeta, replyCid.isAcceptableOrUnknown(data['reply_cid']!, _replyCidMeta)); + context.handle( + _replyCidMeta, + replyCid.isAcceptableOrUnknown(data['reply_cid']!, _replyCidMeta), + ); } if (data.containsKey('root_uri')) { - context.handle(_rootUriMeta, rootUri.isAcceptableOrUnknown(data['root_uri']!, _rootUriMeta)); + context.handle( + _rootUriMeta, + rootUri.isAcceptableOrUnknown(data['root_uri']!, _rootUriMeta), + ); } if (data.containsKey('root_cid')) { - context.handle(_rootCidMeta, rootCid.isAcceptableOrUnknown(data['root_cid']!, _rootCidMeta)); + context.handle( + _rootCidMeta, + rootCid.isAcceptableOrUnknown(data['root_cid']!, _rootCidMeta), + ); } if (data.containsKey('embed_json')) { - context.handle(_embedJsonMeta, embedJson.isAcceptableOrUnknown(data['embed_json']!, _embedJsonMeta)); + context.handle( + _embedJsonMeta, + embedJson.isAcceptableOrUnknown(data['embed_json']!, _embedJsonMeta), + ); } if (data.containsKey('media_paths')) { - context.handle(_mediaPathsMeta, mediaPaths.isAcceptableOrUnknown(data['media_paths']!, _mediaPathsMeta)); + context.handle( + _mediaPathsMeta, + mediaPaths.isAcceptableOrUnknown(data['media_paths']!, _mediaPathsMeta), + ); } if (data.containsKey('created_at')) { - context.handle(_createdAtMeta, createdAt.isAcceptableOrUnknown(data['created_at']!, _createdAtMeta)); + context.handle( + _createdAtMeta, + createdAt.isAcceptableOrUnknown(data['created_at']!, _createdAtMeta), + ); } if (data.containsKey('updated_at')) { - context.handle(_updatedAtMeta, updatedAt.isAcceptableOrUnknown(data['updated_at']!, _updatedAtMeta)); + context.handle( + _updatedAtMeta, + updatedAt.isAcceptableOrUnknown(data['updated_at']!, _updatedAtMeta), + ); } if (data.containsKey('scheduled_at')) { - context.handle(_scheduledAtMeta, scheduledAt.isAcceptableOrUnknown(data['scheduled_at']!, _scheduledAtMeta)); + context.handle( + _scheduledAtMeta, + scheduledAt.isAcceptableOrUnknown( + data['scheduled_at']!, + _scheduledAtMeta, + ), + ); } return context; } @@ -2273,18 +2727,54 @@ class $DraftsTable extends Drafts with TableInfo<$DraftsTable, DraftEntry> { DraftEntry map(Map data, {String? tablePrefix}) { final effectivePrefix = tablePrefix != null ? '$tablePrefix.' : ''; return DraftEntry( - id: attachedDatabase.typeMapping.read(DriftSqlType.int, data['${effectivePrefix}id'])!, - accountDid: attachedDatabase.typeMapping.read(DriftSqlType.string, data['${effectivePrefix}account_did'])!, - content: attachedDatabase.typeMapping.read(DriftSqlType.string, data['${effectivePrefix}content'])!, - replyUri: attachedDatabase.typeMapping.read(DriftSqlType.string, data['${effectivePrefix}reply_uri']), - replyCid: attachedDatabase.typeMapping.read(DriftSqlType.string, data['${effectivePrefix}reply_cid']), - rootUri: attachedDatabase.typeMapping.read(DriftSqlType.string, data['${effectivePrefix}root_uri']), - rootCid: attachedDatabase.typeMapping.read(DriftSqlType.string, data['${effectivePrefix}root_cid']), - embedJson: attachedDatabase.typeMapping.read(DriftSqlType.string, data['${effectivePrefix}embed_json']), - mediaPaths: attachedDatabase.typeMapping.read(DriftSqlType.string, data['${effectivePrefix}media_paths']), - createdAt: attachedDatabase.typeMapping.read(DriftSqlType.dateTime, data['${effectivePrefix}created_at'])!, - updatedAt: attachedDatabase.typeMapping.read(DriftSqlType.dateTime, data['${effectivePrefix}updated_at'])!, - scheduledAt: attachedDatabase.typeMapping.read(DriftSqlType.dateTime, data['${effectivePrefix}scheduled_at']), + id: attachedDatabase.typeMapping.read( + DriftSqlType.int, + data['${effectivePrefix}id'], + )!, + accountDid: attachedDatabase.typeMapping.read( + DriftSqlType.string, + data['${effectivePrefix}account_did'], + )!, + content: attachedDatabase.typeMapping.read( + DriftSqlType.string, + data['${effectivePrefix}content'], + )!, + replyUri: attachedDatabase.typeMapping.read( + DriftSqlType.string, + data['${effectivePrefix}reply_uri'], + ), + replyCid: attachedDatabase.typeMapping.read( + DriftSqlType.string, + data['${effectivePrefix}reply_cid'], + ), + rootUri: attachedDatabase.typeMapping.read( + DriftSqlType.string, + data['${effectivePrefix}root_uri'], + ), + rootCid: attachedDatabase.typeMapping.read( + DriftSqlType.string, + data['${effectivePrefix}root_cid'], + ), + embedJson: attachedDatabase.typeMapping.read( + DriftSqlType.string, + data['${effectivePrefix}embed_json'], + ), + mediaPaths: attachedDatabase.typeMapping.read( + DriftSqlType.string, + data['${effectivePrefix}media_paths'], + ), + createdAt: attachedDatabase.typeMapping.read( + DriftSqlType.dateTime, + data['${effectivePrefix}created_at'], + )!, + updatedAt: attachedDatabase.typeMapping.read( + DriftSqlType.dateTime, + data['${effectivePrefix}updated_at'], + )!, + scheduledAt: attachedDatabase.typeMapping.read( + DriftSqlType.dateTime, + data['${effectivePrefix}scheduled_at'], + ), ); } @@ -2358,19 +2848,36 @@ class DraftEntry extends DataClass implements Insertable { id: Value(id), accountDid: Value(accountDid), content: Value(content), - replyUri: replyUri == null && nullToAbsent ? const Value.absent() : Value(replyUri), - replyCid: replyCid == null && nullToAbsent ? const Value.absent() : Value(replyCid), - rootUri: rootUri == null && nullToAbsent ? const Value.absent() : Value(rootUri), - rootCid: rootCid == null && nullToAbsent ? const Value.absent() : Value(rootCid), - embedJson: embedJson == null && nullToAbsent ? const Value.absent() : Value(embedJson), - mediaPaths: mediaPaths == null && nullToAbsent ? const Value.absent() : Value(mediaPaths), + replyUri: replyUri == null && nullToAbsent + ? const Value.absent() + : Value(replyUri), + replyCid: replyCid == null && nullToAbsent + ? const Value.absent() + : Value(replyCid), + rootUri: rootUri == null && nullToAbsent + ? const Value.absent() + : Value(rootUri), + rootCid: rootCid == null && nullToAbsent + ? const Value.absent() + : Value(rootCid), + embedJson: embedJson == null && nullToAbsent + ? const Value.absent() + : Value(embedJson), + mediaPaths: mediaPaths == null && nullToAbsent + ? const Value.absent() + : Value(mediaPaths), createdAt: Value(createdAt), updatedAt: Value(updatedAt), - scheduledAt: scheduledAt == null && nullToAbsent ? const Value.absent() : Value(scheduledAt), + scheduledAt: scheduledAt == null && nullToAbsent + ? const Value.absent() + : Value(scheduledAt), ); } - factory DraftEntry.fromJson(Map json, {ValueSerializer? serializer}) { + factory DraftEntry.fromJson( + Map json, { + ValueSerializer? serializer, + }) { serializer ??= driftRuntimeOptions.defaultSerializer; return DraftEntry( id: serializer.fromJson(json['id']), @@ -2436,17 +2943,23 @@ class DraftEntry extends DataClass implements Insertable { DraftEntry copyWithCompanion(DraftsCompanion data) { return DraftEntry( id: data.id.present ? data.id.value : this.id, - accountDid: data.accountDid.present ? data.accountDid.value : this.accountDid, + accountDid: data.accountDid.present + ? data.accountDid.value + : this.accountDid, content: data.content.present ? data.content.value : this.content, replyUri: data.replyUri.present ? data.replyUri.value : this.replyUri, replyCid: data.replyCid.present ? data.replyCid.value : this.replyCid, rootUri: data.rootUri.present ? data.rootUri.value : this.rootUri, rootCid: data.rootCid.present ? data.rootCid.value : this.rootCid, embedJson: data.embedJson.present ? data.embedJson.value : this.embedJson, - mediaPaths: data.mediaPaths.present ? data.mediaPaths.value : this.mediaPaths, + mediaPaths: data.mediaPaths.present + ? data.mediaPaths.value + : this.mediaPaths, createdAt: data.createdAt.present ? data.createdAt.value : this.createdAt, updatedAt: data.updatedAt.present ? data.updatedAt.value : this.updatedAt, - scheduledAt: data.scheduledAt.present ? data.scheduledAt.value : this.scheduledAt, + scheduledAt: data.scheduledAt.present + ? data.scheduledAt.value + : this.scheduledAt, ); } @@ -2666,37 +3179,392 @@ class DraftsCompanion extends UpdateCompanion { } } -abstract class _$AppDatabase extends GeneratedDatabase { - _$AppDatabase(QueryExecutor e) : super(e); - $AppDatabaseManager get managers => $AppDatabaseManager(this); - late final $AccountsTable accounts = $AccountsTable(this); - late final $CachedProfilesTable cachedProfiles = $CachedProfilesTable(this); - late final $CachedPostsTable cachedPosts = $CachedPostsTable(this); - late final $SettingsTable settings = $SettingsTable(this); - late final $SavedFeedsTable savedFeeds = $SavedFeedsTable(this); - late final $SearchHistoryTable searchHistory = $SearchHistoryTable(this); - late final $DraftsTable drafts = $DraftsTable(this); +class $SavedPostsTable extends SavedPosts + with TableInfo<$SavedPostsTable, SavedPostEntry> { @override - Iterable> get allTables => allSchemaEntities.whereType>(); + final GeneratedDatabase attachedDatabase; + final String? _alias; + $SavedPostsTable(this.attachedDatabase, [this._alias]); + static const VerificationMeta _idMeta = const VerificationMeta('id'); @override - List get allSchemaEntities => [ - accounts, - cachedProfiles, - cachedPosts, - settings, - savedFeeds, - searchHistory, - drafts, - ]; -} - -typedef $$AccountsTableCreateCompanionBuilder = - AccountsCompanion Function({ - required String did, - required String handle, - Value displayName, - Value service, - required String accessToken, + late final GeneratedColumn id = GeneratedColumn( + 'id', + aliasedName, + false, + hasAutoIncrement: true, + type: DriftSqlType.int, + requiredDuringInsert: false, + defaultConstraints: GeneratedColumn.constraintIsAlways( + 'PRIMARY KEY AUTOINCREMENT', + ), + ); + static const VerificationMeta _accountDidMeta = const VerificationMeta( + 'accountDid', + ); + @override + late final GeneratedColumn accountDid = GeneratedColumn( + 'account_did', + aliasedName, + false, + type: DriftSqlType.string, + requiredDuringInsert: true, + ); + static const VerificationMeta _postUriMeta = const VerificationMeta( + 'postUri', + ); + @override + late final GeneratedColumn postUri = GeneratedColumn( + 'post_uri', + aliasedName, + false, + type: DriftSqlType.string, + requiredDuringInsert: true, + ); + static const VerificationMeta _postJsonMeta = const VerificationMeta( + 'postJson', + ); + @override + late final GeneratedColumn postJson = GeneratedColumn( + 'post_json', + aliasedName, + false, + type: DriftSqlType.string, + requiredDuringInsert: true, + ); + static const VerificationMeta _savedAtMeta = const VerificationMeta( + 'savedAt', + ); + @override + late final GeneratedColumn savedAt = GeneratedColumn( + 'saved_at', + aliasedName, + false, + type: DriftSqlType.dateTime, + requiredDuringInsert: false, + defaultValue: currentDateAndTime, + ); + @override + List get $columns => [ + id, + accountDid, + postUri, + postJson, + savedAt, + ]; + @override + String get aliasedName => _alias ?? actualTableName; + @override + String get actualTableName => $name; + static const String $name = 'saved_posts'; + @override + VerificationContext validateIntegrity( + Insertable instance, { + bool isInserting = false, + }) { + final context = VerificationContext(); + final data = instance.toColumns(true); + if (data.containsKey('id')) { + context.handle(_idMeta, id.isAcceptableOrUnknown(data['id']!, _idMeta)); + } + if (data.containsKey('account_did')) { + context.handle( + _accountDidMeta, + accountDid.isAcceptableOrUnknown(data['account_did']!, _accountDidMeta), + ); + } else if (isInserting) { + context.missing(_accountDidMeta); + } + if (data.containsKey('post_uri')) { + context.handle( + _postUriMeta, + postUri.isAcceptableOrUnknown(data['post_uri']!, _postUriMeta), + ); + } else if (isInserting) { + context.missing(_postUriMeta); + } + if (data.containsKey('post_json')) { + context.handle( + _postJsonMeta, + postJson.isAcceptableOrUnknown(data['post_json']!, _postJsonMeta), + ); + } else if (isInserting) { + context.missing(_postJsonMeta); + } + if (data.containsKey('saved_at')) { + context.handle( + _savedAtMeta, + savedAt.isAcceptableOrUnknown(data['saved_at']!, _savedAtMeta), + ); + } + return context; + } + + @override + Set get $primaryKey => {id}; + @override + SavedPostEntry map(Map data, {String? tablePrefix}) { + final effectivePrefix = tablePrefix != null ? '$tablePrefix.' : ''; + return SavedPostEntry( + id: attachedDatabase.typeMapping.read( + DriftSqlType.int, + data['${effectivePrefix}id'], + )!, + accountDid: attachedDatabase.typeMapping.read( + DriftSqlType.string, + data['${effectivePrefix}account_did'], + )!, + postUri: attachedDatabase.typeMapping.read( + DriftSqlType.string, + data['${effectivePrefix}post_uri'], + )!, + postJson: attachedDatabase.typeMapping.read( + DriftSqlType.string, + data['${effectivePrefix}post_json'], + )!, + savedAt: attachedDatabase.typeMapping.read( + DriftSqlType.dateTime, + data['${effectivePrefix}saved_at'], + )!, + ); + } + + @override + $SavedPostsTable createAlias(String alias) { + return $SavedPostsTable(attachedDatabase, alias); + } +} + +class SavedPostEntry extends DataClass implements Insertable { + final int id; + final String accountDid; + final String postUri; + final String postJson; + final DateTime savedAt; + const SavedPostEntry({ + required this.id, + required this.accountDid, + required this.postUri, + required this.postJson, + required this.savedAt, + }); + @override + Map toColumns(bool nullToAbsent) { + final map = {}; + map['id'] = Variable(id); + map['account_did'] = Variable(accountDid); + map['post_uri'] = Variable(postUri); + map['post_json'] = Variable(postJson); + map['saved_at'] = Variable(savedAt); + return map; + } + + SavedPostsCompanion toCompanion(bool nullToAbsent) { + return SavedPostsCompanion( + id: Value(id), + accountDid: Value(accountDid), + postUri: Value(postUri), + postJson: Value(postJson), + savedAt: Value(savedAt), + ); + } + + factory SavedPostEntry.fromJson( + Map json, { + ValueSerializer? serializer, + }) { + serializer ??= driftRuntimeOptions.defaultSerializer; + return SavedPostEntry( + id: serializer.fromJson(json['id']), + accountDid: serializer.fromJson(json['accountDid']), + postUri: serializer.fromJson(json['postUri']), + postJson: serializer.fromJson(json['postJson']), + savedAt: serializer.fromJson(json['savedAt']), + ); + } + @override + Map toJson({ValueSerializer? serializer}) { + serializer ??= driftRuntimeOptions.defaultSerializer; + return { + 'id': serializer.toJson(id), + 'accountDid': serializer.toJson(accountDid), + 'postUri': serializer.toJson(postUri), + 'postJson': serializer.toJson(postJson), + 'savedAt': serializer.toJson(savedAt), + }; + } + + SavedPostEntry copyWith({ + int? id, + String? accountDid, + String? postUri, + String? postJson, + DateTime? savedAt, + }) => SavedPostEntry( + id: id ?? this.id, + accountDid: accountDid ?? this.accountDid, + postUri: postUri ?? this.postUri, + postJson: postJson ?? this.postJson, + savedAt: savedAt ?? this.savedAt, + ); + SavedPostEntry copyWithCompanion(SavedPostsCompanion data) { + return SavedPostEntry( + id: data.id.present ? data.id.value : this.id, + accountDid: data.accountDid.present + ? data.accountDid.value + : this.accountDid, + postUri: data.postUri.present ? data.postUri.value : this.postUri, + postJson: data.postJson.present ? data.postJson.value : this.postJson, + savedAt: data.savedAt.present ? data.savedAt.value : this.savedAt, + ); + } + + @override + String toString() { + return (StringBuffer('SavedPostEntry(') + ..write('id: $id, ') + ..write('accountDid: $accountDid, ') + ..write('postUri: $postUri, ') + ..write('postJson: $postJson, ') + ..write('savedAt: $savedAt') + ..write(')')) + .toString(); + } + + @override + int get hashCode => Object.hash(id, accountDid, postUri, postJson, savedAt); + @override + bool operator ==(Object other) => + identical(this, other) || + (other is SavedPostEntry && + other.id == this.id && + other.accountDid == this.accountDid && + other.postUri == this.postUri && + other.postJson == this.postJson && + other.savedAt == this.savedAt); +} + +class SavedPostsCompanion extends UpdateCompanion { + final Value id; + final Value accountDid; + final Value postUri; + final Value postJson; + final Value savedAt; + const SavedPostsCompanion({ + this.id = const Value.absent(), + this.accountDid = const Value.absent(), + this.postUri = const Value.absent(), + this.postJson = const Value.absent(), + this.savedAt = const Value.absent(), + }); + SavedPostsCompanion.insert({ + this.id = const Value.absent(), + required String accountDid, + required String postUri, + required String postJson, + this.savedAt = const Value.absent(), + }) : accountDid = Value(accountDid), + postUri = Value(postUri), + postJson = Value(postJson); + static Insertable custom({ + Expression? id, + Expression? accountDid, + Expression? postUri, + Expression? postJson, + Expression? savedAt, + }) { + return RawValuesInsertable({ + if (id != null) 'id': id, + if (accountDid != null) 'account_did': accountDid, + if (postUri != null) 'post_uri': postUri, + if (postJson != null) 'post_json': postJson, + if (savedAt != null) 'saved_at': savedAt, + }); + } + + SavedPostsCompanion copyWith({ + Value? id, + Value? accountDid, + Value? postUri, + Value? postJson, + Value? savedAt, + }) { + return SavedPostsCompanion( + id: id ?? this.id, + accountDid: accountDid ?? this.accountDid, + postUri: postUri ?? this.postUri, + postJson: postJson ?? this.postJson, + savedAt: savedAt ?? this.savedAt, + ); + } + + @override + Map toColumns(bool nullToAbsent) { + final map = {}; + if (id.present) { + map['id'] = Variable(id.value); + } + if (accountDid.present) { + map['account_did'] = Variable(accountDid.value); + } + if (postUri.present) { + map['post_uri'] = Variable(postUri.value); + } + if (postJson.present) { + map['post_json'] = Variable(postJson.value); + } + if (savedAt.present) { + map['saved_at'] = Variable(savedAt.value); + } + return map; + } + + @override + String toString() { + return (StringBuffer('SavedPostsCompanion(') + ..write('id: $id, ') + ..write('accountDid: $accountDid, ') + ..write('postUri: $postUri, ') + ..write('postJson: $postJson, ') + ..write('savedAt: $savedAt') + ..write(')')) + .toString(); + } +} + +abstract class _$AppDatabase extends GeneratedDatabase { + _$AppDatabase(QueryExecutor e) : super(e); + $AppDatabaseManager get managers => $AppDatabaseManager(this); + late final $AccountsTable accounts = $AccountsTable(this); + late final $CachedProfilesTable cachedProfiles = $CachedProfilesTable(this); + late final $CachedPostsTable cachedPosts = $CachedPostsTable(this); + late final $SettingsTable settings = $SettingsTable(this); + late final $SavedFeedsTable savedFeeds = $SavedFeedsTable(this); + late final $SearchHistoryTable searchHistory = $SearchHistoryTable(this); + late final $DraftsTable drafts = $DraftsTable(this); + late final $SavedPostsTable savedPosts = $SavedPostsTable(this); + @override + Iterable> get allTables => + allSchemaEntities.whereType>(); + @override + List get allSchemaEntities => [ + accounts, + cachedProfiles, + cachedPosts, + settings, + savedFeeds, + searchHistory, + drafts, + savedPosts, + ]; +} + +typedef $$AccountsTableCreateCompanionBuilder = + AccountsCompanion Function({ + required String did, + required String handle, + Value displayName, + Value service, + required String accessToken, Value refreshToken, Value dpopPublicKey, Value dpopPrivateKey, @@ -2723,7 +3591,8 @@ typedef $$AccountsTableUpdateCompanionBuilder = Value rowid, }); -class $$AccountsTableFilterComposer extends Composer<_$AppDatabase, $AccountsTable> { +class $$AccountsTableFilterComposer + extends Composer<_$AppDatabase, $AccountsTable> { $$AccountsTableFilterComposer({ required super.$db, required super.$table, @@ -2731,43 +3600,69 @@ class $$AccountsTableFilterComposer extends Composer<_$AppDatabase, $AccountsTab super.$addJoinBuilderToRootComposer, super.$removeJoinBuilderFromRootComposer, }); - ColumnFilters get did => $composableBuilder(column: $table.did, builder: (column) => ColumnFilters(column)); + ColumnFilters get did => $composableBuilder( + column: $table.did, + builder: (column) => ColumnFilters(column), + ); - ColumnFilters get handle => - $composableBuilder(column: $table.handle, builder: (column) => ColumnFilters(column)); + ColumnFilters get handle => $composableBuilder( + column: $table.handle, + builder: (column) => ColumnFilters(column), + ); - ColumnFilters get displayName => - $composableBuilder(column: $table.displayName, builder: (column) => ColumnFilters(column)); + ColumnFilters get displayName => $composableBuilder( + column: $table.displayName, + builder: (column) => ColumnFilters(column), + ); - ColumnFilters get service => - $composableBuilder(column: $table.service, builder: (column) => ColumnFilters(column)); + ColumnFilters get service => $composableBuilder( + column: $table.service, + builder: (column) => ColumnFilters(column), + ); - ColumnFilters get accessToken => - $composableBuilder(column: $table.accessToken, builder: (column) => ColumnFilters(column)); + ColumnFilters get accessToken => $composableBuilder( + column: $table.accessToken, + builder: (column) => ColumnFilters(column), + ); - ColumnFilters get refreshToken => - $composableBuilder(column: $table.refreshToken, builder: (column) => ColumnFilters(column)); + ColumnFilters get refreshToken => $composableBuilder( + column: $table.refreshToken, + builder: (column) => ColumnFilters(column), + ); - ColumnFilters get dpopPublicKey => - $composableBuilder(column: $table.dpopPublicKey, builder: (column) => ColumnFilters(column)); + ColumnFilters get dpopPublicKey => $composableBuilder( + column: $table.dpopPublicKey, + builder: (column) => ColumnFilters(column), + ); - ColumnFilters get dpopPrivateKey => - $composableBuilder(column: $table.dpopPrivateKey, builder: (column) => ColumnFilters(column)); + ColumnFilters get dpopPrivateKey => $composableBuilder( + column: $table.dpopPrivateKey, + builder: (column) => ColumnFilters(column), + ); - ColumnFilters get dpopNonce => - $composableBuilder(column: $table.dpopNonce, builder: (column) => ColumnFilters(column)); + ColumnFilters get dpopNonce => $composableBuilder( + column: $table.dpopNonce, + builder: (column) => ColumnFilters(column), + ); - ColumnFilters get expiresAt => - $composableBuilder(column: $table.expiresAt, builder: (column) => ColumnFilters(column)); + ColumnFilters get expiresAt => $composableBuilder( + column: $table.expiresAt, + builder: (column) => ColumnFilters(column), + ); - ColumnFilters get createdAt => - $composableBuilder(column: $table.createdAt, builder: (column) => ColumnFilters(column)); + ColumnFilters get createdAt => $composableBuilder( + column: $table.createdAt, + builder: (column) => ColumnFilters(column), + ); - ColumnFilters get updatedAt => - $composableBuilder(column: $table.updatedAt, builder: (column) => ColumnFilters(column)); + ColumnFilters get updatedAt => $composableBuilder( + column: $table.updatedAt, + builder: (column) => ColumnFilters(column), + ); } -class $$AccountsTableOrderingComposer extends Composer<_$AppDatabase, $AccountsTable> { +class $$AccountsTableOrderingComposer + extends Composer<_$AppDatabase, $AccountsTable> { $$AccountsTableOrderingComposer({ required super.$db, required super.$table, @@ -2775,44 +3670,69 @@ class $$AccountsTableOrderingComposer extends Composer<_$AppDatabase, $AccountsT super.$addJoinBuilderToRootComposer, super.$removeJoinBuilderFromRootComposer, }); - ColumnOrderings get did => - $composableBuilder(column: $table.did, builder: (column) => ColumnOrderings(column)); + ColumnOrderings get did => $composableBuilder( + column: $table.did, + builder: (column) => ColumnOrderings(column), + ); - ColumnOrderings get handle => - $composableBuilder(column: $table.handle, builder: (column) => ColumnOrderings(column)); + ColumnOrderings get handle => $composableBuilder( + column: $table.handle, + builder: (column) => ColumnOrderings(column), + ); - ColumnOrderings get displayName => - $composableBuilder(column: $table.displayName, builder: (column) => ColumnOrderings(column)); + ColumnOrderings get displayName => $composableBuilder( + column: $table.displayName, + builder: (column) => ColumnOrderings(column), + ); - ColumnOrderings get service => - $composableBuilder(column: $table.service, builder: (column) => ColumnOrderings(column)); + ColumnOrderings get service => $composableBuilder( + column: $table.service, + builder: (column) => ColumnOrderings(column), + ); - ColumnOrderings get accessToken => - $composableBuilder(column: $table.accessToken, builder: (column) => ColumnOrderings(column)); + ColumnOrderings get accessToken => $composableBuilder( + column: $table.accessToken, + builder: (column) => ColumnOrderings(column), + ); - ColumnOrderings get refreshToken => - $composableBuilder(column: $table.refreshToken, builder: (column) => ColumnOrderings(column)); + ColumnOrderings get refreshToken => $composableBuilder( + column: $table.refreshToken, + builder: (column) => ColumnOrderings(column), + ); - ColumnOrderings get dpopPublicKey => - $composableBuilder(column: $table.dpopPublicKey, builder: (column) => ColumnOrderings(column)); + ColumnOrderings get dpopPublicKey => $composableBuilder( + column: $table.dpopPublicKey, + builder: (column) => ColumnOrderings(column), + ); - ColumnOrderings get dpopPrivateKey => - $composableBuilder(column: $table.dpopPrivateKey, builder: (column) => ColumnOrderings(column)); + ColumnOrderings get dpopPrivateKey => $composableBuilder( + column: $table.dpopPrivateKey, + builder: (column) => ColumnOrderings(column), + ); - ColumnOrderings get dpopNonce => - $composableBuilder(column: $table.dpopNonce, builder: (column) => ColumnOrderings(column)); + ColumnOrderings get dpopNonce => $composableBuilder( + column: $table.dpopNonce, + builder: (column) => ColumnOrderings(column), + ); - ColumnOrderings get expiresAt => - $composableBuilder(column: $table.expiresAt, builder: (column) => ColumnOrderings(column)); + ColumnOrderings get expiresAt => $composableBuilder( + column: $table.expiresAt, + builder: (column) => ColumnOrderings(column), + ); - ColumnOrderings get createdAt => - $composableBuilder(column: $table.createdAt, builder: (column) => ColumnOrderings(column)); + ColumnOrderings get createdAt => $composableBuilder( + column: $table.createdAt, + builder: (column) => ColumnOrderings(column), + ); - ColumnOrderings get updatedAt => - $composableBuilder(column: $table.updatedAt, builder: (column) => ColumnOrderings(column)); + ColumnOrderings get updatedAt => $composableBuilder( + column: $table.updatedAt, + builder: (column) => ColumnOrderings(column), + ); } -class $$AccountsTableAnnotationComposer extends Composer<_$AppDatabase, $AccountsTable> { +class $$AccountsTableAnnotationComposer + extends Composer<_$AppDatabase, $AccountsTable> { $$AccountsTableAnnotationComposer({ required super.$db, required super.$table, @@ -2820,34 +3740,51 @@ class $$AccountsTableAnnotationComposer extends Composer<_$AppDatabase, $Account super.$addJoinBuilderToRootComposer, super.$removeJoinBuilderFromRootComposer, }); - GeneratedColumn get did => $composableBuilder(column: $table.did, builder: (column) => column); + GeneratedColumn get did => + $composableBuilder(column: $table.did, builder: (column) => column); - GeneratedColumn get handle => $composableBuilder(column: $table.handle, builder: (column) => column); + GeneratedColumn get handle => + $composableBuilder(column: $table.handle, builder: (column) => column); - GeneratedColumn get displayName => - $composableBuilder(column: $table.displayName, builder: (column) => column); + GeneratedColumn get displayName => $composableBuilder( + column: $table.displayName, + builder: (column) => column, + ); - GeneratedColumn get service => $composableBuilder(column: $table.service, builder: (column) => column); + GeneratedColumn get service => + $composableBuilder(column: $table.service, builder: (column) => column); - GeneratedColumn get accessToken => - $composableBuilder(column: $table.accessToken, builder: (column) => column); + GeneratedColumn get accessToken => $composableBuilder( + column: $table.accessToken, + builder: (column) => column, + ); - GeneratedColumn get refreshToken => - $composableBuilder(column: $table.refreshToken, builder: (column) => column); + GeneratedColumn get refreshToken => $composableBuilder( + column: $table.refreshToken, + builder: (column) => column, + ); - GeneratedColumn get dpopPublicKey => - $composableBuilder(column: $table.dpopPublicKey, builder: (column) => column); + GeneratedColumn get dpopPublicKey => $composableBuilder( + column: $table.dpopPublicKey, + builder: (column) => column, + ); - GeneratedColumn get dpopPrivateKey => - $composableBuilder(column: $table.dpopPrivateKey, builder: (column) => column); + GeneratedColumn get dpopPrivateKey => $composableBuilder( + column: $table.dpopPrivateKey, + builder: (column) => column, + ); - GeneratedColumn get dpopNonce => $composableBuilder(column: $table.dpopNonce, builder: (column) => column); + GeneratedColumn get dpopNonce => + $composableBuilder(column: $table.dpopNonce, builder: (column) => column); - GeneratedColumn get expiresAt => $composableBuilder(column: $table.expiresAt, builder: (column) => column); + GeneratedColumn get expiresAt => + $composableBuilder(column: $table.expiresAt, builder: (column) => column); - GeneratedColumn get createdAt => $composableBuilder(column: $table.createdAt, builder: (column) => column); + GeneratedColumn get createdAt => + $composableBuilder(column: $table.createdAt, builder: (column) => column); - GeneratedColumn get updatedAt => $composableBuilder(column: $table.updatedAt, builder: (column) => column); + GeneratedColumn get updatedAt => + $composableBuilder(column: $table.updatedAt, builder: (column) => column); } class $$AccountsTableTableManager @@ -2870,9 +3807,12 @@ class $$AccountsTableTableManager TableManagerState( db: db, table: table, - createFilteringComposer: () => $$AccountsTableFilterComposer($db: db, $table: table), - createOrderingComposer: () => $$AccountsTableOrderingComposer($db: db, $table: table), - createComputedFieldComposer: () => $$AccountsTableAnnotationComposer($db: db, $table: table), + createFilteringComposer: () => + $$AccountsTableFilterComposer($db: db, $table: table), + createOrderingComposer: () => + $$AccountsTableOrderingComposer($db: db, $table: table), + createComputedFieldComposer: () => + $$AccountsTableAnnotationComposer($db: db, $table: table), updateCompanionCallback: ({ Value did = const Value.absent(), @@ -2933,7 +3873,9 @@ class $$AccountsTableTableManager updatedAt: updatedAt, rowid: rowid, ), - withReferenceMapper: (p0) => p0.map((e) => (e.readTable(table), BaseReferences(db, table, e))).toList(), + withReferenceMapper: (p0) => p0 + .map((e) => (e.readTable(table), BaseReferences(db, table, e))) + .toList(), prefetchHooksCallback: null, ), ); @@ -2970,7 +3912,8 @@ typedef $$CachedProfilesTableUpdateCompanionBuilder = Value rowid, }); -class $$CachedProfilesTableFilterComposer extends Composer<_$AppDatabase, $CachedProfilesTable> { +class $$CachedProfilesTableFilterComposer + extends Composer<_$AppDatabase, $CachedProfilesTable> { $$CachedProfilesTableFilterComposer({ required super.$db, required super.$table, @@ -2978,19 +3921,29 @@ class $$CachedProfilesTableFilterComposer extends Composer<_$AppDatabase, $Cache super.$addJoinBuilderToRootComposer, super.$removeJoinBuilderFromRootComposer, }); - ColumnFilters get did => $composableBuilder(column: $table.did, builder: (column) => ColumnFilters(column)); + ColumnFilters get did => $composableBuilder( + column: $table.did, + builder: (column) => ColumnFilters(column), + ); - ColumnFilters get handle => - $composableBuilder(column: $table.handle, builder: (column) => ColumnFilters(column)); + ColumnFilters get handle => $composableBuilder( + column: $table.handle, + builder: (column) => ColumnFilters(column), + ); - ColumnFilters get payload => - $composableBuilder(column: $table.payload, builder: (column) => ColumnFilters(column)); + ColumnFilters get payload => $composableBuilder( + column: $table.payload, + builder: (column) => ColumnFilters(column), + ); - ColumnFilters get fetchedAt => - $composableBuilder(column: $table.fetchedAt, builder: (column) => ColumnFilters(column)); + ColumnFilters get fetchedAt => $composableBuilder( + column: $table.fetchedAt, + builder: (column) => ColumnFilters(column), + ); } -class $$CachedProfilesTableOrderingComposer extends Composer<_$AppDatabase, $CachedProfilesTable> { +class $$CachedProfilesTableOrderingComposer + extends Composer<_$AppDatabase, $CachedProfilesTable> { $$CachedProfilesTableOrderingComposer({ required super.$db, required super.$table, @@ -2998,20 +3951,29 @@ class $$CachedProfilesTableOrderingComposer extends Composer<_$AppDatabase, $Cac super.$addJoinBuilderToRootComposer, super.$removeJoinBuilderFromRootComposer, }); - ColumnOrderings get did => - $composableBuilder(column: $table.did, builder: (column) => ColumnOrderings(column)); + ColumnOrderings get did => $composableBuilder( + column: $table.did, + builder: (column) => ColumnOrderings(column), + ); - ColumnOrderings get handle => - $composableBuilder(column: $table.handle, builder: (column) => ColumnOrderings(column)); + ColumnOrderings get handle => $composableBuilder( + column: $table.handle, + builder: (column) => ColumnOrderings(column), + ); - ColumnOrderings get payload => - $composableBuilder(column: $table.payload, builder: (column) => ColumnOrderings(column)); + ColumnOrderings get payload => $composableBuilder( + column: $table.payload, + builder: (column) => ColumnOrderings(column), + ); - ColumnOrderings get fetchedAt => - $composableBuilder(column: $table.fetchedAt, builder: (column) => ColumnOrderings(column)); + ColumnOrderings get fetchedAt => $composableBuilder( + column: $table.fetchedAt, + builder: (column) => ColumnOrderings(column), + ); } -class $$CachedProfilesTableAnnotationComposer extends Composer<_$AppDatabase, $CachedProfilesTable> { +class $$CachedProfilesTableAnnotationComposer + extends Composer<_$AppDatabase, $CachedProfilesTable> { $$CachedProfilesTableAnnotationComposer({ required super.$db, required super.$table, @@ -3019,13 +3981,17 @@ class $$CachedProfilesTableAnnotationComposer extends Composer<_$AppDatabase, $C super.$addJoinBuilderToRootComposer, super.$removeJoinBuilderFromRootComposer, }); - GeneratedColumn get did => $composableBuilder(column: $table.did, builder: (column) => column); + GeneratedColumn get did => + $composableBuilder(column: $table.did, builder: (column) => column); - GeneratedColumn get handle => $composableBuilder(column: $table.handle, builder: (column) => column); + GeneratedColumn get handle => + $composableBuilder(column: $table.handle, builder: (column) => column); - GeneratedColumn get payload => $composableBuilder(column: $table.payload, builder: (column) => column); + GeneratedColumn get payload => + $composableBuilder(column: $table.payload, builder: (column) => column); - GeneratedColumn get fetchedAt => $composableBuilder(column: $table.fetchedAt, builder: (column) => column); + GeneratedColumn get fetchedAt => + $composableBuilder(column: $table.fetchedAt, builder: (column) => column); } class $$CachedProfilesTableTableManager @@ -3039,18 +4005,26 @@ class $$CachedProfilesTableTableManager $$CachedProfilesTableAnnotationComposer, $$CachedProfilesTableCreateCompanionBuilder, $$CachedProfilesTableUpdateCompanionBuilder, - (CachedProfile, BaseReferences<_$AppDatabase, $CachedProfilesTable, CachedProfile>), + ( + CachedProfile, + BaseReferences<_$AppDatabase, $CachedProfilesTable, CachedProfile>, + ), CachedProfile, PrefetchHooks Function() > { - $$CachedProfilesTableTableManager(_$AppDatabase db, $CachedProfilesTable table) - : super( + $$CachedProfilesTableTableManager( + _$AppDatabase db, + $CachedProfilesTable table, + ) : super( TableManagerState( db: db, table: table, - createFilteringComposer: () => $$CachedProfilesTableFilterComposer($db: db, $table: table), - createOrderingComposer: () => $$CachedProfilesTableOrderingComposer($db: db, $table: table), - createComputedFieldComposer: () => $$CachedProfilesTableAnnotationComposer($db: db, $table: table), + createFilteringComposer: () => + $$CachedProfilesTableFilterComposer($db: db, $table: table), + createOrderingComposer: () => + $$CachedProfilesTableOrderingComposer($db: db, $table: table), + createComputedFieldComposer: () => + $$CachedProfilesTableAnnotationComposer($db: db, $table: table), updateCompanionCallback: ({ Value did = const Value.absent(), @@ -3079,7 +4053,9 @@ class $$CachedProfilesTableTableManager fetchedAt: fetchedAt, rowid: rowid, ), - withReferenceMapper: (p0) => p0.map((e) => (e.readTable(table), BaseReferences(db, table, e))).toList(), + withReferenceMapper: (p0) => p0 + .map((e) => (e.readTable(table), BaseReferences(db, table, e))) + .toList(), prefetchHooksCallback: null, ), ); @@ -3095,7 +4071,10 @@ typedef $$CachedProfilesTableProcessedTableManager = $$CachedProfilesTableAnnotationComposer, $$CachedProfilesTableCreateCompanionBuilder, $$CachedProfilesTableUpdateCompanionBuilder, - (CachedProfile, BaseReferences<_$AppDatabase, $CachedProfilesTable, CachedProfile>), + ( + CachedProfile, + BaseReferences<_$AppDatabase, $CachedProfilesTable, CachedProfile>, + ), CachedProfile, PrefetchHooks Function() >; @@ -3118,7 +4097,8 @@ typedef $$CachedPostsTableUpdateCompanionBuilder = Value rowid, }); -class $$CachedPostsTableFilterComposer extends Composer<_$AppDatabase, $CachedPostsTable> { +class $$CachedPostsTableFilterComposer + extends Composer<_$AppDatabase, $CachedPostsTable> { $$CachedPostsTableFilterComposer({ required super.$db, required super.$table, @@ -3126,22 +4106,34 @@ class $$CachedPostsTableFilterComposer extends Composer<_$AppDatabase, $CachedPo super.$addJoinBuilderToRootComposer, super.$removeJoinBuilderFromRootComposer, }); - ColumnFilters get uri => $composableBuilder(column: $table.uri, builder: (column) => ColumnFilters(column)); + ColumnFilters get uri => $composableBuilder( + column: $table.uri, + builder: (column) => ColumnFilters(column), + ); - ColumnFilters get authorDid => - $composableBuilder(column: $table.authorDid, builder: (column) => ColumnFilters(column)); + ColumnFilters get authorDid => $composableBuilder( + column: $table.authorDid, + builder: (column) => ColumnFilters(column), + ); - ColumnFilters get payload => - $composableBuilder(column: $table.payload, builder: (column) => ColumnFilters(column)); + ColumnFilters get payload => $composableBuilder( + column: $table.payload, + builder: (column) => ColumnFilters(column), + ); - ColumnFilters get createdAt => - $composableBuilder(column: $table.createdAt, builder: (column) => ColumnFilters(column)); + ColumnFilters get createdAt => $composableBuilder( + column: $table.createdAt, + builder: (column) => ColumnFilters(column), + ); - ColumnFilters get fetchedAt => - $composableBuilder(column: $table.fetchedAt, builder: (column) => ColumnFilters(column)); + ColumnFilters get fetchedAt => $composableBuilder( + column: $table.fetchedAt, + builder: (column) => ColumnFilters(column), + ); } -class $$CachedPostsTableOrderingComposer extends Composer<_$AppDatabase, $CachedPostsTable> { +class $$CachedPostsTableOrderingComposer + extends Composer<_$AppDatabase, $CachedPostsTable> { $$CachedPostsTableOrderingComposer({ required super.$db, required super.$table, @@ -3149,23 +4141,34 @@ class $$CachedPostsTableOrderingComposer extends Composer<_$AppDatabase, $Cached super.$addJoinBuilderToRootComposer, super.$removeJoinBuilderFromRootComposer, }); - ColumnOrderings get uri => - $composableBuilder(column: $table.uri, builder: (column) => ColumnOrderings(column)); + ColumnOrderings get uri => $composableBuilder( + column: $table.uri, + builder: (column) => ColumnOrderings(column), + ); - ColumnOrderings get authorDid => - $composableBuilder(column: $table.authorDid, builder: (column) => ColumnOrderings(column)); + ColumnOrderings get authorDid => $composableBuilder( + column: $table.authorDid, + builder: (column) => ColumnOrderings(column), + ); - ColumnOrderings get payload => - $composableBuilder(column: $table.payload, builder: (column) => ColumnOrderings(column)); + ColumnOrderings get payload => $composableBuilder( + column: $table.payload, + builder: (column) => ColumnOrderings(column), + ); - ColumnOrderings get createdAt => - $composableBuilder(column: $table.createdAt, builder: (column) => ColumnOrderings(column)); + ColumnOrderings get createdAt => $composableBuilder( + column: $table.createdAt, + builder: (column) => ColumnOrderings(column), + ); - ColumnOrderings get fetchedAt => - $composableBuilder(column: $table.fetchedAt, builder: (column) => ColumnOrderings(column)); + ColumnOrderings get fetchedAt => $composableBuilder( + column: $table.fetchedAt, + builder: (column) => ColumnOrderings(column), + ); } -class $$CachedPostsTableAnnotationComposer extends Composer<_$AppDatabase, $CachedPostsTable> { +class $$CachedPostsTableAnnotationComposer + extends Composer<_$AppDatabase, $CachedPostsTable> { $$CachedPostsTableAnnotationComposer({ required super.$db, required super.$table, @@ -3173,15 +4176,20 @@ class $$CachedPostsTableAnnotationComposer extends Composer<_$AppDatabase, $Cach super.$addJoinBuilderToRootComposer, super.$removeJoinBuilderFromRootComposer, }); - GeneratedColumn get uri => $composableBuilder(column: $table.uri, builder: (column) => column); + GeneratedColumn get uri => + $composableBuilder(column: $table.uri, builder: (column) => column); - GeneratedColumn get authorDid => $composableBuilder(column: $table.authorDid, builder: (column) => column); + GeneratedColumn get authorDid => + $composableBuilder(column: $table.authorDid, builder: (column) => column); - GeneratedColumn get payload => $composableBuilder(column: $table.payload, builder: (column) => column); + GeneratedColumn get payload => + $composableBuilder(column: $table.payload, builder: (column) => column); - GeneratedColumn get createdAt => $composableBuilder(column: $table.createdAt, builder: (column) => column); + GeneratedColumn get createdAt => + $composableBuilder(column: $table.createdAt, builder: (column) => column); - GeneratedColumn get fetchedAt => $composableBuilder(column: $table.fetchedAt, builder: (column) => column); + GeneratedColumn get fetchedAt => + $composableBuilder(column: $table.fetchedAt, builder: (column) => column); } class $$CachedPostsTableTableManager @@ -3195,7 +4203,10 @@ class $$CachedPostsTableTableManager $$CachedPostsTableAnnotationComposer, $$CachedPostsTableCreateCompanionBuilder, $$CachedPostsTableUpdateCompanionBuilder, - (CachedPost, BaseReferences<_$AppDatabase, $CachedPostsTable, CachedPost>), + ( + CachedPost, + BaseReferences<_$AppDatabase, $CachedPostsTable, CachedPost>, + ), CachedPost, PrefetchHooks Function() > { @@ -3204,9 +4215,12 @@ class $$CachedPostsTableTableManager TableManagerState( db: db, table: table, - createFilteringComposer: () => $$CachedPostsTableFilterComposer($db: db, $table: table), - createOrderingComposer: () => $$CachedPostsTableOrderingComposer($db: db, $table: table), - createComputedFieldComposer: () => $$CachedPostsTableAnnotationComposer($db: db, $table: table), + createFilteringComposer: () => + $$CachedPostsTableFilterComposer($db: db, $table: table), + createOrderingComposer: () => + $$CachedPostsTableOrderingComposer($db: db, $table: table), + createComputedFieldComposer: () => + $$CachedPostsTableAnnotationComposer($db: db, $table: table), updateCompanionCallback: ({ Value uri = const Value.absent(), @@ -3239,7 +4253,9 @@ class $$CachedPostsTableTableManager fetchedAt: fetchedAt, rowid: rowid, ), - withReferenceMapper: (p0) => p0.map((e) => (e.readTable(table), BaseReferences(db, table, e))).toList(), + withReferenceMapper: (p0) => p0 + .map((e) => (e.readTable(table), BaseReferences(db, table, e))) + .toList(), prefetchHooksCallback: null, ), ); @@ -3255,7 +4271,10 @@ typedef $$CachedPostsTableProcessedTableManager = $$CachedPostsTableAnnotationComposer, $$CachedPostsTableCreateCompanionBuilder, $$CachedPostsTableUpdateCompanionBuilder, - (CachedPost, BaseReferences<_$AppDatabase, $CachedPostsTable, CachedPost>), + ( + CachedPost, + BaseReferences<_$AppDatabase, $CachedPostsTable, CachedPost>, + ), CachedPost, PrefetchHooks Function() >; @@ -3267,9 +4286,15 @@ typedef $$SettingsTableCreateCompanionBuilder = Value rowid, }); typedef $$SettingsTableUpdateCompanionBuilder = - SettingsCompanion Function({Value key, Value value, Value updatedAt, Value rowid}); + SettingsCompanion Function({ + Value key, + Value value, + Value updatedAt, + Value rowid, + }); -class $$SettingsTableFilterComposer extends Composer<_$AppDatabase, $SettingsTable> { +class $$SettingsTableFilterComposer + extends Composer<_$AppDatabase, $SettingsTable> { $$SettingsTableFilterComposer({ required super.$db, required super.$table, @@ -3277,16 +4302,24 @@ class $$SettingsTableFilterComposer extends Composer<_$AppDatabase, $SettingsTab super.$addJoinBuilderToRootComposer, super.$removeJoinBuilderFromRootComposer, }); - ColumnFilters get key => $composableBuilder(column: $table.key, builder: (column) => ColumnFilters(column)); + ColumnFilters get key => $composableBuilder( + column: $table.key, + builder: (column) => ColumnFilters(column), + ); - ColumnFilters get value => - $composableBuilder(column: $table.value, builder: (column) => ColumnFilters(column)); + ColumnFilters get value => $composableBuilder( + column: $table.value, + builder: (column) => ColumnFilters(column), + ); - ColumnFilters get updatedAt => - $composableBuilder(column: $table.updatedAt, builder: (column) => ColumnFilters(column)); + ColumnFilters get updatedAt => $composableBuilder( + column: $table.updatedAt, + builder: (column) => ColumnFilters(column), + ); } -class $$SettingsTableOrderingComposer extends Composer<_$AppDatabase, $SettingsTable> { +class $$SettingsTableOrderingComposer + extends Composer<_$AppDatabase, $SettingsTable> { $$SettingsTableOrderingComposer({ required super.$db, required super.$table, @@ -3294,17 +4327,24 @@ class $$SettingsTableOrderingComposer extends Composer<_$AppDatabase, $SettingsT super.$addJoinBuilderToRootComposer, super.$removeJoinBuilderFromRootComposer, }); - ColumnOrderings get key => - $composableBuilder(column: $table.key, builder: (column) => ColumnOrderings(column)); + ColumnOrderings get key => $composableBuilder( + column: $table.key, + builder: (column) => ColumnOrderings(column), + ); - ColumnOrderings get value => - $composableBuilder(column: $table.value, builder: (column) => ColumnOrderings(column)); + ColumnOrderings get value => $composableBuilder( + column: $table.value, + builder: (column) => ColumnOrderings(column), + ); - ColumnOrderings get updatedAt => - $composableBuilder(column: $table.updatedAt, builder: (column) => ColumnOrderings(column)); + ColumnOrderings get updatedAt => $composableBuilder( + column: $table.updatedAt, + builder: (column) => ColumnOrderings(column), + ); } -class $$SettingsTableAnnotationComposer extends Composer<_$AppDatabase, $SettingsTable> { +class $$SettingsTableAnnotationComposer + extends Composer<_$AppDatabase, $SettingsTable> { $$SettingsTableAnnotationComposer({ required super.$db, required super.$table, @@ -3312,11 +4352,14 @@ class $$SettingsTableAnnotationComposer extends Composer<_$AppDatabase, $Setting super.$addJoinBuilderToRootComposer, super.$removeJoinBuilderFromRootComposer, }); - GeneratedColumn get key => $composableBuilder(column: $table.key, builder: (column) => column); + GeneratedColumn get key => + $composableBuilder(column: $table.key, builder: (column) => column); - GeneratedColumn get value => $composableBuilder(column: $table.value, builder: (column) => column); + GeneratedColumn get value => + $composableBuilder(column: $table.value, builder: (column) => column); - GeneratedColumn get updatedAt => $composableBuilder(column: $table.updatedAt, builder: (column) => column); + GeneratedColumn get updatedAt => + $composableBuilder(column: $table.updatedAt, builder: (column) => column); } class $$SettingsTableTableManager @@ -3330,7 +4373,10 @@ class $$SettingsTableTableManager $$SettingsTableAnnotationComposer, $$SettingsTableCreateCompanionBuilder, $$SettingsTableUpdateCompanionBuilder, - (SettingsEntry, BaseReferences<_$AppDatabase, $SettingsTable, SettingsEntry>), + ( + SettingsEntry, + BaseReferences<_$AppDatabase, $SettingsTable, SettingsEntry>, + ), SettingsEntry, PrefetchHooks Function() > { @@ -3339,24 +4385,39 @@ class $$SettingsTableTableManager TableManagerState( db: db, table: table, - createFilteringComposer: () => $$SettingsTableFilterComposer($db: db, $table: table), - createOrderingComposer: () => $$SettingsTableOrderingComposer($db: db, $table: table), - createComputedFieldComposer: () => $$SettingsTableAnnotationComposer($db: db, $table: table), + createFilteringComposer: () => + $$SettingsTableFilterComposer($db: db, $table: table), + createOrderingComposer: () => + $$SettingsTableOrderingComposer($db: db, $table: table), + createComputedFieldComposer: () => + $$SettingsTableAnnotationComposer($db: db, $table: table), updateCompanionCallback: ({ Value key = const Value.absent(), Value value = const Value.absent(), Value updatedAt = const Value.absent(), Value rowid = const Value.absent(), - }) => SettingsCompanion(key: key, value: value, updatedAt: updatedAt, rowid: rowid), + }) => SettingsCompanion( + key: key, + value: value, + updatedAt: updatedAt, + rowid: rowid, + ), createCompanionCallback: ({ required String key, required String value, Value updatedAt = const Value.absent(), Value rowid = const Value.absent(), - }) => SettingsCompanion.insert(key: key, value: value, updatedAt: updatedAt, rowid: rowid), - withReferenceMapper: (p0) => p0.map((e) => (e.readTable(table), BaseReferences(db, table, e))).toList(), + }) => SettingsCompanion.insert( + key: key, + value: value, + updatedAt: updatedAt, + rowid: rowid, + ), + withReferenceMapper: (p0) => p0 + .map((e) => (e.readTable(table), BaseReferences(db, table, e))) + .toList(), prefetchHooksCallback: null, ), ); @@ -3372,7 +4433,10 @@ typedef $$SettingsTableProcessedTableManager = $$SettingsTableAnnotationComposer, $$SettingsTableCreateCompanionBuilder, $$SettingsTableUpdateCompanionBuilder, - (SettingsEntry, BaseReferences<_$AppDatabase, $SettingsTable, SettingsEntry>), + ( + SettingsEntry, + BaseReferences<_$AppDatabase, $SettingsTable, SettingsEntry>, + ), SettingsEntry, PrefetchHooks Function() >; @@ -3399,7 +4463,8 @@ typedef $$SavedFeedsTableUpdateCompanionBuilder = Value rowid, }); -class $$SavedFeedsTableFilterComposer extends Composer<_$AppDatabase, $SavedFeedsTable> { +class $$SavedFeedsTableFilterComposer + extends Composer<_$AppDatabase, $SavedFeedsTable> { $$SavedFeedsTableFilterComposer({ required super.$db, required super.$table, @@ -3407,27 +4472,44 @@ class $$SavedFeedsTableFilterComposer extends Composer<_$AppDatabase, $SavedFeed super.$addJoinBuilderToRootComposer, super.$removeJoinBuilderFromRootComposer, }); - ColumnFilters get id => $composableBuilder(column: $table.id, builder: (column) => ColumnFilters(column)); + ColumnFilters get id => $composableBuilder( + column: $table.id, + builder: (column) => ColumnFilters(column), + ); - ColumnFilters get accountDid => - $composableBuilder(column: $table.accountDid, builder: (column) => ColumnFilters(column)); + ColumnFilters get accountDid => $composableBuilder( + column: $table.accountDid, + builder: (column) => ColumnFilters(column), + ); - ColumnFilters get type => $composableBuilder(column: $table.type, builder: (column) => ColumnFilters(column)); + ColumnFilters get type => $composableBuilder( + column: $table.type, + builder: (column) => ColumnFilters(column), + ); - ColumnFilters get value => - $composableBuilder(column: $table.value, builder: (column) => ColumnFilters(column)); + ColumnFilters get value => $composableBuilder( + column: $table.value, + builder: (column) => ColumnFilters(column), + ); - ColumnFilters get pinned => - $composableBuilder(column: $table.pinned, builder: (column) => ColumnFilters(column)); + ColumnFilters get pinned => $composableBuilder( + column: $table.pinned, + builder: (column) => ColumnFilters(column), + ); - ColumnFilters get sortOrder => - $composableBuilder(column: $table.sortOrder, builder: (column) => ColumnFilters(column)); + ColumnFilters get sortOrder => $composableBuilder( + column: $table.sortOrder, + builder: (column) => ColumnFilters(column), + ); - ColumnFilters get updatedAt => - $composableBuilder(column: $table.updatedAt, builder: (column) => ColumnFilters(column)); + ColumnFilters get updatedAt => $composableBuilder( + column: $table.updatedAt, + builder: (column) => ColumnFilters(column), + ); } -class $$SavedFeedsTableOrderingComposer extends Composer<_$AppDatabase, $SavedFeedsTable> { +class $$SavedFeedsTableOrderingComposer + extends Composer<_$AppDatabase, $SavedFeedsTable> { $$SavedFeedsTableOrderingComposer({ required super.$db, required super.$table, @@ -3435,28 +4517,44 @@ class $$SavedFeedsTableOrderingComposer extends Composer<_$AppDatabase, $SavedFe super.$addJoinBuilderToRootComposer, super.$removeJoinBuilderFromRootComposer, }); - ColumnOrderings get id => $composableBuilder(column: $table.id, builder: (column) => ColumnOrderings(column)); + ColumnOrderings get id => $composableBuilder( + column: $table.id, + builder: (column) => ColumnOrderings(column), + ); - ColumnOrderings get accountDid => - $composableBuilder(column: $table.accountDid, builder: (column) => ColumnOrderings(column)); + ColumnOrderings get accountDid => $composableBuilder( + column: $table.accountDid, + builder: (column) => ColumnOrderings(column), + ); - ColumnOrderings get type => - $composableBuilder(column: $table.type, builder: (column) => ColumnOrderings(column)); + ColumnOrderings get type => $composableBuilder( + column: $table.type, + builder: (column) => ColumnOrderings(column), + ); - ColumnOrderings get value => - $composableBuilder(column: $table.value, builder: (column) => ColumnOrderings(column)); + ColumnOrderings get value => $composableBuilder( + column: $table.value, + builder: (column) => ColumnOrderings(column), + ); - ColumnOrderings get pinned => - $composableBuilder(column: $table.pinned, builder: (column) => ColumnOrderings(column)); + ColumnOrderings get pinned => $composableBuilder( + column: $table.pinned, + builder: (column) => ColumnOrderings(column), + ); - ColumnOrderings get sortOrder => - $composableBuilder(column: $table.sortOrder, builder: (column) => ColumnOrderings(column)); + ColumnOrderings get sortOrder => $composableBuilder( + column: $table.sortOrder, + builder: (column) => ColumnOrderings(column), + ); - ColumnOrderings get updatedAt => - $composableBuilder(column: $table.updatedAt, builder: (column) => ColumnOrderings(column)); + ColumnOrderings get updatedAt => $composableBuilder( + column: $table.updatedAt, + builder: (column) => ColumnOrderings(column), + ); } -class $$SavedFeedsTableAnnotationComposer extends Composer<_$AppDatabase, $SavedFeedsTable> { +class $$SavedFeedsTableAnnotationComposer + extends Composer<_$AppDatabase, $SavedFeedsTable> { $$SavedFeedsTableAnnotationComposer({ required super.$db, required super.$table, @@ -3464,19 +4562,28 @@ class $$SavedFeedsTableAnnotationComposer extends Composer<_$AppDatabase, $Saved super.$addJoinBuilderToRootComposer, super.$removeJoinBuilderFromRootComposer, }); - GeneratedColumn get id => $composableBuilder(column: $table.id, builder: (column) => column); + GeneratedColumn get id => + $composableBuilder(column: $table.id, builder: (column) => column); - GeneratedColumn get accountDid => $composableBuilder(column: $table.accountDid, builder: (column) => column); + GeneratedColumn get accountDid => $composableBuilder( + column: $table.accountDid, + builder: (column) => column, + ); - GeneratedColumn get type => $composableBuilder(column: $table.type, builder: (column) => column); + GeneratedColumn get type => + $composableBuilder(column: $table.type, builder: (column) => column); - GeneratedColumn get value => $composableBuilder(column: $table.value, builder: (column) => column); + GeneratedColumn get value => + $composableBuilder(column: $table.value, builder: (column) => column); - GeneratedColumn get pinned => $composableBuilder(column: $table.pinned, builder: (column) => column); + GeneratedColumn get pinned => + $composableBuilder(column: $table.pinned, builder: (column) => column); - GeneratedColumn get sortOrder => $composableBuilder(column: $table.sortOrder, builder: (column) => column); + GeneratedColumn get sortOrder => + $composableBuilder(column: $table.sortOrder, builder: (column) => column); - GeneratedColumn get updatedAt => $composableBuilder(column: $table.updatedAt, builder: (column) => column); + GeneratedColumn get updatedAt => + $composableBuilder(column: $table.updatedAt, builder: (column) => column); } class $$SavedFeedsTableTableManager @@ -3490,7 +4597,10 @@ class $$SavedFeedsTableTableManager $$SavedFeedsTableAnnotationComposer, $$SavedFeedsTableCreateCompanionBuilder, $$SavedFeedsTableUpdateCompanionBuilder, - (SavedFeedEntry, BaseReferences<_$AppDatabase, $SavedFeedsTable, SavedFeedEntry>), + ( + SavedFeedEntry, + BaseReferences<_$AppDatabase, $SavedFeedsTable, SavedFeedEntry>, + ), SavedFeedEntry, PrefetchHooks Function() > { @@ -3499,9 +4609,12 @@ class $$SavedFeedsTableTableManager TableManagerState( db: db, table: table, - createFilteringComposer: () => $$SavedFeedsTableFilterComposer($db: db, $table: table), - createOrderingComposer: () => $$SavedFeedsTableOrderingComposer($db: db, $table: table), - createComputedFieldComposer: () => $$SavedFeedsTableAnnotationComposer($db: db, $table: table), + createFilteringComposer: () => + $$SavedFeedsTableFilterComposer($db: db, $table: table), + createOrderingComposer: () => + $$SavedFeedsTableOrderingComposer($db: db, $table: table), + createComputedFieldComposer: () => + $$SavedFeedsTableAnnotationComposer($db: db, $table: table), updateCompanionCallback: ({ Value id = const Value.absent(), @@ -3542,7 +4655,9 @@ class $$SavedFeedsTableTableManager updatedAt: updatedAt, rowid: rowid, ), - withReferenceMapper: (p0) => p0.map((e) => (e.readTable(table), BaseReferences(db, table, e))).toList(), + withReferenceMapper: (p0) => p0 + .map((e) => (e.readTable(table), BaseReferences(db, table, e))) + .toList(), prefetchHooksCallback: null, ), ); @@ -3558,7 +4673,10 @@ typedef $$SavedFeedsTableProcessedTableManager = $$SavedFeedsTableAnnotationComposer, $$SavedFeedsTableCreateCompanionBuilder, $$SavedFeedsTableUpdateCompanionBuilder, - (SavedFeedEntry, BaseReferences<_$AppDatabase, $SavedFeedsTable, SavedFeedEntry>), + ( + SavedFeedEntry, + BaseReferences<_$AppDatabase, $SavedFeedsTable, SavedFeedEntry>, + ), SavedFeedEntry, PrefetchHooks Function() >; @@ -3579,7 +4697,8 @@ typedef $$SearchHistoryTableUpdateCompanionBuilder = Value accountDid, }); -class $$SearchHistoryTableFilterComposer extends Composer<_$AppDatabase, $SearchHistoryTable> { +class $$SearchHistoryTableFilterComposer + extends Composer<_$AppDatabase, $SearchHistoryTable> { $$SearchHistoryTableFilterComposer({ required super.$db, required super.$table, @@ -3587,21 +4706,34 @@ class $$SearchHistoryTableFilterComposer extends Composer<_$AppDatabase, $Search super.$addJoinBuilderToRootComposer, super.$removeJoinBuilderFromRootComposer, }); - ColumnFilters get id => $composableBuilder(column: $table.id, builder: (column) => ColumnFilters(column)); + ColumnFilters get id => $composableBuilder( + column: $table.id, + builder: (column) => ColumnFilters(column), + ); - ColumnFilters get query => - $composableBuilder(column: $table.query, builder: (column) => ColumnFilters(column)); + ColumnFilters get query => $composableBuilder( + column: $table.query, + builder: (column) => ColumnFilters(column), + ); - ColumnFilters get type => $composableBuilder(column: $table.type, builder: (column) => ColumnFilters(column)); + ColumnFilters get type => $composableBuilder( + column: $table.type, + builder: (column) => ColumnFilters(column), + ); - ColumnFilters get searchedAt => - $composableBuilder(column: $table.searchedAt, builder: (column) => ColumnFilters(column)); + ColumnFilters get searchedAt => $composableBuilder( + column: $table.searchedAt, + builder: (column) => ColumnFilters(column), + ); - ColumnFilters get accountDid => - $composableBuilder(column: $table.accountDid, builder: (column) => ColumnFilters(column)); + ColumnFilters get accountDid => $composableBuilder( + column: $table.accountDid, + builder: (column) => ColumnFilters(column), + ); } -class $$SearchHistoryTableOrderingComposer extends Composer<_$AppDatabase, $SearchHistoryTable> { +class $$SearchHistoryTableOrderingComposer + extends Composer<_$AppDatabase, $SearchHistoryTable> { $$SearchHistoryTableOrderingComposer({ required super.$db, required super.$table, @@ -3609,22 +4741,34 @@ class $$SearchHistoryTableOrderingComposer extends Composer<_$AppDatabase, $Sear super.$addJoinBuilderToRootComposer, super.$removeJoinBuilderFromRootComposer, }); - ColumnOrderings get id => $composableBuilder(column: $table.id, builder: (column) => ColumnOrderings(column)); + ColumnOrderings get id => $composableBuilder( + column: $table.id, + builder: (column) => ColumnOrderings(column), + ); - ColumnOrderings get query => - $composableBuilder(column: $table.query, builder: (column) => ColumnOrderings(column)); + ColumnOrderings get query => $composableBuilder( + column: $table.query, + builder: (column) => ColumnOrderings(column), + ); - ColumnOrderings get type => - $composableBuilder(column: $table.type, builder: (column) => ColumnOrderings(column)); + ColumnOrderings get type => $composableBuilder( + column: $table.type, + builder: (column) => ColumnOrderings(column), + ); - ColumnOrderings get searchedAt => - $composableBuilder(column: $table.searchedAt, builder: (column) => ColumnOrderings(column)); + ColumnOrderings get searchedAt => $composableBuilder( + column: $table.searchedAt, + builder: (column) => ColumnOrderings(column), + ); - ColumnOrderings get accountDid => - $composableBuilder(column: $table.accountDid, builder: (column) => ColumnOrderings(column)); + ColumnOrderings get accountDid => $composableBuilder( + column: $table.accountDid, + builder: (column) => ColumnOrderings(column), + ); } -class $$SearchHistoryTableAnnotationComposer extends Composer<_$AppDatabase, $SearchHistoryTable> { +class $$SearchHistoryTableAnnotationComposer + extends Composer<_$AppDatabase, $SearchHistoryTable> { $$SearchHistoryTableAnnotationComposer({ required super.$db, required super.$table, @@ -3632,16 +4776,24 @@ class $$SearchHistoryTableAnnotationComposer extends Composer<_$AppDatabase, $Se super.$addJoinBuilderToRootComposer, super.$removeJoinBuilderFromRootComposer, }); - GeneratedColumn get id => $composableBuilder(column: $table.id, builder: (column) => column); + GeneratedColumn get id => + $composableBuilder(column: $table.id, builder: (column) => column); - GeneratedColumn get query => $composableBuilder(column: $table.query, builder: (column) => column); + GeneratedColumn get query => + $composableBuilder(column: $table.query, builder: (column) => column); - GeneratedColumn get type => $composableBuilder(column: $table.type, builder: (column) => column); + GeneratedColumn get type => + $composableBuilder(column: $table.type, builder: (column) => column); - GeneratedColumn get searchedAt => - $composableBuilder(column: $table.searchedAt, builder: (column) => column); + GeneratedColumn get searchedAt => $composableBuilder( + column: $table.searchedAt, + builder: (column) => column, + ); - GeneratedColumn get accountDid => $composableBuilder(column: $table.accountDid, builder: (column) => column); + GeneratedColumn get accountDid => $composableBuilder( + column: $table.accountDid, + builder: (column) => column, + ); } class $$SearchHistoryTableTableManager @@ -3655,7 +4807,14 @@ class $$SearchHistoryTableTableManager $$SearchHistoryTableAnnotationComposer, $$SearchHistoryTableCreateCompanionBuilder, $$SearchHistoryTableUpdateCompanionBuilder, - (SearchHistoryEntry, BaseReferences<_$AppDatabase, $SearchHistoryTable, SearchHistoryEntry>), + ( + SearchHistoryEntry, + BaseReferences< + _$AppDatabase, + $SearchHistoryTable, + SearchHistoryEntry + >, + ), SearchHistoryEntry, PrefetchHooks Function() > { @@ -3664,9 +4823,12 @@ class $$SearchHistoryTableTableManager TableManagerState( db: db, table: table, - createFilteringComposer: () => $$SearchHistoryTableFilterComposer($db: db, $table: table), - createOrderingComposer: () => $$SearchHistoryTableOrderingComposer($db: db, $table: table), - createComputedFieldComposer: () => $$SearchHistoryTableAnnotationComposer($db: db, $table: table), + createFilteringComposer: () => + $$SearchHistoryTableFilterComposer($db: db, $table: table), + createOrderingComposer: () => + $$SearchHistoryTableOrderingComposer($db: db, $table: table), + createComputedFieldComposer: () => + $$SearchHistoryTableAnnotationComposer($db: db, $table: table), updateCompanionCallback: ({ Value id = const Value.absent(), @@ -3695,7 +4857,9 @@ class $$SearchHistoryTableTableManager searchedAt: searchedAt, accountDid: accountDid, ), - withReferenceMapper: (p0) => p0.map((e) => (e.readTable(table), BaseReferences(db, table, e))).toList(), + withReferenceMapper: (p0) => p0 + .map((e) => (e.readTable(table), BaseReferences(db, table, e))) + .toList(), prefetchHooksCallback: null, ), ); @@ -3711,7 +4875,10 @@ typedef $$SearchHistoryTableProcessedTableManager = $$SearchHistoryTableAnnotationComposer, $$SearchHistoryTableCreateCompanionBuilder, $$SearchHistoryTableUpdateCompanionBuilder, - (SearchHistoryEntry, BaseReferences<_$AppDatabase, $SearchHistoryTable, SearchHistoryEntry>), + ( + SearchHistoryEntry, + BaseReferences<_$AppDatabase, $SearchHistoryTable, SearchHistoryEntry>, + ), SearchHistoryEntry, PrefetchHooks Function() >; @@ -3746,7 +4913,8 @@ typedef $$DraftsTableUpdateCompanionBuilder = Value scheduledAt, }); -class $$DraftsTableFilterComposer extends Composer<_$AppDatabase, $DraftsTable> { +class $$DraftsTableFilterComposer + extends Composer<_$AppDatabase, $DraftsTable> { $$DraftsTableFilterComposer({ required super.$db, required super.$table, @@ -3754,43 +4922,69 @@ class $$DraftsTableFilterComposer extends Composer<_$AppDatabase, $DraftsTable> super.$addJoinBuilderToRootComposer, super.$removeJoinBuilderFromRootComposer, }); - ColumnFilters get id => $composableBuilder(column: $table.id, builder: (column) => ColumnFilters(column)); + ColumnFilters get id => $composableBuilder( + column: $table.id, + builder: (column) => ColumnFilters(column), + ); - ColumnFilters get accountDid => - $composableBuilder(column: $table.accountDid, builder: (column) => ColumnFilters(column)); + ColumnFilters get accountDid => $composableBuilder( + column: $table.accountDid, + builder: (column) => ColumnFilters(column), + ); - ColumnFilters get content => - $composableBuilder(column: $table.content, builder: (column) => ColumnFilters(column)); + ColumnFilters get content => $composableBuilder( + column: $table.content, + builder: (column) => ColumnFilters(column), + ); - ColumnFilters get replyUri => - $composableBuilder(column: $table.replyUri, builder: (column) => ColumnFilters(column)); + ColumnFilters get replyUri => $composableBuilder( + column: $table.replyUri, + builder: (column) => ColumnFilters(column), + ); - ColumnFilters get replyCid => - $composableBuilder(column: $table.replyCid, builder: (column) => ColumnFilters(column)); + ColumnFilters get replyCid => $composableBuilder( + column: $table.replyCid, + builder: (column) => ColumnFilters(column), + ); - ColumnFilters get rootUri => - $composableBuilder(column: $table.rootUri, builder: (column) => ColumnFilters(column)); + ColumnFilters get rootUri => $composableBuilder( + column: $table.rootUri, + builder: (column) => ColumnFilters(column), + ); - ColumnFilters get rootCid => - $composableBuilder(column: $table.rootCid, builder: (column) => ColumnFilters(column)); + ColumnFilters get rootCid => $composableBuilder( + column: $table.rootCid, + builder: (column) => ColumnFilters(column), + ); - ColumnFilters get embedJson => - $composableBuilder(column: $table.embedJson, builder: (column) => ColumnFilters(column)); + ColumnFilters get embedJson => $composableBuilder( + column: $table.embedJson, + builder: (column) => ColumnFilters(column), + ); - ColumnFilters get mediaPaths => - $composableBuilder(column: $table.mediaPaths, builder: (column) => ColumnFilters(column)); + ColumnFilters get mediaPaths => $composableBuilder( + column: $table.mediaPaths, + builder: (column) => ColumnFilters(column), + ); - ColumnFilters get createdAt => - $composableBuilder(column: $table.createdAt, builder: (column) => ColumnFilters(column)); + ColumnFilters get createdAt => $composableBuilder( + column: $table.createdAt, + builder: (column) => ColumnFilters(column), + ); - ColumnFilters get updatedAt => - $composableBuilder(column: $table.updatedAt, builder: (column) => ColumnFilters(column)); + ColumnFilters get updatedAt => $composableBuilder( + column: $table.updatedAt, + builder: (column) => ColumnFilters(column), + ); - ColumnFilters get scheduledAt => - $composableBuilder(column: $table.scheduledAt, builder: (column) => ColumnFilters(column)); + ColumnFilters get scheduledAt => $composableBuilder( + column: $table.scheduledAt, + builder: (column) => ColumnFilters(column), + ); } -class $$DraftsTableOrderingComposer extends Composer<_$AppDatabase, $DraftsTable> { +class $$DraftsTableOrderingComposer + extends Composer<_$AppDatabase, $DraftsTable> { $$DraftsTableOrderingComposer({ required super.$db, required super.$table, @@ -3798,43 +4992,69 @@ class $$DraftsTableOrderingComposer extends Composer<_$AppDatabase, $DraftsTable super.$addJoinBuilderToRootComposer, super.$removeJoinBuilderFromRootComposer, }); - ColumnOrderings get id => $composableBuilder(column: $table.id, builder: (column) => ColumnOrderings(column)); + ColumnOrderings get id => $composableBuilder( + column: $table.id, + builder: (column) => ColumnOrderings(column), + ); - ColumnOrderings get accountDid => - $composableBuilder(column: $table.accountDid, builder: (column) => ColumnOrderings(column)); + ColumnOrderings get accountDid => $composableBuilder( + column: $table.accountDid, + builder: (column) => ColumnOrderings(column), + ); - ColumnOrderings get content => - $composableBuilder(column: $table.content, builder: (column) => ColumnOrderings(column)); + ColumnOrderings get content => $composableBuilder( + column: $table.content, + builder: (column) => ColumnOrderings(column), + ); - ColumnOrderings get replyUri => - $composableBuilder(column: $table.replyUri, builder: (column) => ColumnOrderings(column)); + ColumnOrderings get replyUri => $composableBuilder( + column: $table.replyUri, + builder: (column) => ColumnOrderings(column), + ); - ColumnOrderings get replyCid => - $composableBuilder(column: $table.replyCid, builder: (column) => ColumnOrderings(column)); + ColumnOrderings get replyCid => $composableBuilder( + column: $table.replyCid, + builder: (column) => ColumnOrderings(column), + ); - ColumnOrderings get rootUri => - $composableBuilder(column: $table.rootUri, builder: (column) => ColumnOrderings(column)); + ColumnOrderings get rootUri => $composableBuilder( + column: $table.rootUri, + builder: (column) => ColumnOrderings(column), + ); - ColumnOrderings get rootCid => - $composableBuilder(column: $table.rootCid, builder: (column) => ColumnOrderings(column)); + ColumnOrderings get rootCid => $composableBuilder( + column: $table.rootCid, + builder: (column) => ColumnOrderings(column), + ); - ColumnOrderings get embedJson => - $composableBuilder(column: $table.embedJson, builder: (column) => ColumnOrderings(column)); + ColumnOrderings get embedJson => $composableBuilder( + column: $table.embedJson, + builder: (column) => ColumnOrderings(column), + ); - ColumnOrderings get mediaPaths => - $composableBuilder(column: $table.mediaPaths, builder: (column) => ColumnOrderings(column)); + ColumnOrderings get mediaPaths => $composableBuilder( + column: $table.mediaPaths, + builder: (column) => ColumnOrderings(column), + ); - ColumnOrderings get createdAt => - $composableBuilder(column: $table.createdAt, builder: (column) => ColumnOrderings(column)); + ColumnOrderings get createdAt => $composableBuilder( + column: $table.createdAt, + builder: (column) => ColumnOrderings(column), + ); - ColumnOrderings get updatedAt => - $composableBuilder(column: $table.updatedAt, builder: (column) => ColumnOrderings(column)); + ColumnOrderings get updatedAt => $composableBuilder( + column: $table.updatedAt, + builder: (column) => ColumnOrderings(column), + ); - ColumnOrderings get scheduledAt => - $composableBuilder(column: $table.scheduledAt, builder: (column) => ColumnOrderings(column)); + ColumnOrderings get scheduledAt => $composableBuilder( + column: $table.scheduledAt, + builder: (column) => ColumnOrderings(column), + ); } -class $$DraftsTableAnnotationComposer extends Composer<_$AppDatabase, $DraftsTable> { +class $$DraftsTableAnnotationComposer + extends Composer<_$AppDatabase, $DraftsTable> { $$DraftsTableAnnotationComposer({ required super.$db, required super.$table, @@ -3842,30 +5062,47 @@ class $$DraftsTableAnnotationComposer extends Composer<_$AppDatabase, $DraftsTab super.$addJoinBuilderToRootComposer, super.$removeJoinBuilderFromRootComposer, }); - GeneratedColumn get id => $composableBuilder(column: $table.id, builder: (column) => column); + GeneratedColumn get id => + $composableBuilder(column: $table.id, builder: (column) => column); - GeneratedColumn get accountDid => $composableBuilder(column: $table.accountDid, builder: (column) => column); + GeneratedColumn get accountDid => $composableBuilder( + column: $table.accountDid, + builder: (column) => column, + ); - GeneratedColumn get content => $composableBuilder(column: $table.content, builder: (column) => column); + GeneratedColumn get content => + $composableBuilder(column: $table.content, builder: (column) => column); - GeneratedColumn get replyUri => $composableBuilder(column: $table.replyUri, builder: (column) => column); + GeneratedColumn get replyUri => + $composableBuilder(column: $table.replyUri, builder: (column) => column); - GeneratedColumn get replyCid => $composableBuilder(column: $table.replyCid, builder: (column) => column); + GeneratedColumn get replyCid => + $composableBuilder(column: $table.replyCid, builder: (column) => column); - GeneratedColumn get rootUri => $composableBuilder(column: $table.rootUri, builder: (column) => column); + GeneratedColumn get rootUri => + $composableBuilder(column: $table.rootUri, builder: (column) => column); - GeneratedColumn get rootCid => $composableBuilder(column: $table.rootCid, builder: (column) => column); + GeneratedColumn get rootCid => + $composableBuilder(column: $table.rootCid, builder: (column) => column); - GeneratedColumn get embedJson => $composableBuilder(column: $table.embedJson, builder: (column) => column); + GeneratedColumn get embedJson => + $composableBuilder(column: $table.embedJson, builder: (column) => column); - GeneratedColumn get mediaPaths => $composableBuilder(column: $table.mediaPaths, builder: (column) => column); + GeneratedColumn get mediaPaths => $composableBuilder( + column: $table.mediaPaths, + builder: (column) => column, + ); - GeneratedColumn get createdAt => $composableBuilder(column: $table.createdAt, builder: (column) => column); + GeneratedColumn get createdAt => + $composableBuilder(column: $table.createdAt, builder: (column) => column); - GeneratedColumn get updatedAt => $composableBuilder(column: $table.updatedAt, builder: (column) => column); + GeneratedColumn get updatedAt => + $composableBuilder(column: $table.updatedAt, builder: (column) => column); - GeneratedColumn get scheduledAt => - $composableBuilder(column: $table.scheduledAt, builder: (column) => column); + GeneratedColumn get scheduledAt => $composableBuilder( + column: $table.scheduledAt, + builder: (column) => column, + ); } class $$DraftsTableTableManager @@ -3888,9 +5125,12 @@ class $$DraftsTableTableManager TableManagerState( db: db, table: table, - createFilteringComposer: () => $$DraftsTableFilterComposer($db: db, $table: table), - createOrderingComposer: () => $$DraftsTableOrderingComposer($db: db, $table: table), - createComputedFieldComposer: () => $$DraftsTableAnnotationComposer($db: db, $table: table), + createFilteringComposer: () => + $$DraftsTableFilterComposer($db: db, $table: table), + createOrderingComposer: () => + $$DraftsTableOrderingComposer($db: db, $table: table), + createComputedFieldComposer: () => + $$DraftsTableAnnotationComposer($db: db, $table: table), updateCompanionCallback: ({ Value id = const Value.absent(), @@ -3947,7 +5187,9 @@ class $$DraftsTableTableManager updatedAt: updatedAt, scheduledAt: scheduledAt, ), - withReferenceMapper: (p0) => p0.map((e) => (e.readTable(table), BaseReferences(db, table, e))).toList(), + withReferenceMapper: (p0) => p0 + .map((e) => (e.readTable(table), BaseReferences(db, table, e))) + .toList(), prefetchHooksCallback: null, ), ); @@ -3967,15 +5209,220 @@ typedef $$DraftsTableProcessedTableManager = DraftEntry, PrefetchHooks Function() >; +typedef $$SavedPostsTableCreateCompanionBuilder = + SavedPostsCompanion Function({ + Value id, + required String accountDid, + required String postUri, + required String postJson, + Value savedAt, + }); +typedef $$SavedPostsTableUpdateCompanionBuilder = + SavedPostsCompanion Function({ + Value id, + Value accountDid, + Value postUri, + Value postJson, + Value savedAt, + }); + +class $$SavedPostsTableFilterComposer + extends Composer<_$AppDatabase, $SavedPostsTable> { + $$SavedPostsTableFilterComposer({ + required super.$db, + required super.$table, + super.joinBuilder, + super.$addJoinBuilderToRootComposer, + super.$removeJoinBuilderFromRootComposer, + }); + ColumnFilters get id => $composableBuilder( + column: $table.id, + builder: (column) => ColumnFilters(column), + ); + + ColumnFilters get accountDid => $composableBuilder( + column: $table.accountDid, + builder: (column) => ColumnFilters(column), + ); + + ColumnFilters get postUri => $composableBuilder( + column: $table.postUri, + builder: (column) => ColumnFilters(column), + ); + + ColumnFilters get postJson => $composableBuilder( + column: $table.postJson, + builder: (column) => ColumnFilters(column), + ); + + ColumnFilters get savedAt => $composableBuilder( + column: $table.savedAt, + builder: (column) => ColumnFilters(column), + ); +} + +class $$SavedPostsTableOrderingComposer + extends Composer<_$AppDatabase, $SavedPostsTable> { + $$SavedPostsTableOrderingComposer({ + required super.$db, + required super.$table, + super.joinBuilder, + super.$addJoinBuilderToRootComposer, + super.$removeJoinBuilderFromRootComposer, + }); + ColumnOrderings get id => $composableBuilder( + column: $table.id, + builder: (column) => ColumnOrderings(column), + ); + + ColumnOrderings get accountDid => $composableBuilder( + column: $table.accountDid, + builder: (column) => ColumnOrderings(column), + ); + + ColumnOrderings get postUri => $composableBuilder( + column: $table.postUri, + builder: (column) => ColumnOrderings(column), + ); + + ColumnOrderings get postJson => $composableBuilder( + column: $table.postJson, + builder: (column) => ColumnOrderings(column), + ); + + ColumnOrderings get savedAt => $composableBuilder( + column: $table.savedAt, + builder: (column) => ColumnOrderings(column), + ); +} + +class $$SavedPostsTableAnnotationComposer + extends Composer<_$AppDatabase, $SavedPostsTable> { + $$SavedPostsTableAnnotationComposer({ + required super.$db, + required super.$table, + super.joinBuilder, + super.$addJoinBuilderToRootComposer, + super.$removeJoinBuilderFromRootComposer, + }); + GeneratedColumn get id => + $composableBuilder(column: $table.id, builder: (column) => column); + + GeneratedColumn get accountDid => $composableBuilder( + column: $table.accountDid, + builder: (column) => column, + ); + + GeneratedColumn get postUri => + $composableBuilder(column: $table.postUri, builder: (column) => column); + + GeneratedColumn get postJson => + $composableBuilder(column: $table.postJson, builder: (column) => column); + + GeneratedColumn get savedAt => + $composableBuilder(column: $table.savedAt, builder: (column) => column); +} + +class $$SavedPostsTableTableManager + extends + RootTableManager< + _$AppDatabase, + $SavedPostsTable, + SavedPostEntry, + $$SavedPostsTableFilterComposer, + $$SavedPostsTableOrderingComposer, + $$SavedPostsTableAnnotationComposer, + $$SavedPostsTableCreateCompanionBuilder, + $$SavedPostsTableUpdateCompanionBuilder, + ( + SavedPostEntry, + BaseReferences<_$AppDatabase, $SavedPostsTable, SavedPostEntry>, + ), + SavedPostEntry, + PrefetchHooks Function() + > { + $$SavedPostsTableTableManager(_$AppDatabase db, $SavedPostsTable table) + : super( + TableManagerState( + db: db, + table: table, + createFilteringComposer: () => + $$SavedPostsTableFilterComposer($db: db, $table: table), + createOrderingComposer: () => + $$SavedPostsTableOrderingComposer($db: db, $table: table), + createComputedFieldComposer: () => + $$SavedPostsTableAnnotationComposer($db: db, $table: table), + updateCompanionCallback: + ({ + Value id = const Value.absent(), + Value accountDid = const Value.absent(), + Value postUri = const Value.absent(), + Value postJson = const Value.absent(), + Value savedAt = const Value.absent(), + }) => SavedPostsCompanion( + id: id, + accountDid: accountDid, + postUri: postUri, + postJson: postJson, + savedAt: savedAt, + ), + createCompanionCallback: + ({ + Value id = const Value.absent(), + required String accountDid, + required String postUri, + required String postJson, + Value savedAt = const Value.absent(), + }) => SavedPostsCompanion.insert( + id: id, + accountDid: accountDid, + postUri: postUri, + postJson: postJson, + savedAt: savedAt, + ), + withReferenceMapper: (p0) => p0 + .map((e) => (e.readTable(table), BaseReferences(db, table, e))) + .toList(), + prefetchHooksCallback: null, + ), + ); +} + +typedef $$SavedPostsTableProcessedTableManager = + ProcessedTableManager< + _$AppDatabase, + $SavedPostsTable, + SavedPostEntry, + $$SavedPostsTableFilterComposer, + $$SavedPostsTableOrderingComposer, + $$SavedPostsTableAnnotationComposer, + $$SavedPostsTableCreateCompanionBuilder, + $$SavedPostsTableUpdateCompanionBuilder, + ( + SavedPostEntry, + BaseReferences<_$AppDatabase, $SavedPostsTable, SavedPostEntry>, + ), + SavedPostEntry, + PrefetchHooks Function() + >; class $AppDatabaseManager { final _$AppDatabase _db; $AppDatabaseManager(this._db); - $$AccountsTableTableManager get accounts => $$AccountsTableTableManager(_db, _db.accounts); - $$CachedProfilesTableTableManager get cachedProfiles => $$CachedProfilesTableTableManager(_db, _db.cachedProfiles); - $$CachedPostsTableTableManager get cachedPosts => $$CachedPostsTableTableManager(_db, _db.cachedPosts); - $$SettingsTableTableManager get settings => $$SettingsTableTableManager(_db, _db.settings); - $$SavedFeedsTableTableManager get savedFeeds => $$SavedFeedsTableTableManager(_db, _db.savedFeeds); - $$SearchHistoryTableTableManager get searchHistory => $$SearchHistoryTableTableManager(_db, _db.searchHistory); - $$DraftsTableTableManager get drafts => $$DraftsTableTableManager(_db, _db.drafts); + $$AccountsTableTableManager get accounts => + $$AccountsTableTableManager(_db, _db.accounts); + $$CachedProfilesTableTableManager get cachedProfiles => + $$CachedProfilesTableTableManager(_db, _db.cachedProfiles); + $$CachedPostsTableTableManager get cachedPosts => + $$CachedPostsTableTableManager(_db, _db.cachedPosts); + $$SettingsTableTableManager get settings => + $$SettingsTableTableManager(_db, _db.settings); + $$SavedFeedsTableTableManager get savedFeeds => + $$SavedFeedsTableTableManager(_db, _db.savedFeeds); + $$SearchHistoryTableTableManager get searchHistory => + $$SearchHistoryTableTableManager(_db, _db.searchHistory); + $$DraftsTableTableManager get drafts => + $$DraftsTableTableManager(_db, _db.drafts); + $$SavedPostsTableTableManager get savedPosts => + $$SavedPostsTableTableManager(_db, _db.savedPosts); } diff --git a/lib/core/database/tables.dart b/lib/core/database/tables.dart index 2cc6aff..e4f0132 100644 --- a/lib/core/database/tables.dart +++ b/lib/core/database/tables.dart @@ -90,3 +90,15 @@ class Drafts extends Table { DateTimeColumn get updatedAt => dateTime().withDefault(currentDateAndTime)(); DateTimeColumn get scheduledAt => dateTime().nullable()(); } + +@DataClassName('SavedPostEntry') +class SavedPosts extends Table { + IntColumn get id => integer().autoIncrement()(); + TextColumn get accountDid => text()(); + TextColumn get postUri => text()(); + TextColumn get postJson => text()(); + DateTimeColumn get savedAt => dateTime().withDefault(currentDateAndTime)(); + + @override + List get customConstraints => ['UNIQUE (account_did, post_uri)']; +} diff --git a/lib/features/feed/cubit/post_action_cubit.dart b/lib/features/feed/cubit/post_action_cubit.dart new file mode 100644 index 0000000..f6a6da0 --- /dev/null +++ b/lib/features/feed/cubit/post_action_cubit.dart @@ -0,0 +1,198 @@ +import 'package:atproto_core/atproto_core.dart'; +import 'package:equatable/equatable.dart'; +import 'package:flutter_bloc/flutter_bloc.dart'; +import 'package:lazurite/core/logging/app_logger.dart'; +import 'package:lazurite/features/feed/data/post_action_repository.dart'; + +class PostActionState extends Equatable { + const PostActionState({ + required this.postUri, + this.isLiked = false, + this.isReposted = false, + this.likeCount = 0, + this.repostCount = 0, + this.likeUri, + this.repostUri, + this.isLoadingLike = false, + this.isLoadingRepost = false, + this.error, + }); + + final String postUri; + final bool isLiked; + final bool isReposted; + final int likeCount; + final int repostCount; + final String? likeUri; + final String? repostUri; + final bool isLoadingLike; + final bool isLoadingRepost; + final String? error; + + PostActionState copyWith({ + bool? isLiked, + bool? isReposted, + int? likeCount, + int? repostCount, + String? likeUri, + String? repostUri, + bool? isLoadingLike, + bool? isLoadingRepost, + String? error, + }) { + return PostActionState( + postUri: postUri, + isLiked: isLiked ?? this.isLiked, + isReposted: isReposted ?? this.isReposted, + likeCount: likeCount ?? this.likeCount, + repostCount: repostCount ?? this.repostCount, + likeUri: likeUri ?? this.likeUri, + repostUri: repostUri ?? this.repostUri, + isLoadingLike: isLoadingLike ?? this.isLoadingLike, + isLoadingRepost: isLoadingRepost ?? this.isLoadingRepost, + error: error ?? this.error, + ); + } + + @override + List get props => [ + postUri, + isLiked, + isReposted, + likeCount, + repostCount, + likeUri, + repostUri, + isLoadingLike, + isLoadingRepost, + error, + ]; +} + +class PostActionCubit extends Cubit { + PostActionCubit({ + required PostActionRepository postActionRepository, + required String postUri, + required String postCid, + bool isLiked = false, + bool isReposted = false, + int likeCount = 0, + int repostCount = 0, + String? likeUri, + String? repostUri, + }) : _postActionRepository = postActionRepository, + _postCid = postCid, + super( + PostActionState( + postUri: postUri, + isLiked: isLiked, + isReposted: isReposted, + likeCount: likeCount, + repostCount: repostCount, + likeUri: likeUri, + repostUri: repostUri, + ), + ); + + final PostActionRepository _postActionRepository; + final String _postCid; + + Future toggleLike() async { + if (state.isLoadingLike) return; + + final wasLiked = state.isLiked; + final previousLikeCount = state.likeCount; + final previousLikeUri = state.likeUri; + + emit( + state.copyWith( + isLiked: !wasLiked, + likeCount: wasLiked ? previousLikeCount - 1 : previousLikeCount + 1, + isLoadingLike: true, + error: null, + ), + ); + + try { + if (wasLiked) { + if (previousLikeUri != null) { + await _postActionRepository.unlikePost(likeUri: previousLikeUri); + emit(state.copyWith(likeUri: null, isLoadingLike: false)); + } else { + emit(state.copyWith(isLoadingLike: false)); + } + } else { + final newLikeUri = await _postActionRepository.likePost(uri: AtUri.parse(state.postUri), cid: _postCid); + emit(state.copyWith(likeUri: newLikeUri, isLoadingLike: false)); + } + } catch (error) { + log.e('Failed to toggle like', error: error); + + emit( + state.copyWith( + isLiked: wasLiked, + likeCount: previousLikeCount, + likeUri: previousLikeUri, + isLoadingLike: false, + error: 'Failed to ${wasLiked ? 'unlike' : 'like'} post', + ), + ); + } + } + + Future toggleRepost() async { + if (state.isLoadingRepost) return; + + final wasReposted = state.isReposted; + final previousRepostCount = state.repostCount; + final previousRepostUri = state.repostUri; + + emit( + state.copyWith( + isReposted: !wasReposted, + repostCount: wasReposted ? previousRepostCount - 1 : previousRepostCount + 1, + isLoadingRepost: true, + error: null, + ), + ); + + try { + if (wasReposted) { + if (previousRepostUri != null) { + await _postActionRepository.unrepostPost(repostUri: previousRepostUri); + emit(state.copyWith(repostUri: null, isLoadingRepost: false)); + } else { + emit(state.copyWith(isLoadingRepost: false)); + } + } else { + final newRepostUri = await _postActionRepository.repostPost(uri: AtUri.parse(state.postUri), cid: _postCid); + emit(state.copyWith(repostUri: newRepostUri, isLoadingRepost: false)); + } + } catch (error) { + log.e('Failed to toggle repost', error: error); + + emit( + state.copyWith( + isReposted: wasReposted, + repostCount: previousRepostCount, + repostUri: previousRepostUri, + isLoadingRepost: false, + error: 'Failed to ${wasReposted ? 'unrepost' : 'repost'} post', + ), + ); + } + } + + Future deletePost() async { + try { + await _postActionRepository.deletePost(postUri: state.postUri); + } catch (error) { + log.e('Failed to delete post', error: error); + emit(state.copyWith(error: 'Failed to delete post')); + } + } + + void clearError() { + emit(state.copyWith(error: null)); + } +} diff --git a/lib/features/feed/cubit/saved_posts_cubit.dart b/lib/features/feed/cubit/saved_posts_cubit.dart new file mode 100644 index 0000000..e318185 --- /dev/null +++ b/lib/features/feed/cubit/saved_posts_cubit.dart @@ -0,0 +1,152 @@ +import 'dart:async'; + +import 'package:drift/drift.dart'; +import 'package:equatable/equatable.dart'; +import 'package:flutter_bloc/flutter_bloc.dart'; +import 'package:lazurite/core/database/app_database.dart'; +import 'package:lazurite/core/logging/app_logger.dart'; + +class SavedPostsState extends Equatable { + const SavedPostsState({ + this.status = SavedPostsStatus.initial, + this.savedPosts = const [], + this.savedUris = const {}, + this.error, + }); + + final SavedPostsStatus status; + final List savedPosts; + final Set savedUris; + final String? error; + + bool isSaved(String postUri) => savedUris.contains(postUri); + + SavedPostsState copyWith({ + SavedPostsStatus? status, + List? savedPosts, + Set? savedUris, + String? error, + }) { + return SavedPostsState( + status: status ?? this.status, + savedPosts: savedPosts ?? this.savedPosts, + savedUris: savedUris ?? this.savedUris, + error: error ?? this.error, + ); + } + + @override + List get props => [status, savedPosts, savedUris, error]; +} + +enum SavedPostsStatus { initial, loading, loaded, error } + +class SavedPostsCubit extends Cubit { + SavedPostsCubit({required AppDatabase database, required String accountDid}) + : _database = database, + _accountDid = accountDid, + super(const SavedPostsState()) { + _init(); + } + + final AppDatabase _database; + final String _accountDid; + StreamSubscription>? _savedUrisSubscription; + + void _init() { + _savedUrisSubscription = _database + .watchSavedPostUris(_accountDid) + .listen( + (uris) { + emit(state.copyWith(savedUris: uris)); + }, + onError: (error) { + log.e('Error watching saved post URIs', error: error); + }, + ); + } + + Future loadSavedPosts() async { + emit(state.copyWith(status: SavedPostsStatus.loading, error: null)); + + try { + final posts = await _database.getSavedPosts(_accountDid); + final uris = posts.map((p) => p.postUri).toSet(); + + emit(state.copyWith(status: SavedPostsStatus.loaded, savedPosts: posts, savedUris: uris)); + } catch (error) { + log.e('Failed to load saved posts', error: error); + emit(state.copyWith(status: SavedPostsStatus.error, error: 'Failed to load saved posts')); + } + } + + Future toggleSave({required String postUri, required String postJson}) async { + final isCurrentlySaved = state.isSaved(postUri); + + try { + if (isCurrentlySaved) { + await _database.unsavePost(_accountDid, postUri); + } else { + await _database.savePost( + SavedPostsCompanion( + accountDid: Value(_accountDid), + postUri: Value(postUri), + postJson: Value(postJson), + savedAt: Value(DateTime.now()), + ), + ); + } + + await loadSavedPosts(); + return true; + } catch (error) { + log.e('Failed to toggle save', error: error); + emit(state.copyWith(error: 'Failed to ${isCurrentlySaved ? 'unsave' : 'save'} post')); + return false; + } + } + + Future savePost({required String postUri, required String postJson}) async { + if (state.isSaved(postUri)) return true; + return toggleSave(postUri: postUri, postJson: postJson); + } + + Future unsavePost(String postUri) async { + if (!state.isSaved(postUri)) return true; + return toggleSave(postUri: postUri, postJson: ''); + } + + Future unsavePostById(int id) async { + try { + await _database.unsavePostById(id); + await loadSavedPosts(); + } catch (error) { + log.e('Failed to unsave post', error: error); + emit(state.copyWith(error: 'Failed to remove saved post')); + } + } + + Future clearAllSaved() async { + try { + await _database.deleteAllSavedPosts(_accountDid); + await loadSavedPosts(); + } catch (error) { + log.e('Failed to clear saved posts', error: error); + emit(state.copyWith(error: 'Failed to clear saved posts')); + } + } + + Stream watchIsSaved(String postUri) { + return _database.watchIsPostSaved(_accountDid, postUri); + } + + void clearError() { + emit(state.copyWith(error: null)); + } + + @override + Future close() { + _savedUrisSubscription?.cancel(); + return super.close(); + } +} diff --git a/lib/features/feed/data/post_action_repository.dart b/lib/features/feed/data/post_action_repository.dart new file mode 100644 index 0000000..9181d70 --- /dev/null +++ b/lib/features/feed/data/post_action_repository.dart @@ -0,0 +1,47 @@ +import 'package:atproto/com_atproto_repo_strongref.dart'; +import 'package:atproto_core/atproto_core.dart'; +import 'package:bluesky/bluesky.dart'; + +class PostActionRepository { + PostActionRepository({required Bluesky bluesky}) : _bluesky = bluesky; + + final Bluesky _bluesky; + + Future likePost({required AtUri uri, required String cid}) async { + final response = await _bluesky.feed.like.create( + subject: RepoStrongRef(cid: cid, uri: uri), + createdAt: DateTime.now(), + ); + + return response.data.uri.toString(); + } + + Future unlikePost({required String likeUri}) async { + final rkey = _extractRkey(likeUri); + await _bluesky.feed.like.delete(rkey: rkey); + } + + Future repostPost({required AtUri uri, required String cid}) async { + final response = await _bluesky.feed.repost.create( + subject: RepoStrongRef(cid: cid, uri: uri), + createdAt: DateTime.now(), + ); + + return response.data.uri.toString(); + } + + Future unrepostPost({required String repostUri}) async { + final rkey = _extractRkey(repostUri); + await _bluesky.feed.repost.delete(rkey: rkey); + } + + Future deletePost({required String postUri}) async { + final rkey = _extractRkey(postUri); + await _bluesky.feed.post.delete(rkey: rkey); + } + + String _extractRkey(String uri) { + final atUri = AtUri.parse(uri); + return atUri.rkey; + } +} diff --git a/lib/features/profile/cubit/profile_action_cubit.dart b/lib/features/profile/cubit/profile_action_cubit.dart new file mode 100644 index 0000000..9ea21df --- /dev/null +++ b/lib/features/profile/cubit/profile_action_cubit.dart @@ -0,0 +1,238 @@ +import 'package:atproto/com_atproto_moderation_defs.dart'; +import 'package:atproto_core/atproto_core.dart'; +import 'package:equatable/equatable.dart'; +import 'package:flutter_bloc/flutter_bloc.dart'; +import 'package:lazurite/core/logging/app_logger.dart'; +import 'package:lazurite/features/profile/data/profile_action_repository.dart'; + +class ProfileActionState extends Equatable { + const ProfileActionState({ + required this.actorDid, + this.isFollowing = false, + this.isMuted = false, + this.isBlocked = false, + this.isBlockedBy = false, + this.followUri, + this.blockUri, + this.isLoadingFollow = false, + this.isLoadingMute = false, + this.isLoadingBlock = false, + this.error, + }); + + final String actorDid; + final bool isFollowing; + final bool isMuted; + final bool isBlocked; + final bool isBlockedBy; + final String? followUri; + final String? blockUri; + final bool isLoadingFollow; + final bool isLoadingMute; + final bool isLoadingBlock; + final String? error; + + bool get canShowActions => !isBlockedBy; + + ProfileActionState copyWith({ + bool? isFollowing, + bool? isMuted, + bool? isBlocked, + bool? isBlockedBy, + String? followUri, + String? blockUri, + bool? isLoadingFollow, + bool? isLoadingMute, + bool? isLoadingBlock, + String? error, + }) { + return ProfileActionState( + actorDid: actorDid, + isFollowing: isFollowing ?? this.isFollowing, + isMuted: isMuted ?? this.isMuted, + isBlocked: isBlocked ?? this.isBlocked, + isBlockedBy: isBlockedBy ?? this.isBlockedBy, + followUri: followUri ?? this.followUri, + blockUri: blockUri ?? this.blockUri, + isLoadingFollow: isLoadingFollow ?? this.isLoadingFollow, + isLoadingMute: isLoadingMute ?? this.isLoadingMute, + isLoadingBlock: isLoadingBlock ?? this.isLoadingBlock, + error: error ?? this.error, + ); + } + + @override + List get props => [ + actorDid, + isFollowing, + isMuted, + isBlocked, + isBlockedBy, + followUri, + blockUri, + isLoadingFollow, + isLoadingMute, + isLoadingBlock, + error, + ]; +} + +class ProfileActionCubit extends Cubit { + ProfileActionCubit({ + required ProfileActionRepository profileActionRepository, + required String actorDid, + bool isFollowing = false, + bool isMuted = false, + bool isBlocked = false, + bool isBlockedBy = false, + String? followUri, + String? blockUri, + }) : _profileActionRepository = profileActionRepository, + super( + ProfileActionState( + actorDid: actorDid, + isFollowing: isFollowing, + isMuted: isMuted, + isBlocked: isBlocked, + isBlockedBy: isBlockedBy, + followUri: followUri, + blockUri: blockUri, + ), + ); + + final ProfileActionRepository _profileActionRepository; + + Future toggleFollow() async { + if (state.isLoadingFollow || state.isBlockedBy) return; + + final wasFollowing = state.isFollowing; + final previousFollowUri = state.followUri; + + emit(state.copyWith(isFollowing: !wasFollowing, isLoadingFollow: true, error: null)); + + try { + if (wasFollowing) { + if (previousFollowUri != null) { + await _profileActionRepository.unfollowActor(followUri: previousFollowUri); + emit(state.copyWith(followUri: null, isLoadingFollow: false)); + } else { + emit(state.copyWith(isLoadingFollow: false)); + } + } else { + final newFollowUri = await _profileActionRepository.followActor(did: state.actorDid); + emit(state.copyWith(followUri: newFollowUri, isLoadingFollow: false)); + } + } catch (error) { + log.e('Failed to toggle follow', error: error); + + emit( + state.copyWith( + isFollowing: wasFollowing, + followUri: previousFollowUri, + isLoadingFollow: false, + error: 'Failed to ${wasFollowing ? 'unfollow' : 'follow'} user', + ), + ); + } + } + + Future toggleMute() async { + if (state.isLoadingMute || state.isBlockedBy) return; + + final wasMuted = state.isMuted; + emit(state.copyWith(isMuted: !wasMuted, isLoadingMute: true, error: null)); + + try { + if (wasMuted) { + await _profileActionRepository.unmuteActor(did: state.actorDid); + } else { + await _profileActionRepository.muteActor(did: state.actorDid); + } + emit(state.copyWith(isLoadingMute: false)); + } catch (error) { + log.e('Failed to toggle mute', error: error); + + emit( + state.copyWith( + isMuted: wasMuted, + isLoadingMute: false, + error: 'Failed to ${wasMuted ? 'unmute' : 'mute'} user', + ), + ); + } + } + + Future toggleBlock() async { + if (state.isLoadingBlock || state.isBlockedBy) return; + + final wasBlocked = state.isBlocked; + final previousBlockUri = state.blockUri; + + emit(state.copyWith(isBlocked: !wasBlocked, isLoadingBlock: true, error: null)); + + try { + if (wasBlocked) { + if (previousBlockUri != null) { + await _profileActionRepository.unblockActor(blockUri: previousBlockUri); + emit(state.copyWith(blockUri: null, isLoadingBlock: false)); + } else { + emit(state.copyWith(isLoadingBlock: false)); + } + } else { + final newBlockUri = await _profileActionRepository.blockActor(did: state.actorDid); + emit(state.copyWith(blockUri: newBlockUri, isLoadingBlock: false)); + } + } catch (error) { + log.e('Failed to toggle block', error: error); + + emit( + state.copyWith( + isBlocked: wasBlocked, + blockUri: previousBlockUri, + isLoadingBlock: false, + error: 'Failed to ${wasBlocked ? 'unblock' : 'block'} user', + ), + ); + } + } + + Future reportPost({ + required AtUri postUri, + required String cid, + required ReasonType reasonType, + String? reason, + }) async { + try { + final reportId = await _profileActionRepository.reportPost( + postUri: postUri, + cid: cid, + reasonType: reasonType, + reason: reason, + ); + return reportId; + } catch (error) { + log.e('Failed to report post', error: error); + emit(state.copyWith(error: 'Failed to report post')); + return null; + } + } + + Future reportActor({required ReasonType reasonType, String? reason}) async { + try { + final reportId = await _profileActionRepository.reportActor( + did: state.actorDid, + reasonType: reasonType, + reason: reason, + ); + return reportId; + } catch (error) { + log.e('Failed to report actor', error: error); + emit(state.copyWith(error: 'Failed to report user')); + return null; + } + } + + void clearError() { + emit(state.copyWith(error: null)); + } +} diff --git a/lib/features/profile/data/profile_action_repository.dart b/lib/features/profile/data/profile_action_repository.dart new file mode 100644 index 0000000..8cdc0ae --- /dev/null +++ b/lib/features/profile/data/profile_action_repository.dart @@ -0,0 +1,74 @@ +import 'package:atproto/com_atproto_admin_defs.dart'; +import 'package:atproto/com_atproto_moderation_createreport.dart'; +import 'package:atproto/com_atproto_moderation_defs.dart'; +import 'package:atproto/com_atproto_repo_strongref.dart'; +import 'package:atproto_core/atproto_core.dart'; +import 'package:bluesky/bluesky.dart'; + +class ProfileActionRepository { + ProfileActionRepository({required Bluesky bluesky}) : _bluesky = bluesky; + + final Bluesky _bluesky; + + Future followActor({required String did}) async { + final response = await _bluesky.graph.follow.create(subject: did, createdAt: DateTime.now()); + + return response.data.uri.toString(); + } + + Future unfollowActor({required String followUri}) async { + final rkey = _extractRkey(followUri); + await _bluesky.graph.follow.delete(rkey: rkey); + } + + Future muteActor({required String did}) async { + await _bluesky.graph.muteActor(actor: did); + } + + Future unmuteActor({required String did}) async { + await _bluesky.graph.unmuteActor(actor: did); + } + + Future blockActor({required String did}) async { + final response = await _bluesky.graph.block.create(subject: did, createdAt: DateTime.now()); + + return response.data.uri.toString(); + } + + Future unblockActor({required String blockUri}) async { + final rkey = _extractRkey(blockUri); + await _bluesky.graph.block.delete(rkey: rkey); + } + + Future reportPost({ + required AtUri postUri, + required String cid, + required ReasonType reasonType, + String? reason, + }) async { + final response = await _bluesky.atproto.moderation.createReport( + reasonType: reasonType, + subject: UModerationCreateReportSubject.repoStrongRef( + data: RepoStrongRef(cid: cid, uri: postUri), + ), + reason: reason, + ); + + return response.data.id.toString(); + } + + Future reportActor({required String did, required ReasonType reasonType, String? reason}) async { + final response = await _bluesky.atproto.moderation.createReport( + reasonType: reasonType, + subject: UModerationCreateReportSubject.repoRef(data: RepoRef(did: did)), + reason: reason, + ); + + return response.data.id.toString(); + } + + String _extractRkey(String uri) { + final atUri = AtUri.parse(uri); + return atUri.rkey; + } +} diff --git a/test/core/router/app_router_test.dart b/test/core/router/app_router_test.dart index 835519a..8dd94db 100644 --- a/test/core/router/app_router_test.dart +++ b/test/core/router/app_router_test.dart @@ -132,20 +132,19 @@ void main() { await tester.pumpWidget(buildSubject()); await tester.pumpAndSettle(); - expect(find.text('Home'), findsAtLeastNWidgets(1)); - expect(find.text('Profile'), findsAtLeastNWidgets(1)); - expect(find.text('Settings'), findsAtLeastNWidgets(1)); + expect(find.byIcon(Icons.home), findsOneWidget); + expect(find.byIcon(Icons.person_outline), findsOneWidget); + expect(find.byIcon(Icons.settings_outlined), findsOneWidget); expect(find.text('No feeds pinned'), findsOneWidget); - await tester.tap(find.text('Profile').last); + await tester.tap(find.byIcon(Icons.person_outline).first); await tester.pumpAndSettle(); expect(find.text('River Tam'), findsOneWidget); - await tester.tap(find.text('Settings').last); + await tester.tap(find.byIcon(Icons.settings_outlined).first); await tester.pumpAndSettle(); - expect(find.text('Settings'), findsAtLeastNWidgets(1)); expect(find.text('APPEARANCE'), findsOneWidget); }); } diff --git a/test/features/feed/cubit/post_action_cubit_test.dart b/test/features/feed/cubit/post_action_cubit_test.dart new file mode 100644 index 0000000..9d87cbf --- /dev/null +++ b/test/features/feed/cubit/post_action_cubit_test.dart @@ -0,0 +1,311 @@ +import 'package:atproto_core/atproto_core.dart'; +import 'package:bloc_test/bloc_test.dart'; +import 'package:flutter_test/flutter_test.dart'; +import 'package:lazurite/features/feed/cubit/post_action_cubit.dart'; +import 'package:lazurite/features/feed/data/post_action_repository.dart'; +import 'package:mocktail/mocktail.dart'; + +class MockPostActionRepository extends Mock implements PostActionRepository {} + +void main() { + late MockPostActionRepository mockRepository; + + setUpAll(() { + registerFallbackValue(AtUri.parse('at://did:plc:test/app.bsky.feed.post/fallback')); + }); + + setUp(() { + mockRepository = MockPostActionRepository(); + }); + + const testPostUri = 'at://did:plc:test/app.bsky.feed.post/abc123'; + const testPostCid = 'bafyreie5cvv4hhpwo4y6x4f4m6fsq3xrm5f3p5vzum5h5uv5x5x5x5x5x5'; + const testLikeUri = 'at://did:plc:test/app.bsky.feed.like/like456'; + const testRepostUri = 'at://did:plc:test/app.bsky.feed.repost/repost789'; + + group('PostActionCubit', () { + test('initial state has correct values', () { + final cubit = PostActionCubit(postActionRepository: mockRepository, postUri: testPostUri, postCid: testPostCid); + + expect(cubit.state.postUri, testPostUri); + expect(cubit.state.isLiked, isFalse); + expect(cubit.state.isReposted, isFalse); + expect(cubit.state.likeCount, 0); + expect(cubit.state.repostCount, 0); + expect(cubit.state.isLoadingLike, isFalse); + expect(cubit.state.isLoadingRepost, isFalse); + }); + + test('initial state respects provided values', () { + final cubit = PostActionCubit( + postActionRepository: mockRepository, + postUri: testPostUri, + postCid: testPostCid, + isLiked: true, + isReposted: true, + likeCount: 10, + repostCount: 5, + likeUri: testLikeUri, + repostUri: testRepostUri, + ); + + expect(cubit.state.isLiked, isTrue); + expect(cubit.state.isReposted, isTrue); + expect(cubit.state.likeCount, 10); + expect(cubit.state.repostCount, 5); + expect(cubit.state.likeUri, testLikeUri); + expect(cubit.state.repostUri, testRepostUri); + }); + + group('toggleLike', () { + blocTest( + 'emits loading state then liked state when liking', + build: () { + when( + () => mockRepository.likePost( + uri: any(named: 'uri'), + cid: any(named: 'cid'), + ), + ).thenAnswer((_) async => testLikeUri); + return PostActionCubit( + postActionRepository: mockRepository, + postUri: testPostUri, + postCid: testPostCid, + likeCount: 5, + ); + }, + act: (cubit) => cubit.toggleLike(), + expect: () => [ + isA() + .having((s) => s.isLiked, 'isLiked', isTrue) + .having((s) => s.likeCount, 'likeCount', 6) + .having((s) => s.isLoadingLike, 'isLoadingLike', isTrue) + .having((s) => s.error, 'error', isNull), + isA() + .having((s) => s.isLiked, 'isLiked', isTrue) + .having((s) => s.likeCount, 'likeCount', 6) + .having((s) => s.likeUri, 'likeUri', testLikeUri) + .having((s) => s.isLoadingLike, 'isLoadingLike', isFalse), + ], + ); + + blocTest( + 'emits loading state then unliked state when unliking', + build: () { + when(() => mockRepository.unlikePost(likeUri: testLikeUri)).thenAnswer((_) async => {}); + return PostActionCubit( + postActionRepository: mockRepository, + postUri: testPostUri, + postCid: testPostCid, + isLiked: true, + likeCount: 5, + likeUri: testLikeUri, + ); + }, + act: (cubit) => cubit.toggleLike(), + expect: () => [ + isA() + .having((s) => s.isLiked, 'isLiked', isFalse) + .having((s) => s.likeCount, 'likeCount', 4) + .having((s) => s.isLoadingLike, 'isLoadingLike', isTrue), + isA() + .having((s) => s.isLiked, 'isLiked', isFalse) + .having((s) => s.likeCount, 'likeCount', 4) + .having((s) => s.isLoadingLike, 'isLoadingLike', isFalse), + ], + ); + + blocTest( + 'rolls back state on like failure', + build: () { + when( + () => mockRepository.likePost( + uri: any(named: 'uri'), + cid: any(named: 'cid'), + ), + ).thenThrow(Exception('Network error')); + return PostActionCubit( + postActionRepository: mockRepository, + postUri: testPostUri, + postCid: testPostCid, + likeCount: 5, + ); + }, + act: (cubit) => cubit.toggleLike(), + expect: () => [ + isA() + .having((s) => s.isLiked, 'isLiked', isTrue) + .having((s) => s.likeCount, 'likeCount', 6) + .having((s) => s.isLoadingLike, 'isLoadingLike', isTrue), + isA() + .having((s) => s.isLiked, 'isLiked', isFalse) + .having((s) => s.likeCount, 'likeCount', 5) + .having((s) => s.isLoadingLike, 'isLoadingLike', isFalse) + .having((s) => s.error, 'error', 'Failed to like post'), + ], + ); + + blocTest( + 'does nothing when already loading like', + build: () => PostActionCubit(postActionRepository: mockRepository, postUri: testPostUri, postCid: testPostCid), + seed: () => const PostActionState(postUri: testPostUri, isLoadingLike: true), + act: (cubit) => cubit.toggleLike(), + expect: () => [], + ); + }); + + group('toggleRepost', () { + blocTest( + 'emits loading state then reposted state when reposting', + build: () { + when( + () => mockRepository.repostPost( + uri: any(named: 'uri'), + cid: any(named: 'cid'), + ), + ).thenAnswer((_) async => testRepostUri); + return PostActionCubit( + postActionRepository: mockRepository, + postUri: testPostUri, + postCid: testPostCid, + repostCount: 3, + ); + }, + act: (cubit) => cubit.toggleRepost(), + expect: () => [ + isA() + .having((s) => s.isReposted, 'isReposted', isTrue) + .having((s) => s.repostCount, 'repostCount', 4) + .having((s) => s.isLoadingRepost, 'isLoadingRepost', isTrue), + isA() + .having((s) => s.isReposted, 'isReposted', isTrue) + .having((s) => s.repostCount, 'repostCount', 4) + .having((s) => s.repostUri, 'repostUri', testRepostUri) + .having((s) => s.isLoadingRepost, 'isLoadingRepost', isFalse), + ], + ); + + blocTest( + 'emits loading state then unreposted state when unreposting', + build: () { + when(() => mockRepository.unrepostPost(repostUri: testRepostUri)).thenAnswer((_) async => {}); + return PostActionCubit( + postActionRepository: mockRepository, + postUri: testPostUri, + postCid: testPostCid, + isReposted: true, + repostCount: 3, + repostUri: testRepostUri, + ); + }, + act: (cubit) => cubit.toggleRepost(), + expect: () => [ + isA() + .having((s) => s.isReposted, 'isReposted', isFalse) + .having((s) => s.repostCount, 'repostCount', 2) + .having((s) => s.isLoadingRepost, 'isLoadingRepost', isTrue), + isA() + .having((s) => s.isReposted, 'isReposted', isFalse) + .having((s) => s.repostCount, 'repostCount', 2) + .having((s) => s.isLoadingRepost, 'isLoadingRepost', isFalse), + ], + ); + + blocTest( + 'rolls back state on repost failure', + build: () { + when( + () => mockRepository.repostPost( + uri: any(named: 'uri'), + cid: any(named: 'cid'), + ), + ).thenThrow(Exception('Network error')); + return PostActionCubit( + postActionRepository: mockRepository, + postUri: testPostUri, + postCid: testPostCid, + repostCount: 3, + ); + }, + act: (cubit) => cubit.toggleRepost(), + expect: () => [ + isA() + .having((s) => s.isReposted, 'isReposted', isTrue) + .having((s) => s.repostCount, 'repostCount', 4) + .having((s) => s.isLoadingRepost, 'isLoadingRepost', isTrue), + isA() + .having((s) => s.isReposted, 'isReposted', isFalse) + .having((s) => s.repostCount, 'repostCount', 3) + .having((s) => s.isLoadingRepost, 'isLoadingRepost', isFalse) + .having((s) => s.error, 'error', 'Failed to repost post'), + ], + ); + }); + + group('deletePost', () { + blocTest( + 'calls deletePost on repository', + build: () { + when(() => mockRepository.deletePost(postUri: testPostUri)).thenAnswer((_) async => {}); + return PostActionCubit(postActionRepository: mockRepository, postUri: testPostUri, postCid: testPostCid); + }, + act: (cubit) => cubit.deletePost(), + verify: (_) { + verify(() => mockRepository.deletePost(postUri: testPostUri)).called(1); + }, + ); + + blocTest( + 'emits error when delete fails', + build: () { + when(() => mockRepository.deletePost(postUri: testPostUri)).thenThrow(Exception('Network error')); + return PostActionCubit(postActionRepository: mockRepository, postUri: testPostUri, postCid: testPostCid); + }, + act: (cubit) => cubit.deletePost(), + expect: () => [isA().having((s) => s.error, 'error', 'Failed to delete post')], + ); + }); + }); + + group('PostActionState', () { + test('props includes all fields', () { + const state1 = PostActionState( + postUri: testPostUri, + isLiked: true, + isReposted: false, + likeCount: 5, + repostCount: 3, + likeUri: testLikeUri, + repostUri: testRepostUri, + isLoadingLike: true, + isLoadingRepost: false, + error: 'test error', + ); + + const state2 = PostActionState( + postUri: testPostUri, + isLiked: true, + isReposted: false, + likeCount: 5, + repostCount: 3, + likeUri: testLikeUri, + repostUri: testRepostUri, + isLoadingLike: true, + isLoadingRepost: false, + error: 'test error', + ); + + expect(state1, equals(state2)); + }); + + test('copyWith creates new instance with updated values', () { + const state = PostActionState(postUri: testPostUri, isLiked: false, likeCount: 0); + + final copied = state.copyWith(isLiked: true, likeCount: 1); + + expect(copied.isLiked, isTrue); + expect(copied.likeCount, 1); + expect(copied.postUri, testPostUri); + }); + }); +} diff --git a/test/features/feed/cubit/saved_posts_cubit_test.dart b/test/features/feed/cubit/saved_posts_cubit_test.dart new file mode 100644 index 0000000..a1fd504 --- /dev/null +++ b/test/features/feed/cubit/saved_posts_cubit_test.dart @@ -0,0 +1,248 @@ +import 'package:drift/drift.dart' hide isNull; +import 'package:drift/native.dart'; +import 'package:flutter_test/flutter_test.dart'; +import 'package:lazurite/core/database/app_database.dart'; +import 'package:lazurite/features/feed/cubit/saved_posts_cubit.dart'; + +void main() { + late AppDatabase database; + + const testAccountDid = 'did:plc:testuser123'; + const testPostUri1 = 'at://did:plc:author1/app.bsky.feed.post/abc123'; + const testPostUri2 = 'at://did:plc:author2/app.bsky.feed.post/def456'; + const testPostJson1 = '{"uri": "$testPostUri1", "text": "Post 1"}'; + const testPostJson2 = '{"uri": "$testPostUri2", "text": "Post 2"}'; + + setUp(() async { + database = AppDatabase(executor: NativeDatabase.memory()); + }); + + tearDown(() async { + await database.close(); + }); + + group('SavedPostsCubit', () { + test('initial state has correct values', () { + final cubit = SavedPostsCubit(database: database, accountDid: testAccountDid); + + expect(cubit.state.status, SavedPostsStatus.initial); + expect(cubit.state.savedPosts, isEmpty); + expect(cubit.state.savedUris, isEmpty); + expect(cubit.state.error, isNull); + }); + + group('loadSavedPosts', () { + test('loads empty list when no saved posts', () async { + final cubit = SavedPostsCubit(database: database, accountDid: testAccountDid); + + await cubit.loadSavedPosts(); + + expect(cubit.state.status, SavedPostsStatus.loaded); + expect(cubit.state.savedPosts, isEmpty); + }); + + test('loads saved posts from database', () async { + await database.savePost( + SavedPostsCompanion( + accountDid: const Value(testAccountDid), + postUri: const Value(testPostUri1), + postJson: const Value(testPostJson1), + savedAt: Value(DateTime.now()), + ), + ); + + final cubit = SavedPostsCubit(database: database, accountDid: testAccountDid); + + await cubit.loadSavedPosts(); + + expect(cubit.state.status, SavedPostsStatus.loaded); + expect(cubit.state.savedPosts.length, 1); + expect(cubit.state.savedUris.contains(testPostUri1), isTrue); + }); + }); + + group('toggleSave', () { + test('saves post when not saved', () async { + final cubit = SavedPostsCubit(database: database, accountDid: testAccountDid); + + await cubit.toggleSave(postUri: testPostUri1, postJson: testPostJson1); + + expect(cubit.state.savedPosts.length, 1); + expect(cubit.state.isSaved(testPostUri1), isTrue); + }); + + test('unsaves post when already saved', () async { + await database.savePost( + SavedPostsCompanion( + accountDid: const Value(testAccountDid), + postUri: const Value(testPostUri1), + postJson: const Value(testPostJson1), + savedAt: Value(DateTime.now()), + ), + ); + + final cubit = SavedPostsCubit(database: database, accountDid: testAccountDid); + + await cubit.loadSavedPosts(); + expect(cubit.state.savedPosts.length, 1); + + await cubit.toggleSave(postUri: testPostUri1, postJson: testPostJson1); + + expect(cubit.state.savedPosts.length, 0); + expect(cubit.state.isSaved(testPostUri1), isFalse); + }); + }); + + group('savePost', () { + test('saves post when not already saved', () async { + final cubit = SavedPostsCubit(database: database, accountDid: testAccountDid); + + final result = await cubit.savePost(postUri: testPostUri1, postJson: testPostJson1); + + expect(result, isTrue); + expect(cubit.state.savedPosts.length, 1); + }); + + test('returns true when already saved', () async { + await database.savePost( + SavedPostsCompanion( + accountDid: const Value(testAccountDid), + postUri: const Value(testPostUri1), + postJson: const Value(testPostJson1), + savedAt: Value(DateTime.now()), + ), + ); + + final cubit = SavedPostsCubit(database: database, accountDid: testAccountDid); + + await cubit.loadSavedPosts(); + final result = await cubit.savePost(postUri: testPostUri1, postJson: testPostJson1); + + expect(result, isTrue); + }); + }); + + group('unsavePost', () { + test('removes saved post', () async { + await database.savePost( + SavedPostsCompanion( + accountDid: const Value(testAccountDid), + postUri: const Value(testPostUri1), + postJson: const Value(testPostJson1), + savedAt: Value(DateTime.now()), + ), + ); + + final cubit = SavedPostsCubit(database: database, accountDid: testAccountDid); + + await cubit.loadSavedPosts(); + expect(cubit.state.savedPosts.length, 1); + + await cubit.unsavePost(testPostUri1); + + expect(cubit.state.savedPosts.length, 0); + }); + }); + + group('unsavePostById', () { + test('removes post by id', () async { + await database.savePost( + SavedPostsCompanion( + accountDid: const Value(testAccountDid), + postUri: const Value(testPostUri1), + postJson: const Value(testPostJson1), + savedAt: Value(DateTime.now()), + ), + ); + + final cubit = SavedPostsCubit(database: database, accountDid: testAccountDid); + + await cubit.loadSavedPosts(); + final posts = await database.getSavedPosts(testAccountDid); + + await cubit.unsavePostById(posts.first.id); + + expect(cubit.state.savedPosts.length, 0); + }); + }); + + group('clearAllSaved', () { + test('removes all saved posts', () async { + await database.savePost( + SavedPostsCompanion( + accountDid: const Value(testAccountDid), + postUri: const Value(testPostUri1), + postJson: const Value(testPostJson1), + savedAt: Value(DateTime.now()), + ), + ); + await database.savePost( + SavedPostsCompanion( + accountDid: const Value(testAccountDid), + postUri: const Value(testPostUri2), + postJson: const Value(testPostJson2), + savedAt: Value(DateTime.now()), + ), + ); + + final cubit = SavedPostsCubit(database: database, accountDid: testAccountDid); + + await cubit.loadSavedPosts(); + expect(cubit.state.savedPosts.length, 2); + + await cubit.clearAllSaved(); + + expect(cubit.state.savedPosts.length, 0); + expect(cubit.state.savedUris.length, 0); + }); + }); + + group('isSaved', () { + test('returns true when post is saved', () async { + final cubit = SavedPostsCubit(database: database, accountDid: testAccountDid); + + await cubit.savePost(postUri: testPostUri1, postJson: testPostJson1); + + expect(cubit.state.isSaved(testPostUri1), isTrue); + expect(cubit.state.isSaved(testPostUri2), isFalse); + }); + }); + + group('SavedPostsState', () { + test('props includes all fields', () { + const state1 = SavedPostsState( + status: SavedPostsStatus.loaded, + savedPosts: [], + savedUris: {}, + error: 'test error', + ); + + const state2 = SavedPostsState( + status: SavedPostsStatus.loaded, + savedPosts: [], + savedUris: {}, + error: 'test error', + ); + + expect(state1, equals(state2)); + }); + + test('copyWith creates new instance with updated values', () { + const state = SavedPostsState(status: SavedPostsStatus.initial, savedPosts: []); + + final copied = state.copyWith(status: SavedPostsStatus.loaded, error: 'New error'); + + expect(copied.status, SavedPostsStatus.loaded); + expect(copied.error, 'New error'); + expect(copied.savedPosts, isEmpty); + }); + + test('isSaved returns correct value', () { + const state = SavedPostsState(status: SavedPostsStatus.loaded, savedUris: {'uri1', 'uri2'}); + + expect(state.isSaved('uri1'), isTrue); + expect(state.isSaved('uri3'), isFalse); + }); + }); + }); +} diff --git a/test/features/feed/data/post_action_repository_test.dart b/test/features/feed/data/post_action_repository_test.dart new file mode 100644 index 0000000..0f7cbab --- /dev/null +++ b/test/features/feed/data/post_action_repository_test.dart @@ -0,0 +1,168 @@ +import 'package:flutter_test/flutter_test.dart'; +import 'package:lazurite/features/feed/data/post_action_repository.dart'; + +class MockPostActionRepository implements PostActionRepository { + final Map _likes = {}; + final Map _reposts = {}; + final Set _deletedPosts = {}; + + @override + Future likePost({required dynamic uri, required String cid}) async { + final likeUri = 'at://did:plc:test/app.bsky.feed.like/${uri.rkey}_like'; + _likes[uri.toString()] = likeUri; + return likeUri; + } + + @override + Future unlikePost({required String likeUri}) async { + _likes.removeWhere((key, value) => value == likeUri); + } + + @override + Future repostPost({required dynamic uri, required String cid}) async { + final repostUri = 'at://did:plc:test/app.bsky.feed.repost/${uri.rkey}_repost'; + _reposts[uri.toString()] = repostUri; + return repostUri; + } + + @override + Future unrepostPost({required String repostUri}) async { + _reposts.removeWhere((key, value) => value == repostUri); + } + + @override + Future deletePost({required String postUri}) async { + _deletedPosts.add(postUri); + } + + bool isLiked(String postUri) => _likes.containsKey(postUri); + bool isReposted(String postUri) => _reposts.containsKey(postUri); + bool isDeleted(String postUri) => _deletedPosts.contains(postUri); + String? getLikeUri(String postUri) => _likes[postUri]; + String? getRepostUri(String postUri) => _reposts[postUri]; +} + +void main() { + late MockPostActionRepository repository; + + setUp(() { + repository = MockPostActionRepository(); + }); + + group('PostActionRepository Contract', () { + const testCid = 'bafyreie5cvv4hhpwo4y6x4f4m6fsq3xrm5f3p5vzum5h5uv5x5x5x5x5x5'; + + group('likePost', () { + test('should return like URI when successful', () async { + final uri = _createTestUri('abc123'); + + final result = await repository.likePost(uri: uri, cid: testCid); + + expect(result, isNotNull); + expect(result, contains('app.bsky.feed.like')); + expect(repository.isLiked(uri.toString()), isTrue); + }); + + test('should return different URIs for different posts', () async { + final uri1 = _createTestUri('post1'); + final uri2 = _createTestUri('post2'); + + final result1 = await repository.likePost(uri: uri1, cid: testCid); + final result2 = await repository.likePost(uri: uri2, cid: testCid); + + expect(result1, isNot(equals(result2))); + }); + }); + + group('unlikePost', () { + test('should remove like record', () async { + final uri = _createTestUri('abc123'); + final likeUri = await repository.likePost(uri: uri, cid: testCid); + + expect(repository.isLiked(uri.toString()), isTrue); + + await repository.unlikePost(likeUri: likeUri); + + expect(repository.isLiked(uri.toString()), isFalse); + }); + }); + + group('repostPost', () { + test('should return repost URI when successful', () async { + final uri = _createTestUri('abc123'); + + final result = await repository.repostPost(uri: uri, cid: testCid); + + expect(result, isNotNull); + expect(result, contains('app.bsky.feed.repost')); + expect(repository.isReposted(uri.toString()), isTrue); + }); + + test('should return different URIs for different posts', () async { + final uri1 = _createTestUri('post1'); + final uri2 = _createTestUri('post2'); + + final result1 = await repository.repostPost(uri: uri1, cid: testCid); + final result2 = await repository.repostPost(uri: uri2, cid: testCid); + + expect(result1, isNot(equals(result2))); + }); + }); + + group('unrepostPost', () { + test('should remove repost record', () async { + final uri = _createTestUri('abc123'); + final repostUri = await repository.repostPost(uri: uri, cid: testCid); + + expect(repository.isReposted(uri.toString()), isTrue); + + await repository.unrepostPost(repostUri: repostUri); + + expect(repository.isReposted(uri.toString()), isFalse); + }); + }); + + group('deletePost', () { + test('should mark post as deleted', () async { + const postUri = 'at://did:plc:test/app.bsky.feed.post/to_delete'; + + expect(repository.isDeleted(postUri), isFalse); + + await repository.deletePost(postUri: postUri); + + expect(repository.isDeleted(postUri), isTrue); + }); + }); + + group('like and repost interaction', () { + test('should track likes and reposts independently', () async { + final uri = _createTestUri('abc123'); + + expect(repository.isLiked(uri.toString()), isFalse); + expect(repository.isReposted(uri.toString()), isFalse); + + await repository.likePost(uri: uri, cid: testCid); + expect(repository.isLiked(uri.toString()), isTrue); + expect(repository.isReposted(uri.toString()), isFalse); + + await repository.repostPost(uri: uri, cid: testCid); + expect(repository.isLiked(uri.toString()), isTrue); + expect(repository.isReposted(uri.toString()), isTrue); + }); + }); + }); +} + +dynamic _createTestUri(String rkey) { + return _MockAtUri('at://did:plc:test/app.bsky.feed.post/$rkey', rkey); +} + +class _MockAtUri { + _MockAtUri(this._uri, this.rkey); + + final String _uri; + final String rkey; + + @override + String toString() => _uri; +} diff --git a/test/features/profile/cubit/profile_action_cubit_test.dart b/test/features/profile/cubit/profile_action_cubit_test.dart new file mode 100644 index 0000000..8c87fe8 --- /dev/null +++ b/test/features/profile/cubit/profile_action_cubit_test.dart @@ -0,0 +1,411 @@ +import 'package:atproto/com_atproto_moderation_defs.dart'; +import 'package:atproto_core/atproto_core.dart'; +import 'package:bloc_test/bloc_test.dart'; +import 'package:flutter_test/flutter_test.dart'; +import 'package:lazurite/features/profile/cubit/profile_action_cubit.dart'; +import 'package:lazurite/features/profile/data/profile_action_repository.dart'; +import 'package:mocktail/mocktail.dart'; + +class MockProfileActionRepository extends Mock implements ProfileActionRepository {} + +void main() { + late MockProfileActionRepository mockRepository; + + setUpAll(() { + registerFallbackValue(AtUri.parse('at://did:plc:test/app.bsky.feed.post/fallback')); + registerFallbackValue(const ReasonType.knownValue(data: KnownReasonType.comAtprotoModerationDefsReasonSpam)); + }); + + setUp(() { + mockRepository = MockProfileActionRepository(); + }); + + const testActorDid = 'did:plc:testuser123'; + const testFollowUri = 'at://did:plc:test/app.bsky.graph.follow/follow456'; + const testBlockUri = 'at://did:plc:test/app.bsky.graph.block/block789'; + const testPostUri = 'at://did:plc:other/app.bsky.feed.post/abc123'; + const testCid = 'bafyreie5cvv4hhpwo4y6x4f4m6fsq3xrm5f3p5vzum5h5uv5x5x5x5x5x5'; + + group('ProfileActionCubit', () { + test('initial state has correct values', () { + final cubit = ProfileActionCubit(profileActionRepository: mockRepository, actorDid: testActorDid); + + expect(cubit.state.actorDid, testActorDid); + expect(cubit.state.isFollowing, isFalse); + expect(cubit.state.isMuted, isFalse); + expect(cubit.state.isBlocked, isFalse); + expect(cubit.state.isBlockedBy, isFalse); + expect(cubit.state.canShowActions, isTrue); + expect(cubit.state.isLoadingFollow, isFalse); + expect(cubit.state.isLoadingMute, isFalse); + expect(cubit.state.isLoadingBlock, isFalse); + }); + + test('initial state respects provided values', () { + final cubit = ProfileActionCubit( + profileActionRepository: mockRepository, + actorDid: testActorDid, + isFollowing: true, + isMuted: true, + isBlocked: true, + isBlockedBy: false, + followUri: testFollowUri, + blockUri: testBlockUri, + ); + + expect(cubit.state.isFollowing, isTrue); + expect(cubit.state.isMuted, isTrue); + expect(cubit.state.isBlocked, isTrue); + expect(cubit.state.followUri, testFollowUri); + expect(cubit.state.blockUri, testBlockUri); + }); + + test('canShowActions returns false when blockedBy', () { + final cubit = ProfileActionCubit( + profileActionRepository: mockRepository, + actorDid: testActorDid, + isBlockedBy: true, + ); + + expect(cubit.state.canShowActions, isFalse); + }); + + group('toggleFollow', () { + blocTest( + 'emits loading state then following state when following', + build: () { + when(() => mockRepository.followActor(did: testActorDid)).thenAnswer((_) async => testFollowUri); + return ProfileActionCubit(profileActionRepository: mockRepository, actorDid: testActorDid); + }, + act: (cubit) => cubit.toggleFollow(), + expect: () => [ + isA() + .having((s) => s.isFollowing, 'isFollowing', isTrue) + .having((s) => s.isLoadingFollow, 'isLoadingFollow', isTrue) + .having((s) => s.error, 'error', isNull), + isA() + .having((s) => s.isFollowing, 'isFollowing', isTrue) + .having((s) => s.followUri, 'followUri', testFollowUri) + .having((s) => s.isLoadingFollow, 'isLoadingFollow', isFalse), + ], + ); + + blocTest( + 'emits loading state then unfollowed state when unfollowing', + build: () { + when(() => mockRepository.unfollowActor(followUri: testFollowUri)).thenAnswer((_) async {}); + return ProfileActionCubit( + profileActionRepository: mockRepository, + actorDid: testActorDid, + isFollowing: true, + followUri: testFollowUri, + ); + }, + act: (cubit) => cubit.toggleFollow(), + expect: () => [ + isA() + .having((s) => s.isFollowing, 'isFollowing', isFalse) + .having((s) => s.isLoadingFollow, 'isLoadingFollow', isTrue), + isA() + .having((s) => s.isFollowing, 'isFollowing', isFalse) + .having((s) => s.isLoadingFollow, 'isLoadingFollow', isFalse), + ], + ); + + blocTest( + 'rolls back state on follow failure', + build: () { + when(() => mockRepository.followActor(did: testActorDid)).thenThrow(Exception('Network error')); + return ProfileActionCubit(profileActionRepository: mockRepository, actorDid: testActorDid); + }, + act: (cubit) => cubit.toggleFollow(), + expect: () => [ + isA() + .having((s) => s.isFollowing, 'isFollowing', isTrue) + .having((s) => s.isLoadingFollow, 'isLoadingFollow', isTrue), + isA() + .having((s) => s.isFollowing, 'isFollowing', isFalse) + .having((s) => s.isLoadingFollow, 'isLoadingFollow', isFalse) + .having((s) => s.error, 'error', 'Failed to follow user'), + ], + ); + + blocTest( + 'does nothing when blocked by user', + build: () => + ProfileActionCubit(profileActionRepository: mockRepository, actorDid: testActorDid, isBlockedBy: true), + act: (cubit) => cubit.toggleFollow(), + expect: () => [], + ); + + blocTest( + 'does nothing when already loading', + build: () => ProfileActionCubit(profileActionRepository: mockRepository, actorDid: testActorDid), + seed: () => const ProfileActionState(actorDid: testActorDid, isLoadingFollow: true), + act: (cubit) => cubit.toggleFollow(), + expect: () => [], + ); + }); + + group('toggleMute', () { + blocTest( + 'emits loading state then muted state when muting', + build: () { + when(() => mockRepository.muteActor(did: testActorDid)).thenAnswer((_) async {}); + return ProfileActionCubit(profileActionRepository: mockRepository, actorDid: testActorDid); + }, + act: (cubit) => cubit.toggleMute(), + expect: () => [ + isA() + .having((s) => s.isMuted, 'isMuted', isTrue) + .having((s) => s.isLoadingMute, 'isLoadingMute', isTrue), + isA() + .having((s) => s.isMuted, 'isMuted', isTrue) + .having((s) => s.isLoadingMute, 'isLoadingMute', isFalse), + ], + ); + + blocTest( + 'emits loading state then unmuted state when unmuting', + build: () { + when(() => mockRepository.unmuteActor(did: testActorDid)).thenAnswer((_) async {}); + return ProfileActionCubit(profileActionRepository: mockRepository, actorDid: testActorDid, isMuted: true); + }, + act: (cubit) => cubit.toggleMute(), + expect: () => [ + isA() + .having((s) => s.isMuted, 'isMuted', isFalse) + .having((s) => s.isLoadingMute, 'isLoadingMute', isTrue), + isA() + .having((s) => s.isMuted, 'isMuted', isFalse) + .having((s) => s.isLoadingMute, 'isLoadingMute', isFalse), + ], + ); + + blocTest( + 'rolls back state on mute failure', + build: () { + when(() => mockRepository.muteActor(did: testActorDid)).thenThrow(Exception('Network error')); + return ProfileActionCubit(profileActionRepository: mockRepository, actorDid: testActorDid); + }, + act: (cubit) => cubit.toggleMute(), + expect: () => [ + isA() + .having((s) => s.isMuted, 'isMuted', isTrue) + .having((s) => s.isLoadingMute, 'isLoadingMute', isTrue), + isA() + .having((s) => s.isMuted, 'isMuted', isFalse) + .having((s) => s.isLoadingMute, 'isLoadingMute', isFalse) + .having((s) => s.error, 'error', 'Failed to mute user'), + ], + ); + }); + + group('toggleBlock', () { + blocTest( + 'emits loading state then blocked state when blocking', + build: () { + when(() => mockRepository.blockActor(did: testActorDid)).thenAnswer((_) async => testBlockUri); + return ProfileActionCubit(profileActionRepository: mockRepository, actorDid: testActorDid); + }, + act: (cubit) => cubit.toggleBlock(), + expect: () => [ + isA() + .having((s) => s.isBlocked, 'isBlocked', isTrue) + .having((s) => s.isLoadingBlock, 'isLoadingBlock', isTrue), + isA() + .having((s) => s.isBlocked, 'isBlocked', isTrue) + .having((s) => s.blockUri, 'blockUri', testBlockUri) + .having((s) => s.isLoadingBlock, 'isLoadingBlock', isFalse), + ], + ); + + blocTest( + 'emits loading state then unblocked state when unblocking', + build: () { + when(() => mockRepository.unblockActor(blockUri: testBlockUri)).thenAnswer((_) async {}); + return ProfileActionCubit( + profileActionRepository: mockRepository, + actorDid: testActorDid, + isBlocked: true, + blockUri: testBlockUri, + ); + }, + act: (cubit) => cubit.toggleBlock(), + expect: () => [ + isA() + .having((s) => s.isBlocked, 'isBlocked', isFalse) + .having((s) => s.isLoadingBlock, 'isLoadingBlock', isTrue), + isA() + .having((s) => s.isBlocked, 'isBlocked', isFalse) + .having((s) => s.isLoadingBlock, 'isLoadingBlock', isFalse), + ], + ); + + blocTest( + 'rolls back state on block failure', + build: () { + when(() => mockRepository.blockActor(did: testActorDid)).thenThrow(Exception('Network error')); + return ProfileActionCubit(profileActionRepository: mockRepository, actorDid: testActorDid); + }, + act: (cubit) => cubit.toggleBlock(), + expect: () => [ + isA() + .having((s) => s.isBlocked, 'isBlocked', isTrue) + .having((s) => s.isLoadingBlock, 'isLoadingBlock', isTrue), + isA() + .having((s) => s.isBlocked, 'isBlocked', isFalse) + .having((s) => s.isLoadingBlock, 'isLoadingBlock', isFalse) + .having((s) => s.error, 'error', 'Failed to block user'), + ], + ); + }); + + group('reportPost', () { + blocTest( + 'returns report ID on success', + build: () { + when( + () => mockRepository.reportPost( + postUri: any(named: 'postUri'), + cid: any(named: 'cid'), + reasonType: any(named: 'reasonType'), + reason: any(named: 'reason'), + ), + ).thenAnswer((_) async => 'report_123'); + return ProfileActionCubit(profileActionRepository: mockRepository, actorDid: testActorDid); + }, + act: (cubit) async { + final result = await cubit.reportPost( + postUri: AtUri.parse(testPostUri), + cid: testCid, + reasonType: const ReasonType.knownValue(data: KnownReasonType.comAtprotoModerationDefsReasonSpam), + ); + expect(result, 'report_123'); + }, + verify: (_) { + verify( + () => mockRepository.reportPost( + postUri: any(named: 'postUri'), + cid: testCid, + reasonType: any(named: 'reasonType'), + reason: null, + ), + ).called(1); + }, + ); + + blocTest( + 'returns null and emits error on failure', + build: () { + when( + () => mockRepository.reportPost( + postUri: any(named: 'postUri'), + cid: any(named: 'cid'), + reasonType: any(named: 'reasonType'), + reason: any(named: 'reason'), + ), + ).thenThrow(Exception('Network error')); + return ProfileActionCubit(profileActionRepository: mockRepository, actorDid: testActorDid); + }, + act: (cubit) async { + final result = await cubit.reportPost( + postUri: AtUri.parse(testPostUri), + cid: testCid, + reasonType: const ReasonType.knownValue(data: KnownReasonType.comAtprotoModerationDefsReasonSpam), + ); + expect(result, isNull); + }, + expect: () => [isA().having((s) => s.error, 'error', 'Failed to report post')], + ); + }); + + group('reportActor', () { + blocTest( + 'returns report ID on success', + build: () { + when( + () => mockRepository.reportActor( + did: testActorDid, + reasonType: any(named: 'reasonType'), + reason: any(named: 'reason'), + ), + ).thenAnswer((_) async => 'report_456'); + return ProfileActionCubit(profileActionRepository: mockRepository, actorDid: testActorDid); + }, + act: (cubit) async { + final result = await cubit.reportActor( + reasonType: const ReasonType.knownValue(data: KnownReasonType.comAtprotoModerationDefsReasonViolation), + reason: 'Inappropriate content', + ); + expect(result, 'report_456'); + }, + ); + + blocTest( + 'returns null and emits error on failure', + build: () { + when( + () => mockRepository.reportActor( + did: testActorDid, + reasonType: any(named: 'reasonType'), + reason: any(named: 'reason'), + ), + ).thenThrow(Exception('Network error')); + return ProfileActionCubit(profileActionRepository: mockRepository, actorDid: testActorDid); + }, + act: (cubit) async { + final result = await cubit.reportActor( + reasonType: const ReasonType.knownValue(data: KnownReasonType.comAtprotoModerationDefsReasonViolation), + ); + expect(result, isNull); + }, + expect: () => [isA().having((s) => s.error, 'error', 'Failed to report user')], + ); + }); + + group('ProfileActionState', () { + test('props includes all fields', () { + const state1 = ProfileActionState( + actorDid: testActorDid, + isFollowing: true, + isMuted: true, + isBlocked: false, + isBlockedBy: true, + followUri: testFollowUri, + blockUri: testBlockUri, + isLoadingFollow: true, + isLoadingMute: false, + isLoadingBlock: true, + error: 'test error', + ); + + const state2 = ProfileActionState( + actorDid: testActorDid, + isFollowing: true, + isMuted: true, + isBlocked: false, + isBlockedBy: true, + followUri: testFollowUri, + blockUri: testBlockUri, + isLoadingFollow: true, + isLoadingMute: false, + isLoadingBlock: true, + error: 'test error', + ); + + expect(state1, equals(state2)); + }); + + test('copyWith creates new instance with updated values', () { + const state = ProfileActionState(actorDid: testActorDid, isFollowing: false); + + final copied = state.copyWith(isFollowing: true, followUri: testFollowUri); + + expect(copied.isFollowing, isTrue); + expect(copied.followUri, testFollowUri); + expect(copied.actorDid, testActorDid); + }); + }); + }); +} diff --git a/test/features/profile/data/profile_action_repository_test.dart b/test/features/profile/data/profile_action_repository_test.dart new file mode 100644 index 0000000..e69f2b2 --- /dev/null +++ b/test/features/profile/data/profile_action_repository_test.dart @@ -0,0 +1,229 @@ +import 'package:flutter_test/flutter_test.dart'; +import 'package:lazurite/features/profile/data/profile_action_repository.dart'; + +class MockProfileActionRepository implements ProfileActionRepository { + final Map _follows = {}; + final Map _blocks = {}; + final Set _mutes = {}; + final List> _reports = []; + + @override + Future followActor({required String did}) async { + final followUri = 'at://did:plc:test/app.bsky.graph.follow/${did}_follow'; + _follows[did] = followUri; + return followUri; + } + + @override + Future unfollowActor({required String followUri}) async { + _follows.removeWhere((key, value) => value == followUri); + } + + @override + Future muteActor({required String did}) async { + _mutes.add(did); + } + + @override + Future unmuteActor({required String did}) async { + _mutes.remove(did); + } + + @override + Future blockActor({required String did}) async { + final blockUri = 'at://did:plc:test/app.bsky.graph.block/${did}_block'; + _blocks[did] = blockUri; + return blockUri; + } + + @override + Future unblockActor({required String blockUri}) async { + _blocks.removeWhere((key, value) => value == blockUri); + } + + @override + Future reportPost({ + required dynamic postUri, + required String cid, + required dynamic reasonType, + String? reason, + }) async { + final reportId = 'report_${_reports.length}'; + _reports.add({ + 'id': reportId, + 'type': 'post', + 'uri': postUri.toString(), + 'cid': cid, + 'reasonType': reasonType.toString(), + 'reason': reason, + }); + return reportId; + } + + @override + Future reportActor({required String did, required dynamic reasonType, String? reason}) async { + final reportId = 'report_${_reports.length}'; + _reports.add({'id': reportId, 'type': 'actor', 'did': did, 'reasonType': reasonType.toString(), 'reason': reason}); + return reportId; + } + + bool isFollowing(String did) => _follows.containsKey(did); + bool isBlocked(String did) => _blocks.containsKey(did); + bool isMuted(String did) => _mutes.contains(did); + String? getFollowUri(String did) => _follows[did]; + String? getBlockUri(String did) => _blocks[did]; + int get reportCount => _reports.length; +} + +void main() { + late MockProfileActionRepository repository; + + setUp(() { + repository = MockProfileActionRepository(); + }); + + const testDid = 'did:plc:testuser123'; + const testPostUri = 'at://did:plc:other/app.bsky.feed.post/abc123'; + const testCid = 'bafyreie5cvv4hhpwo4y6x4f4m6fsq3xrm5f3p5vzum5h5uv5x5x5x5x5x5'; + + group('ProfileActionRepository Contract', () { + group('followActor', () { + test('should return follow URI when successful', () async { + final result = await repository.followActor(did: testDid); + + expect(result, isNotNull); + expect(result, contains('app.bsky.graph.follow')); + expect(repository.isFollowing(testDid), isTrue); + }); + + test('should return different URIs for different actors', () async { + const did1 = 'did:plc:user1'; + const did2 = 'did:plc:user2'; + + final result1 = await repository.followActor(did: did1); + final result2 = await repository.followActor(did: did2); + + expect(result1, isNot(equals(result2))); + }); + }); + + group('unfollowActor', () { + test('should remove follow relationship', () async { + final followUri = await repository.followActor(did: testDid); + expect(repository.isFollowing(testDid), isTrue); + + await repository.unfollowActor(followUri: followUri); + + expect(repository.isFollowing(testDid), isFalse); + }); + }); + + group('muteActor', () { + test('should mute actor', () async { + expect(repository.isMuted(testDid), isFalse); + + await repository.muteActor(did: testDid); + + expect(repository.isMuted(testDid), isTrue); + }); + }); + + group('unmuteActor', () { + test('should unmute actor', () async { + await repository.muteActor(did: testDid); + expect(repository.isMuted(testDid), isTrue); + + await repository.unmuteActor(did: testDid); + + expect(repository.isMuted(testDid), isFalse); + }); + }); + + group('blockActor', () { + test('should return block URI when successful', () async { + final result = await repository.blockActor(did: testDid); + + expect(result, isNotNull); + expect(result, contains('app.bsky.graph.block')); + expect(repository.isBlocked(testDid), isTrue); + }); + }); + + group('unblockActor', () { + test('should remove block relationship', () async { + final blockUri = await repository.blockActor(did: testDid); + expect(repository.isBlocked(testDid), isTrue); + + await repository.unblockActor(blockUri: blockUri); + + expect(repository.isBlocked(testDid), isFalse); + }); + }); + + group('reportPost', () { + test('should create post report and return report ID', () async { + final reportId = await repository.reportPost(postUri: testPostUri, cid: testCid, reasonType: 'reasonSpam'); + + expect(reportId, isNotNull); + expect(reportId, startsWith('report_')); + expect(repository.reportCount, 1); + }); + + test('should include reason in report', () async { + await repository.reportPost( + postUri: testPostUri, + cid: testCid, + reasonType: 'reasonOther', + reason: 'This is inappropriate', + ); + + expect(repository.reportCount, 1); + }); + }); + + group('reportActor', () { + test('should create actor report and return report ID', () async { + final reportId = await repository.reportActor(did: testDid, reasonType: 'reasonSpam'); + + expect(reportId, isNotNull); + expect(reportId, startsWith('report_')); + expect(repository.reportCount, 1); + }); + + test('should include reason in actor report', () async { + await repository.reportActor( + did: testDid, + reasonType: 'reasonViolation', + reason: 'Violating community guidelines', + ); + + expect(repository.reportCount, 1); + }); + }); + + group('action independence', () { + test('follow and block should be independent', () async { + expect(repository.isFollowing(testDid), isFalse); + expect(repository.isBlocked(testDid), isFalse); + + await repository.followActor(did: testDid); + expect(repository.isFollowing(testDid), isTrue); + expect(repository.isBlocked(testDid), isFalse); + + await repository.blockActor(did: testDid); + expect(repository.isFollowing(testDid), isTrue); + expect(repository.isBlocked(testDid), isTrue); + }); + + test('mute should not affect follow/block status', () async { + await repository.followActor(did: testDid); + expect(repository.isFollowing(testDid), isTrue); + expect(repository.isMuted(testDid), isFalse); + + await repository.muteActor(did: testDid); + expect(repository.isFollowing(testDid), isTrue); + expect(repository.isMuted(testDid), isTrue); + }); + }); + }); +}