<?xml version="1.0" encoding="UTF-8"?>
<feed xmlns="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <title>REST Builder Limitations / Observations</title>
  <link rel="self" href="https://liferay.dev/c/message_boards/find_thread?p_l_id=119785294&amp;threadId=120738740" />
  <subtitle>REST Builder Limitations / Observations</subtitle>
  <id>https://liferay.dev/c/message_boards/find_thread?p_l_id=119785294&amp;threadId=120738740</id>
  <updated>2026-04-04T00:37:56Z</updated>
  <dc:date>2026-04-04T00:37:56Z</dc:date>
  <entry>
    <title>RE: RE: REST Builder Limitations / Observations</title>
    <link rel="alternate" href="https://liferay.dev/c/message_boards/find_message?p_l_id=119785294&amp;messageId=122383105" />
    <author>
      <name>Kareem Younes</name>
    </author>
    <id>https://liferay.dev/c/message_boards/find_message?p_l_id=119785294&amp;messageId=122383105</id>
    <updated>2024-02-06T18:22:10Z</updated>
    <published>2024-02-06T09:31:14Z</published>
    <summary type="html">&lt;p&gt;@Javier Gamarra&lt;br&gt; This might be a weird place to ask this; however,
  I really needed an expert's opinion on this.&lt;br&gt;
  &lt;br&gt; I am trying to find a way to build a rest-builder that in the
  rest-openapi.yaml file  I do not have to create a separate component
  for the built-in Liferay commerce product. Instead I want to reference
  the same class the L iferay headless product api uses.&lt;br&gt;
  &lt;br&gt; Thanks.&lt;/p&gt;</summary>
    <dc:creator>Kareem Younes</dc:creator>
    <dc:date>2024-02-06T09:31:14Z</dc:date>
  </entry>
  <entry>
    <title>RE: RE: REST Builder Limitations / Observations</title>
    <link rel="alternate" href="https://liferay.dev/c/message_boards/find_message?p_l_id=119785294&amp;messageId=120739990" />
    <author>
      <name>Javier Gamarra</name>
    </author>
    <id>https://liferay.dev/c/message_boards/find_message?p_l_id=119785294&amp;messageId=120739990</id>
    <updated>2021-04-24T08:38:25Z</updated>
    <published>2021-04-24T08:38:25Z</published>
    <summary type="html">&lt;ul&gt;
  &lt;li&gt;Maybe backed by an abstract method or an adapter or builder that
    would make it clear this would be the place to implement it?&lt;/li&gt;&lt;/ul&gt;
&lt;p&gt;Got it&lt;/p&gt;
&lt;ul&gt;
  &lt;li&gt;Liferay source code leverages several approaches including the
    anti-pattern double braces - as David N. references in his blog post
    series on the &lt;a
      href="https://liferay.dev/blogs/-/blogs/creating-headless-apis-part-4/exclusive"&gt;headless
    api&lt;/a&gt; - so it's a little confusing what is the &lt;em&gt;right&lt;/em&gt; way
    to do it. &lt;/li&gt;&lt;/ul&gt;
&lt;p&gt;The double braces are not the recommended way, as you mention it's an
  anti pattern. Liferay, being a large organization, we often find that
  we have to adhere to code conventions we don't personally like with
  the goal of achieving a consistent codebase, double braces being one
  example. We don't have a team recommendation because we are not
  providing tools/methods in how to convert entities to DTOs but that
  will change in the future. Right now if you are not going to share the
  conversion across different modules just using setters is enough. If
  you plan on sharing the conversion the DTOConverter would be the way
  to go.&lt;/p&gt;
&lt;ul&gt;
  &lt;li&gt;Lastly, does the fact that you have just opened &lt;a
    href="https://issues.liferay.com/browse/LPS-130916"&gt;LPS-130916&lt;/a&gt; mean
    that I can not yet leverage ElasticSearch aggregations via the
    Headless API framework?&lt;/li&gt;&lt;/ul&gt;
