<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Cédric Pierre</title>
    <description>The latest articles on DEV Community by Cédric Pierre (@cedricpierre).</description>
    <link>https://dev.to/cedricpierre</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F3187955%2F9a8449df-6499-49db-be59-bade47091fa4.jpeg</url>
      <title>DEV Community: Cédric Pierre</title>
      <link>https://dev.to/cedricpierre</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/cedricpierre"/>
    <language>en</language>
    <item>
      <title>What Makes a Strong Engineer (Beyond Writing Code)</title>
      <dc:creator>Cédric Pierre</dc:creator>
      <pubDate>Wed, 18 Mar 2026 09:35:22 +0000</pubDate>
      <link>https://dev.to/cedricpierre/what-makes-a-strong-engineer-beyond-writing-code-5bjk</link>
      <guid>https://dev.to/cedricpierre/what-makes-a-strong-engineer-beyond-writing-code-5bjk</guid>
      <description>&lt;p&gt;As a &lt;a href="https://www.toptal.com/developers/full-stack" rel="noopener noreferrer"&gt;full-stack engineer&lt;/a&gt;, I don’t measure engineering strength by how much code I write (AI agents are way faster than me), but by how I handle complexity, make decisions, and build systems that work and last in the real world.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;I Think in Systems, Not Features&lt;/strong&gt; &lt;/p&gt;

&lt;p&gt;In most of the projects I had the opportunity to work on, I realized than a common struggle in the lack of long term and global vision. People think in features before thinking in data structures.&lt;br&gt;
I’m convinced that solid foundations are essentials to build a system that can last a decade.&lt;/p&gt;

&lt;p&gt;I approach problems by understanding how the entire system behaves, not just individual components.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;I Simplify What Others Overcomplicate&lt;/strong&gt; &lt;/p&gt;

&lt;p&gt;Real-world systems are messy: unreliable networks, inconsistent data, edge cases everywhere.&lt;br&gt;&lt;br&gt;
My role is to reduce that chaos into clear, maintainable structures. Removing unnecessary complexity while preserving flexibility.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;I Make Decisions Under Uncertainty&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;There is rarely a perfect solution in production systems.&lt;br&gt;&lt;br&gt;
I’m comfortable making trade-offs, taking responsibility for technical direction, and adjusting when reality proves assumptions wrong.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;I Move Fast, but With Intent&lt;/strong&gt; &lt;/p&gt;

&lt;p&gt;Speed matters, especially in product environments.&lt;br&gt;&lt;br&gt;
But I don’t sacrifice long-term stability for short-term delivery. I aim to build foundations that allow systems to evolve without constant rewrites.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;I Communicate to Create Clarity&lt;/strong&gt; &lt;/p&gt;

&lt;p&gt;Engineering is not just about solving problems — it’s about making them understandable.&lt;br&gt;&lt;br&gt;
I ensure that decisions, trade-offs, and system behaviors are clear to both engineers and non-technical stakeholders.&lt;/p&gt;




&lt;p&gt;Strong engineering is not about knowing everything.&lt;br&gt;&lt;br&gt;
It’s about consistently making the right decisions in complex, imperfect environments and building systems that hold up over time. A good engineer is language agnostic.&lt;/p&gt;

</description>
      <category>architecture</category>
      <category>career</category>
      <category>softwareengineering</category>
      <category>systemdesign</category>
    </item>
    <item>
      <title>Code now. Think later. Suck it up.</title>
      <dc:creator>Cédric Pierre</dc:creator>
      <pubDate>Tue, 30 Dec 2025 22:08:51 +0000</pubDate>
      <link>https://dev.to/cedricpierre/code-now-think-later-suck-it-up-dhf</link>
      <guid>https://dev.to/cedricpierre/code-now-think-later-suck-it-up-dhf</guid>
      <description>&lt;p&gt;&lt;em&gt;AI made execution cheap. Responsibility didn’t.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;⚠️ &lt;strong&gt;Our industry has a problem.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;We increasingly celebrate &lt;strong&gt;speed&lt;/strong&gt; over &lt;strong&gt;quality&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Shipping fast is praised.&lt;br&gt;&lt;br&gt;
Launching quickly is admired.&lt;br&gt;&lt;br&gt;
Writing less code is framed as intelligence.&lt;/p&gt;

&lt;p&gt;Meanwhile, quality has become:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;harder to show
&lt;/li&gt;
&lt;li&gt;harder to measure
&lt;/li&gt;
&lt;li&gt;harder to defend
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;So it slowly disappeared from the conversation.&lt;/p&gt;

&lt;p&gt;And when &lt;strong&gt;speed becomes the main signal of success&lt;/strong&gt;,&lt;br&gt;&lt;br&gt;
&lt;strong&gt;responsibility quietly fades away&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;That’s not an abstract concern.&lt;br&gt;&lt;br&gt;
That’s how fragile systems are born.&lt;/p&gt;




&lt;h2&gt;
  
  
  Most Developers Are Not Taught to Be Responsible
&lt;/h2&gt;

&lt;p&gt;🧠 I don’t think most developers lack responsibility because they don’t care.&lt;br&gt;&lt;br&gt;
I think they were simply never taught to &lt;strong&gt;carry consequences&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;From the very beginning, developers are trained to solve problems,&lt;br&gt;&lt;br&gt;
&lt;em&gt;not to live with the impact of their decisions&lt;/em&gt;.&lt;/p&gt;

&lt;p&gt;At school, in tutorials, in bootcamps, success looks like this:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;the code runs
&lt;/li&gt;
&lt;li&gt;the tests pass
&lt;/li&gt;
&lt;li&gt;the exercise is validated
&lt;/li&gt;
&lt;li&gt;you move on
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Nothing lasts long enough for responsibility to appear.&lt;/p&gt;

