Skip to content
Merged

Dev #12

Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
20 commits
Select commit Hold shift + click to select a range
31852ca
Merge pull request #7 from blaybus-hackathon/feature/#3_helper-sign-up
karl21-02 Feb 14, 2025
7e57284
Create README.md
bebeaubn Feb 14, 2025
d577390
Update README.md
bebeaubn Feb 14, 2025
5518975
Update README.md
bebeaubn Feb 14, 2025
f6a8c15
Update README.md
bebeaubn Feb 14, 2025
4c90cab
FEATURE / jwt 필터링 (토큰 검증)
LeeJeonggyo Feb 14, 2025
608479a
CHORE / 사용하지 않는 import 삭제
LeeJeonggyo Feb 14, 2025
6034c1a
chore: jwt 필터링 관련 controller 예시
LeeJeonggyo Feb 14, 2025
ca3ce10
Merge remote-tracking branch 'origin/feature/#5_JWT-filter' into feat…
LeeJeonggyo Feb 14, 2025
2266969
Merge branch 'main' of https://github.com/blaybus-hackathon/backend i…
LeeJeonggyo Feb 14, 2025
ffd2b03
feat: TblImg 엔티티 및 리포지토리 생성
LeeJeonggyo Feb 14, 2025
4eda853
feat: 파일 업로드 기능
LeeJeonggyo Feb 14, 2025
9b0e5bb
feat: 이미지 조회를 위한 바이트 전환
LeeJeonggyo Feb 14, 2025
9a5571c
feat: 파일 삭제 기능
LeeJeonggyo Feb 14, 2025
6950c90
Merge pull request #9 from blaybus-hackathon/feature/#5_JWT-filter
karl21-02 Feb 14, 2025
0dc1284
Merge branch 'dev' of https://github.com/blaybus-hackathon/backend in…
LeeJeonggyo Feb 14, 2025
cecbc38
Merge pull request #10 from blaybus-hackathon/feature/#7_file-upload-…
bebeaubn Feb 14, 2025
7d170d6
FEATURE / 요양 보호사 회원가입
karl21-02 Feb 14, 2025
756370a
Merge remote-tracking branch 'origin/dev' into feature/#3_helper-sign-up
karl21-02 Feb 14, 2025
c327485
Merge pull request #11 from blaybus-hackathon/feature/#3_helper-sign-up
LeeJeonggyo Feb 14, 2025
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -6,9 +6,11 @@
import lombok.Getter;
import lombok.NoArgsConstructor;
import org.hibernate.annotations.Comment;
import org.hibernate.annotations.Immutable;

@Entity
@AllArgsConstructor
@Immutable
@NoArgsConstructor
@Builder
@Getter
Expand All @@ -19,7 +21,7 @@ public class TblAddressFirst {
@Comment("시.도 구분자")
private Long id;

@Column(name = "af_name")
@Column(name = "af_name", nullable = false, length = 50)
@Comment("시.군.구 명")
private String name;
}
Original file line number Diff line number Diff line change
Expand Up @@ -21,7 +21,12 @@ public class TblAddressSecond {
@Comment("시.군.구 구분자")
private Long id;

@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "af_seq", nullable = false)
@Comment("시.도 구분자")
private TblAddressFirst addressFirst;

@Column(name = "as_name")
@Column(name = "as_name", nullable = false, length = 50)
@Comment("시.군.구 명")
private String name;
}
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@

import jakarta.persistence.*;
import lombok.*;
import org.hibernate.annotations.Comment;

@Entity
@NoArgsConstructor
Expand All @@ -15,6 +16,12 @@ public class TblAddressThird {
@Column(name = "at_seq")
private Long id;

@Column(name = "at_name", nullable = false)
@JoinColumn(name = "as_seq", nullable = false)
@Comment("시.군.구 구분자")
@ManyToOne(fetch = FetchType.LAZY)
private TblAddressSecond addressSecond;

@Column(name = "at_name", nullable = false, length = 50)
@Comment("읍.면.동 명")
private String name;
}
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
package com.balybus.galaxy.address.serviceImpl;

