<?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: Aung Kyaw Minn</title>
    <description>The latest articles on DEV Community by Aung Kyaw Minn (@aungkyawminn).</description>
    <link>https://dev.to/aungkyawminn</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%2F2109764%2Fdc1639e6-d72c-4344-b2e1-025988006c93.jpg</url>
      <title>DEV Community: Aung Kyaw Minn</title>
      <link>https://dev.to/aungkyawminn</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/aungkyawminn"/>
    <language>en</language>
    <item>
      <title>API Resource Management and Access Control</title>
      <dc:creator>Aung Kyaw Minn</dc:creator>
      <pubDate>Sat, 04 Jan 2025 08:04:31 +0000</pubDate>
      <link>https://dev.to/aungkyawminn/api-resource-management-and-access-control-321a</link>
      <guid>https://dev.to/aungkyawminn/api-resource-management-and-access-control-321a</guid>
      <description>&lt;p&gt;In modern API development, resource management and access control are two key pillars for building efficient, secure, and scalable systems. APIs allow users to interact with various resources, and it is crucial to control what actions a user can perform on these resources. This is where the concepts of API Resource Management and Access Control come into play.&lt;/p&gt;

&lt;p&gt;In this article, we will explore these concepts by breaking them down into two key areas:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;API Resource Management using ICRUD&lt;/li&gt;
&lt;li&gt;Access Control with Ability (Action and Subject)&lt;/li&gt;
&lt;/ol&gt;




&lt;h2&gt;
  
  
  1. API Resource Management with ICRUD
&lt;/h2&gt;

&lt;p&gt;API resource management refers to the fundamental operations that allow users to interact with resources via an API. The ICRUD framework represents the basic actions that can be performed on resources: Index, Create, Read, Update, and Delete. These actions define how data is handled within an API.&lt;/p&gt;

&lt;p&gt;In the context of API development, a Resource is typically an entity that users interact with (e.g., User, Article, Product). Below, we break down each action in the ICRUD framework, using &lt;code&gt;User&lt;/code&gt; as the example resource.&lt;/p&gt;

&lt;h3&gt;
  
  
  1.1 Index (Listing Resources)
&lt;/h3&gt;

&lt;p&gt;The &lt;code&gt;Index&lt;/code&gt; action is used to retrieve a list of resources. It is often implemented with filtering, sorting, and pagination to optimize the retrieval of large data sets.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Example Use Case:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Action: &lt;code&gt;Index&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Subject: &lt;code&gt;User&lt;/code&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;An Index action would allow an admin or a user to retrieve a list of users.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Example Request:&lt;/strong&gt;&lt;br&gt;
&lt;code&gt;GET /users?page=2&amp;amp;limit=10&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;This request would return a paginated list of Users (e.g., 10 users per page, starting at page 2).&lt;/p&gt;
&lt;h3&gt;
  
  
  1.2 Create (Add Resources)
&lt;/h3&gt;

&lt;p&gt;The &lt;code&gt;Create&lt;/code&gt; action is used to add a new resource to the system. For example, a user can be created in the system by an administrator or another authorized party.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Example Use Case:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Action: &lt;code&gt;Create&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Subject: &lt;code&gt;User&lt;/code&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;An admin might create a new User account.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Example Request:&lt;/strong&gt;&lt;br&gt;
&lt;code&gt;POST /users&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;The request body would contain details such as name, email, and role for the new user.&lt;/p&gt;
&lt;h3&gt;
  
  
  1.3 Read (Retrieve a Resource)
&lt;/h3&gt;

&lt;p&gt;The &lt;code&gt;Read&lt;/code&gt; action allows retrieving a specific resource by its unique identifier. For example, an admin or authorized user can view the details of a specific User.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Example Use Case:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Action: &lt;code&gt;Read&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Subject: &lt;code&gt;User&lt;/code&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;An admin might retrieve the details of a specific user.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Example Request:&lt;/strong&gt;&lt;br&gt;
&lt;code&gt;GET /users/123&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;This request would retrieve the details of the User with ID &lt;code&gt;123&lt;/code&gt;, such as their name, email, and account status.&lt;/p&gt;
&lt;h3&gt;
  
  
  1.4 Update (Modify Resources)
&lt;/h3&gt;