&lt;p&gt;Bad decisions have no real cost.&lt;br&gt;&lt;br&gt;
Shortcuts don’t come back to haunt you.&lt;br&gt;&lt;br&gt;
You rarely have to maintain what you built months later.&lt;/p&gt;

&lt;p&gt;So an implicit rule settles in early:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;If it works, it’s good enough.&lt;/strong&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  Responsibility Requires Exposure Over Time
&lt;/h2&gt;

&lt;p&gt;Responsibility is not something you learn from theory.&lt;br&gt;&lt;br&gt;
It appears when your own decisions come back to you.&lt;/p&gt;

&lt;p&gt;When you have to maintain your code months later.&lt;br&gt;&lt;br&gt;
When a shortcut becomes a blocker.&lt;br&gt;&lt;br&gt;
When a vague model turns every change into friction.&lt;br&gt;&lt;br&gt;
When there is no one else to blame.&lt;/p&gt;

&lt;p&gt;That’s when responsibility shows up.&lt;/p&gt;

&lt;p&gt;Not as a concept.&lt;br&gt;&lt;br&gt;
&lt;strong&gt;As a feeling.&lt;/strong&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  Why Solo Projects Often Change Everything
&lt;/h2&gt;

&lt;p&gt;🧱 For many developers, the first real encounter with responsibility happens when they work alone on something that actually matters.&lt;/p&gt;

&lt;p&gt;A personal project.&lt;br&gt;&lt;br&gt;
A freelance contract.&lt;br&gt;&lt;br&gt;
A product with real users.&lt;/p&gt;

&lt;p&gt;When you’re alone:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;there is no spec to hide behind
&lt;/li&gt;
&lt;li&gt;no architect to blame
&lt;/li&gt;
&lt;li&gt;no other team to absorb the mess
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Every compromise is yours.&lt;br&gt;&lt;br&gt;
Every flaw has your name on it.&lt;/p&gt;

&lt;p&gt;The question stops being:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Does this work?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;It becomes:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Can I live with this?&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
&lt;strong&gt;Will this hurt me later?&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
&lt;strong&gt;Would I defend this decision under pressure?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;That shift changes everything.&lt;/p&gt;




&lt;h2&gt;
  
  
  What Being Responsible Actually Means
&lt;/h2&gt;

&lt;p&gt;Being responsible as a developer is not about perfection.&lt;br&gt;&lt;br&gt;
It’s not about predicting the future.&lt;br&gt;&lt;br&gt;
And it’s definitely not about writing clever code.&lt;/p&gt;

&lt;p&gt;Responsibility is about &lt;strong&gt;anticipation&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Not fixing every problem in advance,&lt;br&gt;&lt;br&gt;
but knowing where things can break.&lt;br&gt;&lt;br&gt;
Knowing which assumptions are fragile.&lt;br&gt;&lt;br&gt;
Knowing what will hurt when the project evolves.&lt;/p&gt;

&lt;p&gt;A responsible developer doesn’t say:&lt;/p&gt;

&lt;p&gt;&lt;em&gt;“We didn’t know.”&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;They say:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;“We knew this was a risk.”&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;That difference matters.&lt;/p&gt;




&lt;h2&gt;
  
  
  Responsibility Means Thinking Beyond Yourself
&lt;/h2&gt;

&lt;p&gt;Most code is not written for machines.&lt;br&gt;&lt;br&gt;
It’s written for &lt;strong&gt;people&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Sometimes for colleagues.&lt;br&gt;&lt;br&gt;
Sometimes for people you’ll never meet.&lt;br&gt;&lt;br&gt;
Very often for your future self.&lt;/p&gt;

&lt;p&gt;Being responsible means asking:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Will someone understand why this exists?
&lt;/li&gt;
&lt;li&gt;Can this be changed safely?
&lt;/li&gt;
&lt;li&gt;Is the intent clear, or only the implementation?
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If your code only makes sense to you today,&lt;br&gt;&lt;br&gt;
you are exporting complexity to others tomorrow.&lt;/p&gt;

&lt;p&gt;Responsibility is &lt;strong&gt;empathy over time&lt;/strong&gt;.&lt;/p&gt;




&lt;h2&gt;
  
  
  Responsibility Is About Evolution, Not Just Features
&lt;/h2&gt;

&lt;p&gt;Projects rarely fail because a feature is missing.&lt;br&gt;&lt;br&gt;
They fail because evolution becomes painful.&lt;/p&gt;

&lt;p&gt;Responsibility means thinking early about:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;how the model can grow
&lt;/li&gt;
&lt;li&gt;where flexibility is required
&lt;/li&gt;
&lt;li&gt;where rigidity is intentional
&lt;/li&gt;
&lt;li&gt;which parts must stay simple at all costs
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This is not about predicting everything in advance.&lt;br&gt;&lt;br&gt;
It’s about &lt;strong&gt;not painting yourself into a corner&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Good systems don’t guess the future.&lt;br&gt;&lt;br&gt;
They &lt;strong&gt;tolerate change&lt;/strong&gt;.&lt;/p&gt;




&lt;h2&gt;
  
  
  Scalability Is First a Human Problem
&lt;/h2&gt;

&lt;p&gt;📈 Scalability is often reduced to performance.&lt;br&gt;&lt;br&gt;
More users. More data. More throughput.&lt;/p&gt;

&lt;p&gt;That’s rarely the hard part.&lt;/p&gt;

&lt;p&gt;The real scalability problem is human.&lt;/p&gt;

&lt;p&gt;Can new developers understand the system?&lt;br&gt;&lt;br&gt;
Can they reason about it?&lt;br&gt;&lt;br&gt;
Can they change it without fear?&lt;/p&gt;

&lt;p&gt;A system that scales technically but collapses cognitively&lt;br&gt;&lt;br&gt;
is already failing.&lt;/p&gt;

