javiergamarra/liferay-devcon-appointment

buildREST not work with multiple tags

Opened this issue · 4 comments

If I use multiple tags - different tag: https://github.com/nhpatt/liferay-devcon-appointment/blob/master/appointments-impl/rest-openapi.yaml#L65 for different schema buildREST gradle task do not create classes for the new Tag and edit and delete operationId form my rest-openapi.yaml

Have you tried with the latest version of REST Builder? 1.0.98?

No I have restBuilder group: "com.liferay", name: "com.liferay.portal.tools.rest.builder", version: "1.0.23"
If I have set REST Builder version to 1.0.98 its have exception:

freemarker.core._TemplateModelException: [... Exception message was already printed; see it above ...]
	at freemarker.ext.beans._MethodUtil.newInvocationTemplateModelException(_MethodUtil.java:289)
	at freemarker.ext.beans._MethodUtil.newInvocationTemplateModelException(_MethodUtil.java:252)
	at freemarker.ext.beans.SimpleMethodModel.exec(SimpleMethodModel.java:77)
	at freemarker.core.MethodCall._eval(MethodCall.java:65)
	at freemarker.core.Expression.eval(Expression.java:83)
	at freemarker.core.DollarVariable.calculateInterpolatedStringOrMarkup(DollarVariable.java:100)
	at freemarker.core.DollarVariable.accept(DollarVariable.java:63)
	at freemarker.core.Environment.visit(Environment.java:366)
	at freemarker.core.IteratorBlock$IterationContext.executedNestedContentForCollOrSeqListing(IteratorBlock.java:317)
	at freemarker.core.IteratorBlock$IterationContext.executeNestedContent(IteratorBlock.java:271)
	at freemarker.core.IteratorBlock$IterationContext.accept(IteratorBlock.java:242)
	at freemarker.core.Environment.visitIteratorBlock(Environment.java:642)
	at freemarker.core.IteratorBlock.acceptWithResult(IteratorBlock.java:107)
	at freemarker.core.IteratorBlock.accept(IteratorBlock.java:93)
	at freemarker.core.Environment.visit(Environment.java:330)
	at freemarker.core.Environment.visit(Environment.java:336)
	at freemarker.core.Environment.process(Environment.java:309)
	at freemarker.template.Template.process(Template.java:384)
	at com.liferay.portal.tools.rest.builder.internal.freemarker.FreeMarker.processTemplate(FreeMarker.java:60)
	at com.liferay.portal.tools.rest.builder.internal.freemarker.util.FreeMarkerUtil.processTemplate(FreeMarkerUtil.java:32)
	at com.liferay.portal.tools.rest.builder.RESTBuilder._createGraphQLQueryFile(RESTBuilder.java:865)
	at com.liferay.portal.tools.rest.builder.RESTBuilder.build(RESTBuilder.java:218)
	at com.liferay.portal.tools.rest.builder.RESTBuilder.main(RESTBuilder.java:115)
Caused by: java.lang.StringIndexOutOfBoundsException: String index out of range: -1
	at java.lang.String.substring(String.java:1967)
	at com.liferay.portal.vulcan.yaml.graphql.GraphQLNamingUtil.getGraphQLPropertyName(GraphQLNamingUtil.java:48)
	at com.liferay.portal.tools.rest.builder.internal.freemarker.tool.FreeMarkerTool.getGraphQLPropertyName(FreeMarkerTool.java:313)
	at com.liferay.portal.tools.rest.builder.internal.freemarker.tool.FreeMarkerTool._getGraphQLBody(FreeMarkerTool.java:743)
	at com.liferay.portal.tools.rest.builder.internal.freemarker.tool.FreeMarkerTool.getGraphQLMethodJavadoc(FreeMarkerTool.java:274)
	at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
	at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
	at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
	at java.lang.reflect.Method.invoke(Method.java:498)
	at freemarker.ext.beans.BeansWrapper.invokeMethod(BeansWrapper.java:1505)
	at freemarker.ext.beans.SimpleMethodModel.exec(SimpleMethodModel.java:72)

currently its have REST builder v.104 (with the same Gradle buildREST task exception) https://mvnrepository.com/artifact/com.liferay/com.liferay.portal.tools.rest.builder/1.0.104
but it's appears that every commit in builder is a new alpha version

Every change in the code is a new version, can you paste your OpenAPI.yaml?

This is my rest-openapi.yaml it works like that but its not very clean solution.. you can try to change tags: ["News"] -> tags: ["Categories"] or tags: ["Documents"]

components:
  schemas:
    Category:
      description: Contains Categories.
      properties:
        categoryId:
          description: The internal ID.
          format: int64
          type: integer
        adminRole:
          description: The adminRole.
          type: string
        editRole:
          description: The editRole.
          type: string
        companyId:
          description: The companyId.
          format: int64
          type: integer
        name:
          description: The Category name.
          type: string
        color:
          description: The Category color.
          type: string
        background_color:
          description: The Category background_color.
          type: string
      type: object
    Documents:
      description: Contains Documents.
      properties:
        documentId:
          description: The internal ID.
          format: int64
          type: integer
        newsId:
          $ref: "#/components/schemas/News"
        attachment_url:
          format: uri
          type: string
        companyId:
          format: int64
          type: integer
      type: object
    News:
      description: Contains News.
      properties:
        newsId:
          description: The internal ID.
          format: int64
          type: integer
        categoryId:
          $ref: "#/components/schemas/Category"
        companyId:
          format: int64
          type: integer
        title:
          type: string
        description:
          type: string
        date_from:
          format: int64
          type: integer
        date_to:
          format: int64
          type: integer
      type: object
