Skip to content

Conversation

@jbh010204
Copy link
Member

@jbh010204 jbh010204 commented Aug 2, 2025

✨ 구현한 기능

  • 신청 조회 시 '결제 완료' 또는 '환불 완료' 로만 반환하도록 변경
  • JPQL 앞단에서 CASE로 ENUM 처리하도록 설정

📢 논의하고 싶은 내용

🎸 기타

Summary by CodeRabbit

  • New Features

    • Integrated refund information into application responses, allowing users to view refund status alongside exam applications.
  • Improvements

    • Enhanced status display for exam applications to reflect both payment and refund statuses with clearer labels.
  • Bug Fixes

    • None.
  • Other

    • Minor terminology updates for consistency in the user interface.

@jbh010204 jbh010204 self-assigned this Aug 2, 2025
@coderabbitai
Copy link

coderabbitai bot commented Aug 2, 2025

Walkthrough

This change integrates refund information into the application data pipeline. It introduces a new ExamApplicationWithStatus record, updates repositories and context classes to handle this richer data structure, and modifies processing and response logic to include refund status and details. Several method and parameter names were updated to reflect the new data flow.

Changes

Cohort / File(s) Change Summary
ApplicationContext & Response Assembly
src/main/java/life/mosu/mosuserver/application/application/ApplicationContext.java,
src/main/java/life/mosu/mosuserver/presentation/application/dto/ExamApplicationResponse.java
Refactored to use ExamApplicationWithStatus instead of ExamApplicationJpaEntity, added refund map, updated constructor and fetch methods, and adjusted response assembly logic to include refund data and status field renaming.
Processor Logic
src/main/java/life/mosu/mosuserver/application/application/processor/GetApplicationsStepProcessor.java
Injected RefundJpaRepository, updated to use new exam application type, and added refund fetching to the processing pipeline.
Exam Application Repository
src/main/java/life/mosu/mosuserver/domain/examapplication/ExamApplicationJpaRepository.java
Changed query to return ExamApplicationWithStatus DTOs, joining payment and refund tables, and determining status accordingly.
Refund Repository
src/main/java/life/mosu/mosuserver/domain/refund/RefundJpaRepository.java
Added batch refund lookup method for exam application IDs.
New DTO
src/main/java/life/mosu/mosuserver/presentation/examapplication/dto/ExamApplicationWithStatus.java
Introduced new record to pair exam applications with their status.

Sequence Diagram(s)

sequenceDiagram
    participant User
    participant GetApplicationsStepProcessor
    participant ExamApplicationJpaRepository
    participant RefundJpaRepository
    participant ApplicationContext

    User->>GetApplicationsStepProcessor: process(userId)
    GetApplicationsStepProcessor->>ExamApplicationJpaRepository: findByApplicationIdIn(applicationIds)
    ExamApplicationJpaRepository-->>GetApplicationsStepProcessor: List<ExamApplicationWithStatus>
    GetApplicationsStepProcessor->>RefundJpaRepository: findByExamApplicationIdIn(examApplicationIds)
    RefundJpaRepository-->>GetApplicationsStepProcessor: List<RefundJpaEntity>
    GetApplicationsStepProcessor->>ApplicationContext: assemble(applications, examApplications, refunds, ...)
    ApplicationContext-->>GetApplicationsStepProcessor: List<ApplicationResponse>
    GetApplicationsStepProcessor-->>User: Application responses (with refund status)
Loading

Estimated code review effort

🎯 4 (Complex) | ⏱️ ~35 minutes

Possibly related PRs

Suggested labels

우선순위 중

Suggested reviewers

  • wlgns12370
  • chominju02

Poem

In the fields where refunds hop and play,
Applications now know what to say—
With status in tow, and refunds in hand,
The data flows smoothly across the land.
A rabbit’s delight, this code’s new direction,
Hopping with joy at each new connection!
🐇✨

Note

⚡️ Unit Test Generation is now available in beta!

Learn more here, or try it out under "Finishing Touches" below.

✨ Finishing Touches
  • 📝 Generate Docstrings
🧪 Generate unit tests
  • Create PR with unit tests
  • Post copyable unit tests in a comment
  • Commit unit tests in branch refactor/mosu-153

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share
🪧 Tips

