fix history manga id and added feed list schema

This commit is contained in:
Schnitzel5 2024-09-11 00:42:24 +02:00
parent 4ad1472112
commit 45a0d5c9db
7 changed files with 637 additions and 3 deletions

33
lib/models/feed.dart Normal file
View file

@ -0,0 +1,33 @@
import 'package:isar/isar.dart';
import 'package:mangayomi/models/chapter.dart';
part 'feed.g.dart';
@collection
@Name("Feed")
class Feed {
Id? id;
int? mangaId;
final chapter = IsarLink<Chapter>();
String? date;
Feed({
this.id = Isar.autoIncrement,
required this.mangaId,
required this.date,
});
Feed.fromJson(Map<String, dynamic> json) {
id = json['id'];
mangaId = json['mangaId'];
date = json['date'];
}
Map<String, dynamic> toJson() => {
'id': id,
'mangaId': mangaId,
'date': date,
};
}

591
lib/models/feed.g.dart Normal file
View file

@ -0,0 +1,591 @@
// GENERATED CODE - DO NOT MODIFY BY HAND
part of 'feed.dart';
// **************************************************************************
// IsarCollectionGenerator
// **************************************************************************
// coverage:ignore-file
// ignore_for_file: duplicate_ignore, non_constant_identifier_names, constant_identifier_names, invalid_use_of_protected_member, unnecessary_cast, prefer_const_constructors, lines_longer_than_80_chars, require_trailing_commas, inference_failure_on_function_invocation, unnecessary_parenthesis, unnecessary_raw_strings, unnecessary_null_checks, join_return_with_assignment, prefer_final_locals, avoid_js_rounded_ints, avoid_positional_boolean_parameters, always_specify_types
extension GetFeedCollection on Isar {
IsarCollection<Feed> get feeds => this.collection();
}
const FeedSchema = CollectionSchema(
name: r'Feed',
id: 8879644747771893978,
properties: {
r'date': PropertySchema(
id: 0,
name: r'date',
type: IsarType.string,
),
r'mangaId': PropertySchema(
id: 1,
name: r'mangaId',
type: IsarType.long,
)
},
estimateSize: _feedEstimateSize,
serialize: _feedSerialize,
deserialize: _feedDeserialize,
deserializeProp: _feedDeserializeProp,
idName: r'id',
indexes: {},
links: {
r'chapter': LinkSchema(
id: 8037684855892205613,
name: r'chapter',
target: r'Chapter',
single: true,
)
},
embeddedSchemas: {},
getId: _feedGetId,
getLinks: _feedGetLinks,
attach: _feedAttach,
version: '3.1.0+1',
);
int _feedEstimateSize(
Feed object,
List<int> offsets,
Map<Type, List<int>> allOffsets,
) {
var bytesCount = offsets.last;
{
final value = object.date;
if (value != null) {
bytesCount += 3 + value.length * 3;
}
}
return bytesCount;
}
void _feedSerialize(
Feed object,
IsarWriter writer,
List<int> offsets,
Map<Type, List<int>> allOffsets,
) {
writer.writeString(offsets[0], object.date);
writer.writeLong(offsets[1], object.mangaId);
}
Feed _feedDeserialize(
Id id,
IsarReader reader,
List<int> offsets,
Map<Type, List<int>> allOffsets,
) {
final object = Feed(
date: reader.readStringOrNull(offsets[0]),
id: id,
mangaId: reader.readLongOrNull(offsets[1]),
);
return object;
}
P _feedDeserializeProp<P>(
IsarReader reader,
int propertyId,
int offset,
Map<Type, List<int>> allOffsets,
) {
switch (propertyId) {
case 0:
return (reader.readStringOrNull(offset)) as P;
case 1:
return (reader.readLongOrNull(offset)) as P;
default:
throw IsarError('Unknown property with id $propertyId');
}
}
Id _feedGetId(Feed object) {
return object.id ?? Isar.autoIncrement;
}
List<IsarLinkBase<dynamic>> _feedGetLinks(Feed object) {
return [object.chapter];
}
void _feedAttach(IsarCollection<dynamic> col, Id id, Feed object) {
object.id = id;
object.chapter.attach(col, col.isar.collection<Chapter>(), r'chapter', id);
}
extension FeedQueryWhereSort on QueryBuilder<Feed, Feed, QWhere> {
QueryBuilder<Feed, Feed, QAfterWhere> anyId() {
return QueryBuilder.apply(this, (query) {
return query.addWhereClause(const IdWhereClause.any());
});
}
}
extension FeedQueryWhere on QueryBuilder<Feed, Feed, QWhereClause> {
QueryBuilder<Feed, Feed, QAfterWhereClause> idEqualTo(Id id) {
return QueryBuilder.apply(this, (query) {
return query.addWhereClause(IdWhereClause.between(
lower: id,
upper: id,
));
});
}
QueryBuilder<Feed, Feed, QAfterWhereClause> idNotEqualTo(Id id) {
return QueryBuilder.apply(this, (query) {
if (query.whereSort == Sort.asc) {
return query
.addWhereClause(
IdWhereClause.lessThan(upper: id, includeUpper: false),
)
.addWhereClause(
IdWhereClause.greaterThan(lower: id, includeLower: false),
);
} else {
return query
.addWhereClause(
IdWhereClause.greaterThan(lower: id, includeLower: false),
)
.addWhereClause(
IdWhereClause.lessThan(upper: id, includeUpper: false),
);
}
});
}
QueryBuilder<Feed, Feed, QAfterWhereClause> idGreaterThan(Id id,
{bool include = false}) {
return QueryBuilder.apply(this, (query) {
return query.addWhereClause(
IdWhereClause.greaterThan(lower: id, includeLower: include),
);
});
}
QueryBuilder<Feed, Feed, QAfterWhereClause> idLessThan(Id id,
{bool include = false}) {
return QueryBuilder.apply(this, (query) {
return query.addWhereClause(
IdWhereClause.lessThan(upper: id, includeUpper: include),
);
});
}
QueryBuilder<Feed, Feed, QAfterWhereClause> idBetween(
Id lowerId,
Id upperId, {
bool includeLower = true,
bool includeUpper = true,
}) {
return QueryBuilder.apply(this, (query) {
return query.addWhereClause(IdWhereClause.between(
lower: lowerId,
includeLower: includeLower,
upper: upperId,
includeUpper: includeUpper,
));
});
}
}
extension FeedQueryFilter on QueryBuilder<Feed, Feed, QFilterCondition> {
QueryBuilder<Feed, Feed, QAfterFilterCondition> dateIsNull() {
return QueryBuilder.apply(this, (query) {
return query.addFilterCondition(const FilterCondition.isNull(
property: r'date',
));
});
}
QueryBuilder<Feed, Feed, QAfterFilterCondition> dateIsNotNull() {
return QueryBuilder.apply(this, (query) {
return query.addFilterCondition(const FilterCondition.isNotNull(
property: r'date',
));
});
}
QueryBuilder<Feed, Feed, QAfterFilterCondition> dateEqualTo(
String? value, {
bool caseSensitive = true,
}) {
return QueryBuilder.apply(this, (query) {
return query.addFilterCondition(FilterCondition.equalTo(
property: r'date',
value: value,
caseSensitive: caseSensitive,
));
});
}
QueryBuilder<Feed, Feed, QAfterFilterCondition> dateGreaterThan(
String? value, {
bool include = false,
bool caseSensitive = true,
}) {
return QueryBuilder.apply(this, (query) {
return query.addFilterCondition(FilterCondition.greaterThan(
include: include,
property: r'date',
value: value,
caseSensitive: caseSensitive,
));
});
}
QueryBuilder<Feed, Feed, QAfterFilterCondition> dateLessThan(
String? value, {
bool include = false,
bool caseSensitive = true,
}) {
return QueryBuilder.apply(this, (query) {
return query.addFilterCondition(FilterCondition.lessThan(
include: include,
property: r'date',
value: value,
caseSensitive: caseSensitive,
));
});
}
QueryBuilder<Feed, Feed, QAfterFilterCondition> dateBetween(
String? lower,
String? upper, {
bool includeLower = true,
bool includeUpper = true,
bool caseSensitive = true,
}) {
return QueryBuilder.apply(this, (query) {
return query.addFilterCondition(FilterCondition.between(
property: r'date',
lower: lower,
includeLower: includeLower,
upper: upper,
includeUpper: includeUpper,
caseSensitive: caseSensitive,
));
});
}
QueryBuilder<Feed, Feed, QAfterFilterCondition> dateStartsWith(
String value, {
bool caseSensitive = true,
}) {
return QueryBuilder.apply(this, (query) {
return query.addFilterCondition(FilterCondition.startsWith(
property: r'date',
value: value,
caseSensitive: caseSensitive,
));
});
}
QueryBuilder<Feed, Feed, QAfterFilterCondition> dateEndsWith(
String value, {
bool caseSensitive = true,
}) {
return QueryBuilder.apply(this, (query) {
return query.addFilterCondition(FilterCondition.endsWith(
property: r'date',
value: value,
caseSensitive: caseSensitive,
));
});
}
QueryBuilder<Feed, Feed, QAfterFilterCondition> dateContains(String value,
{bool caseSensitive = true}) {
return QueryBuilder.apply(this, (query) {
return query.addFilterCondition(FilterCondition.contains(
property: r'date',
value: value,
caseSensitive: caseSensitive,
));
});
}
QueryBuilder<Feed, Feed, QAfterFilterCondition> dateMatches(String pattern,
{bool caseSensitive = true}) {
return QueryBuilder.apply(this, (query) {
return query.addFilterCondition(FilterCondition.matches(
property: r'date',
wildcard: pattern,
caseSensitive: caseSensitive,
));
});
}
QueryBuilder<Feed, Feed, QAfterFilterCondition> dateIsEmpty() {
return QueryBuilder.apply(this, (query) {
return query.addFilterCondition(FilterCondition.equalTo(
property: r'date',
value: '',
));
});
}
QueryBuilder<Feed, Feed, QAfterFilterCondition> dateIsNotEmpty() {
return QueryBuilder.apply(this, (query) {
return query.addFilterCondition(FilterCondition.greaterThan(
property: r'date',
value: '',
));
});
}
QueryBuilder<Feed, Feed, QAfterFilterCondition> idIsNull() {
return QueryBuilder.apply(this, (query) {
return query.addFilterCondition(const FilterCondition.isNull(
property: r'id',
));
});
}
QueryBuilder<Feed, Feed, QAfterFilterCondition> idIsNotNull() {
return QueryBuilder.apply(this, (query) {
return query.addFilterCondition(const FilterCondition.isNotNull(
property: r'id',
));
});
}
QueryBuilder<Feed, Feed, QAfterFilterCondition> idEqualTo(Id? value) {
return QueryBuilder.apply(this, (query) {
return query.addFilterCondition(FilterCondition.equalTo(
property: r'id',
value: value,
));
});
}
QueryBuilder<Feed, Feed, QAfterFilterCondition> idGreaterThan(
Id? value, {
bool include = false,
}) {
return QueryBuilder.apply(this, (query) {
return query.addFilterCondition(FilterCondition.greaterThan(
include: include,
property: r'id',
value: value,
));
});
}
QueryBuilder<Feed, Feed, QAfterFilterCondition> idLessThan(
Id? value, {
bool include = false,
}) {
return QueryBuilder.apply(this, (query) {
return query.addFilterCondition(FilterCondition.lessThan(
include: include,
property: r'id',
value: value,
));
});
}
QueryBuilder<Feed, Feed, QAfterFilterCondition> idBetween(
Id? lower,
Id? upper, {
bool includeLower = true,
bool includeUpper = true,
}) {
return QueryBuilder.apply(this, (query) {
return query.addFilterCondition(FilterCondition.between(
property: r'id',
lower: lower,
includeLower: includeLower,
upper: upper,
includeUpper: includeUpper,
));
});
}
QueryBuilder<Feed, Feed, QAfterFilterCondition> mangaIdIsNull() {
return QueryBuilder.apply(this, (query) {
return query.addFilterCondition(const FilterCondition.isNull(
property: r'mangaId',
));
});
}
QueryBuilder<Feed, Feed, QAfterFilterCondition> mangaIdIsNotNull() {
return QueryBuilder.apply(this, (query) {
return query.addFilterCondition(const FilterCondition.isNotNull(
property: r'mangaId',
));
});
}
QueryBuilder<Feed, Feed, QAfterFilterCondition> mangaIdEqualTo(int? value) {
return QueryBuilder.apply(this, (query) {
return query.addFilterCondition(FilterCondition.equalTo(
property: r'mangaId',
value: value,
));
});
}
QueryBuilder<Feed, Feed, QAfterFilterCondition> mangaIdGreaterThan(
int? value, {
bool include = false,
}) {
return QueryBuilder.apply(this, (query) {
return query.addFilterCondition(FilterCondition.greaterThan(
include: include,
property: r'mangaId',
value: value,
));
});
}
QueryBuilder<Feed, Feed, QAfterFilterCondition> mangaIdLessThan(
int? value, {
bool include = false,
}) {
return QueryBuilder.apply(this, (query) {
return query.addFilterCondition(FilterCondition.lessThan(
include: include,
property: r'mangaId',
value: value,
));
});
}
QueryBuilder<Feed, Feed, QAfterFilterCondition> mangaIdBetween(
int? lower,
int? upper, {
bool includeLower = true,
bool includeUpper = true,
}) {
return QueryBuilder.apply(this, (query) {
return query.addFilterCondition(FilterCondition.between(
property: r'mangaId',
lower: lower,
includeLower: includeLower,
upper: upper,
includeUpper: includeUpper,
));
});
}
}
extension FeedQueryObject on QueryBuilder<Feed, Feed, QFilterCondition> {}
extension FeedQueryLinks on QueryBuilder<Feed, Feed, QFilterCondition> {
QueryBuilder<Feed, Feed, QAfterFilterCondition> chapter(
FilterQuery<Chapter> q) {
return QueryBuilder.apply(this, (query) {
return query.link(q, r'chapter');
});
}
QueryBuilder<Feed, Feed, QAfterFilterCondition> chapterIsNull() {
return QueryBuilder.apply(this, (query) {
return query.linkLength(r'chapter', 0, true, 0, true);
});
}
}
extension FeedQuerySortBy on QueryBuilder<Feed, Feed, QSortBy> {
QueryBuilder<Feed, Feed, QAfterSortBy> sortByDate() {
return QueryBuilder.apply(this, (query) {
return query.addSortBy(r'date', Sort.asc);
});
}
QueryBuilder<Feed, Feed, QAfterSortBy> sortByDateDesc() {
return QueryBuilder.apply(this, (query) {
return query.addSortBy(r'date', Sort.desc);
});
}
QueryBuilder<Feed, Feed, QAfterSortBy> sortByMangaId() {
return QueryBuilder.apply(this, (query) {
return query.addSortBy(r'mangaId', Sort.asc);
});
}
QueryBuilder<Feed, Feed, QAfterSortBy> sortByMangaIdDesc() {
return QueryBuilder.apply(this, (query) {
return query.addSortBy(r'mangaId', Sort.desc);
});
}
}
extension FeedQuerySortThenBy on QueryBuilder<Feed, Feed, QSortThenBy> {
QueryBuilder<Feed, Feed, QAfterSortBy> thenByDate() {
return QueryBuilder.apply(this, (query) {
return query.addSortBy(r'date', Sort.asc);
});
}
QueryBuilder<Feed, Feed, QAfterSortBy> thenByDateDesc() {
return QueryBuilder.apply(this, (query) {
return query.addSortBy(r'date', Sort.desc);
});
}
QueryBuilder<Feed, Feed, QAfterSortBy> thenById() {
return QueryBuilder.apply(this, (query) {
return query.addSortBy(r'id', Sort.asc);
});
}
QueryBuilder<Feed, Feed, QAfterSortBy> thenByIdDesc() {
return QueryBuilder.apply(this, (query) {
return query.addSortBy(r'id', Sort.desc);
});
}
QueryBuilder<Feed, Feed, QAfterSortBy> thenByMangaId() {
return QueryBuilder.apply(this, (query) {
return query.addSortBy(r'mangaId', Sort.asc);
});
}
QueryBuilder<Feed, Feed, QAfterSortBy> thenByMangaIdDesc() {
return QueryBuilder.apply(this, (query) {
return query.addSortBy(r'mangaId', Sort.desc);
});
}
}
extension FeedQueryWhereDistinct on QueryBuilder<Feed, Feed, QDistinct> {
QueryBuilder<Feed, Feed, QDistinct> distinctByDate(
{bool caseSensitive = true}) {
return QueryBuilder.apply(this, (query) {
return query.addDistinctBy(r'date', caseSensitive: caseSensitive);
});
}
QueryBuilder<Feed, Feed, QDistinct> distinctByMangaId() {
return QueryBuilder.apply(this, (query) {
return query.addDistinctBy(r'mangaId');
});
}
}
extension FeedQueryProperty on QueryBuilder<Feed, Feed, QQueryProperty> {
QueryBuilder<Feed, int, QQueryOperations> idProperty() {
return QueryBuilder.apply(this, (query) {
return query.addPropertyName(r'id');
});
}
QueryBuilder<Feed, String?, QQueryOperations> dateProperty() {
return QueryBuilder.apply(this, (query) {
return query.addPropertyName(r'date');
});
}
QueryBuilder<Feed, int?, QQueryOperations> mangaIdProperty() {
return QueryBuilder.apply(this, (query) {
return query.addPropertyName(r'mangaId');
});
}
}

