Endpoint dla zwykłego usera i admina

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?

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

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.

1

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

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:

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

1 użytkowników online, w tym zalogowanych: 0, gości: 1, botów: 0