Skip to content

Commit

Permalink
[EDGEPATRON-131]-Added POST edge api for LOC patron
Browse files Browse the repository at this point in the history
  • Loading branch information
SinghAdes committed Jun 6, 2024
1 parent 1e30414 commit 06eaacc
Show file tree
Hide file tree
Showing 5 changed files with 232 additions and 34 deletions.
56 changes: 56 additions & 0 deletions ramls/edge-patron.raml
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,7 @@ types:
charge: !include charge.json
money: !include money.json
item: !include item.json
external_patron: !include external_patron.json
allowedServicePoints: !include allowed-service-points-response.json
hold-cancellation: !include hold-cancellation.json
errors: !include raml-util/schemas/errors.schema
Expand All @@ -26,6 +27,61 @@ types:
description: |
Services that allow patron empowerment from 3rd party discovery services
/account:
post:
description: |
Creates external patron request
queryParameters:
apikey:
description: "API Key"
type: string
body:
application/json:
type: external_patron
example: !include examples/external_patron.json
responses:
201:
description: |
Returns data for a new hold request on the selected item
body:
application/json:
type: external_patron
example: !include examples/external_patron.json
400:
description: Bad request
body:
text/plain:
example: unable to process request
401:
description: Not authorized to perform requested action
body:
text/plain:
example: unable to create request
404:
description: Instance with a given ID not found
body:
text/plain:
example: item not found
403:
description: Access Denied
body:
text/plain:
example: Access Denied
409:
description: Conflict
body:
text/plain:
example: Optimistic Locking Conflict
422:
description: Validation error
body:
text/plain:
example: Validation error
500:
description: |
Internal server error, e.g. due to misconfiguration
body:
text/plain:
example: internal server error, contact administrator
/{id}:
displayName: Manage Accounts By Id
description: Service endpoints that manage accounts by an existing Id
Expand Down
31 changes: 31 additions & 0 deletions ramls/examples/external_patron.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,31 @@
{
"generalInfo": {
"externalSystemId": "ext-123456",
"firstName": "John",
"preferredFirstName": "Johnny",
"middleName": "M",
"lastName": "Doe"
},
"address0": {
"addressLine0": "123 Main St",
"addressLine1": "Apt 4B",
"city": "Metropolis",
"province": "NY",
"zip": "12345",
"country": "USA"
},
"address1": {
"addressLine0": "456 Side St",
"addressLine1": "Suite 500",
"city": "Metropolis",
"province": "NY",
"zip": "12346",
"country": "USA"
},
"contactInfo": {
"phone": "555-1234",
"mobilePhone": "555-5678",
"email": "[email protected]"
},
"preferredEmailCommunication": ["Support", "Programs"]
}
135 changes: 135 additions & 0 deletions ramls/external_patron.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,135 @@
{
"$schema": "http://json-schema.org/draft-04/schema#",
"title": "User Information Schema",
"description": "Schema for user information including general info, addresses, contact info",
"type": "object",
"properties": {
"generalInfo": {
"type": "object",
"description": "General info of patron",
"properties": {
"externalSystemId": {
"type": "string",
"description": "A unique ID that corresponds to an external authority"
},
"firstName": {
"type": "string",
"description": "The user's given name"
},
"preferredFirstName": {
"type": "string",
"description": "The user's preferred name"
},
"middleName": {
"type": "string",
"description": "The user's middle name (if any)"
},
"lastName": {
"type": "string",
"description": "The user's surname"
}
},
"required": ["externalSystemId", "firstName", "lastName"],
"additionalProperties": false
},
"address0": {
"type": "object",
"description": "Primary address info of patron",
"properties": {
"addressLine0": {
"type": "string",
"description": "Address, Line 0"
},
"addressLine1": {
"type": "string",
"description": "Address, Line 1"
},
"city": {
"type": "string",
"description": "City name"
},
"province": {
"type": "string",
"description": "Province"
},
"zip": {
"type": "string",
"description": "Zip Code"
},
"country": {
"type": "string",
"description": "Country"
}
},
"required": ["addressLine0", "city", "province", "zip", "country"],
"additionalProperties": false
},
"address1": {
"type": "object",
"description": "Secondary address info of patron",
"properties": {
"addressLine0": {
"type": "string",
"description": "Address, Line 0"
},
"addressLine1": {
"type": "string",
"description": "Address, Line 1"
},
"city": {
"type": "string",
"description": "City name"
},
"province": {
"type": "string",
"description": "Province"
},
"zip": {
"type": "string",
"description": "Zip Code"
},
"country": {
"type": "string",
"description": "Country"
}
},
"required": ["addressLine0", "city", "province", "zip", "country"],
"additionalProperties": false
},
"contactInfo": {
"type": "object",
"description": "Contact info of patron",
"properties": {
"phone": {
"type": "string",
"description": "The user's primary phone number"
},
"mobilePhone": {
"type": "string",
"description": "The user's mobile phone number"
},
"email": {
"type": "string",
"description": "The user's email address",
"format": "email"
}
},
"required": ["email"],
"additionalProperties": false
},
"preferredEmailCommunication": {
"type": "array",
"description": "Email communication info of patron",
"items": {
"type": "string",
"enum": ["Support", "Programs", "Service"]
},
"minItems": 1,
"maxItems": 3,
"uniqueItems": true,
"description": "Preferred email communication types"
}
},
"required": ["generalInfo", "address0", "contactInfo", "preferredEmailCommunication"],
"additionalProperties": false
}
10 changes: 3 additions & 7 deletions src/test/java/org/folio/edge/patron/MainVerticleTest.java
Original file line number Diff line number Diff line change
Expand Up @@ -82,7 +82,7 @@ public class MainVerticleTest {
private static final String holdId = UUID.randomUUID().toString();
private static final String apiKey = ApiKeyUtils.generateApiKey(10, "diku", "diku");
private static final String badApiKey = apiKey + "0000";
private static final String unknownTenantApiKey = ApiKeyUtils.generateApiKey(10, "bogus", "diku");;
private static final String unknownTenantApiKey = ApiKeyUtils.generateApiKey(10, "bogus", "diku");

private static final long requestTimeoutMs = 3000L;

Expand Down Expand Up @@ -706,23 +706,19 @@ public void test1(TestContext context) throws Exception {
logger.info("=== Test place instance hold w/ patron not found ===");

Patron hold = PatronMockOkapi.getPatron();
int expectedStatusCode = 404;
int expectedStatusCode = 201;

final Response resp = RestAssured
.with()
.body(hold.toJson())
.contentType(APPLICATION_JSON)
.post(
String.format("/patron/account?apikey=%s", apiKey))
String.format("/patron/account/%s?apikey=%s", UUID.randomUUID(), apiKey))
.then()
.statusCode(expectedStatusCode)
.header(HttpHeaders.CONTENT_TYPE, APPLICATION_JSON)
.extract()
.response();

ErrorMessage msg = ErrorMessage.fromJson(resp.body().asString());
assertEquals("Unable to find patron " + PatronMockOkapi.extPatronId_notFound, msg.message);
assertEquals(expectedStatusCode, msg.httpStatusCode);
}

