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: 55 58 94.8 %
Date: Thu Jul 15 17:16:16 2021 Functions: 0 0 -

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

Generated by: LCOV version 1.15.alpha0w