mirror of
				https://gitlab.com/comunic/comunicmobile
				synced 2025-11-04 12:14:11 +00:00 
			
		
		
		
	Cache conversation messages
This commit is contained in:
		@@ -1,3 +1,4 @@
 | 
				
			|||||||
 | 
					import 'package:comunic/helpers/database/conversation_messages_database_helper.dart';
 | 
				
			||||||
import 'package:comunic/helpers/database/conversations_database_helper.dart';
 | 
					import 'package:comunic/helpers/database/conversations_database_helper.dart';
 | 
				
			||||||
import 'package:comunic/helpers/users_helper.dart';
 | 
					import 'package:comunic/helpers/users_helper.dart';
 | 
				
			||||||
import 'package:comunic/lists/conversation_messages_list.dart';
 | 
					import 'package:comunic/lists/conversation_messages_list.dart';
 | 
				
			||||||
@@ -19,6 +20,8 @@ enum SendMessageResult { SUCCESS, MESSAGE_REJECTED, FAILED }
 | 
				
			|||||||
class ConversationsHelper {
 | 
					class ConversationsHelper {
 | 
				
			||||||
  final ConversationsDatabaseHelper _conversationsDatabaseHelper =
 | 
					  final ConversationsDatabaseHelper _conversationsDatabaseHelper =
 | 
				
			||||||
      ConversationsDatabaseHelper();
 | 
					      ConversationsDatabaseHelper();
 | 
				
			||||||
 | 
					  final ConversationMessagesDatabaseHelper _conversationMessagesDatabaseHelper =
 | 
				
			||||||
 | 
					      ConversationMessagesDatabaseHelper();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  /// Download the list of conversations from the server
 | 
					  /// Download the list of conversations from the server
 | 
				