openapi: 3.0.1
info:
  description: "API for accessing News details."
  license:
    name: "Apache 2.0"
    url: "http://www.apache.org/licenses/LICENSE-2.0.html"
  title: "Headless News Api"
  version: v1.0
paths:
  "/categories":
    get:
      operationId: getCategoriesPage
      tags: ["News"]
      description: Retrieves the list of Categories. Results can be paginated, filtered, searched, and sorted.
      responses:
        200:
          description: ""
          content:
            application/json:
              schema:
                items:
                  $ref: "#/components/schemas/Category"
                type: array
            application/xml:
              schema:
                items:
                  $ref: "#/components/schemas/Category"
                type: array
  "/documents":
    post:
      operationId: postDocument
      tags: ["News"]
      description: Create a new Documents.
      requestBody:
        content:
          application/json:
            schema:
              $ref: "#/components/schemas/Documents"
          application/xml:
            schema:
              $ref: "#/components/schemas/Documents"
      responses:
        200:
          description: ""
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Documents"
            application/xml:
              schema:
                $ref: "#/components/schemas/Documents"
  "/documents/{newsId}":
    get:
      operationId: getDocumentNews
      tags: ["News"]
      description: Retrieves the list of Documents via newsId.
      parameters:
        - name: newsId
          in: path
          required: true
          schema:
            type: string
      responses:
        200:
          description: ""
          content:
            application/json:
              schema:
                items:
                  $ref: "#/components/schemas/Documents"
                type: array
            application/xml:
              schema:
                items:
                  $ref: "#/components/schemas/Documents"
                type: array
  "/documents/all":
    get:
      operationId: getDocumentAllPage
      tags: ["News"]
      description: Retrieves the list of Documents.
      responses:
        200:
          description: ""
          content:
            application/json:
              schema:
                items:
                  $ref: "#/components/schemas/Documents"
                type: array
            application/xml:
              schema:
                items:
                  $ref: "#/components/schemas/Documents"
                type: array
  "/news/all":
    get:
      operationId: getNewsesAllPage
      tags: ["News"]
      description: Retrieves the list of News. Results can be paginated, filtered, searched, and sorted.
      responses:
        200:
          description: ""
          content:
            application/json:
              schema:
                items:
                  $ref: "#/components/schemas/News"
                type: array
            application/xml:
              schema:
                items:
                  $ref: "#/components/schemas/News"
                type: array
  "/news":
    get:
      operationId: getNewsPage
      tags: ["News"]
      description: Retrieves the list of News. Results can be paginated, filtered, searched, and sorted.
      parameters:
        - in: query
          name: filter
          schema:
            type: string
        - in: query
          name: page
          schema:
            type: integer
        - in: query
          name: pageSize
          schema:
            type: integer
        - in: query
          name: search
          schema:
            type: string
        - in: query
          name: sort
          schema:
            type: string
      responses:
        200:
          description: ""
          content:
            application/json:
              schema:
                items:
                  $ref: "#/components/schemas/News"
                type: array
            application/xml:
              schema:
                items:
                  $ref: "#/components/schemas/News"
                type: array
    post:
      operationId: postNews
      tags: ["News"]
      description: Create a new News.
      requestBody:
        content:
          application/json:
            schema:
              $ref: "#/components/schemas/News"
          application/xml:
            schema:
              $ref: "#/components/schemas/News"
      responses:
        200:
          description: ""
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/News"
            application/xml:
              schema:
                $ref: "#/components/schemas/News"
  "/news/{newsId}":
    get:
      operationId: getNews
      tags: ["News"]
      description: Retrieves the News via its ID.
      parameters:
        - name: newsId
          in: path
          required: true
          schema:
            type: string
      responses:
        200:
          description: ""
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/News"
            application/xml:
              schema:
                $ref: "#/components/schemas/News"
    put:
      operationId: putNews
      tags: ["News"]
      description: Replaces the News with the information sent in the request body. Any missing fields are deleted, unless they are required.
      parameters:
        - name: newsId
          in: path
          required: true
          schema:
            type: string
      requestBody:
        content:
          application/json:
            schema:
              $ref: "#/components/schemas/News"
          application/xml:
            schema:
              $ref: "#/components/schemas/News"
      responses:
        200:
          description: Default Response
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/News"
            application/xml:
              schema:
                $ref: "#/components/schemas/News"
    patch:
      operationId: patchNews
      tags: ["News"]
      description: Replaces the News with the information sent in the request body. Any missing fields are deleted, unless they are required.
      parameters:
        - name: newsId
          in: path
          required: true
          schema:
            type: string
      requestBody:
        content:
          application/json:
            schema:
              $ref: "#/components/schemas/News"
          application/xml:
            schema:
              $ref: "#/components/schemas/News"
      responses:
        200:
          description: ""
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/News"
            application/xml:
              schema:
                $ref: "#/components/schemas/News"
    delete:
      operationId: deleteNews
      tags: ["News"]
      description: Deletes the News and returns a 204 if the operation succeeds.
      parameters:
        - name: newsId
          in: path
          required: true
          schema:
            type: string
      responses:
        200:
          description: ""
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/News"
            application/xml:
              schema:
                $ref: "#/components/schemas/News"