&lt;p&gt;Responsibility includes thinking about &lt;strong&gt;conceptual scalability&lt;/strong&gt;,&lt;br&gt;&lt;br&gt;
not just infrastructure.&lt;/p&gt;




&lt;h2&gt;
  
  
  AI Didn’t Remove Responsibility. It Made It More Visible
&lt;/h2&gt;

&lt;p&gt;🤖 AI doesn’t create technical debt.&lt;br&gt;&lt;br&gt;
It accelerates execution.&lt;/p&gt;

&lt;p&gt;That’s it.&lt;/p&gt;

&lt;p&gt;When systems become messy or fragile,&lt;br&gt;&lt;br&gt;
it’s not because AI wrote the code.&lt;br&gt;&lt;br&gt;
It’s because &lt;strong&gt;developers accepted the structure&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;AI makes bad decisions cheap to implement.&lt;br&gt;&lt;br&gt;
That makes responsibility &lt;em&gt;more important&lt;/em&gt;, not less.&lt;/p&gt;

&lt;p&gt;Blaming the tool is easy.&lt;br&gt;&lt;br&gt;
Owning the decisions is harder.&lt;/p&gt;




&lt;h2&gt;
  
  
  Responsibility Is Preventive Work, Which Is Why It’s Invisible
&lt;/h2&gt;

&lt;p&gt;⏱️ Irresponsibility reacts.&lt;br&gt;&lt;br&gt;
Responsibility prevents.&lt;/p&gt;

&lt;p&gt;It removes ambiguity instead of documenting it.&lt;br&gt;&lt;br&gt;
It creates boundaries instead of adding checks everywhere.&lt;br&gt;&lt;br&gt;
It eliminates entire classes of problems instead of fixing symptoms.&lt;/p&gt;

&lt;p&gt;When it works:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;nothing breaks
&lt;/li&gt;
&lt;li&gt;nothing goes down
&lt;/li&gt;
&lt;li&gt;nothing gets noticed
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;em&gt;And that’s exactly why it’s undervalued.&lt;/em&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  Why Responsibility Is Worth It
&lt;/h2&gt;

&lt;p&gt;Being responsible is rarely rewarded immediately.&lt;br&gt;&lt;br&gt;
It slows you down early.&lt;br&gt;&lt;br&gt;
It creates friction.&lt;br&gt;&lt;br&gt;
It forces uncomfortable discussions.&lt;/p&gt;

&lt;p&gt;But over time, it pays back relentlessly.&lt;/p&gt;

&lt;p&gt;Responsible developers:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;write less code
&lt;/li&gt;
&lt;li&gt;undo fewer decisions
&lt;/li&gt;
&lt;li&gt;refactor less in panic
&lt;/li&gt;
&lt;li&gt;move faster as systems grow
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;They don’t look fast on day one.&lt;br&gt;&lt;br&gt;
They look &lt;strong&gt;solid years later&lt;/strong&gt;.&lt;/p&gt;




&lt;h2&gt;
  
  
  Final Thought
&lt;/h2&gt;

&lt;p&gt;Responsibility is not a soft skill.&lt;br&gt;&lt;br&gt;
It’s not a personality trait.&lt;br&gt;&lt;br&gt;
And it’s not optional.&lt;/p&gt;

&lt;p&gt;It’s a &lt;strong&gt;professional stance&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;AI didn’t change what developers are responsible for.&lt;br&gt;&lt;br&gt;
It only made it easier to forget.&lt;/p&gt;

&lt;p&gt;A good developer doesn’t just make things work.&lt;br&gt;&lt;br&gt;
&lt;strong&gt;They make decisions they are willing to own.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;And when things break later?&lt;/p&gt;

&lt;p&gt;Well.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Suck it up.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>ai</category>
      <category>ownership</category>
      <category>programming</category>
      <category>architecture</category>
    </item>
    <item>
      <title>🔫Why You Suck at Structuring Data And How to Finally Get Better 💪</title>
      <dc:creator>Cédric Pierre</dc:creator>
      <pubDate>Thu, 04 Dec 2025 21:42:08 +0000</pubDate>
      <link>https://dev.to/cedricpierre/why-you-suck-at-structuring-data-and-how-to-finally-get-better-1k1d</link>
      <guid>https://dev.to/cedricpierre/why-you-suck-at-structuring-data-and-how-to-finally-get-better-1k1d</guid>
      <description>&lt;p&gt;Let’s be honest.&lt;br&gt;&lt;br&gt;
Most developers — frontend and backend — suck at structuring data.&lt;/p&gt;

&lt;p&gt;Not because they’re stupid.&lt;br&gt;&lt;br&gt;
Not because they’re lazy.&lt;br&gt;&lt;br&gt;
But because the industry taught them to think in &lt;strong&gt;screens&lt;/strong&gt;, not &lt;strong&gt;systems&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Once you understand this, everything starts to make sense.&lt;/p&gt;

&lt;p&gt;Let’s break the taboo.&lt;/p&gt;


&lt;h2&gt;
  
  
  1. You think in UI, not in domain
&lt;/h2&gt;

&lt;p&gt;Most devs start from a Figma screen or a quick whiteboard sketch — but rarely from actual business logic.&lt;/p&gt;

&lt;p&gt;They ask:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;“What JSON do I need for this response?”&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;instead of:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;“What does the underlying domain really look like?”&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;So the API becomes a &lt;strong&gt;reflection of the UI&lt;/strong&gt;, not of the business.&lt;/p&gt;

&lt;p&gt;Your tables, models, and routes start to smell like:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;code&gt;subtitle&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;isCollapsed&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;displayOrder&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;object.with.20.levels.of.depth&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;That’s not data modeling.&lt;br&gt;&lt;br&gt;
That’s serializing your component tree.&lt;/p&gt;


