Skip to content

Commit

Permalink
Merge pull request #152 from CEOS-Developers/security_deploy
Browse files Browse the repository at this point in the history
[chore] 보안관련
  • Loading branch information
mirageoasis authored Oct 14, 2023
2 parents 8291745 + 1325700 commit 6c45871
Show file tree
Hide file tree
Showing 11 changed files with 226 additions and 72 deletions.
9 changes: 8 additions & 1 deletion .github/workflows/deploy_dev.yml
Original file line number Diff line number Diff line change
Expand Up @@ -34,13 +34,20 @@ jobs:
restore-keys: |
${{ runner.os }}-gradle-
- name: Make application-secret.yml
- name: Make application-secret.yml without env
run: |
touch ./src/main/resources/application-secret.yml
echo "${{ secrets.APPLICATION_SECRET_DEV }}" > ./src/main/resources/application-secret.yml
env:
PROPERTIES_DEV: ${{ secrets.APPLICATION_SECRET_DEV }}

- name: Make env
run: |
touch .env
echo "${{ secrets.ENV_DEV }}" > .env
env:
PROPERTIES_DEV: ${{ secrets.ENV_DEV }}

# Gradle build
- name: Build with Gradle
run: ./gradlew build -x test :spotlessApply
Expand Down
9 changes: 8 additions & 1 deletion .github/workflows/deploy_prod.yml
Original file line number Diff line number Diff line change
Expand Up @@ -34,13 +34,20 @@ jobs:
restore-keys: |
${{ runner.os }}-gradle-
- name: Make application-secret.yml
- name: Make application-secret.yml without env
run: |
touch ./src/main/resources/application-secret.yml
echo "${{ secrets.APPLICATION_SECRET }}" > ./src/main/resources/application-secret.yml
env:
PROPERTIES_DEV: ${{ secrets.APPLICATION_SECRET }}

- name: Make env
run: |
touch .env
echo "${{ secrets.ENV_PROD }}" > .env
env:
PROPERTIES_DEV: ${{ secrets.ENV_PROD }}

# Gradle build
- name: Build with Gradle
run: ./gradlew build -x test :spotlessApply
Expand Down
1 change: 1 addition & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -23,6 +23,7 @@ bin/
*.iws
*.iml
*.ipr
*.env
out/
!**/src/main/**/out/
!**/src/test/**/out/
Expand Down
99 changes: 53 additions & 46 deletions build.gradle
Original file line number Diff line number Diff line change
@@ -1,74 +1,81 @@
plugins {
id 'java'
id 'org.springframework.boot' version '3.0.6'
id 'io.spring.dependency-management' version '1.1.0'
id 'com.diffplug.spotless' version '6.11.0'
id 'java'
id 'org.springframework.boot' version '3.0.6'
id 'io.spring.dependency-management' version '1.1.0'
id 'com.diffplug.spotless' version '6.11.0'
}

group = 'ceos'
version = '0.0.1-SNAPSHOT'
sourceCompatibility = '17'

configurations {
compileOnly {
extendsFrom annotationProcessor
}
compileOnly {
extendsFrom annotationProcessor
}
}


repositories {
mavenCentral()
mavenCentral()
}

