Skip to content

Commit c1c3672

Browse files
committed
feature/Introduce-route-specific-error-responses-and-loggers
1 parent d7a8dde commit c1c3672

File tree

5 files changed

+134
-8
lines changed

5 files changed

+134
-8
lines changed

API_Reference.md

Lines changed: 21 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,9 @@
3737
- [`libak_RestRouter class`](#restrouter-class)
3838
- [Abstract methods](#abstract-methods)
3939
- [`setRoutes()`](#setroutes)
40+
- [Virtual methods](#virtual-methods)
41+
- [`setRouteToErrorResponseFactoryType()`](#setroutetoerrorresponsefactorytype)
42+
- [`setRouteToLoggerType()`](#setroutetologgertype)
4043
- [Public methods](#public-methods-1)
4144
- [`newRestProcessor(RestRequest request, libak_IErrorResponseFactory errorResponseFactory, libak_IRestLogger restLogger)`](#newrestprocessorrestrequest-request-restframeworkierrorresponsefactory-errorresponsefactory-restframeworkirestlogger-restlogger)
4245
- [Private Methods](#private-methods-1)
@@ -298,16 +301,32 @@ Sets the routes for the `libak_RestRouter`. Implement this method to define the
298301

299302
- Returns: The current `libak_RestRouter` instance.
300303

304+
### Virtual methods
305+
306+
#### `setRouteToErrorResponseFactoryType()`
307+
308+
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.
309+
310+
- Returns: The current `libak_RestRouter` instance for method chaining.
311+
312+
#### `setRouteToLoggerType()`
313+
314+
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.
315+
316+
- Returns: The current `libak_RestRouter` instance for method chaining.
317+
301318
### Public methods
302319

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

305322
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.
306323

324+
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.
325+
307326
- Parameters:
308327
- `request` (RestRequest): The `RestRequest` object representing the incoming HTTP request.
309-
- `errorResponseFactory` (libak_IErrorResponseFactory): The custom error response factory to use for generating error responses.
310-
- `restLogger` (libak_IRestLogger): The custom REST logger to use for logging REST-related information.
328+
- `errorResponseFactory` (libak_IErrorResponseFactory): The default error response factory to use for generating error responses.
329+
- `restLogger` (libak_IRestLogger): The default REST logger to use for logging REST-related information.
311330
- Returns: A new `libak_RestProcessor` instance configured to handle the specified REST request with custom error handling and logging.
312331
- Throws: `libak_RestFramework.InvalidUriException` - If the requested URI does not match any defined routes.
313332

assets/RestFrameworkUML.png

108 KB
Loading

force-app/main/default/classes/libak_RestFramework.cls

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -57,9 +57,12 @@ public class libak_RestFramework {
5757
errorResponseFactory = (libak_IErrorResponseFactory)errorResponseFactoryType?.newInstance();
5858
restLogger = (libak_IRestLogger)loggerType?.newInstance();
5959
restLogger?.initLog(RestContext.request);
60-
libak_RestRouter router = ((libak_RestRouter)routerType.newInstance()).setRoutes();
60+
libak_RestRouter router = ((libak_RestRouter)routerType.newInstance())
61+
.setRoutes()
62+
.setRouteToErrorResponseFactoryType()
63+
.setRouteToLoggerType();
6164
libak_RestProcessor processor = router
62-
.newRestProcessor(RestContext.request, errorResponseFactory, restLogger);
65+
.newRestProcessor(RestContext.request, errorResponseFactory, restLogger);
6366
response = processor.process();
6467
} catch (Exception exc) {
6568
response = errorResponseFactory.newErrorRestResponse(exc);

force-app/main/default/classes/libak_RestRouter.cls

Lines changed: 37 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,8 @@
55
*/
66
public abstract class libak_RestRouter {
77
protected Map<String, Type> routeToRestProcessorType;
8+
protected Map<String, Type> routeToErrorResponseFactoryType;
9+
protected Map<String, Type> routeToLoggerType;
810

911
/**
1012
* Sets the routes for the `libak_RestRouter`.
@@ -14,6 +16,30 @@ public abstract class libak_RestRouter {
1416
* @return The current `libak_RestRouter` instance.
1517
*/
1618
abstract public libak_RestRouter setRoutes();
19+
20+
/**
21+
* Sets the route-specific error response factory types for the `libak_RestRouter`.
22+
* Override this method to define custom error response factories for specific routes.
23+
* Implementation should set values for the `routeToErrorResponseFactoryType` property
24+
* as <route>:<libak_IErrorResponseFactory type> mappings.
25+
*
26+
* @return The current `libak_RestRouter` instance for method chaining.
27+
*/
28+
virtual public libak_RestRouter setRouteToErrorResponseFactoryType() {
29+
return this;
30+
}
31+
32+
/**
33+
* Sets the route-specific logger types for the `libak_RestRouter`.
34+
* Override this method to define custom loggers for specific routes.
35+
* Implementation should set values for the `routeToLoggerType` property
36+
* as <route>:<libak_IRestLogger type> mappings.
37+
*
38+
* @return The current `libak_RestRouter` instance for method chaining.
39+
*/
40+
virtual public libak_RestRouter setRouteToLoggerType() {
41+
return this;
42+
}
1743

1844
/**
1945
* Creates a new `libak_RestProcessor` instance for handling the incoming REST request with a custom error response factory
@@ -34,8 +60,17 @@ public abstract class libak_RestRouter {
3460
libak_RestProcessor restProcessorItem = (libak_RestProcessor)routeToRestProcessorType.get(route).newInstance();
3561
return restProcessorItem
3662
.useRestRequest(request)
37-
.useErrorResponseFactory(errorResponseFactory)
38-
.useRestLogger(restLogger)
63+
.useErrorResponseFactory(
64+
this.routeToErrorResponseFactoryType?.get(route) == null
65+
? errorResponseFactory
66+
: (libak_IErrorResponseFactory)this.routeToErrorResponseFactoryType.get(route).newInstance()
67+
)
68+
.useRestLogger(
69+
this.routeToLoggerType?.get(route) == null
70+
? restLogger
71+
: (libak_IRestLogger)this.routeToLoggerType.get(route).newInstance()
72+
73+
)
3974
.useUriTemplate(route);
4075
}
4176
}

force-app/main/default/classes/tests/libak_TestRestRouter.cls

Lines changed: 71 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,10 @@ public with sharing class libak_TestRestRouter {
88
RestRequest request = new RestRequest();
99
request.requestURI = '/testRestRouter/param_1';
1010
RestContext.request = request;
11-
libak_RestRouter router = new RestRouterInstance().setRoutes();
11+
libak_RestRouter router = new RestRouterInstance()
12+
.setRoutes()
13+
.setRouteToErrorResponseFactoryType()
14+
.setRouteToLoggerType();
1215

1316
Test.startTest();
1417

@@ -40,12 +43,55 @@ public with sharing class libak_TestRestRouter {
4043
);
4144
}
4245

46+
@IsTest
47+
static void testNewRestProcessorWithCustomLoggerAndErrorResponseFactorySetByRouter(){
48+
RestRequest request = new RestRequest();
49+
request.requestURI = '/testRestRouter/param_1';
50+
RestContext.request = request;
51+
libak_RestRouter router = new RestRouterWithCustomLoggerErrorFactoryInstance()
52+
.setRoutes()
53+
.setRouteToErrorResponseFactoryType()
54+
.setRouteToLoggerType();
55+
56+
Test.startTest();
57+
58+
libak_RestProcessor processor = router.newRestProcessor(
59+
request,
60+
null,
61+
null
62+
);
63+
64+
Test.stopTest();
65+
66+
System.assertEquals(
67+
request,
68+
processor.request,
69+
'Wrong "request" property of libak_RestProcessor instance.'
70+
);
71+
System.assertEquals(
72+
URI_TEMPLATE,
73+
processor.uriTemplate,
74+
'Wrong "uriTemplate" property of libak_RestProcessor instance.'
75+
);
76+
System.assert(
77+
processor.errorResponseFactory instanceOf libak_TestErrorResponseFactory,
78+
'Wrong "errorResponseFactory" property of libak_RestProcessor instance.'
79+
);
80+
System.assert(
81+
processor.restLogger instanceOf TestRestLogger,
82+
'Wrong "errorResponseFactory" property of libak_RestProcessor instance.'
83+
);
84+
}
85+
4386
@IsTest
4487
static void testNewRestProcessorInvalidUriException(){
4588
RestRequest request = new RestRequest();
4689
request.requestURI = '/invalidURI';
4790
RestContext.request = request;
48-
libak_RestRouter router = new RestRouterInstance().setRoutes();
91+
libak_RestRouter router = new RestRouterInstance()
92+
.setRoutes()
93+
.setRouteToErrorResponseFactoryType()
94+
.setRouteToLoggerType();
4995

5096
Test.startTest();
5197

@@ -80,6 +126,29 @@ public with sharing class libak_TestRestRouter {
80126
}
81127
}
82128

129+
private class RestRouterWithCustomLoggerErrorFactoryInstance extends libak_RestRouter {
130+
override public libak_RestRouter setRoutes() {
131+
this.routeToRestProcessorType = new Map<String, Type>{
132+
URI_TEMPLATE => libak_RestProcessor.class
133+
};
134+
return this;
135+
}
136+
137+
override public libak_RestRouter setRouteToErrorResponseFactoryType() {
138+
this.routeToErrorResponseFactoryType = new Map<String, Type>{
139+
URI_TEMPLATE => libak_TestErrorResponseFactory.class
140+
};
141+
return this;
142+
}
143+
144+
override public libak_RestRouter setRouteToLoggerType() {
145+
this.routeToLoggerType = new Map<String, Type>{
146+
URI_TEMPLATE => TestRestLogger.class
147+
};
148+
return this;
149+
}
150+
}
151+
83152

84153
@SuppressWarnings('PMD.EmptyStatementBlock')
85154
private class TestRestLogger implements libak_IRestLogger {

0 commit comments

Comments
 (0)