&lt;h2&gt;
  
  
  2. You merge unrelated concepts “because it’s easier”
&lt;/h2&gt;

&lt;p&gt;You know this one:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"user"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="err"&gt;...&lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"orders"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="err"&gt;...&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"permissions"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="err"&gt;...&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"stats"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="err"&gt;...&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Congratulations.&lt;br&gt;&lt;br&gt;
You've created a &lt;strong&gt;blob API&lt;/strong&gt; — a JSON smoothie.&lt;/p&gt;

&lt;p&gt;It works for one screen.&lt;br&gt;&lt;br&gt;
It dies everywhere else.&lt;/p&gt;




&lt;h2&gt;
  
  
  3. You don’t separate stable vs unstable structures
&lt;/h2&gt;

&lt;p&gt;UIs change weekly.&lt;br&gt;&lt;br&gt;
Business rules change yearly.&lt;/p&gt;

&lt;p&gt;If your API breaks every time someone moves a card in Figma or a customer requests a “tiny change”…&lt;/p&gt;

&lt;p&gt;You didn’t build an API.&lt;br&gt;&lt;br&gt;
You built a &lt;strong&gt;UI transport layer&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;A good data model must survive:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;redesigns
&lt;/li&gt;
&lt;li&gt;mobile apps
&lt;/li&gt;
&lt;li&gt;partner integrations
&lt;/li&gt;
&lt;li&gt;analytics
&lt;/li&gt;
&lt;li&gt;AI
&lt;/li&gt;
&lt;li&gt;new features
&lt;/li&gt;
&lt;li&gt;new markets
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If it doesn’t survive these → it was never a real data model.&lt;/p&gt;




&lt;h2&gt;
  
  
  4. You over-aggregate because you’re afraid of making 4 requests
&lt;/h2&gt;

&lt;p&gt;Some developers believe:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;“We need one endpoint for the entire page.”&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;strong&gt;No, you don't.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Making multiple async calls is:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;cleaner
&lt;/li&gt;
&lt;li&gt;more predictable
&lt;/li&gt;
&lt;li&gt;easier to cache
&lt;/li&gt;
&lt;li&gt;easier to invalidate
&lt;/li&gt;
&lt;li&gt;far more flexible
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Aggregation is a tool.&lt;br&gt;&lt;br&gt;
Not a default.&lt;/p&gt;




&lt;h2&gt;
  
  
  5. You don’t understand entities vs projections
&lt;/h2&gt;

&lt;p&gt;This is the root cause of 90% of bad APIs.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Entities&lt;/strong&gt; = the truth of your business
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Projections&lt;/strong&gt; = reshaped, convenient data for a specific use-case
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If you mix them, you get:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;UI fields leaking into persistence
&lt;/li&gt;
&lt;li&gt;domain rules encoded inside components
&lt;/li&gt;
&lt;li&gt;APIs that break with every design update
&lt;/li&gt;
&lt;li&gt;models nobody understands anymore
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Good developers keep these two worlds separate.&lt;br&gt;&lt;br&gt;
Great developers &lt;strong&gt;document&lt;/strong&gt; the projection boundaries.&lt;/p&gt;




&lt;h2&gt;
  
  
  6. You never ask the hard questions
&lt;/h2&gt;

&lt;p&gt;The best data architects ask:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;What is the source of truth?
&lt;/li&gt;
&lt;li&gt;What entities actually exist?
&lt;/li&gt;
&lt;li&gt;What invariants must never break?
&lt;/li&gt;
&lt;li&gt;Would a mobile app use this?
&lt;/li&gt;
&lt;li&gt;What happens if the UI changes completely?&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If you never ask these questions, you're not modeling — you're sketching.&lt;/p&gt;




&lt;h1&gt;
  
  
  🔥 So… how do you get better?
&lt;/h1&gt;

&lt;p&gt;Here’s the simple framework that instantly levels up your architecture.&lt;/p&gt;




&lt;h2&gt;
  
  
  ✔️ 1. Model the domain before the API
&lt;/h2&gt;

&lt;p&gt;If you can’t explain the business with boxes on a whiteboard → &lt;strong&gt;don’t write the endpoint.&lt;/strong&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  ✔️ 2. Keep entities pure
&lt;/h2&gt;

&lt;p&gt;No UI fields.&lt;br&gt;&lt;br&gt;
No layout info.&lt;br&gt;&lt;br&gt;
No Figma-driven naming.&lt;/p&gt;

&lt;p&gt;If your database tables look like React components, stop everything and refactor.&lt;/p&gt;

&lt;p&gt;If you chose a document database because it mirrors the UI, ask yourself:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;“What if there was no UI at all?”&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h2&gt;
  
  
  ✔️ 3. Prefer multiple granular endpoints
&lt;/h2&gt;

&lt;p&gt;Frontend frameworks are built for composition.&lt;br&gt;&lt;br&gt;
Use them.&lt;/p&gt;

&lt;p&gt;Let the UI combine the data.&lt;br&gt;&lt;br&gt;
Don’t let the UI dictate the data.&lt;/p&gt;




&lt;h2&gt;
  
  
  ✔️ 4. Use projections sparingly — and name them clearly
&lt;/h2&gt;

&lt;p&gt;Examples:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;/orders&lt;/code&gt; → entity
&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;/orders/overview&lt;/code&gt; → projection
&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;/dashboard&lt;/code&gt; → projection
&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;/users/:id/profile-view&lt;/code&gt; → projection
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Good naming avoids 80% of confusion.&lt;/p&gt;




&lt;h2&gt;
  
  
  ✔️ 5. Design for multiple frontends
&lt;/h2&gt;

&lt;p&gt;Ask yourself:&lt;/p&gt;

