Skip to content

Commit 1b8f06f

Browse files
author
Damian Rychter
committed
GGW-24 Backend Endpoints to support ETL
1 parent f4edaba commit 1b8f06f

26 files changed

+1365
-3
lines changed
Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,40 @@
1+
package org.digijava.kernel.ampapi.endpoints.integration;
2+
3+
import org.digijava.module.aim.helper.GlobalSettingsConstants;
4+
import org.digijava.module.aim.util.FeaturesUtil;
5+
import org.springframework.context.annotation.Configuration;
6+
7+
import java.io.File;
8+
9+
@Configuration
10+
public class IntegraionUploadsDirectoryConfig {
11+
12+
13+
// @Value("${file.upload-dir}")
14+
private static IntegraionUploadsDirectoryConfig config;
15+
private static String uploadsDir = FeaturesUtil.getGlobalSettingValue(GlobalSettingsConstants.INTEGRATION_FILE_UPLOAD_DIR);//"/opt/etl/"; //FeaturesUtil.getGlobalSettingValue(GlobalSettingsConstants.INTEGRATION_FILE_UPLOAD_DIR);;
16+
17+
private IntegraionUploadsDirectoryConfig(){
18+
}
19+
20+
public static IntegraionUploadsDirectoryConfig getInstance(){
21+
if (config == null){
22+
config = new IntegraionUploadsDirectoryConfig();
23+
createUploadsDirectory();
24+
25+
}
26+
return config;
27+
}
28+
29+
30+
private static void createUploadsDirectory() {
31+
File file = new File(uploadsDir);
32+
if (!file.exists()) {
33+
file.mkdir();
34+
}
35+
}
36+
37+
public String getUploadsDir() {
38+
return uploadsDir;
39+
}
40+
}
Lines changed: 116 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,116 @@
1+
package org.digijava.kernel.ampapi.endpoints.integration;
2+
3+
import com.sun.jersey.core.header.FormDataContentDisposition;
4+
import com.sun.jersey.multipart.FormDataParam;
5+
import org.digijava.kernel.ampapi.endpoints.activity.utils.AmpMediaType;
6+
import org.digijava.kernel.ampapi.endpoints.errors.ApiError;
7+
import org.digijava.kernel.ampapi.endpoints.errors.ApiErrorResponse;
8+
import org.digijava.kernel.ampapi.endpoints.errors.ApiRuntimeException;
9+
import org.digijava.kernel.ampapi.endpoints.errors.GenericErrors;
10+
import org.digijava.kernel.ampapi.endpoints.integration.dto.DagRunsRequestDTO;
11+
import org.digijava.kernel.ampapi.endpoints.integration.dto.DagRunsResponseDTO;
12+
import org.digijava.kernel.ampapi.endpoints.integration.dto.FileInformationDTO;
13+
import org.digijava.kernel.ampapi.endpoints.integration.dto.FileUploadedResponseDTO;
14+
import org.digijava.kernel.ampapi.endpoints.integration.service.DagService;
15+
import org.digijava.kernel.ampapi.endpoints.integration.service.DagServiceImpl;
16+
import org.digijava.kernel.ampapi.endpoints.integration.service.FileInformationServiceImpl;
17+
import org.digijava.kernel.ampapi.endpoints.integration.service.FileUploaderServiceImpl;
18+
import org.json.JSONArray;
19+
import org.json.JSONObject;
20+
import org.slf4j.Logger;
21+
import org.slf4j.LoggerFactory;
22+
import org.springframework.web.bind.annotation.RequestBody;
23+
24+
import javax.servlet.http.Cookie;
25+
import javax.servlet.http.HttpServletRequest;
26+
import javax.ws.rs.Consumes;
27+
import javax.ws.rs.GET;
28+
import javax.ws.rs.POST;
29+
import javax.ws.rs.Path;
30+
import javax.ws.rs.PathParam;
31+
import javax.ws.rs.Produces;
32+
import javax.ws.rs.QueryParam;
33+
import javax.ws.rs.core.Context;
34+
import javax.ws.rs.core.MediaType;
35+
import javax.ws.rs.core.Response;
36+
import java.io.IOException;
37+
import java.io.InputStream;
38+
import java.util.List;
39+
import java.util.Optional;
40+
41+
@Path("integration")
42+
public class IntegrationEndpoint {
43+
44+
private static final Logger LOGGER = LoggerFactory.getLogger(DagService.class.getName());
45+
46+
47+
@POST
48+
@Path("/dag/dagRuns")
49+
@Produces({MediaType.APPLICATION_JSON + ";charset=utf-8", AmpMediaType.POSSIBLE_VALUES_V2_JSON})
50+
public DagRunsResponseDTO dagRuns(@RequestBody DagRunsRequestDTO dagRunsRequest) {
51+
try {
52+
DagRunsResponseDTO responseDTO = DagServiceImpl.getInstance().dagRuns(dagRunsRequest);
53+
LOGGER.info("DagRun triggered successfully with payload: {}", dagRunsRequest);
54+
return responseDTO;
55+
56+
} catch (Exception e) {
57+
LOGGER.error("Failed to trigger DagRun with payload: {}", dagRunsRequest, e);
58+
ApiErrorResponse error = ApiError.toError(GenericErrors.INTERNAL_ERROR.withDetails(e.getMessage()));
59+
throw new ApiRuntimeException(Response.Status.INTERNAL_SERVER_ERROR, error);
60+
}
61+
}
62+
63+
@POST
64+
@Path("/upload/file")
65+
@Consumes(MediaType.MULTIPART_FORM_DATA)
66+
@Produces({MediaType.APPLICATION_JSON + ";charset=utf-8", AmpMediaType.POSSIBLE_VALUES_V2_JSON})
67+
public FileUploadedResponseDTO uploadFile(@FormDataParam("file") InputStream fileInputStream,
68+
@FormDataParam("file") FormDataContentDisposition fileMetaData) {
69+
try {
70+
FileUploadedResponseDTO dto = FileUploaderServiceImpl.getInstance().uploadFile(fileInputStream, fileMetaData);
71+
return dto;
72+
} catch (IOException e) {
73+
ApiErrorResponse error = ApiError.toError(GenericErrors.INTERNAL_ERROR.withDetails(e.getMessage()));
74+
throw new ApiRuntimeException(Response.Status.INTERNAL_SERVER_ERROR, error);
75+
}
76+
}
77+
78+
@GET
79+
@Path("/file-information")
80+
@Produces({MediaType.APPLICATION_JSON + ";charset=utf-8", AmpMediaType.POSSIBLE_VALUES_V2_JSON})
81+
public List<FileInformationDTO> getAllFileInformation(@QueryParam(value = "page") Integer page,
82+
@QueryParam(value = "size") Integer size) {
83+
if (page == null) {
84+
page = 0;
85+
}
86+
if (size == null) {
87+
size = 10;
88+
}
89+
return FileInformationServiceImpl.getInstance().getAllFileInformation(page, size);
90+
}
91+
92+
@GET
93+
@Path("/file-information/{id}")
94+
@Produces({MediaType.APPLICATION_JSON + ";charset=utf-8", AmpMediaType.POSSIBLE_VALUES_V2_JSON})
95+
public FileInformationDTO getFileInformationById(@PathParam("id") Long id) {
96+
Optional<FileInformationDTO> response = FileInformationServiceImpl.getInstance().getFileInformationById(id);
97+
if (response.isPresent()) {
98+
return response.get();
99+
} else {
100+
throw new ApiRuntimeException(Response.Status.NOT_FOUND, ApiError.toError("NOT FOUND"));
101+
}
102+
}
103+
104+
@GET
105+
@Path("/file-information/name/{fileName}")
106+
@Produces({MediaType.APPLICATION_JSON + ";charset=utf-8", AmpMediaType.POSSIBLE_VALUES_V2_JSON})
107+
public FileInformationDTO getFileInformationByFileName(@PathParam("fileName") String fileName) {
108+
Optional<FileInformationDTO> fileInformation = FileInformationServiceImpl.getInstance().getFileInformationByFileName(fileName);
109+
if (fileInformation.isPresent()) {
110+
return fileInformation.get();
111+
} else {
112+
throw new ApiRuntimeException(Response.Status.NOT_FOUND, ApiError.toError("NOT FOUND"));
113+
}
114+
}
115+
116+
}
Lines changed: 60 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,60 @@
1+
package org.digijava.kernel.ampapi.endpoints.integration.dto;
2+
3+
import javax.validation.constraints.NotNull;
4+
5+
public class DagRunsRequestDTO {
6+
@NotNull
7+
private String username;
8+
9+
@NotNull
10+
private String password;
11+
12+
@NotNull
13+
private String workspaceId;
14+
15+
@NotNull
16+
private String fileName;
17+
18+
@NotNull
19+
private String dagId;
20+
21+
public String getUsername() {
22+
return username;
23+
}
24+
25+
public void setUsername(String username) {
26+
this.username = username;
27+
}
28+
29+
public String getPassword() {
30+
return password;
31+
}
32+
33+
public void setPassword(String password) {
34+
this.password = password;
35+
}
36+
37+
public String getWorkspaceId() {
38+
return workspaceId;
39+
}
40+
41+
public void setWorkspaceId(String workspaceId) {
42+
this.workspaceId = workspaceId;
43+
}
44+
45+
public String getDagId() {
46+
return dagId;
47+
}
48+
49+
public void setDagId(String dagId) {
50+
this.dagId = dagId;
51+
}
52+
53+
public String getFileName() {
54+
return fileName;
55+
}
56+
57+
public void setFileName(String fileName) {
58+
this.fileName = fileName;
59+
}
60+
}
Lines changed: 137 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,137 @@
1+
package org.digijava.kernel.ampapi.endpoints.integration.dto;
2+
3+
import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
4+
import com.fasterxml.jackson.annotation.JsonProperty;
5+
6+
7+
@JsonIgnoreProperties(ignoreUnknown = true)
8+
public class DagRunsResponseDTO {
9+
@JsonProperty("dag_id")
10+
private String dagId;
11+
@JsonProperty("dag_run_id")
12+
private String dagRunId;
13+
@JsonProperty("data_interval_end")
14+
private String dataIntervalEnd;
15+
@JsonProperty("data_interval_start")
16+
private String dataIntervalStart;
17+
@JsonProperty("end_date")
18+
private String endDate;
19+
@JsonProperty("execution_date")
20+
private String executionDate;
21+
@JsonProperty("external_trigger")
22+
private boolean externalTrigger;
23+
@JsonProperty("last_scheduling_decision")
24+
private String lastSchedulingDecision;
25+
@JsonProperty("logical_date")
26+
private String logicalDate;
27+
private String note;
28+
@JsonProperty("run_type")
29+
private String runType;
30+
@JsonProperty("start_date")
31+
private String startDate;
32+
private String state;
33+
34+
public String getDagId() {
35+
return dagId;
36+
}
37+
38+
public void setDagId(String dagId) {
39+
this.dagId = dagId;
40+
}
41+
42+
public String getDagRunId() {
43+
return dagRunId;
44+
}
45+
46+
public void setDagRunId(String dagRunId) {
47+
this.dagRunId = dagRunId;
48+
}
49+
50+
public String getDataIntervalEnd() {
51+
return dataIntervalEnd;
52+
}
53+
54+
public void setDataIntervalEnd(String dataIntervalEnd) {
55+
this.dataIntervalEnd = dataIntervalEnd;
56+
}
57+
58+
public String getDataIntervalStart() {
59+
return dataIntervalStart;
60+
}
61+
62+
public void setDataIntervalStart(String dataIntervalStart) {
63+
this.dataIntervalStart = dataIntervalStart;
64+
}
65+
66+
public String getEndDate() {
67+
return endDate;
68+
}
69+
70+
public void setEndDate(String endDate) {
71+
this.endDate = endDate;
72+
}
73+
74+
public String getExecutionDate() {
75+
return executionDate;
76+
}
77+
78+
public void setExecutionDate(String executionDate) {
79+
this.executionDate = executionDate;
80+
}
81+
82+
public boolean isExternalTrigger() {
83+
return externalTrigger;
84+
}
85+
86+
public void setExternalTrigger(boolean externalTrigger) {
87+
this.externalTrigger = externalTrigger;
88+
}
89+
90+
public String getLastSchedulingDecision() {
91+
return lastSchedulingDecision;
92+
}
93+
94+
public void setLastSchedulingDecision(String lastSchedulingDecision) {
95+
this.lastSchedulingDecision = lastSchedulingDecision;
96+
}
97+
98+
public String getLogicalDate() {
99+
return logicalDate;
100+
}
101+
102+
public void setLogicalDate(String logicalDate) {
103+
this.logicalDate = logicalDate;
104+
}
105+
106+
public String getNote() {
107+
return note;
108+
}
109+
110+
public void setNote(String note) {
111+
this.note = note;
112+
}
113+
114+
public String getRunType() {
115+
return runType;
116+
}
117+
118+
public void setRunType(String runType) {
119+
this.runType = runType;
120+
}
121+
122+
public String getStartDate() {
123+
return startDate;
124+
}
125+
126+
public void setStartDate(String startDate) {
127+
this.startDate = startDate;
128+
}
129+
130+
public String getState() {
131+
return state;
132+
}
133+
134+
public void setState(String state) {
135+
this.state = state;
136+
}
137+
}

0 commit comments

Comments
 (0)