View file

@ -2,6 +2,7 @@ import 'package:mangayomi/eval/dart/model/m_bridge.dart';
import 'package:mangayomi/eval/dart/model/m_manga.dart';
import 'package:mangayomi/main.dart';
import 'package:mangayomi/models/chapter.dart';
import 'package:mangayomi/models/feed.dart';
import 'package:mangayomi/models/manga.dart';
import 'package:mangayomi/modules/more/settings/sync/providers/sync_providers.dart';
import 'package:mangayomi/services/get_detail.dart';
@ -74,7 +75,6 @@ Future<dynamic> updateMangaDetail(UpdateMangaDetailRef ref,
mangaId: mangaId,
)..manga.value = manga;
chapters.add(chapter);
// TODO add to feed collection
}
}
if (chapters.isNotEmpty) {
@ -84,6 +84,13 @@ Future<dynamic> updateMangaDetail(UpdateMangaDetailRef ref,
.addUpdatedChapter(chap, false, false);
isar.chapters.putSync(chap);
chap.manga.saveSync();
final savedChapter = isar.chapters.getSync(chap.id!);
if (savedChapter != null) {
final feed = Feed(mangaId: mangaId, date: savedChapter.dateUpload)
..chapter.value = savedChapter;
isar.feeds.putSync(feed);
feed.chapter.saveSync();
}
}
}
final oldChapers =

