worldhopper/lib/models/publication.g.dart
Felipe M. 58a562abe8
feat: refactor server software abstraction with Kavita REST API integration
Rename all OPDS-prefixed models to generic names (Server, Feed, Entry,
Link, StreamLink), expand the ServerSoftware interface to cover all
server interactions, and implement a full Kavita REST API client that
replaces the OPDS delegation.

- Rename OPDS* models to generic names across ~60 files
- Add database migrations 13 (opds_id → entry_id) and 14 (unify credentials)
- Create OPDSServerSoftware wrapping existing OPDS services
- Create KavitaApiClient for direct Kavita REST API calls
- Create KavitaFeedMapper to convert Kavita JSON to Feed/Entry models
- Rewrite KavitaServerSoftware to use native API (no OPDS delegation)
- Unify server credentials (remove softwareUsername/softwarePassword)
- Simplify add/edit server UI to single auth section
- Add test connection button to server add/edit screens
- Add progress indicator to PublicationCard using local and server data
- Eliminate softwareType branching in reader screens
- Add EntryProgress and fetchEntryProgress to ServerSoftware interface
- Fix Entry.acquisitionLink crash on empty links
- Add 59 new tests covering models, services, and providers
2026-04-06 17:46:48 +02:00

78 lines
3.1 KiB
Dart

// GENERATED CODE - DO NOT MODIFY BY HAND
part of 'publication.dart';
// **************************************************************************
// JsonSerializableGenerator
// **************************************************************************
_$PublicationImpl _$$PublicationImplFromJson(Map<String, dynamic> json) =>
_$PublicationImpl(
id: json['id'] as String,
serverId: json['serverId'] as String,
entryId: json['entryId'] as String,
title: json['title'] as String,
authors: (json['authors'] as List<dynamic>?)
?.map((e) => e as String)
.toList() ??
const [],
summary: json['summary'] as String?,
content: json['content'] as String?,
coverPath: json['coverPath'] as String?,
thumbnailPath: json['thumbnailPath'] as String?,
coverUrl: json['coverUrl'] as String?,
thumbnailUrl: json['thumbnailUrl'] as String?,
series: json['series'] as String?,
seriesPosition: (json['seriesPosition'] as num?)?.toDouble(),
publisher: json['publisher'] as String?,
language: json['language'] as String?,
isbn: json['isbn'] as String?,
categories: (json['categories'] as List<dynamic>?)
?.map((e) => e as String)
.toList() ??
const [],
links: (json['links'] as List<dynamic>?)
?.map((e) => Link.fromJson(e as Map<String, dynamic>))
.toList() ??
const [],
streamLink: json['streamLink'] == null
? null
: StreamLink.fromJson(json['streamLink'] as Map<String, dynamic>),
published: json['published'] == null
? null
: DateTime.parse(json['published'] as String),
updated: json['updated'] == null
? null
: DateTime.parse(json['updated'] as String),
firstCachedAt: DateTime.parse(json['firstCachedAt'] as String),
lastCachedAt: DateTime.parse(json['lastCachedAt'] as String),
lastAccessedAt: DateTime.parse(json['lastAccessedAt'] as String),
);
Map<String, dynamic> _$$PublicationImplToJson(_$PublicationImpl instance) =>
<String, dynamic>{
'id': instance.id,
'serverId': instance.serverId,
'entryId': instance.entryId,
'title': instance.title,
'authors': instance.authors,
'summary': instance.summary,
'content': instance.content,
'coverPath': instance.coverPath,
'thumbnailPath': instance.thumbnailPath,
'coverUrl': instance.coverUrl,
'thumbnailUrl': instance.thumbnailUrl,
'series': instance.series,
'seriesPosition': instance.seriesPosition,
'publisher': instance.publisher,
'language': instance.language,
'isbn': instance.isbn,
'categories': instance.categories,
'links': instance.links,
'streamLink': instance.streamLink,
'published': instance.published?.toIso8601String(),
'updated': instance.updated?.toIso8601String(),
'firstCachedAt': instance.firstCachedAt.toIso8601String(),
'lastCachedAt': instance.lastCachedAt.toIso8601String(),
'lastAccessedAt': instance.lastAccessedAt.toIso8601String(),
};