Files
fflib-apex-extensions/sfdx-source/apex-extensions/main/default/classes/http/fflib_HttpException.cls
T
2023-08-01 12:19:18 +01:00

138 lines
3.1 KiB
OpenEdge ABL

global virtual class fflib_HttpException extends Exception
{
protected fflib_HttpProblem problems;
global fflib_HttpException(Integer statusCode)
{
this(statusCode, fflib_HttpStatusCode.getTitle(statusCode));
}
global fflib_HttpException(Integer statusCode, String title)
{
this(statusCode, title, null);
}
global fflib_HttpException(Integer statusCode, String title, String detail)
{
this.problems =
new fflib_HttpProblem()
.setStatus(statusCode)
.setTitle(title)
.setDetail(detail);
addMessage(
String.valueOf(statusCode)
+ (String.isNotBlank(title) ? + ' - ' + title : '')
+ (String.isNotBlank(detail) ? ', ' + detail : '')
);
}
global fflib_HttpException addProblem(Integer statusCode)
{
return this.addProblem(statusCode, fflib_HttpStatusCode.getTitle(statusCode));
}
global fflib_HttpException addProblem(Integer statusCode, String title)
{
return this.addProblem(statusCode, title, null);
}
global fflib_HttpException addProblem(Integer statusCode, String title, String detail)
{
this.problems.addNextProblem()
.setStatus(statusCode)
.setTitle(title)
.setDetail(detail);
addMessage(
String.valueOf(statusCode)
+ (String.isNotBlank(title) ? + ' - ' + title : '')
+ (String.isNotBlank(detail) ? ': ' + detail : '')
);
return this;
}
global List<fflib_HttpProblemDetail> getProblemDetails()
{
return this.problems.getProblemDetails();
}
global String getUuid()
{
return this.problems.getUuid();
}
/**
* Set a URI reference that identifies the specific occurrence of the problem.
*
* @param instance URI reference to the problem location
*
* @return Instance of itself to allow for chaining
*/
global fflib_HttpException setInstance(String instance)
{
this.problems.setInstance(instance);
return this;
}
/**
* Sets the URI reference [RFC3986] that identifies the problem type.
* This specification encourages that, when dereferenced,
* it provide human-readable documentation for the problem type
* (e.g., using HTML [W3C.REC-html5-20141028]).
* When this member is not present, its value is assumed to be "about:blank".
*
* @param type URI to human-readable documentation of the occurred problem
*
* @return Instance of itself to allow for chaining
*/
global fflib_HttpException setType(String type)
{
this.problems.setType(type);
return this;
}
/**
* @return Returns a RFC-7807 Json object
*/
global String toJson()
{
return JSON.serialize(this.problems);
}
global String toPrettyJson()
{
return JSON.serializePretty(this.problems);
}
global Blob toJsonBlob()
{
return Blob.valueOf(toJson());
}
global void addToRestResponse()
{
RestResponse response = RestContext.response;
if (response == null)
{
response = new RestResponse();
RestContext.response = response;
}
response.statusCode = this.problems.getProblemDetails().get(0)?.status;
response.responseBody = this.toJsonBlob();
}
protected void addMessage(String message)
{
if (this.problems.getProblemDetails().size() > 1)
{
setMessage(getMessage() + ', ' + message);
}
else
{
setMessage(message);
}
}
}