From ddf40fc62404e0d8116db75565eaf9d9755bee55 Mon Sep 17 00:00:00 2001 From: Sebastien Dugene <sebastien.dugene@voltalis.com> Date: Thu, 21 May 2020 11:23:17 +0200 Subject: [PATCH] Fix wording and add room service methods counters, history --- CHANGELOG.md | 4 + .../filters/channel_history_filter.dart | 12 +-- lib/models/filters/room_counters_filter.dart | 31 +++++++ lib/models/filters/room_filter.dart | 27 +++++++ lib/models/filters/room_history_filter.dart | 59 ++++++++++++++ lib/services/room_service.dart | 40 +++++++--- pubspec.yaml | 2 +- test/services/room_service_test.dart | 80 +++++++++++++++---- 8 files changed, 220 insertions(+), 35 deletions(-) create mode 100644 lib/models/filters/room_counters_filter.dart create mode 100644 lib/models/filters/room_filter.dart create mode 100644 lib/models/filters/room_history_filter.dart diff --git a/CHANGELOG.md b/CHANGELOG.md index 8ac7ec2..5fe2b80 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,7 @@ +## 0.0.7 + +* Fix wording and add room service methods counters, history + ## 0.0.6 * Fix NPE on filter diff --git a/lib/models/filters/channel_history_filter.dart b/lib/models/filters/channel_history_filter.dart index 6f17789..af208b3 100644 --- a/lib/models/filters/channel_history_filter.dart +++ b/lib/models/filters/channel_history_filter.dart @@ -5,7 +5,7 @@ class ChannelHistoryFilter extends ChannelFilter { DateTime latest; DateTime oldest; bool inclusive; - int offsetint; + int offset; int count; bool unreads; @@ -14,7 +14,7 @@ class ChannelHistoryFilter extends ChannelFilter { this.latest, this.oldest, this.inclusive, - this.offsetint, + this.offset, this.count, this.unreads, }) : super(channel); @@ -24,14 +24,14 @@ class ChannelHistoryFilter extends ChannelFilter { 'latest': latest != null ? latest.toIso8601String() : null, 'oldest': oldest != null ? oldest.toIso8601String() : null, 'inclusive': inclusive, - 'offsetint': offsetint, + 'offset': offset, 'count': count, 'unreads': unreads }; @override String toString() { - return 'ChannelHistoryFilter{latest: $latest, oldest: $oldest, inclusive: $inclusive, offsetint: $offsetint, count: $count, unreads: $unreads}'; + return 'ChannelHistoryFilter{latest: $latest, oldest: $oldest, inclusive: $inclusive, offset: $offset, count: $count, unreads: $unreads}'; } @override @@ -43,7 +43,7 @@ class ChannelHistoryFilter extends ChannelFilter { latest == other.latest && oldest == other.oldest && inclusive == other.inclusive && - offsetint == other.offsetint && + offset == other.offset && count == other.count && unreads == other.unreads; @@ -53,7 +53,7 @@ class ChannelHistoryFilter extends ChannelFilter { latest.hashCode ^ oldest.hashCode ^ inclusive.hashCode ^ - offsetint.hashCode ^ + offset.hashCode ^ count.hashCode ^ unreads.hashCode; } diff --git a/lib/models/filters/room_counters_filter.dart b/lib/models/filters/room_counters_filter.dart new file mode 100644 index 0000000..60ce607 --- /dev/null +++ b/lib/models/filters/room_counters_filter.dart @@ -0,0 +1,31 @@ +import 'package:rocket_chat_connector_flutter/models/filters/room_filter.dart'; +import 'package:rocket_chat_connector_flutter/models/room.dart'; + +import '../user.dart'; + +class RoomCountersFilter extends RoomFilter { + User user; + + RoomCountersFilter(Room room, {this.user}) : super(room); + + Map<String, dynamic> toMap() => { + 'roomId': room.id, + 'userId': user != null ? user.id : null, + }; + + @override + String toString() { + return 'RoomCountersFilter{user: $user}'; + } + + @override + bool operator ==(Object other) => + identical(this, other) || + super == other && + other is RoomCountersFilter && + runtimeType == other.runtimeType && + user == other.user; + + @override + int get hashCode => super.hashCode ^ user.hashCode; +} diff --git a/lib/models/filters/room_filter.dart b/lib/models/filters/room_filter.dart new file mode 100644 index 0000000..92a5622 --- /dev/null +++ b/lib/models/filters/room_filter.dart @@ -0,0 +1,27 @@ +import 'package:rocket_chat_connector_flutter/models/filters/filter.dart'; +import 'package:rocket_chat_connector_flutter/models/room.dart'; + +class RoomFilter extends Filter { + Room room; + + RoomFilter(this.room); + + Map<String, dynamic> toMap() => { + 'roomId': room.id, + }; + + @override + String toString() { + return 'RoomFilter{room: $room}'; + } + + @override + bool operator ==(Object other) => + identical(this, other) || + other is RoomFilter && + runtimeType == other.runtimeType && + room == other.room; + + @override + int get hashCode => room.hashCode; +} diff --git a/lib/models/filters/room_history_filter.dart b/lib/models/filters/room_history_filter.dart new file mode 100644 index 0000000..def5d8a --- /dev/null +++ b/lib/models/filters/room_history_filter.dart @@ -0,0 +1,59 @@ +import 'package:rocket_chat_connector_flutter/models/filters/room_filter.dart'; +import 'package:rocket_chat_connector_flutter/models/room.dart'; + +class RoomHistoryFilter extends RoomFilter { + DateTime latest; + DateTime oldest; + bool inclusive; + int offset; + int count; + bool unreads; + + RoomHistoryFilter( + Room room, { + this.latest, + this.oldest, + this.inclusive, + this.offset, + this.count, + this.unreads, + }) : super(room); + + Map<String, dynamic> toMap() => { + 'roomId': room.id, + 'latest': latest != null ? latest.toIso8601String() : null, + 'oldest': oldest != null ? oldest.toIso8601String() : null, + 'inclusive': inclusive, + 'offset': offset, + 'count': count, + 'unreads': unreads + }; + + @override + String toString() { + return 'RoomHistoryFilter{latest: $latest, oldest: $oldest, inclusive: $inclusive, offset: $offset, count: $count, unreads: $unreads}'; + } + + @override + bool operator ==(Object other) => + identical(this, other) || + super == other && + other is RoomHistoryFilter && + runtimeType == other.runtimeType && + latest == other.latest && + oldest == other.oldest && + inclusive == other.inclusive && + offset == other.offset && + count == other.count && + unreads == other.unreads; + + @override + int get hashCode => + super.hashCode ^ + latest.hashCode ^ + oldest.hashCode ^ + inclusive.hashCode ^ + offset.hashCode ^ + count.hashCode ^ + unreads.hashCode; +} diff --git a/lib/services/room_service.dart b/lib/services/room_service.dart index e4c5de8..964e394 100644 --- a/lib/services/room_service.dart +++ b/lib/services/room_service.dart @@ -1,12 +1,15 @@ import 'dart:convert'; import 'package:http/http.dart' as http; +import 'package:rocket_chat_connector_flutter/models/filters/room_counters_filter.dart'; +import 'package:rocket_chat_connector_flutter/models/filters/room_filter.dart'; +import 'package:rocket_chat_connector_flutter/models/filters/room_history_filter.dart'; import 'package:rocket_chat_connector_flutter/models/new/room_new.dart'; +import 'package:rocket_chat_connector_flutter/models/response/response.dart'; import 'package:rocket_chat_connector_flutter/models/response/room_new_response.dart'; import 'package:rocket_chat_connector_flutter/models/room.dart'; import 'package:rocket_chat_connector_flutter/models/room_counters.dart'; import 'package:rocket_chat_connector_flutter/models/room_messages.dart'; -import 'package:rocket_chat_connector_flutter/models/user.dart'; import 'package:rocket_chat_connector_flutter/services/http_service.dart'; class RoomService { @@ -25,8 +28,8 @@ class RoomService { } Future<RoomMessages> messages(Room room) async { - http.Response response = - await _httpService.get('/api/v1/im.messages?roomId=${room.rid}'); + http.Response response = await _httpService.getWithFilter( + '/api/v1/im.messages', RoomFilter(room)); if (response?.statusCode == 200 && response.body?.isNotEmpty == true) { return RoomMessages.fromMap(jsonDecode(response.body)); @@ -34,15 +37,30 @@ class RoomService { return null; } - Future<RoomCounters> counters(Room room, [User user]) async { - http.Response response; - if (user != null) { - response = await _httpService - .get('/api/v1/im.counters?roomId=${room.id}&userId=${user.id}'); - } else { - response = - await _httpService.get('/api/v1/im.counters?roomId=${room.id}'); + Future<bool> markAsRead(Room room) async { + Map<String, String> body = {"rid": room.id}; + + http.Response response = + await _httpService.post('/api/v1/subscriptions.read', jsonEncode(body)); + if (response?.statusCode == 200 && response.body?.isNotEmpty == true) { + return Response.fromMap(jsonDecode(response.body)).success == true; } + return false; + } + + Future<RoomMessages> history(RoomHistoryFilter filter) async { + http.Response response = + await _httpService.getWithFilter('/api/v1/im.history', filter); + + if (response?.statusCode == 200 && response.body?.isNotEmpty == true) { + return RoomMessages.fromMap(jsonDecode(response.body)); + } + return null; + } + + Future<RoomCounters> counters(RoomCountersFilter filter) async { + http.Response response = + await _httpService.getWithFilter('/api/v1/im.counters', filter); if (response?.statusCode == 200 && response.body?.isNotEmpty == true) { return RoomCounters.fromMap(jsonDecode(response.body)); diff --git a/pubspec.yaml b/pubspec.yaml index 6f92b0b..a71ce94 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -2,7 +2,7 @@ name: rocket_chat_connector_flutter description: Flutter Rocket.chat connector. This library is developed to allow the use of a Rocket.chat server as a messaging system. author: Sebastien Dugene <sebastien.dugene@gmail.com> homepage: https://github.com/sdugene/rocket-chat-connector-flutter -version: 0.0.6 +version: 0.0.7 environment: sdk: ">=2.1.0 <3.0.0" diff --git a/test/services/room_service_test.dart b/test/services/room_service_test.dart index 4d99175..7196085 100644 --- a/test/services/room_service_test.dart +++ b/test/services/room_service_test.dart @@ -1,9 +1,13 @@ import 'dart:convert'; import 'package:flutter_test/flutter_test.dart'; -import 'package:http/http.dart'; +import 'package:http/http.dart' as http; import 'package:mockito/mockito.dart'; +import 'package:rocket_chat_connector_flutter/models/filters/room_counters_filter.dart'; +import 'package:rocket_chat_connector_flutter/models/filters/room_filter.dart'; +import 'package:rocket_chat_connector_flutter/models/filters/room_history_filter.dart'; import 'package:rocket_chat_connector_flutter/models/new/room_new.dart'; +import 'package:rocket_chat_connector_flutter/models/response/response.dart'; import 'package:rocket_chat_connector_flutter/models/response/room_new_response.dart'; import 'package:rocket_chat_connector_flutter/models/room.dart'; import 'package:rocket_chat_connector_flutter/models/room_counters.dart'; @@ -33,8 +37,8 @@ void main() { }); test('create room', () async { - Response response = - Response(jsonEncode(RoomNewResponseData.getMapById(1)), 200); + http.Response response = + http.Response(jsonEncode(RoomNewResponseData.getMapById(1)), 200); when(httpServiceMock.post("/api/v1/im.create", jsonEncode(roomNew.toMap()))) .thenAnswer((_) => Future(() => response)); @@ -44,39 +48,81 @@ void main() { test('room messages', () async { Room room = RoomData.getById("ByehQjC44FwMeiLbX"); + RoomFilter filter = RoomFilter(room); - Response response = - Response(jsonEncode(RoomMessagesData.getMapById(1)), 200); - when(httpServiceMock.get("/api/v1/im.messages?roomId=${room.id}")) + http.Response response = + http.Response(jsonEncode(RoomMessagesData.getMapById(1)), 200); + when(httpServiceMock.getWithFilter("/api/v1/im.messages", filter)) .thenAnswer((_) => Future(() => response)); RoomMessages roomMessages = await roomService.messages(room); expect(roomMessages.success, true); }); - test('channel counters without user', () async { + test('room markAsRead', () async { Room room = RoomData.getById("ByehQjC44FwMeiLbX"); + Map<String, String> body = {"rid": room.id}; - Response response = - Response(jsonEncode(RoomCountersData.getMapById(1)), 200); - when(httpServiceMock.get("/api/v1/im.counters?roomId=${room.id}")) + http.Response response = + http.Response(jsonEncode(Response(success: true).toMap()), 200); + when(httpServiceMock.post("/api/v1/subscriptions.read", jsonEncode(body))) .thenAnswer((_) => Future(() => response)); - RoomCounters roomCounters = await roomService.counters(room); + bool success = await roomService.markAsRead(room); + expect(success, true); + }); + + test('room counters without user', () async { + Room room = RoomData.getById("ByehQjC44FwMeiLbX"); + RoomCountersFilter filter = RoomCountersFilter(room); + + http.Response response = + http.Response(jsonEncode(RoomCountersData.getMapById(1)), 200); + when(httpServiceMock.getWithFilter("/api/v1/im.counters", filter)) + .thenAnswer((_) => Future(() => response)); + + RoomCounters roomCounters = await roomService.counters(filter); expect(roomCounters.success, true); }); - test('channel counters with user', () async { + test('room counters with user', () async { User user = UserData.getById("aobEdbYhXfu5hkeqG"); Room room = RoomData.getById("ByehQjC44FwMeiLbX"); + RoomCountersFilter filter = RoomCountersFilter(room, user: user); - Response response = - Response(jsonEncode(RoomCountersData.getMapById(1)), 200); - when(httpServiceMock - .get("/api/v1/im.counters?roomId=${room.id}&userId=${user.id}")) + http.Response response = + http.Response(jsonEncode(RoomCountersData.getMapById(1)), 200); + when(httpServiceMock.getWithFilter("/api/v1/im.counters", filter)) .thenAnswer((_) => Future(() => response)); - RoomCounters roomCounters = await roomService.counters(room, user); + RoomCounters roomCounters = await roomService.counters(filter); expect(roomCounters.success, true); }); + + test('room history', () async { + Room room = RoomData.getById("ByehQjC44FwMeiLbX"); + RoomHistoryFilter filter = RoomHistoryFilter(room); + + http.Response response = + http.Response(jsonEncode(RoomCountersData.getMapById(1)), 200); + when(httpServiceMock.getWithFilter("/api/v1/im.history", filter)) + .thenAnswer((_) => Future(() => response)); + + RoomMessages roomMessages = await roomService.history(filter); + expect(roomMessages.success, true); + }); + + test('room history with date', () async { + Room room = RoomData.getById("ByehQjC44FwMeiLbX"); + RoomHistoryFilter filter = + RoomHistoryFilter(room, latest: DateTime.now()); + + http.Response response = + http.Response(jsonEncode(RoomCountersData.getMapById(1)), 200); + when(httpServiceMock.getWithFilter("/api/v1/im.history", filter)) + .thenAnswer((_) => Future(() => response)); + + RoomMessages roomMessages = await roomService.history(filter); + expect(roomMessages.success, true); + }); }