Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
27 changes: 27 additions & 0 deletions pom.xml
Original file line number Diff line number Diff line change
Expand Up @@ -55,6 +55,17 @@
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-validation</artifactId>
</dependency>
<dependency>
<groupId>com.querydsl</groupId>
<artifactId>querydsl-apt</artifactId>
<version>4.4.0</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>com.querydsl</groupId>
<artifactId>querydsl-jpa</artifactId>
<version>4.4.0</version>
</dependency>
</dependencies>
<build>
<plugins>
Expand Down Expand Up @@ -95,6 +106,22 @@
</excludes>
</configuration>
</plugin>
<plugin>
<groupId>com.mysema.maven</groupId>
<artifactId>apt-maven-plugin</artifactId>
<version>1.1.3</version>
<executions>
<execution>
<goals>
<goal>process</goal>
</goals>
<configuration>
<outputDirectory>target/generated-sources/java</outputDirectory>
<processor>com.querydsl.apt.jpa.JPAAnnotationProcessor</processor>
</configuration>
</execution>
</executions>
</plugin>
</plugins>
</build>

Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
package org.programmers.staybb.Controller.User;
package org.programmers.staybb.controller.user;

import org.programmers.staybb.dto.user.HostResponse;
import org.programmers.staybb.global.exception.EntityNotFoundException;
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,36 @@
package org.programmers.staybb.controller.search;

import javassist.NotFoundException;
import lombok.extern.slf4j.Slf4j;
import org.programmers.staybb.dto.search.SearchAllResponse;
import org.programmers.staybb.dto.search.SearchOneResponse;
import org.programmers.staybb.dto.search.SearchRequest;
import org.programmers.staybb.dto.search.SearchRequestModel;
import org.programmers.staybb.service.SearchService;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.Pageable;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.ModelAttribute;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RestController;

