Skip to content
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
3 changes: 3 additions & 0 deletions .gitattributes
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
/gradlew text eol=lf
*.bat text eol=crlf
*.jar binary
42 changes: 42 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
@@ -0,0 +1,42 @@
HELP.md
.gradle
build/
!gradle/wrapper/gradle-wrapper.jar
!**/src/main/**/build/
!**/src/test/**/build/

### STS ###
.apt_generated
.classpath
.factorypath
.project
.settings
.springBeans
.sts4-cache
bin/
!**/src/main/**/bin/
!**/src/test/**/bin/

### IntelliJ IDEA ###
.idea
*.iws
*.iml
*.ipr
out/
!**/src/main/**/out/
!**/src/test/**/out/

### NetBeans ###
/nbproject/private/
/nbbuild/
/dist/
/nbdist/
/.nb-gradle/

### VS Code ###
.vscode/

### macOS ###
.DS_Store
.AppleDouble
.LSOverride
39 changes: 39 additions & 0 deletions app/app-api-price/build.gradle.kts
Original file line number Diff line number Diff line change
@@ -0,0 +1,39 @@
plugins {
java
id("org.springframework.boot") version "3.4.7"
id("io.spring.dependency-management") version "1.1.7"
}

group = "com.polynomeer"
version = "0.0.1-SNAPSHOT"

java {
toolchain {
languageVersion = JavaLanguageVersion.of(21)
}
}

configurations {
compileOnly {
extendsFrom(configurations.annotationProcessor.get())
}
}

repositories {
mavenCentral()
}

dependencies {
implementation(project(":shared"))
implementation("org.springframework.boot:spring-boot-starter-web")
implementation("org.springdoc:springdoc-openapi-starter-webmvc-ui:2.8.9")
compileOnly("org.projectlombok:lombok")
developmentOnly("org.springframework.boot:spring-boot-devtools")
annotationProcessor("org.projectlombok:lombok")
testImplementation("org.springframework.boot:spring-boot-starter-test")
testRuntimeOnly("org.junit.platform:junit-platform-launcher")
}

