Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
23 changes: 21 additions & 2 deletions API_Reference.md
Original file line number Diff line number Diff line change
Expand Up @@ -37,6 +37,9 @@
- [`libak_RestRouter class`](#restrouter-class)
- [Abstract methods](#abstract-methods)
- [`setRoutes()`](#setroutes)
- [Virtual methods](#virtual-methods)
- [`setRouteToErrorResponseFactoryType()`](#setroutetoerrorresponsefactorytype)
- [`setRouteToLoggerType()`](#setroutetologgertype)
- [Public methods](#public-methods-1)
- [`newRestProcessor(RestRequest request, libak_IErrorResponseFactory errorResponseFactory, libak_IRestLogger restLogger)`](#newrestprocessorrestrequest-request-restframeworkierrorresponsefactory-errorresponsefactory-restframeworkirestlogger-restlogger)
- [Private Methods](#private-methods-1)
Expand Down Expand Up @@ -298,16 +301,32 @@ Sets the routes for the `libak_RestRouter`. Implement this method to define the

- Returns: The current `libak_RestRouter` instance.

### Virtual methods

#### `setRouteToErrorResponseFactoryType()`

Sets the route-specific error response factory types for the `libak_RestRouter`. Override this method to define custom error response factories for specific routes. Implementation should set values for the `routeToErrorResponseFactoryType` property as <route>:<libak_IErrorResponseFactory type> mappings.

- Returns: The current `libak_RestRouter` instance for method chaining.

#### `setRouteToLoggerType()`

Sets the route-specific logger types for the `libak_RestRouter`. Override this method to define custom loggers for specific routes. Implementation should set values for the `routeToLoggerType` property as <route>:<libak_IRestLogger type> mappings.

- Returns: The current `libak_RestRouter` instance for method chaining.

### Public methods

#### `newRestProcessor(RestRequest request, libak_IErrorResponseFactory errorResponseFactory, libak_IRestLogger restLogger)`

Creates a new `libak_RestProcessor` instance for handling the incoming REST request with a custom error response factory and REST logger. This method dynamically selects the appropriate `libak_RestProcessor` based on the requested URI.

If route-specific error response factories or loggers have been defined using `setRouteToErrorResponseFactoryType()` or `setRouteToLoggerType()`, those will be used instead of the default factories or loggers provided as parameters.

- Parameters:
- `request` (RestRequest): The `RestRequest` object representing the incoming HTTP request.
- `errorResponseFactory` (libak_IErrorResponseFactory): The custom error response factory to use for generating error responses.
- `restLogger` (libak_IRestLogger): The custom REST logger to use for logging REST-related information.
- `errorResponseFactory` (libak_IErrorResponseFactory): The default error response factory to use for generating error responses.
- `restLogger` (libak_IRestLogger): The default REST logger to use for logging REST-related information.
- Returns: A new `libak_RestProcessor` instance configured to handle the specified REST request with custom error handling and logging.
- Throws: `libak_RestFramework.InvalidUriException` - If the requested URI does not match any defined routes.

Expand Down
Binary file modified assets/RestFrameworkUML.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
7 changes: 5 additions & 2 deletions force-app/main/default/classes/libak_RestFramework.cls
Original file line number Diff line number Diff line change
Expand Up @@ -57,9 +57,12 @@ public class libak_RestFramework {
errorResponseFactory = (libak_IErrorResponseFactory)errorResponseFactoryType?.newInstance();
restLogger = (libak_IRestLogger)loggerType?.newInstance();
restLogger?.initLog(RestContext.request);
libak_RestRouter router = ((libak_RestRouter)routerType.newInstance()).setRoutes();
libak_RestRouter router = ((libak_RestRouter)routerType.newInstance())
.setRoutes()
.setRouteToErrorResponseFactoryType()
.setRouteToLoggerType();
libak_RestProcessor processor = router
.newRestProcessor(RestContext.request, errorResponseFactory, restLogger);
.newRestProcessor(RestContext.request, errorResponseFactory, restLogger);
response = processor.process();
} catch (Exception exc) {
response = errorResponseFactory.newErrorRestResponse(exc);
Expand Down
39 changes: 37 additions & 2 deletions force-app/main/default/classes/libak_RestRouter.cls
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,8 @@
*/
public abstract class libak_RestRouter {
protected Map<String, Type> routeToRestProcessorType;
protected Map<String, Type> routeToErrorResponseFactoryType;
protected Map<String, Type> routeToLoggerType;

/**
* Sets the routes for the `libak_RestRouter`.
Expand All @@ -14,6 +16,30 @@ public abstract class libak_RestRouter {
* @return The current `libak_RestRouter` instance.
*/
abstract public libak_RestRouter setRoutes();

/**
* Sets the route-specific error response factory types for the `libak_RestRouter`.
* Override this method to define custom error response factories for specific routes.
* Implementation should set values for the `routeToErrorResponseFactoryType` property
* as <route>:<libak_IErrorResponseFactory type> mappings.
*
* @return The current `libak_RestRouter` instance for method chaining.
*/
virtual public libak_RestRouter setRouteToErrorResponseFactoryType() {
return this;
}

/**
* Sets the route-specific logger types for the `libak_RestRouter`.
* Override this method to define custom loggers for specific routes.
* Implementation should set values for the `routeToLoggerType` property
* as <route>:<libak_IRestLogger type> mappings.
*
* @return The current `libak_RestRouter` instance for method chaining.
*/
virtual public libak_RestRouter setRouteToLoggerType() {
return this;
}

/**
* Creates a new `libak_RestProcessor` instance for handling the incoming REST request with a custom error response factory
Expand All @@ -34,8 +60,17 @@ public abstract class libak_RestRouter {
libak_RestProcessor restProcessorItem = (libak_RestProcessor)routeToRestProcessorType.get(route).newInstance();
return restProcessorItem
.useRestRequest(request)
.useErrorResponseFactory(errorResponseFactory)
.useRestLogger(restLogger)
.useErrorResponseFactory(
this.routeToErrorResponseFactoryType?.get(route) == null
? errorResponseFactory
: (libak_IErrorResponseFactory)this.routeToErrorResponseFactoryType.get(route).newInstance()
)
.useRestLogger(
this.routeToLoggerType?.get(route) == null
? restLogger
: (libak_IRestLogger)this.routeToLoggerType.get(route).newInstance()

)
.useUriTemplate(route);
}
}
Expand Down
73 changes: 71 additions & 2 deletions force-app/main/default/classes/tests/libak_TestRestRouter.cls
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,10 @@ public with sharing class libak_TestRestRouter {
RestRequest request = new RestRequest();
request.requestURI = '/testRestRouter/param_1';
RestContext.request = request;
libak_RestRouter router = new RestRouterInstance().setRoutes();
libak_RestRouter router = new RestRouterInstance()
.setRoutes()
.setRouteToErrorResponseFactoryType()
.setRouteToLoggerType();

Test.startTest();

Expand Down Expand Up @@ -40,12 +43,55 @@ public with sharing class libak_TestRestRouter {
);
}

@IsTest
static void testNewRestProcessorWithCustomLoggerAndErrorResponseFactorySetByRouter(){
RestRequest request = new RestRequest();
request.requestURI = '/testRestRouter/param_1';
RestContext.request = request;
libak_RestRouter router = new RestRouterWithCustomLoggerErrorFactoryInstance()
.setRoutes()
.setRouteToErrorResponseFactoryType()
.setRouteToLoggerType();

Test.startTest();

libak_RestProcessor processor = router.newRestProcessor(
request,
null,
null
);

Test.stopTest();

System.assertEquals(
request,
processor.request,
'Wrong "request" property of libak_RestProcessor instance.'
);
System.assertEquals(
URI_TEMPLATE,
processor.uriTemplate,
'Wrong "uriTemplate" property of libak_RestProcessor instance.'
);
System.assert(
processor.errorResponseFactory instanceOf libak_TestErrorResponseFactory,
'Wrong "errorResponseFactory" property of libak_RestProcessor instance.'
);
System.assert(
processor.restLogger instanceOf TestRestLogger,
'Wrong "errorResponseFactory" property of libak_RestProcessor instance.'
);
}

@IsTest
static void testNewRestProcessorInvalidUriException(){
RestRequest request = new RestRequest();
request.requestURI = '/invalidURI';
RestContext.request = request;
libak_RestRouter router = new RestRouterInstance().setRoutes();
libak_RestRouter router = new RestRouterInstance()
.setRoutes()
.setRouteToErrorResponseFactoryType()
.setRouteToLoggerType();

Test.startTest();

Expand Down Expand Up @@ -80,6 +126,29 @@ public with sharing class libak_TestRestRouter {
}
}

private class RestRouterWithCustomLoggerErrorFactoryInstance extends libak_RestRouter {
override public libak_RestRouter setRoutes() {
this.routeToRestProcessorType = new Map<String, Type>{
URI_TEMPLATE => libak_RestProcessor.class
};
return this;
}

override public libak_RestRouter setRouteToErrorResponseFactoryType() {
this.routeToErrorResponseFactoryType = new Map<String, Type>{
URI_TEMPLATE => libak_TestErrorResponseFactory.class
};
return this;
}

override public libak_RestRouter setRouteToLoggerType() {
this.routeToLoggerType = new Map<String, Type>{
URI_TEMPLATE => TestRestLogger.class
};
return this;
}
}


@SuppressWarnings('PMD.EmptyStatementBlock')
private class TestRestLogger implements libak_IRestLogger {
Expand Down