&lt;p&gt;Would this structure still make sense if:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;I built a mobile app?
&lt;/li&gt;
&lt;li&gt;A partner consumed the API?
&lt;/li&gt;
&lt;li&gt;I fed this into an analytics pipeline?
&lt;/li&gt;
&lt;li&gt;I replaced React tomorrow?&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If the answer is &lt;strong&gt;no&lt;/strong&gt;, start over.&lt;/p&gt;




&lt;h2&gt;
  
  
  ✔️ 6. Think in relationships and constraints
&lt;/h2&gt;

&lt;p&gt;A real data model is not:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;“Objects with stuff inside.”&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;It’s:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;entities
&lt;/li&gt;
&lt;li&gt;references
&lt;/li&gt;
&lt;li&gt;invariants
&lt;/li&gt;
&lt;li&gt;constraints
&lt;/li&gt;
&lt;li&gt;timelines
&lt;/li&gt;
&lt;li&gt;state machines
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This is where a developer becomes an architect.&lt;/p&gt;




&lt;h2&gt;
  
  
  ✔️ 7. Simpler is better
&lt;/h2&gt;

&lt;p&gt;Multiple small, meaningful entities are easier to maintain&lt;br&gt;&lt;br&gt;
than one giant “god object.”&lt;/p&gt;




&lt;h2&gt;
  
  
  ✔️ 8. Avoid deep nesting — prefer flat structures
&lt;/h2&gt;

&lt;p&gt;Your API should deliver &lt;strong&gt;flat, normalized&lt;/strong&gt; data.&lt;br&gt;&lt;br&gt;
Let the UI handle grouping, filtering, nesting, aggregation.&lt;/p&gt;

&lt;p&gt;Flat data = predictable data.&lt;/p&gt;




&lt;h2&gt;
  
  
  ✔️ 9. Use correct naming — and be consistent
&lt;/h2&gt;

&lt;p&gt;Clear naming saves lives.&lt;/p&gt;

&lt;p&gt;&lt;code&gt;UserGroupsResponse&lt;/code&gt; is instantly understandable.&lt;/p&gt;

&lt;p&gt;If your naming forces people to guess → it’s wrong.&lt;/p&gt;




&lt;h2&gt;
  
  
  ✔️ 10. Anticipate change
&lt;/h2&gt;

&lt;p&gt;Your model will grow.&lt;br&gt;&lt;br&gt;
It will evolve.&lt;br&gt;&lt;br&gt;
It will get more complex.&lt;/p&gt;

&lt;p&gt;Design with flexibility in mind.&lt;br&gt;&lt;br&gt;
Future-you will thank you.&lt;/p&gt;




&lt;h1&gt;
  
  
  🎯 Final message
&lt;/h1&gt;

&lt;p&gt;You don’t suck at structuring data because you’re bad.&lt;br&gt;&lt;br&gt;
You suck because nobody ever taught you to think &lt;strong&gt;beyond the screen&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Once you learn to separate:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;domain vs projection
&lt;/li&gt;
&lt;li&gt;entity vs layout
&lt;/li&gt;
&lt;li&gt;truth vs convenience
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;…everything becomes easier.&lt;/p&gt;

&lt;p&gt;Screens change every week.&lt;br&gt;&lt;br&gt;
Good data structures last a decade.&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>database</category>
    </item>
    <item>
      <title>Consume API's like a Pro with Fluentity 🔥</title>
      <dc:creator>Cédric Pierre</dc:creator>
      <pubDate>Tue, 20 May 2025 21:17:42 +0000</pubDate>
      <link>https://dev.to/cedricpierre/fluentity-framework-agnostic-typescript-library-to-consume-apis-easily-and-safely-2pkh</link>
      <guid>https://dev.to/cedricpierre/fluentity-framework-agnostic-typescript-library-to-consume-apis-easily-and-safely-2pkh</guid>
      <description>&lt;p&gt;&lt;strong&gt;Bring &lt;a href="https://fr.wikipedia.org/wiki/Active_record" rel="noopener noreferrer"&gt;Active Record-Like&lt;/a&gt; API Consumption to the Frontend with Fluentity, a framework agnostic library written in Typescript.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;As developers, we often face the same dilemma when working with APIs:&lt;br&gt;&lt;br&gt;
&lt;strong&gt;We want simplicity, type safety, and clean syntax&lt;/strong&gt; — but most solutions force us to choose between low-level control (like Axios) or heavy abstractions (like TanStack Query).&lt;br&gt;
Some options are really nice but totally glued to a framework, like PiniaORM which works only with... Pinia (Vuejs).&lt;/p&gt;
&lt;h3&gt;
  
  
  Direct comparison
&lt;/h3&gt;

&lt;p&gt;Let’s say you want to fetch a Comment with id &lt;code&gt;2&lt;/code&gt; from User with id &lt;code&gt;1&lt;/code&gt; and update it.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="c1"&gt;// Fetch the comment&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;res&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nf"&gt;fetch&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;/users/1/comments/2&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;comment&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;res&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;json&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;

&lt;span class="c1"&gt;// Update the comment&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;updateRes&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nf"&gt;fetch&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;/users/1/comments/2&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="na"&gt;method&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;PUT&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;headers&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Content-Type&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;application/json&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;
  &lt;span class="p"&gt;},&lt;/span&gt;
  &lt;span class="na"&gt;body&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;JSON&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;stringify&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
    &lt;span class="p"&gt;...&lt;/span&gt;&lt;span class="nx"&gt;comment&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;content&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Updated text&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;
  &lt;span class="p"&gt;})&lt;/span&gt;
&lt;span class="p"&gt;})&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;updated&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;updateRes&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;json&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;With Fluentity&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;comment&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;User&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;id&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nx"&gt;comments&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;find&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;comment&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;update&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;&lt;span class="na"&gt;content&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Updated text&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;});&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  A bit of context…
&lt;/h2&gt;

