Cookbook jest aplikacją webową i desktopową umożliwiającą przeglądanie, wyszukiwanie i zapisywanie przepisów na dania i koktajle. Celem projektu było zaprojektowanie i zbudowanie aplikacji, które będą konsumowały zewnętrzne API i synchronizowały między sobą stan użytkownika. Dodatkowym kryterium miało być zastosowanie poznanych wzorców projektowych i jak największe pokrycie kodu testami. Aplikacja desktopowa miała być natywna, było zakazane wykorzystanie technologii WebView (żeby nie robić wrappera aplikacji webowej). Aplikacje wykonane na laboratorium z przedmiotu “Zaawansowane metody programowania” w semestrze letnim 2020/2021.

logo aplikacji

Podział prac

Nad projektem aplikacji pracowała dwu osobowa grupa. Skład i podział prac wyglądał następująco:

  • Karpiński Maciej:
    • Aplikacja desktopowa
    • DevOps;
    • Backend Firebase.
  • Kuczma Łukasz:
    • Aplikacja webowa
    • Backend Firebase.

Opis funkcjonalny

System realizuje następujące funkcjonalności:

  • Aplikacja desktopowa
    • Aplikacja dla systemu Windows,
    • Aplikacja dla systemu Linux,
    • Logowanie przy pomocy e-maila,
    • Logowanie przy pomocy Google,
    • Logowanie przy pomocy Facebooka,
    • Przeglądanie przepisów na posiłki,
    • Przeglądanie przepisów na koktajle,
    • Dodawanie i usuwanie ulubionych przepisów na posiłki,
    • Dodawanie i usuwanie ulubionych przepisów na koktajle,
    • Synchronizacja z bazą danych Cloud Firestore.
  • Aplikacja webowa
    • Przeglądanie przepisów posiłków,
      • Wyszukiwanie posiłków po nazwie
      • Wyszukiwanie posiłków po kategorii
      • Wyszukiwanie posiłków po regionie świata
      • Wyszukiwanie posiłków po składnikach
    • Logowanie przy pomocy e-maila,
    • Logowania przy pomocy konta Google,
    • Logowanie przy pomocy konta Facebook,
    • Dodawanie i usuwanie przepisów do/z ulubionych,
    • Synchronizacja między aplikacjami,
    • Obsługa zewnętrznych API z przepisami posiłków,
    • Obsługa bazy danych Cloud Firestore

Interfejs

Interfejs aplikacji został zaprojektowany przy użyciu narzędzia Glade. Aplikacja w systemie Linux podąża za ustawionym motywem w systemie. W Windowsie występuje jedynie motyw adwaita. Aplikacja po uruchomieniu wygląda następująco:

GUI 1 GUI 2

Stack technologiczny aplikacji desktopowej

Aplikacja desktopowa została stworzona przy wykorzystaniu następujących technologii:

Podsumowanie

Przed rozpoczęciem pracy nad aplikacją poznałem język programowania 🦀 Rust 🦀, który oczarował mnie od samego początku. Wcześniej pisałem różne większe i mniejsze aplikacji w różnych językach, ale zawsze mi w każdym coś nie pasowało aż do czasu gdy poznałem Rust, który mnie oczarował od samego początku, bawiłem się nim trochę, ale połączenie pracy i studiów nie pozwalało mi zrobić czegoś większego, ten projekt pozwolił mi poznać dobrze ten język i jak w przypadku innych języków nie zniechęcił mnie do siebie. Każdy, kto kiedyś programował w Rustcie wie, że borrow checker się czepia, ale jak tylko udało mi się go “pokonać” 🤣 wszystko, co zaprogramowałem działało a jeśli nadal był jakiś problem to był on natury logicznej jak np. nieprawidłowe wywołanie API albo wywołanie funkcji w nieprawidłowej kolejności niż jakieś wiszące wskaźniki czy nieprawidłowe argumenty przekazane do funkcji. Tworzenie aplikacji było mniejszym wyzwaniem niż początkowo się wydawało, praca nad projektem bardzo rozwinęła moją znajomość tego języka programowania. Brak oficjalnego SDK do API Google Firebase i słabo rozwinięte niektóre biblioteki stworzone przez użytkowników sprawiały niekiedy problemy, przez co musiałem część funkcjonalności stworzyć samemu, kod odpowiedzialny za OAuth2 po zakończeniu projektu rozwinąłem i udostępniłem bibliotece, z którą pracowałem. Wybór technologii GTK do stworzenia interfejsu użytkownika był nowym i interesującym doświadczeniem, jedynymi problemami okazała się słaba dokumentacja dotycząca kompilacji aplikacji dla systemu Windows, oraz niekompatybilność biblioteki WebKit (o czym w czasie wyboru technologii nie wiedziałem) z systemem Windows, przez co jedna z zaplanowanych funkcjonaliści nie działa do końca jak chciałem, ale obszedłem to w inny sposób, który ostatecznie okazał się lepszy (zamiast otwierać ekran logowania przez WebView, otwierałem przeglądarkę i nasłuchiwałem odpowiedzi zwrotnej). Tworząc aplikacje nauczyłem się wielu rzeczy takich jak cross kompilacja, autoryzacja OAuth2, obsługa Google Firebase, Travis CI czy wykorzystanie zewnętrznego API w aplikacji dekstopowej.

Repozytorium kodu

Repozytorium projektu znajduje sie na moim GitHubie. Można tam również pobrać aplikację desktopową.

Aplikacja webowa dostępna jest tu