Skip to content

Commit

Permalink
chore: resolve merge conflict
Browse files Browse the repository at this point in the history
  • Loading branch information
Sangwook02 committed Feb 12, 2024
2 parents 5628fb2 + dea68da commit 98ada80
Show file tree
Hide file tree
Showing 14 changed files with 151 additions and 21 deletions.
29 changes: 29 additions & 0 deletions .github/workflows/develop_deploy.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,29 @@
name: Deploy to Develop

on:
workflow_dispatch:
inputs:
commit_hash:
description: 'commit_hash'
required: true

jobs:
deploy:
runs-on: ubuntu-latest
environment: develop
steps:
- name: Deploy to EC2 Server
uses: appleboy/ssh-action@master
env:
DOCKERHUB_USERNAME: ${{ secrets.DOCKERHUB_USERNAME }}
DOCKERHUB_IMAGE_TAG: ${{ github.event.inputs.commit_hash }}
with:
host: ${{ secrets.EC2_HOST }}
username: ${{ secrets.EC2_USERNAME }}
key: ${{ secrets.EC2_PRIVATE_KEY }}
envs: DOCKERHUB_USERNAME,DOCKERHUB_IMAGE_TAG # docker-compose.yml 에서 사용할 환경 변수
script: |
echo "${{ secrets.DOCKERHUB_TOKEN }}" | docker login -u "${{ secrets.DOCKERHUB_USERNAME }}" --password-stdin
docker pull ${{ env.DOCKERHUB_USERNAME }}/gdsc-server:${{ env.DOCKERHUB_IMAGE_TAG }}
docker compose -f /home/ubuntu/docker-compose.yml up -d
docker image prune -a -f
3 changes: 3 additions & 0 deletions build.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -58,6 +58,9 @@ dependencies {

// Swagger
implementation 'org.springdoc:springdoc-openapi-starter-webmvc-ui:2.3.0'

// Actuator
implementation 'org.springframework.boot:spring-boot-starter-actuator'
}

