thojanssens1

thojanssens1

How can I better split the code in the _web folder by interface/technology?

Say I have the following interfaces/sections in my app:

  • presentation/marketing pages with the registration form, using simple Phoenix templates and controllers for those pages and the registration (no LiveView)

  • a GraphQL interface, using resolvers and schema (serving a JavaScript SPA)

  • an admin backend using LiveView

All those different sections of my application use the same business logic/domain (which would be the foo folder alongside the foo_web folder).

At some point I just thought to create separate apps or dependencies, depending on the common business logic/domain code, but I’m not sure whether it’s a good idea. (I still think that having the marketing website separate in the future might be a good idea in order to separate the traffic of the registered users using the app with the traffic of the public website’s guests and bots by different deployment, but I probably think too prematurely).

As those sections of the website are separate and using different technologies, and in order to not have all this code mixed up together and clearly see which code belongs to which section of the app, is there any code organization technique I could use to group code together by section?
(I still think there might be some code shared such as the Endpoint and other connection configuration, not sure yet).

Any advice is appreciated:)

Marked As Solved

al2o3cr

al2o3cr

I’ve found that an umbrella project works really well for this kind of setup. You’d end up with four directories in apps:

  • a domain (please think of a better name) that has Ecto etc machinery in it and starts a Repo
  • a marketing_web that has an Endpoint attached to (say) port 4000 and has a simple Router
  • an api_web that has an Endpoint attached to port 4100 and talks GraphQL
  • an admin_web that has an Endpoint attached to port 4200 and talks LiveView

The upside of this approach is that each individual *_web is simpler and can skip bits it doesn’t care about - for instance, api_web doesn’t need to start esbuild etc because it doesn’t have assets.

The downside is that network routing gets trickier since there are now three Endpoints on different ports. You can use something like main_proxy to do this inside of your application, or use an external load-balancer that takes care of the details. The last time I set one of these up, we had Nginx routing different subdomains to different ports so that admin.example.com went to admin_web while api.example.com went to api_web.

Also Liked

cmo

cmo

Folders.

It doesn’t really matter where the file is. Create a directory structure under web that makes sense to you, e.g one for marketing, one for admin, one for API.

derpycoder

derpycoder

Yup there is a way to namespace your logic:

Excerpt:

By default, the LiveView modules will be namespaced by the web module. You can customize the web module namespace by passing the --web flag with a module name, for example:

mix phx.gen.live Accounts User users --web Sales

Which would generate the LiveViews in lib/app_web/live/sales/user_live/, namespaced AppWeb.Sales.UserLive instead of AppWeb.UserLive.


See: Web Namespace


P.S. This kinds of separation is why I asked the following question in the forum, to avoid writing presentation and marketing pages in old school way, can’t we just mark a LiveView as InertView or dead view?!?:

Where Next?

Popular in Questions Top

sen
Hi All, I set a environment variables in dev.exs , like below code. when i start server, how can i set the ${enable} value? thanks. d...
New
chokchit
** (DBConnection.ConnectionError) connection not available and request was dropped from queue after 2733ms. You can configure how long re...
New
vertexbuffer
Hello, can anybody help here..? I have a list of players and I what to delete an element, but every for loop the list is reverting to ori...
New
New
ovidiubadita
Hey all, I discovered Elixir and I love it. I always wanted to learn a functional programming and I intended to go for Haskell, but afte...
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
minhajuddin
I have seen a lot of code which picks the first element from a list using Enum.at(0) instead of List.first. Is there a reason why people ...
New
jay1
Why is it that the mnesia database isn’t the most preferred database for use in Elixir/Phoenix?
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
joaquinalcerro
Hi there, I am working with Ecto-Postgresql and I need to call all of the records from a specific table but the table has 40,000 records...
New

Other popular topics Top

TunkShif
This post is an instruction guide to help you setup your Neovim for Elixir development from scratch. It includes general information on h...
274 41539 114
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
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
JorisKok
I have a server on AWS, and was running a load test using artillery. When looking at the Phoenix dashboard I see the Ports going to 100% ...
New
sergio_101
I am VERY much an elixir newbie. I have taken one elixir course and one phoenix course on Udemy. During that course, I saw the instructor...
New
bsollish-terakeet
Credo is smart enough to check for (something like) this: assert length(the_list) == 0 with this response: Checking if an enum is empt...
New
ashish173
I am using Ecto timestamps with postgres, I can see the timestamps() use the :naive_dateime but for my use case I wanted to store the ti...
New
AstonJ
We’ve put together this wiki for Phoenix LiveView - please feel free to add any info you feel is worth including. What is Phoenix LiveV...
New
marick
I had some trouble figuring out how to make many-to-many associations work. Once I got it working, I wrote a blog post. Because I’m a nov...
New
lanycrost
Hi everyone! I need implement if…else if…else condition from my elixir code, and anymore of this control flow structures not work proper...
New

We're in Beta

About us Mission Statement