diff --git a/src/main/java/com/whereyouad/WhereYouAd/domains/advertisement/application/dto/request/AdvertisementRequest.java b/src/main/java/com/whereyouad/WhereYouAd/domains/advertisement/application/dto/request/AdvertisementRequest.java new file mode 100644 index 0000000..483a660 --- /dev/null +++ b/src/main/java/com/whereyouad/WhereYouAd/domains/advertisement/application/dto/request/AdvertisementRequest.java @@ -0,0 +1,4 @@ +package com.whereyouad.WhereYouAd.domains.advertisement.application.dto.request; + +public class AdvertisementRequest { +} diff --git a/src/main/java/com/whereyouad/WhereYouAd/domains/advertisement/application/dto/response/AdvertisementResponse.java b/src/main/java/com/whereyouad/WhereYouAd/domains/advertisement/application/dto/response/AdvertisementResponse.java new file mode 100644 index 0000000..b94b4a7 --- /dev/null +++ b/src/main/java/com/whereyouad/WhereYouAd/domains/advertisement/application/dto/response/AdvertisementResponse.java @@ -0,0 +1,5 @@ +package com.whereyouad.WhereYouAd.domains.advertisement.application.dto.response; + +public class AdvertisementResponse { + // TODO: 대시보드 공통 응답값 정의 +} diff --git a/src/main/java/com/whereyouad/WhereYouAd/domains/advertisement/application/mapper/AdvertisementConverter.java b/src/main/java/com/whereyouad/WhereYouAd/domains/advertisement/application/mapper/AdvertisementConverter.java new file mode 100644 index 0000000..4e5053c --- /dev/null +++ b/src/main/java/com/whereyouad/WhereYouAd/domains/advertisement/application/mapper/AdvertisementConverter.java @@ -0,0 +1,4 @@ +package com.whereyouad.WhereYouAd.domains.advertisement.application.mapper; + +public class AdvertisementConverter { +} diff --git a/src/main/java/com/whereyouad/WhereYouAd/domains/advertisement/domain/constant/Grain.java b/src/main/java/com/whereyouad/WhereYouAd/domains/advertisement/domain/constant/Grain.java new file mode 100644 index 0000000..1f1be5e --- /dev/null +++ b/src/main/java/com/whereyouad/WhereYouAd/domains/advertisement/domain/constant/Grain.java @@ -0,0 +1,5 @@ +package com.whereyouad.WhereYouAd.domains.advertisement.domain.constant; + +public enum Grain { + HOURLY, DAILY +} diff --git a/src/main/java/com/whereyouad/WhereYouAd/domains/advertisement/domain/constant/Provider.java b/src/main/java/com/whereyouad/WhereYouAd/domains/advertisement/domain/constant/Provider.java new file mode 100644 index 0000000..17d9e64 --- /dev/null +++ b/src/main/java/com/whereyouad/WhereYouAd/domains/advertisement/domain/constant/Provider.java @@ -0,0 +1,6 @@ +package com.whereyouad.WhereYouAd.domains.advertisement.domain.constant; + +public enum Provider { + GOOGLE, KAKAO, NAVER + // 추후 값 추가 +} diff --git a/src/main/java/com/whereyouad/WhereYouAd/domains/advertisement/domain/service/AdvertisementQueryService.java b/src/main/java/com/whereyouad/WhereYouAd/domains/advertisement/domain/service/AdvertisementQueryService.java new file mode 100644 index 0000000..2f38926 --- /dev/null +++ b/src/main/java/com/whereyouad/WhereYouAd/domains/advertisement/domain/service/AdvertisementQueryService.java @@ -0,0 +1,4 @@ +package com.whereyouad.WhereYouAd.domains.advertisement.domain.service; + +public interface AdvertisementQueryService { +} diff --git a/src/main/java/com/whereyouad/WhereYouAd/domains/advertisement/domain/service/AdvertisementQueryServiceImpl.java b/src/main/java/com/whereyouad/WhereYouAd/domains/advertisement/domain/service/AdvertisementQueryServiceImpl.java new file mode 100644 index 0000000..82718ec --- /dev/null +++ b/src/main/java/com/whereyouad/WhereYouAd/domains/advertisement/domain/service/AdvertisementQueryServiceImpl.java @@ -0,0 +1,13 @@ +package com.whereyouad.WhereYouAd.domains.advertisement.domain.service; + +import lombok.AccessLevel; +import lombok.RequiredArgsConstructor; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +@Service +@Transactional(readOnly = true) +@RequiredArgsConstructor(access = AccessLevel.PROTECTED) +public class AdvertisementQueryServiceImpl implements AdvertisementQueryService{ + +} diff --git a/src/main/java/com/whereyouad/WhereYouAd/domains/advertisement/exception/AdvertisementException.java b/src/main/java/com/whereyouad/WhereYouAd/domains/advertisement/exception/AdvertisementException.java new file mode 100644 index 0000000..3a71dab --- /dev/null +++ b/src/main/java/com/whereyouad/WhereYouAd/domains/advertisement/exception/AdvertisementException.java @@ -0,0 +1,10 @@ +package com.whereyouad.WhereYouAd.domains.advertisement.exception; + +import com.whereyouad.WhereYouAd.global.exception.AppException; +import com.whereyouad.WhereYouAd.global.exception.BaseErrorCode; + +public class AdvertisementException extends AppException { + public AdvertisementException(BaseErrorCode code) { + super(code); + } +} diff --git a/src/main/java/com/whereyouad/WhereYouAd/domains/advertisement/exception/code/AdvertisementErrorCode.java b/src/main/java/com/whereyouad/WhereYouAd/domains/advertisement/exception/code/AdvertisementErrorCode.java new file mode 100644 index 0000000..718bb6e --- /dev/null +++ b/src/main/java/com/whereyouad/WhereYouAd/domains/advertisement/exception/code/AdvertisementErrorCode.java @@ -0,0 +1,18 @@ +package com.whereyouad.WhereYouAd.domains.advertisement.exception.code; + +import com.whereyouad.WhereYouAd.global.exception.BaseErrorCode; +import lombok.AllArgsConstructor; +import lombok.Getter; +import org.springframework.http.HttpStatus; + +@Getter +@AllArgsConstructor +public enum AdvertisementErrorCode implements BaseErrorCode { + + // TODO: 에러 코드 추가 + ; + + private final HttpStatus httpStatus; + private final String code; + private final String message; +} diff --git a/src/main/java/com/whereyouad/WhereYouAd/domains/advertisement/persistence/entity/Advertisement.java b/src/main/java/com/whereyouad/WhereYouAd/domains/advertisement/persistence/entity/Advertisement.java new file mode 100644 index 0000000..861186e --- /dev/null +++ b/src/main/java/com/whereyouad/WhereYouAd/domains/advertisement/persistence/entity/Advertisement.java @@ -0,0 +1,37 @@ +package com.whereyouad.WhereYouAd.domains.advertisement.persistence.entity; + +import com.whereyouad.WhereYouAd.domains.advertisement.domain.constant.Provider; +import com.whereyouad.WhereYouAd.global.common.BaseEntity; +import jakarta.persistence.*; +import lombok.*; + +import java.time.LocalDateTime; + +@Entity +@Getter +@Table(name = "advertisement") +@NoArgsConstructor(access = AccessLevel.PROTECTED) +@AllArgsConstructor +@Builder +public class Advertisement extends BaseEntity { + + @Id + @GeneratedValue(strategy = GenerationType.IDENTITY) + @Column(name = "ad_id") + private Long id; + + @Enumerated(EnumType.STRING) + @Column(name = "provider", nullable = false) + private Provider provider; + + private LocalDateTime startDate; + + private LocalDateTime endDate; + +// @Enumerated(EnumType.STRING) +// @Column(name = "status", nullable = false) +// @ColumnDefault("'ON_GOING'") +// AdStatus 는 ON_GOING, PAUSED, OVER 가 존재 +// join 연산으로 인한 성능 저하 우려 -> 일단은 주석 처리 +// private AdStatus adStatus; +} diff --git a/src/main/java/com/whereyouad/WhereYouAd/domains/advertisement/persistence/entity/MetricFact.java b/src/main/java/com/whereyouad/WhereYouAd/domains/advertisement/persistence/entity/MetricFact.java new file mode 100644 index 0000000..ef0154d --- /dev/null +++ b/src/main/java/com/whereyouad/WhereYouAd/domains/advertisement/persistence/entity/MetricFact.java @@ -0,0 +1,64 @@ +package com.whereyouad.WhereYouAd.domains.advertisement.persistence.entity; + +import com.whereyouad.WhereYouAd.domains.advertisement.domain.constant.Grain; +import com.whereyouad.WhereYouAd.domains.advertisement.domain.constant.Provider; +import com.whereyouad.WhereYouAd.domains.project.persistence.entity.Project; +import com.whereyouad.WhereYouAd.global.common.BaseEntity; +import jakarta.persistence.*; +import lombok.*; + +import java.math.BigDecimal; +import java.time.LocalDateTime; + +@Entity +@Getter +@Table(name = "metric_fact") +@NoArgsConstructor(access = AccessLevel.PROTECTED) +@AllArgsConstructor +@Builder +public class MetricFact extends BaseEntity { + + @Id + @GeneratedValue(strategy = GenerationType.IDENTITY) + @Column(name = "metric_fact_id") + private Long id; + + @Enumerated(EnumType.STRING) + @Column(name = "grain", nullable = false) + private Grain grain; // 집계 단위(HOURLY, DAILY) + + @Column(name = "time_bucket", nullable = false) + private LocalDateTime timeBucket; // 집계 단위 시작 시간 + +// @Column(name = "dimension_type") +// private String dimensionType; + + @Column(name = "impressions") + private Long impressions; // 노출수 + + @Column(name = "clicks") + private Long clicks; // 클릭수 + + @Column(name = "conversions") + private Long conversions; // 전환수 + + @Column(name = "spend", precision = 18, scale = 2) + private BigDecimal spend; // 광고비 + + @Column(name = "revenue", precision = 18, scale = 2) + private BigDecimal revenue; // 매출 + + @Enumerated(EnumType.STRING) + @Column(name = "provider", nullable = false) + private Provider provider; + + // 연관 관계 + @ManyToOne(fetch = FetchType.LAZY) + @JoinColumn(name = "project_id") + private Project project; + + //추가 연관관계 -> Advertisement + @ManyToOne(fetch = FetchType.LAZY) + @JoinColumn(name = "ad_id", nullable = false) + private Advertisement advertisement; +} diff --git a/src/main/java/com/whereyouad/WhereYouAd/domains/advertisement/persistence/repository/MetricFactRepository.java b/src/main/java/com/whereyouad/WhereYouAd/domains/advertisement/persistence/repository/MetricFactRepository.java new file mode 100644 index 0000000..c3fdcd4 --- /dev/null +++ b/src/main/java/com/whereyouad/WhereYouAd/domains/advertisement/persistence/repository/MetricFactRepository.java @@ -0,0 +1,7 @@ +package com.whereyouad.WhereYouAd.domains.advertisement.persistence.repository; + +import com.whereyouad.WhereYouAd.domains.advertisement.persistence.entity.MetricFact; +import org.springframework.data.jpa.repository.JpaRepository; + +public interface MetricFactRepository extends JpaRepository { +} diff --git a/src/main/java/com/whereyouad/WhereYouAd/domains/advertisement/presentation/AdvertisementController.java b/src/main/java/com/whereyouad/WhereYouAd/domains/advertisement/presentation/AdvertisementController.java new file mode 100644 index 0000000..e284422 --- /dev/null +++ b/src/main/java/com/whereyouad/WhereYouAd/domains/advertisement/presentation/AdvertisementController.java @@ -0,0 +1,13 @@ +package com.whereyouad.WhereYouAd.domains.advertisement.presentation; + +import com.whereyouad.WhereYouAd.domains.advertisement.presentation.docs.AdvertisementControllerDocs; +import lombok.AccessLevel; +import lombok.RequiredArgsConstructor; +import org.springframework.web.bind.annotation.*; + +@RestController +@RequiredArgsConstructor(access = AccessLevel.PROTECTED) +@RequestMapping("/api/advertisement") +public class AdvertisementController implements AdvertisementControllerDocs { + +} \ No newline at end of file diff --git a/src/main/java/com/whereyouad/WhereYouAd/domains/advertisement/presentation/docs/AdvertisementControllerDocs.java b/src/main/java/com/whereyouad/WhereYouAd/domains/advertisement/presentation/docs/AdvertisementControllerDocs.java new file mode 100644 index 0000000..284a884 --- /dev/null +++ b/src/main/java/com/whereyouad/WhereYouAd/domains/advertisement/presentation/docs/AdvertisementControllerDocs.java @@ -0,0 +1,5 @@ +package com.whereyouad.WhereYouAd.domains.advertisement.presentation.docs; + +public interface AdvertisementControllerDocs { + +} diff --git a/src/main/java/com/whereyouad/WhereYouAd/domains/project/application/dto/request/ProjectRequest.java b/src/main/java/com/whereyouad/WhereYouAd/domains/project/application/dto/request/ProjectRequest.java new file mode 100644 index 0000000..4cfedcf --- /dev/null +++ b/src/main/java/com/whereyouad/WhereYouAd/domains/project/application/dto/request/ProjectRequest.java @@ -0,0 +1,4 @@ +package com.whereyouad.WhereYouAd.domains.project.application.dto.request; + +public class ProjectRequest { +} diff --git a/src/main/java/com/whereyouad/WhereYouAd/domains/project/application/dto/response/ProjectResponse.java b/src/main/java/com/whereyouad/WhereYouAd/domains/project/application/dto/response/ProjectResponse.java new file mode 100644 index 0000000..f5d4c48 --- /dev/null +++ b/src/main/java/com/whereyouad/WhereYouAd/domains/project/application/dto/response/ProjectResponse.java @@ -0,0 +1,4 @@ +package com.whereyouad.WhereYouAd.domains.project.application.dto.response; + +public class ProjectResponse { +} diff --git a/src/main/java/com/whereyouad/WhereYouAd/domains/project/application/mapper/ProjectConverter.java b/src/main/java/com/whereyouad/WhereYouAd/domains/project/application/mapper/ProjectConverter.java new file mode 100644 index 0000000..2df8b82 --- /dev/null +++ b/src/main/java/com/whereyouad/WhereYouAd/domains/project/application/mapper/ProjectConverter.java @@ -0,0 +1,4 @@ +package com.whereyouad.WhereYouAd.domains.project.application.mapper; + +public class ProjectConverter { +} diff --git a/src/main/java/com/whereyouad/WhereYouAd/domains/project/domain/service/ProjectService.java b/src/main/java/com/whereyouad/WhereYouAd/domains/project/domain/service/ProjectService.java new file mode 100644 index 0000000..928da01 --- /dev/null +++ b/src/main/java/com/whereyouad/WhereYouAd/domains/project/domain/service/ProjectService.java @@ -0,0 +1,4 @@ +package com.whereyouad.WhereYouAd.domains.project.domain.service; + +public interface ProjectService { +} diff --git a/src/main/java/com/whereyouad/WhereYouAd/domains/project/domain/service/ProjectServiceImpl.java b/src/main/java/com/whereyouad/WhereYouAd/domains/project/domain/service/ProjectServiceImpl.java new file mode 100644 index 0000000..1e173ec --- /dev/null +++ b/src/main/java/com/whereyouad/WhereYouAd/domains/project/domain/service/ProjectServiceImpl.java @@ -0,0 +1,13 @@ +package com.whereyouad.WhereYouAd.domains.project.domain.service; + +import lombok.AccessLevel; +import lombok.RequiredArgsConstructor; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +@Service +@Transactional +@RequiredArgsConstructor(access = AccessLevel.PROTECTED) +public class ProjectServiceImpl implements ProjectService{ + +} diff --git a/src/main/java/com/whereyouad/WhereYouAd/domains/project/exception/ProjectException.java b/src/main/java/com/whereyouad/WhereYouAd/domains/project/exception/ProjectException.java new file mode 100644 index 0000000..4f3ecf3 --- /dev/null +++ b/src/main/java/com/whereyouad/WhereYouAd/domains/project/exception/ProjectException.java @@ -0,0 +1,10 @@ +package com.whereyouad.WhereYouAd.domains.project.exception; + +import com.whereyouad.WhereYouAd.global.exception.AppException; +import com.whereyouad.WhereYouAd.global.exception.BaseErrorCode; + +public class ProjectException extends AppException { + public ProjectException(BaseErrorCode code) { + super(code); + } +} diff --git a/src/main/java/com/whereyouad/WhereYouAd/domains/project/exception/code/ProjectErrorCode.java b/src/main/java/com/whereyouad/WhereYouAd/domains/project/exception/code/ProjectErrorCode.java new file mode 100644 index 0000000..7a5d33b --- /dev/null +++ b/src/main/java/com/whereyouad/WhereYouAd/domains/project/exception/code/ProjectErrorCode.java @@ -0,0 +1,17 @@ +package com.whereyouad.WhereYouAd.domains.project.exception.code; + +import com.whereyouad.WhereYouAd.global.exception.BaseErrorCode; +import lombok.AllArgsConstructor; +import lombok.Getter; +import org.springframework.http.HttpStatus; + +@Getter +@AllArgsConstructor +public enum ProjectErrorCode implements BaseErrorCode { + + ; + + private final HttpStatus httpStatus; + private final String code; + private final String message; +} diff --git a/src/main/java/com/whereyouad/WhereYouAd/domains/project/persistence/entity/Project.java b/src/main/java/com/whereyouad/WhereYouAd/domains/project/persistence/entity/Project.java new file mode 100644 index 0000000..81f2b4b --- /dev/null +++ b/src/main/java/com/whereyouad/WhereYouAd/domains/project/persistence/entity/Project.java @@ -0,0 +1,34 @@ +package com.whereyouad.WhereYouAd.domains.project.persistence.entity; + +import com.whereyouad.WhereYouAd.domains.organization.persistence.entity.Organization; +import com.whereyouad.WhereYouAd.global.common.BaseEntity; +import jakarta.persistence.*; +import lombok.*; + +@Entity +@Getter +@Table(name = "project") +@NoArgsConstructor(access = AccessLevel.PROTECTED) +@AllArgsConstructor +@Builder +public class Project extends BaseEntity { + + @Id + @GeneratedValue(strategy = GenerationType.IDENTITY) + @Column(name = "project_id") + private Long id; + + @Column(name = "name", nullable = false) + private String name; + + @Column(name = "description") + private String description; + + @Column(name = "created_by", nullable = false) + private Long createdBy; + + // 연관 관계 + @ManyToOne(fetch = FetchType.LAZY) + @JoinColumn(name = "org_id") + private Organization organization; +} diff --git a/src/main/java/com/whereyouad/WhereYouAd/domains/project/persistence/repository/ProjectRepository.java b/src/main/java/com/whereyouad/WhereYouAd/domains/project/persistence/repository/ProjectRepository.java new file mode 100644 index 0000000..f31811f --- /dev/null +++ b/src/main/java/com/whereyouad/WhereYouAd/domains/project/persistence/repository/ProjectRepository.java @@ -0,0 +1,7 @@ +package com.whereyouad.WhereYouAd.domains.project.persistence.repository; + +import com.whereyouad.WhereYouAd.domains.project.persistence.entity.Project; +import org.springframework.data.jpa.repository.JpaRepository; + +public interface ProjectRepository extends JpaRepository { +} diff --git a/src/main/java/com/whereyouad/WhereYouAd/domains/project/presentation/ProjectController.java b/src/main/java/com/whereyouad/WhereYouAd/domains/project/presentation/ProjectController.java new file mode 100644 index 0000000..06dabf6 --- /dev/null +++ b/src/main/java/com/whereyouad/WhereYouAd/domains/project/presentation/ProjectController.java @@ -0,0 +1,12 @@ +package com.whereyouad.WhereYouAd.domains.project.presentation; + +import com.whereyouad.WhereYouAd.domains.project.presentation.docs.ProjectControllerDocs; +import lombok.AccessLevel; +import lombok.RequiredArgsConstructor; +import org.springframework.web.bind.annotation.*; + +@RestController +@RequiredArgsConstructor(access = AccessLevel.PROTECTED) +@RequestMapping("/api/project") +public class ProjectController implements ProjectControllerDocs { +} diff --git a/src/main/java/com/whereyouad/WhereYouAd/domains/project/presentation/docs/ProjectControllerDocs.java b/src/main/java/com/whereyouad/WhereYouAd/domains/project/presentation/docs/ProjectControllerDocs.java new file mode 100644 index 0000000..211b470 --- /dev/null +++ b/src/main/java/com/whereyouad/WhereYouAd/domains/project/presentation/docs/ProjectControllerDocs.java @@ -0,0 +1,5 @@ +package com.whereyouad.WhereYouAd.domains.project.presentation.docs; + +public interface ProjectControllerDocs { + +} diff --git a/src/main/java/com/whereyouad/WhereYouAd/infrastructure/client/google/converter/GoogleConverter.java b/src/main/java/com/whereyouad/WhereYouAd/infrastructure/client/google/converter/GoogleConverter.java new file mode 100644 index 0000000..8e7ed26 --- /dev/null +++ b/src/main/java/com/whereyouad/WhereYouAd/infrastructure/client/google/converter/GoogleConverter.java @@ -0,0 +1,5 @@ +package com.whereyouad.WhereYouAd.infrastructure.client.google.converter; + +public class GoogleConverter { + // GoogleDTO -> MetricFactResponse 변환 +} diff --git a/src/main/java/com/whereyouad/WhereYouAd/infrastructure/client/google/dto/GoogleDTO.java b/src/main/java/com/whereyouad/WhereYouAd/infrastructure/client/google/dto/GoogleDTO.java new file mode 100644 index 0000000..a3992a4 --- /dev/null +++ b/src/main/java/com/whereyouad/WhereYouAd/infrastructure/client/google/dto/GoogleDTO.java @@ -0,0 +1,5 @@ +package com.whereyouad.WhereYouAd.infrastructure.client.google.dto; + +public class GoogleDTO { + // Google 응답 원문 +} diff --git a/src/main/java/com/whereyouad/WhereYouAd/infrastructure/client/kakao/converter/KakaoConverter.java b/src/main/java/com/whereyouad/WhereYouAd/infrastructure/client/kakao/converter/KakaoConverter.java new file mode 100644 index 0000000..66f6f6b --- /dev/null +++ b/src/main/java/com/whereyouad/WhereYouAd/infrastructure/client/kakao/converter/KakaoConverter.java @@ -0,0 +1,5 @@ +package com.whereyouad.WhereYouAd.infrastructure.client.kakao.converter; + +public class KakaoConverter { + // KakaoDTO -> MetricFactResponse 변환 +} diff --git a/src/main/java/com/whereyouad/WhereYouAd/infrastructure/client/kakao/dto/KakaoDTO.java b/src/main/java/com/whereyouad/WhereYouAd/infrastructure/client/kakao/dto/KakaoDTO.java new file mode 100644 index 0000000..eb819d3 --- /dev/null +++ b/src/main/java/com/whereyouad/WhereYouAd/infrastructure/client/kakao/dto/KakaoDTO.java @@ -0,0 +1,5 @@ +package com.whereyouad.WhereYouAd.infrastructure.client.kakao.dto; + +public class KakaoDTO { + // Kakao 응답 원문 +} diff --git a/src/main/java/com/whereyouad/WhereYouAd/infrastructure/client/naver/converter/NaverConverter.java b/src/main/java/com/whereyouad/WhereYouAd/infrastructure/client/naver/converter/NaverConverter.java new file mode 100644 index 0000000..c0f4f59 --- /dev/null +++ b/src/main/java/com/whereyouad/WhereYouAd/infrastructure/client/naver/converter/NaverConverter.java @@ -0,0 +1,5 @@ +package com.whereyouad.WhereYouAd.infrastructure.client.naver.converter; + +public class NaverConverter { + // NaverDTO -> MetricFactResponse 변환 +} diff --git a/src/main/java/com/whereyouad/WhereYouAd/infrastructure/client/naver/dto/NaverDTO.java b/src/main/java/com/whereyouad/WhereYouAd/infrastructure/client/naver/dto/NaverDTO.java new file mode 100644 index 0000000..bf054f5 --- /dev/null +++ b/src/main/java/com/whereyouad/WhereYouAd/infrastructure/client/naver/dto/NaverDTO.java @@ -0,0 +1,5 @@ +package com.whereyouad.WhereYouAd.infrastructure.client.naver.dto; + +public class NaverDTO { + // Naver 응답 원문 +}