&lt;p&gt;The &lt;code&gt;Update&lt;/code&gt; action allows modifying the data of an existing resource. For example, a user might update their email or profile information, or an admin might update a user’s role.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Example Use Case:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Action: &lt;code&gt;Update&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Subject: &lt;code&gt;User&lt;/code&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;An admin might update the role of a User or modify their profile details.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Example Request:&lt;/strong&gt;&lt;br&gt;
&lt;code&gt;PUT /users/123&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;The request body would contain the new details for the User with ID &lt;code&gt;123&lt;/code&gt;, such as a new email address or role.&lt;/p&gt;
&lt;h3&gt;
  
  
  1.5 Delete (Remove Resources)
&lt;/h3&gt;

&lt;p&gt;The &lt;code&gt;Delete&lt;/code&gt; action removes a resource from the system. For example, an admin might delete a User account.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Example Use Case:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Action: &lt;code&gt;Delete&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Subject: &lt;code&gt;User&lt;/code&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;An admin might delete a User from the system.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Example Request:&lt;/strong&gt;&lt;br&gt;
&lt;code&gt;DELETE /users/123&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;This request would delete the User with ID &lt;code&gt;123&lt;/code&gt; from the system.&lt;/p&gt;


&lt;h2&gt;
  
  
  2. Access Control with Ability (Action and Subject)
&lt;/h2&gt;

&lt;p&gt;While ICRUD defines the basic operations that can be performed on resources, Access Control is concerned with ensuring that users can only perform certain actions on specific resources based on their permissions.&lt;/p&gt;

&lt;p&gt;In the context of Access Control, we use the following concepts:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Action&lt;/strong&gt;: The operation a user wants to perform (e.g., Read, Write, Delete).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Subject&lt;/strong&gt;: The resource upon which the action is performed (e.g., User, Article, Product).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Ability&lt;/strong&gt;: The combination of Action and Subject that defines what a user is allowed to do.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;
  
  
  2.1 Action
&lt;/h3&gt;

&lt;p&gt;&lt;code&gt;Action&lt;/code&gt; refers to the operations that users can perform on resources. Common actions include:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;Read&lt;/code&gt;: Viewing or retrieving data.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;Create&lt;/code&gt;: Adding new data.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;Update&lt;/code&gt;: Modifying existing data.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;Delete&lt;/code&gt;: Removing data.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;In the case of the &lt;code&gt;User&lt;/code&gt; resource, actions might include &lt;code&gt;Read User&lt;/code&gt;, &lt;code&gt;Create User&lt;/code&gt;, &lt;code&gt;Update User&lt;/code&gt;, and &lt;code&gt;Delete User&lt;/code&gt;.&lt;/p&gt;
&lt;h3&gt;
  
  
  2.2 Subject
&lt;/h3&gt;

&lt;p&gt;&lt;code&gt;Subject&lt;/code&gt; refers to the resource or entity that a user interacts with. Common subjects include:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;code&gt;User&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;Article&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;Product&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;Order&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;For example, in a User Management System, &lt;code&gt;User&lt;/code&gt; is the subject upon which actions like &lt;code&gt;Create User&lt;/code&gt;, &lt;code&gt;Update User&lt;/code&gt;, and &lt;code&gt;Delete User&lt;/code&gt; are performed.&lt;/p&gt;
&lt;h3&gt;
  
  
  2.3 Ability
&lt;/h3&gt;

&lt;p&gt;&lt;code&gt;Ability&lt;/code&gt; defines what a user is allowed to do on a particular subject. A user's Ability is a combination of an Action and a Subject. For example, a user might have the ability to &lt;code&gt;Read User&lt;/code&gt; (view user details) but not the ability to &lt;code&gt;Delete User&lt;/code&gt;.&lt;/p&gt;
&lt;h3&gt;
  
  
  2.4 Example of Abilities in Practice
&lt;/h3&gt;

&lt;p&gt;Let’s imagine a system with &lt;code&gt;Admin&lt;/code&gt;, &lt;code&gt;Editor&lt;/code&gt;, and &lt;code&gt;Viewer&lt;/code&gt; roles. Each role has a different set of abilities related to User management.&lt;/p&gt;
&lt;h4&gt;
  
  
  Admin Abilities:
&lt;/h4&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;Read User&lt;/code&gt;: View user details.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;Create User&lt;/code&gt;: Add new users.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;Update User&lt;/code&gt;: Modify user information.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;Delete User&lt;/code&gt;: Remove users from the system.&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;
  
  
  Editor Abilities:
