StepIndex
Implementación índice Steps
Se realizó una implementación de indexación de la información desnormalizada de los Steps y su información asociada, similar a como se realizó con los envios (ShippingIndex). La diferencia con el índice de Shippings es que en este caso nos apoyamos en una colección en un MongoDB en lugar de usar una tabla en el mismo MySQL, buscando quitarle un poco de carga a la base MySQL.
Al igual que el otro índice, usamos una cola en RabbitMQ para hacer de manera asincrónica la inserción/ actualización en la base MongoDB.
Cola
if_step_index_add
Consumidor
app/console swarrot:consume:step_index_add if_step_index_add -vv
Ejemplo de mensaje a procesar
{ "step":{ "step_id":1151451, "shipment_id":"REP0000000005276", "tracking_id":"OR0001971416", "order_id":"44000124945067", "origin":"Origen", "destination":"Pablo Nogu\u00e9s", "last_state":{ "id": 27593, "step_id": 1151451, "state_nombre": "En proceso de devolucion", "state_id": 51, "date": "2020-09-24 17:22:06", "class": "default", "details": "El pedido se encuentra en proceso de devoluci\u00f3n al seller", "reason": null, "date_create": "2020-09-24 17:23:56" }, "last_state_client":{ "id": 27594, "step_id": 1151451, "state_nombre": "Retirado", "state_id": 8, "date": "2020-09-24 17:22:06", "class": "warning", "details": "IFLOW TIENE EL PAQUETE", "reason": null, "date_create": "2020-09-24 17:24:41" }, "last_state_carrier":{ "id": 27594, "step_id": 1151451, "state_nombre": "Retirado", "state_id": 8, "date": "2020-09-24 17:22:06", "class": "warning", "details": "IFLOW TIENE EL PAQUETE", "reason": null, "date_create": "2020-09-24 17:24:41" }, "route_number":"165009", "receiver":{ "id":925319, "user_id":null, "nickname":null, "first_name":"Ramonees", "last_name":"Galarza", "receiver_name":"Maria Galarzaa", "receiver_phone":"1123423424", "email":"test000000@gmail.com", "company":null, "agency":null, "address_street_name":"Susu Pecoraro", "address_street_number":" ", "address_other_info":" ", "address_neighborhood_name":"TRELEW", "address_zip_code":"9100", "address_city":"TRELEW", "address_state":"CHUBUT", "address_country":"Argentina", "address_floor":" ", "address_apartment":null, "address_between_1":" ", "address_between_2":null, "address_latitude":"-43.41850000", "address_longitude":"-66.01109900" }, "carrier":{ "id":61, "name":"Urbano" }, "queued":"0.19806000 1721385418", "package_details":{ "volume":748, "width":11, "height":17, "length":4, "weight":180 }, "created_at":"2020-05-12 16:48:03", "updated_at":"2020-05-12 16:48:03", "carrier_shipment_id":null, "carrier_destination":null, "carrier_operation":null, "shipping_cost":"6120.31", "cancelled":null }, "type":"new"}Se encola la misma info que se guarda en la base Mongo. Similar a lo que realiza ShippingIndex.
IMPORTANTE:
Se guarda la información del ultimo StepState (ultimo teniendo en cuenta la fecha del estado, no la fecha en que se dió de alta efectivamente en la base), también del el ultimo estado visible para el cliente y el último visible para el carrier. Todo esto teniendo en cuenta los flags de visibilidad de cada StepState.
last_state_clientlast_state_carrierlast_stateColección Índice Mongo
La colección donde se almacenan los documentos se llama: StepIndex
Ejemplo:

En Symfony se utiliza el bundle doctrine/mongodb-odm-bundle, este nos permite utilizar el ORM para insertar/actualizar y buscar entidades en la base Mongo.
Para eso implementamos un documento: StepIndex
Comando para inserción masiva
app/consoles app1:api:steps:index
parametros:
ACCIÓN: list
—carrier=[CARRIERID] (filtra solo steps del carrier con id CARRIERID) —desde=[YYYY-mm-dd] (Lista steps con fecha de alta (created_at) mayor que el parámetro) —hasta=[YYYY-mm-dd] (Lista steps con fecha de alta (created_at) menor que el parámetro) —limit=[integer] aplica un límite (integer) al listado
ACCIÓN: execute
—id=[STEP_ID] Id del step a encolar.
Ejemplos:
LIST: Lista los steps ingresados entre 2019-01-01 y 2019-09-01 para el carrier con id 61
app/console app1:api:steps:index
list —carrier=61 —desde=2019-01-01 —hasta=2019-09-01
en console imprime:
1151229
EXECUTE: Realiza el encolado del step serializado para ser insertado en la colección Mongo
app/console app1:api:steps:index
execute —id=1151229
EndPoint API nueva
Se implementó un nuevo endpoint para el listado de steps de un operador, este listado realiza la búsqueda en la colección MongoDB en lugar de la base MySQL. /api/v2/carrier/step/
Ejemplo con filtro por Id de estado (sigue siendo igual a v1)
/api/v2/carrier/step**/?filter[state_id]=10**