From 8a918b976dc54157a8cc264ba11fa2961a64fce7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EA=B9=80=ED=83=9C=ED=98=84?= Date: Fri, 26 Sep 2025 13:48:22 +0900 Subject: [PATCH 01/12] =?UTF-8?q?chore:=20JobMapper=20=EB=A9=94=EC=84=9C?= =?UTF-8?q?=EB=93=9C=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/site/icebang/domain/workflow/mapper/JobMapper.java | 3 +++ 1 file changed, 3 insertions(+) diff --git a/apps/user-service/src/main/java/site/icebang/domain/workflow/mapper/JobMapper.java b/apps/user-service/src/main/java/site/icebang/domain/workflow/mapper/JobMapper.java index e03ac06d..8e2c53a0 100644 --- a/apps/user-service/src/main/java/site/icebang/domain/workflow/mapper/JobMapper.java +++ b/apps/user-service/src/main/java/site/icebang/domain/workflow/mapper/JobMapper.java @@ -12,4 +12,7 @@ public interface JobMapper { List findJobsByWorkflowId(Long workflowId); List findTasksByJobId(Long jobId); + + JobDto findJobById(Long id); + void insertJob(JobDto job); } From 0dc53d561191f81cc6c07ded9417076b896cdf88 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EA=B9=80=ED=83=9C=ED=98=84?= Date: Fri, 26 Sep 2025 14:37:06 +0900 Subject: [PATCH 02/12] =?UTF-8?q?feat:=20Job=20=EC=83=9D=EC=84=B1=20?= =?UTF-8?q?=EC=A1=B0=ED=9A=8C=20=EC=B4=88=EC=95=88?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../workflow/controller/JobController.java | 35 +++++ .../domain/workflow/service/JobService.java | 28 ++++ .../resources/mybatis/mapper/JobMapper.xml | 27 ++++ .../e2e/scenario/JobCreateFlowE2eTest.java | 148 ++++++++++++++++++ 4 files changed, 238 insertions(+) create mode 100644 apps/user-service/src/main/java/site/icebang/domain/workflow/controller/JobController.java create mode 100644 apps/user-service/src/main/java/site/icebang/domain/workflow/service/JobService.java create mode 100644 apps/user-service/src/test/java/site/icebang/e2e/scenario/JobCreateFlowE2eTest.java diff --git a/apps/user-service/src/main/java/site/icebang/domain/workflow/controller/JobController.java b/apps/user-service/src/main/java/site/icebang/domain/workflow/controller/JobController.java new file mode 100644 index 00000000..f7c2dbe0 --- /dev/null +++ b/apps/user-service/src/main/java/site/icebang/domain/workflow/controller/JobController.java @@ -0,0 +1,35 @@ +package site.icebang.domain.workflow.controller; + +import java.util.Map; + +import org.springframework.http.HttpStatus; +import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.*; + +import lombok.RequiredArgsConstructor; +import site.icebang.domain.workflow.dto.JobDto; +import site.icebang.domain.workflow.service.JobService; + +@RestController +@RequestMapping("/v0/jobs") +@RequiredArgsConstructor +public class JobController { + + private final JobService jobService; + + @PostMapping + public ResponseEntity> createJob(@RequestBody JobDto dto) { + JobDto created = jobService.createJob(dto); + return ResponseEntity.status(HttpStatus.CREATED) + .body(Map.of("success", true, "data", created)); + } + + @GetMapping("/{id}") + public ResponseEntity> getJob(@PathVariable Long id) { + JobDto job = jobService.findById(id); + if (job == null) { + return ResponseEntity.status(HttpStatus.NOT_FOUND).body(Map.of("success", false)); + } + return ResponseEntity.ok(Map.of("success", true, "data", job)); + } +} diff --git a/apps/user-service/src/main/java/site/icebang/domain/workflow/service/JobService.java b/apps/user-service/src/main/java/site/icebang/domain/workflow/service/JobService.java new file mode 100644 index 00000000..05f14b24 --- /dev/null +++ b/apps/user-service/src/main/java/site/icebang/domain/workflow/service/JobService.java @@ -0,0 +1,28 @@ +package site.icebang.domain.workflow.service; + +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import lombok.RequiredArgsConstructor; +import site.icebang.domain.workflow.dto.JobDto; +import site.icebang.domain.workflow.mapper.JobMapper; + +@Service +@RequiredArgsConstructor +public class JobService { + + private final JobMapper jobMapper; + + @Transactional + public JobDto createJob(JobDto dto) { + if (dto.getName() == null || dto.getName().isBlank()) { + throw new IllegalArgumentException("job name is required"); + } + jobMapper.insertJob(dto); + return jobMapper.findJobById(dto.getId()); + } + + public JobDto findById(Long id) { + return jobMapper.findJobById(id); + } +} diff --git a/apps/user-service/src/main/resources/mybatis/mapper/JobMapper.xml b/apps/user-service/src/main/resources/mybatis/mapper/JobMapper.xml index 5b959db3..f5cd2ed0 100644 --- a/apps/user-service/src/main/resources/mybatis/mapper/JobMapper.xml +++ b/apps/user-service/src/main/resources/mybatis/mapper/JobMapper.xml @@ -23,6 +23,33 @@ + + INSERT INTO job ( + name, + description, + is_enabled, + created_at, + created_by, + updated_at, + updated_by + ) VALUES ( + #{name}, + #{description}, + #{isEnabled}, + #{createdAt}, + #{createdBy}, + #{updatedAt}, + #{updatedBy} + ) + + + + + SELECT t.* + FROM task t + WHERE t.id = #{id} + +