Skip to content

Commit

Permalink
Merge branch 'prod' of https://github.com/Team-Clody/Clody_server int…
Browse files Browse the repository at this point in the history
…o prod
  • Loading branch information
hyukjinKimm committed Sep 2, 2024
2 parents 0ff1f5d + 19ccd03 commit bfd7f93
Show file tree
Hide file tree
Showing 55 changed files with 767 additions and 231 deletions.
6 changes: 3 additions & 3 deletions build.gradle.kts
Original file line number Diff line number Diff line change
Expand Up @@ -58,9 +58,9 @@ subprojects {

}

tasks.withType<BootJar> {
enabled = false;
}
// tasks.withType<BootJar> {
// enabled = false;
// }
tasks.withType<Jar> {
enabled = true;
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -4,10 +4,12 @@
import java.util.List;

public record DiaryResponse(
List<DiaryContent> diaries
List<DiaryContent> diaries,
boolean isDeleted
) {
public static DiaryResponse of(List<DiaryContent> diaries) {
return new DiaryResponse(diaries);
}

public static DiaryResponse of(List<DiaryContent> diaries, boolean isDeleted) {
return new DiaryResponse(diaries, isDeleted);
}
}

Original file line number Diff line number Diff line change
@@ -1,59 +1,60 @@
package com.clody.clodyapi.diary.mapper;

import com.clody.clodyapi.diary.controller.dto.response.DiaryCreatedResponse;
import com.clody.clodyapi.diary.controller.dto.response.DiaryCreatedTimeResponse;
import com.clody.clodyapi.diary.controller.dto.response.DiaryResponse;
import com.clody.domain.diary.dto.DiaryContent;
import com.clody.domain.diary.dto.DiaryDateInfo;
import com.clody.domain.diary.dto.DiaryDeletionInfo;
import com.clody.domain.diary.dto.DiaryDomainInfo;
import com.clody.domain.diary.dto.response.DiaryListGetResponse;
import com.clody.domain.diary.dto.response.DiaryCalenderGetResponse;
import com.clody.domain.diary.dto.response.DiaryCreatedInfo;
import com.clody.domain.diary.dto.response.DiaryDayInfo;
import com.clody.domain.diary.dto.response.DiaryListInfo;
import com.clody.domain.reply.ReplyType;
import com.clody.support.security.util.JwtUtil;
import java.time.LocalDateTime;
import java.util.List;

public class DiaryMapper {

public static DiaryResponse toDiaryResponse(List<DiaryContent> diaryContentList) {
return DiaryResponse.of(diaryContentList);
}

public static DiaryCreatedResponse toDiaryCreatedResponse(DiaryDomainInfo domainInfo) {
ReplyType type = domainInfo.replyType();
LocalDateTime createdAt = domainInfo.diaryList().getFirst().getCreatedAt();
return DiaryCreatedResponse.of(createdAt, type);
}

public static DiaryDeletionInfo toDiaryDeletionInfo(int year, int month, int date) {
Long userId = JwtUtil.getLoginMemberId();
return DiaryDeletionInfo.of(userId, year, month, date);
}

public static DiaryDateInfo toDiaryDateInfo(int year, int month, int date) {
return DiaryDateInfo.of(year, month, date);
}
package com.clody.clodyapi.diary.mapper;

import com.clody.clodyapi.diary.controller.dto.response.DiaryCreatedResponse;
import com.clody.clodyapi.diary.controller.dto.response.DiaryCreatedTimeResponse;
import com.clody.clodyapi.diary.controller.dto.response.DiaryResponse;
import com.clody.domain.diary.dto.DiaryContent;
import com.clody.domain.diary.dto.DiaryDateInfo;
import com.clody.domain.diary.dto.DiaryDeletionInfo;
import com.clody.domain.diary.dto.DiaryDomainInfo;
import com.clody.domain.diary.dto.response.DiaryListGetResponse;
import com.clody.domain.diary.dto.response.DiaryCalenderGetResponse;
import com.clody.domain.diary.dto.response.DiaryCreatedInfo;
import com.clody.domain.diary.dto.response.DiaryDayInfo;
import com.clody.domain.diary.dto.response.DiaryListInfo;
import com.clody.domain.reply.ReplyType;
import com.clody.support.security.util.JwtUtil;
import java.time.LocalDateTime;
import java.util.List;

public class DiaryMapper {

public static DiaryResponse toDiaryResponse(List<DiaryContent> diaryContentList,
boolean userHasDeletedDiary) {
return DiaryResponse.of(diaryContentList, userHasDeletedDiary);
}

public static DiaryCreatedResponse toDiaryCreatedResponse(DiaryDomainInfo domainInfo) {
ReplyType type = domainInfo.replyType();
LocalDateTime createdAt = domainInfo.diaryList().getFirst().getCreatedAt();
return DiaryCreatedResponse.of(createdAt, type);
}

public static DiaryDeletionInfo toDiaryDeletionInfo(int year, int month, int date) {
Long userId = JwtUtil.getLoginMemberId();
return DiaryDeletionInfo.of(userId, year, month, date);
}

public static DiaryDateInfo toDiaryDateInfo(int year, int month, int date) {
return DiaryDateInfo.of(year, month, date);
}

public static DiaryCreatedTimeResponse toDiaryCreatedTimeResponse(DiaryCreatedInfo info) {
return DiaryCreatedTimeResponse.of(info.HH(), info.MM(), info.SS(), info.replyType());
}

public static DiaryListGetResponse toDiaryListResponse(DiaryListInfo diaryListInfo) {

int totalCloverCount = diaryListInfo.totalCloverCount();
List<DiaryDayInfo> diaries = diaryListInfo.diaries();
return DiaryListGetResponse.of(totalCloverCount, diaries);
}

public static DiaryCalenderGetResponse toDiaryCalendarResponse(DiaryListInfo diaryListInfo) {

int totalCloverCount = diaryListInfo.totalCloverCount();
List<DiaryDayInfo> diaries = diaryListInfo.diaries();
return DiaryCalenderGetResponse.of(totalCloverCount, diaries);
}

public static DiaryCreatedTimeResponse toDiaryCreatedTimeResponse(DiaryCreatedInfo info) {
return DiaryCreatedTimeResponse.of(info.HH(), info.MM(), info.SS(), info.replyType());
}

public static DiaryListGetResponse toDiaryListResponse(DiaryListInfo diaryListInfo){

int totalCloverCount = diaryListInfo.totalCloverCount();
List<DiaryDayInfo> diaries = diaryListInfo.diaries();
return DiaryListGetResponse.of(totalCloverCount, diaries);
}

public static DiaryCalenderGetResponse toDiaryCalendarResponse(DiaryListInfo diaryListInfo){

int totalCloverCount = diaryListInfo.totalCloverCount();
List<DiaryDayInfo> diaries = diaryListInfo.diaries();
return DiaryCalenderGetResponse.of(totalCloverCount, diaries);
}

}
Original file line number Diff line number Diff line change
Expand Up @@ -19,7 +19,7 @@ public DiaryResponse deleteDiary(final int year, final int month, final int date
//Mapper에서 변환
DiaryDeletionInfo diaryDeletionInfo = DiaryMapper.toDiaryDeletionInfo(year, month, date);
diaryCommandService.removeDiarySoft(diaryDeletionInfo);
return DiaryResponse.of(List.of());
return DiaryResponse.of(List.of(),true);

}
}
Original file line number Diff line number Diff line change
Expand Up @@ -30,6 +30,7 @@ public DiaryCreatedTimeResponse getCreatedTime(int year, int month, int date) {
public DiaryResponse getDiary(final int year, final int month, final int date) {
DiaryDateInfo diaryDateInfo = DiaryMapper.toDiaryDateInfo(year, month, date);
List<DiaryContent> diaryContentList = diaryQueryService.getDiary(diaryDateInfo);
return DiaryMapper.toDiaryResponse(diaryContentList);
boolean userHasDeletedDiary = diaryQueryService.isUserHasDeletedDiary(diaryDateInfo);
return DiaryMapper.toDiaryResponse(diaryContentList, userHasDeletedDiary);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,6 @@
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestHeader;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.bind.annotation.RestController;

@RestController
Expand All @@ -38,7 +37,6 @@ public ResponseEntity<ApiResponse<UserAuthResponse>> signUp(
.body(ApiResponse.success(SuccessType.CREATED_SUCCESS, response));
}

@ResponseBody
@PostMapping("/auth/signin")
public ResponseEntity<ApiResponse<UserAuthResponse>> signIn(
@RequestHeader(HeaderConstants.AUTHORIZATION) String tokenWithBearer,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -30,8 +30,6 @@ public class UserControllerImpl implements UserController {
private final UserUpdateUsecase userUpdateUsecase;
private final UserDeletionUsecase userDeletionUsecase;



@Override
@GetMapping("/user/info")
public ResponseEntity<ApiResponse<UserInfoGetResponse>> getUserInfo() {
Expand Down
19 changes: 16 additions & 3 deletions clody-batch/build.gradle.kts
Original file line number Diff line number Diff line change
@@ -1,27 +1,32 @@
import io.spring.gradle.dependencymanagement.dsl.DependencyManagementExtension
import org.gradle.internal.impldep.org.junit.experimental.categories.Categories.CategoryFilter.include
import org.springframework.boot.gradle.tasks.bundling.BootJar

plugins {
java
id("org.springframework.boot") version "3.3.0"
// id("io.spring.dependency-management") version "1.1.5"

}

group = "com.clody"
version = "0.0.1-SNAPSHOT"
group = "com.clody-batch"
version = "1.0.0"

java {
toolchain {
languageVersion = JavaLanguageVersion.of(21)
}
}


repositories {
mavenCentral()
}

dependencies {
implementation(project(":clody-domain"))
implementation(project(":clody-infra"))
// implementation(project(":clody-infra"))
// implementation(project(":clody-support"))
implementation("org.springframework.boot:spring-boot-starter-batch")
testImplementation("org.springframework.boot:spring-boot-starter-test")
testImplementation("org.springframework.batch:spring-batch-test")
Expand All @@ -40,6 +45,14 @@ tasks.withType<Test> {
useJUnitPlatform()
}

tasks.named<BootJar>("bootJar") {
enabled = true
}

tasks.named<Jar>("jar") {
enabled = true
}

the<DependencyManagementExtension>().apply {
imports {
mavenBom("org.springframework.cloud:spring-cloud-dependencies:${property("springCloudDependenciesVersion")}")
Expand Down
Empty file modified clody-batch/gradle/wrapper/gradle-wrapper.properties
100644 → 100755
Empty file.
Empty file modified clody-batch/gradlew
100644 → 100755
Empty file.
Empty file modified clody-batch/gradlew.bat
100644 → 100755
Empty file.
Original file line number Diff line number Diff line change
@@ -1,22 +1,26 @@
package com.clody.clodybatch;

import lombok.extern.slf4j.Slf4j;
import static com.clody.clodybatch.config.BatchConfig.BATCH_DATASOURCE;
import static com.clody.clodybatch.config.BatchConfig.BATCH_TRANSACTION_MANAGER;

import com.clody.clodybatch.config.BatchConfig;
import org.springframework.batch.core.configuration.annotation.EnableBatchProcessing;
import org.springframework.batch.core.configuration.support.DefaultBatchConfiguration;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.WebApplicationType;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
import org.springframework.boot.builder.SpringApplicationBuilder;
import org.springframework.context.annotation.Import;

@EnableBatchProcessing
@Import({BatchConfig.class})
@EnableBatchProcessing(dataSourceRef = BATCH_DATASOURCE, transactionManagerRef = BATCH_TRANSACTION_MANAGER)
@SpringBootApplication
@Slf4j
@ConditionalOnMissingBean(value = DefaultBatchConfiguration.class, annotation = EnableBatchProcessing.class)
public class ClodyBatchApplication {

public static void main(String[] args) {
int exit = SpringApplication.exit(SpringApplication.run(ClodyBatchApplication.class, args));
log.info("exit = {}", exit);
System.exit(exit);
System.setProperty("spring.config.name","application-batch");
SpringApplication springApplication = new SpringApplicationBuilder(ClodyBatchApplication.class).web(
WebApplicationType.NONE).build();
springApplication.run(args);
}

}
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
package com.clody.clodybatch.config;

import org.springframework.batch.core.configuration.annotation.EnableBatchProcessing;
import org.springframework.batch.core.configuration.support.DefaultBatchConfiguration;
import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;

@ConditionalOnMissingBean(value = DefaultBatchConfiguration.class, annotation = EnableBatchProcessing.class)
public class BatchAutoConfiguration {
}
Original file line number Diff line number Diff line change
@@ -1,26 +1,75 @@
package com.clody.clodybatch.config;

import com.clody.infra.meta.JpaScheduleMetaRepository;
import com.clody.meta.Schedule;
import java.time.LocalDateTime;
import java.time.temporal.ChronoUnit;
import java.util.Collections;
import org.springframework.batch.core.configuration.support.DefaultBatchConfiguration;
import org.springframework.batch.item.data.RepositoryItemReader;
import com.zaxxer.hikari.HikariDataSource;
import java.util.Collection;
import javax.sql.DataSource;
import lombok.RequiredArgsConstructor;
import org.springframework.batch.core.Job;
import org.springframework.batch.core.explore.JobExplorer;
import org.springframework.batch.core.launch.JobLauncher;
import org.springframework.batch.core.repository.JobRepository;
import org.springframework.beans.factory.ObjectProvider;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.boot.autoconfigure.batch.BatchDataSource;
import org.springframework.boot.autoconfigure.batch.BatchDataSourceScriptDatabaseInitializer;
import org.springframework.boot.autoconfigure.batch.BatchProperties;
import org.springframework.boot.autoconfigure.batch.JobLauncherApplicationRunner;
import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.boot.context.properties.EnableConfigurationProperties;
import org.springframework.boot.jdbc.DataSourceBuilder;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Primary;
import org.springframework.jdbc.datasource.DataSourceTransactionManager;
import org.springframework.transaction.PlatformTransactionManager;
import org.springframework.util.StringUtils;

@Configuration
public class BatchConfig extends DefaultBatchConfiguration {
@RequiredArgsConstructor
@EnableConfigurationProperties(BatchProperties.class)
public class BatchConfig {

public static final String BATCH_DATASOURCE = "batchDataSource";
public static final String BATCH_TRANSACTION_MANAGER = "batchTransactionManager";

@Bean
@ConditionalOnMissingBean
@ConditionalOnProperty(prefix = "spring.batch.job", name = "enabled", havingValue = "true", matchIfMissing = true)
public JobLauncherApplicationRunner jobLauncherApplicationRunner(JobLauncher jobLauncher, JobExplorer jobExplorer,
JobRepository jobRepository, BatchProperties properties, Collection<Job> jobs) {
JobLauncherApplicationRunner runner = new JobLauncherApplicationRunner(jobLauncher, jobExplorer, jobRepository);
String jobNames = properties.getJob().getName();
if (StringUtils.hasText(jobNames)) {
if (jobs.stream().map(Job::getName).noneMatch(s -> s.equals(jobNames))){
throw new IllegalArgumentException(jobNames + "는 등록되지 않은 job name입니다. job name을 확인하세요.");
}
runner.setJobName(jobNames);
}
return runner;
}

@Bean
public RepositoryItemReader<Schedule> metaScheduleReader(
JpaScheduleMetaRepository scheduleMetaRepository){
RepositoryItemReader<Schedule> reader = new RepositoryItemReader<>();
reader.setRepository(scheduleMetaRepository);
reader.setMethodName("findByNotificationTime");
reader.setArguments(Collections.singletonList(LocalDateTime.now().truncatedTo(ChronoUnit.SECONDS)));
reader.setPageSize(10);
return reader;
@ConditionalOnMissingBean(BatchDataSourceScriptDatabaseInitializer.class)
BatchDataSourceScriptDatabaseInitializer batchDataSourceInitializer(DataSource dataSource,
@BatchDataSource ObjectProvider<DataSource> batchDataSource, BatchProperties properties) {
return new BatchDataSourceScriptDatabaseInitializer(
batchDataSource.getIfAvailable(() -> dataSource),
properties.getJdbc());
}

@Primary
@BatchDataSource
@Bean(BATCH_DATASOURCE)
@ConfigurationProperties(prefix = "spring.datasource.batch.hikari")
public DataSource batchDataSource() {
return DataSourceBuilder.create().type(HikariDataSource.class).build();
}

@Bean(BATCH_TRANSACTION_MANAGER)
public PlatformTransactionManager batchTransactionManager(
@Qualifier(BATCH_DATASOURCE) DataSource batchDataSource) {
return new DataSourceTransactionManager(batchDataSource);
}
}
Loading

0 comments on commit bfd7f93

Please sign in to comment.