Blog Post

Release Notes
8 MIN READ

Khoros Communities 20.5 Release Notes

SuzieH's avatar
SuzieH
Khoros Alumni (Retired)
5 years ago

Community 20.5 might look like a light release, but we have one big update that affects the single most used feature for nearly every customer - the GA of Inline Replies and Threading for Forums! In addition, our teams are working on exciting features currently in development and beta. There are also some nice additions to the Developer Experience. We've added support for batched and JSON-based requests to Community API v2, and we've added details about Studio endpoint customizations in Toolbox.

New Features and Updates

Inline Replies and Threading (GA)

In the 20.1Release Notes, we announced Early Access for our Inline Replies and Threading feature. This feature is now in General Availability (GA).

With Inline Replies and Threading you can reply to the main message or reply to a reply. This helps to better organize discussions and keep the context of the discussion meaningful.

  • To use this feature you must be on Forums v5.
  • By default, a post or a reply has three levels of threaded(indented) replies. Any reply after the third reply would be at the same level of indentation as the third reply. This is configurable up to eight levels. Contact Support to configure the levels of indentation.

Learn more about the Inline Replies and Threading feature.

Learn more about Inline Replies and Threading with examples

Learn about quilt changes for forums that are customized according to community needs.

JSON-based search queries in API v2

The Community API v2 /search endpoint can now take a raw JSON body in a POST request. A POST request enables you to make multiple search queries in a single request. POST also supports making subqueries in the same request. (Subquery support enables you to make a second query within the same request in cases where a field of an object returns a LiQL query in the response instead of the subobjects -- for example topics on the board resource.)

Note: JSON-based queries are supported over HTTP only. If you are writing a Freemarker customization, you should continue to use LiQL strings. 

JSON-based queries use the same principles as LiQL-based queries. We describe these principles in Using LiQL. See our collection documentation for the fields, constraints, and sorts supported for each Community API v2 resource type.

We'll look at a couple of quick examples here in the release notes. Find the full documentation for making JSON-based queries in the Developer Documentation Portal.

JSON-based query example

The following example JSON is equivalent to these two LiQL queries:

  • SELECT id, view_href, subject, board FROM messages WHERE board.id = 'developerDiscussion' ORDER BY 'is_solution' DESC LIMIT 5
  • SELECT id, title FROM boards WHERE id = 'developerDiscussion'

Create a separate subobject for each collection to query that includes the fields, constraints, sorts, and other entities as needed.

Example JSON body

[
    {  
        "messages": {
            "fields": [ "id", "view_href", "subject", "board"],
            "constraints": [
                { "board.id": "developerDiscussion" }   
            ],
            "sorts": ["is_solution"],
            "limit": 5
        }
    },
    {
        "boards": {
            "fields": [ "id", "title"],
            "constraints": [
                { "id": "'developerDiscussion'" } 
            ]
        }
    }
]

HTTPS Example

 

 

POST /api/2.0/search HTTP/1.1
Host: [COMMUNITY DOMAIN]
li-api-session-key: [SESSION KEY]
Content-Type: application/json

[
    {  
        "messages": {
            "fields": [ "id", "view_href", "subject", "board"],
            "constraints": [
                { "board.id": "developerDiscussion" }   
            ],
            "sorts": ["is_solution"],
            "limit": 5
        }
    },
    {
        "boards": {
            "fields": [ "id", "title"],
            "constraints": [
                { "id": "developerDiscussion" } 
            ]
        }
    }
]

 

 

JSON-based subquery example

This example JSON body requests the id, subject, and author.login fields for the last five topic messages posted to the photography board.

First, the query definition requests the topics in the board, and then defines the subquery. This saves you from having to make a separate call.

 

 

[
    {
        "boards": {
            "fields": [
                "topics"
            ],
            "constraints": [
                {
                    "id": "photography"
                }
            ],
            "subQueries": {
                "topics": {
                    "fields": [
                        "id",
                        "subject",
                        "author.login"
                    ],
                    "limit": 5
                }
            }
        }
    }
]

 

 

Batch requests to Community API v2

A POST to the /batch endpoint enables you to make multiple calls to Community API v2 in a single request. You can make Create, Read, Update, Delete, and Query calls within the same batch request.

  • Calls are passed to the /batch endpoint in a raw JSON body. Each call is a separate object in an object array.
  • Each call is executed in the sequence in which it is submitted with the top call running first and the bottom call running last
  • Each call is executed independently (not in a transaction). In other words, if one call fails, successful calls made before are not rolled back.
  • A failed call, by default, does not prevent calls after it from running; however, you can change this behavior by passing the api.batch.break_on_error query parameter set to true.
  • The number of calls allowed in a batch request is 50.

Note: The /batch endpoint is supported over HTTPS only. It is not supported in FreeMarker methods that make requests to the Community API (E.g., rest, restBuilder, liql) .

Note: Endpoints supporting the following resources are not allowed in requests made with the /batch endpoint: Auth, Product_Catalog, Schema, and Archive.

