Skip to content

Commit

Permalink
Merge pull request #303 from Hous-Release/develop
Browse files Browse the repository at this point in the history
release 1.0.6
  • Loading branch information
orijoon98 authored Feb 24, 2023
2 parents 19b23aa + 374412e commit 2df845e
Show file tree
Hide file tree
Showing 26 changed files with 1,406 additions and 44 deletions.
28 changes: 28 additions & 0 deletions docker-compose.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,28 @@
version: '3'

services:

mysql:
image: mysql/mysql-server:5.7
environment:
MYSQL_ROOT_HOST: '%'
MYSQL_USER: "hous"
MYSQL_PASSWORD: "hous"
MYSQL_DATABASE: "hous"
ports:
- "3306:3306"
command:
- "mysqld"
- "--character-set-server=utf8mb4"
- "--collation-server=utf8mb4_unicode_ci"

redis:
image: redis:alpine
command: redis-server --port 6379
container_name: redis_boot
hostname: redis_boot
labels:
- "name=redis"
- "mode=standalone"
ports:
- 6379:6379
2 changes: 2 additions & 0 deletions src/main/java/hous/server/ServerApplication.java
Original file line number Diff line number Diff line change
Expand Up @@ -3,13 +3,15 @@
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.openfeign.EnableFeignClients;
import org.springframework.context.annotation.EnableAspectJAutoProxy;
import org.springframework.data.jpa.repository.config.EnableJpaAuditing;
import org.springframework.scheduling.annotation.EnableScheduling;
import springfox.documentation.swagger2.annotations.EnableSwagger2;

