LCOV - code coverage report
Current view: top level - lib\data\local\dao\chatwoot_messages_dao.dart - chatwoot_messages_dao.dart (source / functions) Hit Total Coverage
Test: lcov.info Lines: 57 59 96.6 %
Date: Tue Jul 13 13:39:38 2021 Functions: 0 0 -

          Line data    Source code
       1             : 
       2             : import 'dart:collection';
       3             : 
       4             : import 'package:chatwoot_client_sdk/data/local/entity/chatwoot_message.dart';
       5             : import 'package:hive_flutter/hive_flutter.dart';
       6             : 
       7             : 
       8             : abstract class ChatwootMessagesDao{
       9             :   Future<void> saveMessage(ChatwootMessage message);
      10             :   Future<void> saveAllMessages(List<ChatwootMessage> messages);
      11             :   ChatwootMessage? getMessage(int messageId);
      12             :   List<ChatwootMessage> getMessages();
      13             :   Future<void> clear();
      14             :   Future<void> deleteMessage(int messageId);
      15             :   Future<void> onDispose();
      16             : 
      17             :   Future<void> clearAll();
      18             : }
      19             : 
      20             : //Only used when persistence is enabled
      21          19 : enum ChatwootMessagesBoxNames{
      22             :   MESSAGES, MESSAGES_TO_CLIENT_INSTANCE_KEY
      23             : }
      24             : class PersistedChatwootMessagesDao extends ChatwootMessagesDao{
      25             :   // box containing all persisted messages
      26             :   final Box<ChatwootMessage> _box;
      27             : 
      28             :   final String _clientInstanceKey;
      29             : 
      30             :   //box with many to one relation
      31             :   final Box<String> _messageIdToClientInstanceKeyBox;
      32             : 
      33           2 :   PersistedChatwootMessagesDao(
      34             :     this._box,
      35             :     this._messageIdToClientInstanceKeyBox,
      36             :     this._clientInstanceKey
      37             :   );
      38             : 
      39             :   @override
      40           1 :   Future<void> clear() async{
      41             : 
      42             :     //filter current client instance message ids
      43           1 :     Iterable clientMessageIds = _messageIdToClientInstanceKeyBox
      44           1 :         .keys
      45           6 :         .where((key) => _messageIdToClientInstanceKeyBox.get(key) == _clientInstanceKey);
      46             : 
      47           3 :     await _box.deleteAll(clientMessageIds);
      48             :   }
      49             : 
      50             :   @override
      51           1 :   Future<void> saveMessage(ChatwootMessage message) async{
      52           4 :     await _box.put(message.id, message);
      53           5 :     await _messageIdToClientInstanceKeyBox.put(message.id, _clientInstanceKey);
      54           1 :     print("saved");
      55             :   }
      56             : 
      57             :   @override
      58           1 :   Future<void> saveAllMessages(List<ChatwootMessage> messages) async{
      59           1 :     for(ChatwootMessage message in messages)
      60           3 :       await saveMessage(message);
      61             :   }
      62             : 
      63           1 :   @override
      64             :   List<ChatwootMessage> getMessages(){
      65           1 :     final messageClientInstancekey = _clientInstanceKey;
      66             : 
      67             :     //filter current client instance message ids
      68           1 :     Set<int> clientMessageIds = _messageIdToClientInstanceKeyBox
      69           1 :         .keys
      70           2 :         .map((e) => e as int)
      71           5 :         .where((key) => _messageIdToClientInstanceKeyBox.get(key) == messageClientInstancekey)
      72           1 :         .toSet();
      73             : 
      74             :     //retrieve messages with ids
      75           1 :     List<ChatwootMessage> sortedMessages = _box
      76           1 :         .values
      77           4 :         .where((message) => clientMessageIds.contains(message.id))
      78           1 :         .toList(growable: false);
      79             : 
      80             :     //sort message using creation dates
      81           1 :     sortedMessages.sort((a,b){
      82           0 :       return a.createdAt.compareTo(b.createdAt);
      83             :     });
      84             : 
      85             :     return sortedMessages;
      86             :   }
      87             : 
      88             :   @override
      89           1 :   Future<void> onDispose() async{
      90           3 :     await _box.close();
      91             :   }
      92             : 
      93             :   @override
      94           1 :   Future<void> deleteMessage(int messageId) async{
      95           3 :     await _box.delete(messageId);
      96           3 :     await _messageIdToClientInstanceKeyBox.delete(messageId);
      97             :   }
      98             : 
      99           1 :   @override
     100             :   ChatwootMessage? getMessage(int messageId) {
     101           2 :     return _box.get(messageId,defaultValue: null);
     102             :   }
     103             : 
     104             :   @override
     105           1 :   Future<void> clearAll() async{
     106           3 :     await _box.clear();
     107           3 :     await _box.clear();
     108             :   }
     109             : 
     110           3 :   static Future<void> openDB() async{
     111          12 :     await Hive.openBox<ChatwootMessage>(ChatwootMessagesBoxNames.MESSAGES.toString());
     112           8 :     await Hive.openBox<String>(ChatwootMessagesBoxNames.MESSAGES_TO_CLIENT_INSTANCE_KEY.toString());
     113             :   }
     114             : 
     115             : }
     116             : 
     117             : class NonPersistedChatwootMessagesDao extends ChatwootMessagesDao{
     118             :   HashMap<int, ChatwootMessage> _messages = new HashMap();
     119             : 
     120             :   @override
     121           1 :   Future<void> clear() async{
     122           2 :     _messages.clear();
     123             :   }
     124             : 
     125             :   @override
     126           1 :   Future<void> deleteMessage(int messageId) async{
     127           2 :     _messages.remove(messageId);
     128             :   }
     129             : 
     130           1 :   @override
     131             :   ChatwootMessage? getMessage(int messageId) {
     132           2 :     return _messages[messageId];
     133             :   }
     134             : 
     135           1 :   @override
     136             :   List<ChatwootMessage> getMessages() {
     137           3 :     List<ChatwootMessage> sortedMessages = _messages.values.toList(growable: false);
     138           1 :     sortedMessages.sort((a,b){
     139           0 :       return a.createdAt.compareTo(b.createdAt);
     140             :     });
     141             :     return sortedMessages;
     142             :   }
     143             : 
     144             :   @override
     145           1 :   Future<void> onDispose() async{
     146           2 :     _messages.clear();
     147             :   }
     148             : 
     149             :   @override
     150           1 :   Future<void> saveAllMessages(List<ChatwootMessage> messages) async{
     151           2 :     messages.forEach((element) async{
     152           2 :       await saveMessage(element);
     153             :     });
     154             :   }
     155             : 
     156             :   @override
     157           1 :   Future<void> saveMessage(ChatwootMessage message) async{
     158           4 :     _messages.update(message.id, (value) => message, ifAbsent: ()=>message);
     159             :   }
     160             : 
     161             :   @override
     162           1 :   Future<void> clearAll() async{
     163           2 :     _messages.clear();
     164             :   }
     165             : 
     166             : }

Generated by: LCOV version 1.15.alpha0w