We'll look at a quick example below. Find full documentation in the Developer Documentation Portal.

Batch request example

A batch request looks something like this:

 

 

 

 

 

 

POST /api/2.0/batch HTTP/1.1
Host: [COMMUNITY DOMAIN]
Content-Type: application/json
Cache-Control: no-cache
 
[
    {
        "create": {
            "type": "board",
            "entity": {
                "id": "batchRequestForum",
                "conversation_style": "forum",
                "title": "Batch Request Forum",
                "description": "I created this forum using the /batch endpoint",
                "allowed_labels": "predefined-only",
                "parent_category": {
                    "id": "batchRequestTestCategory"
                }
            }
        }
    },
    {
        "create": {
            "type": "message",
            "entity": {
                "board": {
                    "type": "board",
                    "id": "batchRequestForum"
                },
                "subject": "First message",
                "body": "I created this message using the /batch endpoint"
            }
        }
    },
    {
        "read": {
            "type": "board",
            "id": "batchRequestForum",
            "fields": [
                "id",
                "title",
                "description",
                "conversation_style",
                "parent_category",
                "topics"
            ]
        }
    },
    {
        "update": {
            "type": "board",
            "id": "batchRequestForum",
            "entity": {
                "description": "This is my updated forum description. I updated it using the /batch endpoint"
            }
        }
    },
    {
        "read": {
            "type": "board",
            "id": "batchRequestForum",
            "fields": [
                "id",
                "title",
                "description",
                "conversation_style",
                "parent_category",
                "topics"
            ]
        }
    }
]

 

 

 

 

 

 

Studio Endpoint REST calls in Toolbox

The REST Usage tab in Toolbox now includes Studio endpoints. Hover over the name of the endpoint to view the number of requests to the Community REST API.

Note: You cannot click into an endpoint section of the pie graph to drill down to see the individual calls.

 

Functions and lists now supported in the same search query

You can now request both a function (like topics.count(*)) and a list (like topics) in the same query to the /search endpoint. Previously, a query like SELECT topics, topics.count(*) FROM boards WHERE id = 'MyBoard' would only return the count.

You Found It. We Fixed It.

  • We have fixed the issue where attachments could not be previewed before or after publishing a post/article using the Preview function. This display issue has been fixed.
  • Previously, some customers received errors when attempting to view the Members > Value Analytics metrics in Community Analytics. This issue has been fixed, and the metrics display properly.
  • We have fixed the issue where community members on PCs were not seeing the visual indicator for unread messages. This issue has been fixed, and unread messages now display in bold text on PCs.
  • We have fixed the issue where Salesforce records were not getting updated when someone deletes themselves from the community. Now, this profile update is synced properly.
  • Previously, if you tried to copy/paste images from the clipboard to the message editor (a feature that was introduced in the 19.6 release), the image was not pasted into the editor. This issue has been fixed.
  • When members clicked the Send this user a private message button on the user profile page on a community using Private Messages v3, they were taken to the private message page without an open dialogue box to start crafting the message. This navigation issue has been fixed.
  • We have fixed the issue where users with unverified email addresses were not presented with the message to verify their email address after attempting to post a question from the Ask a Question component.
  • Previously, these users saw a blank page without any instructions on how to proceed.
  • Previously, when you created an anchor to a specific part of the page using the Link/Unlink button in the message editor, an extra "http://" was added to the URL rendering the link ineffective. This issue has been fixed.
  • We have fixed the issue where if a message has been previously edited, additional edits made to that same message via API v2 were not applied, despite serving a 200 response. Now, all edits via API v2 are processed correctly.
  • We have fixed issues with the Mobile editor v1/v2, where the cursor would jump to other portions of the page while editing a post. Now, the cursor remains in the appropriate place while editing. This issue is fixed only for android devices.
  • We have fixed the issue where the date/time sorting of featured topics via the API was not sorting properly.
  • Previously, when a Case was escalated from the Case Portal to Salesforce and then the Case was closed in Salesforce, the case status was not updated to Closed in the original Case Portal message. This is now fixed.
  • Previously, if a user tried to reply to a comment beyond the second page on a message that had over two pages of replies, the inline message editor threw an error. This issue has been fixed.
  • The location field is now properly synced between a member’s community account and the corresponding Salesforce record.
  • Previously, if you attempted to unarchive an article from the Content Archive that included a semicolon (;) in the title, an error was thrown and the unarchive failed. This issue has been fixed.
  • You are now able to schedule reports for Page Views in Community Analytics. Additionally, we have fixed other issues with regard to creating and managing scheduled reports and those reports being delivered successfully.
  • Previously, “spoiler” text (message text that is not displayed until the reader clicks the spoiler link) was included in Community subscription emails. This content is no longer included in any Community emails. This fix delivers on this idea submitted to the Khoros Communities idea exchange.
    Augmented our blacklist of FreeMarker unsafe methods to prevent instantiation of arbitrary Java objects.
  • We upgraded to a stronger password-based hashing algorithm.
Updated 7 months ago
Version 5.0

21 Comments