Создать систему уведомлений на основе пользовательских настроек - PullRequest
0 голосов
/ 02 декабря 2018

Я пытаюсь разработать систему уведомлений, но я не уверен, правильно ли я выполняю определенные части. Чтобы упростить ситуацию, я буду использовать общее название .

Как должна работать система:

  1. Зарегистрированный пользователь может подписаться на уведомления на основе выбранных фильтров изтаблица данных сетки.(например, уведомить меня, когда количество элемента равно X, или настроить несколько фильтров, например set1.slug.quantity> X, some_value = false и some_int = 52)

Как хранитьтакие предпочтения:

Пример объекта

"O: 8:" stdClass ": 2: {s: 9:" set1.slug "; a: 1: {с: 3: "$ экв"; s: 10: "item_slug1";} s: 13: "set1.quantity"; а: 1: {s: 4: "$ GTE", я: 1;}} "

Упрощенное создание

$object = new \stdClass();
$object->{'set1.slug'} = ['$eq' => 'item_slug1'];
$object->{'set1.quantity'} = ['$gte' => 1];
$object = serialize($object);

Он также присоединяет user_id и все данные, сериализованные из формы, к частичному необработанному запросу MongoDB.

База данных сохраненаобъект - предопределенный набор фильтров для пользователя.Md - это хэш md5 объекта для более легкого доступа и редактирования.

+----+-----------------------------------------------------------------------------------------------------------------+---------+----------------------------------+
| id |                                                     object                                                      | user_id |                md                |
+----+-----------------------------------------------------------------------------------------------------------------+---------+----------------------------------+
|  1 | O:8:"stdClass":2:{s:9:"set1.slug";a:1:{s:3:"$eq";s:10:"item_slug1";}s:13:"set1.quantity";a:1:{s:4:"$gte";i:1;}} |      22 | d5003ba3227c4db3189827329815b053 |
+----+-----------------------------------------------------------------------------------------------------------------+---------+----------------------------------+

Вот как я бы это использовал - мое видение того, как это будет работать.

Я бы вызвал findByFilterMD в парсере API в цикле, в то время как таблица Items заполнена.

// MongoDB query ( items database )
protected function executeUserFilter($array)
{
    $list = Items::raw(function ($collection) use (&$array) {
        return $collection->find(
            $array, ["typeMap" => ['root' => 'array', 'document' => 'array']])
            ->toArray();
    });

    return $list;
}

// MySQL query - stored filters
protected function findByFilterMD($id)
{
    $user = Auth::user();
    $filter = PredefinedFilters::where('md', '=', $id)->first();
    $deserialize = unserialize($filter->object);

    $results = $this->executeUserFilter($deserialize);
    // here would probably be a notification function like pusher or onesignal
}

Я знаю, что моя попытка достичь этого может быть абсолютно неверной, и я мог бы заново изобрести колесо, так как некоторыеинструменты могут сделать это уже.

Вот пример Элемент Объект MongoDB

{
    "_id": {
        "$oid": "5c0406abdc04e7007f17f4ef"
    },
    "name": "myObject",
    "inner_ID": "0db0b19a-9c01-4c21-8e10-6879dbcb37f1",
    "some_value": false,
    "some_int": 52,
    "set1": [
        {
            "slug": "item_slug1",
            "quantity": 88,
            "extra": {
                "value": 0
            }
        },
    ],
    "set2": [
        {
            "slug": "item_slug2",
            "quantity": 88,
            "extra": {
                "value": 0
            }
        },
        {
            "slug": "item_slug3",
            "quantity": 88,
            "extra": {
                "value": 0
            }
        }
    ],
    "expires": "2018-12-02 22:21:30"
}

Вот мои вопросы

  • Вот такправильно ли это делать?
  • Где должна работать система уведомлений?Я предполагаю, что это может быть в том месте, где я анализирую API элементов, тогда я должен перебрать данные пользовательского фильтра и выполнить запрос к хранимому объекту - или это должна быть отдельная система с именем cron?

Я открыт для любых предложений, переделок.

1 Ответ

0 голосов
/ 05 декабря 2018

Я разработал приложение вроде этого.Мой подход заключается в использовании уведомлений Laravel, найденных здесь: https://laravel.com/docs/5.7/notifications#creating-notifications

Допустим, в вашем случае, если кто-то изменяет / создает данные, другие пользователи, которые подписываются, получат уведомление.

  1. Создать уведомление
php artisan make:notification UserUpdateQuantity
Сделайте пользовательскую модель уведомляемой, а также создайте область, которая подписывается на что-либо
<?php

namespace App;

use Illuminate\Notifications\Notifiable;
use Illuminate\Foundation\Auth\User as Authenticatable;

class User extends Authenticatable
{
    use Notifiable;

    public function scopeSubscribe($query) 
    {
        return $query->where('subscribe', true);
    }
}

$query в методе scopeSubscribe необходимо скорректировать на основе вашей бизнес-логики

Отправить уведомление
$subscriber = User::subscribe()->get();
Notification::send($subscriber, new UserUpdateQuantity());
Создать событие и прослушиватель

Вы можете найти событие и прослушиватель здесь https://laravel.com/docs/5.7/events

В EventServiceProvider

protected $listen = [
    'App\Events\QuantityUpdated' => [
        'App\Listeners\SendUpdateQuantiryNotification',
    ],
];

Затем запустить команду php artisan event:generate

Прослушиватель событий

В прослушиватель событий мы отправляем уведомление

public function handle(QuantityUpdated $event)
{
    $subscriber = User::subscribe()->get();
    Notification::send($subscriber, new UserUpdateQuantity());
}
Eloquent событие

Добавить событие в вашей красноречивой модели, поэтому, когда кто-то обновляет количество, оно вызывает событие, и слушатель отправит уведомление подписанным пользователям

// In your model
protected $dispatchesEvents = [
    'updated' => App\Events\QuantityUpdated::class
];
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...