Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Deploy | CAKK-53 | v2.0.4 배포 #207

Merged
merged 13 commits into from
Sep 9, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
5 changes: 4 additions & 1 deletion build.gradle.kts
Original file line number Diff line number Diff line change
Expand Up @@ -41,7 +41,10 @@ subprojects {
}
}

if (project.name == "cakk-admin" || project.name == "cakk-external") {
if (project.name == "cakk-admin" ||
project.name == "cakk-external" ||
project.name == "cakk-common"
) {
apply(plugin = "org.jetbrains.kotlin.jvm")
apply(plugin = "org.jetbrains.kotlin.plugin.spring")
apply(plugin = "org.jetbrains.kotlin.plugin.jpa")
Expand Down
77 changes: 32 additions & 45 deletions cakk-admin/src/main/kotlin/com/cakk/admin/service/CakeService.kt
Original file line number Diff line number Diff line change
@@ -1,57 +1,44 @@
package com.cakk.admin.service

import org.springframework.stereotype.Service
import org.springframework.transaction.annotation.Transactional

import com.cakk.admin.dto.param.CakeCreateByAdminParam
import com.cakk.admin.dto.param.CakeUpdateByAdminParam
import com.cakk.domain.mysql.facade.cake.CakeManagerFacade
import com.cakk.domain.mysql.facade.tag.TagManagerFacade
import com.cakk.domain.mysql.repository.reader.CakeReader
import com.cakk.domain.mysql.repository.reader.CakeShopReader
import com.cakk.domain.mysql.repository.reader.TagReader
import com.cakk.domain.mysql.repository.writer.CakeWriter
import com.cakk.domain.mysql.repository.writer.TagWriter
import org.springframework.stereotype.Service
import org.springframework.transaction.annotation.Transactional

@Service
class CakeService(
private val cakeShopReader: CakeShopReader,
private val cakeReader: CakeReader,
private val cakeWriter: CakeWriter,
private val tagReader: TagReader,
private val tagWriter: TagWriter
private val cakeShopReader: CakeShopReader,
private val cakeReader: CakeReader,
private val tagManagerFacade: TagManagerFacade,
private val cakeManagerFacade: CakeManagerFacade
) {

@Transactional
fun createCake(dto: CakeCreateByAdminParam) {
val cakeShop = cakeShopReader.findById(dto.cakeShopId)
val cake = dto.cake
val tags = dto.tagNames
.map {
tagReader.findByTagName(it).orElseGet { tagWriter.saveTag(it) }
}.toMutableList()

cake.registerTags(tags)
cake.registerCategories(dto.cakeCategories)
cakeShop.registerCake(cake)
}

@Transactional
fun updateCake(dto: CakeUpdateByAdminParam) {
val cake = cakeReader.findById(dto.cakeId)
val tags = dto.tagNames
.map {
tagReader.findByTagName(it).orElseGet { tagWriter.saveTag(it) }
}.toMutableList()

cake.updateCakeImageUrl(dto.cakeImageUrl)
cake.updateCakeCategories(dto.cakeCategories)
cake.updateCakeTags(tags)
}

@Transactional
fun deleteCake(cakeId: Long) {
val cake = cakeReader.findById(cakeId)

cake.removeCakeCategories()
cake.removeCakeTags()
cakeWriter.deleteCake(cake)
}
@Transactional
fun createCake(dto: CakeCreateByAdminParam) {
val cakeShop = cakeShopReader.findById(dto.cakeShopId)
val cake = dto.cake
val tags = dto.tagNames.map { tagManagerFacade.saveIfNew(it) }.toMutableList()

cakeManagerFacade.create(cakeShop, cake, tags, dto.cakeCategories)
}

@Transactional
fun updateCake(dto: CakeUpdateByAdminParam) {
val cake = cakeReader.findById(dto.cakeId)
val tags = dto.tagNames.map { tagManagerFacade.saveIfNew(it) }.toMutableList()

cakeManagerFacade.update(cake, dto.cakeImageUrl, tags, dto.cakeCategories)
}

@Transactional
fun deleteCake(cakeId: Long) {
val cake = cakeReader.findById(cakeId)

cakeManagerFacade.delete(cake)
}
}
11 changes: 6 additions & 5 deletions cakk-admin/src/main/kotlin/com/cakk/admin/service/ShopService.kt
Original file line number Diff line number Diff line change
@@ -1,5 +1,8 @@
package com.cakk.admin.service

import org.springframework.stereotype.Service
import org.springframework.transaction.annotation.Transactional

import com.cakk.admin.dto.param.CakeShopCreateByAdminParam
import com.cakk.admin.dto.response.CakeShopCreateResponse
import com.cakk.admin.mapper.supplyCakeShopCreateResponseBy
Expand All @@ -8,20 +11,18 @@ import com.cakk.domain.mysql.dto.param.operation.UpdateShopOperationParam
import com.cakk.domain.mysql.dto.param.shop.CakeShopUpdateParam
import com.cakk.domain.mysql.dto.param.shop.UpdateShopAddressParam
import com.cakk.domain.mysql.entity.shop.CakeShop
import com.cakk.domain.mysql.facade.shop.CakeShopManagerFacade
import com.cakk.domain.mysql.repository.reader.CakeShopReader
import com.cakk.domain.mysql.repository.writer.CakeShopWriter
import org.springframework.stereotype.Service
import org.springframework.transaction.annotation.Transactional

@Service
class ShopService(
private val cakeShopReader: CakeShopReader,
private val cakeShopWriter: CakeShopWriter
private val cakeShopManagerFacade: CakeShopManagerFacade
) {

@Transactional
fun createCakeShopByCertification(dto: CakeShopCreateByAdminParam): CakeShopCreateResponse {
val result: CakeShop = cakeShopWriter.createCakeShop(
val result: CakeShop = cakeShopManagerFacade.createCakeShop(
dto.cakeShop,
dto.cakeShopOperations,
dto.businessInformation,
Expand Down
6 changes: 6 additions & 0 deletions cakk-api/build.gradle.kts
Original file line number Diff line number Diff line change
Expand Up @@ -37,6 +37,12 @@ dependencies {

// Point
implementation("org.locationtech.jts:jts-core:1.18.2")

// Mail
implementation("org.springframework.boot:spring-boot-starter-mail")

// Slack
implementation("net.gpedro.integrations.slack:slack-webhook:1.4.0")
}

tasks.bootJar {
Expand Down
Original file line number Diff line number Diff line change
@@ -1,16 +1,44 @@
package com.cakk.api.config;

import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.mail.javamail.JavaMailSender;

import net.gpedro.integrations.slack.SlackApi;

import com.cakk.external.extractor.CertificationSlackMessageExtractor;
import com.cakk.external.extractor.ErrorAlertSlackMessageExtractor;
import com.cakk.external.extractor.MessageExtractor;
import com.cakk.external.extractor.VerificationCodeMimeMessageExtractor;
import com.cakk.external.sender.EmailMessageSender;
import com.cakk.external.sender.MessageSender;
import com.cakk.external.sender.SlackMessageSender;
import com.cakk.external.template.MessageTemplate;

@Configuration
public class MessageTemplateConfig {

private final JavaMailSender javaMailSender;
private final SlackApi slackApi;

private final String senderEmail;
private final Boolean isEnable;

public MessageTemplateConfig(
JavaMailSender javaMailSender,
SlackApi slackApi,
@Value("${spring.mail.username}")
String senderEmail,
@Value("${slack.webhook.is-enable}")
Boolean isEnable
) {
this.javaMailSender = javaMailSender;
this.senderEmail = senderEmail;
this.isEnable = isEnable;
this.slackApi = slackApi;
}

@Bean
public MessageTemplate certificationTemplate() {
return new MessageTemplate();
Expand All @@ -25,4 +53,19 @@ public MessageExtractor certificationMessageExtractor() {
public MessageExtractor errorAlertMessageExtractor() {
return new ErrorAlertSlackMessageExtractor();
}

@Bean
public MessageExtractor verificationCodeMimeMessageExtractor() {
return new VerificationCodeMimeMessageExtractor(javaMailSender, senderEmail);
}

@Bean
public MessageSender emailMessageSender() {
return new EmailMessageSender(javaMailSender);
}

@Bean
public MessageSender slackMessageSender() {
return new SlackMessageSender(slackApi, isEnable);
}
}
4 changes: 2 additions & 2 deletions cakk-api/src/main/java/com/cakk/api/mapper/ShopMapper.java
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
package com.cakk.api.mapper;

import static com.cakk.common.utils.SetUtilsKt.*;
import static java.util.Objects.*;

import java.util.ArrayList;
Expand All @@ -20,7 +21,6 @@
import com.cakk.api.dto.response.shop.CakeShopOwnerResponse;
import com.cakk.api.dto.response.shop.CakeShopSearchResponse;
import com.cakk.api.dto.response.shop.CakeShopSimpleResponse;
import com.cakk.common.utils.SetUtils;
import com.cakk.domain.mysql.dto.param.like.HeartCakeShopResponseParam;
import com.cakk.domain.mysql.dto.param.shop.CakeShopByLocationParam;
import com.cakk.domain.mysql.dto.param.shop.CakeShopBySearchParam;
Expand Down Expand Up @@ -157,7 +157,7 @@ public static CakeShopSearchResponse supplyCakeShopSearchResponseBy(final List<C

public static HeartCakeShopListResponse supplyHeartCakeShopListResponseBy(final List<HeartCakeShopResponseParam> cakeShops) {
final int size = cakeShops.size();
cakeShops.forEach(it -> SetUtils.keepOnlyNElements(it.cakeImageUrls(), 4));
cakeShops.forEach(it -> keepOnlyNElements(it.cakeImageUrls(), 4));

return HeartCakeShopListResponse.builder()
.cakeShops(cakeShops)
Expand Down
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
package com.cakk.api.provider.oauth;

import static com.cakk.common.enums.ReturnCode.*;
import static com.cakk.common.utils.DecodeUtils.*;
import static com.cakk.common.utils.DecodeUtilsKt.*;

import java.io.IOException;
import java.util.Map;
Expand Down
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
package com.cakk.api.provider.oauth;

import static com.cakk.common.enums.ReturnCode.*;
import static com.cakk.common.utils.DecodeUtils.*;
import static com.cakk.common.utils.DecodeUtilsKt.*;

import java.math.BigInteger;
import java.security.KeyFactory;
Expand Down
41 changes: 15 additions & 26 deletions cakk-api/src/main/java/com/cakk/api/service/cake/CakeService.java
Original file line number Diff line number Diff line change
Expand Up @@ -23,14 +23,14 @@
import com.cakk.domain.mysql.dto.param.cake.CakeImageResponseParam;
import com.cakk.domain.mysql.dto.param.cake.CakeUpdateParam;
import com.cakk.domain.mysql.entity.cake.Cake;
import com.cakk.domain.mysql.entity.cake.CakeCategory;
import com.cakk.domain.mysql.entity.cake.Tag;
import com.cakk.domain.mysql.entity.shop.CakeShop;
import com.cakk.domain.mysql.entity.user.User;
import com.cakk.domain.mysql.facade.cake.CakeManagerFacade;
import com.cakk.domain.mysql.repository.reader.CakeReader;
import com.cakk.domain.mysql.repository.reader.CakeShopReader;
import com.cakk.domain.mysql.repository.reader.TagReader;
import com.cakk.domain.mysql.repository.writer.CakeWriter;
import com.cakk.domain.mysql.repository.writer.TagWriter;
import com.cakk.domain.redis.repository.CakeViewsRedisRepository;

@Transactional(readOnly = true)
Expand All @@ -39,12 +39,10 @@
public class CakeService {

private final CakeReader cakeReader;
private final CakeWriter cakeWriter;
private final TagReader tagReader;
private final TagWriter tagWriter;
private final CakeShopReader cakeShopReader;
private final CakeViewsRedisRepository cakeViewsRedisRepository;

private final CakeManagerFacade cakeManagerFacade;
private final ApplicationEventPublisher publisher;

public CakeImageListResponse findCakeImagesByCursorAndCategory(final CakeSearchByCategoryRequest dto) {
Expand Down Expand Up @@ -92,37 +90,28 @@ public CakeDetailResponse findCakeDetailById(Long cakeId) {

@Transactional
public void createCake(CakeCreateParam param) {
CakeShop cakeShop = cakeShopReader.searchByIdAndOwner(param.cakeShopId(), param.owner());
Cake cake = param.cake();
List<Tag> tags = param.tagNames()
.stream()
.map(tagName -> tagReader.findByTagName(tagName).orElseGet(() -> tagWriter.saveTag(tagName)))
.toList();

cake.registerTags(tags);
cake.registerCategories(param.cakeCategories());
cakeShop.registerCake(cake);
final CakeShop cakeShop = cakeShopReader.searchByIdAndOwner(param.cakeShopId(), param.owner());
final Cake cake = param.cake();
final List<Tag> tags = tagReader.getTagsByTagName(param.tagNames());
final List<CakeCategory> cakeCategories = param.cakeCategories();

cakeManagerFacade.create(cakeShop, cake, tags, cakeCategories);
}

@Transactional
public void updateCake(CakeUpdateParam param) {
final Cake cake = cakeReader.findWithCakeTagsAndCakeCategories(param.cakeId(), param.owner());
List<Tag> tags = param.tagNames()
.stream()
.map(tagName -> tagReader.findByTagName(tagName).orElseGet(() -> tagWriter.saveTag(tagName)))
.toList();

cake.updateCakeImageUrl(param.cakeImageUrl());
cake.updateCakeCategories(param.cakeCategories());
cake.updateCakeTags(tags);
final List<Tag> tags = tagReader.getTagsByTagName(param.tagNames());
final String cakeImageUrl = param.cakeImageUrl();
final List<CakeCategory> cakeCategories = param.cakeCategories();

cakeManagerFacade.update(cake, cakeImageUrl, tags, cakeCategories);
}

@Transactional
public void deleteCake(User owner, Long cakeId) {
final Cake cake = cakeReader.findWithCakeTagsAndCakeCategories(cakeId, owner);

cake.removeCakeCategories();
cake.removeCakeTags();
cakeWriter.deleteCake(cake);
cakeManagerFacade.delete(cake);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -51,11 +51,11 @@
import com.cakk.domain.mysql.entity.user.User;
import com.cakk.domain.mysql.event.shop.CertificationEvent;
import com.cakk.domain.mysql.event.views.CakeShopIncreaseViewsEvent;
import com.cakk.domain.mysql.facade.shop.CakeShopManagerFacade;
import com.cakk.domain.mysql.mapper.EventMapper;
import com.cakk.domain.mysql.repository.reader.BusinessInformationReader;
import com.cakk.domain.mysql.repository.reader.CakeShopReader;
import com.cakk.domain.mysql.repository.reader.UserReader;
import com.cakk.domain.mysql.repository.writer.CakeShopWriter;
import com.cakk.domain.redis.repository.CakeShopViewsRedisRepository;

@Service
Expand All @@ -65,8 +65,9 @@ public class ShopService {
private final UserReader userReader;
private final CakeShopReader cakeShopReader;
private final BusinessInformationReader businessInformationReader;
private final CakeShopWriter cakeShopWriter;
private final CakeShopManagerFacade cakeShopManagerFacade;
private final CakeShopViewsRedisRepository cakeShopViewsRedisRepository;

private final VerificationPolicy verificationPolicy;
private final ApplicationEventPublisher publisher;

Expand All @@ -77,7 +78,7 @@ public CakeShopCreateResponse createCakeShopByCertification(final CreateShopRequ
final List<CakeShopOperation> cakeShopOperations = ShopMapper.supplyCakeShopOperationsBy(cakeShop, request.operationDays());
final List<CakeShopLink> cakeShopLinks = LinkMapper.supplyCakeShopLinksBy(cakeShop, request.links());

final CakeShop result = cakeShopWriter.createCakeShop(cakeShop, cakeShopOperations, businessInformation, cakeShopLinks);
final CakeShop result = cakeShopManagerFacade.createCakeShop(cakeShop, cakeShopOperations, businessInformation, cakeShopLinks);

return ShopMapper.supplyCakeShopCreateResponseBy(result);
}
Expand Down Expand Up @@ -121,7 +122,7 @@ public CakeShopByMineResponse getMyBusinessId(final User user) {
return ShopMapper.supplyCakeShopByMineResponseBy(result);
}

@Transactional(readOnly = true)
@Transactional
public void requestCertificationBusinessOwner(final CertificationParam param) {
final BusinessInformation businessInformation = cakeShopReader.findBusinessInformationByCakeShopId(param.cakeShopId());
final CertificationEvent certificationEvent = verificationPolicy
Expand Down
Loading
Loading