Skip to content

Commit 1db8347

Browse files
authored
Merge pull request #32 from prgrms-web-devcourse-final-project/feat#18
[Feat] 멘토링 도메인 구현
2 parents e40dffa + b5b5a5d commit 1db8347

33 files changed

+1366
-31
lines changed

.gitignore

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -42,8 +42,9 @@ CLAUDE.md
4242
db_dev.mv.db
4343
db_dev.trace.db
4444

45-
4645
cookies.txt
4746

4847
.DS_Store
4948

49+
### QueryDSL Q클래스 ###
50+
**/generated/

back/build.gradle.kts

Lines changed: 21 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -27,22 +27,40 @@ repositories {
2727
}
2828

2929
dependencies {
30+
// JWT
3031
implementation("io.jsonwebtoken:jjwt-api:0.12.6")
3132
runtimeOnly("io.jsonwebtoken:jjwt-impl:0.12.6")
3233
runtimeOnly("io.jsonwebtoken:jjwt-jackson:0.12.6")
34+
35+
// Swagger
3336
implementation("org.springdoc:springdoc-openapi-starter-webmvc-ui:2.8.9")
37+
implementation("org.springdoc:springdoc-openapi-starter-webmvc-ui:2.8.13")
38+
39+
// Spring Boot
3440
implementation("org.springframework.boot:spring-boot-starter-actuator")
3541
implementation("org.springframework.boot:spring-boot-starter-data-jpa")
3642
implementation("org.springframework.boot:spring-boot-starter-security")
3743
implementation("org.springframework.boot:spring-boot-starter-web")
3844
implementation ("org.springframework.boot:spring-boot-starter-data-redis")
3945

40-
implementation("org.springdoc:springdoc-openapi-starter-webmvc-ui:2.8.13")
46+
// QueryDSL
47+
implementation("com.querydsl:querydsl-jpa:5.0.0:jakarta")
48+
annotationProcessor("com.querydsl:querydsl-apt:5.0.0:jakarta")
49+
annotationProcessor("jakarta.persistence:jakarta.persistence-api:3.1.0")
50+
annotationProcessor("jakarta.annotation:jakarta.annotation-api:2.1.1")
4151

52+
// Lombok
4253
compileOnly("org.projectlombok:lombok")
43-
developmentOnly("org.springframework.boot:spring-boot-devtools")
44-
runtimeOnly("com.h2database:h2")
4554
annotationProcessor("org.projectlombok:lombok")
55+
56+
// DB
57+
runtimeOnly("com.h2database:h2")
58+
runtimeOnly("com.mysql:mysql-connector-j")
59+
60+
// DevTools
61+
developmentOnly("org.springframework.boot:spring-boot-devtools")
62+
63+
// Test
4664
testImplementation("org.springframework.boot:spring-boot-starter-test")
4765
testImplementation("org.springframework.security:spring-security-test")
4866
testRuntimeOnly("org.junit.platform:junit-platform-launcher")

back/src/main/java/com/back/domain/member/mentee/entity/Mentee.java

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
import com.back.domain.member.member.entity.Member;
44
import com.back.global.jpa.BaseEntity;
55
import jakarta.persistence.*;
6+
import lombok.Builder;
67
import lombok.Getter;
78
import lombok.NoArgsConstructor;
89

@@ -17,6 +18,7 @@ public class Mentee extends BaseEntity {
1718
@Column(name = "job_id")
1819
private Long jobId;
1920

21+
@Builder
2022
public Mentee(Member member, Long jobId) {
2123
this.member = member;
2224
this.jobId = jobId;
Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
package com.back.domain.member.mentor.dto;
2+
3+
import com.back.domain.member.mentor.entity.Mentor;
4+
import io.swagger.v3.oas.annotations.media.Schema;
5+
6+
public record MentorDto (
7+
@Schema(description = "멘토 ID")
8+
Long mentorId,
9+
@Schema(description = "멘토명")
10+
String name,
11+
@Schema(description = "평점")
12+
Double rate,
13+
// TODO: Job id, name
14+
@Schema(description = "연차")
15+
Integer careerYears
16+
) {
17+
public static MentorDto from(Mentor mentor) {
18+
return new MentorDto(
19+
mentor.getId(),
20+
mentor.getMember().getName(),
21+
mentor.getRate(),
22+
mentor.getCareerYears()
23+
);
24+
}
25+
}

back/src/main/java/com/back/domain/member/mentor/entity/Mentor.java

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
import com.back.domain.member.member.entity.Member;
44
import com.back.global.jpa.BaseEntity;
55
import jakarta.persistence.*;
6+
import lombok.Builder;
67
import lombok.Getter;
78
import lombok.NoArgsConstructor;
89

@@ -23,6 +24,7 @@ public class Mentor extends BaseEntity {
2324
@Column(name = "career_years")
2425
private Integer careerYears;
2526

27+
@Builder
2628
public Mentor(Member member, Long jobId, Double rate, Integer careerYears) {
2729
this.member = member;
2830
this.jobId = jobId;
Lines changed: 95 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,95 @@
1+
package com.back.domain.mentoring.mentoring.controller;
2+
3+
import com.back.domain.member.member.entity.Member;
4+
import com.back.domain.mentoring.mentoring.dto.MentoringDto;
5+
import com.back.domain.mentoring.mentoring.dto.request.MentoringRequest;
6+
import com.back.domain.mentoring.mentoring.dto.response.MentoringPagingResponse;
7+
import com.back.domain.mentoring.mentoring.dto.response.MentoringResponse;
8+
import com.back.domain.mentoring.mentoring.service.MentoringService;
9+
import com.back.global.rq.Rq;
10+
import com.back.global.rsData.RsData;
11+
import jakarta.validation.Valid;
12+
import lombok.RequiredArgsConstructor;
13+
import org.springframework.data.domain.Page;
14+
import org.springframework.security.access.prepost.PreAuthorize;
15+
import org.springframework.web.bind.annotation.*;
16+
17+
@RestController
18+
@RequestMapping("/mentoring")
19+
@RequiredArgsConstructor
20+
public class MentoringController {
21+
private final MentoringService mentoringService;
22+
private final Rq rq;
23+
24+
@GetMapping
25+
public RsData<MentoringPagingResponse> getMentorings(
26+
@RequestParam(defaultValue = "0") int page,
27+
@RequestParam(defaultValue = "10") int size,
28+
@RequestParam(required = false) String keyword
29+
) {
30+
Page<MentoringDto> mentoringPage = mentoringService.getMentorings(keyword, page, size);
31+
MentoringPagingResponse resDto = MentoringPagingResponse.from(mentoringPage);
32+
33+
return new RsData<>(
34+
"200",
35+
"멘토링 목록을 조회하였습니다.",
36+
resDto
37+
);
38+
}
39+
40+
@GetMapping("/{mentoringId}")
41+
public RsData<MentoringResponse> getMentoring(
42+
@PathVariable Long mentoringId
43+
) {
44+
MentoringResponse mentoring = mentoringService.getMentoring(mentoringId);
45+
46+
return new RsData<>(
47+
"200",
48+
"멘토링을 조회하였습니다.",
49+
mentoring
50+
);
51+
}
52+
53+
@PostMapping
54+
@PreAuthorize("hasRole('MENTOR')")
55+
public RsData<MentoringResponse> createMentoring(
56+
@RequestBody @Valid MentoringRequest reqDto
57+
) {
58+
Member member = rq.getActor();
59+
MentoringResponse resDto = mentoringService.createMentoring(reqDto, member);
60+
61+
return new RsData<>(
62+
"201",
63+
"멘토링이 생성 완료되었습니다.",
64+
resDto
65+
);
66+
}
67+
68+
@PutMapping("/{mentoringId}")
69+
public RsData<MentoringResponse> updateMentoring(
70+
@PathVariable Long mentoringId,
71+
@RequestBody @Valid MentoringRequest reqDto
72+
) {
73+
Member member = rq.getActor();
74+
MentoringResponse resDto = mentoringService.updateMentoring(mentoringId, reqDto, member);
75+
76+
return new RsData<>(
77+
"200",
78+
"멘토링이 수정되었습니다.",
79+
resDto
80+
);
81+
}
82+
83+
@DeleteMapping("/{mentoringId}")
84+
public RsData<Void> deleteMentoring(
85+
@PathVariable Long mentoringId
86+
) {
87+
Member member = rq.getActor();
88+
mentoringService.deleteMentoring(mentoringId, member);
89+
90+
return new RsData<>(
91+
"200",
92+
"멘토링이 삭제되었습니다."
93+
);
94+
}
95+
}
Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,36 @@
1+
package com.back.domain.mentoring.mentoring.dto;
2+
3+
import com.back.domain.mentoring.mentoring.entity.Mentoring;
4+
import io.swagger.v3.oas.annotations.media.Schema;
5+
6+
import java.time.LocalDateTime;
7+
import java.util.List;
8+
9+
public record MentoringDetailDto(
10+
@Schema(description = "멘토링 ID")
11+
Long mentoringId,
12+
@Schema(description = "멘토링 제목")
13+
String title,
14+
@Schema(description = "멘토링 태그")
15+
List<String> tags,
16+
@Schema(description = "멘토링 소개")
17+
String bio,
18+
@Schema(description = "멘토링 썸네일")
19+
String thumb,
20+
@Schema(description = "생성일")
21+
LocalDateTime createDate,
22+
@Schema(description = "수정일")
23+
LocalDateTime modifyDate
24+
) {
25+
public static MentoringDetailDto from(Mentoring mentoring) {
26+
return new MentoringDetailDto(
27+
mentoring.getId(),
28+
mentoring.getTitle(),
29+
mentoring.getTags(),
30+
mentoring.getBio(),
31+
mentoring.getThumb(),
32+
mentoring.getCreateDate(),
33+
mentoring.getModifyDate()
34+
);
35+
}
36+
}
Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
package com.back.domain.mentoring.mentoring.dto;
2+
3+
import com.back.domain.mentoring.mentoring.entity.Mentoring;
4+
import io.swagger.v3.oas.annotations.media.Schema;
5+
6+
import java.util.List;
7+
8+
public record MentoringDto(
9+
@Schema(description = "멘토링 ID")
10+
Long mentoringId,
11+
@Schema(description = "멘토링 제목")
12+
String title,
13+
@Schema(description = "멘토링 태그")
14+
List<String> tags
15+
) {
16+
public static MentoringDto from(Mentoring mentoring) {
17+
return new MentoringDto(
18+
mentoring.getId(),
19+
mentoring.getTitle(),
20+
mentoring.getTags()
21+
);
22+
}
23+
}
Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
package com.back.domain.mentoring.mentoring.dto.request;
2+
3+
import io.swagger.v3.oas.annotations.media.Schema;
4+
import jakarta.validation.constraints.NotNull;
5+
import jakarta.validation.constraints.Size;
6+
7+
import java.util.List;
8+
9+
public record MentoringRequest(
10+
@Schema(description = "멘토링 제목")
11+
@NotNull @Size(max = 100)
12+
String title,
13+
14+
@Schema(description = "멘토링 태그", example = "[\"Java\", \"Spring\"]")
15+
List<String> tags,
16+
17+
@Schema(description = "멘토링 소개")
18+
@NotNull
19+
String bio,
20+
21+
@Schema(description = "멘토링 썸네일")
22+
String thumb
23+
) {
24+
}
Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
package com.back.domain.mentoring.mentoring.dto.response;
2+
3+
import com.back.domain.mentoring.mentoring.dto.MentoringDto;
4+
import org.springframework.data.domain.Page;
5+
6+
import java.util.List;
7+
8+
public record MentoringPagingResponse(
9+
List<MentoringDto> mentorings,
10+
int currentPage,
11+
int totalPage,
12+
long totalElements,
13+
boolean hasNext
14+
) {
15+
public static MentoringPagingResponse from(Page<MentoringDto> page) {
16+
return new MentoringPagingResponse(
17+
page.getContent(),
18+
page.getNumber(),
19+
page.getTotalPages(),
20+
page.getTotalElements(),
21+
page.hasNext()
22+
);
23+
}
24+
}

0 commit comments

Comments
 (0)