Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

랭킹 반환 api #103

Merged
merged 12 commits into from
Apr 22, 2024
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();
}
}
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
Loading