&lt;p&gt;No, I created &lt;a
  href="http://issues.liferay.com/browse/LPS-130916"&gt;LPS-130916&lt;/a&gt; some
  days ago because I want to improve the API for defining and exposing
  which fields can be filtered/searched/aggregated but right now you can
  do it and it works. Javier will share the drafts he prepared about it
  and we can guide you in the implementation/use. But basically you can
  aggregate on fields indexed by keyword or modify the index to allow
  aggregating by &amp;quot;text-indexed&amp;quot; fields (an Elastic
  limitation). An example query like:&lt;/p&gt;
&lt;pre&gt;&lt;code class="language-java"&gt;curl &amp;quot;http://localhost:8080/o/headless-delivery/v1.0/sites/Guest/structured-contents/?restrictFields=actions&amp;amp;aggregationTerms=userName,title,dateCreated,dateModified,entryClassPK,version,status,roleId,folderId&amp;amp;fields=title&amp;quot; \
     -u 'test@liferay.com:test'&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Should return something like (with just one content created):&lt;/p&gt;
&lt;pre&gt;&lt;code class="language-java"&gt;{
  &amp;quot;actions&amp;quot;: {},
  &amp;quot;facets&amp;quot;: [
    {
      &amp;quot;facetCriteria&amp;quot;: &amp;quot;entryClassPK&amp;quot;,
      &amp;quot;facetValues&amp;quot;: [
        {
          &amp;quot;numberOfOccurrences&amp;quot;: 1,
          &amp;quot;term&amp;quot;: &amp;quot;92276&amp;quot;
        }
      ]
    },
    {
      &amp;quot;facetCriteria&amp;quot;: &amp;quot;roleId&amp;quot;,
      &amp;quot;facetValues&amp;quot;: [
        {
          &amp;quot;numberOfOccurrences&amp;quot;: 1,
          &amp;quot;term&amp;quot;: &amp;quot;39613&amp;quot;
        },
        {
          &amp;quot;numberOfOccurrences&amp;quot;: 1,
          &amp;quot;term&amp;quot;: &amp;quot;39615&amp;quot;
        }
      ]
    },
    {
      &amp;quot;facetCriteria&amp;quot;: &amp;quot;userName&amp;quot;,
      &amp;quot;facetValues&amp;quot;: [
        {
          &amp;quot;numberOfOccurrences&amp;quot;: 1,
          &amp;quot;term&amp;quot;: &amp;quot;test test&amp;quot;
        }
      ]
    },
    {
      &amp;quot;facetCriteria&amp;quot;: &amp;quot;version&amp;quot;,
      &amp;quot;facetValues&amp;quot;: [
        {
          &amp;quot;numberOfOccurrences&amp;quot;: 1,
          &amp;quot;term&amp;quot;: &amp;quot;1.3&amp;quot;
        }
      ]
    },
    {
      &amp;quot;facetCriteria&amp;quot;: &amp;quot;folderId&amp;quot;,
      &amp;quot;facetValues&amp;quot;: [
        {
          &amp;quot;numberOfOccurrences&amp;quot;: 1,
          &amp;quot;term&amp;quot;: &amp;quot;0&amp;quot;
        }
      ]
    },
    {
      &amp;quot;facetCriteria&amp;quot;: &amp;quot;title&amp;quot;,
      &amp;quot;facetValues&amp;quot;: [
        {
          &amp;quot;numberOfOccurrences&amp;quot;: 1,
          &amp;quot;term&amp;quot;: &amp;quot;a new hope&amp;quot;
        }
      ]
    },
    {
      &amp;quot;facetCriteria&amp;quot;: &amp;quot;dateModified&amp;quot;,
      &amp;quot;facetValues&amp;quot;: [
        {
          &amp;quot;numberOfOccurrences&amp;quot;: 1,
          &amp;quot;term&amp;quot;: &amp;quot;20210424082455&amp;quot;
        }
      ]
    },
    {
      &amp;quot;facetCriteria&amp;quot;: &amp;quot;dateCreated&amp;quot;,
      &amp;quot;facetValues&amp;quot;: [
        {
          &amp;quot;numberOfOccurrences&amp;quot;: 1,
          &amp;quot;term&amp;quot;: &amp;quot;20210413205209&amp;quot;
        }
      ]
    },
    {
      &amp;quot;facetCriteria&amp;quot;: &amp;quot;status&amp;quot;,
      &amp;quot;facetValues&amp;quot;: [
        {
          &amp;quot;numberOfOccurrences&amp;quot;: 1,
          &amp;quot;term&amp;quot;: &amp;quot;0&amp;quot;
        }
      ]
    }
  ],
  &amp;quot;items&amp;quot;: [
    {
      &amp;quot;title&amp;quot;: &amp;quot;A new hope&amp;quot;
    }
  ],
  &amp;quot;lastPage&amp;quot;: 1,
  &amp;quot;page&amp;quot;: 1,
  &amp;quot;pageSize&amp;quot;: 20,
  &amp;quot;totalCount&amp;quot;: 1
}&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt; &lt;/p&gt;</summary>
    <dc:creator>Javier Gamarra</dc:creator>
    <dc:date>2021-04-24T08:38:25Z</dc:date>
  </entry>
  <entry>
    <title>RE: RE: REST Builder Limitations / Observations</title>
    <link rel="alternate" href="https://liferay.dev/c/message_boards/find_message?p_l_id=119785294&amp;messageId=120739886" />
    <author>
      <name>Christopher Dawson</name>
    </author>
    <id>https://liferay.dev/c/message_boards/find_message?p_l_id=119785294&amp;messageId=120739886</id>
    <updated>2021-04-23T21:11:55Z</updated>
    <published>2021-04-23T21:11:55Z</published>
    <summary type="html">&lt;p&gt;Javier: Thanks for the prompt and comprehensive response!&lt;/p&gt;
