Getting started

The Abuse service, new in Telligent Evolution platform 7.0, replaces the previously used Reporting Forum and offers the ability to capture abuse reporting for all declared content types that support abuse. Content that support reporting abuse include blog posts, forum threads, forum replies, status messages, comments, wiki pages, and media gallery posts.

Using the Widget API, In-Process API and REST API, developers can interact with abuse reports including: flagging content as abusive and getting a list of abuse reports. Using the Widget API, In-Process API and REST API, developers can interact with abuse appeals including: getting an appeal, getting a list of appeals, and accepting or rejecting an appeal. Using the Widget API, In-Process API and REST API, developers can interact with abusive content including: getting an abusive content item and getting a list of abusive content.

The abuse process is a workflow that, simplified, works as follows:

  1. Users flag content as abusive.
  2. When the content's abusive score is high enough (based on the author's abuse creator score and the reporter's abuse reporter scores), the content will be identified as possibly abusive and removed from the site. An email is sent to the author notifying them that the content was hidden and asking them if they would like to appeal.
  3. If the author decides to appeal, they come back to the site and fill out a form with details about why they feel the content is not abusive. An email is sent to the review board to notify them that the author appealed.
  4. Any member of the abuse review board for the content (those having Manage Abuse permission - basically site administrators, site moderators, group owners, and group managers) can either accept the appeal, reinstating the content, or reject the appeal, confirming it is abusive. 
  5. Content that is confirmed abusive will be permanently deleted.
  6. If the author does not appeal in a timely manner (5 days by default) then the content will be assumed to be abusive and permanently deleted. 
  7. Before content is permanently deleted, it will be archived in te_Content_AbuseExpungedData table in the database for later offline review.

Custom content types can support abuse by by implementing the IAbuseCheckingContentType interface:

List<int> GetReviewBoardUsers(Guid contentId);
bool CanUserReviewAppeals(Guid contentId, int userId);
void ContentSuspectedAbusive(Guid abuseId, Guid contentId);
void ContentFoundNotAbusive(Guid abuseId, Guid contentId);
void ContentConfirmedAbusive(Guid abuseId, Guid contentId);
IContent GetHiddenContent(Guid contentId);

How To

Create an abuse report

Creating an abuse report is supported by widget extensions, the in-process API and the REST API using similar methods: creating a report and passing in the ContentId and ContentTypeId and other optional parameters. The ContentId and ContentTypeId are both GUIDs and are used to uniquely identify the content being flagged as abusive and the type of content it is.

Widget API: $core_v2_abuseReport.Create($contentId, $contentTypeId)

In-Process API: PublicApi.Abuse.AbuseReports.Create(contentId, contentTypeId);

REST API: POST to ~/api.ashx/v2/abusereports.xml (or .json) with values for ContentId and ContentTypeId

Get an abuse report

Getting an abuse report is supported by widget extensions, the in-process API and the REST API using similar methods: calling the Get/SHOW method and passing in the Guid Id of the abuse report.

Widget API$core_v2_abuseReport.Get($abuseReportId)

In-Process APIPublicApi.Abuse.AbuseReports.Get(abuseReportId);

REST API: GET to ~/api.ashx/v2/abusereports/{abuseReportId}.xml (or .json) 

List abuse reports

Getting a list of abuse reports is supported by widget extensions, the in-process API and the REST API using similar methods: calling the List method and passing in various optional parameters like AuthorUserId, ReportingUserId, AppealState, AppealId, etc.

Widget API$core_v2_abuseReport.List($queryOptions)

In-Process APIPublicApi.Abuse.AbuseReports.List(new AbuseReportListOptions() { ... } );

REST API: GET to ~/api.ashx/v2/abusereports.xml (or .json) with values for optional parameters

Get an abuse appeal

Getting an abuse appeal is supported by widget extensions, the in-process API and the REST API using similar methods: calling a Get method and passing in a Guid appeal Id.

Widget API$core_v2_abuseAppeal.Get($appealId)

In-Process APIPublicApi.Abuse.AbuseAppeals.Get(appealId);

REST API: GET to ~/api.ashx/v2/abuseappeals/{appealId}.xml (or .json)

List abuse appeals

Listing abuse appeals is supported by widget extensions, the in-process API and the REST API using similar methods: calling a List method and passing in various query options including AppealState, ContentId, ApplicationId, ContainerId, etc.

Widget API$core_v2_abuseReport.List($queryOptions)

In-Process APIPublicApi.Abuse.AbuseReports.List(new AbuseAppealListOptions() { ... });

REST API: GET to ~/api.ashx/v2/abuseappeals.xml (or .json) with values for optional parameters

Get abusive content

Getting an abusive content record is supported by widget extensions and the in-process API using similar methods: calling the Get/SHOW method and passing in the ContentId and ContentTypeId parameters. The ContentId and ContentTypeId are both GUIDs and are used to uniquely identify the content being flagged as abusive and the type of content it is.

Widget API$core_v2_abusiveContent.Get($contentId, $contentTypeId)

In-Process APIPublicApi.Abuse.AbusiveContent.Get(contentId, contentTypeId);

List abusive content

Listing abusive content records is supported by widget extensions, the in-process API and the REST API using similar methods: calling a List method and passing in various optional query parameters.

Widget API$core_v2_abusiveContent.List($queryOptions)

In-Process APIPublicApi.Abuse.AbusiveContent.List(new AbusiveContentListOptions() { ... });

REST API: GET to ~/api.ashx/v2/abusivecontent.xml (or .json) with values for optional parameters

Examples and demonstrations

Below is a sample implementation of IAbuseCheckingContentType for a custom content type.

public List<int> GetReviewBoardUsers(Guid contentId)
{
return MyCustomCode.GetReviewBoardUsers(contentId);
}
public bool CanUserReviewAppeals(Guid contentId, int userId)
{
return MyCustomCode.CanUserReviewAppeals(contentId, userId);
}
public void ContentSuspectedAbusive(Guid abuseId, Guid contentId)
{
// use default implementation that hides content
PublicApi.Abuse.ContentSuspectedAbusive(contentId);
}
public void ContentFoundNotAbusive(Guid abuseId, Guid contentId)
{
// use default implementation that un-hides the content
PublicApi.Abuse.ContentFoundNotAbusive(contentId);
}
public void ContentConfirmedAbusive(Guid abuseId, Guid contentId)
{
var content = GetHiddenContent(contentId) as BlogPost;
if (content == null)
return;
// use default archive
PublicApi.Abuse.AbusiveContent.ArchiveExpungedData(
abuseId,
content.ContentTypeId,
content.Application.ApplicationId,
content.Application.Container.ContainerId,
content.CreatedByUserId.HasValue ? content.CreatedByUserId.Value : 0,
content.CreatedDate,
content.HtmlName("raw"),
content.HtmlDescription("raw"),
content.Url,
string.Empty);
MyCustomCode.DeletePost(content.Id);
}
public IContent GetHiddenContent(Guid contentId)
{
return (IContent)MyCustomCode.GetHiddenPost(contentId);
}