You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

79 lines
2.2 KiB

  1. <?php
  2. namespace App;
  3. use Illuminate\Database\Capsule\Manager as DB;
  4. use App\Message;
  5. class MessageBuffer
  6. {
  7. protected static $instance;
  8. private $_models = null;
  9. private $_calls = null;
  10. public static function getInstance()
  11. {
  12. if (!isset(self::$instance)) {
  13. self::$instance = new self();
  14. }
  15. return self::$instance;
  16. }
  17. public function __construct()
  18. {
  19. $this->_models = collect();
  20. $this->_calls = collect();
  21. }
  22. public function save()
  23. {
  24. if ($this->_models->count() > 0) {
  25. try {
  26. DB::beginTransaction();
  27. // We delete all the messages that might already be there
  28. $table = DB::table('messages');
  29. $first = $this->_models->first();
  30. $table = $table->where(function ($query) use ($first) {
  31. $query->where('user_id', $first['user_id'])
  32. ->where('jidfrom', $first['jidfrom'])
  33. ->where('id', $first['id']);
  34. });
  35. $this->_models->skip(1)->each(function ($message) use ($table) {
  36. $table->orWhere(function ($query) use ($message) {
  37. $query->where('user_id', $message['user_id'])
  38. ->where('jidfrom', $message['jidfrom'])
  39. ->where('id', $message['id']);
  40. });
  41. });
  42. $table->delete();
  43. Message::insert($this->_models->toArray());
  44. DB::commit();
  45. } catch (\Exception $e) {
  46. DB::rollback();
  47. }
  48. $this->_models = collect();
  49. }
  50. if ($this->_calls->isNotEmpty()) {
  51. $this->_calls->each(fn($call) => $call());
  52. $this->_calls = collect();
  53. }
  54. }
  55. public function append(Message $message, $call)
  56. {
  57. //if (empty($message->mid)) {
  58. $this->_models[$message->user_id . $message->jidfrom . $message->id] = $message->toRawArray();
  59. $this->_calls->push($call);
  60. /*} else {
  61. $message->save();
  62. $call();
  63. }*/
  64. }
  65. }