diff --git a/.github/workflows/deploy.yml b/.github/workflows/deploy.yml index d4c6b3e..ae07ac0 100644 --- a/.github/workflows/deploy.yml +++ b/.github/workflows/deploy.yml @@ -11,7 +11,7 @@ permissions: jobs: build-deploy: - uses: PARADOX-BSSM/windeath44.manifest.cicd/.github/workflows/ci.yml@master + uses: PARADOX-BSSM/windeath44.manifest.cicd/.github/workflows/release.yml@master with: deploy_repo: 'PARADOX-BSSM/windeath44.manifest.values' deploy_path_prefix: 'prod' diff --git a/src/main/avro/MemorialAppliedAvroSchema.avsc b/src/main/avro/MemorialAppliedAvroSchema.avsc new file mode 100644 index 0000000..b71d2f1 --- /dev/null +++ b/src/main/avro/MemorialAppliedAvroSchema.avsc @@ -0,0 +1,12 @@ +{ + "type": "record", + "name": "MemorialAppliedAvroSchema", + "namespace": "windeath44.server.application.avro", + "doc": "Event emitted when a user submits a memorial application.", + "fields": [ + {"name": "memorialApplicationId", "type": "long", "doc": "Unique identifier for the memorial application"}, + {"name": "applicantId", "type": "string", "doc": "User submitting the application"}, + {"name": "characterId", "type": "long", "doc": "Character the memorial is requested for"}, + {"name": "content", "type": "string", "doc": "Application content or message"} + ] +} diff --git a/src/main/java/com/example/memorial_application/domain/mapper/MemorialApplicationMapper.java b/src/main/java/com/example/memorial_application/domain/mapper/MemorialApplicationMapper.java index 115fad3..8d8ce24 100644 --- a/src/main/java/com/example/memorial_application/domain/mapper/MemorialApplicationMapper.java +++ b/src/main/java/com/example/memorial_application/domain/mapper/MemorialApplicationMapper.java @@ -6,6 +6,7 @@ import lombok.RequiredArgsConstructor; import org.springframework.data.domain.Slice; import org.springframework.stereotype.Component; +import windeath44.server.application.avro.MemorialAppliedAvroSchema; import windeath44.server.application.avro.MemorialApplicationAvroSchema; import java.time.LocalDate; @@ -47,6 +48,15 @@ public MemorialApplicationAvroSchema toMemorialApplicationAvroSchema(MemorialApp .build(); } + public MemorialAppliedAvroSchema toMemorialAppliedAvroSchema(MemorialApplication memorialApplication) { + return MemorialAppliedAvroSchema.newBuilder() + .setMemorialApplicationId(memorialApplication.getMemorialApplicationId()) + .setApplicantId(memorialApplication.getUserId()) + .setCharacterId(memorialApplication.getCharacterId()) + .setContent(memorialApplication.getContent()) + .build(); + } + public List toMemorialApplicationListResponse(Slice memorialApplicationSlice, String viewerId) { return memorialApplicationSlice.getContent() .stream() diff --git a/src/main/java/com/example/memorial_application/domain/service/MemorialApplicationCommandService.java b/src/main/java/com/example/memorial_application/domain/service/MemorialApplicationCommandService.java index b29b835..389947b 100644 --- a/src/main/java/com/example/memorial_application/domain/service/MemorialApplicationCommandService.java +++ b/src/main/java/com/example/memorial_application/domain/service/MemorialApplicationCommandService.java @@ -15,6 +15,7 @@ import lombok.RequiredArgsConstructor; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; +import windeath44.server.application.avro.MemorialAppliedAvroSchema; import windeath44.server.application.avro.MemorialApplicationAvroSchema; import windeath44.server.memorial.avro.MemorialAvroSchema; @@ -43,7 +44,10 @@ public void apply(String userId, MemorialApplicationRequest memorialApplicationR // 만약 해당 캐릭터가 이미 추모중이라면 apply 실패 grpcClient.validateNotAlreadyMemorialized(characterId); - memorialApplicationRepository.save(memorialApplication); + MemorialApplication savedMemorialApplication = memorialApplicationRepository.save(memorialApplication); + + MemorialAppliedAvroSchema memorialAppliedAvroSchema = memorialApplicationMapper.toMemorialAppliedAvroSchema(savedMemorialApplication); + kafkaProducer.send("memorial-apply-request", memorialAppliedAvroSchema); } diff --git a/src/main/resources/application.yml b/src/main/resources/application.yml index 31e5746..754c259 100644 --- a/src/main/resources/application.yml +++ b/src/main/resources/application.yml @@ -36,8 +36,8 @@ kafka: schema.registry.url: ${SCHEMA_REGISTRY_URL} auto.register.schemas: true value.subject.name.strategy: io.confluent.kafka.serializers.subject.TopicNameStrategy - consumer: - auto-offset-reset: earliest + consumer: + auto-offset-reset: latest key-deserializer: org.apache.kafka.common.serialization.StringDeserializer value-deserializer: io.confluent.kafka.serializers.KafkaAvroDeserializer specific-avro-reader: true diff --git a/src/test/java/com/example/memorial_application/domain/service/MemorialApplicationApproveServiceTest.java b/src/test/java/com/example/memorial_application/domain/service/MemorialApplicationApproveServiceTest.java index e71222e..90196c9 100644 --- a/src/test/java/com/example/memorial_application/domain/service/MemorialApplicationApproveServiceTest.java +++ b/src/test/java/com/example/memorial_application/domain/service/MemorialApplicationApproveServiceTest.java @@ -15,6 +15,7 @@ import org.mockito.InjectMocks; import org.mockito.Mock; import org.mockito.junit.jupiter.MockitoExtension; +import windeath44.server.application.avro.MemorialAppliedAvroSchema; import windeath44.server.application.avro.MemorialApplicationAvroSchema; import windeath44.server.memorial.avro.MemorialAvroSchema; @@ -51,6 +52,7 @@ class MemorialApplicationApproveServiceTest { private Long memorialApplicationId; private MemorialApplication memorialApplication; private MemorialApplicationAvroSchema memorialApplicationAvroSchema; + private MemorialAppliedAvroSchema memorialAppliedAvroSchema; private MemorialAvroSchema memorialAvroSchema; private MemorialApplicationRequest memorialApplicationRequest; @@ -62,11 +64,14 @@ void setUp() { memorialApplicationId = 1L; memorialApplication = mock(MemorialApplication.class); memorialApplicationAvroSchema = mock(MemorialApplicationAvroSchema.class); + memorialAppliedAvroSchema = mock(MemorialAppliedAvroSchema.class); memorialAvroSchema = mock(MemorialAvroSchema.class); - memorialApplicationRequest = new MemorialApplicationRequest(1L, "example"); + memorialApplicationRequest = new MemorialApplicationRequest(characterId, content); when(memorialApplication.getMemorialApplicationId()).thenReturn(memorialApplicationId); when(memorialApplication.getCharacterId()).thenReturn(characterId); + when(memorialApplication.getUserId()).thenReturn(userId); + when(memorialApplication.getContent()).thenReturn(content); } @Test @@ -76,12 +81,14 @@ void apply_WhenUserHasNotAppliedForCharacter_ShouldSaveMemorialApplication() { when(memorialApplicationMapper.toMemorialApplication(userId, characterId, content)).thenReturn(memorialApplication); when(memorialApplicationRepository.existsByUserIdAndCharacterId(userId, characterId)).thenReturn(false); doNothing().when(grpcClient).validateNotAlreadyMemorialized(characterId); + when(memorialApplicationMapper.toMemorialAppliedAvroSchema(memorialApplication)).thenReturn(memorialAppliedAvroSchema); // Act memorialApplicationApproveService.apply(userId, memorialApplicationRequest); // Assert verify(memorialApplicationRepository).save(memorialApplication); + verify(kafkaProducer).send("memorial-apply-request", memorialAppliedAvroSchema); } @Test @@ -109,7 +116,7 @@ void approve_ById_ShouldSendKafkaMessage() { memorialApplicationApproveService.approve(memorialApplicationId, userId); // Assert - verify(kafkaProducer).send("memorial-application-", memorialApplicationAvroSchema); + verify(kafkaProducer).send("memorial-application-approved-request", memorialApplicationAvroSchema); } // @Test @@ -171,4 +178,4 @@ void findApplicationByUserIdAndCharacterId_WhenApplicationNotFound_ShouldThrowEx memorialApplicationApproveService.cancel(memorialAvroSchema); }); } -} \ No newline at end of file +}