Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
23 commits
Select commit Hold shift + click to select a range
1bfbbb4
Update application properties for environment variables and enhance l…
Naz1anmak Oct 7, 2025
168bbfb
Update application properties for environment variables and enhance l…
Naz1anmak Oct 7, 2025
942ffcd
Add implementation Dto
Naz1anmak Oct 13, 2025
a65d3f7
Merge pull request #6 from Naz1anmak/main_svc_dto
Naz1anmak Oct 13, 2025
8e8aef6
Merge remote-tracking branch 'origin/main_svc' into main_svc
Oct 13, 2025
6b86d3d
The sections of the final task 17 of the second part have been comple…
Oct 14, 2025
8c27b64
Edits made after the review
Oct 15, 2025
dd57998
Enhance logging, refactor exception handling, and update application …
Naz1anmak Oct 15, 2025
da4726b
Merge pull request #7 from Naz1anmak/main_svc_ivan
Naz1anmak Oct 15, 2025
39a8e98
Implement category management: add create, update, delete, and retrie…
Mult1k33 Oct 16, 2025
c5d91a5
Merge pull request #8 from Naz1anmak/main_svc_categories
Naz1anmak Oct 16, 2025
22be17e
Refactor controllers to enhance validation and logging; update applic…
Naz1anmak Oct 17, 2025
a9fbde9
Merge pull request #10 from Naz1anmak/main_svc_requests
internet-prodashi Oct 17, 2025
cb31116
Refactor error handling and validation messages; update DTOs for impr…
Naz1anmak Oct 17, 2025
432589b
The assembly module has been completed, statistics have been corrected
Oct 17, 2025
7771179
The assembly module has been completed, statistics have been corrected
Oct 17, 2025
1a1bfb6
Merge remote-tracking branch 'origin/main_svc_compilations' into main…
Oct 18, 2025
b5395fa
Edits have been made based on the review
Oct 18, 2025
b66cec6
Refactor controller methods for improved readability; update paramete…
Naz1anmak Oct 18, 2025
78e5c8f
Merge pull request #11 from Naz1anmak/main_svc_compilations
Naz1anmak Oct 18, 2025
2918d57
Refactor compilation-related methods for improved clarity; update log…
Naz1anmak Oct 18, 2025
283cb7f
Refactor date-time handling by introducing a centralized DateTimeCons…
Naz1anmak Oct 21, 2025
b49e390
The 3rd stage of the final task has been completed - the feature (Eve…
Oct 22, 2025
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
1 change: 1 addition & 0 deletions .github/copilot-instructions.md
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
Комментарии в Pull Request обязательно должны быть на русском языке!
1 change: 1 addition & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -20,3 +20,4 @@ target/
*.iws
*.iml
*.ipr
/.run/
11 changes: 11 additions & 0 deletions .run/Deployment compose-local.run.xml
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
<component name="ProjectRunConfigurationManager">
<configuration default="false" name="Deployment compose-local" type="docker-deploy" factoryName="docker-compose.yml" server-name="Docker">
<deployment type="docker-compose.yml">
<settings>
<option name="envFilePath" value="" />
<option name="sourceFilePath" value="compose-local.yaml" />
</settings>
</deployment>
<method v="2" />
</configuration>
</component>
11 changes: 11 additions & 0 deletions .run/MainApplication (local).run.xml
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
<component name="ProjectRunConfigurationManager">
<configuration default="false" name="MainApplication (local)" type="Application" factoryName="Application">
<option name="ALTERNATIVE_JRE_PATH" value="21"/>
<option name="MAIN_CLASS_NAME" value="ru.practicum.MainApplication"/>
<module name="main-service"/>
<option name="VM_PARAMETERS" value="-Dspring.profiles.active=local"/>
<method v="2">
<option name="Make" enabled="true"/>
</method>
</configuration>
</component>
Original file line number Diff line number Diff line change
@@ -1,9 +1,8 @@
<component name="ProjectRunConfigurationManager">
<configuration default="false" name="MainApplication (docker)" type="Application" factoryName="Application">
<option name="ALTERNATIVE_JRE_PATH" value="23" />
<option name="ALTERNATIVE_JRE_PATH_ENABLED" value="true" />
<configuration default="false" name="MainApplication" type="Application" factoryName="Application">
<option name="MAIN_CLASS_NAME" value="ru.practicum.MainApplication" />
<module name="main-service" />
<option name="VM_PARAMETERS" value="-Dspring.profiles.active=test" />
<method v="2">
<option name="Make" enabled="true" />
</method>
Expand Down
11 changes: 0 additions & 11 deletions .run/StatApplication (docker).run.xml

This file was deleted.

11 changes: 11 additions & 0 deletions .run/StatApplication (local).run.xml
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
<component name="ProjectRunConfigurationManager">
<configuration default="false" name="StatApplication (local)" type="Application" factoryName="Application">
<option name="ALTERNATIVE_JRE_PATH" value="21"/>
<option name="MAIN_CLASS_NAME" value="ru.practicum.StatApplication"/>
<module name="stats-server"/>
<option name="VM_PARAMETERS" value="-Dspring.profiles.active=local"/>
<method v="2">
<option name="Make" enabled="true"/>
</method>
</configuration>
</component>
19 changes: 9 additions & 10 deletions .run/StatApplication.run.xml
Original file line number Diff line number Diff line change
@@ -1,12 +1,11 @@
<component name="ProjectRunConfigurationManager">
<configuration default="false" name="StatApplication" type="Application" factoryName="Application">
<option name="ALTERNATIVE_JRE_PATH" value="23" />
<option name="ALTERNATIVE_JRE_PATH_ENABLED" value="true" />
<option name="MAIN_CLASS_NAME" value="ru.practicum.StatApplication" />
<module name="stats-server" />
<option name="VM_PARAMETERS" value="-Dspring.profiles.active=test" />
<method v="2">
<option name="Make" enabled="true" />
</method>
</configuration>
<configuration default="false" name="StatApplication" type="Application" factoryName="Application">
<option name="ALTERNATIVE_JRE_PATH" value="21"/>
<option name="MAIN_CLASS_NAME" value="ru.practicum.StatApplication"/>
<module name="stats-server"/>
<option name="VM_PARAMETERS" value="-Dspring.profiles.active=test"/>
<method v="2">
<option name="Make" enabled="true"/>
</method>
</configuration>
</component>
57 changes: 57 additions & 0 deletions README.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,57 @@
# Комментарии — API (техническое задание)

Краткое описание: набор REST-эндпоинтов для управления комментариями. Три уровня доступа:
- Admin — администраторские операции (удаление комментария по его идентификатору).
- Private — операции пользователя над собственными комментариями (создать, изменить, удалить, получить все свои комментарии).
- Public — публичный доступ (просмотр комментариев конкретного события).

---

## AdminCommentController
Цель: операции управления всеми комментариями.

- DELETE `/admin/comments/{commentId}`
- Описание: удалить комментарий (жёсткое удаление) по его идентификатору.
- Ограничения: без модерации комментариев.
- Права: только админ.
- Ответ: `204 No Content` при успехе.

---

## PrivateCommentController
Цель: пользовательские операции над собственными комментариями.

- POST `/users/{userId}/comments/{eventId}`
- Описание: создать новый комментарий от имени пользователя `userId`.
- Ограничения: длина комментария 5000 символов, проверка существования идентификаторов события и пользователя.
- Права: только аутентифицированный пользователь.
- Ответ: `201 Created` с созданным объектом.

- PATCH `/users/{userId}/comments/{eventId}/{commentId}`
- Описание: обновить собственный комментарий.
- Ограничения: длина комментария 5000 символов, проверка существования идентификаторов комментария, события и пользователя.
- Права: только автор комментария.
- Ответ: обновлённый объект комментария.

- DELETE `/users/{userId}/comments/{commentId}`
- Описание: удалить собственный комментарий (жёсткое удаление).
- Ограничения: проверка существования идентификаторов комментария и пользователя.
- Права: только автор комментария.
- Ответ: `204 No Content`.

- GET `/users/{userId}/comments`
- Описание: получить список собственных комментариев.
- Ограничения: организовать пагинацию (по умолчанию по 10 комментариев на странице).
- Права: только аутентифицированный пользователь.
- Ответ: список комментариев.

---

## PublicCommentController
Цель: публичный просмотр комментариев.

- GET `/comments/event/{eventId}`
- Описание: получить публичный список комментариев к событию.
- Ограничения: организовать пагинацию (по умолчанию по 10 комментариев на странице).
- Доступ: публичный (без авторизации).
- Ответ: список публичных комментариев.
31 changes: 31 additions & 0 deletions compose-local.yaml
Original file line number Diff line number Diff line change
@@ -0,0 +1,31 @@
name: java-explore-with-me-local
services:
stats-db-local:
image: postgres:16.1
container_name: stats_db_local
ports:
- "6542:5432"
environment:
- POSTGRES_DB=statDB_local
- POSTGRES_USER=localuser
- POSTGRES_PASSWORD=localpass
healthcheck:
test: pg_isready -q -d $$POSTGRES_DB -U $$POSTGRES_USER
timeout: 5s
interval: 5s
retries: 10

main-db-local:
image: postgres:16.1
container_name: main_db_local
ports:
- "6543:5432"
environment:
- POSTGRES_DB=mainDB_local
- POSTGRES_USER=localuser
- POSTGRES_PASSWORD=localpass
healthcheck:
test: pg_isready -q -d $$POSTGRES_DB -U $$POSTGRES_USER
timeout: 5s
interval: 5s
retries: 10
19 changes: 11 additions & 8 deletions compose.yaml
Original file line number Diff line number Diff line change
@@ -1,3 +1,4 @@
name: java-explore-with-me
services:
stats-db:
image: postgres:16.1
Expand All @@ -14,13 +15,13 @@ services:
interval: 5s
retries: 10

main-db:
ewm-db:
image: postgres:16.1
container_name: main_db
container_name: ewm_db
ports:
- "6542:5432"
- "5433:5432"
environment:
- POSTGRES_DB=mainDB
- POSTGRES_DB=ewmDB
- POSTGRES_USER=dbuser
- POSTGRES_PASSWORD=12345
healthcheck:
Expand All @@ -41,14 +42,16 @@ services:
- SPRING_DATASOURCE_USERNAME=dbuser
- SPRING_DATASOURCE_PASSWORD=12345

main-service:
ewm-service:
build: ./main-service
container_name: main_service
container_name: ewm_service
ports:
- "8080:8080"
depends_on:
- main-db
- stats-server
- ewm-db
environment:
- SPRING_DATASOURCE_URL=jdbc:postgresql://main-db:5432/mainDB
- SPRING_DATASOURCE_URL=jdbc:postgresql://ewm-db:5432/ewmDB
- SPRING_DATASOURCE_USERNAME=dbuser
- SPRING_DATASOURCE_PASSWORD=12345
- STATS_SERVER_URL=http://stats-server:9090
28 changes: 15 additions & 13 deletions main-service/pom.xml
Original file line number Diff line number Diff line change
Expand Up @@ -15,50 +15,48 @@
<name>Main Service</name>

<dependencies>
<dependency>
<groupId>ru.practicum</groupId>
<artifactId>stats-client</artifactId>
<version>0.0.1-SNAPSHOT</version>
<scope>compile</scope>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</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-validation</artifactId>
</dependency>

<dependency>
<groupId>org.postgresql</groupId>
<artifactId>postgresql</artifactId>
<scope>runtime</scope>
</dependency>

<dependency>
<groupId>ru.practicum</groupId>
<artifactId>stats-client</artifactId>
<version>0.0.1-SNAPSHOT</version>
<scope>compile</scope>
</dependency>

<dependency>
<groupId>com.h2database</groupId>
<artifactId>h2</artifactId>
<scope>runtime</scope>
</dependency>

<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<scope>provided</scope>
</dependency>

<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>
<dependency>
<groupId>org.mapstruct</groupId>
<artifactId>mapstruct</artifactId>
<version>${mapstruct.version}</version>
</dependency>
</dependencies>

<build>
Expand All @@ -67,6 +65,10 @@
<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>

Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,40 @@
package ru.practicum.category.controller;

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

@Slf4j
@RestController
@RequestMapping("/admin/categories")
@RequiredArgsConstructor
public class AdminCategoryController {
private final CategoryService categoryService;

@PostMapping
@ResponseStatus(HttpStatus.CREATED)
public CategoryDto createCategory(@RequestBody @Valid NewCategoryDto newCategoryDto) {
log.debug("Controller: createCategory data {}", newCategoryDto);
return categoryService.createCategory(newCategoryDto);
}

@DeleteMapping("/{categoryId}")
@ResponseStatus(HttpStatus.NO_CONTENT)
public void deleteCategory(@PathVariable @Positive Long categoryId) {
log.debug("Controller: deleteCategory id={}", categoryId);
categoryService.deleteCategory(categoryId);
}

@PatchMapping("/{categoryId}")
public CategoryDto updateCategory(@PathVariable @Positive Long categoryId,
@RequestBody @Valid NewCategoryDto newCategoryDto) {
log.debug("Controller: updateCategory id={}, data={}", categoryId, newCategoryDto);
return categoryService.updateCategory(categoryId, newCategoryDto);
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,37 @@
package ru.practicum.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.category.dto.CategoryDto;
import ru.practicum.category.service.CategoryService;

import java.util.List;

@Slf4j
@RestController
@RequestMapping("/categories")
@RequiredArgsConstructor
public class PublicCategoryController {
private final CategoryService categoryService;

@GetMapping
public List<CategoryDto> getCategories(
@RequestParam(defaultValue = "0") @PositiveOrZero Integer from,
@RequestParam(defaultValue = "10") @Positive Integer size) {
int page = from / size;
Pageable pageable = PageRequest.of(page, size);
log.debug("Controller: getCategories with from={}, size={}", from, size);
return categoryService.getCategories(pageable);
}

@GetMapping("/{categoryId}")
public CategoryDto getCategoryById(@PathVariable @Positive Long categoryId) {
log.debug("Controller: getCategoryById with id={}", categoryId);
return categoryService.getCategoryById(categoryId);
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
package ru.practicum.category.dto;

import jakarta.validation.constraints.NotBlank;
import jakarta.validation.constraints.Size;

public record CategoryDto(
Long id,

@NotBlank(message = "Название категории не может быть пустым")
@Size(min = 1, max = 50, message = "Название категории должно содержать от {min} до {max} символов")
String name
) {
}
Loading