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
4 changes: 4 additions & 0 deletions core/main-service/Dockerfile
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
FROM amazoncorretto:21-alpine
LABEL authors="Слава"
COPY target/*.jar app.jar
ENTRYPOINT ["java", "-jar", "app.jar"]
137 changes: 137 additions & 0 deletions core/main-service/pom.xml
Original file line number Diff line number Diff line change
@@ -0,0 +1,137 @@
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns="http://maven.apache.org/POM/4.0.0"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>

<parent>
<groupId>ru.practicum</groupId>
<artifactId>core</artifactId>
<version>0.0.1-SNAPSHOT</version>
</parent>

<artifactId>main-service</artifactId>

<dependencies>

<!-- INTERNAL DEPS -->

<dependency>
<groupId>ru.practicum</groupId>
<artifactId>stats-client</artifactId>
</dependency>

<!-- SYSTEM TOOL DEPS -->

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

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

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

<!-- REST DEPS -->

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

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

<dependency>
<groupId>javax.validation</groupId>
<artifactId>validation-api</artifactId>
<version>2.0.1.Final</version>
</dependency>

<!-- DATABASE DEPS -->

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

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

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

<!-- CLOUD DEPS -->

<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>

<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-config</artifactId>
</dependency>

<dependency>
<groupId>org.springframework.retry</groupId>
<artifactId>spring-retry</artifactId>
</dependency>

<!-- TEST DEPS -->

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

</dependencies>

<build>
<plugins>

<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<configuration>
<excludes>
<exclude>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
</exclude>
</excludes>
</configuration>
</plugin>

<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<configuration>
<annotationProcessorPaths>
<path>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
</path>
</annotationProcessorPaths>
</configuration>
</plugin>

</plugins>
</build>

</project>
14 changes: 14 additions & 0 deletions core/main-service/src/main/java/ru/practicum/Main.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
package ru.practicum;


import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.scheduling.annotation.EnableScheduling;

@EnableScheduling
@SpringBootApplication
public class Main {
public static void main(String[] args) {
SpringApplication.run(Main.class, args);
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,53 @@
package ru.practicum.category.controller;

import jakarta.validation.constraints.Positive;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.http.HttpStatus;
import org.springframework.validation.BindingResult;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*;
import ru.practicum.category.dto.CategoryDto;
import ru.practicum.category.service.CategoryAdminService;
import ru.practicum.validation.CreateOrUpdateValidator;

@RestController
@RequiredArgsConstructor
@Validated
@RequestMapping(path = "/admin/categories")
@Slf4j
public class CategoryAdminController {

private final CategoryAdminService categoryAdminService;

@PostMapping
@ResponseStatus(HttpStatus.CREATED)
public CategoryDto addCategory(
@RequestBody @Validated(CreateOrUpdateValidator.Create.class)
CategoryDto requestCategory,
BindingResult bindingResult
) {
log.info("Calling the POST request to /admin/categories endpoint");
if (bindingResult.hasErrors()) {
log.error("Validation error with category name");
throw new IllegalArgumentException("Validation failed");
}
return categoryAdminService.createCategory(requestCategory);
}

@DeleteMapping("/{catId}")
@ResponseStatus(HttpStatus.NO_CONTENT)
public void deleteCategories(@PathVariable @Positive Long catId) {
log.info("Calling the DELETE request to /admin/categories/{catId} endpoint");
categoryAdminService.deleteCategory(catId);
}

@PatchMapping("/{catId}")
public CategoryDto updateCategory(
@PathVariable Long catId,
@RequestBody @Validated(CreateOrUpdateValidator.Update.class) CategoryDto categoryDto
) {
log.info("Calling the PATCH request to /admin/categories/{catId} endpoint");
return categoryAdminService.updateCategory(catId, categoryDto);
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,40 @@
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.http.ResponseEntity;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*;
import ru.practicum.category.dto.CategoryDto;
import ru.practicum.category.service.CategoryPublicService;

import java.util.List;

@RestController
@RequiredArgsConstructor
@Validated
@RequestMapping(path = "/categories")
@Slf4j
public class CategoryPublicController {

private final CategoryPublicService service;

@GetMapping
public ResponseEntity<List<CategoryDto>> readAllCategories(
@RequestParam(defaultValue = "0") @PositiveOrZero int from,
@RequestParam(defaultValue = "10") @Positive int size
) {
log.info("Calling the POST request to - /categories - endpoint");
return ResponseEntity.ok(service.readAllCategories(from, size));
}

@GetMapping("/{catId}")
public ResponseEntity<CategoryDto> readCategoryById(
@PathVariable Long catId
) {
log.info("Calling the GET request to - /categories/{catId} - endpoint");
return ResponseEntity.ok(service.readCategoryById(catId));
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,22 @@
package ru.practicum.category.dto;

import jakarta.validation.constraints.NotBlank;
import jakarta.validation.constraints.Size;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
import ru.practicum.validation.CreateOrUpdateValidator;

@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
public class CategoryDto {

private Long id;

@NotBlank(groups = {CreateOrUpdateValidator.Create.class, CreateOrUpdateValidator.Update.class})
@Size(min = 1, max = 50, groups = {CreateOrUpdateValidator.Create.class, CreateOrUpdateValidator.Update.class})
private String name;
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,28 @@
package ru.practicum.category.mapper;

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

import java.util.List;
import java.util.stream.Collectors;

public class CategoryMapper {

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

public static Category toCategories(CategoryDto categoryDto) {
return Category.builder()
.name(categoryDto.getName())
.build();
}

public static List<CategoryDto> toListCategoriesDto(List<Category> list) {
return list.stream().map(CategoryMapper::toCategoryDto).collect(Collectors.toList());
}

}
Original file line number Diff line number Diff line change
@@ -0,0 +1,34 @@
package ru.practicum.category.model;

import jakarta.persistence.*;
import jakarta.validation.constraints.NotEmpty;
import jakarta.validation.constraints.Size;
import lombok.*;

@Getter
@Setter
@Builder
@Entity
@AllArgsConstructor
@NoArgsConstructor
@Table(name = "categories")
public class Category {

@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "id")
private Long id;

@Column(name = "cat_name")
@Size(min = 1, max = 50)
@NotEmpty
private String name;

@Override
public String toString() {
return "Categories{" +
"id=" + id +
", name='" + name + '\'' +
'}';
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
package ru.practicum.category.repository;

import org.springframework.data.jpa.repository.JpaRepository;
import ru.practicum.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,13 @@
package ru.practicum.category.service;

import ru.practicum.category.dto.CategoryDto;

public interface CategoryAdminService {

CategoryDto createCategory(CategoryDto requestCategory);

void deleteCategory(Long catId);

CategoryDto updateCategory(Long catId, CategoryDto categoryDto);

}
Loading