Chat

There are 3 ways to chat with CodeRabbit:

  • Review comments: Directly reply to a review comment made by CodeRabbit. Example:
    • I pushed a fix in commit <commit_id>, please review it.
    • Explain this complex logic.
    • Open a follow-up GitHub issue for this discussion.
  • Files and specific lines of code (under the "Files changed" tab): Tag @coderabbitai in a new review comment at the desired location with your query. Examples:
    • @coderabbitai explain this code block.
    • @coderabbitai modularize this function.
  • PR comments: Tag @coderabbitai in a new PR comment to ask questions about the PR branch. For the best results, please provide a very specific query, as very limited context is provided in this mode. Examples:
    • @coderabbitai gather interesting stats about this repository and render them as a table. Additionally, render a pie chart showing the language distribution in the codebase.
    • @coderabbitai read src/utils.ts and explain its main purpose.
    • @coderabbitai read the files in the src/scheduler package and generate a class diagram using mermaid and a README in the markdown format.
    • @coderabbitai help me debug CodeRabbit configuration file.

Support

Need help? Create a ticket on our support page for assistance with any issues or questions.

Note: Be mindful of the bot's finite context window. It's strongly recommended to break down tasks such as reading entire modules into smaller chunks. For a focused discussion, use review comments to chat about specific files and their changes, instead of using the PR comments.

CodeRabbit Commands (Invoked using PR comments)

  • @coderabbitai pause to pause the reviews on a PR.
  • @coderabbitai resume to resume the paused reviews.
  • @coderabbitai review to trigger an incremental review. This is useful when automatic reviews are disabled for the repository.
  • @coderabbitai full review to do a full review from scratch and review all the files again.
  • @coderabbitai summary to regenerate the summary of the PR.
  • @coderabbitai generate docstrings to generate docstrings for this PR.
  • @coderabbitai generate sequence diagram to generate a sequence diagram of the changes in this PR.
  • @coderabbitai generate unit tests to generate unit tests for this PR.
  • @coderabbitai resolve resolve all the CodeRabbit review comments.
  • @coderabbitai configuration to show the current CodeRabbit configuration for the repository.
  • @coderabbitai help to get help.

Other keywords and placeholders

  • Add @coderabbitai ignore anywhere in the PR description to prevent this PR from being reviewed.
  • Add @coderabbitai summary to generate the high-level summary at a specific location in the PR description.
  • Add @coderabbitai anywhere in the PR title to generate the title automatically.

CodeRabbit Configuration File (.coderabbit.yaml)

  • You can programmatically configure CodeRabbit by adding a .coderabbit.yaml file to the root of your repository.
  • Please see the configuration documentation for more information.
  • If your editor has YAML language server enabled, you can add the path at the top of this file to enable auto-completion and validation: # yaml-language-server: $schema=https://coderabbit.ai/integrations/schema.v2.json

Documentation and Community

  • Visit our Documentation for detailed information on how to use CodeRabbit.
  • Join our Discord Community to get help, request features, and share feedback.
  • Follow us on X/Twitter for updates and announcements.

Copy link

@gemini-code-assist gemini-code-assist bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Summary of Changes

Hello @jbh010204, I'm Gemini Code Assist1! I'm currently reviewing this pull request and will post my feedback shortly. In the meantime, here's a summary to help you and other reviewers quickly get up to speed!

This pull request refactors the way application statuses are retrieved and presented to users. It streamlines the status display to a concise 'Payment Completed' or 'Refund Completed' by shifting the complex status determination logic into the JPQL query itself. This change aims to provide a clearer and more consistent user experience while centralizing the status calculation at the data retrieval layer.