&lt;p&gt;I will work on getting you those code samples early next week.&lt;/p&gt;
&lt;p&gt;Responses to your responses:&lt;/p&gt;
&lt;ol&gt;
  &lt;li&gt;very helpful to know about the available properties for
    rest-config.yaml. ty.&lt;/li&gt;
  &lt;li&gt;In terms of the conversion convention - it's not that I need the
    framework to auto-magically do it for me - rather that it would be
    nice to have an agreed upon approach. Maybe backed by an abstract
    method or an adapter or builder that would make it clear this would
    be the place to implement it?&lt;br /&gt;Liferay source code leverages
    several approaches including the anti-pattern double braces - as
    David N. references in his blog post series on the &lt;a
      href="https://liferay.dev/blogs/-/blogs/creating-headless-apis-part-4/exclusive"&gt;headless
    api&lt;/a&gt; - so it's a little confusing what is the &lt;em&gt;right&lt;/em&gt; way
    to do it. &lt;/li&gt;&lt;/ol&gt;
&lt;p&gt;Lastly, does the fact that you have just opened &lt;a
  href="https://issues.liferay.com/browse/LPS-130916"&gt;LPS-130916&lt;/a&gt; mean
  that I can not yet leverage ElasticSearch aggregations via the
  Headless API framework? Our 6.2 app that we are rewriting on 7.3.5
  makes heavy use of these and so I would like to know if this is
  something I should be expecting to use in the near term, or whether I
  need to go my own way and leverage the ElasticSearch client libraries
  directly. (I did have to do this for our 6.2 app - so it wouldn't be
  an unexpected piece of news). I would just like to know in order to
  plan accordingly.&lt;/p&gt;
&lt;p&gt;Sincerely&lt;/p&gt;</summary>
    <dc:creator>Christopher Dawson</dc:creator>
    <dc:date>2021-04-23T21:11:55Z</dc:date>
  </entry>
  <entry>
    <title>RE: REST Builder Limitations / Observations</title>
    <link rel="alternate" href="https://liferay.dev/c/message_boards/find_message?p_l_id=119785294&amp;messageId=120739548" />
    <author>
      <name>Javier Gamarra</name>
    </author>
    <id>https://liferay.dev/c/message_boards/find_message?p_l_id=119785294&amp;messageId=120739548</id>
    <updated>2021-04-22T20:56:14Z</updated>
    <published>2021-04-22T20:52:07Z</published>
    <summary type="html">&lt;p&gt;Ohhh, really nice feedback, thank you so much! :D We'll act on it
  right away.&lt;/p&gt;
