Skip to content
This repository has been archived by the owner on Oct 16, 2021. It is now read-only.

Commit

Permalink
Merge branch 'develop'
Browse files Browse the repository at this point in the history
* develop:
  [POTATO-20] 롬복 대체가능한거 수정 및 학과 추가 (#97)
  [POTATO-19] 관리자 모듈 세션 정보 memberId -> AdminId로 네이밍 수정 (#96)
  [POTATO-18] 게시물 정보(제목, 내용, 사진) 및 백업 정보 Value Object로 리팩토링 (#95)
  [POTATO-18] http client
  [POTATO-16] 게시물 도메인 설계 수정
  [POTATO-15] 블루 서버 켜질때까지 기다렸다가 그린 서버 종료하도록 수정
  [POTATO-14] 게시물 테이블에 counts 필드 추가
  [POTATO-14] 게시물 댓글 수정 (#94)
  Feat/like (#93)
  UPDATE README.md
  [POTATO-13] JDBC 세션을 위한 테이블, 인덱스 제거
  [POTATO-12] Api, Admin 서버 로그 도커 볼륨 마운트 설정.
  v0.3.2
  • Loading branch information
seungh0 committed May 10, 2021
2 parents dca4079 + bc5b5dd commit 3bb30fd
Show file tree
Hide file tree
Showing 92 changed files with 1,028 additions and 917 deletions.
27 changes: 25 additions & 2 deletions README.md
Original file line number Diff line number Diff line change
@@ -1,8 +1,29 @@
# Potato Backend

![Generic badge](https://img.shields.io/badge/version-0.3.1-orange.svg)
![Generic badge](https://img.shields.io/badge/version-0.3.2-orange.svg)
[![codecov](https://codecov.io/gh/steamed-potatoes/potato-backend/branch/develop/graph/badge.svg?token=ACoWRzqGBl)](https://codecov.io/gh/steamed-potatoes/potato-backend)

## Test Server
- 기능 테스트는 이곳에서 하실 수 있습니다. (실제 UI와 관련 X)

https://potato-front.netlify.app/

## Introduction
### 동아리의 다양한 일정들을 한 곳에서 관리하는 웹 서비스
동아리와 관련된 신입 모집, 행사, 이벤트 등을 한 곳에서 관리하고 볼 수 있는 웹 서비스.
### 동아리 운영진은요...!
- 새로운 동아리를 등록하고, 관리할 수 있어요.
- 동아리에서 신규 모집, 행사, 이벤트 등 홍보를 언제든 할 수 있어요.
- 동아리원들의 가입 신청을 받고, 동아리원들을 관리할 수 있어요.

### 동아리에 들어가고 싶은 학우들은요...!
- 인기 있는 동아리는 무엇인지, 어떤 동아리들이 있는지 한눈에 확인할 수 있어요.
- 더이상 여러 곳에서 신규 모집 등 이정을 일일이 확인할 필요 없이 동아리에서 업로드한 홍보글들을 한 곳에서 확인할 수 있어요!
- 누구든지 해당 게시글에서 댓글을 통해 커뮤니케이션 할 수 있어요.
- 내가 참여하고 있는 동아리의 일정, 행사 등을 한곳에서 확인할 수 있어요.
- 내가 관심있어하는 동아리를 팔로우해두고, 신입 모집 게시글이 올라오면 쉽게 확인할 수 있어요.


---
## Development Server

Expand Down Expand Up @@ -32,11 +53,13 @@
### Infra (Development Server)
- AWS EC2
- AWS RDS (MariaDB 10.4), flyway 6.4
- Redis (Session)
- Docker-compose
- Nginx

### Infra (Local)
- H2 InMemory DB
- H2 Inmemory DB
- Redis Embedded DB (Session)

### CI/CD
- GitHub Action CI/CD
Expand Down
4 changes: 4 additions & 0 deletions deploy/docker-compose.blue.yml
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,8 @@ services:
- 8081:8080
environment:
- "SPRING_PROFILES_ACTIVE=dev"
volumes:
- ~/logs/api:/logs/api
links:
- "db:redis"
admin:
Expand All @@ -14,6 +16,8 @@ services:
- 9001:9000
environment:
- "SPRING_PROFILES_ACTIVE=dev"
volumes:
- ~/logs/admin:/logs/admin
links:
- "db:redis"
db:
Expand Down
4 changes: 4 additions & 0 deletions deploy/docker-compose.green.yml
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,8 @@ services:
- 8082:8080
environment:
- "SPRING_PROFILES_ACTIVE=dev"
volumes:
- ~/logs/api:/logs/api
links:
- "db:redis"
admin:
Expand All @@ -14,6 +16,8 @@ services:
- 9002:9000
environment:
- "SPRING_PROFILES_ACTIVE=dev"
volumes:
- ~/logs/admin:/logs/admin
links:
- "db:redis"
db:
Expand Down
43 changes: 35 additions & 8 deletions deploy/run.sh
Original file line number Diff line number Diff line change
Expand Up @@ -10,16 +10,43 @@ if [ -z "$EXIST_BLUE" ]; then
echo "Blue Up"
docker-compose -p ${DOCKER_APP_NAME}-blue -f docker-compose.blue.yml up -d --build

sleep 60

echo "Green Down"
docker-compose -p ${DOCKER_APP_NAME}-green -f docker-compose.green.yml down
i=0
while [ $i -le 30 ]
do
STATUS=$(curl -s -o /dev/null -w "%{http_code}" http://localhost:8081/ping)
if [ $STATUS -eq 200 ]; then
echo "Server is Running.....!"

docker-compose -p ${DOCKER_APP_NAME}-green -f docker-compose.green.yml down
echo "Green Down"

break
else
echo "Waiting........."
sleep 10
i=$(($i+1))
fi
done
else
echo "Green Up"
docker-compose -p ${DOCKER_APP_NAME}-green -f docker-compose.green.yml up -d --build

sleep 60

echo "Blue Down"
docker-compose -p ${DOCKER_APP_NAME}-blue -f docker-compose.blue.yml down
i=0
while [ $i -le 30 ]
do
STATUS=$(curl -s -o /dev/null -w "%{http_code}" http://localhost:8082/ping)
if [ $STATUS -eq 200 ]; then
echo "Server is Running.....!"

docker-compose -p ${DOCKER_APP_NAME}-blue -f docker-compose.blue.yml down
echo "Blue Down"

break
else
echo "Waiting........."
sleep 10
i=$(($i+1))
fi
done
fi

5 changes: 0 additions & 5 deletions potato-admin/http/board/adminBoard.http
Original file line number Diff line number Diff line change
Expand Up @@ -22,8 +22,3 @@ Authorization: Bearer {{AUTHORIZATION}}
"startDateTime": "2021-03-01T00:00:00",
"endDateTime": "2021-03-08T11:59:59"
}

### 관리자가 게시글 삭제
DELETE {{host_admin}}/admin/v1/board/admin/1
Content-Type: application/json
Authorization: Bearer {{AUTHORIZATION}}
2 changes: 1 addition & 1 deletion potato-admin/http/organization/organization.http
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@ GET {{host_admin}}/admin/v1/organization/list
Authorization: Bearer {{AUTHORIZATION}}

### 비인준_동아리를_인준동아리로(현재 category 넘겨주기)
PATCH {{host_admin}}/admin/v1/organization/potato/category
PUT {{host_admin}}/admin/v1/organization/potato/category
Content-Type: application/json
Authorization: Bearer {{AUTHORIZATION}}

Expand Down
6 changes: 3 additions & 3 deletions potato-admin/src/main/java/com/potato/config/WebConfig.java
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
package com.potato.config;

import com.potato.config.interceptor.AuthInterceptor;
import com.potato.config.resolver.MemberIdResolver;
import com.potato.config.resolver.AdminIdResolver;
import lombok.RequiredArgsConstructor;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.method.support.HandlerMethodArgumentResolver;
Expand All @@ -16,7 +16,7 @@
public class WebConfig implements WebMvcConfigurer {

private final AuthInterceptor authInterceptor;
private final MemberIdResolver memberIdResolver;
private final AdminIdResolver adminIdResolver;

@Override
public void addCorsMappings(CorsRegistry registry) {
Expand All @@ -34,7 +34,7 @@ public void addInterceptors(InterceptorRegistry registry) {

@Override
public void addArgumentResolvers(List<HandlerMethodArgumentResolver> resolvers) {
resolvers.add(memberIdResolver);
resolvers.add(adminIdResolver);
}

}
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
package com.potato.config.interceptor;

import com.potato.config.session.AdminMemberSession;
import com.potato.config.session.AdminSession;
import com.potato.config.session.SessionConstants;
import com.potato.domain.administrator.AdministratorRepository;
import com.potato.exception.model.UnAuthorizedException;
Expand All @@ -23,12 +23,12 @@ public class AuthAdminComponent {
private final AdministratorRepository administratorRepository;

public Long getAdminMemberId(HttpServletRequest request) {
Long memberId = getAdminMemberSession(request).getMemberId();
Long memberId = getAdminMemberSession(request).getAdminId();
AdminAuthServiceUtils.validateExistAdminMember(administratorRepository, memberId);
return memberId;
}

private AdminMemberSession getAdminMemberSession(HttpServletRequest request) {
private AdminSession getAdminMemberSession(HttpServletRequest request) {
String header = request.getHeader(HttpHeaders.AUTHORIZATION);
Session session = extractSessionFromHeader(header);
return session.getAttribute(SessionConstants.AUTH_SESSION);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -7,5 +7,5 @@

@Target(ElementType.PARAMETER)
@Retention(RetentionPolicy.RUNTIME)
public @interface MemberId {
public @interface AdminId {
}
Original file line number Diff line number Diff line change
Expand Up @@ -9,11 +9,11 @@
import org.springframework.web.method.support.ModelAndViewContainer;

@Component
public class MemberIdResolver implements HandlerMethodArgumentResolver {
public class AdminIdResolver implements HandlerMethodArgumentResolver {

@Override
public boolean supportsParameter(MethodParameter parameter) {
boolean hasAnnotation = parameter.getParameterAnnotation(MemberId.class) != null;
boolean hasAnnotation = parameter.getParameterAnnotation(AdminId.class) != null;
boolean isMatchType = parameter.getParameterType().equals(Long.class);
if (hasAnnotation && parameter.getMethodAnnotation(Auth.class) == null) {
throw new IllegalArgumentException("인증이 필요한 컨트롤러 입니다. Auth 어노테이션을 붙여주세요.");
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -8,12 +8,12 @@

@Getter
@RequiredArgsConstructor(access = AccessLevel.PRIVATE)
public class AdminMemberSession implements Serializable {
public class AdminSession implements Serializable {

private final Long memberId;
private final Long adminId;

public static AdminMemberSession of(Long memberId) {
return new AdminMemberSession(memberId);
public static AdminSession of(Long memberId) {
return new AdminSession(memberId);
}

}
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,7 @@
@Profile("!local")
@RequiredArgsConstructor
@Configuration
@EnableRedisHttpSession(maxInactiveIntervalInSeconds = 60 * 60 * 24 * 30)
@EnableRedisHttpSession(maxInactiveIntervalInSeconds = 60 * 60 * 24) // 1일
public class RedisSessionConfig {

private final RedisProperties redisProperties;
Expand Down
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
package com.potato.controller;

import com.potato.config.session.AdminMemberSession;
import com.potato.config.session.AdminSession;
import com.potato.domain.administrator.Administrator;
import com.potato.domain.administrator.AdministratorCreator;
import com.potato.domain.administrator.AdministratorRepository;
Expand All @@ -24,7 +24,7 @@ public class LocalController {
@GetMapping("/test-session")
public ApiResponse<String> getSession() {
Administrator administrator = administratorRepository.save(AdministratorCreator.create("[email protected]", "테스트 관리자"));
httpSession.setAttribute(AUTH_SESSION, AdminMemberSession.of(administrator.getId()));
httpSession.setAttribute(AUTH_SESSION, AdminSession.of(administrator.getId()));
return ApiResponse.success(httpSession.getId());
}

Expand Down
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
package com.potato.controller.board;

import com.potato.config.interceptor.Auth;
import com.potato.config.resolver.MemberId;
import com.potato.config.resolver.AdminId;
import com.potato.controller.ApiResponse;
import com.potato.service.board.AdminBoardService;
import com.potato.service.board.dto.request.CreateAdminBoardRequest;
Expand All @@ -21,27 +21,20 @@ public class AdminBoardController {

@Auth
@PostMapping("/admin/v1/board/admin")
public ApiResponse<AdminBoardInfoResponse> createAdminBoard(@Valid @RequestBody CreateAdminBoardRequest request, @MemberId Long adminMemberId) {
public ApiResponse<AdminBoardInfoResponse> createAdminBoard(@Valid @RequestBody CreateAdminBoardRequest request, @AdminId Long adminMemberId) {
return ApiResponse.success(adminBoardService.createAdminBoard(request, adminMemberId));
}

@Auth
@PutMapping("/admin/v1/board/admin")
public ApiResponse<AdminBoardInfoResponse> updateAdminBoard(@Valid @RequestBody UpdateAdminBoardRequest request) {
return ApiResponse.success(adminBoardService.updateAdminBoard(request));
}

@Auth
@DeleteMapping("/admin/v1/board/admin/{adminBoardId}")
public ApiResponse<String> deleteAdminBoard(@PathVariable Long adminBoardId, @MemberId Long adminMemberId) {
adminBoardService.deleteAdminBoard(adminBoardId, adminMemberId);
return ApiResponse.OK;
return ApiResponse.success(adminBoardService.updateAdminBoard(request));
}

@Auth
@DeleteMapping("/admin/v1/board/organization/{subDomain}")
public ApiResponse<String> deleteOrganizationBoard(@PathVariable String subDomain, @MemberId Long adminMemberId, DeleteOrganizationBoardRequest request) {
adminBoardService.deleteOrganizationBoard(subDomain, adminMemberId, request.getOrganizationBoardId());
public ApiResponse<String> deleteOrganizationBoard(@PathVariable String subDomain, @Valid DeleteOrganizationBoardRequest request, @AdminId Long adminMemberId) {
adminBoardService.deleteOrganizationBoard(subDomain, request.getOrganizationBoardId(), adminMemberId);
return ApiResponse.OK;
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@
import com.potato.external.google.dto.response.GoogleAccessTokenResponse;
import com.potato.external.google.dto.response.GoogleUserInfoResponse;
import com.potato.service.auth.dto.request.GoogleAuthRequest;
import com.potato.config.session.AdminMemberSession;
import com.potato.config.session.AdminSession;
import lombok.RequiredArgsConstructor;
import org.springframework.stereotype.Service;

Expand All @@ -28,7 +28,7 @@ public String handleGoogleAuthentication(GoogleAuthRequest request) {

Administrator administrator = AdminAuthServiceUtils.findAdminMemberByEmail(administratorRepository, googleAdminProfileInfo.getEmail());

httpSession.setAttribute(AUTH_SESSION, AdminMemberSession.of(administrator.getId()));
httpSession.setAttribute(AUTH_SESSION, AdminSession.of(administrator.getId()));
return httpSession.getId();
}

Expand Down
Original file line number Diff line number Diff line change
@@ -1,12 +1,12 @@
package com.potato.service.auth.dto.request;

import lombok.AccessLevel;
import lombok.Getter;
import lombok.NoArgsConstructor;
import lombok.*;

import javax.validation.constraints.NotBlank;

@ToString
@Getter
@AllArgsConstructor(access = AccessLevel.PRIVATE)
@NoArgsConstructor(access = AccessLevel.PRIVATE)
public class GoogleAuthRequest {

Expand All @@ -16,11 +16,6 @@ public class GoogleAuthRequest {
@NotBlank
private String redirectUri;

private GoogleAuthRequest(@NotBlank String code, @NotBlank String redirectUri) {
this.code = code;
this.redirectUri = redirectUri;
}

public static GoogleAuthRequest testInstance(String code, String redirectUri) {
return new GoogleAuthRequest(code, redirectUri);
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,6 @@

import com.potato.domain.board.admin.AdminBoard;
import com.potato.domain.board.admin.AdminBoardRepository;
import com.potato.domain.board.admin.DeleteAdminBoardRepository;
import com.potato.domain.board.organization.DeleteOrganizationBoardRepository;
import com.potato.domain.board.organization.OrganizationBoard;
import com.potato.domain.board.organization.OrganizationBoardRepository;
Expand All @@ -19,8 +18,6 @@ public class AdminBoardService {

private final AdminBoardRepository adminBoardRepository;

private final DeleteAdminBoardRepository deleteAdminBoardRepository;

private final OrganizationBoardRepository organizationBoardRepository;

private final DeleteOrganizationBoardRepository deleteOrganizationBoardRepository;
Expand All @@ -33,21 +30,15 @@ public AdminBoardInfoResponse createAdminBoard(CreateAdminBoardRequest request,
@Transactional
public AdminBoardInfoResponse updateAdminBoard(UpdateAdminBoardRequest request) {
AdminBoard adminBoard = AdminBoardServiceUtils.findAdminBoardById(adminBoardRepository, request.getAdminBoardId());
adminBoard.updateInfo(request.getTitle(), request.getContent(), request.getStartDateTime(), request.getEndDateTime());
adminBoard.updateInfo(request.getTitle(), request.getContent(), request.getImageUrl(), request.getStartDateTime(), request.getEndDateTime());
return AdminBoardInfoResponse.of(adminBoard);
}

@Transactional
public void deleteAdminBoard(Long adminBoardId, Long adminMemberId) {
AdminBoard adminBoard = AdminBoardServiceUtils.findAdminBoardById(adminBoardRepository, adminBoardId);
deleteAdminBoardRepository.save(adminBoard.delete(adminMemberId));
adminBoardRepository.delete(adminBoard);
}

@Transactional
public void deleteOrganizationBoard(String subDomain, Long adminMemberId, Long organizationBoardId) {
public void deleteOrganizationBoard(String subDomain, Long organizationBoardId, Long adminMemberId) {
OrganizationBoard organizationBoard = OrganizationBoardServiceUtils.findOrganizationBoardBySubDomainAndId(organizationBoardRepository, subDomain, organizationBoardId);
deleteOrganizationBoardRepository.save(organizationBoard.deleteByAdmin(adminMemberId));
organizationBoardRepository.delete(organizationBoard);
}

}
Loading

0 comments on commit 3bb30fd

Please sign in to comment.