tasks.named('test') {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,9 @@
import com.gdschongik.gdsc.domain.member.dto.request.MemberQueryRequest;
import com.gdschongik.gdsc.domain.member.dto.request.MemberUpdateRequest;
import com.gdschongik.gdsc.domain.member.dto.response.MemberFindAllResponse;
import com.gdschongik.gdsc.domain.member.dto.response.MemberPendingFindAllResponse;
import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.tags.Tag;
import jakarta.validation.Valid;
import lombok.RequiredArgsConstructor;
import org.springframework.data.domain.Page;
Expand All @@ -17,25 +20,36 @@
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

@Tag(name = "Admin Member", description = "어드민 회원 관리 API입니다.")
@RestController
@RequestMapping("/admin/members")
@RequiredArgsConstructor
public class AdminMemberController {

private final MemberService memberService;

@Operation(summary = "전체 회원 목록 조회", description = "전체 회원 목록을 조회합니다.")
@GetMapping
public ResponseEntity<Page<MemberFindAllResponse>> getMembers(MemberQueryRequest queryRequest, Pageable pageable) {
Page<MemberFindAllResponse> response = memberService.findAll(queryRequest, pageable);
return ResponseEntity.ok().body(response);
}

@Operation(summary = "회원 탈퇴", description = "회원을 탈퇴시킵니다.")
@DeleteMapping("/{memberId}")
public ResponseEntity<Void> withdrawMember(@PathVariable Long memberId) {
memberService.withdrawMember(memberId);
return ResponseEntity.ok().build();
}

@Operation(summary = "대기중인 회원 목록 조회", description = "대기중인 회원 목록을 조회합니다.")
@GetMapping("/pending")
public ResponseEntity<Page<MemberPendingFindAllResponse>> getPendingMembers(Pageable pageable) {
Page<MemberPendingFindAllResponse> response = memberService.findAllPendingMembers(pageable);
return ResponseEntity.ok().body(response);
}

@Operation(summary = "회원 정보 수정", description = "회원 정보를 수정합니다.")
@PutMapping("/{memberId}")
public ResponseEntity<Void> updateMember(
@PathVariable Long memberId, @Valid @RequestBody MemberUpdateRequest request) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -4,9 +4,11 @@

import com.gdschongik.gdsc.domain.member.dao.MemberRepository;
import com.gdschongik.gdsc.domain.member.domain.Member;
import com.gdschongik.gdsc.domain.member.domain.MemberRole;
import com.gdschongik.gdsc.domain.member.dto.request.MemberQueryRequest;
import com.gdschongik.gdsc.domain.member.dto.request.MemberUpdateRequest;
import com.gdschongik.gdsc.domain.member.dto.response.MemberFindAllResponse;
import com.gdschongik.gdsc.domain.member.dto.response.MemberPendingFindAllResponse;
import com.gdschongik.gdsc.global.exception.CustomException;
import com.gdschongik.gdsc.global.exception.ErrorCode;
import lombok.RequiredArgsConstructor;
Expand Down Expand Up @@ -39,4 +41,9 @@ public void updateMember(Long memberId, MemberUpdateRequest request) {
memberRepository.findById(memberId).orElseThrow(() -> new CustomException(ErrorCode.MEMBER_NOT_FOUND));
member.updateMemberInfo(request);
}

public Page<MemberPendingFindAllResponse> findAllPendingMembers(Pageable pageable) {
Page<Member> members = memberRepository.findAllByRole(MemberRole.GUEST, pageable);
return members.map(MemberPendingFindAllResponse::of);
}
}
Original file line number Diff line number Diff line change
@@ -1,6 +1,12 @@
package com.gdschongik.gdsc.domain.member.dao;

import com.gdschongik.gdsc.domain.member.domain.Member;
import com.gdschongik.gdsc.domain.member.domain.MemberRole;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.Pageable;
import org.springframework.data.jpa.repository.JpaRepository;

public interface MemberRepository extends JpaRepository<Member, Long>, MemberCustomRepository {}
public interface MemberRepository extends JpaRepository<Member, Long>, MemberCustomRepository {

Page<Member> findAllByRole(MemberRole role, Pageable pageable);
}
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,6 @@

import com.gdschongik.gdsc.domain.common.model.BaseTimeEntity;
import com.gdschongik.gdsc.domain.member.dto.request.MemberUpdateRequest;
import com.gdschongik.gdsc.domain.requirement.domain.Requirement;
import com.gdschongik.gdsc.global.exception.CustomException;
import jakarta.persistence.Column;
import jakarta.persistence.Embedded;
Expand Down
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
package com.gdschongik.gdsc.domain.requirement.domain;
package com.gdschongik.gdsc.domain.member.domain;

import static com.gdschongik.gdsc.domain.requirement.domain.RequirementStatus.*;
import static com.gdschongik.gdsc.domain.member.domain.RequirementStatus.*;

import jakarta.persistence.Embeddable;
import jakarta.persistence.EnumType;
Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
package com.gdschongik.gdsc.domain.requirement.domain;
package com.gdschongik.gdsc.domain.member.domain;

import lombok.AllArgsConstructor;
import lombok.Getter;
Expand Down
Original file line number Diff line number Diff line change
@@ -1,10 +1,14 @@
package com.gdschongik.gdsc.domain.member.dto.request;

import static com.gdschongik.gdsc.global.common.constant.RegexConstant.*;

import io.swagger.v3.oas.annotations.media.Schema;

public record MemberQueryRequest(
String studentId,
String name,
String phone,
String department,
String email,
String discordUsername,
String nickname) {}
@Schema(description = "학번", pattern = STUDENT_ID) String studentId,
@Schema(description = "이름") String name,
@Schema(description = "전화번호", pattern = PHONE) String phone,
@Schema(description = "학과") String department,
@Schema(description = "이메일") String email,
@Schema(description = "discord username") String discordUsername,
@Schema(description = "커뮤니티 닉네임", pattern = NICKNAME) String nickname) {}
Original file line number Diff line number Diff line change
Expand Up @@ -2,15 +2,25 @@

import static com.gdschongik.gdsc.global.common.constant.RegexConstant.*;

import io.swagger.v3.oas.annotations.media.Schema;
import jakarta.validation.constraints.Email;
import jakarta.validation.constraints.NotBlank;
import jakarta.validation.constraints.Pattern;

