diff --git a/src/main/java/dsr/amm/homebudget/controller/CategoryController.java b/src/main/java/dsr/amm/homebudget/controller/CategoryController.java new file mode 100644 index 0000000..ec53bbd --- /dev/null +++ b/src/main/java/dsr/amm/homebudget/controller/CategoryController.java @@ -0,0 +1,46 @@ +package dsr.amm.homebudget.controller; + + +import dsr.amm.homebudget.data.dto.CategoryDTO; +import dsr.amm.homebudget.service.impl.CategoryService; +import org.springframework.web.bind.annotation.*; + +import java.util.List; + +/** + * @author Trokhin + * + */ + +@RestController +@RequestMapping("/categories") +public class CategoryController { + + private final CategoryService categoryService; + + public CategoryController(CategoryService categoryService) { + this.categoryService = categoryService; + } + + @GetMapping("/all") + public List getAll() { + return categoryService.getAll(); + } + @GetMapping("/{id}") + public CategoryDTO getByID(@PathVariable("id") Long id) { + CategoryDTO categoryDTO = categoryService.get(id); + + if(categoryDTO == null) + throw new IllegalArgumentException(); + else + return categoryDTO; + } + @PostMapping + public CategoryDTO create(@RequestBody CategoryDTO categoryDTO) { + return categoryService.create(categoryDTO); + } + @DeleteMapping("/{id}") + public CategoryDTO delete(@PathVariable("id") Long id) { + return categoryService.delete(id); + } +} diff --git a/src/main/java/dsr/amm/homebudget/data/dto/CategoryDTO.java b/src/main/java/dsr/amm/homebudget/data/dto/CategoryDTO.java new file mode 100644 index 0000000..a5bf3f2 --- /dev/null +++ b/src/main/java/dsr/amm/homebudget/data/dto/CategoryDTO.java @@ -0,0 +1,48 @@ +package dsr.amm.homebudget.data.dto; + + +/** + * @author Trokhin + * + * Поле для ownerId пока не мапится, но оно пока и не нужно, его легко убрать если оно станет точно ненужным, а пока пусть будет. + * Так же из-за невозможности его замапить, все создаваемые категории получаются с ownerId = null. + */ +public class CategoryDTO { + private Long id; + private String name; + private String description; + + private Long ownerId; + + //id + public Long getId() { + return id; + } + public void setId(Long id) { + this.id = id; + } + + //name + public String getName() { + return name; + } + public void setName(String name) { + this.name = name; + } + + //description + public String getDescription() { + return description; + } + public void setDescription(String description) { + this.description = description; + } + + //ownerId + public Long getOwnerId() { + return ownerId; + } + public void setOwnerId(Long ownerId) { + this.ownerId = ownerId; + } +} \ No newline at end of file diff --git a/src/main/java/dsr/amm/homebudget/data/repository/ICategoryRepository.java b/src/main/java/dsr/amm/homebudget/data/repository/ICategoryRepository.java new file mode 100644 index 0000000..f3144f0 --- /dev/null +++ b/src/main/java/dsr/amm/homebudget/data/repository/ICategoryRepository.java @@ -0,0 +1,16 @@ +package dsr.amm.homebudget.data.repository; + +import dsr.amm.homebudget.data.entity.Category; +import org.springframework.data.jpa.repository.JpaRepository; +import org.springframework.data.repository.CrudRepository; +import org.springframework.stereotype.Repository; + +/** + * @author Trokhin + * + * Здесь я решил использовать {@code JpaRepository}, хотя пока это и не сильно оправдано, но в будущем может пригодиться. + */ + +@Repository +public interface ICategoryRepository extends JpaRepository { +} diff --git a/src/main/java/dsr/amm/homebudget/service/ICategoryService.java b/src/main/java/dsr/amm/homebudget/service/ICategoryService.java new file mode 100644 index 0000000..7268caa --- /dev/null +++ b/src/main/java/dsr/amm/homebudget/service/ICategoryService.java @@ -0,0 +1,39 @@ +package dsr.amm.homebudget.service; + +import dsr.amm.homebudget.data.dto.CategoryDTO; + +import java.util.List; + +/** + * @author Trokhin + * + */ +public interface ICategoryService { + + /** + * + * @param categoryDTO - dto, передаваемое в запрос, которое надо создать и поместить в базу данных + * @return - созданный объект + */ + public CategoryDTO create(CategoryDTO categoryDTO); + + /** + * + * @param categoryDTO - который надо удалить + * @return - удаленный объект + */ + public CategoryDTO delete(CategoryDTO categoryDTO); + + /** + * + * @return список объектов хранящихся в базе данных + */ + public List getAll(); + + /** + * + * @param id - id необходимого нам объекта + * @return полученный объект + */ + public CategoryDTO get(Long id); +} diff --git a/src/main/java/dsr/amm/homebudget/service/impl/CategoryService.java b/src/main/java/dsr/amm/homebudget/service/impl/CategoryService.java new file mode 100644 index 0000000..8557ded --- /dev/null +++ b/src/main/java/dsr/amm/homebudget/service/impl/CategoryService.java @@ -0,0 +1,76 @@ +package dsr.amm.homebudget.service.impl; + +import dsr.amm.homebudget.OrikaMapper; +import dsr.amm.homebudget.data.dto.CategoryDTO; +import dsr.amm.homebudget.data.entity.Category; +import dsr.amm.homebudget.data.repository.ICategoryRepository; +import dsr.amm.homebudget.service.ICategoryService; +import org.springframework.stereotype.Service; + +import javax.transaction.Transactional; +import java.util.List; +import java.util.Optional; + +/** + * + * @author Trokhin + */ + +@Service +public class CategoryService implements ICategoryService { + + private final ICategoryRepository categoryRepository; + private final OrikaMapper mapper; + + public CategoryService(ICategoryRepository repository, OrikaMapper mapper) { + this.categoryRepository = repository; + this.mapper = mapper; + } + + @Override + @Transactional + public CategoryDTO create(CategoryDTO categoryDTO) { + Category category = fromDTO(categoryDTO); + + Category savedCategory = categoryRepository.save(category); + return toDTO(savedCategory); + } + + @Override + @Transactional + public CategoryDTO delete(CategoryDTO categoryDTO) { + return delete(categoryDTO.getId()); + } + + public CategoryDTO delete(Long id) { + Optional category = categoryRepository.findById(id); + + category.ifPresent(categoryRepository::delete); + + return toDTO(category.get()); + } + + @Override + @Transactional + public List getAll() { + return toDTO((List) categoryRepository.findAll()); + } + + @Override + @Transactional + public CategoryDTO get(Long id) { + Optional category = categoryRepository.findById(id); + + return category.map(this::toDTO).orElse(null); + } + + private Category fromDTO(CategoryDTO categoryDTO) { + return mapper.map(categoryDTO, Category.class); + } + private CategoryDTO toDTO(Category category) { + return mapper.map(category, CategoryDTO.class); + } + private List toDTO(List list) { + return mapper.mapAsList(list, CategoryDTO.class); + } +} diff --git a/src/main/resources/application.yaml b/src/main/resources/application.yaml index 4e41bce..eb2398f 100644 --- a/src/main/resources/application.yaml +++ b/src/main/resources/application.yaml @@ -6,7 +6,7 @@ spring: generate-ddl: true # Whether to initialize the schema on startup. hibernate.ddl-auto: update datasource: - url: jdbc:postgresql://localhost:5432/home-budget - username: user - password: myPass + url: jdbc:postgresql://localhost:5432/homebudget + username: myuser + password: qwerty driver-class-name: org.postgresql.Driver