@EnableScheduling
@EnableFeignClients
@EnableJpaAuditing
@EnableAspectJAutoProxy
@SpringBootApplication
@EnableSwagger2
public class ServerApplication {
Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
package hous.server.common.aspect;
package hous.server.common.aspect.duplicate;

import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
package hous.server.common.aspect;
package hous.server.common.aspect.duplicate;

import hous.server.common.exception.ConflictException;
import hous.server.domain.common.RedisKey;
Expand All @@ -19,7 +19,7 @@ public class RequestAspect {

private final RedisTemplate<String, Object> redisTemplate;

@Before("@annotation(hous.server.common.aspect.PreventDuplicateRequest)")
@Before("@annotation(hous.server.common.aspect.duplicate.PreventDuplicateRequest)")
public void beforeRequest(final JoinPoint joinPoint) {
Long userId = (Long) joinPoint.getArgs()[0];
if (redisTemplate.opsForValue().get(RedisKey.DUPLICATE_REQUEST + userId) != null) {
Expand All @@ -29,7 +29,7 @@ public void beforeRequest(final JoinPoint joinPoint) {
redisTemplate.opsForValue().set(RedisKey.DUPLICATE_REQUEST + userId, Long.toString(userId));
}

@After("@annotation(hous.server.common.aspect.PreventDuplicateRequest)")
@After("@annotation(hous.server.common.aspect.duplicate.PreventDuplicateRequest)")
public void afterReturningRequest(final JoinPoint joinPoint) {
Long userId = (Long) joinPoint.getArgs()[0];
redisTemplate.opsForValue().getAndDelete(RedisKey.DUPLICATE_REQUEST + userId);
Expand Down
56 changes: 56 additions & 0 deletions src/main/java/hous/server/common/aspect/logging/LoggingAspect.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,56 @@
package hous.server.common.aspect.logging;

import lombok.extern.slf4j.Slf4j;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Pointcut;
import org.springframework.stereotype.Component;
import org.springframework.web.context.request.RequestContextHolder;
import org.springframework.web.context.request.ServletRequestAttributes;

import javax.servlet.http.HttpServletRequest;
import java.util.Enumeration;
import java.util.HashMap;
import java.util.Map;

@Aspect
@Component
@Slf4j
public class LoggingAspect {

/**
* execution([수식어] 리턴타입 [클래스이름].이름(파라미터)
* * : 모든 값 포함
* .. : 0개 이상 의미
* <p>
* hous.server.controller 패키지 내부의 모든 클래스에서 파라미터가 0개 이상인 모든 메서드
*/
@Pointcut("execution(* hous.server.controller..*(..))")
public void controllerExecute() {
}

@Around("hous.server.common.aspect.logging.LoggingAspect.controllerExecute()")
public Object requestLogging(ProceedingJoinPoint proceedingJoinPoint) throws Throwable {
HttpServletRequest request = ((ServletRequestAttributes) RequestContextHolder.currentRequestAttributes()).getRequest();
long startAt = System.currentTimeMillis();
Object returnValue = proceedingJoinPoint.proceed(proceedingJoinPoint.getArgs());
long endAt = System.currentTimeMillis();
log.info("====> Request: {} {} ({}ms)\n *Header = {}\n", request.getMethod(), request.getRequestURL(), endAt - startAt, getHeaders(request));
if (returnValue != null) {
log.info("====> Response: {}", returnValue);
}
return returnValue;
}

private Map<String, Object> getHeaders(HttpServletRequest request) {
Map<String, Object> headerMap = new HashMap<>();

Enumeration<String> headerArray = request.getHeaderNames();
while (headerArray.hasMoreElements()) {
String headerName = headerArray.nextElement();
headerMap.put(headerName, request.getHeader(headerName));
}
return headerMap;
}
}
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
package hous.server.controller.auth;

import hous.server.common.aspect.PreventDuplicateRequest;
import hous.server.common.aspect.duplicate.PreventDuplicateRequest;
import hous.server.common.dto.ErrorResponse;
import hous.server.common.dto.SuccessResponse;
import hous.server.common.success.SuccessCode;
Expand Down
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
package hous.server.controller.room;

import hous.server.common.aspect.PreventDuplicateRequest;
import hous.server.common.aspect.duplicate.PreventDuplicateRequest;
import hous.server.common.dto.ErrorResponse;
import hous.server.common.dto.SuccessResponse;
import hous.server.common.success.SuccessCode;
Expand Down
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
package hous.server.controller.rule;

import hous.server.common.aspect.PreventDuplicateRequest;
import hous.server.common.aspect.duplicate.PreventDuplicateRequest;
import hous.server.common.dto.ErrorResponse;
import hous.server.common.dto.SuccessResponse;
import hous.server.config.interceptor.auth.Auth;
Expand Down
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
package hous.server.controller.todo;

import hous.server.common.aspect.PreventDuplicateRequest;
import hous.server.common.aspect.duplicate.PreventDuplicateRequest;
import hous.server.common.dto.ErrorResponse;
import hous.server.common.dto.SuccessResponse;
import hous.server.config.interceptor.auth.Auth;
Expand Down
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
package hous.server.controller.user;

import hous.server.common.aspect.PreventDuplicateRequest;
import hous.server.common.aspect.duplicate.PreventDuplicateRequest;
import hous.server.common.dto.ErrorResponse;
import hous.server.common.dto.SuccessResponse;
import hous.server.common.success.SuccessCode;
Expand Down
12 changes: 0 additions & 12 deletions src/main/java/hous/server/domain/room/Room.java
Original file line number Diff line number Diff line change
Expand Up @@ -34,12 +34,6 @@ public class Room extends AuditingTimeEntity {
@Column(nullable = false)
private int participantsCnt;

@Column(nullable = false)
private int rulesCnt;

@Column(nullable = false)
private int todosCnt;

@OneToMany(mappedBy = "room", fetch = FetchType.LAZY, cascade = CascadeType.ALL, orphanRemoval = true)
private final List<Participate> participates = new ArrayList<>();

Expand All @@ -55,8 +49,6 @@ public static Room newInstance(Onboarding owner, String name, String code) {
.name(name)
.code(code)
.participantsCnt(0)
.rulesCnt(0)
.todosCnt(0)
.build();
}

Expand All @@ -80,7 +72,6 @@ public void deleteParticipate(Participate participate) {

public void addRules(List<Rule> rules) {
this.rules.addAll(rules);
this.rulesCnt += rules.size();
}

public void updateRule(Rule rule) {
Expand All @@ -89,12 +80,10 @@ public void updateRule(Rule rule) {

public void deleteRule(Rule rule) {
this.rules.remove(rule);
this.rulesCnt -= 1;
}

public void addTodo(Todo todo) {
this.todos.add(todo);
this.todosCnt += 1;
}

public void updateTodo(Todo todo) {
Expand All @@ -103,6 +92,5 @@ public void updateTodo(Todo todo) {

public void deleteTodo(Todo todo) {
this.todos.remove(todo);
this.todosCnt -= 1;
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -2,21 +2,26 @@

import hous.server.domain.common.Constraint;
import io.swagger.annotations.ApiModelProperty;
import lombok.AccessLevel;
import lombok.Getter;
import lombok.NoArgsConstructor;
import lombok.ToString;
import lombok.*;

import javax.validation.constraints.NotBlank;
import javax.validation.constraints.Size;

@ToString
@Getter
@NoArgsConstructor(access = AccessLevel.PRIVATE)
@AllArgsConstructor(access = AccessLevel.PRIVATE)
@Builder(access = AccessLevel.PRIVATE)
public class SetRoomNameRequestDto {

@ApiModelProperty(value = "방 이름", example = "러블리더블리")
@NotBlank(message = "{room.name.notBlank}")
@Size(max = Constraint.ROOM_NAME_MAX, message = "{room.name.max}")
private String name;

public static SetRoomNameRequestDto of(String name) {
return SetRoomNameRequestDto.builder()
.name(name)
.build();
}
}
5 changes: 3 additions & 2 deletions src/main/java/hous/server/service/rule/RuleService.java
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,7 @@
import hous.server.service.rule.dto.request.CreateRuleRequestDto;
import hous.server.service.rule.dto.request.DeleteRuleReqeustDto;
import hous.server.service.rule.dto.request.UpdateRuleRequestDto;
import hous.server.service.rule.dto.response.RuleInfo;
import hous.server.service.user.UserServiceUtils;
import lombok.RequiredArgsConstructor;
import org.springframework.data.redis.core.RedisTemplate;
Expand Down Expand Up @@ -47,7 +48,7 @@ public void createRule(CreateRuleRequestDto request, Long userId) {
Onboarding me = user.getOnboarding();
Room room = RoomServiceUtils.findParticipatingRoom(user);
RuleServiceUtils.validateRuleCounts(room, request.getRuleNames().size());
// RuleServiceUtils.existsRuleByRoomRules(room, request.getRuleNames()); //TODO 다음 릴리즈 때 클라에서 추가할 예정이라 우선 주석 처리
RuleServiceUtils.existsRuleByRoomRules(room, request.getRuleNames());
AtomicInteger ruleIdx = new AtomicInteger(RuleServiceUtils.findRuleIdxByRoomId(ruleRepository, room));
List<Rule> rules = request.getRuleNames().stream()
.map(ruleName -> {
Expand Down Expand Up @@ -77,7 +78,7 @@ public void createRule(CreateRuleRequestDto request, Long userId) {
public void updateRules(UpdateRuleRequestDto request, Long userId) {
User user = UserServiceUtils.findUserById(userRepository, userId);
Room room = RoomServiceUtils.findParticipatingRoom(user);
// RuleServiceUtils.existsRuleByRoomRules(room, request.getRules().stream().map(RuleInfo::getName).collect(Collectors.toList())); //TODO 다음 릴리즈 때 클라에서 추가할 예정이라 우선 주석 처리
RuleServiceUtils.existsRuleByRules(request.getRules().stream().map(RuleInfo::getName).collect(Collectors.toList()));
for (int idx = 0; idx < request.getRules().size(); idx++) {
Rule rule = RuleServiceUtils.findRuleByIdAndRoom(ruleRepository, request.getRules().get(idx).getId(), room);
RuleServiceUtils.validateRuleName(room, request.getRules().get(idx).getName());
Expand Down
12 changes: 10 additions & 2 deletions src/main/java/hous/server/service/rule/RuleServiceUtils.java
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,7 @@
import lombok.AccessLevel;
import lombok.NoArgsConstructor;

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

Expand All @@ -36,7 +37,7 @@ public static void validateRuleName(Room room, String ruleName) {
}

public static void validateRuleCounts(Room room, int requestRuleCnt) {
if (room.getRulesCnt() + requestRuleCnt > Constraint.RULE_COUNT_MAX) {
if (room.getRules().size() + requestRuleCnt > Constraint.RULE_COUNT_MAX) {
throw new ForbiddenException(String.format("방 (%s) 의 rule 는 30 개를 초과할 수 없습니다.", room.getId()), FORBIDDEN_RULE_COUNT_EXCEPTION);
}
}
Expand All @@ -53,8 +54,15 @@ public static void existsRuleByRoomRules(Room room, List<String> requestRules) {
List<String> rules = room.getRules().stream().map(Rule::getName).collect(Collectors.toList());
for (String ruleName : requestRules) {
if (rules.contains(ruleName)) {
throw new ConflictException(String.format("방 (%s) 에 이미 존재하는 todo (%s) 입니다.", room.getId(), ruleName), CONFLICT_RULE_EXCEPTION);
throw new ConflictException(String.format("방 (%s) 에 이미 존재하는 ruleName (%s) 입니다.", room.getId(), ruleName), CONFLICT_RULE_EXCEPTION);

}
}
}

public static void existsRuleByRules(List<String> requestRules) {
if (requestRules.size() != new HashSet<>(requestRules).size()) {
throw new ConflictException("규칙 이름 중복입니다.", CONFLICT_RULE_EXCEPTION);
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -2,10 +2,7 @@

import hous.server.domain.common.Constraint;
import io.swagger.annotations.ApiModelProperty;
import lombok.AccessLevel;
import lombok.Getter;
import lombok.NoArgsConstructor;
import lombok.ToString;
import lombok.*;

import javax.validation.constraints.NotNull;
import javax.validation.constraints.Size;
Expand All @@ -14,10 +11,18 @@
@ToString
@Getter
@NoArgsConstructor(access = AccessLevel.PRIVATE)
@AllArgsConstructor(access = AccessLevel.PRIVATE)
@Builder(access = AccessLevel.PRIVATE)
public class CreateRuleRequestDto {

@ApiModelProperty(value = "규칙 내용 배열", example = "[\"우리집 대장은 김또순\", \"우리집 대장은 혜조니\", \"우리집 대장은 혁주니\", ...]")
@NotNull(message = "{rule.list.notNull}")
@Size(min = Constraint.RULE_LIST_MIN, message = "{rule.list.min}")
private List<String> ruleNames;

public static CreateRuleRequestDto of(List<String> ruleNames) {
return CreateRuleRequestDto.builder()
.ruleNames(ruleNames)
.build();
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -2,10 +2,7 @@

import hous.server.domain.common.Constraint;
import io.swagger.annotations.ApiModelProperty;
import lombok.AccessLevel;
import lombok.Getter;
import lombok.NoArgsConstructor;
import lombok.ToString;
import lombok.*;

import javax.validation.constraints.NotNull;
import javax.validation.constraints.Size;
Expand All @@ -14,10 +11,18 @@
@ToString
@Getter
@NoArgsConstructor(access = AccessLevel.PRIVATE)
@AllArgsConstructor(access = AccessLevel.PRIVATE)
@Builder(access = AccessLevel.PRIVATE)
public class DeleteRuleReqeustDto {

@ApiModelProperty(value = "규칙 id 배열", example = "[12, 13, 14, ...]")
@NotNull(message = "{rule.list.notNull}")
@Size(min = Constraint.RULE_LIST_MIN, message = "{rule.list.min}")
private List<Long> rulesIdList;

public static DeleteRuleReqeustDto of(List<Long> rulesIdList) {
return DeleteRuleReqeustDto.builder()
.rulesIdList(rulesIdList)
.build();
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -128,7 +128,7 @@ public TodoAllDayResponse getTodoAllDayInfo(Long userId) {
.collect(Collectors.toList());
allDayTodosList.add(TodoAllDayInfo.of(dayOfWeek, todoInfos, ourTodoInfos));
}
return TodoAllDayResponse.of(room.getTodosCnt(), allDayTodosList);
return TodoAllDayResponse.of(room.getTodos().size(), allDayTodosList);
}

public TodoAllMemberResponse getTodoAllMemberInfo(Long userId) {
Expand Down Expand Up @@ -169,7 +169,7 @@ public TodoAllMemberResponse getTodoAllMemberInfo(Long userId) {
});
allMemberTodos.addAll(otherMemberTodos);

return TodoAllMemberResponse.of(room.getTodosCnt(), allMemberTodos);
return TodoAllMemberResponse.of(room.getTodos().size(), allMemberTodos);
}

public MyTodoInfoResponse getMyTodoInfo(Long userId) {
Expand Down
Loading

0 comments on commit 2df845e

Please sign in to comment.