Skip to content

Commit

Permalink
Merge branch 'main' into release
Browse files Browse the repository at this point in the history
  • Loading branch information
deveunhwa committed Nov 5, 2024
2 parents e20f713 + 1789b81 commit 733c41a
Show file tree
Hide file tree
Showing 135 changed files with 5,093 additions and 60 deletions.
5 changes: 3 additions & 2 deletions .github/workflows/CICD.yml
Original file line number Diff line number Diff line change
Expand Up @@ -4,10 +4,11 @@ on:
push:
branches: [ "main", "release" ]
pull_request:
branches: [ "main" ]
branches: [ "main", "release" ]

jobs:
build:
if: github.repository == 'prgrms-be-devcourse/NBB1_2_3_Team10'
runs-on: ubuntu-latest
permissions:
contents: read
Expand Down Expand Up @@ -51,7 +52,7 @@ jobs:
docker push ${{ secrets.DOCKER_USERNAME }}/bitta-kotlin:latest
deploy:
if: github.ref == 'refs/heads/release' # release 브랜치에만 배포 수행
if: github.repository == 'prgrms-be-devcourse/NBB1_2_3_Team10' && github.ref == 'refs/heads/release'
needs: build
runs-on: ubuntu-latest
permissions:
Expand Down
70 changes: 69 additions & 1 deletion README.md
Original file line number Diff line number Diff line change
@@ -1 +1,69 @@
# NBB1_2_3_Team10
# NBB1_2_3_Team10
# 빛다 🎬
> 영화를 빚어내다.

---

## 목차 📖
- [프로젝트 소개](#프로젝트-소개)
- [기능 소개](#기능-소개)
- [팀원 소개](#팀원-소개)
- [기술 스택](#기술-스택)



---

## 프로젝트 소개 📌

> “작가와 배우를 이어주다”
>
>사용자는 자신의 작업물을 업로드하고,
니즈에 맞는 대상을 선택하여 협업을 진행합니다.
무명 배우와 작가들이 상호 동의 아래
커리어를 쌓아갈 수 있는 기회를 제공합니다.


---

## 기능 소개 ✨
- **회원 관리**:
- 회원가입
- 로그인
- 회원 정보 수정
- 회원 탈퇴
- **프로필**:
- 프로필 사진
- 프로필 소개
- **피드**:
- 본인이 출연, 제작한 작품을 피드로 게시해 포트폴리오로 사용이 가능합니다.
- **Job Post**:
- 구인 글 혹은 오디션을 게시할 수 있습니다.
- **스카우트**:
- 구인자의 니즈에 맞는 구직자를 찾은 경우 스카우트 제의를 할 수 있습니다.
- **1대1 채팅**:
- 컨택하고싶은 사용자와 채팅을 할 수 있습니다.

---

## 팀원 소개 🧑‍🤝‍🧑
| 이수호 | 이정우 | 박주원 | 최재형 | 유정현 | 신은화 |
|:---:|:---:|:---:|:---:|:---:|:---:|
| <img src="https://avatars.githubusercontent.com/u/117787238?s=400&u=3fed12d99b807a97ef754d7453f804bd3f150298&v=4" width="150"> | <img src="https://avatars.githubusercontent.com/u/74736179?v=4" width="150"> | <img src="https://avatars.githubusercontent.com/u/153498069?v=4" width="150"> | <img src="https://avatars.githubusercontent.com/u/161911738?v=4" width="150"> | <img src="https://avatars.githubusercontent.com/u/130978507?v=4" width="150"> | <img src="https://avatars.githubusercontent.com/u/180101230?v=4" width="150"> |
| PL, BE | BE, FE | BE, AWS | BE | BE | BE, GIT |
| [ghtndl](https://github.com/ghtndl) | [jungyeoal](https://github.com/jungyoeal) | [juwon-code](https://github.com/juwon-code) | [Preta3418](https://github.com/Preta3418) | [YooJHyun](https://github.com/YooJHyun) | [deveunhwa](https://github.com/deveunhwa) |

## 기술 스택 🦾
#### Lang & Frameworks
![Spring Boot](https://img.shields.io/badge/Spring%20Boot-6DB33F?style=flat-square&logo=spring-boot&logoColor=white)
![Kotlin](https://img.shields.io/badge/Kotlin-0095D5?style=flat-square&logo=kotlin&logoColor=white)
![Hibernate](https://img.shields.io/badge/Hibernate-59666C?style=flat-square&logo=hibernate&logoColor=white)
![MySQL](https://img.shields.io/badge/MySQL-4479A1?style=flat-square&logo=mysql&logoColor=white)
#### Infra & Tools
![IntelliJ IDEA](https://img.shields.io/badge/IntelliJ%20IDEA-000000?style=flat-square&logo=intellij-idea&logoColor=white)
![Slack](https://img.shields.io/badge/Slack-4A154B?style=flat-square&logo=slack&logoColor=white)
![Postman](https://img.shields.io/badge/Postman-FF6C37?style=flat-square&logo=postman&logoColor=white)
![Notion](https://img.shields.io/badge/Notion-000000?style=flat-square&logo=notion&logoColor=white)
![JWT](https://img.shields.io/badge/JWT-000000?style=flat-square&logo=json-web-tokens&logoColor=white)
![Gradle](https://img.shields.io/badge/Gradle-02303A?style=flat-square&logo=gradle&logoColor=white)
25 changes: 24 additions & 1 deletion build.gradle.kts
Original file line number Diff line number Diff line change
Expand Up @@ -27,7 +27,7 @@ repositories {

dependencies {
implementation("org.springframework.boot:spring-boot-starter-data-jpa")
// implementation("org.springframework.boot:spring-boot-starter-security")
implementation("org.springframework.boot:spring-boot-starter-security")
implementation("org.springframework.boot:spring-boot-starter-validation")
implementation("org.springframework.boot:spring-boot-starter-web")
implementation("com.fasterxml.jackson.module:jackson-module-kotlin")
Expand All @@ -40,6 +40,29 @@ dependencies {
testImplementation("org.jetbrains.kotlin:kotlin-test-junit5")
testImplementation("org.springframework.security:spring-security-test")
testRuntimeOnly("org.junit.platform:junit-platform-launcher")

// Websoket
implementation("org.springframework:spring-websocket")

// AWS Java S3 SDK - AWS S3 스토리지와 통신을 수행할 때 사용하는 디펜던시
implementation("software.amazon.awssdk:s3:2.28.16")

// H2 Database Engine - 테스트에서 사용하는 인메모리 데이터베이스 H2
testImplementation("com.h2database:h2:2.3.232")

// Spring Boot Starter Websocket - 웹소켓 통신을 수행할 때 사용하는 디펜던시
implementation("org.springframework.boot:spring-boot-starter-websocket:3.3.4")

// JWT 의존성
implementation("io.jsonwebtoken:jjwt-api:0.12.3")
implementation("io.jsonwebtoken:jjwt-impl:0.12.3")
implementation("io.jsonwebtoken:jjwt-jackson:0.12.3")

// Swagger
implementation("org.springdoc:springdoc-openapi-starter-webmvc-ui:2.3.0")
implementation("com.fasterxml.jackson.module:jackson-module-kotlin")
implementation("org.jetbrains.kotlin:kotlin-reflect")
implementation("org.jetbrains.kotlin:kotlin-stdlib-jdk8")
}

kotlin {
Expand Down
19 changes: 19 additions & 0 deletions docker-compose.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
version: '3'
services:
backend-blue:
build:
context: .
dockerfile: ./Dockerfile
ports:
- "8081:8080"
environment:
- SPRING_PROFILES_ACTIVE=production

backend-green:
build:
context: .
dockerfile: ./Dockerfile
ports:
- "8082:8080"
environment:
- SPRING_PROFILES_ACTIVE=production
Original file line number Diff line number Diff line change
@@ -0,0 +1,235 @@
package org.tenten.bittakotlin.apply.controller

import io.swagger.v3.oas.annotations.Operation
import io.swagger.v3.oas.annotations.Parameter
import io.swagger.v3.oas.annotations.media.Content
import io.swagger.v3.oas.annotations.media.Schema
import io.swagger.v3.oas.annotations.responses.ApiResponse
import io.swagger.v3.oas.annotations.tags.Tag
import jakarta.validation.Valid
import lombok.RequiredArgsConstructor
import org.springframework.http.ResponseEntity
import org.springframework.web.bind.annotation.*
import org.tenten.bittakotlin.apply.dto.ApplyDTO
import org.tenten.bittakotlin.apply.dto.ApplyStatusUpdateDTO
import org.tenten.bittakotlin.apply.service.ApplyService
import org.tenten.bittakotlin.profile.entity.Profile

@Tag(name = "지원서 API 컨트롤러", description = "지원서와 관련된 REST API를 제공하는 컨트롤러입니다.")
@RestController
@RequestMapping("api/v1/apply")
@RequiredArgsConstructor
class ApplyController(
private val applyService: ApplyService
) {

// @Operation(
// summary = "전체 지원서 조회",
// description = "회원의 전체 지원서를 조회합니다.",
// responses = [
// ApiResponse(
// responseCode = "200",
// description = "지원서를 성공적으로 조회했습니다.",
// content = [Content(
// mediaType = "application/json",
// schema = Schema(example = APPLY_SUCCESS_READ_ALL)
// )]
// )
// ]
// )
@GetMapping
fun findAll(profile: Profile): ResponseEntity<List<ApplyDTO>> {
return ResponseEntity.ok(applyService.readAll(profile))
}

// @Operation(
// summary = "지원서 등록",
// description = "지원서를 등록합니다.",
// responses = [
// ApiResponse(
// responseCode = "200",
// description = "지원서를 성공적으로 등록했습니다.",
// content = [Content(
// mediaType = "application/json",
// schema = Schema(example = APPLY_SUCCESS_REGISTER)
// )]
// ),
// ApiResponse(
// responseCode = "400",
// description = "지원서 등록에 실패했습니다.",
// content = [Content(
// mediaType = "application/json",
// schema = Schema(example = APPLY_FAILURE_NOT_REGISTERED)
// )]
// )
// ]
// )
@PostMapping
fun registerApply(@Valid @RequestBody applyDTO: ApplyDTO): ResponseEntity<Map<String, Any>> {
return ResponseEntity.ok(applyService.register(applyDTO))
}

// @Operation(
// summary = "단일 지원서 조회",
// description = "단일 지원서를 조회합니다.",
// responses = [
// ApiResponse(
// responseCode = "200",
// description = "지원서를 조회했습니다.",
// content = [Content(
// mediaType = "application/json",
// schema = Schema(example = APPLY_SUCCESS_READ)
// )]
// ),
// ApiResponse(
// responseCode = "400",
// description = "지원서가 존재하지 않습니다.",
// content = [Content(
// mediaType = "application/json",
// schema = Schema(example = APPLY_FAILURE_NOT_FOUND)
// )]
// )
// ]
// )
// @Parameter(
// name = "id",
// description = "조회할 지원서의 ID",
// required = true,
// example = "1",
// schema = Schema(type = "integer")
// )
@GetMapping("/{id}")
fun readApply(@PathVariable("id") id: Long): ResponseEntity<ApplyDTO> {
val applyDTO = applyService.findById(id)
return ResponseEntity.ok(applyDTO)
}

// @Operation(
// summary = "지원서 삭제",
// description = "지원서를 삭제합니다.",
// responses = [
// ApiResponse(
// responseCode = "200",
// description = "지원서가 삭제되었습니다.",
// content = [Content(
// mediaType = "application/json",
// schema = Schema(example = APPLY_SUCCESS_DELETE)
// )]
// ),
// ApiResponse(
// responseCode = "400",
// description = "지원서 삭제에 실패했습니다.",
// content = [Content(
// mediaType = "application/json",
// schema = Schema(example = APPLY_FAILURE_NOT_REMOVED)
// )]
// ),
// ApiResponse(
// responseCode = "404",
// description = "삭제할 지원서가 존재하지 않습니다.",
// content = [Content(
// mediaType = "application/json",
// schema = Schema(example = APPLY_FAILURE_NOT_FOUND)
// )]
// )
// ]
// )
// @Parameter(
// name = "id",
// description = "삭제할 지원서의 ID",
// required = true,
// example = "1",
// schema = Schema(type = "integer")
// )
@DeleteMapping("/{id}")
fun deleteApply(@Valid @PathVariable("id") id: Long): ResponseEntity<Map<String, String>> {
applyService.delete(id)
return ResponseEntity.ok(mapOf("message" to "삭제가 완료되었습니다"))
}

// @Operation(
// summary = "게시물의 지원서 조회",
// description = "게시물에 해당하는 지원서를 조회합니다.",
// responses = [
// ApiResponse(
// responseCode = "200",
// description = "지원서를 성공적으로 조회했습니다.",
// content = [Content(
// mediaType = "application/json",
// schema = Schema(example = APPLY_SUCCESS_READ_ALL)
// )]
// ),
// ApiResponse(
// responseCode = "404",
// description = "지원서가 존재하지 않습니다.",
// content = [Content(
// mediaType = "application/json",
// schema = Schema(example = APPLY_FAILURE_NOT_FOUND)
// )]
// )
// ]
// )
// @Parameter(
// name = "jobPostId, memberId",
// description = "지원서의 해당 일거리 ID, 작성자의 회원 ID",
// required = true,
// example = "1, 1",
// schema = Schema(type = "integer")
// )
@GetMapping("/job-post/{jobPostId}/member/{profileId}")
fun getApplyIntoJobPost(
@PathVariable jobPostId: Long,
@PathVariable profileId: Long
): ResponseEntity<List<ApplyDTO>> {
val applies = applyService.getApplyIntoJobPost(jobPostId, profileId)
return ResponseEntity.ok(applies)
}

// @Operation(
// summary = "지원 검토 상태 수정",
// description = "게시물에 해당하는 지원의 검토 상태를 수정합니다.",
// responses = [
// ApiResponse(
// responseCode = "200",
// description = "검토 상태를 성공적으로 수정했습니다.",
// content = [Content(
// mediaType = "application/json",
// schema = Schema(example = APPLY_SUCCESS_MODIFY)
// )]
// ),
// ApiResponse(
// responseCode = "400",
// description = "검토 상태 수정에 실패했습니다.",
// content = [Content(
// mediaType = "application/json",
// schema = Schema(example = APPLY_FAILURE_NOT_MODIFY)
// )]
// ),
// ApiResponse(
// responseCode = "404",
// description = "일거리가 존재하지 않습니다.",
// content = [Content(
// mediaType = "application/json",
// schema = Schema(example = APPLY_FAILURE_NOT_FOUND)
// )]
// )
// ]
// )
// @Parameter(
// name = "applyId, profileId",
// description = "해당 게시물의 지원 ID, 게시자의 프로필 ID",
// required = true,
// example = "1, 1",
// schema = Schema(type = "integer")
// )
@PutMapping("/{applyId}/status/{profileId}")
fun applyStatusUpdate(
@PathVariable applyId: Long,
@PathVariable profileId: Long,
@RequestBody applyStatusUpdateDTO: ApplyStatusUpdateDTO
): ResponseEntity<String> {
applyService.applyStatusUpdate(applyId, applyStatusUpdateDTO.applyStatus!!, profileId)
return ResponseEntity.ok("상태가 변경되었습니다")
}
}

Loading

0 comments on commit 733c41a

Please sign in to comment.