dependencies {
implementation 'org.springframework.boot:spring-boot-starter-data-jdbc'
implementation 'org.springframework.boot:spring-boot-starter-data-jpa'
implementation 'org.springframework.boot:spring-boot-starter-data-redis'
implementation 'org.springframework.boot:spring-boot-starter-security'
implementation 'org.springframework.boot:spring-boot-starter-web'
compileOnly 'org.projectlombok:lombok'
annotationProcessor 'org.projectlombok:lombok'
testImplementation 'org.springframework.boot:spring-boot-starter-test'
testImplementation 'org.springframework.security:spring-security-test'
implementation 'org.springframework.boot:spring-boot-starter-security'
implementation group: 'io.jsonwebtoken', name: 'jjwt-api', version: '0.11.5'
runtimeOnly group: 'io.jsonwebtoken', name: 'jjwt-impl', version: '0.11.5'
runtimeOnly group: 'io.jsonwebtoken', name: 'jjwt-jackson', version: '0.11.5'
implementation 'org.springframework.boot:spring-boot-starter-data-jdbc'
implementation 'org.springframework.boot:spring-boot-starter-data-jpa'
implementation 'org.springframework.boot:spring-boot-starter-data-redis'
implementation 'org.springframework.boot:spring-boot-starter-security'
implementation 'org.springframework.boot:spring-boot-starter-web'
compileOnly 'org.projectlombok:lombok'
annotationProcessor 'org.projectlombok:lombok'
testImplementation 'org.springframework.boot:spring-boot-starter-test'
testImplementation 'org.springframework.security:spring-security-test'
implementation 'org.springframework.boot:spring-boot-starter-security'
implementation group: 'io.jsonwebtoken', name: 'jjwt-api', version: '0.11.5'
runtimeOnly group: 'io.jsonwebtoken', name: 'jjwt-impl', version: '0.11.5'
runtimeOnly group: 'io.jsonwebtoken', name: 'jjwt-jackson', version: '0.11.5'

runtimeOnly 'com.mysql:mysql-connector-j'

runtimeOnly 'com.mysql:mysql-connector-j'
// slack
implementation("com.slack.api:slack-api-client:1.28.0")

// slack
implementation("com.slack.api:slack-api-client:1.28.0")
// swagger
implementation 'org.springdoc:springdoc-openapi-starter-webmvc-ui:2.0.0'
implementation 'org.springdoc:springdoc-openapi-starter-webmvc-api:2.0.0'
implementation 'org.springframework.boot:spring-boot-starter-validation'

// swagger
implementation 'org.springdoc:springdoc-openapi-starter-webmvc-ui:2.0.0'
implementation 'org.springdoc:springdoc-openapi-starter-webmvc-api:2.0.0'
implementation 'org.springframework.boot:spring-boot-starter-validation'
// ses
implementation group: 'software.amazon.awssdk', name: 'ses', version: "2.19.29"
implementation('org.springframework.boot:spring-boot-starter-thymeleaf')

// ses
implementation group: 'software.amazon.awssdk', name: 'ses', version: "2.19.29"
implementation('org.springframework.boot:spring-boot-starter-thymeleaf')
//s3
implementation group: 'software.amazon.awssdk', name: 's3', version: "2.20.68"

//s3
implementation group: 'software.amazon.awssdk', name: 's3', version: "2.20.68"
implementation 'com.fasterxml.jackson.core:jackson-databind:2.14.2'

implementation 'com.fasterxml.jackson.core:jackson-databind:2.14.2'
// querydsl
implementation 'com.querydsl:querydsl-jpa:5.0.0:jakarta'
annotationProcessor "com.querydsl:querydsl-apt:${dependencyManagement.importedProperties['querydsl.version']}:jakarta"
annotationProcessor "jakarta.annotation:jakarta.annotation-api"
annotationProcessor "jakarta.persistence:jakarta.persistence-api"

// Apache POI
implementation 'org.apache.poi:poi:4.1.2'
implementation 'org.apache.poi:poi-ooxml:4.1.2'
// Apache POI
implementation 'org.apache.poi:poi:4.1.2'
implementation 'org.apache.poi:poi-ooxml:4.1.2'
}

tasks.named('test') {
useJUnitPlatform()
useJUnitPlatform()
}

spotless {
java {
target("**/*.java")
googleJavaFormat().aosp()
importOrder()
removeUnusedImports()
trimTrailingWhitespace()
endWithNewline()
}
java {
target("**/*.java")
googleJavaFormat().aosp()
importOrder()
removeUnusedImports()
trimTrailingWhitespace()
endWithNewline()
}
}
2 changes: 2 additions & 0 deletions docker-compose.dev.yml
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,8 @@ services:
image: ceos17/ceos-backend-dev
container_name: backend
hostname: backend
env_file:
- .env
expose:
- "8080"

Expand Down
Original file line number Diff line number Diff line change
@@ -1,12 +1,21 @@
package ceos.backend.domain.application;


import ceos.backend.domain.application.dto.request.*;
import ceos.backend.domain.application.dto.response.*;
import ceos.backend.domain.application.enums.SortPartType;
import ceos.backend.domain.application.enums.SortPassType;
import ceos.backend.domain.application.domain.Pass;
import ceos.backend.domain.application.dto.request.CreateApplicationRequest;
import ceos.backend.domain.application.dto.request.UpdateApplicationQuestion;
import ceos.backend.domain.application.dto.request.UpdateAttendanceRequest;
import ceos.backend.domain.application.dto.request.UpdateInterviewTime;
import ceos.backend.domain.application.dto.request.UpdatePassStatus;
import ceos.backend.domain.application.dto.response.GetApplication;
import ceos.backend.domain.application.dto.response.GetApplicationQuestion;
import ceos.backend.domain.application.dto.response.GetApplications;
import ceos.backend.domain.application.dto.response.GetCreationTime;
import ceos.backend.domain.application.dto.response.GetInterviewTime;
import ceos.backend.domain.application.dto.response.GetResultResponse;
import ceos.backend.domain.application.service.ApplicationExcelService;
import ceos.backend.domain.application.service.ApplicationService;
import ceos.backend.global.common.entity.Part;
import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.tags.Tag;
import jakarta.validation.Valid;
Expand All @@ -17,7 +26,15 @@
import org.springframework.http.HttpHeaders;
import org.springframework.http.MediaType;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.*;
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.PutMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;

