thojanssens1

thojanssens1

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:)

Showing Posts 1 to 3

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?!?:

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.

— All posts loaded —

Where Next? Top

Trending in Questions Top

Blokh
Hey guys, I’ve got a huge CSV ( around 10 GB ) that needs to be processed hourly Do you guys have any suggestions what is the best prac...
New
kszambelanczyk
Hello! Could someone please give me a help/sample code, how to delete a file from s3 using waffle/waffle_ecto from Phoenix app. I creat...
New
RemyXRenard
I’m seeing that a list inside a Kino.DataTable will be interpreted as a charlist, even if the Kino.configure() is set to charlists: :as_l...
New
matt-savvy
Anyone here using Honeybadger? My Honeybadger account is being overwhelmed with noise from some bots. Seeing a lot of Bandit.HTTPError...
New
velrest
So my question is quite simple and i have found no conclusive answer on forum, google or AI. Should we use :erlang.float for Integer to ...
New
samoloth
Hi, I’ve just set up an application with ash_authentication. There is only magic link strategy for now, so there is no confirmation add o...
New
FlyingNoodle
If a change or preparation module uses Ash.Changeset.get_argument/2 or Ash.Query.get_argument/2 (or any of the other get_argument functio...
New

Other Trending Topics Top

mudasobwa
I am happy to introduce the very α version of the new programming language compiled to BEAM. Welcome Cure. It has literally three kille...
New
garrison
Hobbes is a low-level distributed database for the Elixir programming language. Hobbes provides a simple, safe, and scalable storage lay...
New
jimsynz
Beam Bots (or just BB for short) is a framework for building fault-tolerant robotics applications in Elixir using familiar OTP patterns. ...
New
mcass19
ExRatatui lets you cook up rich terminal UIs in Elixir, powered by Rust’s ratatui via Rustler NIFs. Build interactive terminal applicatio...
New
Damirados
Hello everyone. After busy few months I am happy to announce v0.1.0 of Emerge & Solve. They are GUI (Emerge) and State management (S...
New
netoum
Corex is an accessible, unstyled UI component library for Phoenix that integrates Zag.js state machines using Vanilla JavaScript and Live...
New

We're in Beta

About us Mission Statement

Options

Thread Display Mode




Thread Preview

Skip Thread Previews