Skip to content

Commit

Permalink
Merge pull request #103 from Team-MindWay/100-get-rank-api
Browse files Browse the repository at this point in the history
랭킹 반환 api
  • Loading branch information
ta2ye0n authored Apr 22, 2024
2 parents e67a6cf + e622d31 commit 652cc21
Show file tree
Hide file tree
Showing 13 changed files with 199 additions and 0 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,8 @@
import com.mindway.server.v2.domain.book.repository.BookRepository;
import com.mindway.server.v2.domain.book.service.BookWriteService;
import com.mindway.server.v2.domain.book.util.BookConverter;
import com.mindway.server.v2.domain.rank.entity.Ranks;
import com.mindway.server.v2.domain.rank.repository.RankRepository;
import com.mindway.server.v2.domain.user.entity.User;
import com.mindway.server.v2.domain.user.util.UserUtil;
import com.mindway.server.v2.global.annotation.ServiceWithTransaction;
Expand All @@ -17,11 +19,28 @@ public class BookWriteServiceImpl implements BookWriteService {
private final BookRepository bookRepository;
private final BookConverter bookConverter;
private final UserUtil userUtil;
private final RankRepository rankRepository;

public void execute(BookWriteRequest bookWriteRequest) {
User user = userUtil.getCurrentUser();

Book book = bookConverter.toEntity(bookWriteRequest, user);
accrue(user);
bookRepository.save(book);
}

private void accrue(User user) {
Ranks rank = rankRepository.findByUser(user)
.orElseGet(() -> saveUserRank(user));

rank.accrue();
rankRepository.save(rank);
}

private Ranks saveUserRank (User user) {
return Ranks.builder()
.user(user)
.accrue(0)
.build();
}
}
31 changes: 31 additions & 0 deletions src/main/java/com/mindway/server/v2/domain/rank/entity/Ranks.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,31 @@
package com.mindway.server.v2.domain.rank.entity;

import com.mindway.server.v2.domain.user.entity.User;
import jakarta.persistence.*;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Getter;
import lombok.NoArgsConstructor;

@Entity
@NoArgsConstructor
@AllArgsConstructor
@Builder
@Getter
public class Ranks {

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

private Integer accrue;

@ManyToOne
@JoinColumn(name = "user_id")
private User user;

public void accrue() {
accrue++;
}

}
Original file line number Diff line number Diff line change
@@ -0,0 +1,24 @@
package com.mindway.server.v2.domain.rank.presentation;

import com.mindway.server.v2.domain.rank.presentation.dto.response.RankResponse;
import com.mindway.server.v2.domain.rank.service.GetRankService;
import lombok.RequiredArgsConstructor;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import java.util.List;

@RestController
@RequiredArgsConstructor
@RequestMapping("/api/v2/rank")
public class RankController {
private final GetRankService getRankService;

@GetMapping
public ResponseEntity<List<RankResponse>> getRank() {
List<RankResponse> rank = getRankService.execute();
return ResponseEntity.ok(rank);
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
package com.mindway.server.v2.domain.rank.presentation.dto.response;

import lombok.Builder;
import lombok.Getter;

@Builder
@Getter
public class RankResponse {
private String name;
private Integer accrue;
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
package com.mindway.server.v2.domain.rank.repository;

import com.mindway.server.v2.domain.rank.entity.Ranks;
import com.mindway.server.v2.domain.user.entity.User;
import org.springframework.data.jpa.repository.JpaRepository;

import java.util.List;
import java.util.Optional;

public interface RankRepository extends JpaRepository<Ranks, Long> {
List<Ranks> findTop3ByOrderByAccrueDesc();

Optional<Ranks> findByUser(User user);
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
package com.mindway.server.v2.domain.rank.scheduler;

import com.mindway.server.v2.domain.rank.service.DeleteRankService;
import lombok.RequiredArgsConstructor;
import org.springframework.scheduling.annotation.Scheduled;

@RequiredArgsConstructor
public class RankScheduler {

private final DeleteRankService deleteRankService;

@Scheduled(cron = "0 0 0 1 * *", zone = "Asia/Seoul")
public void run() {
deleteRankService.execute();
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
package com.mindway.server.v2.domain.rank.service;

public interface DeleteRankService {
void execute();
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
package com.mindway.server.v2.domain.rank.service;

import com.mindway.server.v2.domain.rank.presentation.dto.response.RankResponse;

import java.util.List;

public interface GetRankService {
List<RankResponse> execute();
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
package com.mindway.server.v2.domain.rank.service.impl;

import com.mindway.server.v2.domain.rank.repository.RankRepository;
import com.mindway.server.v2.domain.rank.service.DeleteRankService;
import lombok.RequiredArgsConstructor;

@RequiredArgsConstructor
public class DeleteRankServiceImpl implements DeleteRankService {

private final RankRepository rankRepository;

public void execute() {
rankRepository.deleteAll();
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,28 @@
package com.mindway.server.v2.domain.rank.service.impl;

import com.mindway.server.v2.domain.rank.entity.Ranks;
import com.mindway.server.v2.domain.rank.presentation.dto.response.RankResponse;
import com.mindway.server.v2.domain.rank.repository.RankRepository;
import com.mindway.server.v2.domain.rank.service.GetRankService;
import com.mindway.server.v2.domain.rank.util.RankConverter;
import com.mindway.server.v2.global.annotation.ServiceWithReadOnlyTransaction;
import lombok.RequiredArgsConstructor;

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

@ServiceWithReadOnlyTransaction
@RequiredArgsConstructor
public class GetRankServiceImpl implements GetRankService {

private final RankRepository rankRepository;
private final RankConverter rankConverter;

public List<RankResponse> execute() {
List<Ranks> ranks = rankRepository.findTop3ByOrderByAccrueDesc();

return ranks.stream()
.map(rankConverter::toDto)
.collect(Collectors.toList());
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
package com.mindway.server.v2.domain.rank.util;

import com.mindway.server.v2.domain.rank.entity.Ranks;
import com.mindway.server.v2.domain.rank.presentation.dto.response.RankResponse;

public interface RankConverter {
RankResponse toDto (Ranks rank);
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
package com.mindway.server.v2.domain.rank.util.impl;

import com.mindway.server.v2.domain.rank.entity.Ranks;
import com.mindway.server.v2.domain.rank.presentation.dto.response.RankResponse;
import com.mindway.server.v2.domain.rank.util.RankConverter;
import org.springframework.stereotype.Component;

@Component
public class RankConverterImpl implements RankConverter {

public RankResponse toDto(Ranks rank) {
return RankResponse.builder()
.name(rank.getUser().getName())
.accrue(rank.getAccrue())
.build();
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -78,6 +78,8 @@ public SecurityFilterChain filterChain(HttpSecurity http) throws Exception {
// event
.requestMatchers(HttpMethod.POST, "/api/v2/event").hasAnyAuthority(Authority.ROLE_TEACHER.name(), Authority.ROLE_HELPER.name())

// rank
.requestMatchers(HttpMethod.GET, "/api/v2/rank").authenticated()

.anyRequest().authenticated()
)
Expand Down

0 comments on commit 652cc21

Please sign in to comment.