:toc: macro
toc::[]

= UseCase
A use-case is a small unit of the link:guide-logic-layer[logic layer] responsible for an operation on a particular link:guide-jpa#entity[entity] (business object).
We leave it up to you to decide whether you want to define an interface (API) for each use-case or provide an implementation directly.

Following our architecture-mapping (for link:guide-structure-classic#architecture-mapping[classic] and link:guide-structure-modern#architecture-mapping[modern] project), use-cases are named `Uc«Operation»«BusinessObject»[Impl]`. The prefix `Uc` stands for use-case and allows to easily find and identify them in your IDE. The `«Operation»` stands for a verb that is operated on the entity identified by `«BusinessObject»`.
For https://en.wikipedia.org/wiki/Create,_read,_update_and_delete[CRUD] we use the standard operations `Find` and `Manage` that can be generated by https://github.com/devonfw/cobigen[CobiGen]. This also separates read and write operations (e.g. if you want to do CQSR, or to configure read-only transactions for read operations).

In our example, we choose to define an interface for each use-case. We also use `*To` to refer to any type of transfer object. Please follow our link:guide-transferobject[guide] to understand more about different types of transfer object e.g. Eto, Dto, Cto

== Find
The `UcFind«BusinessObject»` defines all read operations to retrieve and search the `«BusinessObject»`.
Here is an example:
[source,java]
----
public interface UcFindBooking {
  //*To = Eto, Dto or Cto
  Booking*To findBooking(Long id);
}
----

== Manage
The `UcManage«BusinessObject»` defines all CRUD write operations (create, update and delete) for the `«BusinessObject»`.
Here is an example:
[source,java]
----
public interface UcManageBooking {

  //*To = Eto, Dto or Cto
  Booking*To saveBooking(Booking*To booking);

  void deleteBooking(Long id);

}
----

== Custom
Any other non CRUD operation `Uc«Operation»«BusinessObject»` uses any other custom verb for `«Operation»`.
Typically, such custom use-cases only define a single method.
Here is an example:
[source,java]
----
public interface UcApproveBooking {

  //*To = Eto, Dto or Cto
  void approveBooking(Booking*To booking);

}
----

== Implementation
The implementation should carry its own name and the suffix `Impl` and is annotated with `@Named` and `@ApplicationScoped`. It will need access to the persistent data which is done by injecting the corresponding repository (or DAO). Furthermore, it shall not expose persistent entities from the data access layer and has to map them to transfer objects using the bean-mapper. Please refer to our link:guide-beanmapping[bean mapping], link:guide-transferobject[transfer object] and link:guide-dependency-injection[dependency injection] documentation for more information.
Here is an example:
[source,java]
----
@ApplicationScoped
@Named
public class UcManageBookingImpl implements UcManageBooking {

  @Inject
  private BookingRepository bookingRepository;

  @Override
  public void deleteBooking(Long id) {

    LOG.debug("Delete Booking with id {} from database.", id);
    this.bookingRepository.deleteById(id);
  }
}
----

The use-cases can then be injected directly into the service.

[source,java]
----
@Named("BookingmanagementRestService")
@Validated
public class BookingmanagementRestServiceImpl implements BookingmanagementRestService {

  @Inject
  private UcFindBooking ucFindBooking;

  @Inject
  private UcManageBooking ucManageBooking;

  @Inject
  private UcApproveBooking ucApproveBooking;
}
----

== Internal use case
Sometimes, a component with multiple related entities and many use-cases needs to reuse business logic internally.
Of course, this can be exposed as an official use-case API but this will imply using transfer-objects (ETOs) instead of entities. In some cases, this is undesired e.g. for better performance to prevent unnecessary mapping of entire collections of entities.
In the first place, you should try to use abstract base implementations providing reusable methods the actual use-case implementations can inherit from.
If your business logic is even more complex and you have multiple aspects of business logic to share and reuse but also run into multi-inheritance issues, you may also just create use-cases that have their interface located in the `impl` scope package right next to the implementation (or you may just skip the interface). In such a case, you may define methods that directly take or return entity objects.
To avoid confusion with regular use-cases, we recommend to add the `Internal` suffix to the type name leading to `Uc«Operation»«BusinessObject»Internal[Impl]`.