&lt;p&gt;Throughout my career, I’ve worked on many different projects — each with its own way of handling API data fetching.&lt;br&gt;&lt;br&gt;
Yet none of them offered a solution that was &lt;strong&gt;easy to use, type-safe, reusable, chainable, and framework-agnostic&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;As a fullstack developer, I naturally think in &lt;strong&gt;objects&lt;/strong&gt;. That’s why &lt;strong&gt;Laravel’s Eloquent&lt;/strong&gt;, a classic implementation of Active Record, feels so intuitive to me — and I know I’m not alone.&lt;br&gt;&lt;br&gt;
I truly believe Eloquent is a big part of Laravel’s popularity.&lt;/p&gt;

&lt;p&gt;So I had an idea: &lt;strong&gt;what if we brought the elegance of Active Record to the frontend, for APIs?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;That’s how &lt;strong&gt;&lt;a href="https://github.com/cedricpierre/fluentity-core" rel="noopener noreferrer"&gt;Fluentity&lt;/a&gt;&lt;/strong&gt; was born.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;⚠️ &lt;em&gt;Note: This project is still young and actively developed. Feedback is welcome!&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;


&lt;h2&gt;
  
  
  What is Fluentity?
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Fluentity&lt;/strong&gt; is a lightweight, framework-agnostic TypeScript library that turns your endpoints into real models — with chainable methods, auto-casting, caching, and strong typing.&lt;/p&gt;

&lt;p&gt;It also provides a lot of flexibility, by exposing request and response interceptors, overriding the request handler,...&lt;/p&gt;

&lt;p&gt;&lt;a href="https://cedricpierre.github.io/fluentity-core/#configuration" rel="noopener noreferrer"&gt;How to configure Fluentity&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Whether you’re working in Vue, Nuxt, React, or any other frontend stack, Fluentity gives you an elegant way to query your API without boilerplate.&lt;/p&gt;
&lt;h2&gt;
  
  
  Working together
&lt;/h2&gt;

&lt;p&gt;BRO TIP: If your backend is already written in Typescript (NestJS), you can share the DTO between backend and frontend. There's even a way to reuse the same validators!&lt;/p&gt;

&lt;p&gt;There's also a &lt;a href="https://github.com/cedricpierre/fluentity-cli" rel="noopener noreferrer"&gt;CLI&lt;/a&gt; tool to allow you to create models or to convert an OpenAPI schema file into Models !&lt;/p&gt;


&lt;h2&gt;
  
  
  Getting Started
&lt;/h2&gt;
&lt;h3&gt;
  
  
  📦 Installation
&lt;/h3&gt;


&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npm &lt;span class="nb"&gt;install&lt;/span&gt; @fluentity/core
&lt;span class="c"&gt;# or&lt;/span&gt;
yarn add @fluentity/core
&lt;span class="c"&gt;# or&lt;/span&gt;
pnpm &lt;span class="nb"&gt;install&lt;/span&gt; @fluentity/core
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;blockquote&gt;
&lt;p&gt;Enable Typescript decorators:&lt;br&gt;
&lt;/p&gt;


&lt;/blockquote&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;compilerOptions&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;target&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;ESNext&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;experimentalDecorators&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;useDefineForClassFields&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;false&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Configuration
&lt;/h3&gt;

&lt;p&gt;The most basic configuration requires to define the &lt;code&gt;baseUrl&lt;/code&gt;.&lt;br&gt;
You can refer to the &lt;a href="https://cedricpierre.github.io/fluentity-core/" rel="noopener noreferrer"&gt;documentation&lt;/a&gt; for more informations.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;Fluentity&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;RestAdapter&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;@fluentity/core&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;fluentity&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;Fluentity&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;initialize&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
    &lt;span class="na"&gt;adapter&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;RestAdapter&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
        &lt;span class="na"&gt;baseUrl&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;https://api.example.com&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;
    &lt;span class="p"&gt;})&lt;/span&gt;
&lt;span class="p"&gt;});&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Creating models
&lt;/h3&gt;

&lt;p&gt;Fluentity is inspired by Active Record and Laravel Eloquent.&lt;/p&gt;