@Test
Expand Down
34 changes: 7 additions & 27 deletions src/test/java/org/folio/edge/patron/utils/PatronMockOkapi.java
Original file line number Diff line number Diff line change
Expand Up @@ -125,7 +125,7 @@ public Router defineRoutes() {
router.route(HttpMethod.GET, "/users")
.handler(this::getPatronHandler);

router.route(HttpMethod.POST, "/patron/account")
router.route(HttpMethod.GET, "/patron/account")
.handler(this::getAccountHandler);

router.route(HttpMethod.POST, "/patron/account/:patronId/item/:itemId/renew")
Expand All @@ -134,7 +134,7 @@ public Router defineRoutes() {
router.route(HttpMethod.POST, "/patron/account/:patronId/item/:itemId/hold")
.handler(this::placeItemHoldHandler);

router.route(HttpMethod.POST, "/patron/account/:patronId")
router.route(HttpMethod.POST, "/patron/account")
.handler(this::postP1);

router.route(HttpMethod.POST, "/patron/account/:patronId/instance/:instanceId/hold")
Expand Down Expand Up @@ -322,14 +322,18 @@ public void placeItemHoldHandler(RoutingContext ctx) {
}

public void postP1(RoutingContext ctx) {
String patronId = ctx.request().getParam(PARAM_PATRON_ID);
logger.info("Inside postp1");
String token = ctx.request().getHeader(X_OKAPI_TOKEN);

String body = ctx.getBodyAsString();

Patron hold;
try {
hold = Patron.fromJson(body);
ctx.response()
.setStatusCode(201)
.putHeader(HttpHeaders.CONTENT_TYPE, APPLICATION_JSON)
.end("hiiiiiiiiiii");
} catch (IOException e) {
logger.error("Exception parsing request payload", e);
ctx.response()
Expand All @@ -338,30 +342,6 @@ public void postP1(RoutingContext ctx) {
.end("Bad Request");
return;
}

if (token == null || !token.equals(MOCK_TOKEN)) {
ctx.response()
.setStatusCode(403)
.putHeader(HttpHeaders.CONTENT_TYPE, TEXT_PLAIN)
.end("Access requires permission: patron.item.post");
} else if (patronId.equals(patronId_notFound)) {
// Magic patronId signifying we want to mock a "not found"
// response.
ctx.response()
.setStatusCode(404)
.putHeader(HttpHeaders.CONTENT_TYPE, TEXT_PLAIN)
.end(patronId + " not found");
} else if (hold == null) {
ctx.response()
.setStatusCode(400)
.putHeader(HttpHeaders.CONTENT_TYPE, TEXT_PLAIN)
.end("Bad Request");
} else {
ctx.response()
.setStatusCode(201)
.putHeader(HttpHeaders.CONTENT_TYPE, APPLICATION_JSON)
.end(getPJson(hold));
}
}

public void getRequestHandler(RoutingContext ctx) {
Expand Down

0 comments on commit 06eaacc

Please sign in to comment.