Skip to content

Commit

Permalink
Browse files Browse the repository at this point in the history
…into feat/#25/정규-세션-비지니스-로직-개발
  • Loading branch information
koreaioi committed Dec 4, 2024
2 parents fa527d2 + 4e6968a commit 8df7e49
Show file tree
Hide file tree
Showing 87 changed files with 2,691 additions and 116 deletions.
8 changes: 6 additions & 2 deletions .github/workflows/gradle.yml
Original file line number Diff line number Diff line change
Expand Up @@ -93,15 +93,19 @@ jobs:
username: ec2-user
key: ${{ secrets.EC2_SSH_KEY }} # EC2 서버에 접근하기 위한 SSH 개인 키
script: |
echo "DB_URL=${{ secrets.DB_URL }}" >> ~/deploy/.env
echo "DB_USERNAME=${{ secrets.DB_USERNAME }}" >> ~/deploy/.env
echo "DB_PASSWORD=${{ secrets.DB_PASSWORD }}" >> ~/deploy/.env
echo "ACCESS_KEY=${{ secrets.ACCESS_KEY }}" >> ~/deploy/.env
echo "SECRET_KEY=${{ secrets.SECRET_KEY }}" >> ~/deploy/.env
echo "BUCKET_NAME=${{ secrets.BUCKET_NAME }}" >> ~/deploy/.env
echo "REGION=${{ secrets.REGION }}" >> ~/deploy/.env
echo "dockerhubuserid=${{ secrets.DOCKERHUB_USERNAME }}" >> ~/deploy/.env
echo "DOCKERHUB_USERNAME=${{ secrets.DOCKERHUB_USERNAME }}" >> ~/deploy/.env
echo "JWT_SECRET=${{ secrets.JWT_SECRET }}" >> ~/deploy/.env
echo "SEND_EMAIL_PORT=${{ secrets.SEND_EMAIL_PORT }}" >> ~/deploy/.env
echo "SEND_EMAIL=${{ secrets.SEND_EMAIL }}" >> ~/deploy/.env
echo "SEND_EMAIL_PASSWORD=${{ secrets.SEND_EMAIL_PASSWORD }}" >> ~/deploy/.env
sudo docker-compose -f ~/deploy/docker-compose.yml pull
sudo docker-compose -f ~/deploy/docker-compose.yml up -d
Expand Down
21 changes: 18 additions & 3 deletions build.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -24,12 +24,14 @@ repositories {
}