public record MemberUpdateRequest(
@NotBlank @Pattern(regexp = STUDENT_ID, message = "학번은 " + STUDENT_ID + " 형식이어야 합니다.") String studentId,
@NotBlank String name,
@NotBlank @Pattern(regexp = PHONE, message = "전화번호는 " + PHONE + " 형식이어야 합니다.") String phone,
@NotBlank String department,
@NotBlank @Email String email,
@NotBlank String discordUsername,
@NotBlank @Pattern(regexp = NICKNAME, message = "닉네임은 " + NICKNAME + " 형식이어야 합니다.") String nickname) {}
@NotBlank
@Pattern(regexp = STUDENT_ID, message = "학번은 " + STUDENT_ID + " 형식이어야 합니다.")
@Schema(description = "학번", pattern = STUDENT_ID)
String studentId,
@NotBlank @Schema(description = "이름") String name,
@NotBlank
@Pattern(regexp = PHONE, message = "전화번호는 " + PHONE + " 형식이어야 합니다.")
@Schema(description = "전화번호", pattern = PHONE)
String phone,
@NotBlank @Schema(description = "학과") String department,
@NotBlank @Email @Schema(description = "이메일") String email,
@NotBlank @Schema(description = "discord username") String discordUsername,
@NotBlank
@Pattern(regexp = NICKNAME, message = "닉네임은 " + NICKNAME + " 형식이어야 합니다.")
@Schema(description = "커뮤니티 닉네임", pattern = NICKNAME)
String nickname) {}
Original file line number Diff line number Diff line change
@@ -0,0 +1,29 @@
package com.gdschongik.gdsc.domain.member.dto.response;

import com.gdschongik.gdsc.domain.member.domain.Member;
import com.gdschongik.gdsc.domain.member.domain.Requirement;

public record MemberPendingFindAllResponse(
Long memberId,
String studentId,
String name,
String phone,
String department,
String email,
String discordUsername,
String nickname,
Requirement requirement) {

public static MemberPendingFindAllResponse of(Member member) {
return new MemberPendingFindAllResponse(
member.getId(),
member.getStudentId(),
member.getName(),
member.getPhone(),
member.getDepartment(),
member.getEmail(),
member.getDiscordUsername(),
member.getNickname(),
member.getRequirement());
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -60,10 +60,11 @@ private static void defaultFilterChain(HttpSecurity http) throws Exception {
@Bean
@Order(1)
@ConditionalOnProperty(name = "spring.profiles.active", havingValue = "dev")
public SecurityFilterChain swaggerSecurityFilterChain(HttpSecurity http) throws Exception {
public SecurityFilterChain swaggerFilterChain(HttpSecurity http) throws Exception {
defaultFilterChain(http);

http.securityMatcher(getSwaggerUrls())
.oauth2Login(AbstractHttpConfigurer::disable)
.authorizeHttpRequests(authorize -> authorize.anyRequest().authenticated())
.httpBasic(withDefaults());

Expand All @@ -79,9 +80,24 @@ public SecurityFilterChain filterChain(HttpSecurity http) throws Exception {
.successHandler(customSuccessHandler(jwtService, cookieUtil))
.failureHandler((request, response, exception) -> response.setStatus(401)));

http.exceptionHandling(exception ->
exception.authenticationEntryPoint((request, response, authException) -> response.setStatus(401)));

http.addFilterAfter(jwtExceptionFilter(objectMapper), LogoutFilter.class);
http.addFilterAfter(jwtFilter(jwtService, cookieUtil), LogoutFilter.class);

http.authorizeHttpRequests(authorize -> authorize
.requestMatchers("/oauth2/**")
.permitAll()
.requestMatchers("/gdsc-actuator/**")
.permitAll()
.requestMatchers("/onboarding/**")
.authenticated()
.requestMatchers("/admin/**")
.hasRole("ADMIN")
.anyRequest()
.authenticated());

return http.build();
}

Expand Down
13 changes: 13 additions & 0 deletions src/main/resources/application-actuator.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
management:
endpoints:
web:
exposure:
include: health
base-path: /gdsc-actuator
jmx:
exposure:
exclude: "*"
enabled-by-default: false
endpoint:
health:
enabled: true
2 changes: 1 addition & 1 deletion src/main/resources/application.yml
Original file line number Diff line number Diff line change
Expand Up @@ -6,9 +6,9 @@ spring:
dev: "dev, datasource"
include:
- redis
- storage
- security
- swagger
- actuator

logging:
level:
Expand Down

0 comments on commit 98ada80

Please sign in to comment.