Alodnog
#programowanie #webdev #nodejs #express
Próbuję wdrożyć w dużym projekcie na backendzie architekturę typu route -> controller -> service.
Controller otrzymuje req i res, i wywołuje services (które są zwykłymi funkcjami komunikującymi się z bazą), a potem zwraca to co dostał od danego service.
Powiedzmy że mam w bazie dwie tabele - users i pets. User może mieć wiele petów, więc tabela pets ma foreign key usera.
I teraz co zrobić jeśli chcę usunąć usera?
1. W controllerze wywołać z service Pet funkcję deletePetsOfUser, a potem z service User funkcję deleteUser.
2. W controllerze wywołać z service User funkcję deleteUser, która wywoła w sobie z service Pet funkcję deletePetsOfUser, a potem bezpośrednio usunie usera.
3. W controllerze wywołać z service User funkcję deleteUser, która bezpośrednio usunie zarówno pety usera jak i samego usera.

Co będzie lepszym rozwiązaniem jeśli chodzi o logikę, utrzymanie i zrozumienie kodu?
0
  • Najlepsze
  • Wszystkie komentarze
trevoz
@Alodnog: może zastosuj pattern Controller -> Service -> Repository

W repository będziesz miał tylko i wyłącznie metody odpowiadające za komunikację z bazą danych (get, getBy, insert, update, delete, deleteBy itd) dla konkretnej tabeli. Czyli np. UserRepository działa na tabelce 'users'.

W UserService będziesz miał UserRepository i inne serwisy, które będą Ci
1
Alodnog
@trevoz: Korzystam z TypeORM więc chyba mam tą warstwę Repository z góry narzuconą. To rozwiązanie wydaje się spoko
1
Alodnog
@isamaul: TypeORM, ale bez Nestjs. Sam express
1
Alodnog
@alex-fortune: Tzn jak?
1
Cebulaczon10
@Alodnog: on delete cascade w bazie i elo
0
trevoz
@Alodnog: Może "on delete cascade"? :p

Ja generalnie uważam, że w controllerze nie powinno być zbyt dużo logiki.

Czy masz możliwość w UserService wrzucić PetService? Ja bym to zrobił tak, że funkcja UserService.deleteUserWithPets () wywołuje PetService.deletePets(), a następnie this.deleteUser().
0
Alodnog
@trevoz: W zasadzie to twoja odpowiedź mniej więcej pasuje do punktu 2, a ja sam do końca nie mam tego ustrukturyzowanego i czasem wywołuje w service inne service.
@Cebulaczon10: To usuwanie usera jest tylko przykładem i mógłbym tu faktycznie użyć casacde. Równie dobrze mogłaby tu być zupełnie inna czynność niezwiązana z usuwaniem. Ale mi bardziej chodzi cały sposób podejścia do problemu.
0
isamaul
isamaul
@Alodnog: Nestjs + typerom?
0
alex-fortune
alex-fortune
@Alodnog: Twoje serwisy bardziej przypominają repozytorium, polecilbym jednak nie iść tą drogą i zamodelować to trochę inaczej.
0