Warstwa Abstrakcji - stanowi izolację pomiędzy kodem programisty a zewnętrznymi modułami, pozwala odseparować system od jego zależności przez co czyni go podatnym na zmiany i aktualizacje. Przywiązując system do innej usługi czynimy go słabym.

Scratchpad post

2020-03-18

Każdy, kto musiał integrować kiedykolwiek swój system z systemami zewnętrznymi, wie jak bardzo bolesne potrafi być takie doświadczenie. Często trzeba coś na szybko sprawdzić, dokumentacja mówi jedno a API drugie. Jeszcze gorzej jeżeli taka integracja polega na procesowaniu raportów w dziwnych formatach. Jak najlepiej podejść do takiego tematu?

O ile jeszcze flow integracji jest dobrze zdefiniowany i klarowny tak można się pokusić o napisanie wszyskiego od kopa, przeprowadzenie kilku manualnych testów i deploy na produkcję. Co jednak w sytuacji, w której sami do końca nie wiemy czego się spodziewać, kiedy dane nie są klarowne, jest ich bardzo? Ano wtedy debugujemy... Tylko co jeżeli do debugowania potrzebujemy jakoś na szybko połączyć te dane z naszym kodem, żeby zobaczyć jak się zachowa?

Ja przed rozpoczęciem właściwej implementacji najpierw staram się przygotować plan działania. Plan oparty o dane, nigdy przypuszczenia. Tylko jak pozyskać te dane? Popatrzmy na taką sytuację, integrujesz się z Amazon MWS API, które pozwala pobrać raport XML z wszystkimi zamówieniami. Patrzymy w dokumentację i widzimy taki oto raport:

_GET_XML_ALL_ORDERS_DATA_BY_ORDER_DATE_

XML file order report that returns all orders placed in the specified date range regardless of fulfillment channel or shipment status. This report is intended for order tracking, not to drive your fulfillment process; it does not include customer identifying information and scheduling is not supported. For all sellers.

No niezbyt wiele tu informacji, w internecie też wiele więcej nie znajdziemy. Mamy teraz dwa wyjścia. Możemy skorzystać z narzędzia, które udostępnia amazon https://mws.amazonservices.com/scratchpad/index.html nie jest to jednak zbyt przyjemne.

Inną opcją jest przygotowanie własnego scratchpadu. Załóżmy, że struktura naszego projektu wygląda jakoś tak:

.
├── bin
├── composer.json
├── composer.lock
├── public
├── README.md
├── resources
├── src
├── var
└── vendor

W zasadzie jedyne co musimy zrobić to stworzyć folder scratchpad i dodać następujący wpis do gitignore

/scratchpad/*
!/scratchpad/template

Plik template może wyglądać w następujący sposób:

#!/usr/bin/env php
<?php

set_time_limit(0);

require __DIR__.'/../vendor/autoload.php';

Domyślasz się już o co chodzi? Tak, to taki podręczny brudnopis programisty. Tak tak, nie chcemy, aby cokolwiek z scratchpada trafiło do repo, w końcu to brudnopis! Ten kod nie jest czysty, nie jest przetestowany, to tylko eksperyment. Jest to miejsce, w którym możemy sobie napisać szybki kodzik, który pobierze nam raport, zapisze go gdzieś, a potem po nim przeiteruje dumpując na ekran interesujące nas dane.

Tak, wiem, niby nic odkrywczego, ale uwierz, jeżeli nie masz w projekcie takiego brudnopisu to nawet nie wiesz co tracisz!

Możesz zapytać, no ale przecież taki brudnopis to ja sobie mogę zrobić poza projektem, bez śmiecenia. A no możesz, tylko że wtedy o wiele trudniej będzie Ci zrobić coś takiego:

#!/usr/bin/env php
<?php

set_time_limit(0);

require __DIR__.'/../vendor/autoload.php';

(new Dotenv())->load(__DIR__.'/../../.env');

$kernel = new AppKernel('dev', true);
$kernel->boot();

$kernel->getContainer()->get('doctrine')->getEntityManager()->getConnection()->fetchColumn('....');

Dlaczego miałbyś robić coś takiego? Nie wzsystkie dane odnośnie zamówienia dostaniesz w jednym raporcie, czasami musisz pobrać ich kilka, czasami będziesz potrzebował zbadać czy to co masz w bazie pokrywa się z tym, co przychodzi w raporcie a czasami w kodzie będziesz miał pewną logikę, którą będziesz chciał wykorzystać w czasie procesowania raportu.

Przykład? Ano prosę Cię bardzo, poza zamówieniami chciałbyś ściągnąć jeszce informację o wysyłkach. Znajdujesz raport _GET_AMAZON_FULFILLED_SHIPMENTS_DATA_, pobierasz przykładowy raport, znajdujesz w nim co chcesz, implementujesz wzsystko a potem z produkcji dowiadujesz się, że Amazon tak fajnie przygotował cały swój system, że w zamówienie złożone z 5 itemów może mieć 5 różnych shipmentów a te mogą być dostępne w 5 kolejnych raportach.

Iterując po raportach w brudnopisie, porównując je, budując sobie taki wstępny model oszczędzisz sobie naprawdę sporo debugowania na produkcji.

Do czego jeszcze przydaje się brudnopis? Można w nim np wysłać do systemu kilka komend tak aby odtworzyć sobie lokalnie sytuację z produkcji i manualnie przetestować jakieś zachowanie. Możliwości są praktycznie nieograniczone.

Na koniec powtórzę tylko, że Scratchpad to nic odkrywczego, czasami jednak najtrudniej wpaść na najprostsze pomysły.


Masz pytanie?
Napisz: [email protected]
Akceptuję

Ten serwis używa plików cookies. Więcej o plikach cookies.