Highlights

  • Simplified Application Status Display: The primary goal of this PR is to simplify the application status shown to users. Instead of various payment statuses, the system will now only return '결제 완료' (Payment Completed) or '환불 완료' (Refund Completed) for application queries.
  • Status Determination Shifted to JPQL: The logic for determining the simplified application status has been moved from the application layer into the ExamApplicationJpaRepository's findByApplicationIdIn method. This is achieved via a custom JPQL query utilizing a CASE statement to derive the status directly at the database level, improving consistency and potentially performance.
  • Introduction of ExamApplicationWithStatus DTO: A new DTO, ExamApplicationWithStatus, has been introduced. This record encapsulates an ExamApplicationJpaEntity along with its pre-calculated status string, streamlining the data flow and presentation logic.
  • Refactoring of ApplicationContext: The ApplicationContext has been updated to accommodate the new ExamApplicationWithStatus DTO and to integrate refund information. It now includes a refundMap and a new fetchRefunds method to retrieve refund entities, which are then used in the createExamApplicationResponse method to assemble the final response with the simplified status.
Using Gemini Code Assist

The full guide for Gemini Code Assist can be found on our documentation page, here are some quick tips.

Invoking Gemini

You can request assistance from Gemini at any point in your pull request via creating an issue comment (i.e. comment on the pull request page) using either /gemini <command> or @gemini-code-assist <command>. Below is a summary of the supported commands.

Feature Command Description
Code Review /gemini review Performs a code review for the current pull request in its current state.
Pull Request Summary /gemini summary Provides a summary of the current pull request in its current state.
Comment @gemini-code-assist Responds in comments when explicitly tagged, both in issue comments and review comments.
Help /gemini help Displays a list of available commands.

Customization

To customize Gemini Code Assist for GitHub experience, repository maintainers can create a configuration file and/or provide a custom code review style guide (such as PEP-8 for Python) by creating and adding files to a .gemini/ folder in the base of the repository. Detailed instructions can be found here.

Limitations & Feedback

Gemini Code Assist may make mistakes. Please leave feedback on any instances where its feedback is incorrect or counter productive. You can react with 👍 and 👎 on @gemini-code-assist comments or fill out our survey to provide feedback.

You can also get AI-powered code generation, chat, as well as code reviews directly in the IDE at no cost with the Gemini Code Assist IDE Extension.

Footnotes

  1. Review the Privacy Notices, Generative AI Prohibited Use Policy, Terms of Service, and learn how to configure Gemini Code Assist in GitHub here. Gemini can make mistakes, so double check it and use code with caution.

Copy link

@gemini-code-assist gemini-code-assist bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Code Review

This pull request refactors how application statuses are retrieved using a JPQL query. To further improve the code, consider removing the redundant database call, improving the separation of concerns by moving presentation logic out of the data layer, and enhancing code clarity with better naming.

Comment on lines +43 to 44
List<ExamApplicationWithStatus> examApplications = examApplicationJpaRepository.findByApplicationIdIn(
applicationIds);

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

high

The query in ExamApplicationJpaRepository already determines the application status by joining with the refund table. Therefore, .fetchRefunds(...) results in an extra database query that can be avoided. Removing this call will improve efficiency.

        return new ApplicationContext(applications, examApplications)
                .fetchExams(examJpaRepository::findByIdIn)
                .fetchSubjects(examSubjectJpaRepository::findByExamApplicationIdIn)
                .fetchPayments(paymentJpaRepository::findByExamApplicationIdIn)
                .assemble();

Comment on lines +76 to +82
SELECT new life.mosu.mosuserver.presentation.examapplication.dto.ExamApplicationWithStatus(
ea,
CASE
WHEN r.refundStatus = 'DONE' THEN '환불완료'
ELSE '결제완료'
END
)

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

medium

The JPQL query returns presentation-layer strings ('환불완료', '결제완료'). Returning a boolean isRefunded and handling the mapping to display strings in the application layer would improve separation of concerns and maintainability.

    @Query("""
            SELECT new life.mosu.mosuserver.presentation.examapplication.dto.ExamApplicationWithStatus(
            ea,
            CASE
                 WHEN r.refundStatus = 'DONE' THEN true
                 ELSE false
            END
            )
            FROM ExamApplicationJpaEntity ea
            JOIN PaymentJpaEntity p ON p.examApplicationId = ea.id
            LEFT JOIN RefundJpaEntity r ON r.examApplicationId = ea.id
            WHERE p.paymentStatus = 'DONE'
            AND (r IS NULL OR r.refundStatus = 'DONE')
            AND ea.applicationId IN :applicationIds
            """)
    List<ExamApplicationWithStatus> findByApplicationIdIn(List<Long> applicationIds);

