diff --git a/src/main/java/com/gapple/weeingback/domain/auth/dto/AuthJoinRequest.java b/src/main/java/com/gapple/weeingback/domain/auth/dto/AuthJoinRequest.java index ed3f78f..ef773e8 100644 --- a/src/main/java/com/gapple/weeingback/domain/auth/dto/AuthJoinRequest.java +++ b/src/main/java/com/gapple/weeingback/domain/auth/dto/AuthJoinRequest.java @@ -7,11 +7,17 @@ @Getter @AllArgsConstructor public class AuthJoinRequest { - @Pattern(regexp = "^[a-zA-Z0-9._%+-]+@gsm.hs.kr$") + @Pattern(regexp = "^[a-zA-Z0-9._%+-]+@gsm.hs.kr$", message = "gsm.hs.kr 도메인을 사용하는 메일이 아닙니다.") @NotBlank private String email; @NotBlank - @Pattern(regexp = "^(?=.*[a-zA-Z])(?=.*\\d)(?=.*\\W).{8,16}$", message = "Invalid password") + @Pattern(regexp = "^(?=.*[a-zA-Z])(?=.*\\d)(?=.*\\W).{8,16}$", message = "정규식에 맞지 않는 비밀번호입니다.") private String password; + + @NotBlank + @Pattern(regexp = "^[가-힣]{2,}$", message = "한글 실명을 입력하지 않았습니다.") + private String name; + + private Long number; } \ No newline at end of file diff --git a/src/main/java/com/gapple/weeingback/domain/auth/service/impl/AuthServiceImpl.java b/src/main/java/com/gapple/weeingback/domain/auth/service/impl/AuthServiceImpl.java index 3f75b3e..e14a6cd 100644 --- a/src/main/java/com/gapple/weeingback/domain/auth/service/impl/AuthServiceImpl.java +++ b/src/main/java/com/gapple/weeingback/domain/auth/service/impl/AuthServiceImpl.java @@ -12,10 +12,15 @@ import org.springframework.http.ResponseEntity; import org.springframework.security.authentication.UsernamePasswordAuthenticationToken; import org.springframework.security.core.Authentication; +import org.springframework.security.core.GrantedAuthority; import org.springframework.security.crypto.password.PasswordEncoder; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; +import java.util.ArrayList; +import java.util.Collection; +import java.util.List; + @Service @RequiredArgsConstructor @Slf4j @@ -31,7 +36,9 @@ public ResponseEntity join(AuthJoinRequest req){ Member member = Member.builder() .email(req.getEmail()) .password(passwordEncoder.encode(req.getPassword())) - .role(AccessRole.STUDENT) + .name(req.getName()) + .number(req.getNumber()) + .role(AccessRole.ROLE_STUDENT.getName()) .build(); memberRepository.save(member); @@ -45,12 +52,13 @@ public ResponseEntity login(AuthLoginRequest request){ if(passwordEncoder.matches(request.getPassword(), member.getPassword())){ String id = member.getId().toString(); - String role = member.getRole().toString(); + String password = member.getPassword(); - log.info(id + " " + role); + List roles = new ArrayList<>(); + roles.add(AccessRole.valueOf(member.getRole())); Authentication authentication = - new UsernamePasswordAuthenticationToken(id, role); + new UsernamePasswordAuthenticationToken(id, password, roles); String token = jwtProvider.generateToken(authentication); return ResponseEntity.ok(new AuthLoginResponse(token, "ok")); } else throw new IllegalArgumentException(); diff --git a/src/main/java/com/gapple/weeingback/domain/boardgame/entity/Boardgame.java b/src/main/java/com/gapple/weeingback/domain/boardgame/entity/Boardgame.java new file mode 100644 index 0000000..66ba3dc --- /dev/null +++ b/src/main/java/com/gapple/weeingback/domain/boardgame/entity/Boardgame.java @@ -0,0 +1,33 @@ +package com.gapple.weeingback.domain.boardgame.entity; + +import com.gapple.weeingback.domain.member.entity.Member; +import jakarta.persistence.*; +import lombok.AllArgsConstructor; +import lombok.Getter; +import lombok.NoArgsConstructor; +import lombok.Setter; +import org.hibernate.annotations.GenericGenerator; + +import java.lang.reflect.Array; +import java.util.ArrayList; +import java.util.List; +import java.util.UUID; + +@Table +@Entity +@Getter @Setter +@NoArgsConstructor +@AllArgsConstructor +public class Boardgame { + @Id + @GeneratedValue(generator = "uuid2", strategy = GenerationType.IDENTITY) + @GenericGenerator(name="uuid2", strategy = "uuid2") + private UUID id; + + @Column + private UUID creator; + + @Column + @OneToMany(fetch = FetchType.LAZY) + private List members; +} diff --git a/src/main/java/com/gapple/weeingback/domain/consulting/controller/ConsultingController.java b/src/main/java/com/gapple/weeingback/domain/consulting/controller/ConsultingController.java index df9b5a4..86cb2f6 100644 --- a/src/main/java/com/gapple/weeingback/domain/consulting/controller/ConsultingController.java +++ b/src/main/java/com/gapple/weeingback/domain/consulting/controller/ConsultingController.java @@ -1,14 +1,13 @@ package com.gapple.weeingback.domain.consulting.controller; -import com.gapple.weeingback.domain.consulting.entity.dto.request.ConsultingSubmitResponse; +import com.gapple.weeingback.domain.consulting.entity.dto.request.ConsultingCancleRequest; +import com.gapple.weeingback.domain.consulting.entity.dto.response.ConsultingCancleResponse; +import com.gapple.weeingback.domain.consulting.entity.dto.response.ConsultingShowResponse; +import com.gapple.weeingback.domain.consulting.entity.dto.response.ConsultingSubmitResponse; import com.gapple.weeingback.domain.consulting.service.implementation.ConsultingServiceImpl; import jakarta.validation.Valid; -import org.springframework.http.HttpStatus; import org.springframework.http.ResponseEntity; -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 org.springframework.web.bind.annotation.*; import com.gapple.weeingback.domain.consulting.entity.dto.request.ConsultingSubmitRequest; import lombok.RequiredArgsConstructor; @@ -19,7 +18,17 @@ public class ConsultingController { private final ConsultingServiceImpl service; @PostMapping("/submit") - public ResponseEntity submitOkay(@Valid @RequestBody ConsultingSubmitRequest request){ + public ResponseEntity submitConsulting(@Valid @RequestBody ConsultingSubmitRequest request){ return service.submitConsulting(request); } + + @GetMapping("/list") + public ResponseEntity showConsulting(){ + return service.showConsulting(); + } + + @GetMapping("/cancle") + public ResponseEntity cancleConsulting(@Valid @RequestBody ConsultingCancleRequest request){ + return service.cancleConsulting(request); + } } diff --git a/src/main/java/com/gapple/weeingback/domain/consulting/entity/Consulting.java b/src/main/java/com/gapple/weeingback/domain/consulting/entity/Consulting.java index 4e4c3bf..cad4e68 100644 --- a/src/main/java/com/gapple/weeingback/domain/consulting/entity/Consulting.java +++ b/src/main/java/com/gapple/weeingback/domain/consulting/entity/Consulting.java @@ -1,7 +1,12 @@ package com.gapple.weeingback.domain.consulting.entity; +import com.gapple.weeingback.domain.member.entity.Member; import jakarta.persistence.*; import lombok.*; +import org.hibernate.annotations.GenericGenerator; + +import java.util.List; +import java.util.UUID; @Table @Entity @@ -10,8 +15,10 @@ @NoArgsConstructor @AllArgsConstructor public class Consulting { - @Id @GeneratedValue(strategy = GenerationType.IDENTITY) - private Long id; + @Id + @GeneratedValue(generator = "uuid2", strategy = GenerationType.IDENTITY) + @GenericGenerator(name="uuid2", strategy = "uuid2") + private UUID id; @Column(nullable = false) private Long issuedAt; @@ -22,8 +29,16 @@ public class Consulting { @Column(nullable = false) private boolean isAccess; - public Consulting(Long issuedAt, int classTime){ + @Column(columnDefinition = "VARCHAR(3000)") + private String description; + + public Consulting(Long issuedAt, int classTime, String description) { this.issuedAt = issuedAt; this.classTime = classTime; + this.description = description; + } + + public static Consulting toConsulting(Long issuedAt, int classTime, String description){ + return new Consulting(issuedAt, classTime, description); } } diff --git a/src/main/java/com/gapple/weeingback/domain/consulting/entity/ToConsultingResponse.java b/src/main/java/com/gapple/weeingback/domain/consulting/entity/ToConsultingResponse.java new file mode 100644 index 0000000..e90fdac --- /dev/null +++ b/src/main/java/com/gapple/weeingback/domain/consulting/entity/ToConsultingResponse.java @@ -0,0 +1,16 @@ +package com.gapple.weeingback.domain.consulting.entity; + +import lombok.AllArgsConstructor; +import lombok.Getter; + +@Getter +@AllArgsConstructor +public class ToConsultingResponse { + private String id; + + private Long issuedAt; + + private int classTime; + + private String description; +} diff --git a/src/main/java/com/gapple/weeingback/domain/consulting/entity/dto/request/ConsultingCancleRequest.java b/src/main/java/com/gapple/weeingback/domain/consulting/entity/dto/request/ConsultingCancleRequest.java index 4702eda..3e1ca4e 100644 --- a/src/main/java/com/gapple/weeingback/domain/consulting/entity/dto/request/ConsultingCancleRequest.java +++ b/src/main/java/com/gapple/weeingback/domain/consulting/entity/dto/request/ConsultingCancleRequest.java @@ -1,12 +1,12 @@ package com.gapple.weeingback.domain.consulting.entity.dto.request; -import jakarta.validation.constraints.Email; +import jakarta.validation.constraints.NotBlank; import lombok.AllArgsConstructor; import lombok.Getter; @Getter @AllArgsConstructor public class ConsultingCancleRequest { - @Email - private String email; + @NotBlank + private String consultingId; } diff --git a/src/main/java/com/gapple/weeingback/domain/consulting/entity/dto/request/ConsultingSubmitRequest.java b/src/main/java/com/gapple/weeingback/domain/consulting/entity/dto/request/ConsultingSubmitRequest.java index 9f22ba3..3953be2 100644 --- a/src/main/java/com/gapple/weeingback/domain/consulting/entity/dto/request/ConsultingSubmitRequest.java +++ b/src/main/java/com/gapple/weeingback/domain/consulting/entity/dto/request/ConsultingSubmitRequest.java @@ -1,5 +1,7 @@ package com.gapple.weeingback.domain.consulting.entity.dto.request; +import jakarta.validation.constraints.NotBlank; +import jakarta.validation.constraints.NotNull; import lombok.AllArgsConstructor; import lombok.Getter; import lombok.NoArgsConstructor; @@ -8,5 +10,9 @@ @NoArgsConstructor @AllArgsConstructor public class ConsultingSubmitRequest { + @NotNull private int classTime; + + @NotBlank + private String description; } diff --git a/src/main/java/com/gapple/weeingback/domain/consulting/entity/dto/response/ConsultingCancleResponse.java b/src/main/java/com/gapple/weeingback/domain/consulting/entity/dto/response/ConsultingCancleResponse.java new file mode 100644 index 0000000..4e6bb1f --- /dev/null +++ b/src/main/java/com/gapple/weeingback/domain/consulting/entity/dto/response/ConsultingCancleResponse.java @@ -0,0 +1,12 @@ +package com.gapple.weeingback.domain.consulting.entity.dto.response; + +import lombok.AllArgsConstructor; +import lombok.Getter; +import lombok.NoArgsConstructor; + +@Getter +@NoArgsConstructor +@AllArgsConstructor +public class ConsultingCancleResponse { + private String success; +} diff --git a/src/main/java/com/gapple/weeingback/domain/consulting/entity/dto/response/ConsultingShowResponse.java b/src/main/java/com/gapple/weeingback/domain/consulting/entity/dto/response/ConsultingShowResponse.java new file mode 100644 index 0000000..6353554 --- /dev/null +++ b/src/main/java/com/gapple/weeingback/domain/consulting/entity/dto/response/ConsultingShowResponse.java @@ -0,0 +1,21 @@ +package com.gapple.weeingback.domain.consulting.entity.dto.response; + +import com.gapple.weeingback.domain.consulting.entity.Consulting; +import com.gapple.weeingback.domain.consulting.entity.ToConsultingResponse; +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Getter; +import lombok.NoArgsConstructor; + +import java.util.List; + +@Getter +@Builder +@NoArgsConstructor +@AllArgsConstructor +public class ConsultingShowResponse { + + private List consults; + + private String success; +} diff --git a/src/main/java/com/gapple/weeingback/domain/consulting/entity/dto/request/ConsultingSubmitResponse.java b/src/main/java/com/gapple/weeingback/domain/consulting/entity/dto/response/ConsultingSubmitResponse.java similarity index 75% rename from src/main/java/com/gapple/weeingback/domain/consulting/entity/dto/request/ConsultingSubmitResponse.java rename to src/main/java/com/gapple/weeingback/domain/consulting/entity/dto/response/ConsultingSubmitResponse.java index bf23968..12f632f 100644 --- a/src/main/java/com/gapple/weeingback/domain/consulting/entity/dto/request/ConsultingSubmitResponse.java +++ b/src/main/java/com/gapple/weeingback/domain/consulting/entity/dto/response/ConsultingSubmitResponse.java @@ -1,4 +1,4 @@ -package com.gapple.weeingback.domain.consulting.entity.dto.request; +package com.gapple.weeingback.domain.consulting.entity.dto.response; import lombok.AllArgsConstructor; import lombok.Getter; diff --git a/src/main/java/com/gapple/weeingback/domain/consulting/repository/ConsultingRepository.java b/src/main/java/com/gapple/weeingback/domain/consulting/repository/ConsultingRepository.java new file mode 100644 index 0000000..7feaee2 --- /dev/null +++ b/src/main/java/com/gapple/weeingback/domain/consulting/repository/ConsultingRepository.java @@ -0,0 +1,12 @@ +package com.gapple.weeingback.domain.consulting.repository; + +import com.gapple.weeingback.domain.consulting.entity.Consulting; +import org.springframework.data.jpa.repository.JpaRepository; + +import java.util.List; +import java.util.UUID; + +public interface ConsultingRepository extends JpaRepository { + + void removeById(UUID consultingId); +} diff --git a/src/main/java/com/gapple/weeingback/domain/consulting/service/ConsultingService.java b/src/main/java/com/gapple/weeingback/domain/consulting/service/ConsultingService.java index c113b87..1175452 100644 --- a/src/main/java/com/gapple/weeingback/domain/consulting/service/ConsultingService.java +++ b/src/main/java/com/gapple/weeingback/domain/consulting/service/ConsultingService.java @@ -1,9 +1,16 @@ package com.gapple.weeingback.domain.consulting.service; +import com.gapple.weeingback.domain.consulting.entity.dto.request.ConsultingCancleRequest; +import com.gapple.weeingback.domain.consulting.entity.dto.response.ConsultingCancleResponse; +import com.gapple.weeingback.domain.consulting.entity.dto.response.ConsultingShowResponse; import com.gapple.weeingback.domain.consulting.entity.dto.request.ConsultingSubmitRequest; -import com.gapple.weeingback.domain.consulting.entity.dto.request.ConsultingSubmitResponse; +import com.gapple.weeingback.domain.consulting.entity.dto.response.ConsultingSubmitResponse; import org.springframework.http.ResponseEntity; public interface ConsultingService { ResponseEntity submitConsulting(ConsultingSubmitRequest request); + + ResponseEntity showConsulting(); + + ResponseEntity cancleConsulting(ConsultingCancleRequest request); } diff --git a/src/main/java/com/gapple/weeingback/domain/consulting/service/implementation/ConsultingServiceImpl.java b/src/main/java/com/gapple/weeingback/domain/consulting/service/implementation/ConsultingServiceImpl.java index 8eee82a..03a376c 100644 --- a/src/main/java/com/gapple/weeingback/domain/consulting/service/implementation/ConsultingServiceImpl.java +++ b/src/main/java/com/gapple/weeingback/domain/consulting/service/implementation/ConsultingServiceImpl.java @@ -1,37 +1,78 @@ package com.gapple.weeingback.domain.consulting.service.implementation; import com.gapple.weeingback.domain.consulting.entity.Consulting; +import com.gapple.weeingback.domain.consulting.entity.ToConsultingResponse; +import com.gapple.weeingback.domain.consulting.entity.dto.request.ConsultingCancleRequest; +import com.gapple.weeingback.domain.consulting.entity.dto.response.ConsultingCancleResponse; +import com.gapple.weeingback.domain.consulting.entity.dto.response.ConsultingShowResponse; import com.gapple.weeingback.domain.consulting.entity.dto.request.ConsultingSubmitRequest; -import com.gapple.weeingback.domain.consulting.entity.dto.request.ConsultingSubmitResponse; +import com.gapple.weeingback.domain.consulting.entity.dto.response.ConsultingSubmitResponse; +import com.gapple.weeingback.domain.consulting.repository.ConsultingRepository; import com.gapple.weeingback.domain.consulting.service.ConsultingService; import com.gapple.weeingback.domain.member.entity.Member; import com.gapple.weeingback.domain.member.repository.MemberRepository; -import jakarta.transaction.Transactional; import lombok.RequiredArgsConstructor; -import org.springframework.http.HttpStatus; +import lombok.extern.slf4j.Slf4j; import org.springframework.http.ResponseEntity; import org.springframework.security.core.context.SecurityContextHolder; import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; import java.time.Instant; +import java.util.ArrayList; +import java.util.List; import java.util.UUID; @Service +@Slf4j @RequiredArgsConstructor public class ConsultingServiceImpl implements ConsultingService { private final MemberRepository memberRepository; + private final ConsultingRepository consultingRepository; + @Override @Transactional public ResponseEntity submitConsulting(ConsultingSubmitRequest request){ String id = SecurityContextHolder.getContext().getAuthentication().getName(); + Member member = memberRepository.findMemberById(UUID.fromString(id)); - if(member.getConsulting() != null){ - member.setConsulting(new Consulting(Instant.now().toEpochMilli(), request.getClassTime())); - } + // 해당 시간이 니가 이미 보낸 신청이 있으면 거절할건데 로직 + + Consulting consulting = Consulting.toConsulting( + Instant.now().toEpochMilli(), + request.getClassTime(), + request.getDescription()); + member.addConsulting(consulting); + + consultingRepository.save(consulting); memberRepository.save(member); - return ResponseEntity.accepted().body(new ConsultingSubmitResponse("okay")); + return ResponseEntity.accepted().body(new ConsultingSubmitResponse("ok")); + } + + @Override + @Transactional + public ResponseEntity showConsulting() { + String id = SecurityContextHolder.getContext().getAuthentication().getName(); + Member member = memberRepository.findMemberById(UUID.fromString(id)); + + List consultingResponses = new ArrayList<>(); + + List consults = member.getConsulting(); + consults.forEach(consulting -> consultingResponses.add(new ToConsultingResponse( + consulting.getId().toString(), + consulting.getIssuedAt(), + consulting.getClassTime(), + consulting.getDescription()))); + + return ResponseEntity.ok().body(new ConsultingShowResponse(consultingResponses, "okay")); + } + + @Override + public ResponseEntity cancleConsulting(ConsultingCancleRequest request) { + consultingRepository.removeById(UUID.fromString(request.getConsultingId())); + return ResponseEntity.ok().body(new ConsultingCancleResponse("ok")); } } diff --git a/src/main/java/com/gapple/weeingback/domain/member/entity/AccessRole.java b/src/main/java/com/gapple/weeingback/domain/member/entity/AccessRole.java index cec6922..f4cf8bd 100644 --- a/src/main/java/com/gapple/weeingback/domain/member/entity/AccessRole.java +++ b/src/main/java/com/gapple/weeingback/domain/member/entity/AccessRole.java @@ -2,13 +2,19 @@ import lombok.AllArgsConstructor; import lombok.Getter; +import org.springframework.security.core.GrantedAuthority; @Getter @AllArgsConstructor -public enum AccessRole { - STUDENT("ROLE_STUDENT"), - TEACHER("ROLE_TEACHER"), - ADMIN("ROLE_ADMIN"); +public enum AccessRole implements GrantedAuthority { + ROLE_STUDENT("ROLE_STUDENT"), + ROLE_TEACHER("ROLE_TEACHER"), + ROLE_ADMIN("ROLE_ADMIN"); - String name; + public String name; + + @Override + public String getAuthority() { + return name; + } } diff --git a/src/main/java/com/gapple/weeingback/domain/member/entity/Member.java b/src/main/java/com/gapple/weeingback/domain/member/entity/Member.java index fa39667..7f23c68 100644 --- a/src/main/java/com/gapple/weeingback/domain/member/entity/Member.java +++ b/src/main/java/com/gapple/weeingback/domain/member/entity/Member.java @@ -1,11 +1,16 @@ package com.gapple.weeingback.domain.member.entity; +import com.gapple.weeingback.domain.boardgame.entity.Boardgame; import com.gapple.weeingback.domain.consulting.entity.Consulting; import jakarta.persistence.*; import lombok.*; import org.hibernate.annotations.GenericGenerator; +import org.springframework.security.core.GrantedAuthority; +import java.lang.reflect.Array; +import java.util.ArrayList; +import java.util.List; import java.util.UUID; @Table @@ -14,24 +19,41 @@ @Getter @Setter @NoArgsConstructor @AllArgsConstructor -public class Member { +public class Member implements GrantedAuthority { @Id @GeneratedValue(generator = "uuid2", strategy = GenerationType.IDENTITY) @GenericGenerator(name="uuid2", strategy = "uuid2") private UUID id; + @Column(columnDefinition = "VARCHAR(50)", nullable = false) + private String email; + @Column(columnDefinition = "VARCHAR(15)") private String name; - @Column(columnDefinition = "VARCHAR(50)", nullable = false) - private String email; + @Column(columnDefinition = "INTEGER") + private Long number; @Column(columnDefinition = "VARCHAR(80)", nullable = false) private String password; - private AccessRole role; + @Column(columnDefinition = "VARCHAR(80)", nullable = false) + private String role; + + @OneToMany(fetch = FetchType.EAGER) + @JoinColumn(name = "consulting_id") + private List consulting; + + @ManyToOne(fetch = FetchType.EAGER) + @JoinColumn(name = "boardgame_id") + private Boardgame boardgames; + + public void addConsulting(Consulting consulting){ + this.consulting.add(consulting); + } - @OneToOne - @JoinColumn(name = "consultation_id") - private Consulting consulting; + @Override + public String getAuthority() { + return role; + } } diff --git a/src/main/resources/application.yml b/src/main/resources/application.yml index 7beb8cc..7b32451 100644 --- a/src/main/resources/application.yml +++ b/src/main/resources/application.yml @@ -21,7 +21,7 @@ spring: open-in-view: false hibernate: dialect: org.hibernate.dialect.PostgreSQLDialect - ddl-auto: create-drop + ddl-auto: update properties: hibernate:format_sql: true show-sql: true diff --git a/src/test/java/com/gapple/weeingback/domain/member/service/implmentation/MemberServiceImplTest.java b/src/test/java/com/gapple/weeingback/domain/member/service/implmentation/MemberServiceImplTest.java deleted file mode 100644 index d0442f6..0000000 --- a/src/test/java/com/gapple/weeingback/domain/member/service/implmentation/MemberServiceImplTest.java +++ /dev/null @@ -1,20 +0,0 @@ -package com.gapple.weeingback.domain.member.service.implmentation; - -import com.gapple.weeingback.domain.consulting.entity.Consulting; -import com.gapple.weeingback.domain.member.entity.Member; -import org.junit.jupiter.api.Test; - - -class MemberServiceImplTest { - - @Test - void createUser(){ - // Give - Consulting consulting = new Consulting(); - Member member = Member.builder().consulting(consulting).email("hello@test.com").password("example").name("광수광수").build(); - - // When - - // - } -} \ No newline at end of file