&lt;p&gt;Point by point this is our comments:&lt;/p&gt;
&lt;ul&gt;
  &lt;li&gt;buildREST Gradle task is rewriting parts of my rest-openapi.yaml file. &lt;/li&gt;&lt;/ul&gt;
&lt;p&gt;I hate that. It's a configuration that was thought to be internal of
  liferay and because of several issues is the default. We are going to
  change that here: &lt;a
  href="https://issues.liferay.com/browse/LPS-130965"&gt;LPS-130965&lt;/a&gt;.
  You can disable it in the rest-config.yaml, &lt;a
  href="https://github.com/javierdearcos/rest-builder-docs/#api-configuration-file"&gt;here&lt;/a&gt;
  are some of the properties. The most annoying ones are forcePredictableSchemaPropertyName and forcePredictableOperationId.&lt;/p&gt;
&lt;ul&gt;
  &lt;li&gt;If I attempt to use the schema -&amp;gt; items -&amp;gt; $ref -&amp;gt;
    XXXResource then RESTBuilder fails with GraphQL errors&lt;/li&gt;&lt;/ul&gt;
&lt;p&gt;This looks like a bug, can you paste what you try to generate?&lt;/p&gt;
&lt;ul&gt;
  &lt;li&gt;I'm using 7.3.5 GA6 - but I am not seeing consistent support
    for LPS-106992 in the framework:&lt;/li&gt;&lt;/ul&gt;
&lt;p&gt;We're going to share the documentation about it. Aggregations are
  tricky because we rely on the fields that Elasticsearch support that
  are not all the fields that can be filterable/sortable/searchable
  because it depends on how they have been indexed. Our idea in &lt;a
  href="https://issues.liferay.com/browse/LPS-130916"&gt;LPS-130916&lt;/a&gt; is
  to expose can you can do which each field.&lt;/p&gt;
&lt;ul&gt;
  &lt;li&gt;I found myself needing to define a component
    called MultipartBody to reference within my path definition.&lt;/li&gt;&lt;/ul&gt;
&lt;p&gt;Yeah, you should not need to do this... it should pick and let you
  use the existing one. Can you share the endpoint definition (via email
  javier.gamarra@liferay.com or slack if it has sensitive parts).&lt;/p&gt;
&lt;ul&gt;
  &lt;li&gt;Error outputs from the buildREST gradle task is very cryptic.
    Makes it a very time consuming process to understand what the
    problem is - especially when loading it into Open API validators
    seem to show no issues&lt;/li&gt;&lt;/ul&gt;
&lt;p&gt;Yep, this is 100% true. We have made some improvements but there is a
  lot of margin to improve.&lt;/p&gt;
&lt;ul&gt;
  &lt;li&gt;Need to quote every path definition&lt;/li&gt;&lt;/ul&gt;
&lt;p&gt;We were not aware of it, we'll investigate it &lt;a href="https://issues.liferay.com/browse/LPS-131004"&gt;here&lt;/a&gt;.&lt;/p&gt;
&lt;ul&gt;
  &lt;li&gt;There must be an entry in the tags section for every path definition&lt;/li&gt;&lt;/ul&gt;
&lt;p&gt;All should not be needed, only the ones that can not be linked to a
  class (like delete or multiparts) but those are already too many, we
  are working on it &lt;a href="https://issues.liferay.com/browse/LPS-130754"&gt;here&lt;/a&gt;.&lt;/p&gt;
&lt;ul&gt;
  &lt;li&gt;Every responses section seems to need both a application/json AND
    a application/xml specified under contents&lt;/li&gt;&lt;/ul&gt;
&lt;p&gt;Again a force flag, we recommend them disabling them, we'll change it
  to false by default.&lt;/p&gt;
&lt;ul&gt;
  &lt;li&gt;I tried creating a resource property with the name abstract and
    that choked the builder&lt;/li&gt;&lt;/ul&gt;
&lt;p&gt;Hehe, this looks like because abstract is a reserved keyword in Java.
  We should validate it beforehand.&lt;/p&gt;
&lt;ul&gt;
  &lt;li&gt;In order to make our application fully headless - I have had to
    create endpoints to update our user profiles - since none of these
    are currently exposed via the Liferay Headless Admin User API endpoint.&lt;/li&gt;&lt;/ul&gt;
&lt;p&gt;Can you share them? and we'll integrate them in the product. We lack
  a lot of &amp;quot;actions&amp;quot;, specially those that are very linked to
  operations in the portal.&lt;/p&gt;
&lt;ul&gt;
  &lt;li&gt;Do I still need to define an OSGI Web module for my application -
    even though it is supposed to be entirely headless? It appears that
    we still need to define Portlet referencing permission defintions
    in default.xml for our root resource actions. Is this true? Are
    there any resources available which could help me with migrating
    permissions from a 6.2.x web application to a 7.3.x+ OSGI
    modularized Headless API application?&lt;/li&gt;&lt;/ul&gt;
&lt;p&gt;Here I'm a bit of a loss. I think the portlet is still needed but
  maybe someone from security or core can help pointing to resources. We
  can also ask in the community slack directly.&lt;/p&gt;
&lt;ul&gt;
  &lt;li&gt;Some API signatures require lambda functions - for example within
    the Search indexing framework&lt;/li&gt;&lt;/ul&gt;
&lt;p&gt;The SearchUtil interface is tough... we have to simplify/revamp it.&lt;/p&gt;
&lt;ul&gt;
  &lt;li&gt;The system could benefit from a clear convention for
    converting between ServiceBuilder entities and Resource DTOs&lt;/li&gt;&lt;/ul&gt;
&lt;p&gt;Interesting... this is the second time we receive this feedback but
  we could not pinpoint the needs... what would you expect? to create
  automatically an API exposing all fields? or have a
  filtering/conversion layer that receives everything and removes/adds?&lt;/p&gt;
&lt;ul&gt;
  &lt;li&gt;Calling a YYResourceImpl from another XXResourceImpl -- for
    example in the case of delegating the population of DTOs to their
    specific ResourceImpl class when you have a Resource that is
    composed of others -- requires that you pre-populate that delegation
    ResourceImpl's contexts.&lt;/li&gt;&lt;/ul&gt;
&lt;p&gt;REST Builder should generate some *ResourceFactory classes to
  simplify doing this automatically&lt;/p&gt;
&lt;p&gt;--&lt;/p&gt;
&lt;p&gt;I think this was all. We'll fix the bugs quickly, and please share us
  all the issues you find :)&lt;/p&gt;</summary>
    <dc:creator>Javier Gamarra</dc:creator>
    <dc:date>2021-04-22T20:52:07Z</dc:date>
  </entry>
  <entry>
    <title>REST Builder Limitations / Observations</title>
    <link rel="alternate" href="https://liferay.dev/c/message_boards/find_message?p_l_id=119785294&amp;messageId=120738739" />
    <author>
      <name>Christopher Dawson</name>
    </author>
    <id>https://liferay.dev/c/message_boards/find_message?p_l_id=119785294&amp;messageId=120738739</id>
    <updated>2021-04-21T22:08:02Z</updated>
    <published>2021-04-21T22:08:02Z</published>
    <summary type="html">&lt;p&gt;I thought it might be useful to other developers to put these
  observations / limitations in one place as pertains to REST Builder /
  Headless API development.&lt;/p&gt;
&lt;p&gt;To the Liferay developers who work on these components - I would
  really appreciate some feedback on where exactly things stand with
  each of these. (Thanks in advance!)&lt;/p&gt;
