diff --git a/pom.xml b/pom.xml index deaf544d4dfd4392689fc73ce2fb2f1f2605594a..a15cd30dd0d8149ddc4c976830970675ec1d2f89 100644 --- a/pom.xml +++ b/pom.xml @@ -35,6 +35,12 @@ spring-boot-starter-data-redis + + com.google.firebase + firebase-admin + 9.2.0 + + redis.clients jedis diff --git a/src/main/java/com/utility/utilitycommonservice/UtilityCommonServiceApplication.java b/src/main/java/com/utility/utilitycommonservice/UtilityCommonServiceApplication.java index c4b9a2b17f1bfb8e049c6ed7384eb863a8b82460..772b3069fe17704366e8e2495ebac426e744d1f9 100644 --- a/src/main/java/com/utility/utilitycommonservice/UtilityCommonServiceApplication.java +++ b/src/main/java/com/utility/utilitycommonservice/UtilityCommonServiceApplication.java @@ -1,9 +1,7 @@ package com.utility.utilitycommonservice; -import com.utility.utilitycommonservice.common.properties.BitbucketProperties; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; -import org.springframework.boot.context.properties.EnableConfigurationProperties; import org.springframework.cloud.openfeign.EnableFeignClients; @SpringBootApplication diff --git a/src/main/java/com/utility/utilitycommonservice/api/controller/bitbucket/BitbucketController.java b/src/main/java/com/utility/utilitycommonservice/api/controller/bitbucket/BitbucketController.java index 7685f9087dcf0f139f148846e1f4f0b19b22269f..dd48d703b9d687ac7f59c1684953de251dd7f42e 100644 --- a/src/main/java/com/utility/utilitycommonservice/api/controller/bitbucket/BitbucketController.java +++ b/src/main/java/com/utility/utilitycommonservice/api/controller/bitbucket/BitbucketController.java @@ -7,7 +7,7 @@ import com.utility.utilitycommonservice.common.base.controller.BaseController; import com.utility.utilitycommonservice.common.base.response.MessageResponse; import com.utility.utilitycommonservice.domain.model.bitbucket.input.UploadFileInput; import com.utility.utilitycommonservice.domain.service.bitbucket.BitbucketService; -import com.utility.utilitycommonservice.integration.service.model.response.CreateBranchClientResponse; +import com.utility.utilitycommonservice.integration.service.model.response.bitbucket.CreateBranchClientResponse; import lombok.RequiredArgsConstructor; import org.springframework.web.bind.annotation.*; import org.springframework.web.multipart.MultipartFile; diff --git a/src/main/java/com/utility/utilitycommonservice/api/controller/localize/LocalizeController.java b/src/main/java/com/utility/utilitycommonservice/api/controller/localize/LocalizeController.java index cf4cd7fd60573e7df05a61741d42262747e4760d..cf0c8e1e1eda5241eab886a3527e4f0cce9db631 100644 --- a/src/main/java/com/utility/utilitycommonservice/api/controller/localize/LocalizeController.java +++ b/src/main/java/com/utility/utilitycommonservice/api/controller/localize/LocalizeController.java @@ -1,5 +1,6 @@ package com.utility.utilitycommonservice.api.controller.localize; +import com.utility.utilitycommonservice.api.model.request.AddLocalizeRequest; import com.utility.utilitycommonservice.api.model.request.RequestByKey; import com.utility.utilitycommonservice.api.model.response.ResponseByKey; import com.utility.utilitycommonservice.common.base.controller.BaseController; @@ -11,6 +12,8 @@ import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; +import java.io.IOException; + @RestController @RequiredArgsConstructor @RequestMapping("/api/v1/localize") @@ -24,4 +27,10 @@ public class LocalizeController extends BaseController { return responseSuccess(output.toResponse()); } + @PostMapping("/addLocalize") + public MessageResponse addLocalize(@RequestBody AddLocalizeRequest request) throws IOException { + localizeService.addLocalize(request.toInput()); + return responseSuccess(); + } + } diff --git a/src/main/java/com/utility/utilitycommonservice/api/controller/notification/PushController.java b/src/main/java/com/utility/utilitycommonservice/api/controller/notification/PushController.java new file mode 100644 index 0000000000000000000000000000000000000000..83f601946849bff1b1e2f158aaa327e405f49649 --- /dev/null +++ b/src/main/java/com/utility/utilitycommonservice/api/controller/notification/PushController.java @@ -0,0 +1,34 @@ +package com.utility.utilitycommonservice.api.controller.notification; + +import com.utility.utilitycommonservice.api.model.request.CrudNotificationRequest; +import com.utility.utilitycommonservice.api.model.request.PushNotificationByDomainRequest; +import com.utility.utilitycommonservice.api.model.response.CrudNotificationResponse; +import com.utility.utilitycommonservice.common.base.controller.BaseController; +import com.utility.utilitycommonservice.common.base.response.MessageResponse; +import com.utility.utilitycommonservice.domain.service.clientbe.notification.PushService; +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/notification") +public class PushController extends BaseController { + + private final PushService pushService; + + @PostMapping("/pushByDomain") + public MessageResponse pushNotificationByDomain(@RequestBody PushNotificationByDomainRequest request) { + pushService.pushNotificationByDomain(request.toInput()); + return responseSuccess(); + } + + @PostMapping("/crudNotification") + public MessageResponse crudNotification(@RequestBody CrudNotificationRequest request) { + var output = pushService.crudNotification(request.toInput()); + return responseSuccess(output.toResponse()); + } + +} diff --git a/src/main/java/com/utility/utilitycommonservice/domain/model/localize/KeyValueParameter.java b/src/main/java/com/utility/utilitycommonservice/api/model/KeyValueParameter.java similarity index 86% rename from src/main/java/com/utility/utilitycommonservice/domain/model/localize/KeyValueParameter.java rename to src/main/java/com/utility/utilitycommonservice/api/model/KeyValueParameter.java index cefdf94e2a08c0e12a9c2fafc6a9d1c132bcc45b..e0027bb04803018efb5f0cc39723dbc4285d907e 100644 --- a/src/main/java/com/utility/utilitycommonservice/domain/model/localize/KeyValueParameter.java +++ b/src/main/java/com/utility/utilitycommonservice/api/model/KeyValueParameter.java @@ -1,4 +1,4 @@ -package com.utility.utilitycommonservice.domain.model.localize; +package com.utility.utilitycommonservice.api.model; import lombok.AllArgsConstructor; import lombok.Builder; diff --git a/src/main/java/com/utility/utilitycommonservice/api/model/request/AddLocalizeRequest.java b/src/main/java/com/utility/utilitycommonservice/api/model/request/AddLocalizeRequest.java new file mode 100644 index 0000000000000000000000000000000000000000..bfbfa919519399360f1763001800b76562ca940b --- /dev/null +++ b/src/main/java/com/utility/utilitycommonservice/api/model/request/AddLocalizeRequest.java @@ -0,0 +1,22 @@ +package com.utility.utilitycommonservice.api.model.request; + +import com.utility.utilitycommonservice.domain.model.localize.input.AddLocalizeInput; +import lombok.Builder; +import lombok.Data; + +@Data +@Builder +public class AddLocalizeRequest { + private String language; + private String key; + private String value; + + public AddLocalizeInput toInput() { + return AddLocalizeInput.builder() + .language(language) + .key(key) + .value(value) + .build(); + } + +} diff --git a/src/main/java/com/utility/utilitycommonservice/api/model/request/CrudNotificationRequest.java b/src/main/java/com/utility/utilitycommonservice/api/model/request/CrudNotificationRequest.java new file mode 100644 index 0000000000000000000000000000000000000000..eabafefc19e8a0bbdf2b42dd569e892eb2df21c9 --- /dev/null +++ b/src/main/java/com/utility/utilitycommonservice/api/model/request/CrudNotificationRequest.java @@ -0,0 +1,22 @@ +package com.utility.utilitycommonservice.api.model.request; + +import com.utility.utilitycommonservice.domain.model.notification.enums.CrudType; +import com.utility.utilitycommonservice.domain.model.notification.input.CrudNotificationInput; +import lombok.Builder; +import lombok.Data; + +@Data +@Builder +public class CrudNotificationRequest { + + private CrudType crudType; + private String uid; + + public CrudNotificationInput toInput() { + return CrudNotificationInput.builder() + .crudType(crudType) + .uid(uid) + .build(); + } + +} diff --git a/src/main/java/com/utility/utilitycommonservice/api/model/request/PushNotificationByDomainRequest.java b/src/main/java/com/utility/utilitycommonservice/api/model/request/PushNotificationByDomainRequest.java new file mode 100644 index 0000000000000000000000000000000000000000..6ace98589b44a986747b135c490e3378506c251e --- /dev/null +++ b/src/main/java/com/utility/utilitycommonservice/api/model/request/PushNotificationByDomainRequest.java @@ -0,0 +1,21 @@ +package com.utility.utilitycommonservice.api.model.request; + +import com.utility.utilitycommonservice.domain.model.notification.InfoModel; +import com.utility.utilitycommonservice.domain.model.notification.input.PushNotificationByDomainInput; +import lombok.Builder; +import lombok.Data; + +@Data +@Builder +public class PushNotificationByDomainRequest { + private InfoModel infoModel; + private String domainCode; + + public PushNotificationByDomainInput toInput() { + return PushNotificationByDomainInput.builder() + .infoModel(infoModel) + .domainCode(domainCode) + .build(); + } + +} diff --git a/src/main/java/com/utility/utilitycommonservice/api/model/response/CrudNotificationResponse.java b/src/main/java/com/utility/utilitycommonservice/api/model/response/CrudNotificationResponse.java new file mode 100644 index 0000000000000000000000000000000000000000..7fe9bb1cff64b6f8ca3f98c2ffe0eee0a4ebf663 --- /dev/null +++ b/src/main/java/com/utility/utilitycommonservice/api/model/response/CrudNotificationResponse.java @@ -0,0 +1,15 @@ +package com.utility.utilitycommonservice.api.model.response; + +import com.utility.utilitycommonservice.domain.model.notification.Notification; +import lombok.Builder; +import lombok.Data; + +import java.util.List; + +@Data +@Builder +public class CrudNotificationResponse { + + private List notifications; + +} diff --git a/src/main/java/com/utility/utilitycommonservice/api/model/response/MenuResponse.java b/src/main/java/com/utility/utilitycommonservice/api/model/response/MenuResponse.java index aebad6e169a4ca34bde0c71562bff02c82987d3d..3e9c420f3868b34dcb9ec833720babbbcd1ef2ef 100644 --- a/src/main/java/com/utility/utilitycommonservice/api/model/response/MenuResponse.java +++ b/src/main/java/com/utility/utilitycommonservice/api/model/response/MenuResponse.java @@ -1,5 +1,6 @@ package com.utility.utilitycommonservice.api.model.response; +import com.utility.utilitycommonservice.api.model.KeyValueParameter; import com.utility.utilitycommonservice.domain.model.clientbe.MenuModel; import lombok.Builder; import lombok.Data; @@ -9,5 +10,5 @@ import java.util.List; @Data @Builder public class MenuResponse { - private List menuList; + private List> menuList; } diff --git a/src/main/java/com/utility/utilitycommonservice/common/base/controller/BaseController.java b/src/main/java/com/utility/utilitycommonservice/common/base/controller/BaseController.java index 81ca2b20e2f2558008557c4deadd7893f33ed546..b505352ff89ddf3625be1d776da9508a6bd19c8e 100644 --- a/src/main/java/com/utility/utilitycommonservice/common/base/controller/BaseController.java +++ b/src/main/java/com/utility/utilitycommonservice/common/base/controller/BaseController.java @@ -22,4 +22,8 @@ public abstract class BaseController { return MsgResponseBuilder.build(true,messageBox,data); } + protected MessageResponse responseSuccess() { + return MsgResponseBuilder.build(true); + } + } diff --git a/src/main/java/com/utility/utilitycommonservice/common/base/response/MessageResponse.java b/src/main/java/com/utility/utilitycommonservice/common/base/response/MessageResponse.java index 5b3d4f82e43464ffa8d6b01be8766e85fc196343..52141d719708eb002286d292e8c34274dddc2109 100644 --- a/src/main/java/com/utility/utilitycommonservice/common/base/response/MessageResponse.java +++ b/src/main/java/com/utility/utilitycommonservice/common/base/response/MessageResponse.java @@ -39,4 +39,9 @@ public class MessageResponse { this.executionDate = ZonedDateTime.now().format(DateTimeFormatter.ISO_LOCAL_DATE); } + public MessageResponse(boolean success){ + this.success = success; + this.executionDate = ZonedDateTime.now().format(DateTimeFormatter.ISO_LOCAL_DATE); + } + } diff --git a/src/main/java/com/utility/utilitycommonservice/common/base/response/builder/MsgResponseBuilder.java b/src/main/java/com/utility/utilitycommonservice/common/base/response/builder/MsgResponseBuilder.java index 426c393f0fab4009dd7ed1abeea9093a3035241d..ac433ba274a6146147c988c21a0ffd8765571a38 100644 --- a/src/main/java/com/utility/utilitycommonservice/common/base/response/builder/MsgResponseBuilder.java +++ b/src/main/java/com/utility/utilitycommonservice/common/base/response/builder/MsgResponseBuilder.java @@ -25,4 +25,8 @@ public class MsgResponseBuilder { return new MessageResponse<>(success,data,messageBox); } + public static MessageResponse build(boolean success) { + return new MessageResponse<>(success); + } + } diff --git a/src/main/java/com/utility/utilitycommonservice/common/interceptor/ResponseErrorHandler.java b/src/main/java/com/utility/utilitycommonservice/common/interceptor/ResponseErrorHandler.java index 12b439dfbeafe127e07bd6acf254776cf5b5f14a..c8471c04e665e64950e47f8e7d56e98a8a7df85a 100644 --- a/src/main/java/com/utility/utilitycommonservice/common/interceptor/ResponseErrorHandler.java +++ b/src/main/java/com/utility/utilitycommonservice/common/interceptor/ResponseErrorHandler.java @@ -13,12 +13,11 @@ import org.springframework.web.bind.annotation.ExceptionHandler; import org.springframework.web.bind.annotation.ResponseStatus; import org.springframework.web.bind.annotation.RestControllerAdvice; import org.springframework.web.client.HttpClientErrorException; -import org.springframework.web.method.HandlerMethod; import java.util.ArrayList; import java.util.List; -import static com.utility.utilitycommonservice.common.constant.BitbucketServiceConstant.*; +import static com.utility.utilitycommonservice.domain.constant.BitbucketServiceConstant.*; @RestControllerAdvice @RequiredArgsConstructor diff --git a/src/main/java/com/utility/utilitycommonservice/common/redis/RedisUtil.java b/src/main/java/com/utility/utilitycommonservice/common/redis/RedisUtil.java index f92f3adcd1bf18fbb182342aa74358e4fc151ee1..9363091e70d12c34c0843e9bfe02901677403bd6 100644 --- a/src/main/java/com/utility/utilitycommonservice/common/redis/RedisUtil.java +++ b/src/main/java/com/utility/utilitycommonservice/common/redis/RedisUtil.java @@ -21,6 +21,10 @@ public class RedisUtil { valueOperations.set(key,value,expirationTime,expirationTimeUnit); } + public void putValue(String key, Object value) { + valueOperations.set(key,value); + } + public Object getValue(String key) { return valueOperations.get(key); } diff --git a/src/main/java/com/utility/utilitycommonservice/common/service/SessionService.java b/src/main/java/com/utility/utilitycommonservice/common/service/SessionService.java index b77d9b8f9c91d201d47bec7af8c4f0ba1943a168..98d59ebe64c1ebc381ead3491bb304eba063dc43 100644 --- a/src/main/java/com/utility/utilitycommonservice/common/service/SessionService.java +++ b/src/main/java/com/utility/utilitycommonservice/common/service/SessionService.java @@ -6,6 +6,8 @@ public interface SessionService { T getSession(String sessionKey, Class returnType, boolean... isNullable); + void setSession(String sessionKey, T object); + void removeSession(String sessionKey); } diff --git a/src/main/java/com/utility/utilitycommonservice/common/service/impl/SessionServiceImpl.java b/src/main/java/com/utility/utilitycommonservice/common/service/impl/SessionServiceImpl.java index 163705597882355a90da80911aa41ba6fd6b26bd..63f3085c08a730f8c35e5090adf7328cc7ade458 100644 --- a/src/main/java/com/utility/utilitycommonservice/common/service/impl/SessionServiceImpl.java +++ b/src/main/java/com/utility/utilitycommonservice/common/service/impl/SessionServiceImpl.java @@ -33,6 +33,12 @@ public class SessionServiceImpl implements SessionService { redisUtil.putValue(key,object,Integer.parseInt(expireTime), TimeUnit.MINUTES); } + @Override + public void setSession(String sessionKey, T object) { + String key = StringUtils.isEmpty(sessionKey) ? requestHeaderScope.getRequestHeader().getSessionId() : sessionKey; + redisUtil.putValue(key,object); + } + @Override public T getSession(String sessionKey, Class returnType, boolean... isNullable) { Object sessionObject = null; diff --git a/src/main/java/com/utility/utilitycommonservice/common/util/BitbucketBasicAuthGenerator.java b/src/main/java/com/utility/utilitycommonservice/common/util/BitbucketBasicAuthGenerator.java index 074ed0d5ade562e76b7d6428297c7c1488d2dfd6..330a055c30c23a9c8a3c22de832140d8d405582b 100644 --- a/src/main/java/com/utility/utilitycommonservice/common/util/BitbucketBasicAuthGenerator.java +++ b/src/main/java/com/utility/utilitycommonservice/common/util/BitbucketBasicAuthGenerator.java @@ -1,6 +1,6 @@ package com.utility.utilitycommonservice.common.util; -import com.utility.utilitycommonservice.common.properties.BitbucketProperties; +import com.utility.utilitycommonservice.domain.properties.BitbucketProperties; import lombok.RequiredArgsConstructor; import org.springframework.stereotype.Component; diff --git a/src/main/java/com/utility/utilitycommonservice/dao/entity/PushNotificationLog.java b/src/main/java/com/utility/utilitycommonservice/dao/entity/PushNotificationLog.java new file mode 100644 index 0000000000000000000000000000000000000000..d01a53f45bba440df8b4b4d457127bee5b648a5f --- /dev/null +++ b/src/main/java/com/utility/utilitycommonservice/dao/entity/PushNotificationLog.java @@ -0,0 +1,51 @@ +package com.utility.utilitycommonservice.dao.entity; + +import com.utility.utilitycommonservice.domain.model.notification.Notification; +import com.utility.utilitycommonservice.domain.model.notification.attributes.LogTypeAttribute; +import com.utility.utilitycommonservice.domain.model.notification.enums.LogType; +import jakarta.persistence.Column; +import jakarta.persistence.Convert; +import jakarta.persistence.Entity; +import jakarta.persistence.Id; +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; + +import java.time.LocalDate; +import java.util.ArrayList; +import java.util.List; + +@AllArgsConstructor +@NoArgsConstructor +@Data +@Entity +@Builder +public class PushNotificationLog { + + @Id + private String uid; + private String messageId; + private String customerNumber; + private String domainCode; + private Boolean isRead; // false - okunmadı, true - okundu + private Boolean isRemove; // false - sininmedi, true - silindi + private LocalDate createDate; + + @Column(name = "text", columnDefinition = "text") + private String text; + + @Convert(converter = LogTypeAttribute.class) + private LogType logType; + + public static List toNotificationList(List pushNotificationLogs) { + List notifications = new ArrayList<>(); + + pushNotificationLogs.forEach(pushNotificationLog -> { + Notification notification = Notification.toNotification(pushNotificationLog); + notifications.add(notification); + }); + return notifications; + } + +} diff --git a/src/main/java/com/utility/utilitycommonservice/dao/repository/PushNotificationLogRepository.java b/src/main/java/com/utility/utilitycommonservice/dao/repository/PushNotificationLogRepository.java new file mode 100644 index 0000000000000000000000000000000000000000..226cebe01f044305b17caf264112cedd8d3454c8 --- /dev/null +++ b/src/main/java/com/utility/utilitycommonservice/dao/repository/PushNotificationLogRepository.java @@ -0,0 +1,18 @@ +package com.utility.utilitycommonservice.dao.repository; + +import com.utility.utilitycommonservice.dao.entity.PushNotificationLog; +import com.utility.utilitycommonservice.domain.model.notification.enums.LogType; +import org.springframework.data.jpa.repository.JpaRepository; +import org.springframework.stereotype.Repository; + +import java.time.LocalDate; +import java.util.List; +import java.util.Optional; + +@Repository +public interface PushNotificationLogRepository extends JpaRepository { + List findAllByCustomerNumberEqualsIgnoreCaseAndLogTypeAndIsRemoveIsFalseAndCreateDateBetween(String customerNumber, + LogType logType, LocalDate startDate, + LocalDate endDate); + Optional findAllByUidAndIsRemoveIsFalse(String uuid); +} diff --git a/src/main/java/com/utility/utilitycommonservice/domain/assembler/CrudAssembler.java b/src/main/java/com/utility/utilitycommonservice/domain/assembler/CrudAssembler.java new file mode 100644 index 0000000000000000000000000000000000000000..d6024e1831d0947145a425d0b7a573e7ba88a783 --- /dev/null +++ b/src/main/java/com/utility/utilitycommonservice/domain/assembler/CrudAssembler.java @@ -0,0 +1,69 @@ +package com.utility.utilitycommonservice.domain.assembler; + +import com.utility.utilitycommonservice.common.helper.RequestScopeHelper; +import com.utility.utilitycommonservice.dao.entity.PushNotificationLog; +import com.utility.utilitycommonservice.dao.repository.PushNotificationLogRepository; +import com.utility.utilitycommonservice.domain.model.notification.Notification; +import com.utility.utilitycommonservice.domain.model.notification.enums.CrudType; +import com.utility.utilitycommonservice.domain.model.notification.enums.LogType; +import com.utility.utilitycommonservice.domain.model.notification.input.CrudNotificationInput; +import lombok.RequiredArgsConstructor; +import org.springframework.stereotype.Component; + +import java.time.LocalDate; +import java.util.List; +import java.util.Objects; +import java.util.Optional; + +@Component +@RequiredArgsConstructor +public class CrudAssembler { + + private final PushNotificationLogRepository pushNotificationLogRepository; + + public List assemble(CrudNotificationInput input) { + if (Objects.requireNonNull(input.getCrudType()) == CrudType.LIST) { + return getNotifications(); + } else if (Objects.requireNonNull(input.getCrudType()) == CrudType.READ) { + updateReadStatus(input.getUid()); + } else if (Objects.requireNonNull(input.getCrudType()) == CrudType.REMOVE) { + updateRemoveStatus(input.getUid()); + } + return List.of(); + } + + private void updateReadStatus(String uid) { + + Optional optPushNotificationLog = pushNotificationLogRepository.findAllByUidAndIsRemoveIsFalse(uid); + if (optPushNotificationLog.isPresent()) { + PushNotificationLog pushNotificationLog = optPushNotificationLog.get(); + if (Boolean.FALSE.equals(pushNotificationLog.getIsRead())) { + pushNotificationLog.setIsRead(Boolean.TRUE); + } else { + pushNotificationLog.setIsRead(Boolean.FALSE); + } + pushNotificationLogRepository.saveAndFlush(pushNotificationLog); + } + } + + private void updateRemoveStatus(String uid) { + Optional optPushNotificationLog = pushNotificationLogRepository.findAllByUidAndIsRemoveIsFalse(uid); + if (optPushNotificationLog.isPresent()) { + PushNotificationLog pushNotificationLog = optPushNotificationLog.get(); + pushNotificationLog.setIsRemove(Boolean.TRUE); + pushNotificationLogRepository.saveAndFlush(pushNotificationLog); + } + } + + private List getNotifications() { + + List pushNotificationLogs = pushNotificationLogRepository.findAllByCustomerNumberEqualsIgnoreCaseAndLogTypeAndIsRemoveIsFalseAndCreateDateBetween( + RequestScopeHelper.getCustomerNumber(), + LogType.INFO, + LocalDate.now().minusMonths(2), + LocalDate.now()); + + return PushNotificationLog.toNotificationList(pushNotificationLogs); + } + +} diff --git a/src/main/java/com/utility/utilitycommonservice/common/constant/BitbucketServiceConstant.java b/src/main/java/com/utility/utilitycommonservice/domain/constant/BitbucketServiceConstant.java similarity index 88% rename from src/main/java/com/utility/utilitycommonservice/common/constant/BitbucketServiceConstant.java rename to src/main/java/com/utility/utilitycommonservice/domain/constant/BitbucketServiceConstant.java index 4af317e4954283ae73ef37137d62abd45d20a0aa..c8df47db734e69feb191cd2935406c473bf48aa2 100644 --- a/src/main/java/com/utility/utilitycommonservice/common/constant/BitbucketServiceConstant.java +++ b/src/main/java/com/utility/utilitycommonservice/domain/constant/BitbucketServiceConstant.java @@ -1,4 +1,4 @@ -package com.utility.utilitycommonservice.common.constant; +package com.utility.utilitycommonservice.domain.constant; public class BitbucketServiceConstant { diff --git a/src/main/java/com/utility/utilitycommonservice/common/constant/LocalizeConstant.java b/src/main/java/com/utility/utilitycommonservice/domain/constant/LocalizeConstant.java similarity index 71% rename from src/main/java/com/utility/utilitycommonservice/common/constant/LocalizeConstant.java rename to src/main/java/com/utility/utilitycommonservice/domain/constant/LocalizeConstant.java index b9b097779e033afdb587884a248a56b34614265b..a3dddfe4a5f59c9228ec7d26aba3b7ac1e2c6144 100644 --- a/src/main/java/com/utility/utilitycommonservice/common/constant/LocalizeConstant.java +++ b/src/main/java/com/utility/utilitycommonservice/domain/constant/LocalizeConstant.java @@ -1,4 +1,4 @@ -package com.utility.utilitycommonservice.common.constant; +package com.utility.utilitycommonservice.domain.constant; public class LocalizeConstant { diff --git a/src/main/java/com/utility/utilitycommonservice/domain/model/bitbucket/output/CreateBranchOutput.java b/src/main/java/com/utility/utilitycommonservice/domain/model/bitbucket/output/CreateBranchOutput.java index 66e9fbf617621d77a0a961fd6832f8ed062df5ff..559fa5b8627696e9d5a4932a7d07656e44660b78 100644 --- a/src/main/java/com/utility/utilitycommonservice/domain/model/bitbucket/output/CreateBranchOutput.java +++ b/src/main/java/com/utility/utilitycommonservice/domain/model/bitbucket/output/CreateBranchOutput.java @@ -1,7 +1,7 @@ package com.utility.utilitycommonservice.domain.model.bitbucket.output; import com.utility.utilitycommonservice.integration.service.model.Target; -import com.utility.utilitycommonservice.integration.service.model.response.CreateBranchClientResponse; +import com.utility.utilitycommonservice.integration.service.model.response.bitbucket.CreateBranchClientResponse; import lombok.Builder; import lombok.Data; diff --git a/src/main/java/com/utility/utilitycommonservice/domain/model/clientbe/output/MenuOutput.java b/src/main/java/com/utility/utilitycommonservice/domain/model/clientbe/output/MenuOutput.java index 786a644da95c6e0e1109a312cb5330089243189c..e97773c6ffe8e9516a00c31ae85cae6b36d07e0f 100644 --- a/src/main/java/com/utility/utilitycommonservice/domain/model/clientbe/output/MenuOutput.java +++ b/src/main/java/com/utility/utilitycommonservice/domain/model/clientbe/output/MenuOutput.java @@ -1,5 +1,6 @@ package com.utility.utilitycommonservice.domain.model.clientbe.output; +import com.utility.utilitycommonservice.api.model.KeyValueParameter; import com.utility.utilitycommonservice.api.model.response.MenuResponse; import com.utility.utilitycommonservice.dao.entity.Menu; import com.utility.utilitycommonservice.domain.model.clientbe.MenuModel; @@ -17,7 +18,7 @@ import java.util.List; @NoArgsConstructor public class MenuOutput { - private List menuList; + private List> menuList; public MenuResponse toResponse() { return MenuResponse.builder() @@ -27,11 +28,11 @@ public class MenuOutput { public static MenuOutput toOutput(List menuList) { - List menuModels = new ArrayList<>(); + List> menuModels = new ArrayList<>(); menuList.forEach(menu -> { - MenuModel menuModel = MenuModel.builder() - .name(menu.getName()) - .navigationCode(menu.getNavigationCode()) + KeyValueParameter menuModel = KeyValueParameter.builder() + .key(menu.getName()) + .value(menu.getNavigationCode()) .build(); menuModels.add(menuModel); }); diff --git a/src/main/java/com/utility/utilitycommonservice/domain/model/localize/LocalizeInitModel.java b/src/main/java/com/utility/utilitycommonservice/domain/model/localize/LocalizeInitModel.java index 49fa3721fd56e5f32f7ea58fe64bfc2ff54880e2..c9a9b0b0d5817878798fc15e6c3b940562e5a0f5 100644 --- a/src/main/java/com/utility/utilitycommonservice/domain/model/localize/LocalizeInitModel.java +++ b/src/main/java/com/utility/utilitycommonservice/domain/model/localize/LocalizeInitModel.java @@ -1,5 +1,6 @@ package com.utility.utilitycommonservice.domain.model.localize; +import com.utility.utilitycommonservice.api.model.KeyValueParameter; import com.utility.utilitycommonservice.common.base.model.BaseModel; import lombok.Builder; import lombok.Data; diff --git a/src/main/java/com/utility/utilitycommonservice/domain/model/notification/Deeplink.java b/src/main/java/com/utility/utilitycommonservice/domain/model/notification/Deeplink.java new file mode 100644 index 0000000000000000000000000000000000000000..a24dfc2045ef8b7314514416c81bf01a6ec68e76 --- /dev/null +++ b/src/main/java/com/utility/utilitycommonservice/domain/model/notification/Deeplink.java @@ -0,0 +1,17 @@ +package com.utility.utilitycommonservice.domain.model.notification; + +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; + +import java.util.List; + +@Data +@Builder +@AllArgsConstructor +@NoArgsConstructor +public class Deeplink { + private List parameters; // ilerde parametre gerekirse + private String navigationCode; // code için (web ve mobile ortak çalışacak) +} diff --git a/src/main/java/com/utility/utilitycommonservice/domain/model/notification/InfoModel.java b/src/main/java/com/utility/utilitycommonservice/domain/model/notification/InfoModel.java new file mode 100644 index 0000000000000000000000000000000000000000..c4d610f55690699fb13e4081b942c026f72077af --- /dev/null +++ b/src/main/java/com/utility/utilitycommonservice/domain/model/notification/InfoModel.java @@ -0,0 +1,18 @@ +package com.utility.utilitycommonservice.domain.model.notification; + +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; + +@Data +@Builder +@AllArgsConstructor +@NoArgsConstructor +public class InfoModel { + + private String title; + private String text; + private String imageUrl; + private Deeplink deeplink; +} diff --git a/src/main/java/com/utility/utilitycommonservice/domain/model/notification/Notification.java b/src/main/java/com/utility/utilitycommonservice/domain/model/notification/Notification.java new file mode 100644 index 0000000000000000000000000000000000000000..d35ada10b9aabdcaa43b2cb47c2adbbb79758a12 --- /dev/null +++ b/src/main/java/com/utility/utilitycommonservice/domain/model/notification/Notification.java @@ -0,0 +1,50 @@ +package com.utility.utilitycommonservice.domain.model.notification; + +import com.fasterxml.jackson.core.JsonProcessingException; +import com.fasterxml.jackson.databind.ObjectMapper; +import com.utility.utilitycommonservice.dao.entity.PushNotificationLog; +import lombok.Builder; +import lombok.Data; +import lombok.extern.slf4j.Slf4j; + +import java.util.Objects; + +@Data +@Builder +@Slf4j +public class Notification { + + private String uid; + private String title; + private String body; + private String imageUrl; + private String url; + private String topic; + private Boolean isRead; + + public static Notification toNotification(PushNotificationLog pushNotificationLog) { + ObjectMapper mapper = new ObjectMapper(); + InfoModel infoModel = null; + + try { + infoModel = mapper.readValue(pushNotificationLog.getText(), InfoModel.class); + } catch (JsonProcessingException e) { + log.error("a process error occurrence: {}", e.getMessage()); + } + + if (!Objects.isNull(infoModel)) { + return Notification.builder() + .uid(pushNotificationLog.getUid()) + .title(infoModel.getTitle()) + .body(infoModel.getText()) + .imageUrl(infoModel.getImageUrl()) + .url(infoModel.getDeeplink().getNavigationCode()) + .topic(pushNotificationLog.getDomainCode()) + .isRead(pushNotificationLog.getIsRead()) + .build(); + } + return Notification.builder() + .build(); + } + +} diff --git a/src/main/java/com/utility/utilitycommonservice/domain/model/notification/PushNotificationBody.java b/src/main/java/com/utility/utilitycommonservice/domain/model/notification/PushNotificationBody.java new file mode 100644 index 0000000000000000000000000000000000000000..a43a198a221c6b0502a33dfe4e654cfbe2ceb4e0 --- /dev/null +++ b/src/main/java/com/utility/utilitycommonservice/domain/model/notification/PushNotificationBody.java @@ -0,0 +1,16 @@ +package com.utility.utilitycommonservice.domain.model.notification; + +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; + +@Data +@Builder +@AllArgsConstructor +@NoArgsConstructor +public class PushNotificationBody { + private String text; + private Boolean isRead; + +} diff --git a/src/main/java/com/utility/utilitycommonservice/domain/model/notification/attributes/LogTypeAttribute.java b/src/main/java/com/utility/utilitycommonservice/domain/model/notification/attributes/LogTypeAttribute.java new file mode 100644 index 0000000000000000000000000000000000000000..4800f5640fe9f5327360f7e55f53881f86e10fa1 --- /dev/null +++ b/src/main/java/com/utility/utilitycommonservice/domain/model/notification/attributes/LogTypeAttribute.java @@ -0,0 +1,19 @@ +package com.utility.utilitycommonservice.domain.model.notification.attributes; + +import com.utility.utilitycommonservice.domain.model.notification.enums.LogType; +import jakarta.persistence.AttributeConverter; +import jakarta.persistence.Converter; + +@Converter(autoApply = true) +public class LogTypeAttribute implements AttributeConverter { + + @Override + public String convertToDatabaseColumn(LogType logType) { + return LogType.fromCode(logType); + } + + @Override + public LogType convertToEntityAttribute(String s) { + return LogType.fromType(s); + } +} diff --git a/src/main/java/com/utility/utilitycommonservice/domain/model/notification/enums/CrudType.java b/src/main/java/com/utility/utilitycommonservice/domain/model/notification/enums/CrudType.java new file mode 100644 index 0000000000000000000000000000000000000000..1124fc1f6ed881d93ef33dffb301cba75820c0df --- /dev/null +++ b/src/main/java/com/utility/utilitycommonservice/domain/model/notification/enums/CrudType.java @@ -0,0 +1,5 @@ +package com.utility.utilitycommonservice.domain.model.notification.enums; + +public enum CrudType { + READ,REMOVE,LIST +} diff --git a/src/main/java/com/utility/utilitycommonservice/domain/model/notification/enums/LogType.java b/src/main/java/com/utility/utilitycommonservice/domain/model/notification/enums/LogType.java new file mode 100644 index 0000000000000000000000000000000000000000..b2c04db2772b4268f7354076892f588488cba5e6 --- /dev/null +++ b/src/main/java/com/utility/utilitycommonservice/domain/model/notification/enums/LogType.java @@ -0,0 +1,34 @@ +package com.utility.utilitycommonservice.domain.model.notification.enums; + +public enum LogType { + INFO,ERROR,NONE; + + public static String fromCode(LogType logType) { + switch (logType) { + case INFO -> { + return "Info"; + } + case ERROR -> { + return "Error"; + } + default -> { + return ""; + } + } + } + + public static LogType fromType(String logType) { + switch (logType) { + case "Info" -> { + return INFO; + } + case "Error" -> { + return ERROR; + } + default -> { + return NONE; + } + } + } + +} diff --git a/src/main/java/com/utility/utilitycommonservice/domain/model/notification/input/CrudNotificationInput.java b/src/main/java/com/utility/utilitycommonservice/domain/model/notification/input/CrudNotificationInput.java new file mode 100644 index 0000000000000000000000000000000000000000..ccf16c13db67deb31e360ab974f630779c5b558a --- /dev/null +++ b/src/main/java/com/utility/utilitycommonservice/domain/model/notification/input/CrudNotificationInput.java @@ -0,0 +1,14 @@ +package com.utility.utilitycommonservice.domain.model.notification.input; + +import com.utility.utilitycommonservice.domain.model.notification.enums.CrudType; +import lombok.Builder; +import lombok.Data; + +@Data +@Builder +public class CrudNotificationInput { + + private CrudType crudType; + private String uid; + +} diff --git a/src/main/java/com/utility/utilitycommonservice/domain/model/notification/input/PushNotificationByDomainInput.java b/src/main/java/com/utility/utilitycommonservice/domain/model/notification/input/PushNotificationByDomainInput.java new file mode 100644 index 0000000000000000000000000000000000000000..9f235944c812b3f615c76960805cb618375ffb3c --- /dev/null +++ b/src/main/java/com/utility/utilitycommonservice/domain/model/notification/input/PushNotificationByDomainInput.java @@ -0,0 +1,13 @@ +package com.utility.utilitycommonservice.domain.model.notification.input; + +import com.utility.utilitycommonservice.domain.model.notification.InfoModel; +import lombok.Builder; +import lombok.Data; + +@Data +@Builder +public class PushNotificationByDomainInput { + private InfoModel infoModel; + private String domainCode; // campaign, ai vs. + +} diff --git a/src/main/java/com/utility/utilitycommonservice/domain/model/notification/output/CrudNotificationOutput.java b/src/main/java/com/utility/utilitycommonservice/domain/model/notification/output/CrudNotificationOutput.java new file mode 100644 index 0000000000000000000000000000000000000000..691e8f3bc8172af62b20c9783d5e7ed7ccdad619 --- /dev/null +++ b/src/main/java/com/utility/utilitycommonservice/domain/model/notification/output/CrudNotificationOutput.java @@ -0,0 +1,22 @@ +package com.utility.utilitycommonservice.domain.model.notification.output; + +import com.utility.utilitycommonservice.api.model.response.CrudNotificationResponse; +import com.utility.utilitycommonservice.domain.model.notification.Notification; +import lombok.Builder; +import lombok.Data; + +import java.util.List; + +@Data +@Builder +public class CrudNotificationOutput { + + private List notifications; + + public CrudNotificationResponse toResponse() { + return CrudNotificationResponse.builder() + .notifications(notifications) + .build(); + } + +} diff --git a/src/main/java/com/utility/utilitycommonservice/common/properties/BitbucketProperties.java b/src/main/java/com/utility/utilitycommonservice/domain/properties/BitbucketProperties.java similarity index 91% rename from src/main/java/com/utility/utilitycommonservice/common/properties/BitbucketProperties.java rename to src/main/java/com/utility/utilitycommonservice/domain/properties/BitbucketProperties.java index ece179ad0534c580484b4d08608f48eae1606979..ef38eaa16c0abfea967660f28bca95b6d9757e60 100644 --- a/src/main/java/com/utility/utilitycommonservice/common/properties/BitbucketProperties.java +++ b/src/main/java/com/utility/utilitycommonservice/domain/properties/BitbucketProperties.java @@ -1,4 +1,4 @@ -package com.utility.utilitycommonservice.common.properties; +package com.utility.utilitycommonservice.domain.properties; import lombok.Data; import org.springframework.boot.context.properties.ConfigurationProperties; diff --git a/src/main/java/com/utility/utilitycommonservice/domain/service/clientbe/notification/PushService.java b/src/main/java/com/utility/utilitycommonservice/domain/service/clientbe/notification/PushService.java new file mode 100644 index 0000000000000000000000000000000000000000..fe17dd1cb5e2967e7191ca131889dfe01afde0f4 --- /dev/null +++ b/src/main/java/com/utility/utilitycommonservice/domain/service/clientbe/notification/PushService.java @@ -0,0 +1,14 @@ +package com.utility.utilitycommonservice.domain.service.clientbe.notification; + +import com.utility.utilitycommonservice.domain.model.notification.input.CrudNotificationInput; +import com.utility.utilitycommonservice.domain.model.notification.input.PushNotificationByDomainInput; +import com.utility.utilitycommonservice.domain.model.notification.output.CrudNotificationOutput; + +public interface PushService { + void pushNotificationByDomain(PushNotificationByDomainInput input); + + // okundu-silindi-listele + CrudNotificationOutput crudNotification(CrudNotificationInput input); + + +} diff --git a/src/main/java/com/utility/utilitycommonservice/domain/service/clientbe/notification/notificationImpl/PushServiceImpl.java b/src/main/java/com/utility/utilitycommonservice/domain/service/clientbe/notification/notificationImpl/PushServiceImpl.java new file mode 100644 index 0000000000000000000000000000000000000000..84a6b0fe97768bef11e22f19959a0ee9b1691d0a --- /dev/null +++ b/src/main/java/com/utility/utilitycommonservice/domain/service/clientbe/notification/notificationImpl/PushServiceImpl.java @@ -0,0 +1,89 @@ +package com.utility.utilitycommonservice.domain.service.clientbe.notification.notificationImpl; + +import com.fasterxml.jackson.core.JsonProcessingException; +import com.fasterxml.jackson.databind.ObjectMapper; +import com.utility.utilitycommonservice.common.helper.RequestScopeHelper; +import com.utility.utilitycommonservice.dao.entity.PushNotificationLog; +import com.utility.utilitycommonservice.dao.repository.PushNotificationLogRepository; +import com.utility.utilitycommonservice.domain.assembler.CrudAssembler; +import com.utility.utilitycommonservice.domain.model.notification.PushNotificationBody; +import com.utility.utilitycommonservice.domain.model.notification.enums.LogType; +import com.utility.utilitycommonservice.domain.model.notification.input.CrudNotificationInput; +import com.utility.utilitycommonservice.domain.model.notification.input.PushNotificationByDomainInput; +import com.utility.utilitycommonservice.domain.model.notification.output.CrudNotificationOutput; +import com.utility.utilitycommonservice.domain.service.clientbe.notification.PushService; +import com.utility.utilitycommonservice.integration.service.model.request.firebase.SendToTopicClientRequest; +import com.utility.utilitycommonservice.integration.service.service.firebase.PushClientService; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Service; + +import java.time.LocalDate; +import java.util.UUID; + +@Service +@RequiredArgsConstructor +@Slf4j +public class PushServiceImpl implements PushService { + + private final PushClientService clientService; + private final PushNotificationLogRepository pushNotificationLogRepository; + private final CrudAssembler crudAssembler; + private final ObjectMapper mapper = new ObjectMapper(); + + @Override + public void pushNotificationByDomain(PushNotificationByDomainInput input) { + + try { + var pnBody = PushNotificationBody.builder() + .text(input.getInfoModel().getText()) + .isRead(false) + .build(); + String jsonBody = mapper.writeValueAsString(pnBody); + var clientResponse = clientService.sendToTopic(SendToTopicClientRequest.builder() + .title(input.getInfoModel().getTitle()) + .body(jsonBody) + .imageUrl(input.getInfoModel().getImageUrl()) + .url(input.getInfoModel().getDeeplink().getNavigationCode()) + .topic(input.getDomainCode()) + .build()); + saveLog(input, LogType.INFO, clientResponse.getMessageId()); + + } catch (Exception e) { + log.error("An error occurrence: {}", e.getMessage()); + saveLog(input, LogType.ERROR, null); + } + + } + + @Override + public CrudNotificationOutput crudNotification(CrudNotificationInput input) { + var notifications = crudAssembler.assemble(input); + return CrudNotificationOutput.builder() + .notifications(notifications) + .build(); + } + + private void saveLog(PushNotificationByDomainInput input, LogType logType, String messageId) { + + try { + String jsonBody = mapper.writeValueAsString(input.getInfoModel()); + PushNotificationLog pushNotificationLog = PushNotificationLog.builder() + .uid(UUID.randomUUID().toString()) + .messageId(messageId) + .logType(logType) + .text(jsonBody) + .domainCode(input.getDomainCode()) + .isRead(false) + .isRemove(false) + .customerNumber(RequestScopeHelper.getCustomerNumber()) + .createDate(LocalDate.now()) + .build(); + pushNotificationLogRepository.save(pushNotificationLog); + + }catch (JsonProcessingException e) { + log.error("a process error occurrence: {}", e.getMessage()); + } + } + +} diff --git a/src/main/java/com/utility/utilitycommonservice/domain/service/localize/impl/LocalizeServiceImpl.java b/src/main/java/com/utility/utilitycommonservice/domain/service/localize/impl/LocalizeServiceImpl.java index 84dca560ec28698650155680745d8a5efbdaed9a..76ed7347e57bae1d29e7b6b0f86fc41030761103 100644 --- a/src/main/java/com/utility/utilitycommonservice/domain/service/localize/impl/LocalizeServiceImpl.java +++ b/src/main/java/com/utility/utilitycommonservice/domain/service/localize/impl/LocalizeServiceImpl.java @@ -2,7 +2,7 @@ package com.utility.utilitycommonservice.domain.service.localize.impl; import com.utility.utilitycommonservice.common.helper.RequestScopeHelper; import com.utility.utilitycommonservice.common.service.SessionService; -import com.utility.utilitycommonservice.domain.model.localize.KeyValueParameter; +import com.utility.utilitycommonservice.api.model.KeyValueParameter; import com.utility.utilitycommonservice.domain.model.localize.LocalizeInitModel; import com.utility.utilitycommonservice.domain.model.localize.LocalizeInitSession; import com.utility.utilitycommonservice.domain.model.localize.input.AddLocalizeInput; @@ -14,13 +14,11 @@ import lombok.RequiredArgsConstructor; import org.springframework.beans.factory.annotation.Value; import org.springframework.stereotype.Service; -import java.io.FileInputStream; -import java.io.IOException; -import java.io.InputStreamReader; +import java.io.*; import java.nio.charset.StandardCharsets; import java.util.*; -import static com.utility.utilitycommonservice.common.constant.LocalizeConstant.LOCALIZE_INIT_SESSION; +import static com.utility.utilitycommonservice.domain.constant.LocalizeConstant.LOCALIZE_INIT_SESSION; @Service @RequiredArgsConstructor @@ -61,7 +59,7 @@ public class LocalizeServiceImpl implements LocalizeService { .tr(tr).en(en).build()) .build(); - sessionService.setSession(LOCALIZE_INIT_SESSION, "1000", session); //todo: expire olmamamlı + sessionService.setSession(LOCALIZE_INIT_SESSION, session); } @@ -77,19 +75,11 @@ public class LocalizeServiceImpl implements LocalizeService { if (RequestScopeHelper.getLanguage().equals("tr")) { List> parameters = initModel.getTr(); - Optional> optional = parameters.stream() - .filter(p -> p.getKey().equals(input.getKey())).findFirst(); - if (optional.isPresent()) { - keyValueParameter = optional.get(); - } + keyValueParameter = getKeyValueParameter(parameters, input.getKey()); } else if (RequestScopeHelper.getLanguage().equals("en")) { List> parameters = initModel.getEn(); - Optional> optional = parameters.stream() - .filter(p -> p.getKey().equals(input.getKey())).findFirst(); - if (optional.isPresent()) { - keyValueParameter = optional.get(); - } + keyValueParameter = getKeyValueParameter(parameters, input.getKey()); } return OutputByKey.builder() @@ -100,7 +90,27 @@ public class LocalizeServiceImpl implements LocalizeService { @Override public void addLocalize(AddLocalizeInput input) throws IOException { + Properties props = loadProperties(input.getLanguage()); + props.setProperty(input.getKey(), input.getValue()); + try (OutputStreamWriter writer = new OutputStreamWriter( + new FileOutputStream(basePath + input.getLanguage() + ".properties"), + StandardCharsets.UTF_8)) { + props.store(writer, "Updated by MessageService"); + } + } + + private KeyValueParameter getKeyValueParameter(List> parameters, + String key) { + + KeyValueParameter keyValueParameter = null; + + Optional> optional = parameters.stream() + .filter(p -> p.getKey().equals(key)).findFirst(); + if (optional.isPresent()) { + keyValueParameter = optional.get(); + } + return keyValueParameter; } private Properties loadProperties(String lang) throws IOException { diff --git a/src/main/java/com/utility/utilitycommonservice/integration/config/firebase/FirebaseConfig.java b/src/main/java/com/utility/utilitycommonservice/integration/config/firebase/FirebaseConfig.java new file mode 100644 index 0000000000000000000000000000000000000000..1b94729154e7af17e5a5c735ca3a699d0cdf1b37 --- /dev/null +++ b/src/main/java/com/utility/utilitycommonservice/integration/config/firebase/FirebaseConfig.java @@ -0,0 +1,45 @@ +package com.utility.utilitycommonservice.integration.config.firebase; + +import com.google.auth.oauth2.GoogleCredentials; +import com.google.firebase.FirebaseApp; +import com.google.firebase.FirebaseOptions; +import io.micrometer.common.util.StringUtils; +import jakarta.annotation.PostConstruct; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.stereotype.Component; + +import java.io.ByteArrayInputStream; +import java.io.FileInputStream; +import java.io.IOException; +import java.util.Base64; + +@Component +public class FirebaseConfig { + + @Value("${push.firebase.credentials.credentials-base64}") + private String credentialsBase64; + + @PostConstruct + public void init() throws IOException { + FirebaseOptions options = FirebaseOptions.builder() + .setCredentials(resolveCredentials()) + .build(); + + if (FirebaseApp.getApps().isEmpty()) { + FirebaseApp.initializeApp(options); + } + } + + private GoogleCredentials resolveCredentials() throws IOException { + if (StringUtils.isNotBlank(credentialsBase64)) { + byte[] json = Base64.getDecoder().decode(credentialsBase64); + return GoogleCredentials.fromStream(new ByteArrayInputStream(json)); + } + throw new IllegalStateException( + "Firebase credentials not provided. " + + "Provide firebase.credentials-base64 or firebase.credentials-json, " + + "or set client-email and private-key." + ); + } + +} diff --git a/src/main/java/com/utility/utilitycommonservice/integration/service/model/request/firebase/SendToTokenClientRequest.java b/src/main/java/com/utility/utilitycommonservice/integration/service/model/request/firebase/SendToTokenClientRequest.java new file mode 100644 index 0000000000000000000000000000000000000000..d7cb211bdd7c79cb47b843d11865036d6bd5cf1d --- /dev/null +++ b/src/main/java/com/utility/utilitycommonservice/integration/service/model/request/firebase/SendToTokenClientRequest.java @@ -0,0 +1,16 @@ +package com.utility.utilitycommonservice.integration.service.model.request.firebase; + +import lombok.Builder; +import lombok.Data; + +@Data +@Builder +public class SendToTokenClientRequest { + + private String token; + private String title; + private String body; + private String imageUrl; + private String url; + +} diff --git a/src/main/java/com/utility/utilitycommonservice/integration/service/model/request/firebase/SendToTopicClientRequest.java b/src/main/java/com/utility/utilitycommonservice/integration/service/model/request/firebase/SendToTopicClientRequest.java new file mode 100644 index 0000000000000000000000000000000000000000..c039e367619c9b2fef2963311dfca61472a92c07 --- /dev/null +++ b/src/main/java/com/utility/utilitycommonservice/integration/service/model/request/firebase/SendToTopicClientRequest.java @@ -0,0 +1,14 @@ +package com.utility.utilitycommonservice.integration.service.model.request.firebase; + +import lombok.Builder; +import lombok.Data; + +@Data +@Builder +public class SendToTopicClientRequest { + private String topic; + private String title; + private String body; + private String imageUrl; + private String url; +} diff --git a/src/main/java/com/utility/utilitycommonservice/integration/service/model/response/CreateBranchClientResponse.java b/src/main/java/com/utility/utilitycommonservice/integration/service/model/response/bitbucket/CreateBranchClientResponse.java similarity index 97% rename from src/main/java/com/utility/utilitycommonservice/integration/service/model/response/CreateBranchClientResponse.java rename to src/main/java/com/utility/utilitycommonservice/integration/service/model/response/bitbucket/CreateBranchClientResponse.java index 02f103bcf17e794fb2c444ea0fa74c17bcea00d7..3666c49282cd7c07a6e49562f264309fe12b1958 100644 --- a/src/main/java/com/utility/utilitycommonservice/integration/service/model/response/CreateBranchClientResponse.java +++ b/src/main/java/com/utility/utilitycommonservice/integration/service/model/response/bitbucket/CreateBranchClientResponse.java @@ -1,4 +1,4 @@ -package com.utility.utilitycommonservice.integration.service.model.response; +package com.utility.utilitycommonservice.integration.service.model.response.bitbucket; import com.fasterxml.jackson.annotation.JsonIgnoreProperties; import com.utility.utilitycommonservice.domain.model.bitbucket.output.CreateBranchOutput; diff --git a/src/main/java/com/utility/utilitycommonservice/integration/service/model/response/firebase/SendToTokenClientResponse.java b/src/main/java/com/utility/utilitycommonservice/integration/service/model/response/firebase/SendToTokenClientResponse.java new file mode 100644 index 0000000000000000000000000000000000000000..b341e63aab7f00afb9e4341423a99e8403001efa --- /dev/null +++ b/src/main/java/com/utility/utilitycommonservice/integration/service/model/response/firebase/SendToTokenClientResponse.java @@ -0,0 +1,18 @@ +package com.utility.utilitycommonservice.integration.service.model.response.firebase; + +import com.fasterxml.jackson.annotation.JsonIgnoreProperties; +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; + +@Data +@Builder +@AllArgsConstructor +@NoArgsConstructor +@JsonIgnoreProperties(ignoreUnknown = true) +public class SendToTokenClientResponse { + + private String messageId; + +} diff --git a/src/main/java/com/utility/utilitycommonservice/integration/service/model/response/firebase/SendToTopicClientResponse.java b/src/main/java/com/utility/utilitycommonservice/integration/service/model/response/firebase/SendToTopicClientResponse.java new file mode 100644 index 0000000000000000000000000000000000000000..d267ed6be9b36cd0e62580c50f2b8369878b9318 --- /dev/null +++ b/src/main/java/com/utility/utilitycommonservice/integration/service/model/response/firebase/SendToTopicClientResponse.java @@ -0,0 +1,18 @@ +package com.utility.utilitycommonservice.integration.service.model.response.firebase; + +import com.fasterxml.jackson.annotation.JsonIgnoreProperties; +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; + +@Data +@Builder +@AllArgsConstructor +@NoArgsConstructor +@JsonIgnoreProperties(ignoreUnknown = true) +public class SendToTopicClientResponse { + + private String messageId; + +} diff --git a/src/main/java/com/utility/utilitycommonservice/integration/service/service/bitbucket/BitbucketClientService.java b/src/main/java/com/utility/utilitycommonservice/integration/service/service/bitbucket/BitbucketClientService.java index 47e4c21678d9b7ba0f52b6dbc270270e7da6afb1..4e938add8430685e3bd4157ace9a1316f8f475be 100644 --- a/src/main/java/com/utility/utilitycommonservice/integration/service/service/bitbucket/BitbucketClientService.java +++ b/src/main/java/com/utility/utilitycommonservice/integration/service/service/bitbucket/BitbucketClientService.java @@ -1,7 +1,7 @@ package com.utility.utilitycommonservice.integration.service.service.bitbucket; import com.utility.utilitycommonservice.integration.service.model.request.bitbucket.*; -import com.utility.utilitycommonservice.integration.service.model.response.CreateBranchClientResponse; +import com.utility.utilitycommonservice.integration.service.model.response.bitbucket.CreateBranchClientResponse; public interface BitbucketClientService { diff --git a/src/main/java/com/utility/utilitycommonservice/integration/service/service/impl/bitbucket/BitbucketClientServiceImpl.java b/src/main/java/com/utility/utilitycommonservice/integration/service/service/bitbucket/impl/BitbucketClientServiceImpl.java similarity index 98% rename from src/main/java/com/utility/utilitycommonservice/integration/service/service/impl/bitbucket/BitbucketClientServiceImpl.java rename to src/main/java/com/utility/utilitycommonservice/integration/service/service/bitbucket/impl/BitbucketClientServiceImpl.java index f9cd7033c46baf70f50264d53e9b2deacb0ad4b2..87f8824ede3b0ba269fd97d6b48d28fb6055d390 100644 --- a/src/main/java/com/utility/utilitycommonservice/integration/service/service/impl/bitbucket/BitbucketClientServiceImpl.java +++ b/src/main/java/com/utility/utilitycommonservice/integration/service/service/bitbucket/impl/BitbucketClientServiceImpl.java @@ -1,11 +1,11 @@ -package com.utility.utilitycommonservice.integration.service.service.impl.bitbucket; +package com.utility.utilitycommonservice.integration.service.service.bitbucket.impl; import com.fasterxml.jackson.core.JsonProcessingException; import com.fasterxml.jackson.databind.ObjectMapper; -import com.utility.utilitycommonservice.common.properties.BitbucketProperties; +import com.utility.utilitycommonservice.domain.properties.BitbucketProperties; import com.utility.utilitycommonservice.integration.service.model.MultipartInputStreamFileResource; import com.utility.utilitycommonservice.integration.service.model.request.bitbucket.*; -import com.utility.utilitycommonservice.integration.service.model.response.CreateBranchClientResponse; +import com.utility.utilitycommonservice.integration.service.model.response.bitbucket.CreateBranchClientResponse; import com.utility.utilitycommonservice.integration.service.service.bitbucket.BitbucketClientService; import lombok.RequiredArgsConstructor; import org.springframework.http.HttpEntity; diff --git a/src/main/java/com/utility/utilitycommonservice/integration/service/service/firebase/PushClientService.java b/src/main/java/com/utility/utilitycommonservice/integration/service/service/firebase/PushClientService.java new file mode 100644 index 0000000000000000000000000000000000000000..ab71bb12facf561753dd43c89473f0e17bd2e8da --- /dev/null +++ b/src/main/java/com/utility/utilitycommonservice/integration/service/service/firebase/PushClientService.java @@ -0,0 +1,12 @@ +package com.utility.utilitycommonservice.integration.service.service.firebase; + +import com.google.firebase.messaging.FirebaseMessagingException; +import com.utility.utilitycommonservice.integration.service.model.request.firebase.SendToTokenClientRequest; +import com.utility.utilitycommonservice.integration.service.model.request.firebase.SendToTopicClientRequest; +import com.utility.utilitycommonservice.integration.service.model.response.firebase.SendToTokenClientResponse; +import com.utility.utilitycommonservice.integration.service.model.response.firebase.SendToTopicClientResponse; + +public interface PushClientService { + SendToTokenClientResponse sendToToken(SendToTokenClientRequest request) throws FirebaseMessagingException; + SendToTopicClientResponse sendToTopic(SendToTopicClientRequest request) throws FirebaseMessagingException; +} diff --git a/src/main/java/com/utility/utilitycommonservice/integration/service/service/firebase/impl/PushClientServiceImpl.java b/src/main/java/com/utility/utilitycommonservice/integration/service/service/firebase/impl/PushClientServiceImpl.java new file mode 100644 index 0000000000000000000000000000000000000000..ec4e13bff134118456d4748f9f914a3e2365f15c --- /dev/null +++ b/src/main/java/com/utility/utilitycommonservice/integration/service/service/firebase/impl/PushClientServiceImpl.java @@ -0,0 +1,49 @@ +package com.utility.utilitycommonservice.integration.service.service.firebase.impl; + +import com.google.firebase.messaging.FirebaseMessaging; +import com.google.firebase.messaging.FirebaseMessagingException; +import com.google.firebase.messaging.Message; +import com.google.firebase.messaging.Notification; +import com.utility.utilitycommonservice.integration.service.model.request.firebase.SendToTokenClientRequest; +import com.utility.utilitycommonservice.integration.service.model.request.firebase.SendToTopicClientRequest; +import com.utility.utilitycommonservice.integration.service.model.response.firebase.SendToTokenClientResponse; +import com.utility.utilitycommonservice.integration.service.model.response.firebase.SendToTopicClientResponse; +import com.utility.utilitycommonservice.integration.service.service.firebase.PushClientService; +import lombok.RequiredArgsConstructor; +import org.springframework.stereotype.Service; + +@Service +@RequiredArgsConstructor +public class PushClientServiceImpl implements PushClientService { + + + @Override + public SendToTokenClientResponse sendToToken(SendToTokenClientRequest request) throws FirebaseMessagingException{ + Message msg = Message.builder() + .setToken(request.getToken()) + .setNotification(Notification.builder().setTitle(request.getTitle()).setBody(request.getBody()) + .setImage(request.getImageUrl()).build()) + .putData("url", request.getUrl() == null ? "/" : request.getUrl()) + .build(); + String messageId = FirebaseMessaging.getInstance().send(msg); + + return SendToTokenClientResponse.builder() + .messageId(messageId) + .build(); + } + + @Override + public SendToTopicClientResponse sendToTopic(SendToTopicClientRequest request) throws FirebaseMessagingException{ + Message msg = Message.builder() + .setTopic(request.getTopic()) + .setNotification(Notification.builder().setTitle(request.getTitle()).setBody(request.getBody()) + .setImage(request.getImageUrl()).build()) + .putData("url", request.getUrl() == null ? "/" : request.getUrl()) + .build(); + String messageId = FirebaseMessaging.getInstance().send(msg); + + return SendToTopicClientResponse.builder() + .messageId(messageId) + .build(); + } +} diff --git a/src/main/resources/application.yml b/src/main/resources/application.yml index 799d38c3c3f1ed4ec52e13926a24eec871f4999b..0990e9d0bb5ab51ddb3ec4ea0ce3eb3ab8494434 100644 --- a/src/main/resources/application.yml +++ b/src/main/resources/application.yml @@ -54,6 +54,12 @@ bitbucket: pullRequestPath: /repositories/%s/%s/pullrequests listRepositoryFilesPath: /repositories/%s/%s/src/%s/ +push: + firebase: + credentials: + source: env + credentials-base64: ${FIREBASE_CREDENTIALS_B64:} + logging: level: org: diff --git a/src/main/resources/languages/en.properties b/src/main/resources/languages/en.properties index 35c2a15c8828317fcb94421b3f1291748fd80a3b..6c16ee607750f3e7941f0dfdb25f1f5cdddb1eca 100644 --- a/src/main/resources/languages/en.properties +++ b/src/main/resources/languages/en.properties @@ -1,3 +1,6 @@ -AS_MENU_CAMPAIGN = Campaign -AS_MENU_ART = Art -AS_MENU_SCIENCE = Science \ No newline at end of file +#Updated by MessageService +#Sun Sep 07 23:51:37 TRT 2025 +AS_MENU_ART=Art +AS_MENU_CAMPAIGN=Campaign +AS_MENU_CONTACT=Contact +AS_MENU_SCIENCE=Science diff --git a/src/main/resources/languages/tr.properties b/src/main/resources/languages/tr.properties index 88e94e4a0e6a2dcb06eac502f82938006769d89e..26f4e77aff31659535bc153a066ceb4cf98d0ce7 100644 --- a/src/main/resources/languages/tr.properties +++ b/src/main/resources/languages/tr.properties @@ -1,3 +1,6 @@ -AS_MENU_CAMPAIGN = Kampanya -AS_MENU_ART = Sanat -AS_MENU_SCIENCE = Bilim \ No newline at end of file +#Updated by MessageService +#Sun Sep 07 23:46:58 TRT 2025 +AS_MENU_ART=Sanat +AS_MENU_CAMPAIGN=Kampanya +AS_MENU_CONTACT=İletişim +AS_MENU_SCIENCE=Bilim