Hej

Front posiada stronę o nazwie "komunikacja" która ma widok zakładkowy. Składa się ona z 6 zakładek;
Nazwy zakładek: Wszystkie, Wiadomości, Wnioski, Newsy , Protokoły, Inne

Opis frontowy

  • Zakładka wszystkie scala wyniki z innych zakładek sortując je po dacie.
  • Każda zakładka posiada licznik nieprzeczytanych
  • Zakładka wszystkie posiada filtry takie jak "search query", "zakres daty from - to", "pokaż nieprzeczytane"
  • Inne zakładki dziedziczą filtry z zakładki wszystkie ale również mają dodatkowe swoje takie jak "filtrowanie po nazwie grupy","filtrowanie po typie", itp

Item listy ma takie właściwości:

  • id
  • externalId
  • type (typ komunikatu np wniosek, news itp)
  • date
  • title (multilang)
  • description (multilang)
  • status (multilang)
  • readStatus (per user)
  • hasAttachment

Schemat architektury backend'u:

facade-api.jpg

W facade-api mam interfejs który implementuje 5 serwisów (zakładek)

public interface TabService<T extends Filter> {
    CommunicationPage getList(UserContext userContext, T requestFilter, PageRequest pageRequest);
    int getUnreadCounter(UserContext userContext);
}

i interfejs który odpowiada za zakładke All

public interface AllTabService {
    CommunicationPage getList(UserContext userContext, AllTabFilter requestFilter, PageRequest pageRequest);
    Map<CommunicationType, Integer> getUnreadCounter(UserContext userContext);
}

Każde API posiada mechanizm paginacji "page", "size"

Z pojedynczą zakładką nie ma problemu bo strzelam bezpośrednio do API po wyniki

Sprawa trochę komplikuje się na zakładce "wszystkie" ;)

zrobiłem takie POC:

  1. Każde API wołam asynchronicznie za pomocą CompletableFuture
  2. Czekam na wyniki
  3. Merguje do jednej listy i sortuje po dacie
  4. Licze offset i limit aby przyciąć wyniki

Np.
Front wysyła request o:
0 - strona, wołam każde API page=0&size=10
1 - strona, wołam każde API page=0&size=20
2 - strona, wołam każde API page=0&size=30

dla page=2 robie stream.offset(20).limit(10)

Jako POC działa to dobrze ale szukam kierunku docelowego.Testowałem logike odpisywania do cache offsetu ile wykorzystałem "itemów" z danego API wydaje mi się ze to dobry kierunek.

Może ma ktoś pomysł na jeszcze inny mechanizm ?