dependencies {
implementation 'org.springframework.boot:spring-boot-starter-thymeleaf'
implementation 'org.thymeleaf.extras:thymeleaf-extras-springsecurity6'


// spring
compileOnly 'org.projectlombok:lombok'
annotationProcessor 'org.projectlombok:lombok'
testImplementation 'org.springframework.boot:spring-boot-starter-test'
implementation 'org.springframework.boot:spring-boot-starter-thymeleaf'
implementation 'org.springframework.boot:spring-boot-starter-web'
implementation 'org.springframework.boot:spring-boot-starter-web-services'
implementation 'org.springframework.boot:spring-boot-starter-validation'
Expand All @@ -41,8 +43,7 @@ dependencies {
implementation 'org.springframework.boot:spring-boot-starter-mail'

// security
//implementation 'org.springframework.boot:spring-boot-starter-security'
//implementation 'org.thymeleaf.extras:thymeleaf-extras-springsecurity6'
implementation 'org.springframework.boot:spring-boot-starter-security'
testImplementation 'org.springframework.security:spring-security-test'


Expand All @@ -53,10 +54,24 @@ dependencies {
runtimeOnly 'org.postgresql:postgresql'
runtimeOnly 'com.h2database:h2'

// cache
implementation 'org.springframework.boot:spring-boot-starter-data-redis'

// s3
implementation 'org.springframework.cloud:spring-cloud-starter-aws:2.2.6.RELEASE'

// json web token
implementation 'io.jsonwebtoken:jjwt-api:0.11.5'
implementation 'io.jsonwebtoken:jjwt-impl:0.11.5'
implementation 'io.jsonwebtoken:jjwt-jackson:0.11.5'

// swagger
implementation 'org.springdoc:springdoc-openapi-starter-webmvc-ui:2.0.2'

implementation 'org.springdoc:springdoc-openapi-ui:1.6.15'
implementation 'io.springfox:springfox-swagger2:2.9.2'
implementation 'io.springfox:springfox-swagger-ui:2.9.2'

}

tasks.named('test') {
Expand Down
24 changes: 12 additions & 12 deletions docker-compose.yml
Original file line number Diff line number Diff line change
@@ -1,4 +1,3 @@

version: '3.8'

services:
Expand All @@ -14,16 +13,17 @@ services:
SECRET_KEY: ${SECRET_KEY}
BUCKET_NAME: ${BUCKET_NAME}
REGION: ${REGION}
# JWT_SECRET_KEY: ${JWT_SECRET_KEY}
# MAIL_USERNAME : ${MAIL_USERNAME}
# MAIL_PASSWORD : ${MAIL_PASSWORD}
JWT_SECRET: ${JWT_SECRET}
SEND_EMAIL_PORT: ${SEND_EMAIL_PORT}
SEND_EMAIL: ${SEND_EMAIL}
SEND_EMAIL_PASSWORD: ${SEND_EMAIL_PASSWORD}

hibernate_ddl_auto: create
# REDIS_HOST: redis
# depends_on:
# - redis
hibernate_ddl_auto: update
REDIS_HOST: redis
depends_on:
- redis

# redis:
# image: "redis:latest"
# ports:
# - "6379:6379"
redis:
image: "redis:latest"
ports:
- "6379:6379"
Original file line number Diff line number Diff line change
Expand Up @@ -3,9 +3,13 @@
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.data.jpa.repository.config.EnableJpaAuditing;
import org.springframework.data.web.config.EnableSpringDataWebSupport;

import static org.springframework.data.web.config.EnableSpringDataWebSupport.PageSerializationMode.VIA_DTO;

@SpringBootApplication
@EnableJpaAuditing
@EnableSpringDataWebSupport(pageSerializationMode = VIA_DTO)
public class TaveWebsiteApplication {

public static void main(String[] args) {
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,50 @@
package com.tave.tavewebsite.domain.history.controller;

import com.tave.tavewebsite.domain.history.dto.request.HistoryRequestDto;
import com.tave.tavewebsite.domain.history.dto.response.HistoryResponseDto;
import com.tave.tavewebsite.domain.history.service.HistoryService;
import com.tave.tavewebsite.global.success.SuccessResponse;
import jakarta.validation.Valid;
import java.util.List;
import lombok.RequiredArgsConstructor;
import org.springframework.web.bind.annotation.DeleteMapping;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PatchMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
@RequestMapping("/v1/manager/history")
@RequiredArgsConstructor
public class ManagerHistoryController {

private final HistoryService historyService;

@GetMapping
public SuccessResponse<List<HistoryResponseDto>> getAllHistory() {
List<HistoryResponseDto> allOrderByGenerationDesc = historyService.findAllOrderByGenerationDesc();
return new SuccessResponse<>(allOrderByGenerationDesc);
}

@PostMapping
public SuccessResponse postHistory(@RequestBody @Valid HistoryRequestDto historyRequestDto) {
historyService.save(historyRequestDto);
return SuccessResponse.ok();
}

@PatchMapping("/{historyId}")
public SuccessResponse updateHistory(@PathVariable("historyId") Long id,
@RequestBody @Valid HistoryRequestDto historyRequestDto) {
historyService.patch(id, historyRequestDto);
return SuccessResponse.ok();
}

@DeleteMapping("/{historyId}")
public SuccessResponse deleteHistory(@PathVariable("historyId") Long id) {
historyService.delete(id);
return SuccessResponse.ok();
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,24 @@
package com.tave.tavewebsite.domain.history.controller;

import com.tave.tavewebsite.domain.history.dto.response.HistoryResponseDto;
import com.tave.tavewebsite.domain.history.service.HistoryService;
import com.tave.tavewebsite.global.success.SuccessResponse;
import java.util.List;
import lombok.RequiredArgsConstructor;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
@RequiredArgsConstructor
@RequestMapping("/v1/normal/history")
public class NormalHistoryController {

private final HistoryService historyService;

@GetMapping
public SuccessResponse<List<HistoryResponseDto>> getPublicHistory() {
List<HistoryResponseDto> publicOrderByGenerationDesc = historyService.findPublicOrderByGenerationDesc();
return new SuccessResponse<>(publicOrderByGenerationDesc);
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,22 @@
package com.tave.tavewebsite.domain.history.dto.request;

import com.tave.tavewebsite.domain.history.entity.History;
import jakarta.validation.constraints.NotNull;
import jakarta.validation.constraints.Size;

public record HistoryRequestDto(
@NotNull(message = "필수로 입력하셔야합니다.") @Size(min = 1, max = 5, message = "1~5 글자 사이로 입력해주세요.")
String generation,
@NotNull(message = "필수로 입력하셔야합니다.") @Size(min = 1, max = 500, message = "최대 500 글자까지 입력 가능합니다.")
String description,
@NotNull(message = "필수로 입력하셔야합니다.")
Boolean isPublic
) {
public History toHistory() {
return History.builder()
.generation(this.generation)
.description(this.description)
.isPublic(this.isPublic)
.build();
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
package com.tave.tavewebsite.domain.history.dto.response;

import com.tave.tavewebsite.domain.history.entity.History;

public record HistoryResponseDto(
Long id,
String generation,
String description,
Boolean isPublic
) {
public static HistoryResponseDto of(History history) {
return new HistoryResponseDto(history.getId(), history.getGeneration(), history.getDescription(),
history.isPublic());
}
}
Original file line number Diff line number Diff line change
@@ -1,7 +1,13 @@
package com.tave.tavewebsite.domain.history.entity;

import com.tave.tavewebsite.domain.history.dto.request.HistoryRequestDto;
import com.tave.tavewebsite.global.common.BaseEntity;
import jakarta.persistence.*;
import jakarta.persistence.Column;
import jakarta.persistence.Entity;
import jakarta.persistence.EntityListeners;
import jakarta.persistence.GeneratedValue;
import jakarta.persistence.GenerationType;
import jakarta.persistence.Id;
import jakarta.validation.constraints.NotNull;
import jakarta.validation.constraints.Size;
import lombok.AccessLevel;
Expand Down Expand Up @@ -41,4 +47,10 @@ public History(String generation, String description, boolean isPublic) {
this.description = description;
this.isPublic = isPublic;
}

public void patchHistory(HistoryRequestDto historyResponseDto) {
generation = historyResponseDto.generation();
description = historyResponseDto.description();
isPublic = historyResponseDto.isPublic();
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
package com.tave.tavewebsite.domain.history.exception;

import com.tave.tavewebsite.global.exception.BaseErrorException;

public abstract class HistoryErrorException {

public static class HistoryNotFoundException extends BaseErrorException {
public HistoryNotFoundException() {
super(HistoryErrorMessage.NOT_FOUND_HISTORY.getCode(), HistoryErrorMessage.NOT_FOUND_HISTORY.getMessage());
}
}

}
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
package com.tave.tavewebsite.domain.history.exception;

import lombok.AllArgsConstructor;
import lombok.Getter;

@Getter
@AllArgsConstructor
public enum HistoryErrorMessage {

NOT_FOUND_HISTORY(400, "History를 찾을 수 없습니다.");

final int code;
final String message;

}
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
package com.tave.tavewebsite.domain.history.repository;

import com.tave.tavewebsite.domain.history.entity.History;
import java.util.List;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.stereotype.Repository;

@Repository
public interface HistoryRepository extends JpaRepository<History, Long> {
List<History> findByIsPublicOrderByGenerationDesc(Boolean isPublic);

List<History> findAllByOrderByGenerationDesc();
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,58 @@
package com.tave.tavewebsite.domain.history.service;

import com.tave.tavewebsite.domain.history.dto.request.HistoryRequestDto;
import com.tave.tavewebsite.domain.history.dto.response.HistoryResponseDto;
import com.tave.tavewebsite.domain.history.entity.History;
import com.tave.tavewebsite.domain.history.exception.HistoryErrorException.HistoryNotFoundException;
import com.tave.tavewebsite.domain.history.repository.HistoryRepository;
import java.util.ArrayList;
import java.util.List;
import lombok.RequiredArgsConstructor;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

@Service
@RequiredArgsConstructor
public class HistoryService {

private final HistoryRepository historyRepository;

@Transactional(readOnly = true)
public List<HistoryResponseDto> findPublicOrderByGenerationDesc() {
List<History> isPublicOrderByGenerationDesc = historyRepository.findByIsPublicOrderByGenerationDesc(true);
List<HistoryResponseDto> historyResponseDtos = new ArrayList<>();
for (History history : isPublicOrderByGenerationDesc) {
historyResponseDtos.add(HistoryResponseDto.of(history));
}
return historyResponseDtos;
}

@Transactional(readOnly = true)
public List<HistoryResponseDto> findAllOrderByGenerationDesc() {
List<History> orderByGenerationDesc = historyRepository.findAllByOrderByGenerationDesc();
List<HistoryResponseDto> historyResponseDtos = new ArrayList<>();
for (History history : orderByGenerationDesc) {
historyResponseDtos.add(HistoryResponseDto.of(history));
}
return historyResponseDtos;
}

public void save(HistoryRequestDto dto) {
historyRepository.save(dto.toHistory());
}

@Transactional
public void patch(Long id, HistoryRequestDto dto) {
History history = validate(id);
history.patchHistory(dto);
}

public void delete(Long id) {
validate(id);
historyRepository.deleteById(id);
}

private History validate(Long id) {
return historyRepository.findById(id).orElseThrow(HistoryNotFoundException::new);
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,31 @@
package com.tave.tavewebsite.domain.member.controller;

import com.tave.tavewebsite.domain.member.dto.response.AuthorizedManagerResponseDto;
import com.tave.tavewebsite.domain.member.dto.response.UnauthorizedManagerResponseDto;
import com.tave.tavewebsite.domain.member.service.AdminService;
import com.tave.tavewebsite.global.success.SuccessResponse;
import java.util.List;
import lombok.RequiredArgsConstructor;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
@RequestMapping("/v1/admin")
@RequiredArgsConstructor
public class AdminController {

private final AdminService adminService;

@GetMapping("/unauthorized")
public SuccessResponse<List<UnauthorizedManagerResponseDto>> getUnauthorizedManager() {
List<UnauthorizedManagerResponseDto> response = adminService.getUnauthorizedManager();
return new SuccessResponse<>(response);
}

@GetMapping("/authorized")
public SuccessResponse<List<AuthorizedManagerResponseDto>> getAuthorizedAdmins() {
List<AuthorizedManagerResponseDto> response = adminService.getAuthorizedAdmins();
return new SuccessResponse<>(response);
}
}
Loading

0 comments on commit 8df7e49

Please sign in to comment.