FROM RefundJpaEntity r
WHERE r.examApplicationId IN :examApplicationIds
""")
List<RefundJpaEntity> findByExamApplicationIdIn(@Param("examApplicationIds") List<Long> examApplicationId);

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

medium

The parameter name examApplicationId is misleading for a List<Long>. Renaming it to examApplicationIds would improve readability.

Suggested change
List<RefundJpaEntity> findByExamApplicationIdIn(@Param("examApplicationIds") List<Long> examApplicationId);
List<RefundJpaEntity> findByExamApplicationIdIn(@Param("examApplicationIds") List<Long> examApplicationIds);

Copy link

@coderabbitai coderabbitai bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 2

🧹 Nitpick comments (1)
src/main/java/life/mosu/mosuserver/presentation/examapplication/dto/ExamApplicationWithStatus.java (1)

1-8: Consider using an enum for the status field.

The record implementation is clean and functional. However, consider using an enum instead of String for the status field to provide better type safety and prevent invalid status values.

+public enum ApplicationStatus {
+    PAYMENT_COMPLETED("결제완료"),
+    REFUND_COMPLETED("환불완료");
+    
+    private final String displayName;
+    
+    ApplicationStatus(String displayName) {
+        this.displayName = displayName;
+    }
+    
+    public String getDisplayName() {
+        return displayName;
+    }
+}

 public record ExamApplicationWithStatus(
         ExamApplicationJpaEntity examApplication,
-        String status
+        ApplicationStatus status
 ) { }
📜 Review details

Configuration used: CodeRabbit UI
Review profile: CHILL
Plan: Pro

📥 Commits

Reviewing files that changed from the base of the PR and between 4041a7c and 4b7806e.

📒 Files selected for processing (6)
  • src/main/java/life/mosu/mosuserver/application/application/ApplicationContext.java (1 hunks)
  • src/main/java/life/mosu/mosuserver/application/application/processor/GetApplicationsStepProcessor.java (3 hunks)
  • src/main/java/life/mosu/mosuserver/domain/examapplication/ExamApplicationJpaRepository.java (2 hunks)
  • src/main/java/life/mosu/mosuserver/domain/refund/RefundJpaRepository.java (2 hunks)
  • src/main/java/life/mosu/mosuserver/presentation/application/dto/ExamApplicationResponse.java (3 hunks)
  • src/main/java/life/mosu/mosuserver/presentation/examapplication/dto/ExamApplicationWithStatus.java (1 hunks)
🔇 Additional comments (10)
src/main/java/life/mosu/mosuserver/domain/refund/RefundJpaRepository.java (2)

3-7: LGTM! Import corrections look good.

The import changes properly replace the incorrect io.lettuce.core.dynamic.annotation.Param with the standard Spring org.springframework.data.repository.query.Param and add the necessary java.util.List import.


37-42: LGTM! Clean batch retrieval method.

The new findByExamApplicationIdIn method provides efficient batch retrieval of refunds by exam application IDs. The JPQL query is straightforward and the method signature follows Spring Data JPA conventions.

src/main/java/life/mosu/mosuserver/presentation/application/dto/ExamApplicationResponse.java (1)

9-9: LGTM! Field rename aligns with refactoring objectives.

The rename from paymentStatus to status properly reflects the expanded scope to include both payment and refund status information.

Also applies to: 20-20, 30-30

src/main/java/life/mosu/mosuserver/domain/examapplication/ExamApplicationJpaRepository.java (1)

75-90: Business logic filter consistency verified

Verified that all existing JPQL queries in ExamApplicationJpaRepository use p.paymentStatus = 'DONE'. The new findByApplicationIdIn method follows this same pattern and correctly incorporates refund status handling. No further changes required.

src/main/java/life/mosu/mosuserver/application/application/processor/GetApplicationsStepProcessor.java (3)

12-12: LGTM! Proper dependency injection for refund repository.

The addition of RefundJpaRepository dependency follows the existing pattern and enables refund data integration.

Also applies to: 31-31


15-15: LGTM! Type update aligns with repository changes.

The variable type change from List<ExamApplicationJpaEntity> to List<ExamApplicationWithStatus> properly reflects the updated repository method return type.

Also applies to: 43-44


46-51: LGTM! Clean integration of refund data in processing chain.

The addition of .fetchRefunds(refundJpaRepository::findByExamApplicationIdIn) follows the established fluent processing pattern and integrates refund data into the application context.

src/main/java/life/mosu/mosuserver/application/application/ApplicationContext.java (3)

21-28: LGTM! Record structure properly updated to include refund data.

The addition of refundMap and the change to ExamApplicationWithStatus aligns well with the PR objective to integrate refund status information. The consistent use of Map structures for related entities maintains good design patterns.


30-35: LGTM! Constructor properly updated.

The constructor correctly initializes all fields including the new refundMap, maintaining consistency with the record structure changes.


78-89: LGTM! Assembly logic properly handles the new data structure.

The method correctly processes ExamApplicationWithStatus objects and maintains proper null-safety with filtering.

Comment on lines +68 to 76
public ApplicationContext fetchRefunds(Function<List<Long>, List<RefundJpaEntity>> fetcher) {
Map<Long, RefundJpaEntity> newRefundMap = fetcher.apply(
examApplications.stream()
.map(e -> e.examApplication().getId())
.toList()
).stream().collect(Collectors.toMap(RefundJpaEntity::getExamApplicationId, Function.identity()));

return new ApplicationContext(applications, examApplications, examMap, subjectMap, paymentMap, newRefundMap);
}
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue

Potential data loss if multiple refunds exist for the same exam application.

The toMap collector will throw an exception if there are duplicate keys (multiple refunds for the same examApplicationId). Consider using a merge function or grouping if multiple refunds per application are possible.

If multiple refunds are not possible by design, this is fine. Otherwise, consider:

-        ).stream().collect(Collectors.toMap(RefundJpaEntity::getExamApplicationId, Function.identity()));
+        ).stream().collect(Collectors.toMap(
+            RefundJpaEntity::getExamApplicationId, 
+            Function.identity(),
+            (existing, replacement) -> replacement // or choose appropriate merge strategy
+        ));
📝 Committable suggestion

‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.

Suggested change
public ApplicationContext fetchRefunds(Function<List<Long>, List<RefundJpaEntity>> fetcher) {
Map<Long, RefundJpaEntity> newRefundMap = fetcher.apply(
examApplications.stream()
.map(e -> e.examApplication().getId())
.toList()
).stream().collect(Collectors.toMap(RefundJpaEntity::getExamApplicationId, Function.identity()));
return new ApplicationContext(applications, examApplications, examMap, subjectMap, paymentMap, newRefundMap);
}
public ApplicationContext fetchRefunds(Function<List<Long>, List<RefundJpaEntity>> fetcher) {
Map<Long, RefundJpaEntity> newRefundMap = fetcher.apply(
examApplications.stream()
.map(e -> e.examApplication().getId())
.toList()
).stream().collect(Collectors.toMap(
RefundJpaEntity::getExamApplicationId,
Function.identity(),
(existing, replacement) -> replacement // or choose appropriate merge strategy
));
return new ApplicationContext(applications, examApplications, examMap, subjectMap, paymentMap, newRefundMap);
}
🤖 Prompt for AI Agents
In
src/main/java/life/mosu/mosuserver/application/application/ApplicationContext.java
around lines 68 to 76, the use of Collectors.toMap without a merge function can
cause exceptions if multiple RefundJpaEntity objects share the same
examApplicationId key. To fix this, either add a merge function to handle
duplicates or change the collection to group refunds by examApplicationId into a
list or another suitable structure, depending on whether multiple refunds per
application are allowed.

Comment on lines +91 to 120
private Map.Entry<Long, ExamApplicationResponse> createExamApplicationResponse(ExamApplicationWithStatus item) {
ExamApplicationJpaEntity examApp = item.examApplication();
ExamJpaEntity exam = examMap.get(examApp.getExamId());
if (exam == null) return null;

List<ExamSubjectJpaEntity> subjectEntities = this.subjectMap.getOrDefault(examApp.getId(),
List.of());
Set<String> subjects = subjectEntities.stream().map(es -> es.getSubject().getSubjectName())
.collect(Collectors.toSet());
Set<String> subjects = subjectMap.getOrDefault(examApp.getId(), List.of()).stream()
.map(s -> s.getSubject().getSubjectName()).collect(Collectors.toSet());

PaymentJpaEntity payment = this.paymentMap.getOrDefault(examApp.getId(), null);
String paymentStatus = Optional.ofNullable(payment)
.map(p -> p.getPaymentStatus().name())
.orElse(null);
PaymentJpaEntity payment = paymentMap.get(examApp.getId());
RefundJpaEntity refund = refundMap.get(examApp.getId());

Integer totalAmount = Optional.ofNullable(payment)
.map(p -> p.getPaymentAmount().getTotalAmount())
.orElse(0);

String lunchName;
if (examApp.getIsLunchChecked()) {
lunchName = exam.getLunchName();
} else {
lunchName = null;
}
String lunchName = examApp.getIsLunchChecked() ? exam.getLunchName() : null;
String status = item.status();

ExamApplicationResponse response = ExamApplicationResponse.of(
examApp.getId(),
examApp.getCreatedAt(),
paymentStatus, totalAmount,
status,
totalAmount,
exam.getSchoolName(),
exam.getExamDate(),
subjects,
lunchName
);

return Map.entry(examApp.getApplicationId(), response);
}
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

💡 Verification agent

🧩 Analysis chain

Consider utilizing the refund entity in the response.

The refund entity is fetched but not used in the response creation. Since the PR aims to integrate refund information, consider:

  1. Should the totalAmount reflect refunds (e.g., show negative amount for refunded applications)?
  2. Should refund details be included in the ExamApplicationResponse?

Let me check if ExamApplicationResponse has fields for refund information:


🏁 Script executed:

#!/bin/bash
# Check the structure of ExamApplicationResponse
fd -e java -x grep -l "ExamApplicationResponse" {} \; | xargs grep -A 10 "class ExamApplicationResponse\|record ExamApplicationResponse"

Length of output: 1448


Include refund information in the response creation

You’re currently fetching RefundJpaEntity refund but never using it. To fully support refunds, please decide on one of the following:

  • Adjust the reported amount by subtracting the refund:

    int paid = Optional.ofNullable(payment)
        .map(p -> p.getPaymentAmount().getTotalAmount())
        .orElse(0);
    int refunded = Optional.ofNullable(refund)
        .map(r -> r.getRefundAmount().getTotalAmount())
        .orElse(0);
    int netAmount = paid - refunded;

    and pass netAmount (or both paid and refunded) into the response.

  • Or extend ExamApplicationResponse to include refund fields:

    public record ExamApplicationResponse(
        Long examApplicationId,
        String createdAt,
        String status,
        Integer totalAmount,
        Integer refundedAmount,   // new
        Integer netAmount,        // new (optional)
        String schoolName,
        LocalDate examDate,
        Set<String> subjects,
        String lunchName
    ) { … }

Locations to update:

  • src/main/java/life/mosu/mosuserver/application/application/ApplicationContext.java (lines 91–120)
  • src/main/java/life/mosu/mosuserver/presentation/application/dto/ExamApplicationResponse.java
🤖 Prompt for AI Agents
In
src/main/java/life/mosu/mosuserver/application/application/ApplicationContext.java
lines 91 to 120, you are fetching the refund entity but not using it in the
response. To fix this, calculate the net amount by subtracting the refund amount
from the payment amount, then update the ExamApplicationResponse creation to
include this net amount or both paid and refunded amounts. Additionally, modify
the ExamApplicationResponse record in
src/main/java/life/mosu/mosuserver/presentation/application/dto/ExamApplicationResponse.java
to add fields for refundedAmount and netAmount, and update its constructor and
usage accordingly.

@jbh010204 jbh010204 merged commit 2ca4d8e into develop Aug 2, 2025
2 checks passed
@jbh010204 jbh010204 deleted the refactor/mosu-153 branch August 7, 2025 19:27
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant