Laravel + vue - Kilka pytań odnośnie tworzenia API (serwis recenzji ksiązęk)

0

Witam

Czeka mnie miesięczny urlop, a czas na nim chciałbym spędzić kreatywnie i czegoś się poduczyć. Zamierzam w tym celu stworzyć coś na zwór filmweb'a tylko dla książek i do tego celu jako back'end wybrałem Laravela którego już jako tako znam a jako frond Vue , lecz mam kilka problemów które chciałbym rozwiązać zanim zacznę pisać serwis.

  1. Uprawienia użytkownik < -- > książka (many to many -> pivot -> access), każdy będzie mógł dodać książkę, wtedy powstaje relacja użytkownik < -- > książka z pivotem access jako creator.
    Twórca może edytować dane o książce, usuwać książkę, dodawać moderatorów i edytorów (każdy z nową relacją i pivotem access jako "moderator / editor"), moderator może edytować recenzje / komentarze użytkowników, edytor to co moderator oraz edytować dane lecz nie może usunąć książki.

Do tego celu chciałbym użyć (bo tak się powinno ?), gates lub policies ( które się do tego najbardziej nadają ) i sprawdzić przy ich pomocy czy istnieje relacja pomiędzy użytkownikiem a książką i jaki ma on poziom dostępu

  1. Jaki jest sposób aby przy np pobraniu informacji o książce pobrać jednocześnie wszystkie informację odnośnie użytkowników i ich uprawnień (ograniczać ilość zapytań)

  2. Jak przy tworzeniu API dbać o optymalizację zapytań ? normalnie korzystałem z debug bara dzięki któremu mogę sprawdzić czy jest zbyt wiele zapytań i da się ich ilość zmniejszyć przy api nie mam już tej dogodności...

  3. Do API wykorzystam passport oraz vuex, lecz jak sprawdzać csrf ?

Chyba na tą chwile to tyle, za każdą pomoc będę wdzięczny

0

Ad. 1. Zobacz sobie https://github.com/romanbican/roles. Jestem bardzo zadowolony z tej paczki, chyba najbardziej rozbudowana. Tutaj masz dokładnie to o co pytasz -> https://github.com/romanbican/roles#entity-check. Jeżeli masz bardziej zawiłą logikę jeżeli chodzi o dostęp do książki, to musisz chyba jakoś w to wpleść policies.
Ad. 3. Optymalizuj tam gdzie i wtedy gdy to konieczne. Najważniejsze, żebyś uważał na n+1 -> https://laravel.com/docs/5.4/eloquent-relationships#eager-loading. Jak Ci coś będzie zamulać, to wtedy możesz optymalizować.
Ad. 4.

<meta id="token" name="token" content="{{ csrf_token() }}">
Vue.http.headers.common['X-CSRF-TOKEN'] = document.querySelector('#token').getAttribute('content');

Jeżeli chodzi o Twoje drugie pytanie, to co masz na myśli mówiąc: "wszystkie informację odnośnie użytkowników"? Jaka jest między nimi relacja? Mają to być wszyscy użytkownicy, którzy mają do niej uprawnienia?

0
Desu napisał(a):

Ad. 1. Zobacz sobie https://github.com/romanbican/roles. Jestem bardzo zadowolony z tej paczki, chyba najbardziej rozbudowana. Tutaj masz dokładnie to o co pytasz -> https://github.com/romanbican/roles#entity-check. Jeżeli masz bardziej zawiłą logikę jeżeli chodzi o dostęp do książki, to musisz chyba jakoś w to wpleść policies.
Ad. 3. Optymalizuj tam gdzie i wtedy gdy to konieczne. Najważniejsze, żebyś uważał na n+1 -> https://laravel.com/docs/5.4/eloquent-relationships#eager-loading. Jak Ci coś będzie zamulać, to wtedy możesz optymalizować.
Ad. 4.

<meta id="token" name="token" content="{{ csrf_token() }}">
Vue.http.headers.common['X-CSRF-TOKEN'] = document.querySelector('#token').getAttribute('content');