&lt;/h4&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;Read User&lt;/code&gt;: View user details.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;Update User&lt;/code&gt;: Modify user information (but not delete users).&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;
  
  
  Viewer Abilities:
&lt;/h4&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;Read User&lt;/code&gt;: View user details (but no other permissions).&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;In this system:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;An &lt;code&gt;Admin&lt;/code&gt; has full control over users (can &lt;code&gt;Read&lt;/code&gt;, &lt;code&gt;Create&lt;/code&gt;, &lt;code&gt;Update&lt;/code&gt;, and &lt;code&gt;Delete&lt;/code&gt; users).&lt;/li&gt;
&lt;li&gt;An &lt;code&gt;Editor&lt;/code&gt; can &lt;code&gt;Read&lt;/code&gt; and &lt;code&gt;Update&lt;/code&gt; user information but cannot &lt;code&gt;Delete&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;A &lt;code&gt;Viewer&lt;/code&gt; can only &lt;code&gt;Read&lt;/code&gt; user details.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;
  
  
  2.5 Simple Implementing Access Control in Code
&lt;/h3&gt;

&lt;p&gt;In a role-based access control system, we can define these abilities for each user role and check if a user is authorized to perform an action on a resource.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="c1"&gt;// Define roles and their corresponding abilities&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;rolesAbilities&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="na"&gt;admin&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;span class="na"&gt;action&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;read&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;subject&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;User&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;action&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;create&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;subject&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;User&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;action&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;update&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;subject&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;User&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;action&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;delete&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;subject&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;User&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;manager&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;span class="na"&gt;action&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;read&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;subject&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;User&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;action&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;update&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;subject&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;User&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;user&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;span class="na"&gt;action&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;read&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;subject&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;User&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="p"&gt;};&lt;/span&gt;

&lt;span class="c1"&gt;// Function to create a user with specific roles&lt;/span&gt;
&lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;createUser&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;roles&lt;/span&gt; &lt;span class="o"&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;abilities&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;roles&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;flatMap&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;role&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nx"&gt;rolesAbilities&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;role&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;||&lt;/span&gt; &lt;span class="p"&gt;[]);&lt;/span&gt;
  &lt;span class="k"&gt;return&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;abilities&lt;/span&gt; &lt;span class="p"&gt;};&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="c1"&gt;// Function to check if a user has a specific ability&lt;/span&gt;
&lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;can&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;action&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;subject&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="k"&gt;return&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;abilities&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;some&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;ability&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; 
    &lt;span class="nx"&gt;ability&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;action&lt;/span&gt; &lt;span class="o"&gt;===&lt;/span&gt; &lt;span class="nx"&gt;action&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="nx"&gt;ability&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;subject&lt;/span&gt; &lt;span class="o"&gt;===&lt;/span&gt; &lt;span class="nx"&gt;subject&lt;/span&gt;
  &lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="c1"&gt;// Function to add an ability to a user&lt;/span&gt;
&lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;addAbilityToUser&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;action&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;subject&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&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;abilities&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;some&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;ability&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nx"&gt;ability&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;action&lt;/span&gt; &lt;span class="o"&gt;===&lt;/span&gt; &lt;span class="nx"&gt;action&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="nx"&gt;ability&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;subject&lt;/span&gt; &lt;span class="o"&gt;===&lt;/span&gt; &lt;span class="nx"&gt;subject&lt;/span&gt;&lt;span class="p"&gt;))&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;abilities&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;push&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt; &lt;span class="nx"&gt;action&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;subject&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;span class="c1"&gt;// Example usage:&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;adminUser&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;createUser&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;adminUser&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="s1"&gt;admin&lt;/span&gt;&lt;span class="dl"&gt;'&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="nf"&gt;can&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;adminUser&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;create&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;User&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;));&lt;/span&gt;  &lt;span class="c1"&gt;// true&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="nf"&gt;can&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;adminUser&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;delete&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;User&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;));&lt;/span&gt;  &lt;span class="c1"&gt;// true&lt;/span&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;managerUser&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;createUser&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;managerUser&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="s1"&gt;manager&lt;/span&gt;&lt;span class="dl"&gt;'&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="nf"&gt;can&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;managerUser&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;create&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;User&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;));&lt;/span&gt;  &lt;span class="c1"&gt;// false&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="nf"&gt;can&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;managerUser&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;update&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;User&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;));&lt;/span&gt;  &lt;span class="c1"&gt;// true&lt;/span&gt;

