<!-- 
RSS generated by JIRA (1001.0.0-SNAPSHOT#100246-sha1:7a5c50119eb0633d306e14180817ddef5e80c75d) at Thu Feb 08 23:06:12 UTC 2024

It is possible to restrict the fields that are returned in this document by specifying the 'field' parameter in your request.
For example, to request only the issue key and summary add field=key&field=summary to the URL of your request.
-->
<rss version="0.92" >
<channel>
    <title>FOLIO Jira</title>
    <link>https://folio-org.atlassian.net</link>
    <description>This file is an XML representation of an issue</description>
    <language>en-us</language>    <build-info>
        <version>1001.0.0-SNAPSHOT</version>
        <build-number>100246</build-number>
        <build-date>07-02-2024</build-date>
    </build-info>

<item>
            <title>[FOLIO-490] Convention for paths of storage and business logic resources</title>
                <link>https://folio-org.atlassian.net/browse/FOLIO-490</link>
                <project id="10290" key="FOLIO">FOLIO</project>
                    <description>&lt;p&gt;We are starting to build more storage and business logic modules, it seems like a good time to talk about establishing a convention for addressing them.&lt;/p&gt;

&lt;p&gt;Given that we will likely be expressing similar resources in both the storage and business logic technical contexts, I&apos;m referring to whether we use the top level path space for one or the other, or we simple partition the two with equal precedence.&lt;/p&gt;

&lt;p&gt;As an example, let&apos;s assume that items live in both the business logic space and the storage space. Both need to be addressable distinctly and we could use either a hierarchy or convention. Therefore I see a few broad options (including both mine and &lt;a href=&quot;https://folio-org.atlassian.net/secure/ViewProfile.jspa?accountId=712020%3A38d1a08f-86a8-4df2-9191-239b16b0a81a&quot; class=&quot;user-hover&quot; rel=&quot;712020:38d1a08f-86a8-4df2-9191-239b16b0a81a&quot; data-account-id=&quot;712020:38d1a08f-86a8-4df2-9191-239b16b0a81a&quot; accountid=&quot;712020:38d1a08f-86a8-4df2-9191-239b16b0a81a&quot; rel=&quot;noreferrer&quot;&gt;Heikki Levanto&lt;/a&gt; thoughts from the previous conversation):&lt;/p&gt;

&lt;div class=&apos;table-wrap&apos;&gt;
&lt;table class=&apos;confluenceTable&apos;&gt;&lt;tbody&gt;
&lt;tr&gt;
&lt;th class=&apos;confluenceTh&apos;&gt;Storage&lt;/th&gt;
&lt;th class=&apos;confluenceTh&apos;&gt;Business Logic&lt;/th&gt;
&lt;th class=&apos;confluenceTh&apos;&gt; Note &lt;/th&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td class=&apos;confluenceTd&apos;&gt; /storage/items &lt;/td&gt;
&lt;td class=&apos;confluenceTd&apos;&gt; /items &lt;/td&gt;
&lt;td class=&apos;confluenceTd&apos;&gt; Business logic has top level address precedence, hierarchical&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td class=&apos;confluenceTd&apos;&gt; /items &lt;/td&gt;
&lt;td class=&apos;confluenceTd&apos;&gt; /logic/items &lt;/td&gt;
&lt;td class=&apos;confluenceTd&apos;&gt; Storage has top level address precedence, hierarchical&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td class=&apos;confluenceTd&apos;&gt; /storage/items &lt;/td&gt;
&lt;td class=&apos;confluenceTd&apos;&gt; /logic/items &lt;/td&gt;
&lt;td class=&apos;confluenceTd&apos;&gt; Partitioned, with no precedence, hierarchical&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td class=&apos;confluenceTd&apos;&gt; /items-storage &lt;/td&gt;
&lt;td class=&apos;confluenceTd&apos;&gt; /items &lt;/td&gt;
&lt;td class=&apos;confluenceTd&apos;&gt; Business logic has top level address precedence, naming convention&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td class=&apos;confluenceTd&apos;&gt; /items &lt;/td&gt;
&lt;td class=&apos;confluenceTd&apos;&gt; /items-logic &lt;/td&gt;
&lt;td class=&apos;confluenceTd&apos;&gt; Storage has top level address precedence, naming convention&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td class=&apos;confluenceTd&apos;&gt; /items-storage &lt;/td&gt;
&lt;td class=&apos;confluenceTd&apos;&gt; /items-logic &lt;/td&gt;
&lt;td class=&apos;confluenceTd&apos;&gt; no precedence, naming convention&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;/div&gt;


&lt;p&gt;&lt;b&gt;Questions&lt;/b&gt;&lt;/p&gt;

&lt;ul&gt;
	&lt;li&gt;Which, if any, of storage or business logic interfaces should get precedence for top level addresses, e.g. /items ?&lt;/li&gt;
&lt;/ul&gt;


&lt;ul&gt;
	&lt;li&gt;Do we want either (or both) storage or business logic interfaces to have contextual grouping, .e.g. /inventory/items ?&lt;/li&gt;
&lt;/ul&gt;


&lt;ul&gt;
	&lt;li&gt;What prefix / postfix name or sub-path could we use for storage or business logic ?&lt;/li&gt;
&lt;/ul&gt;



&lt;p&gt;This started as a conversation on &lt;span class=&quot;error&quot;&gt;&amp;#91;DMOD-160&amp;#93;&lt;/span&gt;.&lt;/p&gt;</description>
                <environment></environment>
        <key id="80120">FOLIO-490</key>
            <summary>Convention for paths of storage and business logic resources</summary>
                <type id="10006" iconUrl="https://folio-org.atlassian.net/rest/api/2/universal_avatar/view/type/issuetype/avatar/10307?size=medium">Umbrella</type>
                                            <priority id="10002" iconUrl="https://dev.folio.org/assets/jira-priority/jira-p3.svg">P3</priority>
                        <status id="6" iconUrl="https://folio-org.atlassian.net/images/icons/statuses/closed.png" description="The issue is considered finished, the resolution is correct. Issues which are closed can be reopened.">Closed</status>
                    <statusCategory id="3" key="done" colorName="green"/>
                                    <resolution id="10000">Won&apos;t Do</resolution>
                                                        <assignee accountid="557058:b8e64633-1f7c-402d-9caf-9959a5ba5d0d">Jakub Skoczen</assignee>
                                                                <reporter accountid="63e2a2771b13d42998e4e706">Marc Johnson</reporter>
                                    <labels>
                            <label>question</label>
                            <label>spike</label>
                            <label>sprint10</label>
                            <label>sprint11</label>
                            <label>sprint12</label>
                            <label>sprint13</label>
                            <label>sprint9</label>
                    </labels>
                <created>Wed, 1 Mar 2017 14:56:00 +0000</created>
                <updated>Thu, 2 Sep 2021 12:30:19 +0000</updated>
                            <resolved>Thu, 2 Sep 2021 12:30:19 +0000</resolved>
                                                                        <due></due>
                            <votes>0</votes>
                                    <watches>8</watches>
                                                    <timespent seconds="7200">2 hours</timespent>
                                <comments>
                                                            <comment id="188801" author="712020:38d1a08f-86a8-4df2-9191-239b16b0a81a" created="Wed, 1 Mar 2017 15:03:49 +0000"  >&lt;p&gt;At the moment, Okapi will have problems to route /items and /items/storage to different modules. We are about to resolve that (
    &lt;span class=&quot;jira-issue-macro resolved&quot; data-jira-key=&quot;OKAPI-274&quot; &gt;
                &lt;a href=&quot;https://folio-org.atlassian.net/browse/OKAPI-274&quot; class=&quot;jira-issue-macro-key issue-link&quot;  title=&quot;Change path match&quot; &gt;
            &lt;img class=&quot;icon&quot; src=&quot;https://folio-org.atlassian.net/rest/api/2/universal_avatar/view/type/issuetype/avatar/10322?size=medium&quot; /&gt;
            OKAPI-274
        &lt;/a&gt;
                                                    &lt;span class=&quot;aui-lozenge aui-lozenge-subtle aui-lozenge-success jira-macro-single-issue-export-pdf&quot;&gt;Closed&lt;/span&gt;
            &lt;/span&gt;
), but even so, I feel uneasy about this. Even more so about /storage/items and /storage/users and /storage/whatever all being different modules.&lt;/p&gt;</comment>
                                                            <comment id="188803" author="5bffed52a1b46046f530c8f7" created="Wed, 1 Mar 2017 15:29:28 +0000"  >&lt;p&gt;Well, Heikki &amp;#8211; is your uneasiness based on the implementation issues that we may have? Or is it a deeper, conceptual issue?&lt;/p&gt;</comment>
                                                            <comment id="188806" author="63e2a2771b13d42998e4e706" created="Wed, 1 Mar 2017 15:32:35 +0000"  >&lt;p&gt;&lt;a href=&quot;https://folio-org.atlassian.net/secure/ViewProfile.jspa?accountId=712020%3A38d1a08f-86a8-4df2-9191-239b16b0a81a&quot; class=&quot;user-hover&quot; rel=&quot;712020:38d1a08f-86a8-4df2-9191-239b16b0a81a&quot; data-account-id=&quot;712020:38d1a08f-86a8-4df2-9191-239b16b0a81a&quot; accountid=&quot;712020:38d1a08f-86a8-4df2-9191-239b16b0a81a&quot; rel=&quot;noreferrer&quot;&gt;Heikki Levanto&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;does that mean you would be equally uneasy with /logic/users and /logic/inventory/items or /logic/items for business logic interfaces?&lt;/p&gt;</comment>
                                                            <comment id="188808" author="557058:b8e64633-1f7c-402d-9caf-9959a5ba5d0d" created="Thu, 2 Mar 2017 12:03:32 +0000"  >&lt;p&gt;Guys,&lt;/p&gt;

&lt;p&gt;Other than a stylistic quality what would be the benefit of grouping things under /storage rather than qualifying this in the module name, e.g /users-storage. Are we sure that there is going to be a hard cut difference between storage and bl modules?&lt;/p&gt;</comment>
                                                            <comment id="188811" author="63e2a2771b13d42998e4e706" created="Thu, 2 Mar 2017 16:39:07 +0000"  >&lt;p&gt;&lt;a href=&quot;https://folio-org.atlassian.net/secure/ViewProfile.jspa?accountId=557058%3Ab8e64633-1f7c-402d-9caf-9959a5ba5d0d&quot; class=&quot;user-hover&quot; rel=&quot;557058:b8e64633-1f7c-402d-9caf-9959a5ba5d0d&quot; data-account-id=&quot;557058:b8e64633-1f7c-402d-9caf-9959a5ba5d0d&quot; accountid=&quot;557058:b8e64633-1f7c-402d-9caf-9959a5ba5d0d&quot; rel=&quot;noreferrer&quot;&gt;Jakub Skoczen&lt;/a&gt; &lt;a href=&quot;https://folio-org.atlassian.net/secure/ViewProfile.jspa?accountId=712020%3A38d1a08f-86a8-4df2-9191-239b16b0a81a&quot; class=&quot;user-hover&quot; rel=&quot;712020:38d1a08f-86a8-4df2-9191-239b16b0a81a&quot; data-account-id=&quot;712020:38d1a08f-86a8-4df2-9191-239b16b0a81a&quot; accountid=&quot;712020:38d1a08f-86a8-4df2-9191-239b16b0a81a&quot; rel=&quot;noreferrer&quot;&gt;Heikki Levanto&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;I don&apos;t think there is a lot of practical difference between /storage/items, /items-storage or /item-storage/items (I personally prefer 1 or 3). The value of it being expressed in a path, is that it creates an explicit grouping. This might be far less useful if we don&apos;t want to categorise interfaces as either for storage or business logic.&lt;/p&gt;

&lt;p&gt;What might it look like for interfaces to not be distinguished as storage or business logic? Could we have only a single resource for a conceptual idea, e.g. only one definition of an item, user or loan? Could it be that we differentiate between them using some other property?&lt;/p&gt;

&lt;p&gt;We currently have resources with the same conceptual name (e.g. user or item) that we need to be able to differentiate between due to the same domain concept being modelling as a storage resource and business logic resource. At the moment, we make this differentiation differently, It might be valuable to have a convention so that an observer is able to easily distinguish between them.&lt;/p&gt;

&lt;p&gt;The only property of the resources that I&apos;m aware of in the current examples we have, is whether an interface is intended to be for storage or business logic, it may well be that there are more sensible distinguishing properties, e.g. domain context (/circulation/loan for example).&lt;/p&gt;

&lt;p&gt;Alternatively, if we envisage that a particular named concept will only be expressed once (which is how I interpret the potential for not distinguishing between storage and business logic interfaces) then this challenge goes away.&lt;/p&gt;

&lt;p&gt;Hugs,&lt;/p&gt;

&lt;p&gt;Marc&lt;/p&gt;</comment>
                                                            <comment id="188816" author="712020:38d1a08f-86a8-4df2-9191-239b16b0a81a" created="Fri, 3 Mar 2017 10:53:04 +0000"  >&lt;p&gt;@Mike - The implementation issue is one of the reasons for my unease, but I also feel that it would be cleaner if every module would have its own path prefix. I see it as cleaner design, and less risk of accidental collisions.&lt;/p&gt;

&lt;p&gt;I also believe that the division to storage and business logic will get muddled up when we get more modules. We already have UI modules, and I am sure we will get more types as time goes by (gadgets, connectors, etc). In some cases there may be several layers of logic... That&apos;s why I don&apos;t like /storage/users, and that kind of schemes.&lt;/p&gt;

&lt;p&gt;So, my personal prefernce would be to have the module that the UI is most likely to be interacting with having the most generic path prefix. For example the users business logic module could take /users. The modules it needs to support its functionality could have related paths, like /users-storage (and /users-calculations, /users-commentary, /users-whatever...). This might even extend as far as /users-permissions, although I don&apos;t have anything against a plain /permissions.&lt;/p&gt;</comment>
                                                            <comment id="188819" author="5bffed52a1b46046f530c8f7" created="Fri, 3 Mar 2017 12:12:02 +0000"  >&lt;blockquote&gt;&lt;p&gt;I also believe that the division to storage and business logic will get muddled up when we get more modules.&lt;/p&gt;&lt;/blockquote&gt;

&lt;p&gt;That certainly seems possible. I agree that, this early in the game, with so many more modules to be created, we should be careful about locking ourselves into a routing convention that may look silly down the line.&lt;/p&gt;

&lt;blockquote&gt;&lt;p&gt;So, my personal prefernce would be to have the module that the UI is most likely to be interacting with having the most generic path prefix. For example the users business logic module could take /users.&lt;/p&gt;&lt;/blockquote&gt;

&lt;p&gt;This sounds right to me. I have a bit of a horror of the &lt;tt&gt;-bl&lt;/tt&gt; suffix, and find myself imagining a world where new developers come into the FOLIO world asking &quot;Why do all the module names end with &lt;tt&gt;-bl&lt;/tt&gt;&quot; only to be told &quot;They just do, that&apos;s how it is&quot;.&lt;/p&gt;

&lt;p&gt;So I guess I am wholly in agreement with Heikki&apos;s suggestion. Each module (or more precisely each interface, as multiple modules can implement the same interface) should own a single top-level route, and do all their business within that area; and related modules should have related top-level routes, as in &lt;tt&gt;/inventory&lt;/tt&gt; and &lt;tt&gt;/inventory-storage&lt;/tt&gt;.&lt;/p&gt;</comment>
                                                            <comment id="188825" author="63e2a2771b13d42998e4e706" created="Fri, 3 Mar 2017 16:17:19 +0000"  >&lt;p&gt;&lt;a href=&quot;https://folio-org.atlassian.net/secure/ViewProfile.jspa?accountId=5bffed52a1b46046f530c8f7&quot; class=&quot;user-hover&quot; rel=&quot;5bffed52a1b46046f530c8f7&quot; data-account-id=&quot;5bffed52a1b46046f530c8f7&quot; accountid=&quot;5bffed52a1b46046f530c8f7&quot; rel=&quot;noreferrer&quot;&gt;Mike Taylor&lt;/a&gt; &lt;a href=&quot;https://folio-org.atlassian.net/secure/ViewProfile.jspa?accountId=712020%3A38d1a08f-86a8-4df2-9191-239b16b0a81a&quot; class=&quot;user-hover&quot; rel=&quot;712020:38d1a08f-86a8-4df2-9191-239b16b0a81a&quot; data-account-id=&quot;712020:38d1a08f-86a8-4df2-9191-239b16b0a81a&quot; accountid=&quot;712020:38d1a08f-86a8-4df2-9191-239b16b0a81a&quot; rel=&quot;noreferrer&quot;&gt;Heikki Levanto&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Ok, if I were to try to express this convention, it could be:&lt;/p&gt;
&lt;ul&gt;
	&lt;li&gt;Every interface has a globally unique top level path (e.g. /inventory, /loan-storage )&lt;/li&gt;
	&lt;li&gt;The interface most likely to be used by the UI (typically a business logic module at the moment) would be named after the concept being modelled (e.g. /users, /items )&lt;/li&gt;
	&lt;li&gt;Concepts being modelled could be grouped by context (e.g. /inventory/items, /circulation/loans )&lt;/li&gt;
	&lt;li&gt;Where a concept is modelled in another interface (e.g. storage modules), it will have a related yet different top level path (e.g. /item-storage/items, /loan-storage/loans )&lt;/li&gt;
&lt;/ul&gt;


&lt;p&gt;Does that express the convention we are talking about?&lt;/p&gt;

&lt;p&gt;Hugs,&lt;/p&gt;

&lt;p&gt;Marc&lt;/p&gt;</comment>
                    </comments>
                <issuelinks>
                            <issuelinktype id="10003">
                    <name>Relates</name>
                                            <outwardlinks description="relates to">
                                        <issuelink>
            <issuekey id="79436">FOLIO-519</issuekey>
        </issuelink>
            <issuelink>
            <issuekey id="29682">CIRCSTORE-2</issuekey>
        </issuelink>
                            </outwardlinks>
                                                        </issuelinktype>
                    </issuelinks>
                <attachments>
                    </attachments>
                <subtasks>
                    </subtasks>
                <customfields>
                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                    <customfield id="customfield_10000" key="com.atlassian.jira.plugins.jira-development-integration-plugin:devsummarycf">
                        <customfieldname>Development</customfieldname>
                        <customfieldvalues>
                            
                        </customfieldvalues>
                    </customfield>
                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                    <customfield id="customfield_10019" key="com.pyxis.greenhopper.jira:gh-lexo-rank">
                        <customfieldname>Rank</customfieldname>
                        <customfieldvalues>
                            <customfieldvalue>0|hzxks7:</customfieldvalue>

                        </customfieldvalues>
                    </customfield>
                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                    <customfield id="customfield_10020" key="com.pyxis.greenhopper.jira:gh-sprint">
                        <customfieldname>Sprint</customfieldname>
                        <customfieldvalues>
                            
                        </customfieldvalues>
                    </customfield>
                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                        <customfield id="customfield_10024" key="com.atlassian.jira.ext.charting:firstresponsedate">
                        <customfieldname>[CHART] Date of First Response</customfieldname>
                        <customfieldvalues>
                            <customfieldvalue>Wed, 1 Mar 2017 15:03:49 +0000</customfieldvalue>

                        </customfieldvalues>
                    </customfield>
                                                                <customfield id="customfield_10025" key="com.atlassian.jira.ext.charting:timeinstatus">
                        <customfieldname>[CHART] Time in Status</customfieldname>
                        <customfieldvalues>
                            
                        </customfieldvalues>
                    </customfield>
                                    </customfields>
    </item>
</channel>
</rss>