Zadanie 5. Branch By Abstraction¶
Nowy mikroserwis¶
Przełącz repozytorium na branch recommendations
Pojawia się nowa usługa związana z rekomendacjami produktowymi.
Nowy mikroserwis nie zwraca żadnych danych.
Adres serwisu rekomendacji, wymagany do integracji znajduje się w zmiennej środowiskowej RECOMMENDATIONS_SERVICE_URL
Integracja naszej aplikacji z serwisem rekomendacji¶
Chcemy, aby nasz ProductLookupController zwracał w szczegółach produktu dodatkowo informacje o produktach rekomendowanych.
Response ma dodatkowo zawierać klucz recommendations, pod którym będzie lista identyfikatorów produktów rekomendowanych.
Dane te będziemy pobierać z mikroserwisu rekomendacji i odpowiednio prezentować w odpowiedzi na request do naszej aplikacji.
Te prace wymagają więcej zmian i zdecydowaliśmy, że wprowadzimy dodatkową warstwę abstrakcji.
1. Nowa flaga¶
Do tablicy w main/src/Flags.php dodaj klucz
2. Testy automatyczne¶
2.1. Zmień nazwę testu ProductLookupControllerTest::testControllerReturnsValidResponse na ProductLookupControllerTest::testControllerReturnsValidResponseWithRecommendationsDisabled
2.2. Dopisz kod sprawiający, by test został pominięty, gdy flaga jest włączona.
2.3. Uruchom pipeline.sh, by mieć pewność, że wszystko jest ok.
2.4. Commit.
2.5. Stwórz test ProductLookupControllerTest::testControllerReturnsValidResponseWithRecommendationsEnabled, który testuje zachowanie aplikacji, gdy flaga jest włączona. Dopisz do niego kod, który pominie test, gdy flaga jest wyłączona.
2.6. Uruchom pipeline.sh, by mieć pewność, że wszystko jest ok.
2.7. Commit.
Rozwiązanie
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 | |
3. Implementacja rozwiązania¶
3.1. Utwórz interfejs Tbd\Main\Products\ProductLookupDataProviderInterface
| main/src/Products/ProductLookupDataProviderInterface.php | |
|---|---|
3.2. Utwórz klasę Tbd\Main\Products\ProductLookupStandardDataProvider, która implementuje powyższy interfejs i zwraca wynik zgodnie ze starą logiką.
Rozwiązanie
3.3. Użyj instancji nowo utworzonej klasy w kontrolerze w miejsce starej logiki.
3.4. Uruchom pipeline.sh, by mieć pewność, że wszystko jest ok.
3.5. Commit.
3.6. Utwórz dodatkową warstwę abstrakcji - klasę Tbd\Main\Products\ProductLookupDataProviderAbstraction, która implementuje ten sam interfejs.
Niech ta klasa ma prywatną własność $implementation typu ProductLookupDataProviderInterface.
W konstruktorze, w zależności od stanu flagi show_recommendations_on_product_lookup ustaw własność $implementation. Jeśli flaga jest wyłączona, użyj tam instancji klasy ProductLookupStandardDataProvider.
Metoda getData() powinna być fasadą do metody getData() ustawionej implementacji.
Rozwiązanie
3.7. Użyj instancji ProductLookupDataProviderAbstraction w kontrolerze w miejsce ProductLookupStandardDataProvider.
3.8. Uruchom pipeline.sh, by mieć pewność, że wszystko jest ok.
3.9. Commit.
3.10. Utwórz klasę Tbd\Main\Products\ProductLookupWithRecommendationsDataProvider, która implementuje powyższy interfejs i zwraca wynik zgodnie z nową logiką.
Zaimplementuj konstruktor tak, by przyjmował zależność w postaci obiektu typu RecommendationsServiceInterface.
Rozwiązanie
3.11. Zmodyfikuj ProductLookupDataProviderAbstraction, tak by w przypadku włączonej flagi używać ProductLookupWithRecommendationsDataProvider jako implementacji.
Rozwiązanie
3.12. Przetestuj swoje rozwiązanie za pomocą testów automatycznych, uruchamiając je ze zmienną środowiskową, która włączy flagę
3.13 Zmodyfikuj pipeline.sh, by uruchamiał testy drugi raz, ale z włączoną flagą
3.14. Uruchom pipeline.sh, by mieć pewność, że wszystko jest ok.
3.15. Commit.