Skip to content
This repository was archived by the owner on Jan 23, 2025. It is now read-only.

Commit b57b46f

Browse files
authored
implement endpoint for populate challenge synchronzied (#70)
1 parent 836d0a1 commit b57b46f

5 files changed

+174
-26
lines changed
Lines changed: 99 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,99 @@
1+
{
2+
"variables": [],
3+
"info": {
4+
"name": "Implement Endpoint To Populate Elasticsearch For The Given Challenges",
5+
"_postman_id": "7db581cc-9635-e7b3-b3ba-8f3e52254c1b",
6+
"description": "",
7+
"schema": "https://schema.getpostman.com/json/collection/v2.0.0/collection.json"
8+
},
9+
"item": [
10+
{
11+
"name": "View challenge details via ElasticSearch",
12+
"request": {
13+
"url": "http://cockpit.cloud.topcoder.com:9200/challengesdetail/challenges/30005532",
14+
"method": "GET",
15+
"header": [],
16+
"body": {
17+
"mode": "raw",
18+
"raw": ""
19+
},
20+
"description": ""
21+
},
22+
"response": [
23+
{
24+
"id": "5ea84ed3-bbac-42f2-b15f-e9c6e4e8fda9",
25+
"name": "View challenge details via ElasticSearch",
26+
"originalRequest": {
27+
"url": "http://cockpit.cloud.topcoder.com:9200/challengesdetail/challenges/30005532",
28+
"method": "GET",
29+
"header": [],
30+
"body": {
31+
"mode": "raw",
32+
"raw": ""
33+
}
34+
},
35+
"status": "OK",
36+
"code": 200,
37+
"_postman_previewlanguage": "json",
38+
"_postman_previewtype": "text",
39+
"header": [
40+
{
41+
"name": "content-length",
42+
"key": "content-length",
43+
"value": "1296",
44+
"description": "The length of the response body in octets (8-bit bytes)"
45+
},
46+
{
47+
"name": "content-type",
48+
"key": "content-type",
49+
"value": "application/json; charset=UTF-8",
50+
"description": "The mime type of this content"
51+
}
52+
],
53+
"cookie": [],
54+
"responseTime": 50,
55+
"body": "{\"_index\":\"challengesdetail\",\"_type\":\"challenges\",\"_id\":\"30005532\",\"_version\":6,\"found\":true,\"_source\":{\"track\":\"DEVELOP\",\"subTrack\":\"ARCHITECTURE\",\"detailRequirements\":\"test\",\"finalSubmissionGuidelines\":\"test\",\"terms\":[{\"termsOfUseId\":21193,\"role\":\"Submitter\",\"agreeabilityType\":\"Electronically-agreeable\",\"title\":\"Standard Terms for TopCoder Competitions v2.0\"},{\"termsOfUseId\":20704,\"role\":\"Primary Screener\",\"agreeabilityType\":\"Electronically-agreeable\",\"title\":\"Reviewer terms of use text 20704\"},{\"termsOfUseId\":20704,\"role\":\"Reviewer\",\"agreeabilityType\":\"Electronically-agreeable\",\"title\":\"Reviewer terms of use text 20704\"},{\"termsOfUseId\":20704,\"role\":\"Aggregator\",\"agreeabilityType\":\"Electronically-agreeable\",\"title\":\"Reviewer terms of use text 20704\"},{\"termsOfUseId\":20704,\"role\":\"Final Reviewer\",\"agreeabilityType\":\"Electronically-agreeable\",\"title\":\"Reviewer terms of use text 20704\"},{\"termsOfUseId\":20794,\"role\":\"Manager\",\"agreeabilityType\":\"Non-agreeable\",\"title\":\"Approved OR Managers - TopCoder Technical Team\"},{\"termsOfUseId\":20893,\"role\":\"Copilot\",\"agreeabilityType\":\"Non-electronically-agreeable\",\"title\":\"MSA\"},{\"termsOfUseId\":20704,\"role\":\"Specification Reviewer\",\"agreeabilityType\":\"Electronically-agreeable\",\"title\":\"Reviewer terms of use text 20704\"}],\"id\":30005532}}"
56+
}
57+
]
58+
},
59+
{
60+
"name": "View challenge listing via ElasticSearch",
61+
"request": {
62+
"url": "http://cockpit.cloud.topcoder.com:9200/challengeslisting/challenges/30005532",
63+
"method": "GET",
64+
"header": [],
65+
"body": {
66+
"mode": "raw",
67+
"raw": ""
68+
},
69+
"description": ""
70+
},
71+
"response": []
72+
},
73+
{
74+
"name": "Push challenges",
75+
"request": {
76+
"url": "http://localhost:8083/v3/esfeeder/challenges",
77+
"method": "PUT",
78+
"header": [
79+
{
80+
"key": "Content-Type",
81+
"value": "application/json",
82+
"description": ""
83+
},
84+
{
85+
"key": "Authorization",
86+
"value": "Bearer eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJyb2xlcyI6WyJhZG1pbmlzdHJhdG9yIl0sImlzcyI6Imh0dHBzOi8vYXBpLnRvcGNvZGVyLWRldi5jb20iLCJoYW5kbGUiOiJoZWZmYW4iLCJleHAiOjE3NjYyODkyNDYsInVzZXJJZCI6IjEzMjQ1NiIsImlhdCI6MTQ1MDkyOTI0NiwiZW1haWwiOm51bGwsImp0aSI6IjEzNjljNjAwLWUwYTEtNDUyNS1hN2M3LTU2YmU3ZDgxM2Y1MSJ9.hp5peSoj-fh3KFkskvBpfUFIcJNtsv4zIMFV-D8F3JA",
87+
"description": ""
88+
}
89+
],
90+
"body": {
91+
"mode": "raw",
92+
"raw": "{\r\n \"param\": {\r\n \"index\": \"challenges\",\r\n \"type\": \"challenges\",\r\n \"challengeIds\": [30005532]\r\n }\r\n}"
93+
},
94+
"description": ""
95+
},
96+
"response": []
97+
}
98+
]
99+
}

src/main/java/com/appirio/service/challengefeeder/ChallengeFeederServiceApplication.java

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -75,8 +75,13 @@
7575
* Version 1.8 - Topcoder Elasticsearch Feeder Service - Jobs Cleanup And Improvement v1.0
7676
* - remove the useless resources, jobs and logging of configuration values
7777
* </p>
78+
*
79+
* <p>
80+
* Version 1.9 - Implement Endpoint To Populate Elasticsearch For The Given Challenges
81+
* - Changes the challenge resource object creation logic/
82+
* </p>
7883
* @author TCSCODER
79-
* @version 1.8
84+
* @version 1.9
8085
*/
8186
public class ChallengeFeederServiceApplication extends BaseApplication<ChallengeFeederServiceConfiguration> {
8287
/**
@@ -183,7 +188,7 @@ protected void registerResources(ChallengeFeederServiceConfiguration config, Env
183188

184189
// Register resources here
185190
env.jersey().register(new HealthCheckResource());
186-
env.jersey().register(new ChallengeFeederFactory(jestClient).getResourceInstance());
191+
env.jersey().register(new ChallengeFeederFactory(jestClient,config).getResourceInstance());
187192
env.jersey().register(new MmFeederResourceFactory(jestClient).getResourceInstance());
188193
env.jersey().register(new MarathonMatchFeederFactory(jestClient).getResourceInstance());
189194
env.jersey().register(new SRMFeederFactory(jestClient).getResourceInstance());

src/main/java/com/appirio/service/challengefeeder/resources/ChallengeFeederResource.java

Lines changed: 45 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -3,34 +3,43 @@
33
*/
44
package com.appirio.service.challengefeeder.resources;
55

6-
import com.appirio.service.challengefeeder.dto.ChallengeFeederParam;
7-
import com.appirio.service.supply.resources.MetadataApiResponseFactory;
8-
import com.appirio.supply.ErrorHandler;
9-
import com.appirio.tech.core.api.v3.request.PostPutRequest;
10-
import com.appirio.tech.core.api.v3.request.annotation.AllowAnonymous;
11-
import com.appirio.tech.core.api.v3.response.ApiResponse;
12-
import com.codahale.metrics.annotation.Timed;
13-
14-
import org.slf4j.Logger;
15-
import org.slf4j.LoggerFactory;
6+
import java.util.Arrays;
167

8+
import javax.servlet.http.HttpServletResponse;
179
import javax.validation.Valid;
1810
import javax.ws.rs.Consumes;
1911
import javax.ws.rs.PUT;
2012
import javax.ws.rs.Path;
2113
import javax.ws.rs.Produces;
2214
import javax.ws.rs.core.MediaType;
2315

16+
import org.slf4j.Logger;
17+
import org.slf4j.LoggerFactory;
18+
19+
import com.appirio.service.challengefeeder.dto.ChallengeFeederParam;
20+
import com.appirio.service.challengefeeder.manager.ChallengeDetailFeederManager;
21+
import com.appirio.service.challengefeeder.manager.ChallengeListingFeederManager;
22+
import com.appirio.service.supply.resources.MetadataApiResponseFactory;
23+
import com.appirio.supply.ErrorHandler;
24+
import com.appirio.supply.SupplyException;
25+
import com.appirio.tech.core.api.v3.request.PostPutRequest;
26+
import com.appirio.tech.core.api.v3.request.annotation.AllowAnonymous;
27+
import com.appirio.tech.core.api.v3.response.ApiResponse;
28+
import com.codahale.metrics.annotation.Timed;
29+
2430
/**
2531
* Resource to handle the challenge feeder
2632
*
2733
* Version 1.1 - Topcoder Elasticsearch Feeder Service - Jobs Cleanup And Improvement v1.0
2834
* - make it dummy
2935
*
30-
*
36+
*
37+
* Version 1.2 - Implement Endpoint To Populate Elasticsearch For The Given Challenges
38+
* - Added method to call listing and detail feeder manager to populate challenge
39+
* data into ES using API resource
3140
*
3241
* @author TCSCODER
33-
* @version 1.1
42+
* @version 1.2
3443
*/
3544
@Produces(MediaType.APPLICATION_JSON)
3645
@Consumes(MediaType.APPLICATION_JSON)
@@ -41,11 +50,24 @@ public class ChallengeFeederResource {
4150
* Logger used to log the events
4251
*/
4352
private static final Logger logger = LoggerFactory.getLogger(ChallengeFeederResource.class);
53+
54+
/**
55+
* Manager to access the challenge feeder for listing.
56+
*/
57+
private final ChallengeListingFeederManager challengeListingFeederManager;
58+
59+
/**
60+
* Manager to access the challenge details feeder for listing.
61+
*/
62+
private final ChallengeDetailFeederManager challengeDetailFeederManager;
63+
4464

4565
/**
4666
* Create ChallengeFeederResource
4767
*/
48-
public ChallengeFeederResource() {
68+
public ChallengeFeederResource(ChallengeDetailFeederManager challengeDetailFeederManager,ChallengeListingFeederManager challengeListingFeederManager) {
69+
this.challengeDetailFeederManager = challengeDetailFeederManager;
70+
this.challengeListingFeederManager = challengeListingFeederManager;
4971
}
5072

5173
/**
@@ -58,10 +80,15 @@ public ChallengeFeederResource() {
5880
@Timed
5981
@AllowAnonymous
6082
public ApiResponse pushChallengeFeeders(@Valid PostPutRequest<ChallengeFeederParam> request) {
61-
try {
62-
return MetadataApiResponseFactory.createResponse(null);
63-
} catch (Exception e) {
64-
return ErrorHandler.handle(e, logger);
65-
}
83+
try {
84+
if (request == null || request.getParam() == null) {
85+
throw new SupplyException("The request body should be provided", HttpServletResponse.SC_BAD_REQUEST);
86+
}
87+
challengeListingFeederManager.pushChallengeFeeder(request.getParam());
88+
challengeDetailFeederManager.pushChallengeFeeder(request.getParam());
89+
return MetadataApiResponseFactory.createResponse(null);
90+
} catch (Exception e) {
91+
return ErrorHandler.handle(e, logger);
92+
}
6693
}
6794
}
Lines changed: 23 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,14 @@
11
package com.appirio.service.resourcefactory;
22

3+
import com.appirio.service.challengefeeder.ChallengeFeederServiceConfiguration;
4+
import com.appirio.service.challengefeeder.dao.ChallengeDetailFeederDAO;
5+
import com.appirio.service.challengefeeder.dao.ChallengeListingFeederDAO;
6+
import com.appirio.service.challengefeeder.manager.ChallengeDetailFeederManager;
7+
import com.appirio.service.challengefeeder.manager.ChallengeListingFeederManager;
38
import com.appirio.service.challengefeeder.resources.ChallengeFeederResource;
9+
import com.appirio.service.challengefeeder.util.JestClientUtils;
410
import com.appirio.service.supply.resources.ResourceFactory;
11+
import com.appirio.supply.DAOFactory;
512
import com.appirio.supply.SupplyException;
613
import io.searchbox.client.JestClient;
714

@@ -10,26 +17,30 @@
1017
*
1118
* Version 1.1 - Topcoder Elasticsearch Feeder Service - Jobs Cleanup And Improvement v1.0
1219
* - create dummy resource
13-
*
1420
*
21+
* Version 1.2 - Implement Endpoint To Populate Elasticsearch For The Given Challenges
22+
* - Changes the challenge factory object creation logic
1523
*
1624
* @author TCSCODER
17-
* @version 1.1
25+
* @version 1.2
1826
*/
1927
public class ChallengeFeederFactory implements ResourceFactory<ChallengeFeederResource> {
2028

2129
/**
2230
* The jest client
2331
*/
2432
private final JestClient jestClient;
33+
34+
private final ChallengeFeederServiceConfiguration config;
2535

2636
/**
2737
* Simple constructor
2838
*
2939
* @param jestClient the jest client
3040
*/
31-
public ChallengeFeederFactory(JestClient jestClient) {
41+
public ChallengeFeederFactory(JestClient jestClient,ChallengeFeederServiceConfiguration config) {
3242
this.jestClient = jestClient;
43+
this.config = config;
3344
}
3445

3546
/**
@@ -38,8 +49,14 @@ public ChallengeFeederFactory(JestClient jestClient) {
3849
* @return ChallengeFeederResource the challenge feeder resource
3950
* @throws SupplyException exception for supply server
4051
*/
41-
@Override
42-
public ChallengeFeederResource getResourceInstance() throws SupplyException {
43-
return new ChallengeFeederResource();
52+
@Override
53+
public ChallengeFeederResource getResourceInstance() throws SupplyException {
54+
final ChallengeListingFeederManager challengeListingFeederManager = new ChallengeListingFeederManager(
55+
JestClientUtils.get(this.config.getJestClientConfiguration()),
56+
DAOFactory.getInstance().createDAO(ChallengeListingFeederDAO.class),
57+
this.config.getChallengeConfiguration());
58+
final ChallengeDetailFeederManager challengeDetailFeederManager= new ChallengeDetailFeederManager(JestClientUtils.get(this.config.getJestClientConfiguration()),
59+
DAOFactory.getInstance().createDAO(ChallengeDetailFeederDAO.class));
60+
return new ChallengeFeederResource(challengeDetailFeederManager,challengeListingFeederManager);
4461
}
4562
}

0 commit comments

Comments
 (0)