Я пытаюсь разработать систему уведомлений, но я не уверен, правильно ли я выполняю определенные части. Чтобы упростить ситуацию, я буду использовать общее название .
Как должна работать система:
- Зарегистрированный пользователь может подписаться на уведомления на основе выбранных фильтров изтаблица данных сетки.(например, уведомить меня, когда количество элемента равно 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?
Я открыт для любых предложений, переделок.