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
75 changes: 46 additions & 29 deletions docker-compose.yml
Original file line number Diff line number Diff line change
@@ -1,59 +1,76 @@
services:
stats-server:
build:
context: ./stat-svc/stat-server
context: ./stat-svc/stats-server
image: stats-server
container_name: stat-server
container_name: stats-server
ports:
- "9090:9090"
depends_on:
- statdb
statdb:
condition: service_healthy
environment:
- SPRING_DATASOURCE_URL=jdbc:postgresql://statdb:5432/statdb
- SPRING_DATASOURCE_USERNAME=admin
- SPRING_DATASOURCE_PASSWORD=admin

statdb:
image: postgres:16.1
container_name: statdb
ports:
- "6541:5432"
environment:
- POSTGRES_PASSWORD=admin
- POSTGRES_USER=admin
- POSTGRES_DB=statdb
- STATS_SERVER_URL=http://stats-server:9090
healthcheck:
test: pg_isready -q -d $$POSTGRES_DB -U $$POSTGRES_USER
timeout: 5s
interval: 5s
retries: 10
test: [ "CMD-SHELL", "curl -f http://localhost:9090/actuator/health | grep UP || exit 1" ]
interval: 10s
timeout: 10s
retries: 5

ewm-service:
build:
context: ./ewm-main-svc
image: ewm-service
container_name: ewm-service
ports:
- "8080:8080"
environment:
SPRING_DATASOURCE_URL: jdbc:postgresql://ewm-db:5432/ewm-db
SPRING_DATASOURCE_URL: jdbc:postgresql://ewmdb:5432/ewmdb
SPRING_DATASOURCE_USERNAME: admin
SPRING_DATASOURCE_PASSWORD: admin
ports:
- "8080:8080"
SPRING_PROFILES_ACTIVE: postgres
STATS_SERVER_URL: http://stats-server:9090
depends_on:
- stats-server
- ewm-db
ewmdb:
condition: service_healthy
stats-server:
condition: service_healthy
healthcheck:
test: [ "CMD-SHELL", "curl -f http://localhost:8080/actuator/health | grep UP || exit 1" ]
interval: 10s
timeout: 10s
retries: 5

statdb:
image: postgres:16.1
container_name: statdb
ports:
- "6541:5432"
environment:
- POSTGRES_PASSWORD=admin
- POSTGRES_USER=admin
- POSTGRES_DB=statdb
healthcheck:
test: [ "CMD-SHELL", "pg_isready -U admin -d statdb" ]
interval: 10s
timeout: 10s
retries: 5

ewm-db:
ewmdb:
image: postgres:16.1
container_name: ewm-db
container_name: ewmdb
ports:
- "6542:5432"
environment:
- POSTGRES_DB=ewm-db
- POSTGRES_DB=ewmdb
- POSTGRES_USER=admin
- POSTGRES_PASSWORD=admin
healthcheck:
test: pg_isready -q -d $$POSTGRES_DB -U $$POSTGRES_USER
timeout: 5s
interval: 5s
retries: 10
test: [ "CMD-SHELL", "pg_isready -U admin -d ewmdb" ]
interval: 10s
timeout: 10s
retries: 5

89 changes: 67 additions & 22 deletions ewm-main-svc/pom.xml
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,7 @@
</parent>

<artifactId>ewm-main-svc</artifactId>
<version>0.0.1-SNAPSHOT</version>

<properties>
<maven.compiler.source>22</maven.compiler.source>
Expand All @@ -19,32 +20,76 @@

<dependencies>

<dependency>
<groupId>org.apache.httpcomponents.client5</groupId>
<artifactId>httpclient5</artifactId>
</dependency>
<dependency>
<groupId>ru.practicum</groupId>
<artifactId>stat-client</artifactId>
<version>0.0.1-SNAPSHOT</version>
<scope>compile</scope>
</dependency>

<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
<dependency>
<groupId>org.postgresql</groupId>
<artifactId>postgresql</artifactId>
<scope>runtime</scope>
</dependency>

<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>com.h2database</groupId>
<artifactId>h2</artifactId>
<scope>runtime</scope>
</dependency>

<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-configuration-processor</artifactId>
<optional>true</optional>
</dependency>
<dependency>
<groupId>org.apache.httpcomponents.client5</groupId>
<artifactId>httpclient5</artifactId>
</dependency>

<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>

<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>

<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>

<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<optional>true</optional>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-configuration-processor</artifactId>
<optional>true</optional>
</dependency>

<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>

<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<optional>true</optional>
</dependency>

</dependencies>

<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
</plugin>
</plugins>
</build>

</project>
2 changes: 2 additions & 0 deletions ewm-main-svc/src/main/java/ru/practicum/ewm/MainApp.java
Original file line number Diff line number Diff line change
Expand Up @@ -2,8 +2,10 @@

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.annotation.ComponentScan;

