CacheInterceptor кэширует каждый успешный GET по путь+параметры в drift (sqlite нативно, wasm+OPFS в браузере) и подменяет им сетевую ошибку; провайдер отдаёт Cached<T>, экран показывает баннер «данные на …». Контракт для остальных экранов — docs/ai/offline-cache.md. flake.nix: libsecret/pkg-config для линуксовой сборки, jq/curl для just app-web-assets (сборка sqlite3.wasm + drift_worker.js).
479 lines
15 KiB
Dart
479 lines
15 KiB
Dart
// GENERATED CODE - DO NOT MODIFY BY HAND
|
|
|
|
part of 'response_cache.dart';
|
|
|
|
// ignore_for_file: type=lint
|
|
class $CachedResponsesTable extends CachedResponses
|
|
with TableInfo<$CachedResponsesTable, CachedResponse> {
|
|
@override
|
|
final GeneratedDatabase attachedDatabase;
|
|
final String? _alias;
|
|
$CachedResponsesTable(this.attachedDatabase, [this._alias]);
|
|
static const VerificationMeta _requestKeyMeta = const VerificationMeta(
|
|
'requestKey',
|
|
);
|
|
@override
|
|
late final GeneratedColumn<String> requestKey = GeneratedColumn<String>(
|
|
'request_key',
|
|
aliasedName,
|
|
false,
|
|
type: DriftSqlType.string,
|
|
requiredDuringInsert: true,
|
|
);
|
|
static const VerificationMeta _bodyMeta = const VerificationMeta('body');
|
|
@override
|
|
late final GeneratedColumn<String> body = GeneratedColumn<String>(
|
|
'body',
|
|
aliasedName,
|
|
false,
|
|
type: DriftSqlType.string,
|
|
requiredDuringInsert: true,
|
|
);
|
|
static const VerificationMeta _fetchedAtMeta = const VerificationMeta(
|
|
'fetchedAt',
|
|
);
|
|
@override
|
|
late final GeneratedColumn<DateTime> fetchedAt = GeneratedColumn<DateTime>(
|
|
'fetched_at',
|
|
aliasedName,
|
|
false,
|
|
type: DriftSqlType.dateTime,
|
|
requiredDuringInsert: true,
|
|
);
|
|
@override
|
|
List<GeneratedColumn> get $columns => [requestKey, body, fetchedAt];
|
|
@override
|
|
String get aliasedName => _alias ?? actualTableName;
|
|
@override
|
|
String get actualTableName => $name;
|
|
static const String $name = 'cached_responses';
|
|
@override
|
|
VerificationContext validateIntegrity(
|
|
Insertable<CachedResponse> instance, {
|
|
bool isInserting = false,
|
|
}) {
|
|
final context = VerificationContext();
|
|
final data = instance.toColumns(true);
|
|
if (data.containsKey('request_key')) {
|
|
context.handle(
|
|
_requestKeyMeta,
|
|
requestKey.isAcceptableOrUnknown(data['request_key']!, _requestKeyMeta),
|
|
);
|
|
} else if (isInserting) {
|
|
context.missing(_requestKeyMeta);
|
|
}
|
|
if (data.containsKey('body')) {
|
|
context.handle(
|
|
_bodyMeta,
|
|
body.isAcceptableOrUnknown(data['body']!, _bodyMeta),
|
|
);
|
|
} else if (isInserting) {
|
|
context.missing(_bodyMeta);
|
|
}
|
|
if (data.containsKey('fetched_at')) {
|
|
context.handle(
|
|
_fetchedAtMeta,
|
|
fetchedAt.isAcceptableOrUnknown(data['fetched_at']!, _fetchedAtMeta),
|
|
);
|
|
} else if (isInserting) {
|
|
context.missing(_fetchedAtMeta);
|
|
}
|
|
return context;
|
|
}
|
|
|
|
@override
|
|
Set<GeneratedColumn> get $primaryKey => {requestKey};
|
|
@override
|
|
CachedResponse map(Map<String, dynamic> data, {String? tablePrefix}) {
|
|
final effectivePrefix = tablePrefix != null ? '$tablePrefix.' : '';
|
|
return CachedResponse(
|
|
requestKey: attachedDatabase.typeMapping.read(
|
|
DriftSqlType.string,
|
|
data['${effectivePrefix}request_key'],
|
|
)!,
|
|
body: attachedDatabase.typeMapping.read(
|
|
DriftSqlType.string,
|
|
data['${effectivePrefix}body'],
|
|
)!,
|
|
fetchedAt: attachedDatabase.typeMapping.read(
|
|
DriftSqlType.dateTime,
|
|
data['${effectivePrefix}fetched_at'],
|
|
)!,
|
|
);
|
|
}
|
|
|
|
@override
|
|
$CachedResponsesTable createAlias(String alias) {
|
|
return $CachedResponsesTable(attachedDatabase, alias);
|
|
}
|
|
}
|
|
|
|
class CachedResponse extends DataClass implements Insertable<CachedResponse> {
|
|
final String requestKey;
|
|
final String body;
|
|
final DateTime fetchedAt;
|
|
const CachedResponse({
|
|
required this.requestKey,
|
|
required this.body,
|
|
required this.fetchedAt,
|
|
});
|
|
@override
|
|
Map<String, Expression> toColumns(bool nullToAbsent) {
|
|
final map = <String, Expression>{};
|
|
map['request_key'] = Variable<String>(requestKey);
|
|
map['body'] = Variable<String>(body);
|
|
map['fetched_at'] = Variable<DateTime>(fetchedAt);
|
|
return map;
|
|
}
|
|
|
|
CachedResponsesCompanion toCompanion(bool nullToAbsent) {
|
|
return CachedResponsesCompanion(
|
|
requestKey: Value(requestKey),
|
|
body: Value(body),
|
|
fetchedAt: Value(fetchedAt),
|
|
);
|
|
}
|
|
|
|
factory CachedResponse.fromJson(
|
|
Map<String, dynamic> json, {
|
|
ValueSerializer? serializer,
|
|
}) {
|
|
serializer ??= driftRuntimeOptions.defaultSerializer;
|
|
return CachedResponse(
|
|
requestKey: serializer.fromJson<String>(json['requestKey']),
|
|
body: serializer.fromJson<String>(json['body']),
|
|
fetchedAt: serializer.fromJson<DateTime>(json['fetchedAt']),
|
|
);
|
|
}
|
|
@override
|
|
Map<String, dynamic> toJson({ValueSerializer? serializer}) {
|
|
serializer ??= driftRuntimeOptions.defaultSerializer;
|
|
return <String, dynamic>{
|
|
'requestKey': serializer.toJson<String>(requestKey),
|
|
'body': serializer.toJson<String>(body),
|
|
'fetchedAt': serializer.toJson<DateTime>(fetchedAt),
|
|
};
|
|
}
|
|
|
|
CachedResponse copyWith({
|
|
String? requestKey,
|
|
String? body,
|
|
DateTime? fetchedAt,
|
|
}) => CachedResponse(
|
|
requestKey: requestKey ?? this.requestKey,
|
|
body: body ?? this.body,
|
|
fetchedAt: fetchedAt ?? this.fetchedAt,
|
|
);
|
|
CachedResponse copyWithCompanion(CachedResponsesCompanion data) {
|
|
return CachedResponse(
|
|
requestKey: data.requestKey.present
|
|
? data.requestKey.value
|
|
: this.requestKey,
|
|
body: data.body.present ? data.body.value : this.body,
|
|
fetchedAt: data.fetchedAt.present ? data.fetchedAt.value : this.fetchedAt,
|
|
);
|
|
}
|
|
|
|
@override
|
|
String toString() {
|
|
return (StringBuffer('CachedResponse(')
|
|
..write('requestKey: $requestKey, ')
|
|
..write('body: $body, ')
|
|
..write('fetchedAt: $fetchedAt')
|
|
..write(')'))
|
|
.toString();
|
|
}
|
|
|
|
@override
|
|
int get hashCode => Object.hash(requestKey, body, fetchedAt);
|
|
@override
|
|
bool operator ==(Object other) =>
|
|
identical(this, other) ||
|
|
(other is CachedResponse &&
|
|
other.requestKey == this.requestKey &&
|
|
other.body == this.body &&
|
|
other.fetchedAt == this.fetchedAt);
|
|
}
|
|
|
|
class CachedResponsesCompanion extends UpdateCompanion<CachedResponse> {
|
|
final Value<String> requestKey;
|
|
final Value<String> body;
|
|
final Value<DateTime> fetchedAt;
|
|
final Value<int> rowid;
|
|
const CachedResponsesCompanion({
|
|
this.requestKey = const Value.absent(),
|
|
this.body = const Value.absent(),
|
|
this.fetchedAt = const Value.absent(),
|
|
this.rowid = const Value.absent(),
|
|
});
|
|
CachedResponsesCompanion.insert({
|
|
required String requestKey,
|
|
required String body,
|
|
required DateTime fetchedAt,
|
|
this.rowid = const Value.absent(),
|
|
}) : requestKey = Value(requestKey),
|
|
body = Value(body),
|
|
fetchedAt = Value(fetchedAt);
|
|
static Insertable<CachedResponse> custom({
|
|
Expression<String>? requestKey,
|
|
Expression<String>? body,
|
|
Expression<DateTime>? fetchedAt,
|
|
Expression<int>? rowid,
|
|
}) {
|
|
return RawValuesInsertable({
|
|
if (requestKey != null) 'request_key': requestKey,
|
|
if (body != null) 'body': body,
|
|
if (fetchedAt != null) 'fetched_at': fetchedAt,
|
|
if (rowid != null) 'rowid': rowid,
|
|
});
|
|
}
|
|
|
|
CachedResponsesCompanion copyWith({
|
|
Value<String>? requestKey,
|
|
Value<String>? body,
|
|
Value<DateTime>? fetchedAt,
|
|
Value<int>? rowid,
|
|
}) {
|
|
return CachedResponsesCompanion(
|
|
requestKey: requestKey ?? this.requestKey,
|
|
body: body ?? this.body,
|
|
fetchedAt: fetchedAt ?? this.fetchedAt,
|
|
rowid: rowid ?? this.rowid,
|
|
);
|
|
}
|
|
|
|
@override
|
|
Map<String, Expression> toColumns(bool nullToAbsent) {
|
|
final map = <String, Expression>{};
|
|
if (requestKey.present) {
|
|
map['request_key'] = Variable<String>(requestKey.value);
|
|
}
|
|
if (body.present) {
|
|
map['body'] = Variable<String>(body.value);
|
|
}
|
|
if (fetchedAt.present) {
|
|
map['fetched_at'] = Variable<DateTime>(fetchedAt.value);
|
|
}
|
|
if (rowid.present) {
|
|
map['rowid'] = Variable<int>(rowid.value);
|
|
}
|
|
return map;
|
|
}
|
|
|
|
@override
|
|
String toString() {
|
|
return (StringBuffer('CachedResponsesCompanion(')
|
|
..write('requestKey: $requestKey, ')
|
|
..write('body: $body, ')
|
|
..write('fetchedAt: $fetchedAt, ')
|
|
..write('rowid: $rowid')
|
|
..write(')'))
|
|
.toString();
|
|
}
|
|
}
|
|
|
|
abstract class _$ResponseCacheDatabase extends GeneratedDatabase {
|
|
_$ResponseCacheDatabase(QueryExecutor e) : super(e);
|
|
$ResponseCacheDatabaseManager get managers =>
|
|
$ResponseCacheDatabaseManager(this);
|
|
late final $CachedResponsesTable cachedResponses = $CachedResponsesTable(
|
|
this,
|
|
);
|
|
@override
|
|
Iterable<TableInfo<Table, Object?>> get allTables =>
|
|
allSchemaEntities.whereType<TableInfo<Table, Object?>>();
|
|
@override
|
|
List<DatabaseSchemaEntity> get allSchemaEntities => [cachedResponses];
|
|
}
|
|
|
|
typedef $$CachedResponsesTableCreateCompanionBuilder =
|
|
CachedResponsesCompanion Function({
|
|
required String requestKey,
|
|
required String body,
|
|
required DateTime fetchedAt,
|
|
Value<int> rowid,
|
|
});
|
|
typedef $$CachedResponsesTableUpdateCompanionBuilder =
|
|
CachedResponsesCompanion Function({
|
|
Value<String> requestKey,
|
|
Value<String> body,
|
|
Value<DateTime> fetchedAt,
|
|
Value<int> rowid,
|
|
});
|
|
|
|
class $$CachedResponsesTableFilterComposer
|
|
extends Composer<_$ResponseCacheDatabase, $CachedResponsesTable> {
|
|
$$CachedResponsesTableFilterComposer({
|
|
required super.$db,
|
|
required super.$table,
|
|
super.joinBuilder,
|
|
super.$addJoinBuilderToRootComposer,
|
|
super.$removeJoinBuilderFromRootComposer,
|
|
});
|
|
ColumnFilters<String> get requestKey => $composableBuilder(
|
|
column: $table.requestKey,
|
|
builder: (column) => ColumnFilters(column),
|
|
);
|
|
|
|
ColumnFilters<String> get body => $composableBuilder(
|
|
column: $table.body,
|
|
builder: (column) => ColumnFilters(column),
|
|
);
|
|
|
|
ColumnFilters<DateTime> get fetchedAt => $composableBuilder(
|
|
column: $table.fetchedAt,
|
|
builder: (column) => ColumnFilters(column),
|
|
);
|
|
}
|
|
|
|
class $$CachedResponsesTableOrderingComposer
|
|
extends Composer<_$ResponseCacheDatabase, $CachedResponsesTable> {
|
|
$$CachedResponsesTableOrderingComposer({
|
|
required super.$db,
|
|
required super.$table,
|
|
super.joinBuilder,
|
|
super.$addJoinBuilderToRootComposer,
|
|
super.$removeJoinBuilderFromRootComposer,
|
|
});
|
|
ColumnOrderings<String> get requestKey => $composableBuilder(
|
|
column: $table.requestKey,
|
|
builder: (column) => ColumnOrderings(column),
|
|
);
|
|
|
|
ColumnOrderings<String> get body => $composableBuilder(
|
|
column: $table.body,
|
|
builder: (column) => ColumnOrderings(column),
|
|
);
|
|
|
|
ColumnOrderings<DateTime> get fetchedAt => $composableBuilder(
|
|
column: $table.fetchedAt,
|
|
builder: (column) => ColumnOrderings(column),
|
|
);
|
|
}
|
|
|
|
class $$CachedResponsesTableAnnotationComposer
|
|
extends Composer<_$ResponseCacheDatabase, $CachedResponsesTable> {
|
|
$$CachedResponsesTableAnnotationComposer({
|
|
required super.$db,
|
|
required super.$table,
|
|
super.joinBuilder,
|
|
super.$addJoinBuilderToRootComposer,
|
|
super.$removeJoinBuilderFromRootComposer,
|
|
});
|
|
GeneratedColumn<String> get requestKey => $composableBuilder(
|
|
column: $table.requestKey,
|
|
builder: (column) => column,
|
|
);
|
|
|
|
GeneratedColumn<String> get body =>
|
|
$composableBuilder(column: $table.body, builder: (column) => column);
|
|
|
|
GeneratedColumn<DateTime> get fetchedAt =>
|
|
$composableBuilder(column: $table.fetchedAt, builder: (column) => column);
|
|
}
|
|
|
|
class $$CachedResponsesTableTableManager
|
|
extends
|
|
RootTableManager<
|
|
_$ResponseCacheDatabase,
|
|
$CachedResponsesTable,
|
|
CachedResponse,
|
|
$$CachedResponsesTableFilterComposer,
|
|
$$CachedResponsesTableOrderingComposer,
|
|
$$CachedResponsesTableAnnotationComposer,
|
|
$$CachedResponsesTableCreateCompanionBuilder,
|
|
$$CachedResponsesTableUpdateCompanionBuilder,
|
|
(
|
|
CachedResponse,
|
|
BaseReferences<
|
|
_$ResponseCacheDatabase,
|
|
$CachedResponsesTable,
|
|
CachedResponse
|
|
>,
|
|
),
|
|
CachedResponse,
|
|
PrefetchHooks Function()
|
|
> {
|
|
$$CachedResponsesTableTableManager(
|
|
_$ResponseCacheDatabase db,
|
|
$CachedResponsesTable table,
|
|
) : super(
|
|
TableManagerState(
|
|
db: db,
|
|
table: table,
|
|
createFilteringComposer: () =>
|
|
$$CachedResponsesTableFilterComposer($db: db, $table: table),
|
|
createOrderingComposer: () =>
|
|
$$CachedResponsesTableOrderingComposer($db: db, $table: table),
|
|
createComputedFieldComposer: () =>
|
|
$$CachedResponsesTableAnnotationComposer($db: db, $table: table),
|
|
updateCompanionCallback:
|
|
({
|
|
Value<String> requestKey = const Value.absent(),
|
|
Value<String> body = const Value.absent(),
|
|
Value<DateTime> fetchedAt = const Value.absent(),
|
|
Value<int> rowid = const Value.absent(),
|
|
}) => CachedResponsesCompanion(
|
|
requestKey: requestKey,
|
|
body: body,
|
|
fetchedAt: fetchedAt,
|
|
rowid: rowid,
|
|
),
|
|
createCompanionCallback:
|
|
({
|
|
required String requestKey,
|
|
required String body,
|
|
required DateTime fetchedAt,
|
|
Value<int> rowid = const Value.absent(),
|
|
}) => CachedResponsesCompanion.insert(
|
|
requestKey: requestKey,
|
|
body: body,
|
|
fetchedAt: fetchedAt,
|
|
rowid: rowid,
|
|
),
|
|
withReferenceMapper: (p0) => p0
|
|
.map(
|
|
(e) => (
|
|
e.readTable<$CachedResponsesTable, CachedResponse>(table),
|
|
BaseReferences<
|
|
_$ResponseCacheDatabase,
|
|
$CachedResponsesTable,
|
|
CachedResponse
|
|
>(db, table, e),
|
|
),
|
|
)
|
|
.toList(),
|
|
prefetchHooksCallback: null,
|
|
),
|
|
);
|
|
}
|
|
|
|
typedef $$CachedResponsesTableProcessedTableManager =
|
|
ProcessedTableManager<
|
|
_$ResponseCacheDatabase,
|
|
$CachedResponsesTable,
|
|
CachedResponse,
|
|
$$CachedResponsesTableFilterComposer,
|
|
$$CachedResponsesTableOrderingComposer,
|
|
$$CachedResponsesTableAnnotationComposer,
|
|
$$CachedResponsesTableCreateCompanionBuilder,
|
|
$$CachedResponsesTableUpdateCompanionBuilder,
|
|
(
|
|
CachedResponse,
|
|
BaseReferences<
|
|
_$ResponseCacheDatabase,
|
|
$CachedResponsesTable,
|
|
CachedResponse
|
|
>,
|
|
),
|
|
CachedResponse,
|
|
PrefetchHooks Function()
|
|
>;
|
|
|
|
class $ResponseCacheDatabaseManager {
|
|
final _$ResponseCacheDatabase _db;
|
|
$ResponseCacheDatabaseManager(this._db);
|
|
$$CachedResponsesTableTableManager get cachedResponses =>
|
|
$$CachedResponsesTableTableManager(_db, _db.cachedResponses);
|
|
}
|