diff --git a/src/main/java/com/krylov/refound/controller/StatisticsController.java b/src/main/java/com/krylov/refound/controller/StatisticsController.java new file mode 100644 index 0000000..4a35063 --- /dev/null +++ b/src/main/java/com/krylov/refound/controller/StatisticsController.java @@ -0,0 +1,20 @@ +package com.krylov.refound.controller; + +import com.krylov.refound.entity.Statistics; +import com.krylov.refound.service.StatisticsService; +import lombok.RequiredArgsConstructor; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +@RestController +@RequiredArgsConstructor +@RequestMapping("/api/v1/statistics") +public class StatisticsController { + private final StatisticsService statisticsService; + + @GetMapping + public Statistics get() { + return statisticsService.getStatistics(); + } +} diff --git a/src/main/java/com/krylov/refound/entity/Statistics.java b/src/main/java/com/krylov/refound/entity/Statistics.java new file mode 100644 index 0000000..5412f06 --- /dev/null +++ b/src/main/java/com/krylov/refound/entity/Statistics.java @@ -0,0 +1,20 @@ +package com.krylov.refound.entity; + +import jakarta.persistence.Entity; +import jakarta.persistence.Id; +import jakarta.persistence.Table; +import lombok.Getter; +import lombok.Setter; + +@Entity +@Table(name = "statistics") +@Getter +@Setter +public class Statistics { + @Id + private Long id; + + private Long postsCreated; + + private Long postsFound; +} diff --git a/src/main/java/com/krylov/refound/repository/StatisticsRepository.java b/src/main/java/com/krylov/refound/repository/StatisticsRepository.java new file mode 100644 index 0000000..d768b33 --- /dev/null +++ b/src/main/java/com/krylov/refound/repository/StatisticsRepository.java @@ -0,0 +1,8 @@ +package com.krylov.refound.repository; + +import com.krylov.refound.entity.Statistics; +import org.springframework.data.jpa.repository.JpaRepository; + +public interface StatisticsRepository extends JpaRepository { + +} diff --git a/src/main/java/com/krylov/refound/service/PostService.java b/src/main/java/com/krylov/refound/service/PostService.java index 550419d..86eedc4 100644 --- a/src/main/java/com/krylov/refound/service/PostService.java +++ b/src/main/java/com/krylov/refound/service/PostService.java @@ -35,6 +35,7 @@ import org.springframework.data.domain.Pageable; import org.springframework.data.jpa.domain.Specification; import org.springframework.http.HttpStatus; import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; import org.springframework.web.multipart.MultipartFile; @Service @@ -50,6 +51,7 @@ public class PostService { private final FavoriteRepository favoriteRepository; private final FileStorageService fileStorageService; private final ContentModerationFacade contentModerationFacade; + private final StatisticsService statisticsService; public PostRequest create(PostRequest request, List images) { @@ -75,6 +77,7 @@ public class PostService { imageRepository.save(img); } } + statisticsService.incrementCreated(); return request; } @@ -116,7 +119,7 @@ public class PostService { }); } - public List getById(Long id) { + public List getById(Long id) { List posts = repository.findByUserId(id); List postIds = posts.stream() @@ -150,7 +153,8 @@ public class PostService { .toList(); } - public PostResponse update(Long id, PostRequest request, List images, List existingUrls) { + public PostResponse update(Long id, PostRequest request, List images, + List existingUrls) { Post post = repository.findById(id) .orElseThrow(() -> new ApiException( ErrorCode.NOT_FOUND, @@ -234,6 +238,7 @@ public class PostService { repository.delete(post); } + @Transactional public PostResponse updateStatus(Long id, String statusString) { // Find the post Post post = repository.findById(id) @@ -264,10 +269,13 @@ public class PostService { ); } + if (post.getStatus() != PostStatus.CLOSED && statusString.equals(PostStatus.CLOSED.toString())) { + statisticsService.incrementFound(); + } + // Update status post.setStatus(newStatus); Post updated = repository.save(post); - // Convert to response with like count PostResponse response = mapper.toResponse(updated); diff --git a/src/main/java/com/krylov/refound/service/StatisticsService.java b/src/main/java/com/krylov/refound/service/StatisticsService.java new file mode 100644 index 0000000..06504a6 --- /dev/null +++ b/src/main/java/com/krylov/refound/service/StatisticsService.java @@ -0,0 +1,28 @@ +package com.krylov.refound.service; + +import com.krylov.refound.entity.Statistics; +import com.krylov.refound.repository.StatisticsRepository; +import lombok.RequiredArgsConstructor; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +@Service +@RequiredArgsConstructor +@Transactional +public class StatisticsService { + private final StatisticsRepository repository; + + public void incrementCreated() { + Statistics statistics = repository.findById(1L).orElseThrow(); + statistics.setPostsCreated(statistics.getPostsCreated() + 1); + } + + public void incrementFound() { + Statistics statistics = repository.findById(1L).orElseThrow(); + statistics.setPostsFound(statistics.getPostsFound() + 1); + } + + public Statistics getStatistics() { + return repository.findById(1L).orElseThrow(); + } +} diff --git a/src/main/resources/db/changelog/create/009-create-statistic.yaml b/src/main/resources/db/changelog/create/009-create-statistic.yaml new file mode 100644 index 0000000..8dd5062 --- /dev/null +++ b/src/main/resources/db/changelog/create/009-create-statistic.yaml @@ -0,0 +1,38 @@ +databaseChangeLog: + - changeSet: + id: 009-create-statistics + author: alexandr krylov + changes: + - createTable: + tableName: statistics + columns: + - column: + name: id + type: BIGINT + constraints: + primaryKey: true + nullable: false + - column: + name: posts_created + type: BIGINT + defaultValueNumeric: 0 + constraints: + nullable: false + - column: + name: posts_found + type: BIGINT + defaultValueNumeric: 0 + constraints: + nullable: false + - insert: + tableName: statistics + columns: + - column: + name: id + valueNumeric: 1 + - column: + name: posts_created + valueNumeric: 0 + - column: + name: posts_found + valueNumeric: 0 \ No newline at end of file diff --git a/src/main/resources/db/changelog/db.changelog-master.yaml b/src/main/resources/db/changelog/db.changelog-master.yaml index f330c5f..e046f6d 100644 --- a/src/main/resources/db/changelog/db.changelog-master.yaml +++ b/src/main/resources/db/changelog/db.changelog-master.yaml @@ -15,4 +15,5 @@ databaseChangeLog: - include: { file: db/changelog/add/004-add-fields-user.yaml } - include: { file: db/changelog/add/005-add-user-avatarUrl.yaml } - include: { file: db/changelog/create/008-create-reviews.yaml } - - include: { file: db/changelog/add/013-add-rules_accepted-posts.yaml} \ No newline at end of file + - include: { file: db/changelog/add/013-add-rules_accepted-posts.yaml} + - include: { file: db/changelog/create/009-create-statistic.yaml } \ No newline at end of file