&lt;span class="c1"&gt;// Add new ability to a manager&lt;/span&gt;
&lt;span class="nf"&gt;addAbilityToUser&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;managerUser&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;create&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;User&lt;/span&gt;&lt;span class="dl"&gt;'&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="nf"&gt;can&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;managerUser&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;create&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;User&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;));&lt;/span&gt;  &lt;span class="c1"&gt;// true&lt;/span&gt;

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

&lt;/div&gt;



&lt;p&gt;In this example, the Admin user has the ability to read, create, update, and delete User resources.&lt;/p&gt;




&lt;h2&gt;
  
  
  Remarks: Extending Actions and Subjects
&lt;/h2&gt;

&lt;p&gt;The &lt;code&gt;Action&lt;/code&gt; and &lt;code&gt;Subject&lt;/code&gt; concepts described above—Index, Create, Read, Update, and Delete—are fundamental operations and work well in many common API scenarios. However, in more complex systems, you may encounter situations that go beyond these basic actions.&lt;/p&gt;

&lt;p&gt;Here are some extended examples that show how actions and subjects can be tailored to specific operations:&lt;/p&gt;

&lt;h3&gt;
  
  
  Extended Actions:
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Send Email&lt;/strong&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Action&lt;/strong&gt;: &lt;code&gt;Send&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Subject&lt;/strong&gt;: &lt;code&gt;Email&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Example&lt;/strong&gt;: Sending a welcome email to a new user or a notification to a subscriber.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Ability&lt;/strong&gt;: A system admin or support agent may have the ability to &lt;code&gt;Send Email&lt;/code&gt; to users.&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;

&lt;p&gt;&lt;strong&gt;Activate User&lt;/strong&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Action&lt;/strong&gt;: &lt;code&gt;Activate&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Subject&lt;/strong&gt;: &lt;code&gt;User&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Example&lt;/strong&gt;: Activating a user account after registration or email verification.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Ability&lt;/strong&gt;: Admin users or support agents may have the ability to &lt;code&gt;Activate User&lt;/code&gt;.&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;

&lt;p&gt;&lt;strong&gt;Deactivate User&lt;/strong&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Action&lt;/strong&gt;: &lt;code&gt;Deactivate&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Subject&lt;/strong&gt;: &lt;code&gt;User&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Example&lt;/strong&gt;: Temporarily disabling a user’s account, e.g., for maintenance or review.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Ability&lt;/strong&gt;: Admins or system operators may have the ability to &lt;code&gt;Deactivate User&lt;/code&gt;.&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;

&lt;p&gt;&lt;strong&gt;Assign Role&lt;/strong&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Action&lt;/strong&gt;: &lt;code&gt;Assign&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Subject&lt;/strong&gt;: &lt;code&gt;Role&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Example&lt;/strong&gt;: Admins assigning roles (e.g., Admin, Editor, Viewer) to users in the system.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Ability&lt;/strong&gt;: An Admin might have the ability to &lt;code&gt;Assign Role&lt;/code&gt; to User resources.&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;

&lt;p&gt;&lt;strong&gt;Generate Report&lt;/strong&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Action&lt;/strong&gt;: &lt;code&gt;Generate&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Subject&lt;/strong&gt;: &lt;code&gt;Report&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Example&lt;/strong&gt;: Generating a sales report, user activity report, or system performance report.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Ability&lt;/strong&gt;: Managers or admins might have the ability to &lt;code&gt;Generate Report&lt;/code&gt;.&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;

&lt;p&gt;&lt;strong&gt;Approve Order&lt;/strong&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Action&lt;/strong&gt;: &lt;code&gt;Approve&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Subject&lt;/strong&gt;: &lt;code&gt;Order&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Example&lt;/strong&gt;: Approving or rejecting an order in an e-commerce system.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Ability&lt;/strong&gt;: A sales manager or order processing team might have the ability to &lt;code&gt;Approve Order&lt;/code&gt;.&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;/ul&gt;

&lt;p&gt;These extended actions provide additional control and granularity over what operations can be performed on resources. This enables more specific and flexible access control, especially as systems grow more complex.&lt;/p&gt;




&lt;h2&gt;
  
  
  Conclusion
&lt;/h2&gt;

