Skip to content

Commit f462000

Browse files
authored
Merge pull request #2 from ivanvznkv/stat_svc
stage 1 - add statistics service module
2 parents 8f59bf6 + 873ef18 commit f462000

23 files changed

Lines changed: 611 additions & 4 deletions

File tree

docker-compose.yml

Lines changed: 46 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,56 @@
11
services:
2+
stats-db:
3+
image: postgres:16.1
4+
container_name: stats-db
5+
ports:
6+
- "5432:5432"
7+
environment:
8+
POSTGRES_DB: statsdb
9+
POSTGRES_USER: postgres
10+
POSTGRES_PASSWORD: password
11+
healthcheck:
12+
test: ["CMD-SHELL", "pg_isready -U postgres"]
13+
interval: 10s
14+
timeout: 5s
15+
retries: 5
16+
217
stats-server:
18+
build: ./statistics/server
19+
container_name: stats-server
320
ports:
421
- "9090:9090"
22+
depends_on:
23+
stats-db:
24+
condition: service_healthy
25+
environment:
26+
STATS_DB_URL: jdbc:postgresql://stats-db:5432/statsdb
27+
STATS_DB_USER: postgres
28+
STATS_DB_PASSWORD: password
529

6-
stats-db:
30+
ewm-db:
731
image: postgres:16.1
32+
container_name: ewm-db
33+
ports:
34+
- "5433:5432"
35+
environment:
36+
POSTGRES_DB: ewmdb
37+
POSTGRES_USER: postgres
38+
POSTGRES_PASSWORD: password
39+
healthcheck:
40+
test: ["CMD-SHELL", "pg_isready -U postgres"]
41+
interval: 10s
42+
timeout: 5s
43+
retries: 5
844

945
ewm-service:
46+
build: ./ewm-service
47+
container_name: ewm-service
1048
ports:
1149
- "8080:8080"
12-
13-
ewm-db:
14-
image: postgres:16.1
50+
depends_on:
51+
ewm-db:
52+
condition: service_healthy
53+
environment:
54+
SPRING_DATASOURCE_URL: jdbc:postgresql://ewm-db:5432/ewmdb
55+
SPRING_DATASOURCE_USERNAME: postgres
56+
SPRING_DATASOURCE_PASSWORD: password

