Skip to content
Open
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
359 changes: 306 additions & 53 deletions java/pom.xml

Large diffs are not rendered by default.

Original file line number Diff line number Diff line change
@@ -0,0 +1,24 @@
package com.ensono.stacks.aws.tracing;


#if USE_AWS
import com.amazonaws.xray.spring.aop.BaseAbstractXRayInterceptor;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Pointcut;
import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
import org.springframework.stereotype.Component;


@Aspect
@Component
@ConditionalOnProperty(value = "aws.xray.enabled", havingValue = "true")
public class XRayInspector extends BaseAbstractXRayInterceptor {
@Override
@Pointcut("within(com.amido.stacks..*) && bean(*Controller)")
public void xrayEnabledClasses() {
// Pointcut
}
}
#else
public class XRayInspector { }
#endif
Original file line number Diff line number Diff line change
@@ -0,0 +1,46 @@
package com.ensono.stacks.aws.tracing;

#if USE_AWS

import com.amazonaws.xray.AWSXRay;
import com.amazonaws.xray.AWSXRayRecorderBuilder;
import com.amazonaws.xray.jakarta.servlet.AWSXRayServletFilter;
import com.amazonaws.xray.log4j.Log4JSegmentListener;
import com.amazonaws.xray.metrics.MetricsSegmentListener;
import com.amazonaws.xray.plugins.EC2Plugin;
import com.amazonaws.xray.plugins.EKSPlugin;
import jakarta.servlet.Filter;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

@Configuration
@ConditionalOnProperty(value = "aws.xray.enabled", havingValue = "true")
@Slf4j
public class XRayTracingFilter {

@Value("${spring.application.name:undefined}")
public String appName;

@Bean
public Filter xrayFilter() {

log.info("Initialising AWS XRay Support...");

AWSXRayRecorderBuilder builder =
AWSXRayRecorderBuilder.standard()
.withPlugin(new EC2Plugin())
.withPlugin(new EKSPlugin())
.withSegmentListener(new MetricsSegmentListener())
.withSegmentListener(new Log4JSegmentListener(appName));

AWSXRay.setGlobalRecorder(builder.build());

return new AWSXRayServletFilter(appName);
}
}
#else
public class XRayTracingFilter {}
#endif
Original file line number Diff line number Diff line change
@@ -0,0 +1,52 @@
package com.ensono.stacks.core.api.annotations;

import com.ensono.stacks.core.api.dto.ErrorResponse;
import com.ensono.stacks.core.api.dto.response.ResourceCreatedResponse;
import io.swagger.v3.oas.annotations.media.Content;
import io.swagger.v3.oas.annotations.media.Schema;
import io.swagger.v3.oas.annotations.responses.ApiResponse;
import io.swagger.v3.oas.annotations.security.SecurityRequirement;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;

