Skip to content

Commit

Permalink
Merge pull request #91 from teamSynapse6/develop
Browse files Browse the repository at this point in the history
feat: 로드맵 / 공고 관련 API 수정 및 추가 (#90)
  • Loading branch information
sejineer authored May 11, 2024
2 parents 4b838f6 + d3f40c0 commit ac8bdf8
Show file tree
Hide file tree
Showing 18 changed files with 262 additions and 55 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -21,5 +21,7 @@ public interface AnnouncementService {
List<SystemRes> findSystems(UserPrincipal userPrincipal);
List<OnCampusAnnouncementRes> findOnCampusAnnouncements(UserPrincipal userPrincipal, Keyword keyword);
List<LectureRes> findLectures(UserPrincipal userPrincipal);
List<SupportGroupRes> findSupportGroups(UserPrincipal userPrincipal, Keyword keyword);
List<String> findSupportGroupKeywords(UserPrincipal userPrincipal);

}
Original file line number Diff line number Diff line change
Expand Up @@ -274,12 +274,34 @@ public List<OnCampusAnnouncementRes> findOnCampusAnnouncements(final UserPrincip
}

@Override
public List<LectureRes> findLectures(UserPrincipal userPrincipal) {
public List<LectureRes> findLectures(final UserPrincipal userPrincipal) {
User user = userRepository.findById(userPrincipal.getId())
.orElseThrow(InvalidUserException::new);

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

return announcementRepository.findLectures(userPrincipal.getId(), university);
}

@Override
public List<SupportGroupRes> findSupportGroups(final UserPrincipal userPrincipal, final Keyword keyword) {
User user = userRepository.findById(userPrincipal.getId())
.orElseThrow(InvalidUserException::new);

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

List<Announcement> supportGroups = announcementRepository.findSupportGroups(userPrincipal.getId(), university, keyword);
return SupportGroupRes.toDto(supportGroups);
}

@Override
public List<String> findSupportGroupKeywords(UserPrincipal userPrincipal) {
User user = userRepository.findById(userPrincipal.getId())
.orElseThrow(InvalidUserException::new);

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

return announcementRepository.findSupportGroupKeywords(university);
}

}
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
package com.startingblock.domain.announcement.domain;

public enum AnnouncementType {
OPEN_DATA, BIZ_INFO, ON_CAMPUS, SYSTEM
OPEN_DATA, BIZ_INFO, ON_CAMPUS, SYSTEM, SUPPORT_GROUP
}
Original file line number Diff line number Diff line change
Expand Up @@ -38,6 +38,10 @@ public void addRoadmapCount() {
this.roadmapCount++;
}

public void subtractRoadmapCount() {
this.roadmapCount--;
}

@Builder
public Lecture(String title, String liberal, Integer credit, String session, String instructor, String content, University university) {
this.title = title;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -22,5 +22,7 @@ public interface AnnouncementQuerydslRepository {
List<OnCampusAnnouncementRes> findOnCampusAnnouncements(Long userId, University university, Keyword keyword);
List<SystemRes> findSystems(Long userId, University university);
List<LectureRes> findLectures(Long id, University university);
List<Announcement> findSupportGroups(Long id, University university, Keyword keyword);
List<String> findSupportGroupKeywords(University university);

}
Original file line number Diff line number Diff line change
Expand Up @@ -9,14 +9,14 @@
import com.startingblock.domain.announcement.dto.*;
import com.startingblock.domain.common.Status;
import com.startingblock.domain.roadmap.domain.QRoadmap;
import com.startingblock.domain.roadmap.domain.QRoadmapLecture;
import com.startingblock.domain.roadmap.domain.RoadmapStatus;
import com.startingblock.domain.user.domain.User;
import lombok.RequiredArgsConstructor;
import org.springframework.data.domain.Pageable;
import org.springframework.data.domain.Slice;
import org.springframework.data.domain.SliceImpl;

import java.time.LocalDate;
import java.time.LocalDateTime;
import java.util.Arrays;
import java.util.List;
Expand Down Expand Up @@ -162,8 +162,10 @@ public List<OnCampusAnnouncementRes> findOnCampusAnnouncements(final Long userId
.select(
new QOnCampusAnnouncementRes(
announcement.id,
announcement.keyword.stringValue(),
announcement.title,
announcement.content,
announcement.insertDate,
announcement.detailUrl,
roadmapAnnouncement.announcement.id.isNotNull()
)
)
Expand Down Expand Up @@ -224,6 +226,32 @@ public List<LectureRes> findLectures(final Long id, final University university)
.fetch();
}

@Override
public List<Announcement> findSupportGroups(final Long id, final University university, final Keyword keyword) {
return queryFactory
.selectFrom(announcement)
.where(
announcement.announcementType.eq(AnnouncementType.SUPPORT_GROUP),
announcement.university.eq(university),
keywordExpression(keyword)
)
.distinct()
.fetch();
}

@Override
public List<String> findSupportGroupKeywords(University university) {
return queryFactory
.select(announcement.keyword.stringValue())
.from(announcement)
.where(
announcement.announcementType.eq(AnnouncementType.SUPPORT_GROUP),
announcement.university.eq(university)
)
.distinct()
.fetch();
}

private BooleanExpression keywordExpression(final Keyword keyword) {
if (keyword == null) return null;
return announcement.keyword.eq(keyword);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@
import com.startingblock.domain.announcement.domain.AnnouncementType;
import com.startingblock.domain.announcement.domain.Keyword;
import com.startingblock.domain.announcement.domain.University;
import com.startingblock.domain.announcement.dto.SupportGroupRes;
import org.springframework.data.jpa.repository.JpaRepository;

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

List<Announcement> findByAnnouncementType(AnnouncementType announcementType);
List<Announcement> findByAnnouncementTypeAndUniversity(AnnouncementType announcementType, University university);
List<Announcement> findByAnnouncementTypeAndUniversityAndKeyword(AnnouncementType announcementType, University university, Keyword keyword);

}
Original file line number Diff line number Diff line change
Expand Up @@ -2,26 +2,33 @@

import com.querydsl.core.annotations.QueryProjection;
import com.startingblock.domain.announcement.domain.Announcement;
import com.startingblock.domain.announcement.domain.Keyword;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;

import java.time.LocalDate;
import java.time.LocalDateTime;
import java.util.List;

@Data
public class OnCampusAnnouncementRes {

private Long announcementId;
private String keyword;
private String title;
private String content;
private LocalDateTime insertDate;
private String detailUrl;
private Boolean isBookmarked;

@Builder
@QueryProjection
public OnCampusAnnouncementRes(Long announcementId, String title, String content, Boolean isBookmarked) {
public OnCampusAnnouncementRes(Long announcementId, String keyword, String title, LocalDateTime insertDate, String detailUrl, Boolean isBookmarked) {
this.announcementId = announcementId;
this.keyword = keyword;
this.title = title;
this.content = content;
this.insertDate = insertDate;
this.detailUrl = detailUrl;
this.isBookmarked = isBookmarked;
}

Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,29 @@
package com.startingblock.domain.announcement.dto;

import com.startingblock.domain.announcement.domain.Announcement;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;

import java.util.List;

@Data
@AllArgsConstructor
@Builder
public class SupportGroupRes {

private Long announcementId;
private String title;
private String content;

public static List<SupportGroupRes> toDto(final List<Announcement> supportGroups) {
return supportGroups.stream()
.map(supportGroup -> SupportGroupRes.builder()
.announcementId(supportGroup.getId())
.title(supportGroup.getTitle())
.content(supportGroup.getContent())
.build())
.toList();
}

}
Original file line number Diff line number Diff line change
Expand Up @@ -63,6 +63,33 @@ public ResponseEntity<Slice<AnnouncementRes>> findAnnouncements(
return ResponseEntity.ok(announcementService.findAnnouncements(userPrincipal, pageable, postTarget, region, supportType, sorting, search));
}

@Operation(summary = "교내 창업지원단 검색", description = "교내 창업지원단 검색")
@ApiResponses(value = {
@ApiResponse(responseCode = "200", description = "교내 창업지원단 검색 성공", content = {@Content(mediaType = "application/json", array = @ArraySchema(schema = @Schema(implementation = SupportGroupRes.class)))}),
@ApiResponse(responseCode = "400", description = "교내 창업지원단 검색 실패", content = {@Content(mediaType = "application/json", schema = @Schema(implementation = ErrorResponse.class))})
})
@GetMapping("/list/support-group")
public ResponseEntity<List<SupportGroupRes>> findSupportGroups(
@Parameter(name = "Authorization Token") @CurrentUser final UserPrincipal userPrincipal,
@Parameter(name = "keyword", description = "키워드(CLUB/CAMP/CONTEST/LECTURE/MENTORING/ETC/SPACE)") @RequestParam(required = false) final Keyword keyword

) {
return ResponseEntity.ok(announcementService.findSupportGroups(userPrincipal, keyword));
}

@Operation(summary = "교내 창업지원단 키워드 조회", description = "교내 창업지원단 키워드 조회")
@ApiResponses(value = {
@ApiResponse(responseCode = "200", description = "교내 창업지원단 키워드 조회 성공", content = {@Content(mediaType = "application/json", array = @ArraySchema(schema = @Schema(implementation = String.class)))}),
@ApiResponse(responseCode = "400", description = "교내 창업지원단 키워드 조회 실패", content = {@Content(mediaType = "application/json", schema = @Schema(implementation = ErrorResponse.class))})
})
@GetMapping("/list/support-group/keyword")
public ResponseEntity<List<String>> findSupportGroupKeywords(
@Parameter(name = "Authorization Token") @CurrentUser final UserPrincipal userPrincipal

) {
return ResponseEntity.ok(announcementService.findSupportGroupKeywords(userPrincipal));
}

@Operation(summary = "교내 학사 제도 검색", description = "교내 학사 제도 검색")
@ApiResponses(value = {
@ApiResponse(responseCode = "200", description = "교내 학사 제도 검색 성공", content = {@Content(mediaType = "application/json", array = @ArraySchema(schema = @Schema(implementation = SystemRes.class)))}),
Expand Down
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
package com.startingblock.domain.roadmap.application;

import com.startingblock.domain.announcement.dto.RoadmapLectureRes;
import com.startingblock.domain.roadmap.dto.AnnouncementSavedRoadmapRes;
import com.startingblock.domain.roadmap.dto.SavedRoadmapRes;
import com.startingblock.domain.roadmap.dto.RoadmapDetailRes;
import com.startingblock.domain.roadmap.dto.RoadmapRegisterReq;
import com.startingblock.domain.roadmap.dto.SwapRoadmapReq;
Expand All @@ -18,12 +18,14 @@ public interface RoadmapService {
void deleteRoadmapAnnouncement(UserPrincipal userPrincipal, Long roadmapId, Long announcementId);
List<RoadmapDetailRes> findRoadmaps(UserPrincipal userPrincipal);
List<RoadmapDetailRes> deleteRoadmap(UserPrincipal userPrincipal, Long roadmapId);
List<AnnouncementSavedRoadmapRes> findAnnouncementSavedRoadmap(UserPrincipal userPrincipal, Long announcementId);
List<SavedRoadmapRes> findAnnouncementSavedRoadmap(UserPrincipal userPrincipal, Long announcementId);
List<RoadmapDetailRes> swapRoadmap(UserPrincipal userPrincipal, SwapRoadmapReq swapRoadmapReq);
List<RoadmapDetailRes> leapCurrentRoadmap(UserPrincipal userPrincipal);
List<RoadmapDetailRes> addRoadmap(UserPrincipal userPrincipal, String roadmapTitle);
List<?> findListOfRoadmap(UserPrincipal userPrincipal, Long roadmapId, String type);
void addRoadmapLecture(UserPrincipal userPrincipal, Long roadmapId, Long lectureId);
List<RoadmapLectureRes> findLecturesOfRoadmap(UserPrincipal userPrincipal, Long roadmapId);
void deleteRoadmapLecture(UserPrincipal userPrincipal, Long roadmapId, Long lectureId);
List<SavedRoadmapRes> findLectureSavedRoadmap(UserPrincipal userPrincipal, Long lectureId);

}
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@
import com.startingblock.domain.announcement.domain.repository.AnnouncementRepository;
import com.startingblock.domain.announcement.domain.repository.LectureRepository;
import com.startingblock.domain.announcement.dto.RoadmapLectureRes;
import com.startingblock.domain.announcement.dto.RoadmapAnnouncementRes;
import com.startingblock.domain.roadmap.dto.*;
import com.startingblock.domain.announcement.dto.RoadmapSystemRes;
import com.startingblock.domain.announcement.exception.InvalidAnnouncementException;
import com.startingblock.domain.announcement.exception.InvalidLectureException;
Expand All @@ -16,10 +16,6 @@
import com.startingblock.domain.roadmap.domain.repository.RoadmapAnnouncementRepository;
import com.startingblock.domain.roadmap.domain.repository.RoadmapLectureRepository;
import com.startingblock.domain.roadmap.domain.repository.RoadmapRepository;
import com.startingblock.domain.roadmap.dto.AnnouncementSavedRoadmapRes;
import com.startingblock.domain.roadmap.dto.RoadmapDetailRes;
import com.startingblock.domain.roadmap.dto.RoadmapRegisterReq;
import com.startingblock.domain.roadmap.dto.SwapRoadmapReq;
import com.startingblock.domain.roadmap.exception.*;
import com.startingblock.domain.user.domain.User;
import com.startingblock.domain.user.domain.repository.UserRepository;
Expand Down Expand Up @@ -158,10 +154,15 @@ public List<RoadmapDetailRes> findRoadmaps(final UserPrincipal userPrincipal) {
}

@Override
public List<AnnouncementSavedRoadmapRes> findAnnouncementSavedRoadmap(final UserPrincipal userPrincipal, final Long announcementId) {
public List<SavedRoadmapRes> findAnnouncementSavedRoadmap(final UserPrincipal userPrincipal, final Long announcementId) {
return roadmapRepository.findAnnouncementSavedRoadmap(announcementId, userPrincipal.getId());
}

@Override
public List<SavedRoadmapRes> findLectureSavedRoadmap(final UserPrincipal userPrincipal, final Long lectureId) {
return roadmapRepository.findLectureSavedRoadmap(lectureId, userPrincipal.getId());
}

@Override
@Transactional
public List<RoadmapDetailRes> swapRoadmap(final UserPrincipal userPrincipal, final SwapRoadmapReq swapRoadmapReq) {
Expand Down Expand Up @@ -252,9 +253,9 @@ public List<?> findListOfRoadmap(final UserPrincipal userPrincipal, final Long r
List<Announcement> announcements = announcementRepository.findListOfRoadmapByRoadmapId(userPrincipal.getId(), roadmapId, type);

if(type.equals("OFF-CAMPUS"))
return RoadmapAnnouncementRes.toOffCampusDto(announcements);
return RoadmapAnnouncementRes.toDto(announcements);
else if(type.equals("ON-CAMPUS"))
return RoadmapAnnouncementRes.toOnCampusDto(announcements);
return RoadmapOnCampusRes.toDto(announcements);
else
return RoadmapSystemRes.toDto(announcements);
}
Expand Down Expand Up @@ -290,4 +291,23 @@ public List<RoadmapLectureRes> findLecturesOfRoadmap(UserPrincipal userPrincipal
return RoadmapLectureRes.toDto(lectures);
}

@Override
@Transactional
public void deleteRoadmapLecture(UserPrincipal userPrincipal, Long roadmapId, Long lectureId) {
Roadmap roadmap = roadmapRepository.findRoadmapById(roadmapId)
.orElseThrow(EmptyRoadmapException::new);

if (!Objects.equals(roadmap.getUser().getId(), userPrincipal.getId()))
throw new RoadmapMismatchUserException();

Lecture lecture = lectureRepository.findById(lectureId)
.orElseThrow(InvalidAnnouncementException::new);

RoadmapLecture roadmapLecture = roadmapLectureRepository.findByRoadmapAndLecture(roadmap, lecture)
.orElseThrow(InvalidAnnouncementRoadmapException::new);

lecture.subtractRoadmapCount();
roadmapLectureRepository.delete(roadmapLecture);
}

}
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
package com.startingblock.domain.roadmap.domain.repository;

import com.startingblock.domain.roadmap.domain.Roadmap;
import com.startingblock.domain.roadmap.dto.AnnouncementSavedRoadmapRes;
import com.startingblock.domain.roadmap.dto.SavedRoadmapRes;
import com.startingblock.domain.roadmap.dto.RoadmapDetailRes;

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

List<RoadmapDetailRes> findRoadmapDetailResponsesByUserId(Long userId);
List<Roadmap> findRoadmapsByUserId(Long userId);
List<AnnouncementSavedRoadmapRes> findAnnouncementSavedRoadmap(Long announcementId, Long userId);
List<SavedRoadmapRes> findAnnouncementSavedRoadmap(Long announcementId, Long userId);
List<SavedRoadmapRes> findLectureSavedRoadmap(Long lectureId, Long id);

}
Loading

0 comments on commit ac8bdf8

Please sign in to comment.