Endpoint dla zwykłego usera i admina

Endpoint dla zwykłego usera i admina
twoj_stary
  • Rejestracja: dni
  • Ostatnio: dni
  • Lokalizacja: Internet
  • Postów: 28
1

Cześć,
Tworzę sobie RESTowe API pod prosty sklepik internetowy. Na stronie sklepu można przeglądać produkty, ale też nie wszystkie (np. poza tymi oznaczonymi flagą isDeleted), których ceny wyświetlane są po zastosowaniu rabatów. Zarówno admin jak i user powinni widzieć tą samą zawartość sklepu.
Kiedy natomiast admin wejdzie do panelu administratora, to powinien móc widzieć także pozostałe produkty i ich ceny bez żadnych rabatów.
Jak powinno się projektować API pod takie wytyczne? Jakieś dodatkowe endpointy, z których dane mogą pobierać wyłącznie użytkownicy z odpowiednią rangą (administrator) i byłyby używane tylko przez panel administratora czy jeszcze inaczej?

ZP
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 71
0

Mozna sprawdzać w jakim aspekcie przeglądamy listę towarów
Jako guest, user, admin i gdzieś na dole przy przygotowywaniu tej listy uwzględniać ten aspekt np wstrzykując odpowiednie rozwinięcie interfejsu np IPriceResolver IProducts itd

somekind
  • Rejestracja: dni
  • Ostatnio: dni
  • Lokalizacja: Wrocław
1

No ja bym jednak zakładał, że API dla panelu admina będzie inne niż API dla sklepu. I nawet nie o usunięte produkty chodzi, bo to można by było zrealizować przekazując jakiś dodatkowy parametr do warstwy DAO i zwracać więcej/mniej produktów w zależności od roli użytkownika mając tylko jeden endpoint, kontroler i tak dalej do jednej metody DAO. Ale admin raczej będzie chciał widzieć też inne parametry tych produktów, a więc trzeba będzie pobierać z bazy także inne kolumny, a robienie różnych projekcji w zależności od roli to moim zdaniem przesadna ifologia.

Grzegorz Świdwa
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 385
1

W akcjach kontrolera można zrobić coś takiego:

Kopiuj
if(_APIuserManagerService.IsInRole("Admin", Token))
            {
                return JsonConvert.SerializeObject( new { ID = Room.id, Name = Room.Name });
            }
            else
            {
                return JsonConvert.SerializeObject(new { Name = Room.Name });
            }

Dzięki wartości w Token rozpoznaje się użytkownika i odczytuje jego role. Jeżeli jest w podanej roli zwracamy inne informacje niż dla innej roli.
W Twoim przykładzie wyglądałoby to mnij więcej tak:

Kopiuj
if (_APIuserManagerService.IsInRole("Admin", Token))
            {
                return JsonConvert.SerializeObject(_productsService.AllProducts);
            }
            else
            {
                return JsonConvert.SerializeObject(_productsService.ActiveProducts);
            }

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.