Skip to content

Commit

Permalink
Merge branch 'refs/heads/Develop' into Prod
Browse files Browse the repository at this point in the history
  • Loading branch information
momnpa333 committed Nov 9, 2024
2 parents 629f3d8 + 480d147 commit b0be59b
Show file tree
Hide file tree
Showing 26 changed files with 326 additions and 52 deletions.
Original file line number Diff line number Diff line change
@@ -1,9 +1,7 @@
package supernova.whokie.alarm.constants;

public final class AlarmConstants {
public static final Long SSE_TIMEOUT = 1000L * 60L * 10L;
public static final String PROFILE_BG_IMAGE_FOLRDER = "profile_bg";
public static final String DEFAULT_PROFILE_BACKGROUND_IMAGE_URL = PROFILE_BG_IMAGE_FOLRDER + "/default.png";
public static final Long SSE_TIMEOUT = 1000L * 60L;

private AlarmConstants() {

Expand Down
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
package supernova.whokie.alarm.service;

import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Service;
import org.springframework.web.servlet.mvc.method.annotation.SseEmitter;
import supernova.whokie.alarm.constants.AlarmConstants;
Expand All @@ -9,6 +10,7 @@
import java.io.IOException;
import java.util.concurrent.ConcurrentHashMap;

@Slf4j
@Service
@RequiredArgsConstructor
public class AlarmService {
Expand All @@ -17,6 +19,7 @@ public class AlarmService {
public SseEmitter connect(Long userId) {
SseEmitter emitter = new SseEmitter(AlarmConstants.SSE_TIMEOUT);
emitters.put(userId, emitter);
log.info("Connected to Alarm UserId: {}", userId);

// SseEmitter가 complate 됐을 경우
emitter.onCompletion(() -> emitters.remove(userId));
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
package supernova.whokie.global.annotation;

import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;

@Target(ElementType.PARAMETER)
@Retention(RetentionPolicy.RUNTIME)
public @interface AdminAuthenticate {

}
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,7 @@
import supernova.whokie.global.interceptor.JwtInterceptor;
import supernova.whokie.global.auth.JwtProvider;
import supernova.whokie.global.resolver.IpArgumentResolver;
import supernova.whokie.global.resolver.LoginAdminArgumentResolver;
import supernova.whokie.global.resolver.LoginUserArgumentResolver;

import java.util.List;
Expand Down Expand Up @@ -39,6 +40,11 @@ public LoginUserArgumentResolver loginUserArgumentResolver() {
return new LoginUserArgumentResolver();
}

@Bean
public LoginAdminArgumentResolver loginAdminArgumentResolver() {
return new LoginAdminArgumentResolver();
}

@Bean
public IpArgumentResolver ipArgumentResolver() {
return new IpArgumentResolver();
Expand All @@ -56,6 +62,7 @@ public void addInterceptors(InterceptorRegistry registry) {
public void addArgumentResolvers(List<HandlerMethodArgumentResolver> resolvers) {
resolvers.add(loginUserArgumentResolver());
resolvers.add(ipArgumentResolver());
resolvers.add(loginAdminArgumentResolver());
}

@Override
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,36 @@
package supernova.whokie.global.resolver;

import jakarta.servlet.http.HttpServletRequest;
import org.springframework.core.MethodParameter;
import org.springframework.web.bind.support.WebDataBinderFactory;
import org.springframework.web.context.request.NativeWebRequest;
import org.springframework.web.method.support.HandlerMethodArgumentResolver;
import org.springframework.web.method.support.ModelAndViewContainer;
import supernova.whokie.global.annotation.AdminAuthenticate;
import supernova.whokie.global.exception.AuthenticationException;
import supernova.whokie.global.exception.ForbiddenException;
import supernova.whokie.user.Role;

public class LoginAdminArgumentResolver implements HandlerMethodArgumentResolver {

@Override
public boolean supportsParameter(MethodParameter parameter) {
return parameter.hasParameterAnnotation(AdminAuthenticate.class);
}

@Override
public Object resolveArgument(MethodParameter parameter, ModelAndViewContainer mavContainer,
NativeWebRequest webRequest, WebDataBinderFactory binderFactory) throws Exception {
HttpServletRequest request = (HttpServletRequest) webRequest.getNativeRequest();
String userId = (String) request.getAttribute("userId");
String role = (String) request.getAttribute("role");

if (userId == null) {
throw new AuthenticationException("로그인 후 이용해 주세요.");
}
if (!role.equals(Role.ADMIN.toString())) {
throw new ForbiddenException("관리자만 이용할 수 있습니다.");
}
return Long.parseLong(userId);
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,34 @@
package supernova.whokie.group.controller;

import lombok.RequiredArgsConstructor;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.Pageable;
import org.springframework.data.domain.Sort;
import org.springframework.data.web.PageableDefault;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import supernova.whokie.global.annotation.AdminAuthenticate;
import supernova.whokie.global.dto.PagingResponse;
import supernova.whokie.group.controller.dto.GroupResponse;
import supernova.whokie.group.service.GroupService;
import supernova.whokie.group.service.dto.GroupModel;

@RestController
@RequestMapping("/api/admin/group")
@RequiredArgsConstructor
public class AdminGroupController {

private final GroupService groupService;

@GetMapping("")
public PagingResponse<GroupResponse.Info> getAllGroups(
@AdminAuthenticate Long userId,
@PageableDefault(page = 0, size = 10, sort = "id", direction = Sort.Direction.ASC) Pageable pageable
) {
Page<GroupModel.Info> models = groupService.getAllGroupPaging(pageable);
Page<GroupResponse.Info> response = models.map(GroupResponse.Info::from);
return PagingResponse.from(response);
}

}
Original file line number Diff line number Diff line change
Expand Up @@ -40,4 +40,9 @@ public GroupInfoWithMemberCount getGroupInfoWithMemberCountByGroupId(Long groupI
public boolean isGroupExist(Long groupId) {
return groupRepository.existsById(groupId);
}

@Transactional(readOnly = true)
public Page<Groups> getALlGroupPaging(Pageable pageable) {
return groupRepository.findAll(pageable);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -111,4 +111,10 @@ public GroupModel.InviteCode inviteGroup(Long userId, Long groupId) {
LocalDateTime.now().plusDays(7));
return GroupModel.InviteCode.from(inviteCode);
}

@Transactional(readOnly = true)
public Page<GroupModel.Info> getAllGroupPaging(Pageable pageable) {
Page<Groups> entities = groupReaderService.getALlGroupPaging(pageable);
return entities.map(GroupModel.Info::from);
}
}
Original file line number Diff line number Diff line change
@@ -1,6 +1,5 @@
package supernova.whokie.pointrecord.controller;

import jakarta.validation.Valid;
import jakarta.validation.constraints.NotNull;
import lombok.RequiredArgsConstructor;
import org.springframework.data.domain.Page;
Expand All @@ -10,12 +9,14 @@
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
import supernova.whokie.global.annotation.Authenticate;
import supernova.whokie.global.dto.GlobalResponse;
import supernova.whokie.global.dto.PagingResponse;
import supernova.whokie.pointrecord.PointRecordOption;
import supernova.whokie.pointrecord.controller.dto.PointRecordRequest;
import supernova.whokie.pointrecord.controller.dto.PointRecordResponse;
import supernova.whokie.pointrecord.sevice.PointRecordService;
import supernova.whokie.pointrecord.sevice.dto.PointRecordCommand;
Expand All @@ -31,12 +32,12 @@ public class PointRecordController {

private final PointRecordService pointRecordService;

@PostMapping("/purchase")
@GetMapping("/purchase")
public ResponseEntity<Void> purchasePoint(
@Authenticate Long userId,
@RequestBody @Valid PointRecordRequest.Purchase request
@RequestParam("point") int point
) {
PointRecordModel.ReadyInfo readyInfo = pointRecordService.readyPurchasePoint(userId, request.point());
PointRecordModel.ReadyInfo readyInfo = pointRecordService.readyPurchasePoint(userId, point);

return ResponseEntity.status(HttpStatus.SEE_OTHER)
.header("location", readyInfo.nextRedirectPcUrl())
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -6,14 +6,6 @@

public class PointRecordRequest {

@Builder
public record Purchase(
@NotNull @Min(0)
int point
) {

}

@Builder
public record Earn(
@NotNull @Min(0)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@
import lombok.Builder;
import supernova.whokie.profilequestion.service.dto.ProfileQuestionModel;

import java.time.LocalDate;
import java.time.LocalDateTime;
import java.util.List;

public class ProfileQuestionResponse {
Expand All @@ -24,14 +24,14 @@ public static Questions from(ProfileQuestionModel.InfoList infoList) {
public record Question(
Long profileQuestionId,
String profileQuestionContent,
LocalDate createdAt
LocalDateTime createdAt
) {

public static Question from(ProfileQuestionModel.Info info) {
return Question.builder()
.profileQuestionId(info.id())
.profileQuestionContent(info.content())
.createdAt(info.createdAt().toLocalDate())
.createdAt(info.createdAt())
.build();
}
}
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,43 @@
package supernova.whokie.question.controller;

import jakarta.validation.Valid;
import lombok.RequiredArgsConstructor;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.Pageable;
import org.springframework.data.domain.Sort;
import org.springframework.data.web.PageableDefault;
import org.springframework.web.bind.annotation.*;
import supernova.whokie.global.annotation.AdminAuthenticate;
import supernova.whokie.global.dto.GlobalResponse;
import supernova.whokie.global.dto.PagingResponse;
import supernova.whokie.question.controller.dto.QuestionRequest;
import supernova.whokie.question.controller.dto.QuestionResponse;
import supernova.whokie.question.service.QuestionService;
import supernova.whokie.question.service.dto.QuestionModel;

@RestController
@RequestMapping("/api/admin/question")
@RequiredArgsConstructor
public class AdminQuestionController {

private final QuestionService questionService;

@GetMapping("")
public PagingResponse<QuestionResponse.Admin> getAllQuestionPaging(
@AdminAuthenticate Long userId,
@PageableDefault(page = 0, size = 10, sort = "id", direction = Sort.Direction.ASC) Pageable pageable
) {
Page<QuestionModel.Admin> models = questionService.getAllQuestionPaging(pageable);
Page<QuestionResponse.Admin> response = models.map(QuestionResponse.Admin::from);
return PagingResponse.from(response);
}

@PostMapping("")
public GlobalResponse postCommonQuestion(
@AdminAuthenticate Long userId,
@RequestBody @Valid QuestionRequest.CommonCreate request
) {
questionService.createCommonQuestion(userId, request.toCommand());
return GlobalResponse.builder().message("질문이 등록되ㅐ었습니다.").build();
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -47,10 +47,10 @@ public QuestionResponse.GroupQuestions getGroupQuestionList(

@PostMapping("/group/question")
public GlobalResponse createGroupQuestion(
@RequestBody @Valid QuestionRequest.Create request,
@RequestBody @Valid QuestionRequest.GroupCreate request,
@Authenticate Long userId
) {
questionService.createQuestion(userId, request.toCommand());
questionService.createGroupQuestion(userId, request.toCommand());
return GlobalResponse.builder().message("질문이 성공적으로 생성되었습니다.").build();
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -3,11 +3,25 @@
import jakarta.validation.constraints.Min;
import jakarta.validation.constraints.NotNull;
import lombok.Builder;
import supernova.whokie.group.constants.GroupConstants;
import supernova.whokie.question.service.dto.QuestionCommand;

public class QuestionRequest {

public record Create(
public record CommonCreate(
@NotNull
String content
) {

public QuestionCommand.Create toCommand() {
return QuestionCommand.Create.builder()
.groupId(GroupConstants.COMMON_GROUPS_ID)
.content(content)
.build();
}
}

public record GroupCreate(
@NotNull @Min(1)
Long groupId,
@NotNull
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@
import supernova.whokie.question.QuestionStatus;
import supernova.whokie.question.service.dto.QuestionModel;

import java.time.LocalDate;
import java.time.LocalDateTime;
import java.util.List;

public class QuestionResponse {
Expand Down Expand Up @@ -88,7 +88,7 @@ public record Info(
Long groupId,
QuestionStatus status,
String writer,
LocalDate createdAt
LocalDateTime createdAt
) {
public static QuestionResponse.Info from(QuestionModel.Info info) {
return Info.builder()
Expand All @@ -100,6 +100,24 @@ public static QuestionResponse.Info from(QuestionModel.Info info) {
.createdAt(info.createdAt())
.build();
}
}

@Builder
public record Admin(
Long questionId,
String questionContent,
Long groupId,
QuestionStatus status,
LocalDateTime createdAt
) {
public static QuestionResponse.Admin from(QuestionModel.Admin model) {
return Admin.builder()
.questionId(model.questionId())
.questionContent(model.questionContent())
.groupId(model.groupId())
.status(model.status())
.createdAt(model.createdAt())
.build();
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -48,4 +48,8 @@ public Question getQuestionByIdAndGroupId(Long questionId, Long groupId) {
() -> new EntityNotFoundException(MessageConstants.QUESTION_NOT_FOUND_MESSAGE));
}

@Transactional(readOnly = true)
public Page<Question> getAllQuestionPaging(Pageable pageable) {
return questionRepository.findAll(pageable);
}
}
Loading

0 comments on commit b0be59b

Please sign in to comment.