@Slf4j
@RestController
Expand All @@ -31,13 +48,15 @@ public class ApplicationController {
@Operation(summary = "지원자 목록 보기")
@GetMapping
public GetApplications getApplications(
@RequestParam("part") SortPartType part,
@RequestParam("docPass") SortPassType docPass,
@RequestParam("finalPass") SortPassType finalPass,
@RequestParam(value = "part", required = false) Part part,
@RequestParam(value = "docPass", required = false) Pass docPass,
@RequestParam(value = "finalPass", required = false) Pass finalPass,
@RequestParam(value = "applicantName", required = false) String applicantName,
@RequestParam("pageNum") int pageNum,
@RequestParam("limit") int limit) {
log.info("지원자 목록 보기");
return applicationService.getApplications(pageNum, limit, part, docPass, finalPass);
return applicationService.getApplications(
part, docPass, finalPass, applicantName, pageNum, limit);
}

@Operation(summary = "지원하기", description = "startDateDoc ~ endDateDoc 전날")
Expand Down
Original file line number Diff line number Diff line change
@@ -1,14 +1,17 @@
package ceos.backend.domain.application.helper;


import ceos.backend.domain.application.domain.*;
import ceos.backend.domain.application.domain.Application;
import ceos.backend.domain.application.domain.ApplicationQuestion;
import ceos.backend.domain.application.domain.Pass;
import ceos.backend.domain.application.dto.request.CreateApplicationRequest;
import ceos.backend.domain.application.dto.request.UpdateAttendanceRequest;
import ceos.backend.domain.application.enums.SortPartType;
import ceos.backend.domain.application.enums.SortPassType;
import ceos.backend.domain.application.exception.exceptions.ApplicantNotFound;
import ceos.backend.domain.application.mapper.ApplicationMapper;
import ceos.backend.domain.application.repository.*;
import ceos.backend.domain.application.repository.ApplicationQuestionRepository;
import ceos.backend.domain.application.repository.ApplicationRepository;
import ceos.backend.global.common.dto.AwsSESMail;
import ceos.backend.global.common.dto.SlackUnavailableReason;
import ceos.backend.global.common.entity.Part;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,8 @@
import org.springframework.data.jpa.repository.Query;
import org.springframework.data.repository.query.Param;

public interface ApplicationRepository extends JpaRepository<Application, Long> {
public interface ApplicationRepository
extends JpaRepository<Application, Long>, ApplicationRepositoryCustom {
@Query("select distinct a from Application a" + " where a.applicantInfo.email = :email")
Optional<Application> findByEmail(@Param("email") String email);

Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
package ceos.backend.domain.application.repository;


import ceos.backend.domain.application.domain.Application;
import ceos.backend.domain.application.domain.Pass;
import ceos.backend.global.common.entity.Part;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.PageRequest;

public interface ApplicationRepositoryCustom {
Page<Application> findApplications(
Part part, Pass docPass, Pass finalPass, String applicantName, PageRequest pageRequest);
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,78 @@
package ceos.backend.domain.application.repository;

import static ceos.backend.domain.application.domain.QApplication.application;

import ceos.backend.domain.application.domain.Application;
import ceos.backend.domain.application.domain.Pass;
import ceos.backend.global.common.entity.Part;
import com.querydsl.core.types.dsl.BooleanExpression;
import com.querydsl.jpa.impl.JPAQueryFactory;
import jakarta.persistence.EntityManager;
import java.util.List;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.PageImpl;
import org.springframework.data.domain.PageRequest;

public class ApplicationRepositoryCustomImpl implements ApplicationRepositoryCustom {
private final JPAQueryFactory queryFactory;

public ApplicationRepositoryCustomImpl(EntityManager em) {
this.queryFactory = new JPAQueryFactory(em);
}

@Override
public Page<Application> findApplications(
Part part,
Pass docPass,
Pass finalPass,
String applicantName,
PageRequest pageRequest) {

// ApplicantInfo 에 있는 이름 검색

List<Application> data =
queryFactory
.select(application)
.from(application)
.where(
partEq(part),
applicantNameEq(applicantName),
docPassEq(docPass),
finalPassEq(finalPass))
.offset(pageRequest.getOffset())
.limit(pageRequest.getPageSize())
.fetch();

long totalCnt =
(long)
queryFactory
.select(application.id)
.distinct()
.from(application)
.where(
partEq(part),
applicantNameEq(applicantName),
docPassEq(docPass),
finalPassEq(finalPass))
.fetch()
.size();

return new PageImpl<>(data, pageRequest, totalCnt);
}

private BooleanExpression partEq(Part part) {
return part == null ? null : application.applicationDetail.part.eq(part);
}

private BooleanExpression applicantNameEq(String applicantName) {
return applicantName.isEmpty() ? null : application.applicantInfo.name.eq(applicantName);
}

private BooleanExpression finalPassEq(Pass finalPass) {
return finalPass == null ? null : application.finalPass.eq(finalPass);
}

private BooleanExpression docPassEq(Pass docPass) {
return docPass == null ? null : application.documentPass.eq(docPass);
}
}
Loading

0 comments on commit 6c45871

Please sign in to comment.