Skip to content

Commit

Permalink
Merge branch 'main' into feat/apply
Browse files Browse the repository at this point in the history
  • Loading branch information
sycuuui committed Feb 6, 2024
2 parents beaa327 + 69b957a commit 52d8eb8
Show file tree
Hide file tree
Showing 14 changed files with 350 additions and 12 deletions.
Original file line number Diff line number Diff line change
@@ -0,0 +1,40 @@
package com.gongjakso.server.domain.banner.controller;

import com.gongjakso.server.domain.banner.dto.response.BannerRes;
import com.gongjakso.server.domain.banner.service.BannerService;
import com.gongjakso.server.global.common.ApplicationResponse;
import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.tags.Tag;
import lombok.RequiredArgsConstructor;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import java.util.List;

@RestController
@RequiredArgsConstructor
@RequestMapping("/api/v1/banner")
@Tag(name = "Banner", description = "메인 페이지, 공고 페이지 등의 배너 이미지 정보 반환 API")
public class BannerController {

private final BannerService bannerService;

@Operation(description = "메인 페이지 공고 리스트 반환")
@GetMapping("/main")
public ApplicationResponse<List<BannerRes>> getMainImageList() {
return ApplicationResponse.ok(bannerService.getMainImageList());
}

@Operation(description = "프로젝트 공고 페이지 배너 리스트 반환")
@GetMapping("/project")
public ApplicationResponse<List<BannerRes>> getProjectImageList() {
return ApplicationResponse.ok(bannerService.getProjectImageList());
}

@Operation(description = "공모전 공고 페이지 배너 리스트 반환")
@GetMapping("/content")
public ApplicationResponse<List<BannerRes>> getContestImageList() {
return ApplicationResponse.ok(bannerService.getContestImageList());
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,29 @@
package com.gongjakso.server.domain.banner.dto.response;

import com.fasterxml.jackson.annotation.JsonInclude;
import com.gongjakso.server.domain.banner.entity.Banner;
import com.gongjakso.server.domain.banner.enumerate.DomainType;
import lombok.Builder;

@Builder
@JsonInclude(JsonInclude.Include.NON_NULL)
public record BannerRes(
Long bannerId,
DomainType domainType,
String imageUrl,
String linkUrl,
Integer priority,
Boolean isPost
) {

public static BannerRes of(Banner banner) {
return BannerRes.builder()
.bannerId(banner.getBannerId())
.domainType(banner.getDomainType())
.imageUrl(banner.getImageUrl())
.linkUrl(banner.getLinkUrl())
.priority(banner.getPriority())
.isPost(banner.getIsPost())
.build();
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,46 @@
package com.gongjakso.server.domain.banner.entity;

import com.gongjakso.server.domain.banner.enumerate.DomainType;
import com.gongjakso.server.global.common.BaseTimeEntity;
import jakarta.persistence.*;
import lombok.AccessLevel;
import lombok.Builder;
import lombok.Getter;
import lombok.NoArgsConstructor;

@Getter
@Entity
@Table(name = "banner")
@NoArgsConstructor(access = AccessLevel.PROTECTED)
public class Banner extends BaseTimeEntity {

@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "banner_id", nullable = false, columnDefinition = "bigint")
private Long bannerId;

@Column(name = "domain_type", columnDefinition = "varchar(100)")
@Enumerated(EnumType.STRING)
private DomainType domainType;

@Column(name = "image_url", columnDefinition = "text")
private String imageUrl;

@Column(name = "link_url", columnDefinition = "text")
private String linkUrl;

@Column(name = "priority", nullable = false, columnDefinition = "int")
private Integer priority;

@Column(name = "is_post", nullable = false, columnDefinition = "tinyint")
private Boolean isPost;

@Builder
public Banner(String domainType, String imageUrl, String linkUrl, Integer priority) {
this.domainType = DomainType.valueOf(domainType);
this.imageUrl = imageUrl;
this.linkUrl = linkUrl;
this.priority = priority;
this.isPost = Boolean.TRUE;
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
package com.gongjakso.server.domain.banner.enumerate;

public enum DomainType {
// 메인 페이지
MAIN,

// 프로젝트,
PROJECT,

// 공모전
CONTEST
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
package com.gongjakso.server.domain.banner.repository;

import com.gongjakso.server.domain.banner.entity.Banner;
import com.gongjakso.server.domain.banner.enumerate.DomainType;
import org.springframework.data.jpa.repository.JpaRepository;

import java.util.List;

public interface BannerRepository extends JpaRepository<Banner, Long> {

List<Banner> findAllByDomainTypeAndDeletedAtIsNullOrderByPriorityAsc(DomainType domainType);
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,50 @@
package com.gongjakso.server.domain.banner.service;

import com.gongjakso.server.domain.banner.dto.response.BannerRes;
import com.gongjakso.server.domain.banner.entity.Banner;
import com.gongjakso.server.domain.banner.enumerate.DomainType;
import com.gongjakso.server.domain.banner.repository.BannerRepository;
import lombok.RequiredArgsConstructor;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import java.util.List;
import java.util.stream.Collectors;

@Service
@Transactional(readOnly = true)
@RequiredArgsConstructor
public class BannerService {

private final BannerRepository bannerRepository;

public List<BannerRes> getMainImageList() {
// Business Logic
List<Banner> bannerList = bannerRepository.findAllByDomainTypeAndDeletedAtIsNullOrderByPriorityAsc(DomainType.MAIN);

// Response
return bannerList.stream()
.map(BannerRes::of)
.collect(Collectors.toList());
}

public List<BannerRes> getProjectImageList() {
// Business Logic
List<Banner> bannerList = bannerRepository.findAllByDomainTypeAndDeletedAtIsNullOrderByPriorityAsc(DomainType.PROJECT);

// Response
return bannerList.stream()
.map(BannerRes::of)
.collect(Collectors.toList());
}

public List<BannerRes> getContestImageList() {
// Business Logic
List<Banner> bannerList = bannerRepository.findAllByDomainTypeAndDeletedAtIsNullOrderByPriorityAsc(DomainType.CONTEST);

// Response
return bannerList.stream()
.map(BannerRes::of)
.collect(Collectors.toList());
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,29 @@
package com.gongjakso.server.domain.email.controller;

import com.gongjakso.server.domain.email.dto.request.EmailReq;
import com.gongjakso.server.domain.email.dto.response.EmailRes;
import com.gongjakso.server.domain.email.service.EmailService;
import com.gongjakso.server.global.common.ApplicationResponse;
import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.tags.Tag;
import jakarta.validation.Valid;
import lombok.RequiredArgsConstructor;
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
@RequiredArgsConstructor
@RequestMapping("api/v1/email")
@Tag(name = "출시 알림 수신", description = "출시 알림 수신 관련하여, 정보 저장 및 정보 조회에 사용되는 API")
public class EmailController {

private final EmailService emailService;

@Operation(description = "출시 알림 수신 이메일 등록 API")
@PostMapping("")
public ApplicationResponse<EmailRes> registerEmail(@Valid @RequestBody EmailReq emailReq) {
return ApplicationResponse.ok(emailService.registerEmail(emailReq));
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
package com.gongjakso.server.domain.email.dto.request;

import com.gongjakso.server.domain.email.entity.Email;
import jakarta.validation.constraints.NotNull;
import lombok.Builder;

@Builder
public record EmailReq(
@NotNull(message = "이메일 정보가 담겨있지 않습니다.")
@jakarta.validation.constraints.Email(message = "유효한 이메일 형식이 아닙니다.")
String address
) {

public Email from() {
return Email.builder()
.address(this.address)
.build();
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,22 @@
package com.gongjakso.server.domain.email.dto.response;

import com.fasterxml.jackson.annotation.JsonInclude;
import com.gongjakso.server.domain.email.entity.Email;
import lombok.Builder;

@Builder
@JsonInclude(JsonInclude.Include.NON_NULL)
public record EmailRes(
Long emailId,
String address,
Boolean isReceive
) {

public static EmailRes of(Email email) {
return EmailRes.builder()
.emailId(email.getEmailId())
.address(email.getAddress())
.isReceive(email.getIsReceive())
.build();
}
}
35 changes: 35 additions & 0 deletions src/main/java/com/gongjakso/server/domain/email/entity/Email.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,35 @@
package com.gongjakso.server.domain.email.entity;

import com.gongjakso.server.global.common.BaseTimeEntity;
import jakarta.persistence.*;
import lombok.AccessLevel;
import lombok.Builder;
import lombok.Getter;
import lombok.NoArgsConstructor;
import org.hibernate.annotations.SQLDelete;

@Getter
@Entity
@Table(name = "email")
@SQLDelete(sql = "UPDATE email SET deleted_at = NOW() where email_id = ?")
@NoArgsConstructor(access = AccessLevel.PROTECTED)
public class Email extends BaseTimeEntity {

@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "email_id", nullable = false, columnDefinition = "bigint")
private Long emailId;

@Column(name = "address", nullable = false, columnDefinition = "text")
private String address;

// 이메일 수신 동의 여부 (추후, 미동의로 바뀔 경우 대비)
@Column(name = "is_receive", nullable = false, columnDefinition = "tinyint")
private Boolean isReceive;

@Builder
public Email(String address) {
this.address = address;
this.isReceive = Boolean.TRUE;
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
package com.gongjakso.server.domain.email.repository;

import com.gongjakso.server.domain.email.entity.Email;
import org.springframework.data.jpa.repository.JpaRepository;

public interface EmailRepository extends JpaRepository<Email, Long> {

Boolean existsEmailByAddressAndDeletedAtIsNull(String address);
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,34 @@
package com.gongjakso.server.domain.email.service;

import com.gongjakso.server.domain.email.dto.request.EmailReq;
import com.gongjakso.server.domain.email.dto.response.EmailRes;
import com.gongjakso.server.domain.email.entity.Email;
import com.gongjakso.server.domain.email.repository.EmailRepository;
import com.gongjakso.server.global.exception.ApplicationException;
import com.gongjakso.server.global.exception.ErrorCode;
import lombok.RequiredArgsConstructor;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

@Service
@Transactional(readOnly = true)
@RequiredArgsConstructor
public class EmailService {

private final EmailRepository emailRepository;

@Transactional
public EmailRes registerEmail(EmailReq emailReq) {
// Validation
if(emailRepository.existsEmailByAddressAndDeletedAtIsNull(emailReq.address())) {
throw new ApplicationException(ErrorCode.ALREADY_EXIST_EXCEPTION);
}

// Business Logic
Email email = emailReq.from();
Email saveEmail = emailRepository.save(email);

// Response
return EmailRes.of(saveEmail);
}
}
24 changes: 12 additions & 12 deletions src/main/java/com/gongjakso/server/global/config/SwaggerConfig.java
Original file line number Diff line number Diff line change
Expand Up @@ -3,33 +3,33 @@
import io.swagger.v3.oas.models.Components;
import io.swagger.v3.oas.models.OpenAPI;
import io.swagger.v3.oas.models.info.Info;
import io.swagger.v3.oas.models.security.SecurityRequirement;
import io.swagger.v3.oas.models.security.SecurityScheme;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

@Configuration
public class SwaggerConfig {

private static final String BEARER_TOKEN_PREFIX = "Bearer";

@Bean
public OpenAPI openAPI() {
Info info = new Info().title("Gongjakso Server Swagger UI")
.description("공작소 서버 API 테스트 페이지입니다.")
.version("v0.0.1");

// String jwtSchemeName = TokenProvider.AUTHORIZATION_HEADER;
// SecurityRequirement securityRequirement = new SecurityRequirement().addList(jwtSchemeName);
// Components components = new Components()
// .addSecuritySchemes(jwtSchemeName, new SecurityScheme()
// .name(jwtSchemeName)
// .type(SecurityScheme.Type.HTTP)
// .scheme(BEARER_TOKEN_PREFIX)
// .bearerFormat(TokenProvider.TYPE));
String jwtSchemeName = "JWT Authentication";
SecurityRequirement securityRequirement = new SecurityRequirement().addList(jwtSchemeName);
Components components = new Components()
.addSecuritySchemes(jwtSchemeName, new SecurityScheme()
.name(jwtSchemeName)
.type(SecurityScheme.Type.HTTP)
.scheme("bearer")
.bearerFormat("JWT"));

// Swagger UI 접속 후, 딱 한 번만 accessToken을 입력해주면 모든 API에 토큰 인증 작업이 적용됩니다.
return new OpenAPI()
.info(info)
//.addSecurityItem(securityRequirement)
.components(new Components());
.addSecurityItem(securityRequirement)
.components(components);
}
}
Loading

0 comments on commit 52d8eb8

Please sign in to comment.