voughtdq

voughtdq

Where should per-application validations go?

I have several backend applications that use their own changesets. In the frontend web application, I want to tie the interaction with these backends together to provide a better user experience. In other words, I want to merge changeset errors that the backend applications return and display those to the user.

The idea would be to use the changeset functions for each backend concern:

  def enroll(params) do
    enrollment = Portal.Enrollment.changeset(%Portal.Enrollment{}, params) # used for rendering the form

    user_changeset = Identity.User.changeset(%Identity.User{}, params)
    contact_changeset = Accounts.Contact.changeset(%Accounts.Contact{}, params)
    contact_point_changeset = Account.ContactPoint.changeset(%Accounts.ContactPoint, params)

    enrollment_changeset =
      Enum.reduce([user_changeset, contact_changeset, contact_point_changeset],
        enrollment,
        fn changeset, acc ->
          case Ecto.Changeset.apply_action(changeset, :insert) do
            {:ok, _data} ->
              acc

            {:error, changeset} ->
              %{acc | errors: acc.errors ++ changeset.errors}
          end
        end)

    ...
  end

%Portal.Enrollment{} is an embedded ecto schema used for rendering the forms on the web frontend.

What do you think of this approach? I guess one criticism would be that I should be more defensive and that these validations would be a better fit closer to the user. However, my concern is incongruity between the backend’s validations and the frontend’s. Do you a different way of managing this?

Where Next?

Popular in Questions Top

senggen
Erlang/OTP 25 [erts-13.2.2] [source] [64-bit] [smp:8:8] [ds:8:8:10] [async-threads:1] 15:22:35.803 [error] gen_event {lager_file_backend...
New
aalberti333
As the title describes, I’m trying to run Enum.map() over a list of key/value pairs, where the value is a map. My data looks like this: ...
New
quazar
How to set Jason to encode all fields in ecto schema, I don’t care about security and implementing only is taking long list of attributes...
New
vac
Hi, I'm quite new in Elixir and I'm trying to format a string to a PEM format. I have the certificate value like MIIDBTCCAe2...... and ...
New
freewebwithme
Using vs code and installed ElixirLS: support and debugger. And I got an error popped up on start up says Failed to run ‘elixir’ comma...
New
myronmarston
The Elixir Typespec docs show the following syntax for keyword lists in typespecs: # ... | [key: type] # keyword lis...
New
Fl4m3Ph03n1x
Background Let’s assume I have a typical GenServer that receives messages as requests, does some operation in a DB and returns responses....
New
shahryarjb
Hello, I have map which I want to convert it to string like this: the map: %{last_name: "tavakkoli", name: "shahryar"} the string I ne...
New
Qqwy
Original source of discussion: This topic on the Pragmatic Programmers' Functional Web Development with Elixir, OTP, and Phoenix forum. ...
New
vrod
I am using the Starship cross-shell prompt – it seems pretty nice, but I get some errors: [WARN] - (starship::utils): Executing command ...
New

Other popular topics Top

sergio
In Ruby, I can go: User.find_by(email: "foobar@email.com").update(email: "hello@email.com") How can I do something similar in Elixir? ...
New
lessless
I believe there are people here who are dealing with CSV files import on the daily basis, and since Excel is a really popular tool there ...
New
AstonJ
You’re a programmer, so you don’t need spoon feeding with the conventional drivel about “this is an integer.” No. You need to know what’s...
New
KronicDeth
Elixir plugin for JetBrain’s IntelliJ Platform (including Rubymine) This is a plugin that adds support for Elixir to JetBrains IntelliJ...
289 35421 110
New
SoCreat
i’m a new one to elixir which editor can i use vs code? or atom? Thanks! :smiley:
New
nsuchy
Hi. I’ve noticed that Windows Powershell has it’s own IEX command and you cannot access Elixir’s IEX due to the conflict. This isn’t a cr...
New
freewebwithme
Using vs code and installed ElixirLS: support and debugger. And I got an error popped up on start up says Failed to run ‘elixir’ comma...
New
stefanluptak
Hello everybody, usually, I use a 29" ultra-wide monitor for VSCode which can easily accomodate explorer (files panel) + file with code ...
New
Patoshizzle
After calling mix ecto.create I get this error: 17:00:32.162 [error] GenServer #PID<0.412.0> terminating ** (Postgrex.Error) FATAL...
New
romenigld
I am trying to run a deploy with docker and I successfully runned with this command: docker build -t romenigld/blog-prod . but when I t...
New

We're in Beta

About us Mission Statement