tasks.withType<Test> {
useJUnitPlatform()
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
package com.polynomeer.app.api.price;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

@SpringBootApplication
public class AppApiPriceApplication {

public static void main(String[] args) {
SpringApplication.run(AppApiPriceApplication.class, args);
}

}
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
package com.polynomeer.app.api.price;

import java.time.ZonedDateTime;

public record Price(
String tickerCode,
long price,
long change,
double changeRate,
long volume,
ZonedDateTime timestamp
) {
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
package com.polynomeer.app.api.price.config;

import com.polynomeer.shared.config.global.GlobalExceptionHandler;
import com.polynomeer.shared.config.logging.TraceIdFilter;
import com.polynomeer.shared.config.web.SwaggerConfig;
import com.polynomeer.shared.config.web.WebMvcConfig;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Import;

@Configuration
@Import({TraceIdFilter.class, GlobalExceptionHandler.class, SwaggerConfig.class, WebMvcConfig.class})
public class SharedConfigImport {
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,46 @@
package com.polynomeer.app.api.price.controller;

import com.polynomeer.app.api.price.Price;
import com.polynomeer.app.api.price.dto.PriceResponse;
import com.polynomeer.shared.common.dto.CommonResponse;
import com.polynomeer.shared.common.error.TickerErrorCode;
import com.polynomeer.shared.common.error.TickerNotFoundException;
import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.Parameter;
import io.swagger.v3.oas.annotations.responses.ApiResponse;
import io.swagger.v3.oas.annotations.responses.ApiResponses;
import io.swagger.v3.oas.annotations.tags.Tag;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.web.bind.annotation.*;

@RestController
@RequestMapping("/api/v1/quotes")
@RequiredArgsConstructor
@Slf4j
@Tag(name = "Quotes", description = "Operations related to stock quotes")
public class PriceController {

@Operation(summary = "Get quote by ticker code", description = "Returns stock quote data for a given ticker code.")
@ApiResponses(value = {
@ApiResponse(responseCode = "200", description = "Successful response"),
@ApiResponse(responseCode = "404", description = "Ticker not found")
})
@GetMapping("/{tickerCode}")
public CommonResponse<PriceResponse> getQuote(
@Parameter(description = "Ticker code of the stock", example = "AAPL")
@PathVariable String tickerCode
) {
log.info("getQuote tickerCode={}", tickerCode);

if (tickerCode.equals("error")) {
throw new TickerNotFoundException(TickerErrorCode.TICKER_NOT_FOUND);
}

return new CommonResponse<>(
"SUCCESS",
PriceResponse.from(
new Price("TEST", 1000L, 10L, 100.0, 10000L, null)
));
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,25 @@
package com.polynomeer.app.api.price.dto;

import com.polynomeer.app.api.price.Price;

import java.time.ZonedDateTime;

public record PriceResponse(
String tickerCode,
long price,
long change,
double changeRate,
long volume,
ZonedDateTime timestamp
) {
public static PriceResponse from(Price price) {
return new PriceResponse(
price.tickerCode(),
price.price(),
price.change(),
price.changeRate(),
price.volume(),
price.timestamp()
);
}
}
2 changes: 2 additions & 0 deletions app/app-api-price/src/main/resources/application.properties
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
spring.application.name=app-api-price
logging.pattern.console=%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{36} - [%X{traceId}] %msg%n
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
package com.polynomeer.app.api.price;

import org.junit.jupiter.api.Test;
import org.springframework.boot.test.context.SpringBootTest;

@SpringBootTest
class AppApiPriceApplicationTests {

@Test
void contextLoads() {
}

}
38 changes: 38 additions & 0 deletions app/app-batch-collector/build.gradle.kts
Original file line number Diff line number Diff line change
@@ -0,0 +1,38 @@
plugins {
java
id("org.springframework.boot") version "3.4.7"
id("io.spring.dependency-management") version "1.1.7"
}

group = "com.polynomeer"
version = "0.0.1-SNAPSHOT"

java {
toolchain {
languageVersion = JavaLanguageVersion.of(21)
}
}

configurations {
compileOnly {
extendsFrom(configurations.annotationProcessor.get())
}
}

repositories {
mavenCentral()
}

dependencies {
implementation("org.springframework.boot:spring-boot-starter-batch")

compileOnly("org.projectlombok:lombok")
annotationProcessor("org.projectlombok:lombok")
testImplementation("org.springframework.boot:spring-boot-starter-test")
testImplementation("org.springframework.batch:spring-batch-test")
testRuntimeOnly("org.junit.platform:junit-platform-launcher")
}

tasks.withType<Test> {
useJUnitPlatform()
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
package com.polynomeer.app.batch.collector;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

@SpringBootApplication
public class AppBatchCollectorApplication {

public static void main(String[] args) {
SpringApplication.run(AppBatchCollectorApplication.class, args);
}

}
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
spring.application.name=app-batch-collector
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
package com.polynomeer.app.batch.collector;

import org.junit.jupiter.api.Test;
import org.springframework.boot.test.context.SpringBootTest;

@SpringBootTest
class AppBatchCollectorApplicationTests {

@Test
void contextLoads() {
}

}
38 changes: 38 additions & 0 deletions build.gradle.kts
Original file line number Diff line number Diff line change
@@ -0,0 +1,38 @@
plugins {
java
}

group = "com.polynomeer"
version = "0.0.1-SNAPSHOT"

java {
toolchain {
languageVersion = JavaLanguageVersion.of(21)
}
}

repositories {
mavenCentral()
}

tasks.withType<Test> {
useJUnitPlatform()
}

allprojects {
group = "com.polynomeer.romanticker"
version = "1.0.0"

repositories {
mavenCentral()
}
}

subprojects {
apply(plugin = "org.jetbrains.kotlin.jvm")
apply(plugin = "io.spring.dependency-management")

dependencies {
testImplementation(kotlin("test"))
}
}
28 changes: 28 additions & 0 deletions domain/domain-price/build.gradle.kts
Original file line number Diff line number Diff line change
@@ -0,0 +1,28 @@
plugins {
java
id("org.springframework.boot") version "3.4.7"
id("io.spring.dependency-management") version "1.1.7"
}

group = "com.polynomeer"
version = "0.0.1-SNAPSHOT"

java {
toolchain {
languageVersion = JavaLanguageVersion.of(21)
}
}

repositories {
mavenCentral()
}

dependencies {
implementation("org.springframework.boot:spring-boot-starter")
testImplementation("org.springframework.boot:spring-boot-starter-test")
testRuntimeOnly("org.junit.platform:junit-platform-launcher")
}

tasks.withType<Test> {
useJUnitPlatform()
}
Empty file.
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
spring.application.name=domain-price
Empty file.
Binary file added gradle/wrapper/gradle-wrapper.jar
Binary file not shown.
7 changes: 7 additions & 0 deletions gradle/wrapper/gradle-wrapper.properties
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
distributionBase=GRADLE_USER_HOME
distributionPath=wrapper/dists
distributionUrl=https\://services.gradle.org/distributions/gradle-8.14.2-bin.zip
networkTimeout=10000
validateDistributionUrl=true
zipStoreBase=GRADLE_USER_HOME
zipStorePath=wrapper/dists
Loading
Loading