mirror of
https://gitlab.com/comunic/comunicmobile
synced 2024-11-22 04:49:21 +00:00
Cache conversation messages
This commit is contained in:
parent
eb5b6d6fae
commit
c9eb57586f
@ -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;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
@ -34,4 +34,15 @@ abstract class ConversationTableContract {
|
|||||||
static const C_FOLLOWING = "following";
|
static const C_FOLLOWING = "following";
|
||||||
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);
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user