&lt;p&gt;🧱 Example: User &amp;amp; Media Models&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;User.ts&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nx"&gt;Model&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="nx"&gt;HasMany&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="nx"&gt;Relation&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="nx"&gt;Attributes&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="nx"&gt;Cast&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="nx"&gt;HasOne&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="nx"&gt;RelationBuilder&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="nx"&gt;Methods&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;../../src/index&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;Company&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;./Company&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;Media&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;./Media&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;Thumbnail&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;./Thumbnail&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;QueryBuilder&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;../../src/QueryBuilder&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="kr"&gt;interface&lt;/span&gt; &lt;span class="nx"&gt;UserAttributes&lt;/span&gt; &lt;span class="kd"&gt;extends&lt;/span&gt; &lt;span class="nx"&gt;Attributes&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nl"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kr"&gt;string&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="nl"&gt;phone&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kr"&gt;number&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="nl"&gt;email&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kr"&gt;string&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="nl"&gt;created_at&lt;/span&gt;&lt;span class="p"&gt;?:&lt;/span&gt; &lt;span class="kr"&gt;string&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="nl"&gt;updated_at&lt;/span&gt;&lt;span class="p"&gt;?:&lt;/span&gt; &lt;span class="kr"&gt;string&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="nl"&gt;thumbnail&lt;/span&gt;&lt;span class="p"&gt;?:&lt;/span&gt; &lt;span class="nx"&gt;Thumbnail&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="k"&gt;export&lt;/span&gt; &lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;User&lt;/span&gt; &lt;span class="kd"&gt;extends&lt;/span&gt; &lt;span class="nc"&gt;Model&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;UserAttributes&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="k"&gt;implements&lt;/span&gt; &lt;span class="nx"&gt;UserAttributes&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="k"&gt;static&lt;/span&gt; &lt;span class="nx"&gt;resource&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;users&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

  &lt;span class="kr"&gt;declare&lt;/span&gt; &lt;span class="nx"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kr"&gt;string&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="kr"&gt;declare&lt;/span&gt; &lt;span class="nx"&gt;email&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kr"&gt;string&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="kr"&gt;declare&lt;/span&gt; &lt;span class="nx"&gt;phone&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kr"&gt;number&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

  &lt;span class="kr"&gt;declare&lt;/span&gt; &lt;span class="nx"&gt;created_at&lt;/span&gt;&lt;span class="p"&gt;?:&lt;/span&gt; &lt;span class="kr"&gt;string&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="kr"&gt;declare&lt;/span&gt; &lt;span class="nx"&gt;updated_at&lt;/span&gt;&lt;span class="p"&gt;?:&lt;/span&gt; &lt;span class="kr"&gt;string&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

  &lt;span class="p"&gt;@&lt;/span&gt;&lt;span class="nd"&gt;HasMany&lt;/span&gt;&lt;span class="p"&gt;(()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nx"&gt;Media&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
  &lt;span class="nx"&gt;medias&lt;/span&gt;&lt;span class="o"&gt;!&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;Relation&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;Media&lt;/span&gt;&lt;span class="p"&gt;[]&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

  &lt;span class="p"&gt;@&lt;/span&gt;&lt;span class="nd"&gt;HasMany&lt;/span&gt;&lt;span class="p"&gt;(()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nx"&gt;Media&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;medias&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
  &lt;span class="nx"&gt;libraries&lt;/span&gt;&lt;span class="o"&gt;!&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;Relation&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;Media&lt;/span&gt;&lt;span class="p"&gt;[]&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

  &lt;span class="p"&gt;@&lt;/span&gt;&lt;span class="nd"&gt;HasMany&lt;/span&gt;&lt;span class="p"&gt;(()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nx"&gt;Media&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;custom-resource&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
  &lt;span class="nx"&gt;customResource&lt;/span&gt;&lt;span class="o"&gt;!&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;Relation&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;Media&lt;/span&gt;&lt;span class="p"&gt;[]&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

  &lt;span class="p"&gt;@&lt;/span&gt;&lt;span class="nd"&gt;HasOne&lt;/span&gt;&lt;span class="p"&gt;(()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nx"&gt;Media&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
  &lt;span class="nx"&gt;picture&lt;/span&gt;&lt;span class="o"&gt;!&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;Relation&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;Media&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

  &lt;span class="p"&gt;@&lt;/span&gt;&lt;span class="nd"&gt;Cast&lt;/span&gt;&lt;span class="p"&gt;(()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nx"&gt;Thumbnail&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
  &lt;span class="nx"&gt;thumbnail&lt;/span&gt;&lt;span class="o"&gt;!&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;Thumbnail&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

  &lt;span class="p"&gt;@&lt;/span&gt;&lt;span class="nd"&gt;Cast&lt;/span&gt;&lt;span class="p"&gt;(()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nx"&gt;Thumbnail&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
  &lt;span class="nx"&gt;thumbnails&lt;/span&gt;&lt;span class="o"&gt;!&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;Thumbnail&lt;/span&gt;&lt;span class="p"&gt;[];&lt;/span&gt;

  &lt;span class="p"&gt;@&lt;/span&gt;&lt;span class="nd"&gt;Cast&lt;/span&gt;&lt;span class="p"&gt;(()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nx"&gt;Company&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
  &lt;span class="nx"&gt;company&lt;/span&gt;&lt;span class="o"&gt;!&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;Company&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

  &lt;span class="k"&gt;static&lt;/span&gt; &lt;span class="nx"&gt;scopes&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="na"&gt;active&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="na"&gt;query&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;RelationBuilder&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;User&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nx"&gt;query&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;where&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt; &lt;span class="na"&gt;status&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;active&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt; &lt;span class="p"&gt;}),&lt;/span&gt;
  &lt;span class="p"&gt;};&lt;/span&gt;

  &lt;span class="k"&gt;static&lt;/span&gt; &lt;span class="k"&gt;async&lt;/span&gt; &lt;span class="nf"&gt;login&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;username&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kr"&gt;string&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;password&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kr"&gt;string&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;queryBuilder&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;QueryBuilder&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
      &lt;span class="na"&gt;resource&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;login&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="na"&gt;body&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="nx"&gt;username&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="nx"&gt;password&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="p"&gt;},&lt;/span&gt;
      &lt;span class="na"&gt;method&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;Methods&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;POST&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="p"&gt;});&lt;/span&gt;

    &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;response&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;call&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;queryBuilder&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;response&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;data&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Media.ts&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;Model&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;Relation&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;BelongsTo&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;@fluentity/core&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;

&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;Thumbnail&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;./Thumbnail&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;

&lt;span class="k"&gt;export&lt;/span&gt; &lt;span class="kr"&gt;interface&lt;/span&gt; &lt;span class="nx"&gt;MediaAttributes&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nl"&gt;id&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kr"&gt;string&lt;/span&gt;
    &lt;span class="nx"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kr"&gt;string&lt;/span&gt;
    &lt;span class="nx"&gt;size&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kr"&gt;string&lt;/span&gt;
    &lt;span class="nx"&gt;extension&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kr"&gt;string&lt;/span&gt;
    &lt;span class="nx"&gt;mime_type&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kr"&gt;string&lt;/span&gt;
    &lt;span class="nx"&gt;url&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kr"&gt;string&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="k"&gt;export&lt;/span&gt; &lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;Media&lt;/span&gt; &lt;span class="kd"&gt;extends&lt;/span&gt; &lt;span class="nc"&gt;Model&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;MediaAttributes&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;static&lt;/span&gt; &lt;span class="nx"&gt;resource&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;medias&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Thumbnail.ts&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;Model&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;@fluentity/core&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;

&lt;span class="k"&gt;export&lt;/span&gt; &lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;Thumbnail&lt;/span&gt; &lt;span class="kd"&gt;extends&lt;/span&gt; &lt;span class="nc"&gt;Model&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="kr"&gt;any&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;static&lt;/span&gt; &lt;span class="nx"&gt;resource&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;thumbnails&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Using Models
&lt;/h3&gt;

&lt;p&gt;Now that the models are created, the hardest part is done! 🍻&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;users&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;User&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;all&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt; &lt;span class="c1"&gt;// This makes a GET /users and returns an array of User instances.&lt;/span&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;user&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;User&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;find&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt; &lt;span class="c1"&gt;// Get /users/1 - return a user instance.&lt;/span&gt;

&lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;user&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;update&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;&lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Johana&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;});&lt;/span&gt; &lt;span class="c1"&gt;// This send a PUT request to /users/:id&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;But there is more! Let's try &lt;strong&gt;relationships&lt;/strong&gt; or sub-resources:&lt;/p&gt;

&lt;h4&gt;
  
  
  Relationships
&lt;/h4&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;medias&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;User&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;id&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nx"&gt;medias&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;all&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt; &lt;span class="c1"&gt;// Get /users/1/medias - return an array of Media object&lt;/span&gt;

&lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;media&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;].&lt;/span&gt;&lt;span class="k"&gt;delete&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt; &lt;span class="c1"&gt;// DELETE /users/1/medias/1&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h4&gt;
  
  
  Conditions:
