Skip to content

Commit

Permalink
deploy: 2차 배포 (#38)
Browse files Browse the repository at this point in the history
* feat: 소속 단위 선거 기본 정보 추가 기능 구현

s3 업로드 기능 global로 수정 필요

* feat: 소속 단위 선거 기본 정보 등록용 엔티티 추가

* 온프레미스 환경 회원가입/로그인 코드 추가 (#9)

* feat: refreshtoken 저장 엔터티 추가

* feat: 패스워드 암호화 빈 추가

* feat: 회원 가입 로직 구현

* feat: 로그인 필터 추가

* feat: 온프레미스 서버 환경 로그인 기능 추가 (#10)

* feat: refreshtoken 저장 엔터티 추가

* feat: 패스워드 암호화 빈 추가

* feat: 회원 가입 로직 구현

* feat: 로그인 필터 추가

* feat: UserDetailsService, dto 구현

* feat: 서울 기준 시 설정

* feat: JWT 발급 코드 추가

* feat: JWTFilter 추가

* feat: cors 설정 추가

* feat: userdetailsservice 예외처리 추가

* fix: url length 추가

length가 255이상 인 경우 오류 가능 수정

* fix: dto추가

requestparam dto로 수정

* feat:선거기본정보 에러코드 추가

* fix: validation, lombok, dto 추가

validation, lombok, dto 추가

* docs: 회원가입 api 스웨거 작성 (#12)

* feat: refreshtoken 저장 엔터티 추가

* feat: 패스워드 암호화 빈 추가

* feat: 회원 가입 로직 구현

* feat: 로그인 필터 추가

* feat: UserDetailsService, dto 구현

* feat: 서울 기준 시 설정

* feat: JWT 발급 코드 추가

* feat: JWTFilter 추가

* feat: cors 설정 추가

* feat: userdetailsservice 예외처리 추가

* docs: 회원가입 api 스웨거 작성

* feat: 필터기반 로그인 -> 수동 인증 로직으로 수정 (#13)

* feat: refreshtoken 저장 엔터티 추가

* feat: 패스워드 암호화 빈 추가

* feat: 회원 가입 로직 구현

* feat: 로그인 필터 추가

* feat: UserDetailsService, dto 구현

* feat: 서울 기준 시 설정

* feat: JWT 발급 코드 추가

* feat: JWTFilter 추가

* feat: cors 설정 추가

* feat: userdetailsservice 예외처리 추가

* docs: 회원가입 api 스웨거 작성

* feat: 필터기반 로그인 -> 수동 인증 로직으로 수정

* feat: refreshToken 저장 추가 (#14)

* feat: refreshtoken 저장 엔터티 추가

* feat: 패스워드 암호화 빈 추가

* feat: 회원 가입 로직 구현

* feat: 로그인 필터 추가

* feat: UserDetailsService, dto 구현

* feat: 서울 기준 시 설정

* feat: JWT 발급 코드 추가

* feat: JWTFilter 추가

* feat: cors 설정 추가

* feat: userdetailsservice 예외처리 추가

* docs: 회원가입 api 스웨거 작성

* feat: 필터기반 로그인 -> 수동 인증 로직으로 수정

* feat: refreshToken 저장 추가

* feat: 회원가입 요청한 유저의 목록 조회 기능 구현 (#16)

* feat:s3 bean추가

* fix:import수정

* infra: cicd 연결 테스트

* infra: ci test

* fix:후보자 정보 등록 엔티티 요소 수정

피그마 등록화면에 맞게 선거유형, 선본명, 선본 통신공간 주소, 입후보자 공고 이미지, 로고 이미지로 교체

* feat:후보자 등록 선거 유형 단선/경선 선택 옵션

* feat:후보자 등록 기능 개발

* feat : s3서비스 파일 생성, 후보자 등록 시 poster/유저id값 경로에 저장

* fix:엔드포인트 추가

* feat:후보자 정보 등록 레이어 생성

* fix:문자열비교 수정 , transactional추가

* fix:공개 접속 옵션 삭제

* fix:후보자 리스트

* fix:후보자 기본 정보 업로드 클래스명 poster -> candidateInfo로 변경

* fix:엔드포인트 수정

* fix:후보자 정보 등록 폴더명 변경

* feat:각 후보 별 게시물 등록 엔티티 생성

* feat: 각 후보의 게시물 등록 기능

* fix:엔드포인트추가

* fix:dto타입으로 반환

* feat: 유저 가입 승인 기능 구현 (#24)

* feat: 회원가입 요청한 유저의 목록 조회 기능 구현

* feat: 유저 가입 승인 기능 구현

* feat: 가입 요청 거절 기능 구현 (#26)

* feat: 회원가입 요청한 유저의 목록 조회 기능 구현

* feat: 유저 가입 승인 기능 구현

* feat: 가입 요청 거절 기능 구현

* feat: 선거 생성 도메인 수정 (#28)

* feat: 회원가입 요청한 유저의 목록 조회 기능 구현

* feat: 유저 가입 승인 기능 구현

* feat: 가입 요청 거절 기능 구현

* feat: 선거 생성 도메인 수정

* fix:user에서 candidateInfo로 이동

* fix:dto 도메인 candidateInfo로 이동

* feat:단과대별 후보자 등록 정보 조회

* fix:poster fetch join 타입 추가

* feat: request dto 추가

* fix:swagger 추가

* feat: 후보자 정보가 없는 경우 예외처리 추가

* feat:게시물 삭제

* feat: 선거 관리기능 구현 (#33)

* feat: 선거 메타데이터 등록 기능 구현

* feat: 이미 선거 정보가 등록 된 경우 검증 기능 추가

* feat: 선거 초기화 기능 추가

* feat: 투표율 등록, 조회 기능 구현 (#37)

* feat: 투표율 등록 기능 구현

* feat: 투표율 등록, 조회 기능 구현

---------

Co-authored-by: ssm00 <[email protected]>
Co-authored-by: ssm00 <[email protected]>
Co-authored-by: ssm00 <[email protected]>
  • Loading branch information
4 people authored Dec 19, 2024
1 parent 035385e commit 623eaf3
Show file tree
Hide file tree
Showing 31 changed files with 473 additions and 30 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,6 @@
import com.studentvote.domain.user.domain.User;
import java.util.ArrayList;
import java.util.Collection;
import java.util.List;
import org.springframework.security.core.GrantedAuthority;
import org.springframework.security.core.userdetails.UserDetails;

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@
import com.studentvote.domain.candidateInfo.domain.CandidateInfo;
import com.studentvote.domain.candidateInfo.domain.CandidateInfoRepository;
import com.studentvote.domain.candidateInfo.dto.request.RegisterCandidateInfoRequest;
import com.studentvote.domain.candidateInfo.dto.response.CandidateInfoListResponse;
import com.studentvote.domain.candidateInfo.dto.response.RegisterCandidateInfoResponse;
import com.studentvote.domain.user.domain.ApprovalStatus;
import com.studentvote.domain.user.domain.User;
Expand All @@ -14,6 +15,9 @@
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import java.util.List;
import java.util.stream.Collectors;

@RequiredArgsConstructor
@Service
public class CandidateService {
Expand All @@ -36,6 +40,26 @@ public RegisterCandidateInfoResponse registerCandidate(CustomUserDetails userDet
return new RegisterCandidateInfoResponse(save.getId());
}

@Transactional(readOnly = true)
public CandidateInfoListResponse getCandidateInfo(CustomUserDetails userDetails,String governanceType) {
User user = userDetails.user();
List<CandidateInfo> candidateInfoList = candidateInfoRepository
.findAllCandidateByGovernanceType(user.getId(), governanceType);

if (candidateInfoList.isEmpty()) throw new DefaultException(ErrorCode.CANDIDATE_INFO_NOT_FOUND);

List<CandidateInfoListResponse.CandidateInfoResponse> candidateInfoResponseList =
candidateInfoList.stream()
.map(candidateInfo -> new CandidateInfoListResponse.CandidateInfoResponse(
candidateInfo.getCandidateName(),
candidateInfo.getCandidateContactAddress(),
candidateInfo.getCandidateInfoImage(),
candidateInfo.getLogoImage()
))
.toList();
return new CandidateInfoListResponse(candidateInfoResponseList);
}

private String makeFileName(User user, String option) {
String fileName = "candidateInfo/" + user.getId() + "/";
if (option.equals("candidateInfoImage")) {
Expand All @@ -57,4 +81,6 @@ private void validateUploadRequest(RegisterCandidateInfoRequest request) {
throw new DefaultException(ErrorCode.INVALID_LOGO_IMAGE);
}
}


}
Original file line number Diff line number Diff line change
@@ -1,6 +1,18 @@
package com.studentvote.domain.candidateInfo.domain;

import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.data.jpa.repository.Query;
import org.springframework.data.repository.query.Param;

import java.util.List;

public interface CandidateInfoRepository extends JpaRepository<CandidateInfo, Long> {

@Query("select c from CandidateInfo c " +
"join c.user u " +
"join u.governance g " +
"where u.id = :userId " +
"and g.governanceType = :governanceType")
List<CandidateInfo> findAllCandidateByGovernanceType(@Param("userId") Long userId, @Param("governanceType") String governanceType);

}
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
package com.studentvote.domain.candidateInfo.dto.request;

public record CandidateInfoListRequest() {
}
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,6 @@
import org.springframework.web.multipart.MultipartFile;

public record RegisterCandidateInfoRequest(

ElectionType electionType,
String candidateName,
String candidateContactAddress,
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,22 @@
package com.studentvote.domain.candidateInfo.dto.response;

import lombok.Builder;

import java.util.List;

public record CandidateInfoListResponse(
List<CandidateInfoResponse> candidateInfoList

) {

@Builder
public record CandidateInfoResponse(
String candidateName,
String candidateContactAddress,
String candidateInfoImage,
String logoImage

) {
}

}
Original file line number Diff line number Diff line change
Expand Up @@ -2,15 +2,17 @@

import com.studentvote.domain.auth.dto.response.CustomUserDetails;
import com.studentvote.domain.candidateInfo.application.CandidateService;
import com.studentvote.domain.candidateInfo.domain.CandidateInfo;
import com.studentvote.domain.candidateInfo.dto.request.RegisterCandidateInfoRequest;
import com.studentvote.domain.candidateInfo.dto.response.CandidateInfoListResponse;
import com.studentvote.domain.candidateInfo.dto.response.RegisterCandidateInfoResponse;
import com.studentvote.global.payload.ResponseCustom;
import io.swagger.v3.oas.annotations.Operation;
import lombok.RequiredArgsConstructor;
import org.springframework.security.core.annotation.AuthenticationPrincipal;
import org.springframework.web.bind.annotation.ModelAttribute;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.bind.annotation.*;

import java.util.List;


@RequiredArgsConstructor
Expand All @@ -26,4 +28,12 @@ public ResponseCustom<RegisterCandidateInfoResponse> registerPoster(@Authenticat
return ResponseCustom.OK(registerCandidateInfoResponse);
}

@GetMapping("/candidateInfo/{governance}")
@Operation(summary = "단과대별 후보자 정보 조회", description = "사용자의 거버넌스 타입에 따른 후보자 정보를 조회합니다.")
public ResponseCustom<CandidateInfoListResponse> getCandidateInfo(@AuthenticationPrincipal CustomUserDetails userDetails, @PathVariable("governance") String governanceType) {
CandidateInfoListResponse candidateInfo = candidateService.getCandidateInfo(userDetails, governanceType);
return ResponseCustom.OK(candidateInfo);
}


}
2 changes: 1 addition & 1 deletion src/main/java/com/studentvote/domain/common/Status.java
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
package com.studentvote.domain.common;

public enum Status {
ACTIVE, DELETE
ACTIVE, INACTIVE, DELETE
}
Original file line number Diff line number Diff line change
@@ -1,7 +1,5 @@
package com.studentvote.domain.poster.application;


import com.amazonaws.services.s3.AmazonS3;
import com.studentvote.domain.auth.dto.response.CustomUserDetails;
import com.studentvote.domain.poster.domain.Poster;
import com.studentvote.domain.poster.domain.repository.PosterRepository;
Expand All @@ -11,7 +9,6 @@
import com.studentvote.global.config.s3.S3Service;
import com.studentvote.global.error.DefaultException;
import com.studentvote.global.payload.ErrorCode;
import lombok.NoArgsConstructor;
import lombok.RequiredArgsConstructor;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
Expand All @@ -36,6 +33,18 @@ public Poster registerPoster(CustomUserDetails userDetails, RegisterPosterReques
return poster;
}

@Transactional
public Poster deletePoster(CustomUserDetails userDetails, Long posterId) {
User user = userDetails.user();
Poster poster = posterRepository.findById(posterId).orElseThrow(() -> new DefaultException(ErrorCode.POSTER_NOT_FOUND));
if (!poster.getUser().getId().equals(user.getId())) {
throw new DefaultException(ErrorCode.POSTER_ACCESS_DENIED);
}
s3Service.deleteImageFromS3(poster.getPosterImage());
posterRepository.delete(poster);
return poster;
}

private String makeFileName(User user, MultipartFile image) {
String originName = image.getOriginalFilename();
String ext = originName.substring(originName.lastIndexOf("."));
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -24,7 +24,7 @@ public class Poster {
@Column(length = 1000)
private String posterImage;

@ManyToOne
@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "user_id")
private User user;

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -5,4 +5,7 @@
import org.springframework.data.jpa.repository.JpaRepository;

public interface PosterRepository extends JpaRepository<Poster, Long> {



}
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@

public record RegisterPosterRequest(
String posterName,

MultipartFile posterImage

) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -8,10 +8,7 @@
import com.studentvote.global.payload.ResponseCustom;
import lombok.RequiredArgsConstructor;
import org.springframework.security.core.annotation.AuthenticationPrincipal;
import org.springframework.web.bind.annotation.ModelAttribute;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.bind.annotation.*;

@RequestMapping("api")
@RequiredArgsConstructor
Expand All @@ -25,5 +22,10 @@ public ResponseCustom<RegisterPosterResponse> registerPoster(@AuthenticationPrin
Poster poster = posterService.registerPoster(userDetails, request);
return ResponseCustom.OK(new RegisterPosterResponse(poster.getId(), poster.getPosterName(), poster.getPosterImage()));
}


@DeleteMapping("poster/{posterId}")
public ResponseCustom<?> deletePoster(@AuthenticationPrincipal CustomUserDetails userDetails, @PathVariable Long posterId) {
Poster poster = posterService.deletePoster(userDetails, posterId);
return ResponseCustom.OK(poster.getPosterName());
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -3,12 +3,9 @@
import com.studentvote.domain.common.BaseEntity;
import jakarta.persistence.Column;
import jakarta.persistence.Entity;
import jakarta.persistence.FetchType;
import jakarta.persistence.GeneratedValue;
import jakarta.persistence.GenerationType;
import jakarta.persistence.Id;
import jakarta.persistence.JoinColumn;
import jakarta.persistence.ManyToOne;
import lombok.AccessLevel;
import lombok.Getter;
import lombok.NoArgsConstructor;
Expand All @@ -26,7 +23,5 @@ public class Governance extends BaseEntity {

private String governanceName;

@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "user_id")
private User user;
private Long voteHeadquaterUserId;
}
7 changes: 7 additions & 0 deletions src/main/java/com/studentvote/domain/user/domain/User.java
Original file line number Diff line number Diff line change
Expand Up @@ -5,9 +5,12 @@
import jakarta.persistence.Entity;
import jakarta.persistence.EnumType;
import jakarta.persistence.Enumerated;
import jakarta.persistence.FetchType;
import jakarta.persistence.GeneratedValue;
import jakarta.persistence.GenerationType;
import jakarta.persistence.Id;
import jakarta.persistence.JoinColumn;
import jakarta.persistence.ManyToOne;
import lombok.AccessLevel;
import lombok.Getter;
import lombok.NoArgsConstructor;
Expand All @@ -34,6 +37,10 @@ public class User extends BaseEntity {
@Enumerated(EnumType.STRING)
private ApprovalStatus approvalStatus;

@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "governance_id")
private Governance governance;


private User(String email, String password, String name) {
this.email = email;
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
package com.studentvote.domain.user.domain.repository;

import com.studentvote.domain.user.domain.Governance;
import org.springframework.data.jpa.repository.JpaRepository;

public interface GovernanceRepository extends JpaRepository<Governance, Long> {
}
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,7 @@
public interface UserRepository extends JpaRepository<User, Long> {
Boolean existsByEmail(String email);

User findByUsername(String username);
Optional<User> findByUsername(String username);

Optional<User> findByEmail(String email);

Expand Down
Loading

0 comments on commit 623eaf3

Please sign in to comment.