Browse Source

Merge pull request #82 from jld3103/fix/news-api

Fix news api
pull/83/head
jld3103 2 years ago committed by GitHub
parent
commit
a612abe5c0
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
  1. 16
      packages/neon/lib/src/apps/news/blocs/articles.dart
  2. 22
      packages/nextcloud/lib/src/helpers.dart
  3. 4
      packages/nextcloud/lib/src/nextcloud.openapi.dart
  4. 4
      packages/nextcloud/lib/src/nextcloud.openapi.json
  5. 61
      packages/nextcloud/test/news_test.dart
  6. 4
      specs/news.json

16
packages/neon/lib/src/apps/news/blocs/articles.dart

@ -121,7 +121,7 @@ class NewsArticlesBloc extends $NewsArticlesBloc {
// https://github.com/nextcloud/news/blob/master/docs/api/api-v1-2.md#get-items
// https://github.com/nextcloud/news/blob/48ee5ce4d135da20079961a62ae37958d6a6b628/lib/Db/ListType.php#L21
late final int type;
late final NewsListType type;
bool? getRead;
if (listType != null) {
switch (_filterTypeSubject.value) {
@ -136,21 +136,21 @@ class NewsArticlesBloc extends $NewsArticlesBloc {
}
switch (listType) {
case ListType.feed:
type = 0;
type = NewsListType.feed;
break;
case ListType.folder:
type = 1;
type = NewsListType.folder;
break;
case null:
switch (_filterTypeSubject.value) {
case FilterType.starred:
type = 2;
type = NewsListType.starred;
break;
case FilterType.all:
type = 3;
type = NewsListType.allItems;
break;
case FilterType.unread:
type = 6;
type = NewsListType.unread;
break;
}
break;
@ -159,9 +159,9 @@ class NewsArticlesBloc extends $NewsArticlesBloc {
newsBloc.requestManager
.wrapNextcloud<List<NewsArticle>, NewsListArticles>(
newsBloc.client.id,
'news-articles-$type-$id-$getRead',
'news-articles-${type.code}-$id-$getRead',
() async => newsBloc.client.news.listArticles(
type: type,
type: type.code,
id: id ?? 0,
getRead: getRead ?? true ? 1 : 0,
),

22
packages/nextcloud/lib/src/helpers.dart

@ -1,23 +1,20 @@
// ignore_for_file: public_member_api_docs
part of '../nextcloud.dart';
// ignore: public_member_api_docs
extension HttpClientResponseBody on HttpClientResponse {
// ignore: public_member_api_docs
Future<Uint8List> get bodyBytes async =>
Uint8List.fromList((await toList()).reduce((final value, final element) => [...value, ...element]));
// ignore: public_member_api_docs
Future<String> get body async => utf8.decode(await bodyBytes);
}
// ignore: public_member_api_docs
extension UserDetailsDisplayName on ProvisioningApiUserDetails {
/// This is used to work around an API change that wasn't made for every endpoint
/// See https://github.com/nextcloud/server/commit/5086335643b6181284ee50f57b95525002842992
String? getDisplayName() => displayname ?? displayName;
}
// ignore: public_member_api_docs
extension NextcloudNotificationsPushProxy on NotificationsClient {
/// Registers a device at the push proxy server
Future registerDeviceAtPushProxy(
@ -67,3 +64,18 @@ NotificationsPushNotificationDecryptedSubject decryptPushNotificationSubject(
NotificationsPushNotificationDecryptedSubject.fromJson(
json.decode(privateKey.decrypt(subject)) as Map<String, dynamic>,
);
/// See https://github.com/nextcloud/news/blob/4a107b3d53c4fe651ac704251b99e04a53cd587f/lib/Db/ListType.php
enum NewsListType {
feed(0),
folder(1),
starred(2),
allItems(3),
shared(4),
explore(5),
unread(6);
const NewsListType(this.code);
final int code;
}

4
packages/nextcloud/lib/src/nextcloud.openapi.dart

@ -1870,7 +1870,7 @@ class NewsClient {
queryParameters['folderId'] = folderId.toString();
}
final response = await rootClient.doRequest(
'put',
'post',
Uri(path: path, queryParameters: queryParameters).toString(),
headers,
body,
@ -1892,7 +1892,7 @@ class NewsClient {
path = path.replaceAll('{feedId}', Uri.encodeQueryComponent(feedId.toString()));
queryParameters['feedTitle'] = feedTitle.toString();
final response = await rootClient.doRequest(
'put',
'post',
Uri(path: path, queryParameters: queryParameters).toString(),
headers,
body,

4
packages/nextcloud/lib/src/nextcloud.openapi.json

@ -2064,7 +2064,7 @@
}
}
],
"put": {
"post": {
"operationId": "move-feed",
"tags": [
"news"
@ -2097,7 +2097,7 @@
}
}
],
"put": {
"post": {
"operationId": "rename-feed",
"tags": [
"news"

61
packages/nextcloud/test/news_test.dart

@ -47,10 +47,39 @@ Future main() async {
expect(response.feeds![0].url, wikipediaFeedURL);
});
test('Rename feed', () async {
var response = await addWikipediaFeed();
expect(response.feeds![0].title, 'Wikipedia featured articles feed');
await client.news.renameFeed(
feedId: 1,
feedTitle: 'test1',
);
response = await client.news.listFeeds();
expect(response.feeds![0].title, 'test1');
});
test('Move feed to folder', () async {
await client.news.createFolder(name: 'test1');
await addWikipediaFeed();
await client.news.moveFeed(
feedId: 1,
folderId: 1,
);
final response = await client.news.listFolders();
expect(response.folders, hasLength(1));
expect(response.folders![0].id, 1);
expect(response.folders![0].name, 'test1');
expect(response.folders![0].opened, true);
expect(response.folders![0].feeds, hasLength(0));
});
test('Mark feed as read', () async {
final feedsResponse = await addWikipediaFeed();
var articlesResponse = await client.news.listArticles(type: 6);
var articlesResponse = await client.news.listArticles(type: NewsListType.unread.code);
expect(articlesResponse.items!.length, greaterThan(0));
await client.news.markFeedAsRead(
@ -58,7 +87,7 @@ Future main() async {
newestItemId: feedsResponse.newestItemId!,
);
articlesResponse = await client.news.listArticles(type: 6);
articlesResponse = await client.news.listArticles(type: NewsListType.unread.code);
expect(articlesResponse.items, hasLength(0));
});
@ -103,36 +132,36 @@ Future main() async {
test('Mark article as read', () async {
await addWikipediaFeed();
var response = await client.news.listArticles(type: 6);
var response = await client.news.listArticles(type: NewsListType.unread.code);
final unreadArticles = response.items!.length;
expect(unreadArticles, greaterThan(0));
await client.news.markArticleAsRead(
itemId: response.items![0].id!,
);
response = await client.news.listArticles(type: 6);
response = await client.news.listArticles(type: NewsListType.unread.code);
expect(response.items, hasLength(unreadArticles - 1));
});
test('Mark article as unread', () async {
await addWikipediaFeed();
var response = await client.news.listArticles(type: 6);
var response = await client.news.listArticles(type: NewsListType.unread.code);
final readArticle = response.items![0];
await client.news.markArticleAsRead(itemId: readArticle.id!);
response = await client.news.listArticles(type: 6);
response = await client.news.listArticles(type: NewsListType.unread.code);
final unreadArticles = response.items!.length;
expect(unreadArticles, greaterThan(0));
await client.news.markArticleAsUnread(itemId: readArticle.id!);
response = await client.news.listArticles(type: 6);
response = await client.news.listArticles(type: NewsListType.unread.code);
expect(response.items, hasLength(unreadArticles + 1));
});
test('Star article', () async {
await addWikipediaFeed();
var response = await client.news.listArticles(type: 2);
var response = await client.news.listArticles(type: NewsListType.starred.code);
final starredArticles = response.items!.length;
expect(starredArticles, 0);
@ -140,7 +169,7 @@ Future main() async {
await client.news.starArticle(
itemId: response.items![0].id!,
);
response = await client.news.listArticles(type: 2);
response = await client.news.listArticles(type: NewsListType.starred.code);
expect(response.items, hasLength(1));
});
@ -153,13 +182,13 @@ Future main() async {
await client.news.starArticle(
itemId: item.id!,
);
response = await client.news.listArticles(type: 2);
response = await client.news.listArticles(type: NewsListType.starred.code);
expect(response.items, hasLength(1));
await client.news.unstarArticle(
itemId: item.id!,
);
response = await client.news.listArticles(type: 2);
response = await client.news.listArticles(type: NewsListType.starred.code);
expect(response.items, hasLength(0));
});
@ -167,17 +196,17 @@ Future main() async {
var response = await client.news.listFolders();
expect(response.folders, hasLength(0));
response = await client.news.createFolder(name: 'test');
response = await client.news.createFolder(name: 'test1');
expect(response.folders, hasLength(1));
expect(response.folders![0].id, 1);
expect(response.folders![0].name, 'test');
expect(response.folders![0].name, 'test1');
expect(response.folders![0].opened, true);
expect(response.folders![0].feeds, hasLength(0));
response = await client.news.listFolders();
expect(response.folders, hasLength(1));
expect(response.folders![0].id, 1);
expect(response.folders![0].name, 'test');
expect(response.folders![0].name, 'test1');
expect(response.folders![0].opened, true);
expect(response.folders![0].feeds, hasLength(0));
});
@ -215,7 +244,7 @@ Future main() async {
final foldersResponse = await client.news.createFolder(name: 'test1');
final feedsResponse = await addWikipediaFeed(1);
var articlesResponse = await client.news.listArticles(type: 6);
var articlesResponse = await client.news.listArticles(type: NewsListType.unread.code);
expect(articlesResponse.items!.length, greaterThan(0));
await client.news.markFolderAsRead(
@ -223,7 +252,7 @@ Future main() async {
newestItemId: feedsResponse.newestItemId!,
);
articlesResponse = await client.news.listArticles(type: 6);
articlesResponse = await client.news.listArticles(type: NewsListType.unread.code);
expect(articlesResponse.items, hasLength(0));
});
});

4
specs/news.json

@ -481,7 +481,7 @@
}
}
],
"put": {
"post": {
"operationId": "move-feed",
"tags": [
"news"
@ -514,7 +514,7 @@
}
}
],
"put": {
"post": {
"operationId": "rename-feed",
"tags": [
"news"

Loading…
Cancel
Save