&lt;/h4&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;users&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;User&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;where&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;&lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Johana&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;}).&lt;/span&gt;&lt;span class="nf"&gt;all&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="c1"&gt;// GET /users?name=johana&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h4&gt;
  
  
  Casting:
&lt;/h4&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;user&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;User&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;find&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;user&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;thumbnail&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt; &lt;span class="c1"&gt;// Thumbnail object&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h4&gt;
  
  
  Scopes:
&lt;/h4&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;users&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;User&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;query&lt;/span&gt;&lt;span class="p"&gt;().&lt;/span&gt;&lt;span class="nf"&gt;active&lt;/span&gt;&lt;span class="p"&gt;().&lt;/span&gt;&lt;span class="nf"&gt;all&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="c1"&gt;// GET /users?status=active&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;🚀 Conclusion&lt;/p&gt;

&lt;p&gt;With Fluentity, consuming an API feels as natural as querying a database.&lt;br&gt;
You define models once — and enjoy a fully typed, reusable, and object-oriented interface to your backend.&lt;/p&gt;

&lt;p&gt;No more juggling between fetch(), Axios, and manually transforming responses.&lt;br&gt;
&lt;a href="https://github.com/cedricpierre/fluentity-core" rel="noopener noreferrer"&gt;Fluentity&lt;/a&gt;  gives you a clean API, inspired by the elegance of Eloquent and Active Record, for the frontend world.&lt;/p&gt;

&lt;p&gt;✅ Fluentity: Key Advantages :&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Cleaner, declarative code with real models instead of imperative fetch/then chains.&lt;/li&gt;
&lt;li&gt;Strong Typing: Safer development and fewer runtime bugs.&lt;/li&gt;
&lt;li&gt;Framework-Agnostic: Use it anywhere TypeScript runs, including fullstack apps.&lt;/li&gt;
&lt;li&gt;Chainable Query Builder: Express complex queries fluently.&lt;/li&gt;
&lt;li&gt;Auto-Casting to Real Instances: Enables object-oriented logic across your app.&lt;/li&gt;
&lt;li&gt;No Boilerplate:  just define your models.&lt;/li&gt;
&lt;li&gt;Customizable &amp;amp; Extensible: add custom scopes&lt;/li&gt;
&lt;li&gt;Developer Experience (DX) Focus: Makes your API layer fun and productive to work with.&lt;/li&gt;
&lt;/ul&gt;


&lt;h1&gt;
  
  
  Bonus
&lt;/h1&gt;

&lt;p&gt;I also created a CLI tool to &lt;a href="https://www.npmjs.com/package/@fluentity/cli" rel="noopener noreferrer"&gt;generate models&lt;/a&gt; ❤️&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;fluentity generate:model &lt;span class="o"&gt;[&lt;/span&gt;name]
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This command will parse an OpenAPI Schema and generates all the models for you:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;fluentity parse:openapi &lt;span class="o"&gt;[&lt;/span&gt;filename]
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;p&gt;Checkout this &lt;a href="https://github.com/cedricpierre/fluentity-test" rel="noopener noreferrer"&gt;demo with Vue&lt;/a&gt;&lt;/p&gt;




&lt;p&gt;👉 Star &lt;a href="https://github.com/cedricpierre/fluentity-core" rel="noopener noreferrer"&gt;Fluentity&lt;/a&gt; on GitHub&lt;br&gt;
🧪 Try it in your next project, and share your feedback!&lt;/p&gt;

&lt;p&gt;Cheers,&lt;br&gt;
Cédric&lt;/p&gt;

&lt;p&gt;&lt;a href="https://www.linkedin.com/in/cedric-pierre-developer/" rel="noopener noreferrer"&gt;Linkedin&lt;/a&gt;&lt;br&gt;
&lt;a href="https://github.com/cedricpierre" rel="noopener noreferrer"&gt;Github&lt;/a&gt;&lt;/p&gt;

</description>
      <category>typescript</category>
      <category>restapi</category>
      <category>rest</category>
      <category>api</category>
    </item>
  </channel>
</rss>