			||||||
  Future<ConversationsList> downloadList() async {
 | 
					  Future<ConversationsList> downloadList() async {
 | 
				
			||||||
@@ -152,12 +155,16 @@ class ConversationsHelper {
 | 
				
			|||||||
    response.getArray().forEach((f) {
 | 
					    response.getArray().forEach((f) {
 | 
				
			||||||
      list.add(ConversationMessage(
 | 
					      list.add(ConversationMessage(
 | 
				
			||||||
          id: f["ID"],
 | 
					          id: f["ID"],
 | 
				
			||||||
 | 
					          conversationID: conversationID,
 | 
				
			||||||
          userID: f["ID_user"],
 | 
					          userID: f["ID_user"],
 | 
				
			||||||
          timeInsert: f["time_insert"],
 | 
					          timeInsert: f["time_insert"],
 | 
				
			||||||
          message: f["message"],
 | 
					          message: f["message"],
 | 
				
			||||||
          imageURL: f["image_path"]));
 | 
					          imageURL: f["image_path"]));
 | 
				
			||||||
    });
 | 
					    });
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    // Save messages in the cache
 | 
				
			||||||
 | 
					    _conversationMessagesDatabaseHelper.insertOrUpdateAll(list);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    return list;
 | 
					    return list;
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -173,20 +180,18 @@ class ConversationsHelper {
 | 
				
			|||||||
    );
 | 
					    );
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    //Check for image
 | 
					    //Check for image
 | 
				
			||||||
    if(message.hasImage)
 | 
					    if (message.hasImage) request.addFile("image", message.image);
 | 
				
			||||||
      request.addFile("image", message.image);
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
    //Send the message
 | 
					    //Send the message
 | 
				
			||||||
    APIResponse response;
 | 
					    APIResponse response;
 | 
				
			||||||
    if(!message.hasImage)
 | 
					    if (!message.hasImage)
 | 
				
			||||||
      response = await request.exec();
 | 
					      response = await request.exec();
 | 
				
			||||||
    else
 | 
					    else
 | 
				
			||||||
      response = await request.execWithFiles();
 | 
					      response = await request.execWithFiles();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    if(response.code == 401)
 | 
					    if (response.code == 401)
 | 
				
			||||||
      return SendMessageResult.MESSAGE_REJECTED;
 | 
					      return SendMessageResult.MESSAGE_REJECTED;
 | 
				
			||||||
    else if(response.code != 200)
 | 
					    else if (response.code != 200) return SendMessageResult.FAILED;
 | 
				
			||||||
      return SendMessageResult.FAILED;
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
    return SendMessageResult.SUCCESS;
 | 
					    return SendMessageResult.SUCCESS;
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -0,0 +1,21 @@
 | 
				
			|||||||
 | 
					import 'package:comunic/helpers/database/database_contract.dart';
 | 
				
			||||||
 | 
					import 'package:comunic/helpers/database/model_database_helper.dart';
 | 
				
			||||||
 | 
					import 'package:comunic/models/conversation_message.dart';
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/// Conversation messages database helper
 | 
				
			||||||
 | 
					///
 | 
				
			||||||
 | 
					/// @author Pierre HUBERT
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					class ConversationMessagesDatabaseHelper extends ModelDatabaseHelper<ConversationMessage> {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  @override
 | 
				
			||||||
 | 
					  ConversationMessage initializeFromMap(Map<String, dynamic> map) {
 | 
				
			||||||
 | 
					    return ConversationMessage.fromMap(map);
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  @override
 | 
				
			||||||
 | 
					  String tableName() {
 | 
				
			||||||
 | 
					    return ConversationsMessagesTableContract.TABLE_NAME;
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
@@ -35,3 +35,14 @@ abstract class ConversationTableContract {
 | 
				
			|||||||
  static const C_SAW_LAST_MESSAGE = "saw_last_message";
 | 
					  static const C_SAW_LAST_MESSAGE = "saw_last_message";
 | 
				
			||||||
  static const C_MEMBERS = "members";
 | 
					  static const C_MEMBERS = "members";
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/// Conversations messages table contract
 | 
				
			||||||
 | 
					abstract class ConversationsMessagesTableContract {
 | 
				
			||||||
 | 
					  static const TABLE_NAME = "conversations_messages";
 | 
				
			||||||
 | 
					  static const C_ID = BaseTableContract.C_ID;
 | 
				
			||||||
 | 
					  static const C_CONVERSATION_ID = "conversation_id";
 | 
				
			||||||
 | 
					  static const C_USER_ID = "user_id";
 | 
				
			||||||
 | 
					  static const C_TIME_INSERT = "time_insert";
 | 
				
			||||||
 | 
					  static const C_MESSAGE = "message";
 | 
				
			||||||
 | 
					  static const C_IMAGE_URL = "image_url";
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
@@ -38,8 +38,12 @@ abstract class DatabaseHelper {
 | 
				
			|||||||
    await db.execute("DROP TABLE IF EXISTS ${UserTableContract.TABLE_NAME}");
 | 
					    await db.execute("DROP TABLE IF EXISTS ${UserTableContract.TABLE_NAME}");
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    // Drop conversations table
 | 
					    // Drop conversations table
 | 
				
			||||||
    await db
 | 
					    await db.execute(
 | 
				
			||||||
        .execute("DROP TABLE IF EXISTS ${ConversationTableContract.TABLE_NAME}");
 | 
					        "DROP TABLE IF EXISTS ${ConversationTableContract.TABLE_NAME}");
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    // Drop conversations messages table
 | 
				
			||||||
 | 
					    await db.execute(
 | 
				
			||||||
 | 
					        "DROP TABLE IF EXISTS ${ConversationsMessagesTableContract.TABLE_NAME}");
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    // Initialize database again
 | 
					    // Initialize database again
 | 
				
			||||||
    await _initializeDatabase(db, newVersion);
 | 
					    await _initializeDatabase(db, newVersion);
 | 
				
			||||||
@@ -47,7 +51,7 @@ abstract class DatabaseHelper {
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
  /// Initialize the database
 | 
					  /// Initialize the database
 | 
				
			||||||
  static Future<void> _initializeDatabase(Database db, int version) async {
 | 
					  static Future<void> _initializeDatabase(Database db, int version) async {
 | 
				
			||||||
    //Create users table
 | 
					    // Create users table
 | 
				
			||||||
    await db.execute("CREATE TABLE ${UserTableContract.TABLE_NAME} ("
 | 
					    await db.execute("CREATE TABLE ${UserTableContract.TABLE_NAME} ("
 | 
				
			||||||
        "${UserTableContract.C_ID} INTEGER PRIMARY KEY, "
 | 
					        "${UserTableContract.C_ID} INTEGER PRIMARY KEY, "
 | 
				
			||||||
        "${UserTableContract.C_FIRST_NAME} TEXT, "
 | 
					        "${UserTableContract.C_FIRST_NAME} TEXT, "
 | 
				
			||||||
@@ -57,7 +61,7 @@ abstract class DatabaseHelper {
 | 
				
			|||||||
        "${UserTableContract.C_ACCOUNT_IMAGE_URL} TEXT"
 | 
					        "${UserTableContract.C_ACCOUNT_IMAGE_URL} TEXT"
 | 
				
			||||||
        ")");
 | 
					        ")");
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    //Create conversations table
 | 
					    // Create conversations table
 | 
				
			||||||
    await db.execute("CREATE TABLE ${ConversationTableContract.TABLE_NAME} ("
 | 
					    await db.execute("CREATE TABLE ${ConversationTableContract.TABLE_NAME} ("
 | 
				
			||||||
        "${ConversationTableContract.C_ID} INTEGER PRIMARY KEY, "
 | 
					        "${ConversationTableContract.C_ID} INTEGER PRIMARY KEY, "
 | 
				
			||||||
        "${ConversationTableContract.C_OWNER_ID} INTEGER, "
 | 
					        "${ConversationTableContract.C_OWNER_ID} INTEGER, "
 | 
				
			||||||
@@ -67,5 +71,16 @@ abstract class DatabaseHelper {
 | 
				
			|||||||
        "${ConversationTableContract.C_SAW_LAST_MESSAGE} INTEGER, "
 | 
					        "${ConversationTableContract.C_SAW_LAST_MESSAGE} INTEGER, "
 | 
				
			||||||
        "${ConversationTableContract.C_MEMBERS} TEXT"
 | 
					        "${ConversationTableContract.C_MEMBERS} TEXT"
 | 
				
			||||||
        ")");
 | 
					        ")");
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    // Create conversation messages table
 | 
				
			||||||
 | 
					    await db.execute(
 | 
				
			||||||
 | 
					        "CREATE TABLE ${ConversationsMessagesTableContract.TABLE_NAME} ("
 | 
				
			||||||
 | 
					        "${ConversationsMessagesTableContract.C_ID} INTEGER PRIMARY KEY, "
 | 
				
			||||||
 | 
					        "${ConversationsMessagesTableContract.C_CONVERSATION_ID} INTEGER, "
 | 
				
			||||||
 | 
					        "${ConversationsMessagesTableContract.C_USER_ID} INTEGER, "
 | 
				
			||||||
 | 
					        "${ConversationsMessagesTableContract.C_TIME_INSERT} INTEGER, "
 | 
				
			||||||
 | 
					        "${ConversationsMessagesTableContract.C_MESSAGE} TEXT, "
 | 
				
			||||||
 | 
					        "${ConversationsMessagesTableContract.C_IMAGE_URL} TEXT"
 | 
				
			||||||
 | 
					        ")");
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -1,11 +1,14 @@
 | 
				
			|||||||
 | 
					import 'package:comunic/helpers/database/database_contract.dart';
 | 
				
			||||||
 | 
					import 'package:comunic/models/cache_model.dart';
 | 
				
			||||||
import 'package:meta/meta.dart';
 | 
					import 'package:meta/meta.dart';
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/// Single conversation message
 | 
					/// Single conversation message
 | 
				
			||||||
///
 | 
					///
 | 
				
			||||||
/// @author Pierre HUBERT
 | 
					/// @author Pierre HUBERT
 | 
				
			||||||
 | 
					
 | 
				
			||||||
class ConversationMessage implements Comparable {
 | 
					class ConversationMessage extends CacheModel implements Comparable {
 | 
				
			||||||
  final int id;
 | 
					  final int id;
 | 
				
			||||||
 | 
					  final int conversationID;
 | 
				
			||||||
  final int userID;
 | 
					  final int userID;
 | 
				
			||||||
  final int timeInsert;
 | 
					  final int timeInsert;
 | 
				
			||||||
  final String message;
 | 
					  final String message;
 | 
				
			||||||
@@ -13,6 +16,7 @@ class ConversationMessage implements Comparable {
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
  const ConversationMessage({
 | 
					  const ConversationMessage({
 | 
				
			||||||
    @required this.id,
 | 
					    @required this.id,
 | 
				
			||||||
 | 
					    @required this.conversationID,
 | 
				
			||||||
    @required this.userID,
 | 
					    @required this.userID,
 | 
				
			||||||
    @required this.timeInsert,
 | 
					    @required this.timeInsert,
 | 
				
			||||||
    @required this.message,
 | 
					    @required this.message,
 | 
				
			||||||
@@ -20,15 +24,38 @@ class ConversationMessage implements Comparable {
 | 
				
			|||||||
  })  : assert(id != null),
 | 
					  })  : assert(id != null),
 | 
				
			||||||
        assert(userID != null),
 | 
					        assert(userID != null),
 | 
				
			||||||
        assert(timeInsert != null),
 | 
					        assert(timeInsert != null),
 | 
				
			||||||
        assert(message != null);
 | 
					        assert(message != null),
 | 
				
			||||||
 | 
					        super(id: id);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  DateTime get date => DateTime.fromMillisecondsSinceEpoch(timeInsert * 1000);
 | 
					  DateTime get date => DateTime.fromMillisecondsSinceEpoch(timeInsert * 1000);
 | 
				
			||||||
  bool get hasMessage => message != null && message.length > 0;
 | 
					 | 
				
			||||||
  bool get hasImage => imageURL != null;
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  bool get hasMessage => message != null && message.length > 0;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  bool get hasImage => imageURL != null && imageURL != "null";
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  @override
 | 
					  @override
 | 
				
			||||||
  int compareTo(other) {
 | 
					  int compareTo(other) {
 | 
				
			||||||
    return id.compareTo(other.id);
 | 
					    return id.compareTo(other.id);
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  @override
 | 
				
			||||||
 | 
					  Map<String, dynamic> toMap() {
 | 
				
			||||||
 | 
					    return {
 | 
				
			||||||
 | 
					      ConversationsMessagesTableContract.C_ID: id,
 | 
				
			||||||
 | 
					      ConversationsMessagesTableContract.C_CONVERSATION_ID: conversationID,
 | 
				
			||||||
 | 
					      ConversationsMessagesTableContract.C_USER_ID: userID,
 | 
				
			||||||
 | 
					      ConversationsMessagesTableContract.C_TIME_INSERT: timeInsert,
 | 
				
			||||||
 | 
					      ConversationsMessagesTableContract.C_MESSAGE: message,
 | 
				
			||||||
 | 
					      ConversationsMessagesTableContract.C_IMAGE_URL: imageURL
 | 
				
			||||||
 | 
					    };
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  ConversationMessage.fromMap(Map<String, dynamic> map)
 | 
				
			||||||
 | 
					      : id = map[ConversationsMessagesTableContract.C_ID],
 | 
				
			||||||
 | 
					        conversationID = map[ConversationsMessagesTableContract.C_CONVERSATION_ID],
 | 
				
			||||||
 | 
					        userID = map[ConversationsMessagesTableContract.C_USER_ID],
 | 
				
			||||||
 | 
					        timeInsert = map[ConversationsMessagesTableContract.C_TIME_INSERT],
 | 
				
			||||||
 | 
					        message = map[ConversationsMessagesTableContract.C_MESSAGE],
 | 
				
			||||||
 | 
					        imageURL = map[ConversationsMessagesTableContract.C_IMAGE_URL],
 | 
				
			||||||
 | 
					        super.fromMap(map);
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 
 | 
				
			|||||||
		Reference in New Issue
	
	Block a user