@Slf4j
@RestController
public class SearchController {
private final SearchService searchService;
public SearchController(SearchService searchService) {
this.searchService = searchService;
}

@GetMapping("/v1/search")
public ResponseEntity<Page<SearchAllResponse>> getAll(final @ModelAttribute SearchRequestModel searchRequestModel, Pageable pageable) {
SearchRequest searchRequest = new SearchRequest(searchRequestModel);
return ResponseEntity.ok(searchService.findByFilters(searchRequest, pageable));
}

@GetMapping("/v1/search/rooms/{roomId}")
public ResponseEntity<SearchOneResponse> getOne(final @PathVariable Long roomId) throws NotFoundException {
return ResponseEntity.ok(searchService.findOne(roomId));
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
package org.programmers.staybb.configuration;

import com.querydsl.jpa.impl.JPAQueryFactory;
import javax.persistence.EntityManager;
import javax.persistence.PersistenceContext;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

@Configuration
public class QueryDSLConfig {
@PersistenceContext
private EntityManager entityManager;

@Bean
public JPAQueryFactory jpaQueryFactory() {
return new JPAQueryFactory(entityManager);
}
}
Original file line number Diff line number Diff line change
@@ -1,10 +1,10 @@
package org.programmers.staybb.controller.user;
import javassist.NotFoundException;
package org.programmers.staybb.Controller.User;

import javax.validation.Valid;
import org.programmers.staybb.dto.user.UserRequest;
import org.programmers.staybb.global.response.ApiResponse;
import org.programmers.staybb.global.response.ApiUtils;
import org.programmers.staybb.global.exception.EntityNotFoundException;
import org.programmers.staybb.service.UserService;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.DeleteMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.PostMapping;
Expand All @@ -23,13 +23,15 @@ public UserController(UserService userService) {
}

@PostMapping
public ApiResponse<Long> SignUp(final @RequestBody @Valid UserRequest userRequest) {
return ApiUtils.success(userService.addUser(userRequest));
public ResponseEntity<Long> signUp(final @RequestBody @Valid UserRequest userRequest) {
return ResponseEntity.ok(userService.addUser(userRequest));
}

@DeleteMapping("/{id}")
public ApiResponse<Long> removeUser(final @PathVariable Long id) throws NotFoundException {
return ApiUtils.success(userService.removeUser(id));
public ResponseEntity<Long> removeUser(final @PathVariable Long id)
throws EntityNotFoundException {
return ResponseEntity.ok().body(userService.removeUser(id));
}


}
Original file line number Diff line number Diff line change
@@ -1,9 +1,8 @@
package org.programmers.staybb.domain.reservation;

import lombok.Getter;

import javax.persistence.Embeddable;
import java.util.Objects;
import javax.persistence.Embeddable;
import lombok.Getter;

@Embeddable
@Getter
Expand All @@ -12,6 +11,7 @@ public class Guest {
private int adult;
private int teen;
private int kid;
private int totalGuest;

protected Guest() {
}
Expand All @@ -20,6 +20,11 @@ public Guest(int adult, int teen, int kid) {
this.adult = adult;
this.teen = teen;
this.kid = kid;
this.totalGuest = sumGuest(adult, teen);
}

private int sumGuest(int adult, int teen) {
return adult + teen;
}

@Override
Expand All @@ -39,4 +44,4 @@ public int hashCode() {
return Objects.hash(adult, teen, kid);
}

}
}
Original file line number Diff line number Diff line change
@@ -1,13 +1,25 @@

package org.programmers.staybb.domain.reservation;

import com.sun.istack.NotNull;
import java.time.LocalDate;
import java.time.Period;
import javax.persistence.ConstraintMode;
import javax.persistence.Embedded;
import javax.persistence.Entity;
import javax.persistence.FetchType;
import javax.persistence.ForeignKey;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.Lob;
import javax.persistence.ManyToOne;
import javax.persistence.Table;
import lombok.Builder;
import lombok.Getter;
import org.programmers.staybb.domain.room.Room;
import org.programmers.staybb.domain.user.User;

import javax.persistence.*;
import java.time.LocalTime;
import org.programmers.staybb.global.BaseTimeEntity;

@Entity
Expand All @@ -20,10 +32,10 @@ public class Reservation extends BaseTimeEntity {
private Long id;

@NotNull
private LocalTime startDate;
private LocalDate startDate;

@NotNull
private LocalTime endDate;
private LocalDate endDate;

@NotNull
private int totalPrice;
Expand All @@ -47,22 +59,27 @@ protected Reservation() {
}

@Builder
public Reservation(LocalTime startDate, LocalTime endDate, int totalPrice, Guest guest,
String message) {
public Reservation(LocalDate startDate, LocalDate endDate, Guest guest,
String message, User user, Room room) {
this.startDate = startDate;
this.endDate = endDate;
this.totalPrice = totalPrice;
this.totalPrice = countTotalPrice(startDate, endDate, room.getPrice());
this.guest = guest;
this.message = message;
this.user = user;
this.room = room;
}

public void changeInfo(LocalTime startDate, LocalTime endDate, int totalPrice, Guest guest,
String message) {
public void changeInfo(LocalDate startDate, LocalDate endDate, Guest guest) {
this.startDate = startDate;
this.endDate = endDate;
this.totalPrice = totalPrice;
this.guest = guest;
this.message = message;
this.totalPrice = countTotalPrice(startDate, endDate, this.room.getPrice());
}

private int countTotalPrice(LocalDate startDate, LocalDate endDate, int price) {
Period between = startDate.until(endDate);
return between.getDays() * price;
}

}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,28 @@
package org.programmers.staybb.dto.search;

import lombok.Builder;
import lombok.Getter;
import org.programmers.staybb.domain.room.Address;
import org.programmers.staybb.domain.room.Option;
import org.programmers.staybb.domain.room.Room;


@Getter
public class SearchAllResponse {

private Long id;
private String roomName;
private int maxGuest;

private Option option;
private String region;

@Builder
public SearchAllResponse(Room entity) {
this.id = entity.getId();
this.roomName = entity.getRoomName();
this.maxGuest = entity.getMaxGuest();
this.option = entity.getOption();
this.region = entity.getAddress().getRegion();
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,38 @@
package org.programmers.staybb.dto.search;

import com.fasterxml.jackson.annotation.JsonFormat;
import java.time.LocalDate;
import javax.validation.constraints.Email;
import javax.validation.constraints.NotBlank;
import javax.validation.constraints.NotEmpty;
import javax.validation.constraints.NotNull;
import javax.validation.constraints.Past;
import javax.validation.constraints.Pattern;
import lombok.Builder;
import lombok.Getter;
import org.programmers.staybb.domain.room.Address;
import org.programmers.staybb.domain.room.Option;
import org.programmers.staybb.domain.room.Room;


@Getter
public class SearchOneResponse {

private Long id;
private String roomName;
private int maxGuest;
private String description;

private Option option;
private String roughAddress;

@Builder
public SearchOneResponse(Room entity) {
Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Respose의 convert해주는 과정에서 생성자보다 static으로 선언한 of 메소드를 해주는 것이 좀 더 명확한 느낌아닌 느낌이 들어요 ㅎㅎ
어떻게 생각하시나요??

this.id = entity.getId();
Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

id는 필요없지 않을까요?

this.roomName = entity.getRoomName();
this.maxGuest = entity.getMaxGuest();
this.description = entity.getDescription();
this.option = entity.getOption();
this.roughAddress = entity.getAddress().getAddress();
}
}
43 changes: 43 additions & 0 deletions src/main/java/org/programmers/staybb/dto/search/SearchRequest.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,43 @@
package org.programmers.staybb.dto.search;

import com.fasterxml.jackson.annotation.JsonFormat;
import java.time.LocalDate;
import javax.validation.constraints.Past;
import javax.validation.constraints.PositiveOrZero;
import lombok.Builder;
import lombok.Getter;
import lombok.Setter;
import org.apache.tomcat.jni.Local;
import org.programmers.staybb.domain.reservation.Guest;
import org.programmers.staybb.domain.room.Option;
import org.programmers.staybb.domain.room.Room;

@Getter
@Setter
Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Setter도 필요한가요?

public class SearchRequest {

private String location;
@JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd")
@Past(message = "현재보다 이전인 날짜를 전달받았습니다.")
private LocalDate startDate;
@JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd")
@Past(message = "현재보다 이전인 날짜를 전달받았습니다.")
private LocalDate endDate;
private Guest guest;
private Option option;

public SearchRequest(SearchRequestModel searchRequestModel) {
this.location = searchRequestModel.getLocation();
this.startDate = LocalDate.parse(searchRequestModel.getStartDate());
this.endDate = LocalDate.parse(searchRequestModel.getEndDate());
this.guest = new Guest(
searchRequestModel.getAdult(),
searchRequestModel.getKid(),
searchRequestModel.getTeen());
this.option = Option.builder()
.bedNum(searchRequestModel.getBedNum())
.bedroomNum(searchRequestModel.getBedroomNum())
.bathroomNum(searchRequestModel.getBathroomNum())
.build();
}
}
Loading