&lt;p&gt;Understanding API Resource Management and Access Control is crucial for building secure and efficient APIs. By leveraging ICRUD operations, you can manage resources effectively, while &lt;code&gt;Action&lt;/code&gt;, &lt;code&gt;Subject&lt;/code&gt;, and &lt;code&gt;Ability&lt;/code&gt; help you define and enforce fine-grained access control.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;ICRUD operations&lt;/strong&gt; provide the basic actions that can be performed on resources such as &lt;code&gt;User&lt;/code&gt;, &lt;code&gt;Article&lt;/code&gt;, or &lt;code&gt;Product&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Access Control&lt;/strong&gt; ensures that users are only allowed to perform certain actions on specific resources based on their assigned abilities.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Extended Actions and Subjects&lt;/strong&gt; allow for more complex interactions, such as &lt;code&gt;Send Email&lt;/code&gt;, &lt;code&gt;Activate User&lt;/code&gt;, and &lt;code&gt;Approve Order&lt;/code&gt;, making your access control model more flexible.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;By combining these concepts, you can create APIs that are both powerful and secure, with granular control over what users can do with each resource.&lt;/p&gt;

</description>
      <category>softwaredevelopment</category>
      <category>beginners</category>
      <category>productivity</category>
      <category>webdev</category>
    </item>
    <item>
      <title>A Scalable and Maintainable Approach for Laravel Applications</title>
      <dc:creator>Aung Kyaw Minn</dc:creator>
      <pubDate>Sun, 29 Dec 2024 15:41:03 +0000</pubDate>
      <link>https://dev.to/aungkyawminn/a-scalable-and-maintainable-approach-for-laravel-applications-55d8</link>
      <guid>https://dev.to/aungkyawminn/a-scalable-and-maintainable-approach-for-laravel-applications-55d8</guid>
      <description>&lt;h2&gt;
  
  
  Introducing Mojura Architecture
&lt;/h2&gt;

&lt;p&gt;In the ever-evolving world of web development, maintaining a scalable and readable codebase is crucial. Enter Mojura Architecture, a set of principles designed to enhance your development workflow by promoting scalability, maintainability, and readability. Inspired by the Japanese word "モジュラ" (module), Mojura Architecture breaks down your application into manageable units, making it easier to scale, maintain, and understand.&lt;/p&gt;

&lt;h2&gt;
  
  
  Key Benefits
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Scalability
&lt;/h3&gt;

&lt;p&gt;By breaking down your application into smaller, manageable units, Mojura Architecture allows you to easily scale your project as it grows. This modular approach ensures that each part of your application can be developed and scaled independently.&lt;/p&gt;

&lt;h3&gt;
  
  
  Maintainability
&lt;/h3&gt;

&lt;p&gt;With a clear separation of concerns, Mojura Architecture makes it easier to maintain and update your codebase. This reduces the risk of bugs and improves overall code quality, making your application more robust and reliable.&lt;/p&gt;

&lt;h3&gt;
  
  
  Readability
&lt;/h3&gt;

&lt;p&gt;The structured approach of Mojura Architecture ensures that your code is organized and easy to understand. This makes it simpler for new developers to get up to speed and contributes to a more efficient development process.&lt;/p&gt;

&lt;h2&gt;
  
  
  Concept
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Route&lt;/strong&gt;

&lt;ul&gt;
&lt;li&gt;Call Controller functions&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Controller&lt;/strong&gt;

&lt;ul&gt;
&lt;li&gt;Serve the Features&lt;/li&gt;
&lt;li&gt;Return Response received from Feature to the Request&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Feature&lt;/strong&gt;

&lt;ul&gt;
&lt;li&gt;Validate the Request&lt;/li&gt;
&lt;li&gt;Run the Job by passing the request parameters&lt;/li&gt;
&lt;li&gt;Collect Return Data from Job&lt;/li&gt;
&lt;li&gt;Prepare Response Data&lt;/li&gt;
&lt;li&gt;Return the HTTP Response to the Controller Method&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Request&lt;/strong&gt;

&lt;ul&gt;
&lt;li&gt;Authorize the Request (Optional)&lt;/li&gt;
&lt;li&gt;Implement HTTP Request validating&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Job&lt;/strong&gt;