@Target({ElementType.METHOD, ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@ApiResponse(
responseCode = "201",
description = "Resource created",
content =
@Content(
mediaType = "application/json",
schema = @Schema(implementation = ResourceCreatedResponse.class)))
@ApiResponse(
responseCode = "400",
description = "Bad Request",
content =
@Content(
mediaType = "application/json",
schema = @Schema(implementation = ErrorResponse.class)))
@ApiResponse(
responseCode = "401",
description = "Unauthorized, Access token is missing or invalid",
content =
@Content(
mediaType = "application/json",
schema = @Schema(implementation = ErrorResponse.class)))
@ApiResponse(
responseCode = "403",
description = "Forbidden, the user does not have permission to execute this operation",
content =
@Content(
mediaType = "application/json",
schema = @Schema(implementation = ErrorResponse.class)))
@ApiResponse(
responseCode = "409",
description = "Conflict, an item already exists",
content =
@Content(
mediaType = "application/json",
schema = @Schema(implementation = ErrorResponse.class)))
@SecurityRequirement(name = "bearerAuth")
public @interface CreateAPIResponses {}
Original file line number Diff line number Diff line change
@@ -0,0 +1,59 @@
package com.ensono.stacks.core.api.annotations;

import com.ensono.stacks.core.api.dto.ErrorResponse;
import io.swagger.v3.oas.annotations.media.Content;
import io.swagger.v3.oas.annotations.media.Schema;
import io.swagger.v3.oas.annotations.responses.ApiResponse;
import io.swagger.v3.oas.annotations.security.SecurityRequirement;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;

@Target({ElementType.METHOD, ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@ApiResponse(
responseCode = "200",
description = "Success",
content = @Content(mediaType = "application/json", schema = @Schema(hidden = true)))
@ApiResponse(
responseCode = "204",
description = "No Content",
content = @Content(schema = @Schema(hidden = true)))
@ApiResponse(
responseCode = "400",
description = "Bad Request",
content =
@Content(
mediaType = "application/json",
schema = @Schema(implementation = ErrorResponse.class)))
@ApiResponse(
responseCode = "401",
description = "Unauthorized, Access token is missing or invalid",
content =
@Content(
mediaType = "application/json",
schema = @Schema(implementation = ErrorResponse.class)))
@ApiResponse(
responseCode = "403",
description = "Forbidden, the user does not have permission to execute this operation",
content =
@Content(
mediaType = "application/json",
schema = @Schema(implementation = ErrorResponse.class)))
@ApiResponse(
responseCode = "404",
description = "Resource not found",
content =
@Content(
mediaType = "application/json",
schema = @Schema(implementation = ErrorResponse.class)))
@ApiResponse(
responseCode = "409",
description = "Conflict, an item already exists",
content =
@Content(
mediaType = "application/json",
schema = @Schema(implementation = ErrorResponse.class)))
@SecurityRequirement(name = "bearerAuth")
public @interface DeleteAPIResponses {}
Original file line number Diff line number Diff line change
@@ -0,0 +1,30 @@
package com.ensono.stacks.core.api.annotations;

import com.ensono.stacks.core.api.dto.ErrorResponse;
import io.swagger.v3.oas.annotations.media.Content;
import io.swagger.v3.oas.annotations.media.Schema;
import io.swagger.v3.oas.annotations.responses.ApiResponse;
import io.swagger.v3.oas.annotations.security.SecurityRequirement;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;

@Target({ElementType.METHOD, ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@ApiResponse(
responseCode = "404",
description = "Resource not found",
content =
@Content(
mediaType = "application/json",
schema = @Schema(implementation = ErrorResponse.class)))
@ApiResponse(
responseCode = "400",
description = "Bad Request",
content =
@Content(
mediaType = "application/json",
schema = @Schema(implementation = ErrorResponse.class)))
@SecurityRequirement(name = "bearerAuth")
public @interface ReadAPIResponses {}
Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@
package com.ensono.stacks.core.api.annotations;

import com.ensono.stacks.core.api.dto.ErrorResponse;
import io.swagger.v3.oas.annotations.media.Content;
import io.swagger.v3.oas.annotations.media.Schema;
import io.swagger.v3.oas.annotations.responses.ApiResponse;
import io.swagger.v3.oas.annotations.security.SecurityRequirement;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;

@Target({ElementType.METHOD, ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@ApiResponse(
responseCode = "400",
description = "Bad Request",
content =
@Content(
mediaType = "application/json",
schema = @Schema(implementation = ErrorResponse.class)))
@SecurityRequirement(name = "bearerAuth")
public @interface SearchAPIResponses {}
Original file line number Diff line number Diff line change
@@ -0,0 +1,66 @@
package com.ensono.stacks.core.api.annotations;

import com.ensono.stacks.core.api.dto.ErrorResponse;
import com.ensono.stacks.core.api.dto.response.ResourceUpdatedResponse;
import io.swagger.v3.oas.annotations.media.Content;
import io.swagger.v3.oas.annotations.media.Schema;
import io.swagger.v3.oas.annotations.responses.ApiResponse;
import io.swagger.v3.oas.annotations.security.SecurityRequirement;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;

@Target({ElementType.METHOD, ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@ApiResponse(
responseCode = "200",
description = "Success",
content =
@Content(
mediaType = "application/json",
schema = @Schema(implementation = ResourceUpdatedResponse.class)))
@ApiResponse(
responseCode = "204",
description = "No Content",
content =
@Content(
mediaType = "application/json",
schema = @Schema(implementation = ErrorResponse.class)))
@ApiResponse(
responseCode = "400",
description = "Bad Request",
content =
@Content(
mediaType = "application/json",
schema = @Schema(implementation = ErrorResponse.class)))
@ApiResponse(
responseCode = "401",
description = "Unauthorized, Access token is missing or invalid",
content =
@Content(
mediaType = "application/json",
schema = @Schema(implementation = ErrorResponse.class)))
@ApiResponse(
responseCode = "403",
description = "Forbidden, the user does not have permission to execute this operation",
content =
@Content(
mediaType = "application/json",
schema = @Schema(implementation = ErrorResponse.class)))
@ApiResponse(
responseCode = "404",
description = "Resource not found",
content =
@Content(
mediaType = "application/json",
schema = @Schema(implementation = ErrorResponse.class)))
@ApiResponse(
responseCode = "409",
description = "Conflict, an item already exists",
content =
@Content(
mediaType = "application/json",
schema = @Schema(implementation = ErrorResponse.class)))
@SecurityRequirement(name = "bearerAuth")
public @interface UpdateAPIResponses {}
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
package com.ensono.stacks.core.api.dto;

import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;

@Data
@NoArgsConstructor
@AllArgsConstructor
public class ErrorResponse {

int errorCode;
int operationCode;
String correlationId;
String description;
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,30 @@
package com.ensono.stacks.core.api.dto.request;

import com.fasterxml.jackson.annotation.JsonProperty;
import jakarta.validation.constraints.NotBlank;
import jakarta.validation.constraints.NotNull;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;

@Data
@NoArgsConstructor
@AllArgsConstructor
public class GenerateTokenRequest {

@JsonProperty("client_id")
@NotBlank
private String client_id = null;

@JsonProperty("client_secret")
@NotBlank
private String client_secret = null;

@JsonProperty("audience")
@NotNull
private String audience = null;

@JsonProperty("grant_type")
@NotNull
private String grant_type = null;
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
package com.ensono.stacks.core.api.dto.response;

import com.fasterxml.jackson.annotation.JsonProperty;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;

@Data
@NoArgsConstructor
@AllArgsConstructor
public class GenerateTokenResponse {

@JsonProperty("access_token")
private String access_token = null;

@JsonProperty("expires_in")
private String expires_in = null;

@JsonProperty("token_type")
private String token_type = null;
}
Loading