View file

@ -6,7 +6,7 @@ part of 'update_manga_detail_providers.dart';
// RiverpodGenerator
// **************************************************************************
String _$updateMangaDetailHash() => r'd626e277ee61dfcd7e2171d5f22eea52fb8cfdb5';
String _$updateMangaDetailHash() => r'36381242c5d911c4c656e57f72135f5f1e377198';
/// Copied from Dart SDK
class _SystemHash {

View file

@ -178,6 +178,7 @@ class ReaderController extends _$ReaderController {
.filter()
.mangaIdEqualTo(getManga().id)
.findFirstSync())!
..chapterId = chapter.id
..chapter.value = chapter
..date = DateTime.now().millisecondsSinceEpoch.toString();
}

View file

@ -169,7 +169,7 @@ class _CurrentIndexProviderElement
Chapter get chapter => (origin as CurrentIndexProvider).chapter;
}
String _$readerControllerHash() => r'705fb14ceb947a558333e500fb35e9802f1161e6';
String _$readerControllerHash() => r'f615f15a622ac5ccdb16318dcdefc097a175fd33';
abstract class _$ReaderController extends BuildlessAutoDisposeNotifier<void> {
late final Chapter chapter;

View file

@ -7,6 +7,7 @@ import 'package:mangayomi/models/category.dart';
import 'package:mangayomi/models/changed_items.dart';
import 'package:mangayomi/models/chapter.dart';
import 'package:mangayomi/models/download.dart';
import 'package:mangayomi/models/feed.dart';
import 'package:mangayomi/models/history.dart';
import 'package:mangayomi/models/manga.dart';
import 'package:mangayomi/models/settings.dart';
@ -131,6 +132,7 @@ class StorageProvider {
ChangedItemsSchema,
ChapterSchema,
CategorySchema,
FeedSchema,
HistorySchema,
DownloadSchema,
SourceSchema,