public interface TblAddressFirstServiceImpl {
public interface TblAddressFirstService {
}
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
package com.balybus.galaxy.address.serviceImpl;

public interface TblAddressThirdServiceImpl {
public interface TblAddressSecondService {
}
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
package com.balybus.galaxy.address.serviceImpl;

public interface TblAddressSecondServiceImpl {
public interface TblAddressThirdService {
}
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
package com.balybus.galaxy.address.serviceImpl.service;

import com.balybus.galaxy.address.serviceImpl.TblAddressFirstServiceImpl;
import com.balybus.galaxy.address.serviceImpl.TblAddressFirstService;
import jakarta.transaction.Transactional;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
Expand All @@ -10,5 +10,5 @@
@Slf4j
@RequiredArgsConstructor
@Transactional
public class TblAddressFirstServiceImple implements TblAddressFirstServiceImpl {
public class TblAddressFirstServiceImple implements TblAddressFirstService {
}
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
package com.balybus.galaxy.address.serviceImpl.service;

import com.balybus.galaxy.address.serviceImpl.TblAddressSecondServiceImpl;
import com.balybus.galaxy.address.serviceImpl.TblAddressSecondService;
import jakarta.transaction.Transactional;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
Expand All @@ -10,5 +10,5 @@
@Slf4j
@RequiredArgsConstructor
@Transactional
public class TblAddressSecondService implements TblAddressSecondServiceImpl {
public class TblAddressSecondServiceImpl implements TblAddressSecondService {
}
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
package com.balybus.galaxy.address.serviceImpl.service;

import com.balybus.galaxy.address.serviceImpl.TblAddressThirdServiceImpl;
import com.balybus.galaxy.address.serviceImpl.TblAddressThirdService;
import jakarta.transaction.Transactional;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
Expand All @@ -10,5 +10,5 @@
@Slf4j
@RequiredArgsConstructor
@Transactional
public class TblAddressThirdService implements TblAddressThirdServiceImpl {
public class TblAddressThirdServiceImpl implements TblAddressThirdService {
}
31 changes: 31 additions & 0 deletions src/main/java/com/balybus/galaxy/domain/tblImg/TblImg.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,31 @@
package com.balybus.galaxy.domain.tblImg;

import com.balybus.galaxy.domain.BaseEntity;
import jakarta.persistence.*;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Getter;
import lombok.NoArgsConstructor;
import org.hibernate.annotations.Comment;

@Getter
@Builder
@Entity
@NoArgsConstructor
@AllArgsConstructor
public class TblImg extends BaseEntity {
@Id
@Column(name="img_seq")
@Comment(value="관리자 구분자")
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id; // 구분자

@Comment(value="저장된 파일명")
@Column(length = 225, nullable = false)
private String imgUuid; // 저장된 파일명

@Comment(value="원본 파일명")
@Column(length = 225, nullable = false)
private String imgOriginName; // 원본 파일명

}
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
package com.balybus.galaxy.domain.tblImg;

import org.springframework.data.jpa.repository.JpaRepository;

public interface TblImgRepository extends JpaRepository<TblImg, Long> {
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,37 @@
package com.balybus.galaxy.domain.tblImg;

import com.balybus.galaxy.domain.tblImg.dto.ImgRequestDto;
import com.balybus.galaxy.global.exception.ExceptionCode;
import com.balybus.galaxy.global.response.ApiResponse;
import com.balybus.galaxy.global.response.SuccessCode;
import com.balybus.galaxy.global.utils.FileUploadUtils;
import lombok.RequiredArgsConstructor;
import org.springframework.security.core.userdetails.UserDetails;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.web.multipart.MultipartFile;

import java.util.ArrayList;
import java.util.List;

@Service
@RequiredArgsConstructor
public class TblImgServiceImpl {
private final FileUploadUtils fileUploadUtils;

@Transactional
public ApiResponse<?> uploadImg(UserDetails userDetails, ImgRequestDto.UploadImg dto) {
List<Long> imgSeq = new ArrayList<>();
MultipartFile[] photoFiles = dto.getPhotoFiles();
if (photoFiles != null && photoFiles.length > 0) {
try {
imgSeq = fileUploadUtils.uploadFiles(photoFiles);
} catch (Exception e) {
return ApiResponse.ERROR(ExceptionCode.INTERNAL_SEVER_ERROR);
}
}

return ApiResponse.SUCCESS(SuccessCode.UPLOAD_SUCCESS, imgSeq);
}

}
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
package com.balybus.galaxy.domain.tblImg.dto;

import lombok.Data;
import org.springframework.web.multipart.MultipartFile;
public class ImgRequestDto {
@Data
public static class UploadImg{
private MultipartFile[] photoFiles; // 첨부파일
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
package com.balybus.galaxy.domain.tblImg.dto;

public class ImgResponseDto {
}
13 changes: 10 additions & 3 deletions src/main/java/com/balybus/galaxy/global/config/SecurityConfig.java
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
package com.balybus.galaxy.global.config;

import com.balybus.galaxy.global.config.jwt.JwtAuthenticationFilter;
import com.balybus.galaxy.login.infrastructure.jwt.TokenProvider;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
Expand All @@ -11,6 +12,7 @@
import org.springframework.security.config.http.SessionCreationPolicy;
import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder;
import org.springframework.security.web.SecurityFilterChain;
import org.springframework.security.web.authentication.UsernamePasswordAuthenticationFilter;

@Configuration
@RequiredArgsConstructor
Expand All @@ -19,6 +21,8 @@
public class SecurityConfig {

private final TokenProvider tokenProvider;
private final JwtAuthenticationFilter jwtAuthenticationFilter;


@Bean
public SecurityFilterChain filterChain(HttpSecurity http) throws Exception {
Expand All @@ -29,12 +33,15 @@ public SecurityFilterChain filterChain(HttpSecurity http) throws Exception {
.logout(AbstractHttpConfigurer::disable)
.sessionManagement(management -> management.sessionCreationPolicy(SessionCreationPolicy.STATELESS))
.authorizeHttpRequests(auth -> auth
.requestMatchers("/api/sign-up").permitAll()
.requestMatchers("/api/**").permitAll()
.requestMatchers("/api/sign-up", "/api/sign-in").permitAll()
// .requestMatchers("/api/**").permitAll()
.requestMatchers("/swagger-resources/**").permitAll()
.requestMatchers("/swagger-ui/**", "/v3/api-docs/**").permitAll()
.requestMatchers("/api/**").authenticated()
.anyRequest().authenticated()
).build();
)
.addFilterBefore(jwtAuthenticationFilter, UsernamePasswordAuthenticationFilter.class)
.build();
}

@Bean
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,33 @@
package com.balybus.galaxy.global.config.jwt;

import com.balybus.galaxy.member.domain.TblUser;
import com.balybus.galaxy.member.repository.MemberRepository;
import lombok.RequiredArgsConstructor;
import org.springframework.security.core.userdetails.User;
import org.springframework.security.core.userdetails.UserDetails;
import org.springframework.security.core.userdetails.UserDetailsService;
import org.springframework.security.core.userdetails.UsernameNotFoundException;
import org.springframework.stereotype.Service;

import java.util.List;
import java.util.Optional;

@Service
@RequiredArgsConstructor
public class CustomUserDetailsService implements UserDetailsService {
private final MemberRepository memberRepository;
@Override
public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException {
//1. 이메일로 조회
Optional<TblUser> userOpt = memberRepository.findByEmail(username);
if(userOpt.isEmpty()) throw new UsernameNotFoundException("User not found");

//2. 데이터 반환
TblUser user = userOpt.get();
return User.builder()
.username(user.getEmail())
.password(user.getPassword())
.authorities(List.of(() -> user.getUserAuth().getCode()))
.build();
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,43 @@
package com.balybus.galaxy.global.config.jwt;

import com.balybus.galaxy.login.infrastructure.jwt.TokenProvider;
import jakarta.servlet.FilterChain;
import jakarta.servlet.ServletException;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
import org.springframework.security.authentication.UsernamePasswordAuthenticationToken;
import org.springframework.security.core.context.SecurityContextHolder;
import org.springframework.security.core.userdetails.UserDetails;
import org.springframework.security.core.userdetails.UserDetailsService;
import org.springframework.stereotype.Component;
import org.springframework.web.filter.OncePerRequestFilter;

import java.io.IOException;

@Component
public class JwtAuthenticationFilter extends OncePerRequestFilter {
private final TokenProvider tokenProvider;
private final UserDetailsService userDetailsService;
public JwtAuthenticationFilter(TokenProvider tokenProvider, UserDetailsService userDetailsService) {
this.tokenProvider = tokenProvider;
this.userDetailsService = userDetailsService;
}

@Override
protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain filterChain) throws ServletException, IOException {
// 요청에서 토큰을 추출
String token = tokenProvider.resolveToken(request);

// 토큰이 유효하면 SecurityContext에 저장
if (token != null && tokenProvider.validateToken(token)) {
String username = tokenProvider.getUsername(token);
UserDetails userDetails = userDetailsService.loadUserByUsername(username);

UsernamePasswordAuthenticationToken auth =
new UsernamePasswordAuthenticationToken(userDetails, null, userDetails.getAuthorities());
SecurityContextHolder.getContext().setAuthentication(auth);
}

filterChain.doFilter(request, response);
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,30 @@
package com.balybus.galaxy.global.config.jwt;

import com.balybus.galaxy.domain.tblImg.TblImgServiceImpl;
import com.balybus.galaxy.domain.tblImg.dto.ImgRequestDto;
import lombok.RequiredArgsConstructor;
import org.springframework.http.ResponseEntity;
import org.springframework.security.core.annotation.AuthenticationPrincipal;
import org.springframework.security.core.userdetails.UserDetails;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
@RequiredArgsConstructor
@RequestMapping("/api/protected")
public class ProtectedController {
private final TblImgServiceImpl imgService;

@GetMapping("/user")
public String getUserInfo(@AuthenticationPrincipal UserDetails userDetails) {
return "Authenticated user: " + userDetails.getUsername();
}

@PostMapping("/upload-img")
public ResponseEntity<?> uploadImg(@AuthenticationPrincipal UserDetails userDetails,
ImgRequestDto.UploadImg dto) {
return ResponseEntity.ok().body(imgService.uploadImg(userDetails, dto));
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
package com.balybus.galaxy.global.exception;

import lombok.AllArgsConstructor;
import lombok.Getter;

@Getter
@AllArgsConstructor
public class CustomException extends RuntimeException {
private final ExceptionCode code;
}
Original file line number Diff line number Diff line change
Expand Up @@ -27,6 +27,15 @@ public enum ExceptionCode {
HELPER_ALREADY_HAS_WORK_TIME(3005, "해당 요양 보호사는 이미 등록된 근무 시간이 있습니다."),
HELPER_ALREADY_HAS_EXPERIENCE(3006, "해당 요양 보호사는 이미 등록된 근무 경력이 있습니다."),

NO_ADDRESS_INFO(3007, "유효한 근무 가능 지역 조합이 없습니다."),
INVALID_ADDR_INFO(3008, "잘못된 주소 목록"),

DUPLICATE_WORK_TIME(3009, "중복된 근무 가능 시간 주소가 존재합니다."),

// 4xxx 파일 업로드
UPLOAD_FAILED(4000, "파일 업로드에 실패하였습니다."),
FILE_NOT_FOUND(4001, "첨부파일을 찾을 수 없습니다."),

// 9XXX
INTERNAL_SEVER_ERROR(9999, "서버에서 에러가 발생하였습니다.");

Expand Down
Loading