&lt;ul&gt;
&lt;li&gt;Do the actual work by implementing the business logic&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  Principles
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Feature Serves a Single Purpose&lt;/strong&gt;: Keep features simple and focused.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Job Executes a Single Responsibility&lt;/strong&gt;: Ensure each job handles one responsibility, even if it involves multiple related functions.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Modules Shouldn’t Cross&lt;/strong&gt;: Each module should be self-contained and should not perform tasks that belong to other modules.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Apply Decoupling Techniques&lt;/strong&gt;: Use shared helper classes to enhance code reusability and maintainability.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Features Shall Not Call Other Features&lt;/strong&gt;: Maintain feature independence.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Jobs Shall Not Call Other Jobs&lt;/strong&gt;: Keep business logic concise and organized.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Write Code That Humans Can Read&lt;/strong&gt;: Prioritize readability for easier maintenance and collaboration.&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  Naming Conventions
&lt;/h2&gt;

&lt;p&gt;Consistent naming for files and classes is encouraged for clarity and readability. Here are some examples:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Module&lt;/strong&gt;: [Subject]Module (e.g., UserModule)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Controller&lt;/strong&gt;: [Subject]Controller (e.g., UserController)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Feature&lt;/strong&gt;: [Operation][Subject]Feature (e.g., CreateUserFeature)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Job&lt;/strong&gt;: [Operation][Subject]Job (e.g., CreateUserJob)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Request&lt;/strong&gt;: [Operation][Subject]Request (e.g., CreateUserRequest)&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Directory Structure
&lt;/h2&gt;

&lt;p&gt;Mojura Architecture promotes a clear and organized directory structure:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;laravel-project/
├── app/
│   ├── Modules/
│   │   ├── YourModule1/
│   │   │   ├── Features/
│   │   │   ├── Http/
│   │   │   │   ├── Controllers/
│   │   │   │   └── Requests/
│   │   │   └── Jobs/
│   │   ├── YourModule2/
│   │   │   ├── Features/
│   │   │   ├── Http/
│   │   │   │   ├── Controllers/
│   │   │   │   └── Requests/
│   │   │   └── Jobs/
│   │   ├── YourModuleN/
│   │   │   ├── Features/
│   │   │   ├── Http/
│   │   │   │   ├── Controllers/
│   │   │   │   └── Requests/
│   │   │   └── Jobs/
├── routes/
│   ├── api/
│   └── web/
└── .env
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Mojura Laravel Package
&lt;/h2&gt;

&lt;p&gt;A lightweight Laravel Package that implements the Mojura Architecture principles.&lt;/p&gt;

&lt;h3&gt;
  
  
  Installation
&lt;/h3&gt;

&lt;p&gt;To install the Mojura package into your Laravel 10+ application using Composer:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;composer require innoaya/mojura
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



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

&lt;p&gt;Publish the configuration file:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;php artisan vendor:publish --tag=mojura-config
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Generating Components
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Route: &lt;code&gt;php artisan mojura:route [RouteFileName] [VersionDirectory] [--web] [--force]&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Controller: &lt;code&gt;php artisan mojura:controller [Controller] [Module] [Directory] [--force]&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Request: &lt;code&gt;php artisan mojura:request [Request] [Module] [Directory] [--force]&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Feature: &lt;code&gt;php artisan mojura:feature [Feature] [Module] [Directory] [--force]&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Job: &lt;code&gt;php artisan mojura:job [Job] [Module] [Directory] [--force]&lt;/code&gt;
&lt;/li&gt;
&lt;/ul&gt;




&lt;h3&gt;
  
  
  Documentation
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://mojura.innoaya.org" rel="noopener noreferrer"&gt;https://mojura.innoaya.org&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Source Code
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://github.com/innoaya/mojura" rel="noopener noreferrer"&gt;https://github.com/innoaya/mojura&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Starter Kit
&lt;/h3&gt;

&lt;p&gt;This starter kit provides a fully implemented backend solution based on the &lt;strong&gt;Mojura Architecture&lt;/strong&gt; concepts, designed to speed up your development process. It includes robust features for &lt;strong&gt;authentication&lt;/strong&gt;, &lt;strong&gt;authorization&lt;/strong&gt;, &lt;strong&gt;user management&lt;/strong&gt;, and &lt;strong&gt;security&lt;/strong&gt;, making it a comprehensive starting point for building scalable applications.&lt;br&gt;
&lt;a href="https://github.com/innoaya/mojura-laravel-starter" rel="noopener noreferrer"&gt;https://github.com/innoaya/mojura-laravel-starter&lt;/a&gt;&lt;/p&gt;

</description>
      <category>laravel</category>
      <category>architecture</category>
      <category>cleancode</category>
    </item>
  </channel>
</rss>
