import 'dart:async'; // import 'dart:convert'; import 'package:bytedesk_kefu/model/answer.dart'; import 'package:bytedesk_kefu/model/category.dart'; // import 'package:bytedesk_kefu/util/bytedesk_constants.dart'; import 'package:bytedesk_kefu/util/bytedesk_utils.dart'; import 'package:path/path.dart'; import 'package:sqflite/sqflite.dart'; import 'package:bytedesk_kefu/model/model.dart'; // https://pub.dev/packages/sqflite // FIXME: 不支持web class MessageProvider { // static final MessageProvider _singleton = MessageProvider._internal(); factory MessageProvider() { return _singleton; } MessageProvider._internal() { // FIXME: 暂不支持web if (BytedeskUtils.isWeb) { return; } open(); } // final String? tableMessage = 'messages'; final String? columnId = '_id'; final String? columnMid = 'mid'; final String? columnType = 'type'; final String? columnTopic = 'topic'; final String? columnContent = 'content'; final String? columnImageUrl = 'imageUrl'; final String? columnVoiceUrl = 'voiceUrl'; final String? columnVideoUrl = 'videoUrl'; final String? columnFileUrl = 'fileUrl'; final String? columnNickname = 'nickname'; final String? columnAvatar = 'avatar'; final String? columnStatus = 'status'; final String? columnIsSend = 'isSend'; final String? columnTimestamp = 'timestamp'; final String? columnCurrentUid = 'currentUid'; final String? columnClient = 'client'; final String? columnAnswers = 'answers'; final String? columnCategories = 'categories'; // Database? database; Future open() async { // Open the database and store the reference. database = await openDatabase( // Set the path to the database. Note: Using the `join` function from the // `path` package is best practice to ensure the path is correctly // constructed for each platform. join(await getDatabasesPath(), 'bytedesk-message-v10.db'), // When the database is first created, create a table to store dogs. onCreate: (db, version) { // Run the CREATE TABLE statement on the database. autoincrement return db.execute( "CREATE TABLE $tableMessage($columnId INTEGER PRIMARY KEY AUTOINCREMENT, " + "$columnMid TEXT, $columnType TEXT, $columnTopic TEXT, $columnContent TEXT, $columnImageUrl TEXT, $columnVoiceUrl TEXT,$columnVideoUrl TEXT, $columnFileUrl TEXT, $columnNickname TEXT, $columnAvatar TEXT, $columnStatus TEXT, " + "$columnIsSend INTEGER, $columnTimestamp TEXT, $columnCurrentUid TEXT, $columnClient TEXT, $columnAnswers TEXT, $columnCategories TEXT)", ); }, // Set the version. This executes the onCreate function and provides a // path to perform database upgrades and downgrades. version: 10, ); // database path:/Users/ningjinpeng/Library/Developer/CoreSimulator/Devices/715CBA02-A602-4DE1-8C57-75A64B53BF03/data/Containers/Data/Application/8F46273D-9492-4C42-A618-4DF3815562BA/Documents/bytedesk-message-v9.db BytedeskUtils.printLog('database path:' + database!.path); } Future insert(Message message) async { // FIXME: 暂不支持web if (BytedeskUtils.isWeb) { return 0; } // BytedeskUtils.printLog('insert avatar:' + message.avatar + ' conten:' + message.content + ' timestamp:' + message.timestamp); return await database!.insert(tableMessage!, message.toMap()); } // Future> getTopicMessages( String? topic, String? currentUid, int? page, int? size) async { // BytedeskUtils.printLog('1: ' + topic! + ' currentUid:' + currentUid!); // FIXME: 暂不支持web if (BytedeskUtils.isWeb) { return []; } // BytedeskUtils.printLog('2'); // List maps = await database!.query(tableMessage!, columns: [ columnMid!, columnContent!, columnImageUrl!, columnVoiceUrl!, columnVideoUrl!, columnFileUrl!, columnType!, columnTopic!, columnStatus!, columnTimestamp!, columnNickname!, columnAvatar!, columnIsSend!, columnClient!, columnAnswers!, columnCategories! ], where: '$columnTopic = ? and $columnCurrentUid = ?', whereArgs: [topic, currentUid], orderBy: '$columnTimestamp DESC, $columnIsSend ASC', limit: size, offset: page! * size!); // // BytedeskUtils.printLog('3'); // BytedeskUtils.printLog(maps.length); // return List.generate(maps.length, (i) { // List robotQaList = []; // FIXME: 下面解析报错 // if (maps[i]['type'] == BytedeskConstants.MESSAGE_TYPE_ROBOT) { // robotQaList = maps[i][columnAnswers] == null // ? [] // : (json.decode(maps[i][columnAnswers]) as List) // .map((item) => Answer.fromJson(item)) // .toList(); // } List categoriesList = []; // FIXME: 下面解析报错 // if (maps[i]['type'] == BytedeskConstants.MESSAGE_TYPE_ROBOT_V2) { // categoriesList = maps[i][columnCategories] == null // ? [] // : (json.decode(maps[i][columnCategories]) as List) // .map((item) => Category.fromJson(item)) // .toList(); // } // BytedeskUtils.printLog('4'); return Message( mid: maps[i]['mid'], content: maps[i]['content'], imageUrl: maps[i]['imageUrl'], voiceUrl: maps[i]['voiceUrl'], videoUrl: maps[i]['videoUrl'], fileUrl: maps[i]['fileUrl'], type: maps[i]['type'], topic: maps[i]['topic'], status: maps[i]['status'], timestamp: maps[i]['timestamp'], nickname: maps[i]['nickname'], avatar: maps[i]['avatar'], isSend: maps[i]['isSend'], client: maps[i]['client'], answers: robotQaList, categories: categoriesList); }); } Future delete(String? mid) async { // FIXME: 暂不支持web if (BytedeskUtils.isWeb) { return 0; } return await database! .delete(tableMessage!, where: '$columnMid = ?', whereArgs: [mid]); } Future update(String? mid, String? status) async { // FIXME: 暂不支持web if (BytedeskUtils.isWeb) { return 0; } return await database!.rawUpdate( 'UPDATE $tableMessage SET $columnStatus = ? WHERE $columnMid = ?', [status, mid]); } Future close() async => database!.close(); }