-
Notifications
You must be signed in to change notification settings - Fork 0
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
#issue-144/user create security #153
base: master
Are you sure you want to change the base?
Conversation
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Dokończę to review w przyszłym tygodniu
@@ -2,6 +2,15 @@ defmodule Perseids.CustomerController do | |||
use Perseids.Web, :controller | |||
import Perseids.Gettext | |||
|
|||
defstruct( |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
@gorzki IMO lepiej będzie zrobić model bez kolekcji w bazie (analogicznie jak modele PORO w Rails), a dla tych co mają bazę i będziemy je chcieli walidować po prostu dodamy defstruct. Generalnie spoko pomysł z wykorzystanie structa 👍 Po prostu nie róbmy go dla całego kontrolera.
@@ -61,4 +74,109 @@ defmodule Perseids.CustomerController do | |||
defp maybe_put_key(true, params, key, value), do: Map.put(params, key, value) | |||
defp maybe_put_key(false, params, _key, _value), do: params | |||
|
|||
defp check_is_valid?(struct, errors \\ []) do |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
@gorzki Całą logikę walidacji trzeba umieścić w oddzielnym module, który będzie działał na zasadzie przyjmowania structa i paramsów i zwracał co trzeba. Dzięki temu będziemy go mogli używać gdzie zechcemy w jasny sposób.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Ogólnie nie za bardzo wiem co o tym myśleć.
Na pewno działa, ale kod wydaje mi się tak zawiły, że będzie nieutrzymywalny.
Sam pomysł ze structem, do którego będzie porównywany dany changeset (bo to wszystko powinno trafić do modelu), jest wg mnie bardzo dobry, natomiast implementacja mnie przeraża :) Nie chodzi o całokształt, ale głównie o funkcje get_key
i check_key
- zwyczajnie nie jestem w stanie załapać co robią.
Nie chcę tego dołączać do mastera, a jednocześnie nie chcę tego tracić, bo to, w połączeniu z walidacjami w order.ex
może być niezłym punktem wyjścia do solidnego modułu walidacji.
Proponowałbym Ci w "wolnej chwili" jakoś uprościć te dwie funkcje o których wspomniałem a potem spróbować wyodrębnić to do oddzielnego modułu, przenieść structa do modelu, w modelu użyć tej walidacji w stylu struct vs changeset. Jeśli wtedy zadziała wszystko ładnie - lećmy w to. Jeśli nie to trzeba to zrobić inaczej.
Pytanie ->
W chwili obecnej ogarnia pojedyncze obiekty, jeżeli obiekt zawiera listę obiektów sprawdzi tylko jeden. Będzie do rozbudowy w (Order, Products)? gdzie wysyłana jest lista. W takim przypadku trzeba dodac jeszcze jedna metode która sprawdzi czy to jest lista argumentów i odpowiednio przekieruje do pozostałych metod