diff --git a/build.gradle b/build.gradle index d76c339..5d53c13 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" @@ -135,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 new file mode 100644 index 0000000..ed47f5a --- /dev/null +++ b/src/main/java/com/doubleo/logservice/global/util/TimestampUtils.java @@ -0,0 +1,33 @@ +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..e8b555f --- /dev/null +++ b/src/main/java/com/doubleo/logservice/grpc/server/LogGrpcServiceImpl.java @@ -0,0 +1,99 @@ +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 java.util.List; +import net.devh.boot.grpc.server.service.GrpcService; + +@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.valueOf(request.getVisitCategory()))); + 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(); + } +}