@SpringBootApplication
@ComponentScan({"ru.practicum.ewm", "ru.practicum.stat"})
public class MainApp {
public static void main(String[] args) {
SpringApplication.run(MainApp.class, args);
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
package ru.practicum.ewm.category;

import org.springframework.data.jpa.repository.JpaRepository;
import ru.practicum.ewm.category.model.Category;

public interface CategoryRepository extends JpaRepository<Category,Long> {

boolean existsByName(String name);

}
Original file line number Diff line number Diff line change
@@ -0,0 +1,41 @@
package ru.practicum.ewm.category.controller;

import jakarta.validation.Valid;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.http.HttpStatus;
import org.springframework.web.bind.annotation.*;
import ru.practicum.ewm.category.dto.CategoryDto;
import ru.practicum.ewm.category.dto.NewCategoryDto;
import ru.practicum.ewm.category.dto.UpdateCategoryDto;
import ru.practicum.ewm.category.service.CategoryService;

@Slf4j
@RestController
@RequestMapping("/admin/categories")
@RequiredArgsConstructor
public class AdminCategoryController {

private final CategoryService service;

@ResponseStatus(HttpStatus.CREATED)
@PostMapping
public CategoryDto create(@RequestBody @Valid NewCategoryDto newCategoryDto) {
log.info("POST запрос на создание категории: {}", newCategoryDto);
return service.create(newCategoryDto);
}

@PatchMapping("/{catId}")
public CategoryDto update(@PathVariable Long catId,
@RequestBody @Valid UpdateCategoryDto updateCategoryDto) {
log.info("PATCH запрос на обновление категории c id: {}", catId);
return service.update(catId, updateCategoryDto);
}

@ResponseStatus(HttpStatus.NO_CONTENT)
@DeleteMapping("/{catId}")
public void delete(@PathVariable Long catId) {
log.info("DELETE запрос на удаление категории с id: {}", catId);
service.delete(catId);
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,37 @@
package ru.practicum.ewm.category.controller;

import jakarta.validation.constraints.Positive;
import jakarta.validation.constraints.PositiveOrZero;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.data.domain.PageRequest;
import org.springframework.data.domain.Pageable;
import org.springframework.web.bind.annotation.*;
import ru.practicum.ewm.category.dto.CategoryDto;
import ru.practicum.ewm.category.service.CategoryService;

import java.util.List;

@Slf4j
@RestController
@RequestMapping("/categories")
@RequiredArgsConstructor
public class PublicCategoryController {

private final CategoryService service;

@GetMapping("/{catId}")
public CategoryDto getCategoryById(@PathVariable Long catId) {
log.info("GET запрос на получение категории c id: {}", catId);
return service.getCategoryById(catId);
}

@GetMapping
public List<CategoryDto> getAllCategories(@RequestParam(defaultValue = "0") @PositiveOrZero int from,
@RequestParam(defaultValue = "10") @Positive int size) {
log.info("GET запрос на получение списка всех категорий (from={}, size={})", from, size);
int page = from / size;
Pageable pageable = PageRequest.of(page, size);
return service.getAllCategories(pageable);
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
package ru.practicum.ewm.category.dto;

import lombok.*;
import lombok.experimental.FieldDefaults;

@Data
@FieldDefaults(level = AccessLevel.PRIVATE)
@Builder
@NoArgsConstructor
@AllArgsConstructor
public class CategoryDto {
Long id;
String name;
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
package ru.practicum.ewm.category.dto;

import jakarta.validation.constraints.NotBlank;
import jakarta.validation.constraints.Size;
import lombok.*;
import lombok.experimental.FieldDefaults;

@Data
@FieldDefaults(level = AccessLevel.PRIVATE)
@Builder
@NoArgsConstructor
@AllArgsConstructor
public class NewCategoryDto {
@NotBlank(message = "Название категории должно быть указано!")
@Size(min = 1, max = 50, message = "Длина name должна составлять от 1 до 50 символов!")
String name;
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
package ru.practicum.ewm.category.dto;

import jakarta.validation.constraints.Size;
import lombok.*;
import lombok.experimental.FieldDefaults;

@Data
@FieldDefaults(level = AccessLevel.PRIVATE)
@Builder
@NoArgsConstructor
@AllArgsConstructor
public class UpdateCategoryDto {
@Size(min = 1, max = 50, message = "Длина name должна составлять от 1 до 50 символов!")
String name;
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
package ru.practicum.ewm.category.mapper;

import ru.practicum.ewm.category.dto.CategoryDto;
import ru.practicum.ewm.category.dto.NewCategoryDto;
import ru.practicum.ewm.category.model.Category;


public class CategoryMapper {
public static Category toNewCategoryFromDto(NewCategoryDto newCategoryDto) {
return Category.builder()
.name(newCategoryDto.getName())
.build();
}

public static CategoryDto toCategoryDto(Category category) {
return CategoryDto.builder()
.id(category.getId())
.name(category.getName())
.build();
}
}
Loading