&lt;ol&gt;
  &lt;li&gt;
    &lt;strong&gt;buildREST&lt;/strong&gt; Gradle task is rewriting parts of my
    rest-openapi.yaml file. &lt;br /&gt;It appears that there is a component
    in the build process that is trying to make my schema
    &amp;quot;better&amp;quot;? Or it's trying to make it conform to some
    expected format. However I have no idea what that format looks like
    - and so I don't know what I should be changing it to. &lt;br /&gt;It does
    keep changing my response schema entities
    (e.g. &lt;strong&gt;images&lt;/strong&gt;)  for &lt;strong&gt;items&lt;/strong&gt;. I
    believe this has something to do with
    the &lt;strong&gt;Page&lt;/strong&gt; concept within the headless API - but I
    haven't found any documentation that specifcally indicates what I
    should be doing.&lt;br /&gt;If I attempt to use the &lt;i&gt;schema -&amp;gt; items
      -&amp;gt; $ref -&amp;gt; XXXResource&lt;/i&gt; then RESTBuilder fails with
    GraphQL errors&lt;br /&gt; &lt;/li&gt;
  &lt;li&gt;I'm using 7.3.5 GA6 - but I am not seeing consistent support
      for &lt;a
    href="https://issues.liferay.com/browse/LPS-106992"&gt;LPS-106992&lt;/a&gt; in
    the framework:&lt;ol&gt;
      &lt;li&gt;Within the LR codebase I
        see &lt;strong&gt;rest-open-api.yaml&lt;/strong&gt; files with the query
        parameter: &lt;strong&gt;aggregationTerms&lt;/strong&gt; defined - and I do
        see what appears to be the result of that in the method
        signatures of the related &lt;strong&gt;xxResourceImpl
        &lt;/strong&gt;classes - with their conversion
        into &lt;strong&gt;Aggregation&lt;/strong&gt;.&lt;br /&gt;However - I cannot find
        a single example within the API Explorer where I can enter a
        value for the &lt;strong&gt;aggregationTerms&lt;/strong&gt; query input. &lt;/li&gt;
      &lt;li&gt;Also, when I add an &lt;strong&gt;aggregationTerms&lt;/strong&gt; query
        input to my path definition I am not getting
        an &lt;strong&gt;Aggregation&lt;/strong&gt; generated. I am currently
        however getting:&lt;ol&gt;
          &lt;li&gt;
            &lt;strong&gt;Filter&lt;/strong&gt; (from including &lt;strong&gt;filter&lt;/strong&gt;)&lt;/li&gt;
          &lt;li&gt;
            &lt;strong&gt;Pagination &lt;/strong&gt;(from including &lt;strong&gt;pageSize&lt;/strong&gt; and &lt;strong&gt;page&lt;/strong&gt;)&lt;/li&gt;
          &lt;li&gt;
            &lt;strong&gt;Sort &lt;/strong&gt;(from including &lt;strong&gt;sort&lt;/strong&gt;)&lt;/li&gt;&lt;/ol&gt;&lt;/li&gt;
      &lt;li&gt;I don't see any documentation on this topic (I did ask Javier
        de Arcos Velilla for access to his google doc preview).&lt;br /&gt; &lt;/li&gt;&lt;/ol&gt;&lt;/li&gt;
  &lt;li&gt;In order to be able to create a custom endpoint to upload a file
    to the server - I found myself needing to define a component
    called &lt;strong&gt;MultipartBody&lt;/strong&gt; to reference within my path
    definition. While this ends up working overall, I end up getting a
    clash between my resource and
    the &lt;em&gt;com.liferay.portal.vulcan.multipart.MultipartBody&lt;strong&gt; &lt;/strong&gt;&lt;/em&gt;class.
    This requires me to need to clean up my imports on the affected
    classes each time I run the &lt;strong&gt;buildREST&lt;/strong&gt; gradle task.
    Am I missing something that would not require me to define my own variant?&lt;br /&gt; &lt;/li&gt;
  &lt;li&gt;Error outputs from the &lt;strong&gt;buildREST &lt;/strong&gt;gradle task
    is &lt;em&gt;very&lt;/em&gt; cryptic. Makes it a very time consuming process to
    understand what the problem is - especially when loading it into
    Open API validators seem to show no issues&lt;br /&gt; &lt;/li&gt;
  &lt;li&gt;Gotchas that I've run in to from using
    the &lt;strong&gt;buildREST&lt;/strong&gt; gradle task (some of which are listed
    in &lt;a
      href="https://help.liferay.com/hc/en-us/articles/360039425751-REST-Builder-Liferay-Conventions"&gt;REST
      Builder Conventions&lt;/a&gt;:&lt;ol&gt;
      &lt;li&gt;Need to quote every path definition&lt;ol&gt;
          &lt;li&gt;This mostly trips me up because I am moving between a
            separate OpenAPI editor and my Liferay workspace. I have
            gotten around this for now by only copying in new sections,
            rather than the entire YAML file each time&lt;/li&gt;&lt;/ol&gt;&lt;/li&gt;
      &lt;li&gt;There must be an entry in the &lt;strong&gt;tags&lt;/strong&gt; section
        for every path definition&lt;/li&gt;
      &lt;li&gt;Every &lt;strong&gt;responses&lt;/strong&gt; section seems to need both
        a &lt;strong&gt;application/json&lt;/strong&gt; AND
        a &lt;strong&gt;application/xml&lt;/strong&gt; specified under &lt;strong&gt;contents&lt;/strong&gt;&lt;/li&gt;
      &lt;li&gt;I tried creating a resource property with the
        name &lt;strong&gt;abstract&lt;/strong&gt; and that choked the builder&lt;br /&gt; &lt;/li&gt;&lt;/ol&gt;&lt;/li&gt;
  &lt;li&gt;In order to make our application fully &lt;em&gt;headless&lt;/em&gt; - I have
    had to create endpoints to update our user profiles - since none of
    these are currently exposed via the Liferay Headless Admin User API endpoint:&lt;ol&gt;
      &lt;li&gt;mark email as verified&lt;/li&gt;
      &lt;li&gt;accepting terms of service&lt;/li&gt;
      &lt;li&gt;uploading a profile image&lt;br /&gt; &lt;/li&gt;&lt;/ol&gt;&lt;/li&gt;
  &lt;li&gt;Since this current project represents a migration from a 6.x based
    application to 7.3.x - I am running into issues relating to how
    exactly to migrate Permissions. The permissions documentation is
    confusing at best and I am uncertain as to what exactly is and isn't
    supported for 7.3.5+. Some questions on this topic:&lt;ol&gt;
      &lt;li&gt;Do I still need to define an OSGI Web module for my
        application - even though it is supposed to be entirely
        headless? It appears that we still need to
        define &lt;strong&gt;Portlet&lt;/strong&gt; referencing permission
        defintions in &lt;strong&gt;default.xml&lt;/strong&gt; for our root resource
        actions. Is this true?&lt;/li&gt;
      &lt;li&gt;Are there any resources available which could help me with
        migrating permissions from a 6.2.x web application to a 7.3.x+
        OSGI modularized Headless API application?&lt;br /&gt; &lt;/li&gt;&lt;/ol&gt;&lt;/li&gt;
  &lt;li&gt;Some API signatures require lambda functions - for example within
    the Search indexing framework&lt;br /&gt; &lt;/li&gt;
  &lt;li&gt;The system could benefit from a clear convention for
    converting between ServiceBuilder entities and Resource DTOs&lt;br /&gt; &lt;/li&gt;
  &lt;li&gt;Calling a YYResourceImpl from another XXResourceImpl -- for
    example in the case of delegating the population of DTOs to their
    specific ResourceImpl class when you have a Resource that is
    composed of others -- requires that you pre-populate that delegation
    ResourceImpl's contexts.&lt;br /&gt;Is there any established pattern for
    doing this that's baked into the framework?&lt;br /&gt; &lt;/li&gt;&lt;/ol&gt;
&lt;p&gt;Again - thanks in advance for any information you can provide on
  these topics.&lt;/p&gt;
&lt;p&gt;Sincerely,&lt;/p&gt;
&lt;p&gt;Chris D.&lt;/p&gt;
&lt;p&gt; &lt;/p&gt;</summary>
    <dc:creator>Christopher Dawson</dc:creator>
    <dc:date>2021-04-21T22:08:02Z</dc:date>
  </entry>
</feed>