ewm-service/Dockerfile

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
FROM eclipse-temurin:21-jre-jammy
2+
VOLUME /tmp
3+
ARG JAR_FILE=target/*.jar
4+
COPY ${JAR_FILE} app.jar
5+
ENTRYPOINT ["sh", "-c", "java ${JAVA_OPTS} -jar /app.jar"]

ewm-service/pom.xml

Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,40 @@
1+
<?xml version="1.0" encoding="UTF-8"?>
2+
<project xmlns="http://maven.apache.org/POM/4.0.0"
3+
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
4+
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
5+
<modelVersion>4.0.0</modelVersion>
6+
7+
<parent>
8+
<groupId>ru.practicum</groupId>
9+
<artifactId>explore-with-me</artifactId>
10+
<version>0.0.1-SNAPSHOT</version>
11+
<relativePath>../pom.xml</relativePath>
12+
</parent>
13+
14+
<artifactId>ewm-service</artifactId>
15+
16+
<dependencies>
17+
<dependency>
18+
<groupId>org.springframework.boot</groupId>
19+
<artifactId>spring-boot-starter-web</artifactId>
20+
</dependency>
21+
<dependency>
22+
<groupId>org.springframework.boot</groupId>
23+
<artifactId>spring-boot-starter-actuator</artifactId>
24+
</dependency>
25+
<dependency>
26+
<groupId>org.projectlombok</groupId>
27+
<artifactId>lombok</artifactId>
28+
<optional>true</optional>
29+
</dependency>
30+
</dependencies>
31+
32+
<build>
33+
<plugins>
34+
<plugin>
35+
<groupId>org.springframework.boot</groupId>
36+
<artifactId>spring-boot-maven-plugin</artifactId>
37+
</plugin>
38+
</plugins>
39+
</build>
40+
</project>
Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
package ru.practicum.ewm;
2+
3+
import org.springframework.boot.SpringApplication;
4+
import org.springframework.boot.autoconfigure.SpringBootApplication;
5+
6+
@SpringBootApplication
7+
public class EwmServiceApp {
8+
public static void main(String[] args) {
9+
SpringApplication.run(EwmServiceApp.class, args);
10+
}
11+
}
Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,2 @@
1+
server.port=8080
2+
spring.application.name=ewm-service

pom.xml

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,11 @@
2222
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
2323
</properties>
2424

25+
<modules>
26+
<module>statistics</module>
27+
<module>ewm-service</module>
28+
</modules>
29+
2530
<build>
2631
<pluginManagement>
2732
<plugins>

statistics/client/pom.xml

Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,36 @@
1+
<?xml version="1.0" encoding="UTF-8"?>
2+
<project xmlns="http://maven.apache.org/POM/4.0.0"
3+
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
4+
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
5+
<modelVersion>4.0.0</modelVersion>
6+
7+
<parent>
8+
<groupId>ru.practicum</groupId>
9+
<artifactId>statistics</artifactId>
10+
<version>0.0.1-SNAPSHOT</version>
11+
<relativePath>../pom.xml</relativePath>
12+
</parent>
13+
14+
<artifactId>statistics-client</artifactId>
15+
16+
<dependencies>
17+
<dependency>
18+
<groupId>ru.practicum</groupId>
19+
<artifactId>statistics-dto</artifactId>
20+
<version>${project.version}</version>
21+
</dependency>
22+
<dependency>
23+
<groupId>org.springframework.boot</groupId>
24+
<artifactId>spring-boot-starter-web</artifactId>
25+
</dependency>
26+
<dependency>
27+
<groupId>org.apache.httpcomponents.client5</groupId>
28+
<artifactId>httpclient5</artifactId>
29+
</dependency>
30+
<dependency>
31+
<groupId>org.projectlombok</groupId>
32+
<artifactId>lombok</artifactId>
33+
<optional>true</optional>
34+
</dependency>
35+
</dependencies>
36+
</project>
Lines changed: 54 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,54 @@
1+
package ru.practicum.statistics.client;
2+
3+
import org.springframework.beans.factory.annotation.Value;
4+
import org.springframework.boot.web.client.RestTemplateBuilder;
5+
import org.springframework.http.*;
6+
import org.springframework.stereotype.Service;
7+
import org.springframework.web.client.RestTemplate;
8+
import org.springframework.web.util.UriComponentsBuilder;
9+
import ru.practicum.statistics.dto.EndpointHit;
10+
import ru.practicum.statistics.dto.ViewStats;
11+
12+
import java.net.URLEncoder;
13+
import java.nio.charset.StandardCharsets;
14+
import java.time.LocalDateTime;
15+
import java.time.format.DateTimeFormatter;
16+
import java.util.Arrays;
17+
import java.util.List;
18+
19+
@Service
20+
public class StatsClient {
21+
private static final DateTimeFormatter DATE_TIME_FORMATTER = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
22+
23+
private final RestTemplate rest;
24+
private final String serverUrl;
25+
26+
public StatsClient(@Value("${stats-server.url:http://localhost:9090}") String serverUrl,
27+
RestTemplateBuilder builder) {
28+
this.serverUrl = serverUrl;
29+
this.rest = builder.build();
30+
}
31+
32+
public void sendHit(EndpointHit hit) {
33+
HttpEntity<EndpointHit> requestEntity = new HttpEntity<>(hit);
34+
rest.exchange(serverUrl + "/hit", HttpMethod.POST, requestEntity, Void.class);
35+
}
36+
37+
public List<ViewStats> getStats(LocalDateTime start, LocalDateTime end, List<String> uris, boolean unique) {
38+
String startStr = URLEncoder.encode(start.format(DATE_TIME_FORMATTER), StandardCharsets.UTF_8);
39+
String endStr = URLEncoder.encode(end.format(DATE_TIME_FORMATTER), StandardCharsets.UTF_8);
40+
41+
UriComponentsBuilder builder = UriComponentsBuilder.fromHttpUrl(serverUrl + "/stats")
42+
.queryParam("start", startStr)
43+
.queryParam("end", endStr)
44+
.queryParam("unique", unique);
45+
if (uris != null && !uris.isEmpty()) {
46+
for (String uri : uris) {
47+
builder.queryParam("uris", uri);
48+
}
49+
}
50+
51+
ResponseEntity<ViewStats[]> response = rest.getForEntity(builder.build().toUriString(), ViewStats[].class);
52+
return Arrays.asList(response.getBody());
53+
}
54+
}

statistics/dto/pom.xml

Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,31 @@
1+
<?xml version="1.0" encoding="UTF-8"?>
2+
<project xmlns="http://maven.apache.org/POM/4.0.0"
3+
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
4+
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
5+
<modelVersion>4.0.0</modelVersion>
6+
7+
<parent>
8+
<groupId>ru.practicum</groupId>
9+
<artifactId>statistics</artifactId>
10+
<version>0.0.1-SNAPSHOT</version>
11+
<relativePath>../pom.xml</relativePath>
12+
</parent>
13+
14+
<artifactId>statistics-dto</artifactId>
15+
16+
<dependencies>
17+
<dependency>
18+
<groupId>org.projectlombok</groupId>
19+
<artifactId>lombok</artifactId>
20+
<optional>true</optional>
21+
</dependency>
22+
<dependency>
23+
<groupId>com.fasterxml.jackson.core</groupId>
24+
<artifactId>jackson-annotations</artifactId>
25+
</dependency>
26+
<dependency>
27+
<groupId>jakarta.validation</groupId>
28+
<artifactId>jakarta.validation-api</artifactId>
29+
</dependency>
30+
</dependencies>
31+
</project>
Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,30 @@
1+
package ru.practicum.statistics.dto;
2+
3+
import com.fasterxml.jackson.annotation.JsonFormat;
4+
import jakarta.validation.constraints.NotBlank;
5+
import jakarta.validation.constraints.NotNull;
6+
import lombok.AllArgsConstructor;
7+
import lombok.Data;
8+
import lombok.NoArgsConstructor;
9+
10+
import java.time.LocalDateTime;
11+
12+
@Data
13+
@NoArgsConstructor
14+
@AllArgsConstructor
15+
public class EndpointHit {
16+
private Long id;
17+
18+
@NotBlank(message = "Название приложения не может быть пустым")
19+
private String app;
20+
21+
@NotBlank(message = "URI не может быть пустым")
22+
private String uri;
23+
24+
@NotBlank(message = "IP-адрес не может быть пустым")
25+
private String ip;
26+
27+
@NotNull(message = "Временная метка не может быть null")
28+
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
29+
private LocalDateTime timestamp;
30+
}

0 commit comments

Comments
 (0)