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

implement endpoint for populate challenge synchronically #70

Merged
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
Original file line number Diff line number Diff line change
@@ -0,0 +1,99 @@
{
"variables": [],
"info": {
"name": "Implement Endpoint To Populate Elasticsearch For The Given Challenges",
"_postman_id": "7db581cc-9635-e7b3-b3ba-8f3e52254c1b",
"description": "",
"schema": "https://schema.getpostman.com/json/collection/v2.0.0/collection.json"
},
"item": [
{
"name": "View challenge details via ElasticSearch",
"request": {
"url": "http://cockpit.cloud.topcoder.com:9200/challengesdetail/challenges/30005532",
"method": "GET",
"header": [],
"body": {
"mode": "raw",
"raw": ""
},
"description": ""
},
"response": [
{
"id": "5ea84ed3-bbac-42f2-b15f-e9c6e4e8fda9",
"name": "View challenge details via ElasticSearch",
"originalRequest": {
"url": "http://cockpit.cloud.topcoder.com:9200/challengesdetail/challenges/30005532",
"method": "GET",
"header": [],
"body": {
"mode": "raw",
"raw": ""
}
},
"status": "OK",
"code": 200,
"_postman_previewlanguage": "json",
"_postman_previewtype": "text",
"header": [
{
"name": "content-length",
"key": "content-length",
"value": "1296",
"description": "The length of the response body in octets (8-bit bytes)"
},
{
"name": "content-type",
"key": "content-type",
"value": "application/json; charset=UTF-8",
"description": "The mime type of this content"
}
],
"cookie": [],
"responseTime": 50,
"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}}"
}
]
},
{
"name": "View challenge listing via ElasticSearch",
"request": {
"url": "http://cockpit.cloud.topcoder.com:9200/challengeslisting/challenges/30005532",
"method": "GET",
"header": [],
"body": {
"mode": "raw",
"raw": ""
},
"description": ""
},
"response": []
},
{
"name": "Push challenges",
"request": {
"url": "http://localhost:8083/v3/esfeeder/challenges",
"method": "PUT",
"header": [
{
"key": "Content-Type",
"value": "application/json",
"description": ""
},
{
"key": "Authorization",
"value": "Bearer eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJyb2xlcyI6WyJhZG1pbmlzdHJhdG9yIl0sImlzcyI6Imh0dHBzOi8vYXBpLnRvcGNvZGVyLWRldi5jb20iLCJoYW5kbGUiOiJoZWZmYW4iLCJleHAiOjE3NjYyODkyNDYsInVzZXJJZCI6IjEzMjQ1NiIsImlhdCI6MTQ1MDkyOTI0NiwiZW1haWwiOm51bGwsImp0aSI6IjEzNjljNjAwLWUwYTEtNDUyNS1hN2M3LTU2YmU3ZDgxM2Y1MSJ9.hp5peSoj-fh3KFkskvBpfUFIcJNtsv4zIMFV-D8F3JA",
"description": ""
}
],
"body": {
"mode": "raw",
"raw": "{\r\n \"param\": {\r\n \"index\": \"challenges\",\r\n \"type\": \"challenges\",\r\n \"challengeIds\": [30005532]\r\n }\r\n}"
},
"description": ""
},
"response": []
}
]
}
Original file line number Diff line number Diff line change
Expand Up @@ -75,8 +75,13 @@
* Version 1.8 - Topcoder Elasticsearch Feeder Service - Jobs Cleanup And Improvement v1.0
* - remove the useless resources, jobs and logging of configuration values
* </p>
*
* <p>
* Version 1.9 - Implement Endpoint To Populate Elasticsearch For The Given Challenges
* - Changes the challenge resource object creation logic/
* </p>
* @author TCSCODER
* @version 1.8
* @version 1.9
*/
public class ChallengeFeederServiceApplication extends BaseApplication<ChallengeFeederServiceConfiguration> {
/**
Expand Down Expand Up @@ -183,7 +188,7 @@ protected void registerResources(ChallengeFeederServiceConfiguration config, Env

// Register resources here
env.jersey().register(new HealthCheckResource());
env.jersey().register(new ChallengeFeederFactory(jestClient).getResourceInstance());
env.jersey().register(new ChallengeFeederFactory(jestClient,config).getResourceInstance());
env.jersey().register(new MmFeederResourceFactory(jestClient).getResourceInstance());
env.jersey().register(new MarathonMatchFeederFactory(jestClient).getResourceInstance());
env.jersey().register(new SRMFeederFactory(jestClient).getResourceInstance());
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -3,34 +3,43 @@
*/
package com.appirio.service.challengefeeder.resources;

import com.appirio.service.challengefeeder.dto.ChallengeFeederParam;
import com.appirio.service.supply.resources.MetadataApiResponseFactory;
import com.appirio.supply.ErrorHandler;
import com.appirio.tech.core.api.v3.request.PostPutRequest;
import com.appirio.tech.core.api.v3.request.annotation.AllowAnonymous;
import com.appirio.tech.core.api.v3.response.ApiResponse;
import com.codahale.metrics.annotation.Timed;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import java.util.Arrays;

import javax.servlet.http.HttpServletResponse;
import javax.validation.Valid;
import javax.ws.rs.Consumes;
import javax.ws.rs.PUT;
import javax.ws.rs.Path;
import javax.ws.rs.Produces;
import javax.ws.rs.core.MediaType;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import com.appirio.service.challengefeeder.dto.ChallengeFeederParam;
import com.appirio.service.challengefeeder.manager.ChallengeDetailFeederManager;
import com.appirio.service.challengefeeder.manager.ChallengeListingFeederManager;
import com.appirio.service.supply.resources.MetadataApiResponseFactory;
import com.appirio.supply.ErrorHandler;
import com.appirio.supply.SupplyException;
import com.appirio.tech.core.api.v3.request.PostPutRequest;
import com.appirio.tech.core.api.v3.request.annotation.AllowAnonymous;
import com.appirio.tech.core.api.v3.response.ApiResponse;
import com.codahale.metrics.annotation.Timed;

/**
* Resource to handle the challenge feeder
*
* Version 1.1 - Topcoder Elasticsearch Feeder Service - Jobs Cleanup And Improvement v1.0
* - make it dummy
*
*
*
* Version 1.2 - Implement Endpoint To Populate Elasticsearch For The Given Challenges
* - Added method to call listing and detail feeder manager to populate challenge
* data into ES using API resource
*
* @author TCSCODER
* @version 1.1
* @version 1.2
*/
@Produces(MediaType.APPLICATION_JSON)
@Consumes(MediaType.APPLICATION_JSON)
Expand All @@ -41,11 +50,24 @@ public class ChallengeFeederResource {
* Logger used to log the events
*/
private static final Logger logger = LoggerFactory.getLogger(ChallengeFeederResource.class);

/**
* Manager to access the challenge feeder for listing.
*/
private final ChallengeListingFeederManager challengeListingFeederManager;

/**
* Manager to access the challenge details feeder for listing.
*/
private final ChallengeDetailFeederManager challengeDetailFeederManager;


/**
* Create ChallengeFeederResource
*/
public ChallengeFeederResource() {
public ChallengeFeederResource(ChallengeDetailFeederManager challengeDetailFeederManager,ChallengeListingFeederManager challengeListingFeederManager) {
this.challengeDetailFeederManager = challengeDetailFeederManager;
this.challengeListingFeederManager = challengeListingFeederManager;
}

/**
Expand All @@ -58,10 +80,15 @@ public ChallengeFeederResource() {
@Timed
@AllowAnonymous
public ApiResponse pushChallengeFeeders(@Valid PostPutRequest<ChallengeFeederParam> request) {
try {
return MetadataApiResponseFactory.createResponse(null);
} catch (Exception e) {
return ErrorHandler.handle(e, logger);
}
try {
if (request == null || request.getParam() == null) {
throw new SupplyException("The request body should be provided", HttpServletResponse.SC_BAD_REQUEST);
}
challengeListingFeederManager.pushChallengeFeeder(request.getParam());
challengeDetailFeederManager.pushChallengeFeeder(request.getParam());
return MetadataApiResponseFactory.createResponse(null);
} catch (Exception e) {
return ErrorHandler.handle(e, logger);
}
}
}
Original file line number Diff line number Diff line change
@@ -1,7 +1,14 @@
package com.appirio.service.resourcefactory;

import com.appirio.service.challengefeeder.ChallengeFeederServiceConfiguration;
import com.appirio.service.challengefeeder.dao.ChallengeDetailFeederDAO;
import com.appirio.service.challengefeeder.dao.ChallengeListingFeederDAO;
import com.appirio.service.challengefeeder.manager.ChallengeDetailFeederManager;
import com.appirio.service.challengefeeder.manager.ChallengeListingFeederManager;
import com.appirio.service.challengefeeder.resources.ChallengeFeederResource;
import com.appirio.service.challengefeeder.util.JestClientUtils;
import com.appirio.service.supply.resources.ResourceFactory;
import com.appirio.supply.DAOFactory;
import com.appirio.supply.SupplyException;
import io.searchbox.client.JestClient;

Expand All @@ -10,26 +17,30 @@
*
* Version 1.1 - Topcoder Elasticsearch Feeder Service - Jobs Cleanup And Improvement v1.0
* - create dummy resource
*
*
* Version 1.2 - Implement Endpoint To Populate Elasticsearch For The Given Challenges
* - Changes the challenge factory object creation logic
*
* @author TCSCODER
* @version 1.1
* @version 1.2
*/
public class ChallengeFeederFactory implements ResourceFactory<ChallengeFeederResource> {

/**
* The jest client
*/
private final JestClient jestClient;

private final ChallengeFeederServiceConfiguration config;

/**
* Simple constructor
*
* @param jestClient the jest client
*/
public ChallengeFeederFactory(JestClient jestClient) {
public ChallengeFeederFactory(JestClient jestClient,ChallengeFeederServiceConfiguration config) {
this.jestClient = jestClient;
this.config = config;
}

/**
Expand All @@ -38,8 +49,14 @@ public ChallengeFeederFactory(JestClient jestClient) {
* @return ChallengeFeederResource the challenge feeder resource
* @throws SupplyException exception for supply server
*/
@Override
public ChallengeFeederResource getResourceInstance() throws SupplyException {
return new ChallengeFeederResource();
@Override
public ChallengeFeederResource getResourceInstance() throws SupplyException {
final ChallengeListingFeederManager challengeListingFeederManager = new ChallengeListingFeederManager(
JestClientUtils.get(this.config.getJestClientConfiguration()),
DAOFactory.getInstance().createDAO(ChallengeListingFeederDAO.class),
this.config.getChallengeConfiguration());
final ChallengeDetailFeederManager challengeDetailFeederManager= new ChallengeDetailFeederManager(JestClientUtils.get(this.config.getJestClientConfiguration()),
DAOFactory.getInstance().createDAO(ChallengeDetailFeederDAO.class));
return new ChallengeFeederResource(challengeDetailFeederManager,challengeListingFeederManager);
}
}