Skip to content

Commit d3f40c0

Browse files
authored
feat: 로드맵 / 공고 관련 API 수정 및 추가 (#90)
* feat: 창업지원단 공고 리스트 조회 API 구현 * feat: 교내 지원 공고 리스트 조회 API 구현 * feat: 교내 창업지원단 키워드 조회 API 구현 * feat: 로드맵 교내사업 Response 스팩 수정 * feat: 교내 공고 Response detailUrl 컬럼 추가 * feat: 창업 강의 로드맵 삭제 API 구현 * feat: 해당 창업 강의가 어떤 로드맵에 저장되어 있는지 여부 조회 API 구현
1 parent 13c9b27 commit d3f40c0

18 files changed

+262
-55
lines changed

src/main/java/com/startingblock/domain/announcement/application/AnnouncementService.java

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,5 +21,7 @@ public interface AnnouncementService {
2121
List<SystemRes> findSystems(UserPrincipal userPrincipal);
2222
List<OnCampusAnnouncementRes> findOnCampusAnnouncements(UserPrincipal userPrincipal, Keyword keyword);
2323
List<LectureRes> findLectures(UserPrincipal userPrincipal);
24+
List<SupportGroupRes> findSupportGroups(UserPrincipal userPrincipal, Keyword keyword);
25+
List<String> findSupportGroupKeywords(UserPrincipal userPrincipal);
2426

2527
}

src/main/java/com/startingblock/domain/announcement/application/AnnouncementServiceImpl.java

Lines changed: 23 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -274,12 +274,34 @@ public List<OnCampusAnnouncementRes> findOnCampusAnnouncements(final UserPrincip
274274
}
275275

276276
@Override
277-
public List<LectureRes> findLectures(UserPrincipal userPrincipal) {
277+
public List<LectureRes> findLectures(final UserPrincipal userPrincipal) {
278278
User user = userRepository.findById(userPrincipal.getId())
279279
.orElseThrow(InvalidUserException::new);
280280

281281
University university = University.of(user.getUniversity());
282282

283283
return announcementRepository.findLectures(userPrincipal.getId(), university);
284284
}
285+
286+
@Override
287+
public List<SupportGroupRes> findSupportGroups(final UserPrincipal userPrincipal, final Keyword keyword) {
288+
User user = userRepository.findById(userPrincipal.getId())
289+
.orElseThrow(InvalidUserException::new);
290+
291+
University university = University.of(user.getUniversity());
292+
293+
List<Announcement> supportGroups = announcementRepository.findSupportGroups(userPrincipal.getId(), university, keyword);
294+
return SupportGroupRes.toDto(supportGroups);
295+
}
296+
297+
@Override
298+
public List<String> findSupportGroupKeywords(UserPrincipal userPrincipal) {
299+
User user = userRepository.findById(userPrincipal.getId())
300+
.orElseThrow(InvalidUserException::new);
301+
302+
University university = University.of(user.getUniversity());
303+
304+
return announcementRepository.findSupportGroupKeywords(university);
305+
}
306+
285307
}
Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
package com.startingblock.domain.announcement.domain;
22

33
public enum AnnouncementType {
4-
OPEN_DATA, BIZ_INFO, ON_CAMPUS, SYSTEM
4+
OPEN_DATA, BIZ_INFO, ON_CAMPUS, SYSTEM, SUPPORT_GROUP
55
}

src/main/java/com/startingblock/domain/announcement/domain/Lecture.java

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -38,6 +38,10 @@ public void addRoadmapCount() {
3838
this.roadmapCount++;
3939
}
4040

41+
public void subtractRoadmapCount() {
42+
this.roadmapCount--;
43+
}
44+
4145
@Builder
4246
public Lecture(String title, String liberal, Integer credit, String session, String instructor, String content, University university) {
4347
this.title = title;

src/main/java/com/startingblock/domain/announcement/domain/repository/AnnouncementQuerydslRepository.java

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,5 +22,7 @@ public interface AnnouncementQuerydslRepository {
2222
List<OnCampusAnnouncementRes> findOnCampusAnnouncements(Long userId, University university, Keyword keyword);
2323
List<SystemRes> findSystems(Long userId, University university);
2424
List<LectureRes> findLectures(Long id, University university);
25+
List<Announcement> findSupportGroups(Long id, University university, Keyword keyword);
26+
List<String> findSupportGroupKeywords(University university);
2527

2628
}

src/main/java/com/startingblock/domain/announcement/domain/repository/AnnouncementQuerydslRepositoryImpl.java

Lines changed: 30 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -9,14 +9,14 @@
99
import com.startingblock.domain.announcement.dto.*;
1010
import com.startingblock.domain.common.Status;
1111
import com.startingblock.domain.roadmap.domain.QRoadmap;
12-
import com.startingblock.domain.roadmap.domain.QRoadmapLecture;
1312
import com.startingblock.domain.roadmap.domain.RoadmapStatus;
1413
import com.startingblock.domain.user.domain.User;
1514
import lombok.RequiredArgsConstructor;
1615
import org.springframework.data.domain.Pageable;
1716
import org.springframework.data.domain.Slice;
1817
import org.springframework.data.domain.SliceImpl;
1918

19+
import java.time.LocalDate;
2020
import java.time.LocalDateTime;
2121
import java.util.Arrays;
2222
import java.util.List;
@@ -162,8 +162,10 @@ public List<OnCampusAnnouncementRes> findOnCampusAnnouncements(final Long userId
162162
.select(
163163
new QOnCampusAnnouncementRes(
164164
announcement.id,
165+
announcement.keyword.stringValue(),
165166
announcement.title,
166-
announcement.content,
167+
announcement.insertDate,
168+
announcement.detailUrl,
167169
roadmapAnnouncement.announcement.id.isNotNull()
168170
)
169171
)
@@ -224,6 +226,32 @@ public List<LectureRes> findLectures(final Long id, final University university)
224226
.fetch();
225227
}
226228

229+
@Override
230+
public List<Announcement> findSupportGroups(final Long id, final University university, final Keyword keyword) {
231+
return queryFactory
232+
.selectFrom(announcement)
233+
.where(
234+
announcement.announcementType.eq(AnnouncementType.SUPPORT_GROUP),
235+
announcement.university.eq(university),
236+
keywordExpression(keyword)
237+
)
238+
.distinct()
239+
.fetch();
240+
}
241+
242+
@Override
243+
public List<String> findSupportGroupKeywords(University university) {
244+
return queryFactory
245+
.select(announcement.keyword.stringValue())
246+
.from(announcement)
247+
.where(
248+
announcement.announcementType.eq(AnnouncementType.SUPPORT_GROUP),
249+
announcement.university.eq(university)
250+
)
251+
.distinct()
252+
.fetch();
253+
}
254+
227255
private BooleanExpression keywordExpression(final Keyword keyword) {
228256
if (keyword == null) return null;
229257
return announcement.keyword.eq(keyword);

src/main/java/com/startingblock/domain/announcement/domain/repository/AnnouncementRepository.java

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44
import com.startingblock.domain.announcement.domain.AnnouncementType;
55
import com.startingblock.domain.announcement.domain.Keyword;
66
import com.startingblock.domain.announcement.domain.University;
7+
import com.startingblock.domain.announcement.dto.SupportGroupRes;
78
import org.springframework.data.jpa.repository.JpaRepository;
89

910
import java.util.List;
@@ -14,7 +15,5 @@ public interface AnnouncementRepository extends JpaRepository<Announcement, Long
1415
List<Announcement> findAnnouncementsByAnnouncementTypeAndIsFileUploaded(AnnouncementType announcementType, boolean isFileUsed);
1516

1617
List<Announcement> findByAnnouncementType(AnnouncementType announcementType);
17-
List<Announcement> findByAnnouncementTypeAndUniversity(AnnouncementType announcementType, University university);
18-
List<Announcement> findByAnnouncementTypeAndUniversityAndKeyword(AnnouncementType announcementType, University university, Keyword keyword);
1918

2019
}

src/main/java/com/startingblock/domain/announcement/dto/OnCampusAnnouncementRes.java

Lines changed: 10 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -2,26 +2,33 @@
22

33
import com.querydsl.core.annotations.QueryProjection;
44
import com.startingblock.domain.announcement.domain.Announcement;
5+
import com.startingblock.domain.announcement.domain.Keyword;
56
import lombok.AllArgsConstructor;
67
import lombok.Builder;
78
import lombok.Data;
89

10+
import java.time.LocalDate;
11+
import java.time.LocalDateTime;
912
import java.util.List;
1013

1114
@Data
1215
public class OnCampusAnnouncementRes {
1316

1417
private Long announcementId;
18+
private String keyword;
1519
private String title;
16-
private String content;
20+
private LocalDateTime insertDate;
21+
private String detailUrl;
1722
private Boolean isBookmarked;
1823

1924
@Builder
2025
@QueryProjection
21-
public OnCampusAnnouncementRes(Long announcementId, String title, String content, Boolean isBookmarked) {
26+
public OnCampusAnnouncementRes(Long announcementId, String keyword, String title, LocalDateTime insertDate, String detailUrl, Boolean isBookmarked) {
2227
this.announcementId = announcementId;
28+
this.keyword = keyword;
2329
this.title = title;
24-
this.content = content;
30+
this.insertDate = insertDate;
31+
this.detailUrl = detailUrl;
2532
this.isBookmarked = isBookmarked;
2633
}
2734

Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,29 @@
1+
package com.startingblock.domain.announcement.dto;
2+
3+
import com.startingblock.domain.announcement.domain.Announcement;
4+
import lombok.AllArgsConstructor;
5+
import lombok.Builder;
6+
import lombok.Data;
7+
8+
import java.util.List;
9+
10+
@Data
11+
@AllArgsConstructor
12+
@Builder
13+
public class SupportGroupRes {
14+
15+
private Long announcementId;
16+
private String title;
17+
private String content;
18+
19+
public static List<SupportGroupRes> toDto(final List<Announcement> supportGroups) {
20+
return supportGroups.stream()
21+
.map(supportGroup -> SupportGroupRes.builder()
22+
.announcementId(supportGroup.getId())
23+
.title(supportGroup.getTitle())
24+
.content(supportGroup.getContent())
25+
.build())
26+
.toList();
27+
}
28+
29+
}

src/main/java/com/startingblock/domain/announcement/presentation/AnnouncementController.java

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -63,6 +63,33 @@ public ResponseEntity<Slice<AnnouncementRes>> findAnnouncements(
6363
return ResponseEntity.ok(announcementService.findAnnouncements(userPrincipal, pageable, postTarget, region, supportType, sorting, search));
6464
}
6565

66+
@Operation(summary = "교내 창업지원단 검색", description = "교내 창업지원단 검색")
67+
@ApiResponses(value = {
68+
@ApiResponse(responseCode = "200", description = "교내 창업지원단 검색 성공", content = {@Content(mediaType = "application/json", array = @ArraySchema(schema = @Schema(implementation = SupportGroupRes.class)))}),
69+
@ApiResponse(responseCode = "400", description = "교내 창업지원단 검색 실패", content = {@Content(mediaType = "application/json", schema = @Schema(implementation = ErrorResponse.class))})
70+
})
71+
@GetMapping("/list/support-group")
72+
public ResponseEntity<List<SupportGroupRes>> findSupportGroups(
73+
@Parameter(name = "Authorization Token") @CurrentUser final UserPrincipal userPrincipal,
74+
@Parameter(name = "keyword", description = "키워드(CLUB/CAMP/CONTEST/LECTURE/MENTORING/ETC/SPACE)") @RequestParam(required = false) final Keyword keyword
75+
76+
) {
77+
return ResponseEntity.ok(announcementService.findSupportGroups(userPrincipal, keyword));
78+
}
79+
80+
@Operation(summary = "교내 창업지원단 키워드 조회", description = "교내 창업지원단 키워드 조회")
81+
@ApiResponses(value = {
82+
@ApiResponse(responseCode = "200", description = "교내 창업지원단 키워드 조회 성공", content = {@Content(mediaType = "application/json", array = @ArraySchema(schema = @Schema(implementation = String.class)))}),
83+
@ApiResponse(responseCode = "400", description = "교내 창업지원단 키워드 조회 실패", content = {@Content(mediaType = "application/json", schema = @Schema(implementation = ErrorResponse.class))})
84+
})
85+
@GetMapping("/list/support-group/keyword")
86+
public ResponseEntity<List<String>> findSupportGroupKeywords(
87+
@Parameter(name = "Authorization Token") @CurrentUser final UserPrincipal userPrincipal
88+
89+
) {
90+
return ResponseEntity.ok(announcementService.findSupportGroupKeywords(userPrincipal));
91+
}
92+
6693
@Operation(summary = "교내 학사 제도 검색", description = "교내 학사 제도 검색")
6794
@ApiResponses(value = {
6895
@ApiResponse(responseCode = "200", description = "교내 학사 제도 검색 성공", content = {@Content(mediaType = "application/json", array = @ArraySchema(schema = @Schema(implementation = SystemRes.class)))}),

src/main/java/com/startingblock/domain/roadmap/application/RoadmapService.java

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
package com.startingblock.domain.roadmap.application;
22

33
import com.startingblock.domain.announcement.dto.RoadmapLectureRes;
4-
import com.startingblock.domain.roadmap.dto.AnnouncementSavedRoadmapRes;
4+
import com.startingblock.domain.roadmap.dto.SavedRoadmapRes;
55
import com.startingblock.domain.roadmap.dto.RoadmapDetailRes;
66
import com.startingblock.domain.roadmap.dto.RoadmapRegisterReq;
77
import com.startingblock.domain.roadmap.dto.SwapRoadmapReq;
@@ -18,12 +18,14 @@ public interface RoadmapService {
1818
void deleteRoadmapAnnouncement(UserPrincipal userPrincipal, Long roadmapId, Long announcementId);
1919
List<RoadmapDetailRes> findRoadmaps(UserPrincipal userPrincipal);
2020
List<RoadmapDetailRes> deleteRoadmap(UserPrincipal userPrincipal, Long roadmapId);
21-
List<AnnouncementSavedRoadmapRes> findAnnouncementSavedRoadmap(UserPrincipal userPrincipal, Long announcementId);
21+
List<SavedRoadmapRes> findAnnouncementSavedRoadmap(UserPrincipal userPrincipal, Long announcementId);
2222
List<RoadmapDetailRes> swapRoadmap(UserPrincipal userPrincipal, SwapRoadmapReq swapRoadmapReq);
2323
List<RoadmapDetailRes> leapCurrentRoadmap(UserPrincipal userPrincipal);
2424
List<RoadmapDetailRes> addRoadmap(UserPrincipal userPrincipal, String roadmapTitle);
2525
List<?> findListOfRoadmap(UserPrincipal userPrincipal, Long roadmapId, String type);
2626
void addRoadmapLecture(UserPrincipal userPrincipal, Long roadmapId, Long lectureId);
2727
List<RoadmapLectureRes> findLecturesOfRoadmap(UserPrincipal userPrincipal, Long roadmapId);
28+
void deleteRoadmapLecture(UserPrincipal userPrincipal, Long roadmapId, Long lectureId);
29+
List<SavedRoadmapRes> findLectureSavedRoadmap(UserPrincipal userPrincipal, Long lectureId);
2830

2931
}

src/main/java/com/startingblock/domain/roadmap/application/RoadmapServiceImpl.java

Lines changed: 28 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@
55
import com.startingblock.domain.announcement.domain.repository.AnnouncementRepository;
66
import com.startingblock.domain.announcement.domain.repository.LectureRepository;
77
import com.startingblock.domain.announcement.dto.RoadmapLectureRes;
8-
import com.startingblock.domain.announcement.dto.RoadmapAnnouncementRes;
8+
import com.startingblock.domain.roadmap.dto.*;
99
import com.startingblock.domain.announcement.dto.RoadmapSystemRes;
1010
import com.startingblock.domain.announcement.exception.InvalidAnnouncementException;
1111
import com.startingblock.domain.announcement.exception.InvalidLectureException;
@@ -16,10 +16,6 @@
1616
import com.startingblock.domain.roadmap.domain.repository.RoadmapAnnouncementRepository;
1717
import com.startingblock.domain.roadmap.domain.repository.RoadmapLectureRepository;
1818
import com.startingblock.domain.roadmap.domain.repository.RoadmapRepository;
19-
import com.startingblock.domain.roadmap.dto.AnnouncementSavedRoadmapRes;
20-
import com.startingblock.domain.roadmap.dto.RoadmapDetailRes;
21-
import com.startingblock.domain.roadmap.dto.RoadmapRegisterReq;
22-
import com.startingblock.domain.roadmap.dto.SwapRoadmapReq;
2319
import com.startingblock.domain.roadmap.exception.*;
2420
import com.startingblock.domain.user.domain.User;
2521
import com.startingblock.domain.user.domain.repository.UserRepository;
@@ -158,10 +154,15 @@ public List<RoadmapDetailRes> findRoadmaps(final UserPrincipal userPrincipal) {
158154
}
159155

160156
@Override
161-
public List<AnnouncementSavedRoadmapRes> findAnnouncementSavedRoadmap(final UserPrincipal userPrincipal, final Long announcementId) {
157+
public List<SavedRoadmapRes> findAnnouncementSavedRoadmap(final UserPrincipal userPrincipal, final Long announcementId) {
162158
return roadmapRepository.findAnnouncementSavedRoadmap(announcementId, userPrincipal.getId());
163159
}
164160

161+
@Override
162+
public List<SavedRoadmapRes> findLectureSavedRoadmap(final UserPrincipal userPrincipal, final Long lectureId) {
163+
return roadmapRepository.findLectureSavedRoadmap(lectureId, userPrincipal.getId());
164+
}
165+
165166
@Override
166167
@Transactional
167168
public List<RoadmapDetailRes> swapRoadmap(final UserPrincipal userPrincipal, final SwapRoadmapReq swapRoadmapReq) {
@@ -252,9 +253,9 @@ public List<?> findListOfRoadmap(final UserPrincipal userPrincipal, final Long r
252253
List<Announcement> announcements = announcementRepository.findListOfRoadmapByRoadmapId(userPrincipal.getId(), roadmapId, type);
253254

254255
if(type.equals("OFF-CAMPUS"))
255-
return RoadmapAnnouncementRes.toOffCampusDto(announcements);
256+
return RoadmapAnnouncementRes.toDto(announcements);
256257
else if(type.equals("ON-CAMPUS"))
257-
return RoadmapAnnouncementRes.toOnCampusDto(announcements);
258+
return RoadmapOnCampusRes.toDto(announcements);
258259
else
259260
return RoadmapSystemRes.toDto(announcements);
260261
}
@@ -290,4 +291,23 @@ public List<RoadmapLectureRes> findLecturesOfRoadmap(UserPrincipal userPrincipal
290291
return RoadmapLectureRes.toDto(lectures);
291292
}
292293

294+
@Override
295+
@Transactional
296+
public void deleteRoadmapLecture(UserPrincipal userPrincipal, Long roadmapId, Long lectureId) {
297+
Roadmap roadmap = roadmapRepository.findRoadmapById(roadmapId)
298+
.orElseThrow(EmptyRoadmapException::new);
299+
300+
if (!Objects.equals(roadmap.getUser().getId(), userPrincipal.getId()))
301+
throw new RoadmapMismatchUserException();
302+
303+
Lecture lecture = lectureRepository.findById(lectureId)
304+
.orElseThrow(InvalidAnnouncementException::new);
305+
306+
RoadmapLecture roadmapLecture = roadmapLectureRepository.findByRoadmapAndLecture(roadmap, lecture)
307+
.orElseThrow(InvalidAnnouncementRoadmapException::new);
308+
309+
lecture.subtractRoadmapCount();
310+
roadmapLectureRepository.delete(roadmapLecture);
311+
}
312+
293313
}
Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
package com.startingblock.domain.roadmap.domain.repository;
22

33
import com.startingblock.domain.roadmap.domain.Roadmap;
4-
import com.startingblock.domain.roadmap.dto.AnnouncementSavedRoadmapRes;
4+
import com.startingblock.domain.roadmap.dto.SavedRoadmapRes;
55
import com.startingblock.domain.roadmap.dto.RoadmapDetailRes;
66

77
import java.util.List;
@@ -10,6 +10,7 @@ public interface RoadmapQuerydslRepository {
1010

1111
List<RoadmapDetailRes> findRoadmapDetailResponsesByUserId(Long userId);
1212
List<Roadmap> findRoadmapsByUserId(Long userId);
13-
List<AnnouncementSavedRoadmapRes> findAnnouncementSavedRoadmap(Long announcementId, Long userId);
13+
List<SavedRoadmapRes> findAnnouncementSavedRoadmap(Long announcementId, Long userId);
14+
List<SavedRoadmapRes> findLectureSavedRoadmap(Long lectureId, Long id);
1415

1516
}

0 commit comments

Comments
 (0)