Jeżeli chodzi o Twoje drugie pytanie, to co masz na myśli mówiąc: "wszystkie informację odnośnie użytkowników"? Jaka jest między nimi relacja? Mają to być wszyscy użytkownicy, którzy mają do niej uprawnienia?

Dzięki za odpowiedź,

  1. Zaraz sobie zobaczę i przeanalizuje bo przyznam że chciałbym to sam napisać od zera - człowiek więcej się nauczy ;)

  2. Tak, przy zwracaniu JSON'a chce jednocześnie otrzymać wszystkie informację odnośnie użytkowników którzy mają jakąkolwiek relację z książką, na początku myślałem o użyciu append w modelu, lecz nie wiem czy czy jest sens ?. Potrzebuje pobrać dane książki i relacji przy przejściu na /book/(tytuł), resztę to na froncie:

dane książki, autorów, twórcy strony, moderatorów, edytorów, i czy użytkownik który aktualnie przegląda stronę z książki ma wcześniej wymienione role, lub czy ma główne role jak "administrator, moderator"

  1. Ile zapytań to tak naprawdę za wiele ? zawsze mam z tym problem ;)

  2. Chodziło mi o csrf w przypadku gdy vue ma dostęp tylko do backendu przy pomocy API

0

Ad. 3. Tyle, że Ci zamula aplikacja ;) Trzeba się tu kierować rozsądkiem. Jeżeli pobierasz książkę, to nic nie stoi na przeszkodzie, zeby sobie lazy loadingiem pociągnąć relacje, nawet jak Ci wyjdzie z 15 zapytań. Za to już do jakiś raportów, czy bardziej skomplikowanych list lepiej jest uzyc Query Buildera niz ORM'a. Czasami nawet przy pobieraniu 200 rekordów i dociąganiu jakiś tam relacji wyjdzie Ci 200 i to nie jest jeszcze dużo, bo wszystko szybko działa. Gorzej, jak jesteś tak zdolny, że Ci wyjdzie 22 tyś zapytań (miałem taki przypadek w pracy, chociaz nie wiem jak ktoś tego dokonał :D)

Ad. 4. No ale ta Twoja aplikacja w vue.js nie przechodzi przez index.php? Tu masz np. przykładową w angular js end-to-end. Jak ktoś wchodzi na twojserwis.pl, to mu się renderuje singlepage.php, a pozniej juz wszystko przez API.
https://github.com/davemo/end-to-end-with-angularjs/blob/master/app/views/singlepage.php#L14

0
Desu napisał(a):

Ad. 3. Tyle, że Ci zamula aplikacja ;) Trzeba się tu kierować rozsądkiem. Jeżeli pobierasz książkę, to nic nie stoi na przeszkodzie, zeby sobie lazy loadingiem pociągnąć relacje, nawet jak Ci wyjdzie z 15 zapytań. Za to już do jakiś raportów, czy bardziej skomplikowanych list lepiej jest uzyc Query Buildera niz ORM'a. Czasami nawet przy pobieraniu 200 rekordów i dociąganiu jakiś tam relacji wyjdzie Ci 200 i to nie jest jeszcze dużo, bo wszystko szybko działa. Gorzej, jak jesteś tak zdolny, że Ci wyjdzie 22 tyś zapytań (miałem taki przypadek w pracy, chociaz nie wiem jak ktoś tego dokonał :D)

Ad. 4. No ale ta Twoja aplikacja w vue.js nie przechodzi przez index.php? Tu masz np. przykładową w angular js end-to-end. Jak ktoś wchodzi na twojserwis.pl, to mu się renderuje singlepage.php, a pozniej juz wszystko przez API.
https://github.com/davemo/end-to-end-with-angularjs/blob/master/app/views/singlepage.php#L14

Vue jest całkowicie odseparowany od laravela, żeby jak najwięcej ogarnąć i gdyby byłą w przyszłości potrzeba użycia innego frameworka w jakiś innym projekcie dlatego chciałem się dowiedzieć jak zabezpieczyć się przed csrf na taką ewentualność

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