Skip to content

Commit

Permalink
Merge branch 'develop' of https://github.com/depromeet/15th-team1-BE
Browse files Browse the repository at this point in the history
…into feat/LS-6
  • Loading branch information
clean2001 committed Jul 10, 2024
2 parents 93856e2 + 468c916 commit 63f5aa4
Show file tree
Hide file tree
Showing 21 changed files with 454 additions and 21 deletions.
8 changes: 6 additions & 2 deletions build.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -65,6 +65,7 @@ project(":layer-api") {


implementation 'org.springframework.boot:spring-boot-starter-actuator'
implementation 'org.springframework.boot:spring-boot-starter-validation'

//== jwt ==//
implementation 'io.jsonwebtoken:jjwt-api:0.12.5'
Expand All @@ -78,11 +79,14 @@ project(":layer-api") {
implementation 'org.springframework.boot:spring-boot-starter-data-redis'
testImplementation 'org.springframework.boot:spring-boot-starter-test'


// swagger
implementation("org.springdoc:springdoc-openapi-starter-webmvc-ui:2.2.0")

// jpa
implementation 'org.springframework.boot:spring-boot-starter-data-jpa'

//Swagger
implementation 'org.springdoc:springdoc-openapi-starter-webmvc-ui:2.0.2'
// mysql

runtimeOnly 'com.mysql:mysql-connector-j'
}
Expand Down
2 changes: 2 additions & 0 deletions layer-api/src/main/java/org/layer/LayerApplication.java
Original file line number Diff line number Diff line change
Expand Up @@ -3,8 +3,10 @@

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.data.jpa.repository.config.EnableJpaAuditing;

@SpringBootApplication
@EnableJpaAuditing
public class LayerApplication {
public static void main(String[] args) {
SpringApplication.run(LayerApplication.class, args);
Expand Down
29 changes: 29 additions & 0 deletions layer-api/src/main/java/org/layer/config/ObjectMapperConfig.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,29 @@
package org.layer.config;

import com.fasterxml.jackson.databind.DeserializationFeature;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.PropertyNamingStrategies;
import com.fasterxml.jackson.databind.SerializationFeature;
import com.fasterxml.jackson.datatype.jdk8.Jdk8Module;
import com.fasterxml.jackson.datatype.jsr310.JavaTimeModule;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

@Configuration
public class ObjectMapperConfig {

@Bean
public ObjectMapper objectMapper(){
ObjectMapper objectMapper = new ObjectMapper();
objectMapper.registerModule(new Jdk8Module());
objectMapper.registerModule(new JavaTimeModule());

objectMapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES,false);
objectMapper.disable(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS);

// 카멜 케이스
objectMapper.setPropertyNamingStrategy(new PropertyNamingStrategies.LowerCamelCaseStrategy());
return objectMapper;

}
}
65 changes: 65 additions & 0 deletions layer-api/src/main/java/org/layer/filter/LoggerFilter.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,65 @@
package org.layer.filter;

import jakarta.servlet.*;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Component;
import org.springframework.web.util.ContentCachingRequestWrapper;
import org.springframework.web.util.ContentCachingResponseWrapper;

import java.io.IOException;

@Component
@Slf4j
public class LoggerFilter implements Filter {

@Override
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
var req = new ContentCachingRequestWrapper((HttpServletRequest) request);
var res = new ContentCachingResponseWrapper((HttpServletResponse) response);

chain.doFilter(req,res);

// request 정보
var headerNames = req.getHeaderNames();
var headerValues = new StringBuilder();

headerNames.asIterator().forEachRemaining(headerKey -> {
var headerValue = req.getHeader(headerKey);

headerValues
.append("[")
.append(headerKey)
.append(" : ")
.append(headerValue)
.append(" , ")
.append("] ");
});
var requestBody = new String(req.getContentAsByteArray());
var uri = req.getRequestURI();
var method = req.getMethod();

log.info("[REQUEST] uri : {} , method : {} , header : {} , body : {}" ,uri,method, headerValues, requestBody);

// response
var responseHeaderValues = new StringBuilder();
res.getHeaderNames().forEach(headerKey -> {
var headerValue = res.getHeader(headerKey);
responseHeaderValues
.append("[")
.append(headerKey)
.append(" : ")
.append(headerValue)
.append(" ,")
.append("] ");
});

// var responseBody = new String(res.getContentAsByteArray());

log.info("[RESPONSE] uri : {} , method : {} , header : {} , body : {}",uri,method, responseHeaderValues);

res.copyBodyToResponse();
}
}

Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
package org.layer.retrospect.controller;

import org.layer.retrospect.controller.dto.request.RetrospectCreateRequest;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestBody;

import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.tags.Tag;
import jakarta.validation.Valid;

@Tag(name = "회고", description = "회고 관련 API")
public interface RetrospectApi {

@Operation(summary = "회고 생성", description = "")
ResponseEntity<Void> createRetrospect(@PathVariable("spaceId") Long spaceId,
@RequestBody @Valid RetrospectCreateRequest request);
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,30 @@
package org.layer.retrospect.controller;

import org.layer.retrospect.controller.dto.request.RetrospectCreateRequest;
import org.layer.retrospect.service.RetrospectService;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import jakarta.validation.Valid;
import lombok.RequiredArgsConstructor;

@RestController
@RequiredArgsConstructor
@RequestMapping("/space/{spaceId}/retrospect")
public class RetrospectController implements RetrospectApi {

private final RetrospectService retrospectService;

@Override
@PostMapping
public ResponseEntity<Void> createRetrospect(@PathVariable("spaceId") Long spaceId,
@RequestBody @Valid RetrospectCreateRequest request) {

retrospectService.create(spaceId, request.formId(), request.title(), request.introduction());
return ResponseEntity.ok(null);
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
package org.layer.retrospect.controller.dto.request;

import io.swagger.v3.oas.annotations.media.Schema;
import jakarta.validation.constraints.NotNull;
import jakarta.validation.constraints.Size;

@Schema(name = "RetrospectCreateRequest", description = "회고 생성 요청 Dto")
public record RetrospectCreateRequest(
@Schema(description = "회고 폼 id", example = "1")
@NotNull
Long formId,
@Schema(description = "회고 제목", example = "중간 발표 이후 회고")
@Size(min = 3)
String title,
@Schema(description = "회고 한줄 설명", example = "우리만의 KPT 회고")
@NotNull
String introduction

) {
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,27 @@
package org.layer.retrospect.service;

import org.layer.domain.retrospect.entity.Retrospect;
import org.layer.domain.retrospect.entity.RetrospectStatus;
import org.layer.domain.retrospect.repository.RetrospectRepository;
import org.springframework.stereotype.Service;

import lombok.RequiredArgsConstructor;

@Service
@RequiredArgsConstructor
public class RetrospectService {

private final RetrospectRepository retrospectRepository;

public void create(Long spaceId, Long formId, String title, String introduction){
Retrospect retrospect = Retrospect.builder()
.title(title)
.formId(formId)
.spaceId(spaceId)
.introduction(introduction)
.retrospectStatus(RetrospectStatus.PROCEEDING)
.build();

retrospectRepository.save(retrospect);
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
package org.layer.retrospect.service.dto;

import java.util.List;

public record RetrospectCreateServiceRequest(
String title,
Long spaceId,
List<String> questions,
boolean isMyForm
) {
}
25 changes: 25 additions & 0 deletions layer-domain/src/main/java/org/layer/domain/BaseEntity.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,25 @@
package org.layer.domain;

import jakarta.persistence.GeneratedValue;
import jakarta.persistence.GenerationType;
import jakarta.persistence.Id;
import jakarta.persistence.MappedSuperclass;
import lombok.AccessLevel;
import lombok.NoArgsConstructor;
import org.springframework.data.annotation.CreatedDate;
import org.springframework.data.annotation.LastModifiedDate;
import java.time.LocalDateTime;

@MappedSuperclass
@NoArgsConstructor(access = AccessLevel.PROTECTED)
public class BaseEntity {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;

@CreatedDate
private LocalDateTime createdAt;

@LastModifiedDate
private LocalDateTime updatedAt;
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,26 @@
package org.layer.domain.block.converter;

import jakarta.persistence.AttributeConverter;
import jakarta.persistence.Converter;
import org.layer.domain.block.enums.BlockType;


import java.util.stream.Stream;

@Converter
public class BlockStyleConverter implements AttributeConverter<BlockType, String> {

@Override
public String convertToDatabaseColumn(BlockType blockType) {
return blockType.getStyle();
}

@Override
public BlockType convertToEntityAttribute(String blockStyle) {
if(blockStyle == null){
return null;
}
return Stream.of(BlockType.values()).filter(t -> t.getStyle().equals(blockStyle)).findFirst()
.orElseThrow(IllegalArgumentException::new);
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,36 @@
package org.layer.domain.block.entity;

import jakarta.persistence.*;
import jakarta.validation.constraints.NotNull;
import lombok.*;
import org.layer.domain.BaseEntity;
import org.layer.domain.block.converter.BlockStyleConverter;
import org.layer.domain.block.enums.BlockType;
import org.layer.domain.blockOption.entity.BlockOption;

import java.util.HashSet;
import java.util.Set;

@Getter
@Entity
@EqualsAndHashCode(callSuper = true)
@AllArgsConstructor
@NoArgsConstructor(access = AccessLevel.PROTECTED)
public class Block extends BaseEntity {

/**
* Form RelationId
*/
@NotNull
private Long formId;

private String label;

@Column(length = 20)
@NotNull
@Convert(converter = BlockStyleConverter.class)
private BlockType style;

@OneToMany(fetch = FetchType.LAZY, mappedBy = "block", cascade = CascadeType.ALL, orphanRemoval = true)
private Set<BlockOption> options = new HashSet<>();
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,35 @@
package org.layer.domain.block.enums;

import lombok.AllArgsConstructor;
import lombok.Getter;

@AllArgsConstructor
@Getter
public enum BlockType {
/**
* 질문(입력) 블록 종류
* 1. 짧은 인풋
* 2. 마크다운
* 3. 레인저
* 4. 콤보 박스
* 5. 카드
* 6. 숫자 인풋
*
* 질문 블록 중 이산적인 블록 종류
* 1. 레인저( 숫자 )
* 2. 콤보 박스
* 3. 카드
*
*/

PLAIN_TEXT("짧은 입력","plain_text","single"),
MARKDOWN("마크다운 입력","markdown","single"),
RANGER("범위 지정","range","multi"),
COMBOBOX("콤보 박스","combobox","multi"),
CARD("카드 선택 입력","card","multi"),
NUMBER("숫자 입력","number","single");

private String description;
private String style;
private String type;
}
Loading

0 comments on commit 63f5aa4

Please sign in to comment.