diff --git a/.github/workflows/deploy.yml b/.github/workflows/deploy.yml index f51066a..f0b620f 100644 --- a/.github/workflows/deploy.yml +++ b/.github/workflows/deploy.yml @@ -5,43 +5,9 @@ on: branches: [deploy] jobs: - frontend: - name: Deploy Frontend to S3 - runs-on: ubuntu-22.04 - - steps: - - name: Checkout repository - uses: actions/checkout@v3 - - - name: Set up Node.js - uses: actions/setup-node@v3 - with: - node-version: '22' - - - name: Install dependencies - run: | - cd frontend - npm ci - - - name: Build frontend - run: | - cd frontend - npm run build - - - name: Deploy to S3 - uses: jakejarvis/s3-sync-action@master - with: - args: --delete - env: - AWS_S3_BUCKET: www.pirocheck.org - AWS_ACCESS_KEY_ID: ${{ secrets.AWS_ACCESS_KEY_ID }} - AWS_SECRET_ACCESS_KEY: ${{ secrets.AWS_SECRET_ACCESS_KEY }} - SOURCE_DIR: frontend/dist - backend: name: Deploy Backend to EC2 - needs: frontend - runs-on: ubuntu-latest + runs-on: ubuntu-22.04 steps: - name: Checkout repository @@ -53,10 +19,18 @@ jobs: distribution: 'temurin' java-version: '17' - - name: Build backend + - name: Create .env file& Build backend run: | - cd backend - ./gradlew build --no-daemon + cd backend/pirocheck + echo DB_HOST=${{ secrets.DB_HOST }} >> .env + echo DB_PORT=${{ secrets.DB_PORT }} >> .env + echo DB_NAME=${{ secrets.DB_NAME }} >> .env + echo DB_USER=${{ secrets.DB_USER }} >> .env + echo DB_PASSWORD=${{ secrets.DB_PASSWORD }} >> .env + + chmod +x gradlew + ./gradlew build -x test --no-daemon + - name: Restore PEM file run: | @@ -65,7 +39,7 @@ jobs: - name: Copy JAR to EC2 run: | - scp -o StrictHostKeyChecking=no -i pirocheck.pem backend/build/libs/*.jar ubuntu@${{ secrets.EC2_HOST }}:/home/ubuntu/app.jar + scp -o StrictHostKeyChecking=no -i pirocheck.pem backend/pirocheck/build/libs/*.jar ubuntu@${{ secrets.EC2_HOST }}:/home/ubuntu/ - name: Restart Spring Boot on EC2 run: | @@ -97,3 +71,39 @@ jobs: "color": 16711680 }] }' ${{ secrets.DISCORD_WEBHOOK }} + + frontend: + name: Deploy Frontend to S3 + needs: backend + runs-on: ubuntu-22.04 + + steps: + - name: Checkout repository + uses: actions/checkout@v3 + + - name: Set up Node.js + uses: actions/setup-node@v3 + with: + node-version: '22' + + - name: Install dependencies + run: | + cd frontend + rm -rf node_modules package-lock.json + npm install + npm install --save-dev vite rollup + + - name: Build frontend + run: | + cd frontend + npm run build + + - name: Deploy to S3 + uses: jakejarvis/s3-sync-action@master + with: + args: --delete + env: + AWS_S3_BUCKET: www.pirocheck.org + AWS_ACCESS_KEY_ID: ${{ secrets.AWS_ACCESS_KEY_ID }} + AWS_SECRET_ACCESS_KEY: ${{ secrets.AWS_SECRET_ACCESS_KEY }} + SOURCE_DIR: frontend/dist \ No newline at end of file diff --git a/backend/pirocheck/gradlew b/backend/pirocheck/gradlew old mode 100644 new mode 100755 index faf9300..2a7b10c --- a/backend/pirocheck/gradlew +++ b/backend/pirocheck/gradlew @@ -81,7 +81,7 @@ do *) app_path=$APP_HOME$link ;; esac done - + # This is normally unused # shellcheck disable=SC2034 APP_BASE_NAME=${0##*/} diff --git a/backend/pirocheck/src/main/java/backend/pirocheck/Deposit/service/DepositService.java b/backend/pirocheck/src/main/java/backend/pirocheck/Deposit/service/DepositService.java index f8cd876..ce3da5f 100644 --- a/backend/pirocheck/src/main/java/backend/pirocheck/Deposit/service/DepositService.java +++ b/backend/pirocheck/src/main/java/backend/pirocheck/Deposit/service/DepositService.java @@ -20,7 +20,7 @@ public class DepositService { private final DepositRepository depositRepository; private final UserRepository userRepository; private final AttendanceRepository attendanceRepository; - private final AssignmentRepository assignmentRepository; // 확인 + private final AssignmentRepository assignmentRepository; @Transactional public DepositResDto getDeposit(Long userId) { @@ -31,12 +31,12 @@ public DepositResDto getDeposit(Long userId) { // 출석 실패 int failAttendanceCount = attendanceRepository.countByUserAndStatusFalse(user); - int descentAttendance = failAttendanceCount * 10000; + int descentAttendance = failAttendanceCount * 10_000; // 과제 실패 - int failAssignmentCount = assignmentRepository.countByUserAndSubmitted(user, AssignmentStatus.FAILURE); // 확인 - int weakAssignmentCount = assignmentRepository.countByUserAndSubmitted(user, AssignmentStatus.INSUFFICIENT); // 확인 - int descentAssignment = failAssignmentCount * 10_000 + weakAssignmentCount * 5_000; + int failAssignmentCount = assignmentRepository.countByUserAndSubmitted(user, AssignmentStatus.FAILURE); + int weakAssignmentCount = assignmentRepository.countByUserAndSubmitted(user, AssignmentStatus.INSUFFICIENT); + int descentAssignment = failAssignmentCount * 20_000 + weakAssignmentCount * 10_000; // 방어권 int ascentDefence = deposit.getAscentDefence(); diff --git a/backend/pirocheck/src/main/java/backend/pirocheck/User/exception/GlobalExceptionHandler.java b/backend/pirocheck/src/main/java/backend/pirocheck/User/exception/GlobalExceptionHandler.java new file mode 100644 index 0000000..a135034 --- /dev/null +++ b/backend/pirocheck/src/main/java/backend/pirocheck/User/exception/GlobalExceptionHandler.java @@ -0,0 +1,18 @@ +package backend.pirocheck.User.exception; + +import backend.pirocheck.Attendance.dto.response.ApiResponse; +import org.springframework.http.HttpStatus; +import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.ExceptionHandler; +import org.springframework.web.bind.annotation.RestControllerAdvice; + +@RestControllerAdvice +public class GlobalExceptionHandler { + + @ExceptionHandler(InvalidLoginException.class) + public ResponseEntity> handleInvalidLoginException(InvalidLoginException e) { + return ResponseEntity + .status(HttpStatus.UNAUTHORIZED) // 401 상태 코드 + .body(ApiResponse.error(e.getMessage())); // 에러 메시지 전달 + } +} diff --git a/backend/pirocheck/src/main/java/backend/pirocheck/User/exception/InvalidLoginException.java b/backend/pirocheck/src/main/java/backend/pirocheck/User/exception/InvalidLoginException.java new file mode 100644 index 0000000..0ee5021 --- /dev/null +++ b/backend/pirocheck/src/main/java/backend/pirocheck/User/exception/InvalidLoginException.java @@ -0,0 +1,7 @@ +package backend.pirocheck.User.exception; + +public class InvalidLoginException extends RuntimeException{ + public InvalidLoginException(String message) { + super(message); + } +} diff --git a/backend/pirocheck/src/main/java/backend/pirocheck/User/service/UserService.java b/backend/pirocheck/src/main/java/backend/pirocheck/User/service/UserService.java index 304edd8..04231cf 100644 --- a/backend/pirocheck/src/main/java/backend/pirocheck/User/service/UserService.java +++ b/backend/pirocheck/src/main/java/backend/pirocheck/User/service/UserService.java @@ -1,6 +1,7 @@ package backend.pirocheck.User.service; import backend.pirocheck.User.entity.User; +import backend.pirocheck.User.exception.InvalidLoginException; import backend.pirocheck.User.repository.UserRepository; import lombok.RequiredArgsConstructor; import org.springframework.stereotype.Service; @@ -12,8 +13,14 @@ public class UserService { private final UserRepository userRepository; public User login(String name, String password) { - return userRepository.findByName(name) - .filter(user -> user.getPassword().equals(password)) - .orElseThrow(() -> new IllegalArgumentException("이름 또는 비밀번호가 일치하지 않습니다.")); + User user = userRepository.findByName(name) + .orElseThrow(() -> new InvalidLoginException("해당 사용자가 존재하지 않습니다.")); + + if (!user.getPassword().equals(password)) { + throw new InvalidLoginException("비밀번호가 일치하지 않습니다."); + } + + return user; } } + diff --git a/frontend/src/Intro.module.css b/frontend/src/Intro.module.css index 9fc44ae..491aef3 100644 --- a/frontend/src/Intro.module.css +++ b/frontend/src/Intro.module.css @@ -27,7 +27,7 @@ .intro_container { background-color: var(--background-black); color: var(--main-green); - font-family: "Cafe24Moyamoya-Regular-v1.0", sans-serif; + font-family: 'Akira Expanded'; box-shadow: 0 2px 4px rgba(0, 0, 0, 0.2); display: flex; justify-content: center; diff --git a/frontend/src/Login.jsx b/frontend/src/Login.jsx index e74413a..58f63b1 100644 --- a/frontend/src/Login.jsx +++ b/frontend/src/Login.jsx @@ -71,6 +71,7 @@ const Login = () => { placeholder: "비밀번호", }, ]} + values={[name, password]} // InputBlock props 수정에 따라 추가 onChange={handleChange} />
diff --git a/frontend/src/utils/AssignmentStatus.js b/frontend/src/utils/AssignmentStatus.js index 247ed2e..908d02b 100644 --- a/frontend/src/utils/AssignmentStatus.js +++ b/frontend/src/utils/AssignmentStatus.js @@ -1,4 +1,4 @@ -const mapStatus = (status) => { +export const mapStatus = (status) => { switch (status) { case "SUCCESS": return "done";