From 20efc7c6ab5831a64d70c6f7852b1aca45d7b066 Mon Sep 17 00:00:00 2001 From: coffeesigma Date: Tue, 10 Jun 2025 12:20:07 +0900 Subject: [PATCH 1/3] =?UTF-8?q?KW-638/feat:=20log=20=EC=A0=80=EC=9E=A5=20g?= =?UTF-8?q?rpc=20server=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- build.gradle | 5 +- .../global/util/TimestampUtils.java | 31 +++++++++++ .../grpc/server/LogGrpcServiceImpl.java | 53 +++++++++++++++++++ 3 files changed, 86 insertions(+), 3 deletions(-) create mode 100644 src/main/java/com/doubleo/logservice/global/util/TimestampUtils.java create mode 100644 src/main/java/com/doubleo/logservice/grpc/server/LogGrpcServiceImpl.java diff --git a/build.gradle b/build.gradle index d76c339..f17e34b 100644 --- a/build.gradle +++ b/build.gradle @@ -72,9 +72,8 @@ dependencies { implementation("org.modelmapper:modelmapper:3.1.1") // (1) hospital-interface 모듈 - implementation "com.doubleo.grpc:hospital-interface:0.2.3" - implementation "com.doubleo.grpc:patient-interface:0.2.3" - implementation "com.doubleo.grpc:member-interface:0.2.3" + implementation "com.doubleo.grpc:hospital-interface:0.2.7" + implementation "com.doubleo.grpc:log-interface:0.2.7" // (2) gRPC 런타임 implementation "io.grpc:grpc-netty:1.63.0" diff --git a/src/main/java/com/doubleo/logservice/global/util/TimestampUtils.java b/src/main/java/com/doubleo/logservice/global/util/TimestampUtils.java new file mode 100644 index 0000000..65281c9 --- /dev/null +++ b/src/main/java/com/doubleo/logservice/global/util/TimestampUtils.java @@ -0,0 +1,31 @@ +package com.doubleo.logservice.global.util; + +import com.google.protobuf.Timestamp; + +import java.time.Instant; +import java.time.LocalDateTime; +import java.time.ZoneId; + +public class TimestampUtils { + + private static final ZoneId DEFAULT_ZONE_ID = ZoneId.systemDefault(); + + private TimestampUtils() {} + + public static LocalDateTime toLocalDateTime(Timestamp timestamp) { + if (timestamp == null) { + return null; + } + return LocalDateTime.ofInstant( + Instant.ofEpochSecond(timestamp.getSeconds(), timestamp.getNanos()), DEFAULT_ZONE_ID + ); + } + + public static Timestamp fromLocalDateTime(LocalDateTime localDateTime) { + if (localDateTime == null) { + return null; + } + Instant instant = localDateTime.atZone(DEFAULT_ZONE_ID).toInstant(); + return Timestamp.newBuilder().setSeconds(instant.getEpochSecond()).setNanos(instant.getNano()).build(); + } +} diff --git a/src/main/java/com/doubleo/logservice/grpc/server/LogGrpcServiceImpl.java b/src/main/java/com/doubleo/logservice/grpc/server/LogGrpcServiceImpl.java new file mode 100644 index 0000000..750e960 --- /dev/null +++ b/src/main/java/com/doubleo/logservice/grpc/server/LogGrpcServiceImpl.java @@ -0,0 +1,53 @@ +package com.doubleo.logservice.grpc.server; + +import com.doubleo.logservice.domain.log.domain.*; +import com.doubleo.logservice.domain.log.repository.BuildingEnterLogRepository; +import com.doubleo.logservice.domain.log.repository.EnterLogRepository; +import com.doubleo.logservice.domain.log.repository.IssuedLogAreaRepository; +import com.doubleo.logservice.domain.log.repository.IssuedLogRepository; +import com.doubleo.logservice.global.enums.VisitCategory; +import com.doubleo.logservice.global.util.TimestampUtils; +import io.grpc.stub.StreamObserver; +import net.devh.boot.grpc.server.service.GrpcService; + +import java.util.List; + +@GrpcService +public class LogGrpcServiceImpl extends LogServiceGrpc.LogServiceImplBase { + + private final IssuedLogRepository issuedLogRepository; + private final IssuedLogAreaRepository issuedLogAreaRepository; + private final EnterLogRepository enterLogRepository; + private final BuildingEnterLogRepository buildingEnterLogRepository; + + + public LogGrpcServiceImpl(IssuedLogRepository issuedLogRepository, IssuedLogAreaRepository issuedLogAreaRepository, EnterLogRepository enterLogRepository, BuildingEnterLogRepository buildingEnterLogRepository) { + this.issuedLogRepository = issuedLogRepository; + this.issuedLogAreaRepository = issuedLogAreaRepository; + this.enterLogRepository = enterLogRepository; + this.buildingEnterLogRepository = buildingEnterLogRepository; + } + + @Override + public void createIssuedLog(CreateIssuedLogRequest request, StreamObserver responseObserver) { + IssuedLog issuedLog = issuedLogRepository.save(IssuedLog.createIssuedLog(request.getTenantId(), request.getMemberId(), request.getMemberName(), request.getMemberContact(), request.getPassId(), TimestampUtils.toLocalDateTime(request.getStartAt()), TimestampUtils.toLocalDateTime(request.getExpiredAt()), VisitCategory.valueOf(request.getVisitCategory()))); + List logAreas = request.getAreaCodesList().stream().map(code -> IssuedLogArea.createIssuedLogArea(request.getTenantId(), issuedLog, code)).toList(); + issuedLogAreaRepository.saveAll(logAreas); + responseObserver.onNext(CreateIssuedLogResponse.newBuilder().setIssuedLogId(issuedLog.getId()).build()); + responseObserver.onCompleted(); + } + + @Override + public void createEnterLog(CreateEnterLogRequest request, StreamObserver responseObserver) { + EnterLog enterLog = enterLogRepository.save(EnterLog.createEnterLog(request.getTenantId(), request.getAreaId(), request.getMemberId(), request.getMemberName(), request.getPassId())); // visitcategory 추가 필요 + responseObserver.onNext(CreateEnterLogResponse.newBuilder().setEnterLogId(enterLog.getId()).build()); + responseObserver.onCompleted(); + } + + @Override + public void createBuildingEnterLog(CreateBuildingEnterLogRequest request, StreamObserver responseObserver) { + BuildingEnterLog buildingEnterLog = buildingEnterLogRepository.save(BuildingEnterLog.createBuildingEnterLog(request.getTenantId(), request.getBuildingId(), request.getMemberId(), request.getMemberName(), request.getPassId(), Direction.valueOf(request.getDirection()), VisitCategory.valueOf(request.getVisitCategory()))); + responseObserver.onNext(CreateBuildingEnterLogResponse.newBuilder().setBuildingEnterLogId(buildingEnterLog.getId()).build()); + responseObserver.onCompleted(); + } +} From f0ff1af5fc57c0924c66b97d03078f9416a18084 Mon Sep 17 00:00:00 2001 From: coffeesigma Date: Tue, 10 Jun 2025 12:21:35 +0900 Subject: [PATCH 2/3] KW-638/refactor: spotless --- build.gradle | 14 ++-- .../global/util/TimestampUtils.java | 10 ++- .../grpc/server/LogGrpcServiceImpl.java | 73 +++++++++++++++---- 3 files changed, 72 insertions(+), 25 deletions(-) diff --git a/build.gradle b/build.gradle index f17e34b..5d53c13 100644 --- a/build.gradle +++ b/build.gradle @@ -134,10 +134,10 @@ tasks.register('updateGitHooks', Copy) { } -//tasks.register('makeGitHooksExecutable', Exec) { -// commandLine 'chmod', '+x', './.git/hooks/pre-commit', './.git/hooks/prepare-commit-msg' -// dependsOn updateGitHooks -//} -// -//compileJava.dependsOn makeGitHooksExecutable -// +tasks.register('makeGitHooksExecutable', Exec) { + commandLine 'chmod', '+x', './.git/hooks/pre-commit', './.git/hooks/prepare-commit-msg' + dependsOn updateGitHooks +} + +compileJava.dependsOn makeGitHooksExecutable + diff --git a/src/main/java/com/doubleo/logservice/global/util/TimestampUtils.java b/src/main/java/com/doubleo/logservice/global/util/TimestampUtils.java index 65281c9..ed47f5a 100644 --- a/src/main/java/com/doubleo/logservice/global/util/TimestampUtils.java +++ b/src/main/java/com/doubleo/logservice/global/util/TimestampUtils.java @@ -1,7 +1,6 @@ package com.doubleo.logservice.global.util; import com.google.protobuf.Timestamp; - import java.time.Instant; import java.time.LocalDateTime; import java.time.ZoneId; @@ -17,8 +16,8 @@ public static LocalDateTime toLocalDateTime(Timestamp timestamp) { return null; } return LocalDateTime.ofInstant( - Instant.ofEpochSecond(timestamp.getSeconds(), timestamp.getNanos()), DEFAULT_ZONE_ID - ); + Instant.ofEpochSecond(timestamp.getSeconds(), timestamp.getNanos()), + DEFAULT_ZONE_ID); } public static Timestamp fromLocalDateTime(LocalDateTime localDateTime) { @@ -26,6 +25,9 @@ public static Timestamp fromLocalDateTime(LocalDateTime localDateTime) { return null; } Instant instant = localDateTime.atZone(DEFAULT_ZONE_ID).toInstant(); - return Timestamp.newBuilder().setSeconds(instant.getEpochSecond()).setNanos(instant.getNano()).build(); + return Timestamp.newBuilder() + .setSeconds(instant.getEpochSecond()) + .setNanos(instant.getNano()) + .build(); } } diff --git a/src/main/java/com/doubleo/logservice/grpc/server/LogGrpcServiceImpl.java b/src/main/java/com/doubleo/logservice/grpc/server/LogGrpcServiceImpl.java index 750e960..321c2f6 100644 --- a/src/main/java/com/doubleo/logservice/grpc/server/LogGrpcServiceImpl.java +++ b/src/main/java/com/doubleo/logservice/grpc/server/LogGrpcServiceImpl.java @@ -8,9 +8,8 @@ import com.doubleo.logservice.global.enums.VisitCategory; import com.doubleo.logservice.global.util.TimestampUtils; import io.grpc.stub.StreamObserver; -import net.devh.boot.grpc.server.service.GrpcService; - import java.util.List; +import net.devh.boot.grpc.server.service.GrpcService; @GrpcService public class LogGrpcServiceImpl extends LogServiceGrpc.LogServiceImplBase { @@ -20,8 +19,11 @@ public class LogGrpcServiceImpl extends LogServiceGrpc.LogServiceImplBase { private final EnterLogRepository enterLogRepository; private final BuildingEnterLogRepository buildingEnterLogRepository; - - public LogGrpcServiceImpl(IssuedLogRepository issuedLogRepository, IssuedLogAreaRepository issuedLogAreaRepository, EnterLogRepository enterLogRepository, BuildingEnterLogRepository buildingEnterLogRepository) { + public LogGrpcServiceImpl( + IssuedLogRepository issuedLogRepository, + IssuedLogAreaRepository issuedLogAreaRepository, + EnterLogRepository enterLogRepository, + BuildingEnterLogRepository buildingEnterLogRepository) { this.issuedLogRepository = issuedLogRepository; this.issuedLogAreaRepository = issuedLogAreaRepository; this.enterLogRepository = enterLogRepository; @@ -29,25 +31,68 @@ public LogGrpcServiceImpl(IssuedLogRepository issuedLogRepository, IssuedLogArea } @Override - public void createIssuedLog(CreateIssuedLogRequest request, StreamObserver responseObserver) { - IssuedLog issuedLog = issuedLogRepository.save(IssuedLog.createIssuedLog(request.getTenantId(), request.getMemberId(), request.getMemberName(), request.getMemberContact(), request.getPassId(), TimestampUtils.toLocalDateTime(request.getStartAt()), TimestampUtils.toLocalDateTime(request.getExpiredAt()), VisitCategory.valueOf(request.getVisitCategory()))); - List logAreas = request.getAreaCodesList().stream().map(code -> IssuedLogArea.createIssuedLogArea(request.getTenantId(), issuedLog, code)).toList(); + public void createIssuedLog( + CreateIssuedLogRequest request, + StreamObserver responseObserver) { + IssuedLog issuedLog = + issuedLogRepository.save( + IssuedLog.createIssuedLog( + request.getTenantId(), + request.getMemberId(), + request.getMemberName(), + request.getMemberContact(), + request.getPassId(), + TimestampUtils.toLocalDateTime(request.getStartAt()), + TimestampUtils.toLocalDateTime(request.getExpiredAt()), + VisitCategory.valueOf(request.getVisitCategory()))); + List logAreas = + request.getAreaCodesList().stream() + .map( + code -> + IssuedLogArea.createIssuedLogArea( + request.getTenantId(), issuedLog, code)) + .toList(); issuedLogAreaRepository.saveAll(logAreas); - responseObserver.onNext(CreateIssuedLogResponse.newBuilder().setIssuedLogId(issuedLog.getId()).build()); + responseObserver.onNext( + CreateIssuedLogResponse.newBuilder().setIssuedLogId(issuedLog.getId()).build()); responseObserver.onCompleted(); } @Override - public void createEnterLog(CreateEnterLogRequest request, StreamObserver responseObserver) { - EnterLog enterLog = enterLogRepository.save(EnterLog.createEnterLog(request.getTenantId(), request.getAreaId(), request.getMemberId(), request.getMemberName(), request.getPassId())); // visitcategory 추가 필요 - responseObserver.onNext(CreateEnterLogResponse.newBuilder().setEnterLogId(enterLog.getId()).build()); + public void createEnterLog( + CreateEnterLogRequest request, + StreamObserver responseObserver) { + EnterLog enterLog = + enterLogRepository.save( + EnterLog.createEnterLog( + request.getTenantId(), + request.getAreaId(), + request.getMemberId(), + request.getMemberName(), + request.getPassId())); // visitcategory 추가 필요 + responseObserver.onNext( + CreateEnterLogResponse.newBuilder().setEnterLogId(enterLog.getId()).build()); responseObserver.onCompleted(); } @Override - public void createBuildingEnterLog(CreateBuildingEnterLogRequest request, StreamObserver responseObserver) { - BuildingEnterLog buildingEnterLog = buildingEnterLogRepository.save(BuildingEnterLog.createBuildingEnterLog(request.getTenantId(), request.getBuildingId(), request.getMemberId(), request.getMemberName(), request.getPassId(), Direction.valueOf(request.getDirection()), VisitCategory.valueOf(request.getVisitCategory()))); - responseObserver.onNext(CreateBuildingEnterLogResponse.newBuilder().setBuildingEnterLogId(buildingEnterLog.getId()).build()); + public void createBuildingEnterLog( + CreateBuildingEnterLogRequest request, + StreamObserver responseObserver) { + BuildingEnterLog buildingEnterLog = + buildingEnterLogRepository.save( + BuildingEnterLog.createBuildingEnterLog( + request.getTenantId(), + request.getBuildingId(), + request.getMemberId(), + request.getMemberName(), + request.getPassId(), + Direction.valueOf(request.getDirection()), + VisitCategory.valueOf(request.getVisitCategory()))); + responseObserver.onNext( + CreateBuildingEnterLogResponse.newBuilder() + .setBuildingEnterLogId(buildingEnterLog.getId()) + .build()); responseObserver.onCompleted(); } } From 622d402f08164cad9dd0663279732f6d52092434 Mon Sep 17 00:00:00 2001 From: coffeesigma Date: Tue, 10 Jun 2025 13:10:19 +0900 Subject: [PATCH 3/3] =?UTF-8?q?KW-638/feat:=20visitcategory=20=EC=B6=94?= =?UTF-8?q?=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/doubleo/logservice/grpc/server/LogGrpcServiceImpl.java | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/main/java/com/doubleo/logservice/grpc/server/LogGrpcServiceImpl.java b/src/main/java/com/doubleo/logservice/grpc/server/LogGrpcServiceImpl.java index 321c2f6..e8b555f 100644 --- a/src/main/java/com/doubleo/logservice/grpc/server/LogGrpcServiceImpl.java +++ b/src/main/java/com/doubleo/logservice/grpc/server/LogGrpcServiceImpl.java @@ -69,7 +69,8 @@ public void createEnterLog( request.getAreaId(), request.getMemberId(), request.getMemberName(), - request.getPassId())); // visitcategory 추가 필요 + request.getPassId(), + VisitCategory.valueOf(request.getVisitCategory()))); responseObserver.onNext( CreateEnterLogResponse.newBuilder().setEnterLogId(enterLog.getId()).build()); responseObserver.onCompleted();