ExampleMapper.kt

package com.example.templateproject.core.mapper

import com.example.templateproject.api.dto.ExampleDTO
import com.example.templateproject.persistence.entity.Example
import com.example.templateproject.persistence.repository.ExampleRepository
import io.micrometer.core.annotation.Timed
import io.micrometer.tracing.annotation.NewSpan
import io.micrometer.tracing.annotation.SpanTag
import org.springframework.stereotype.Service
import java.util.Optional

@Service
class ExampleMapper(
    override val repository: ExampleRepository,
) : AbstractMapper<Example, ExampleDTO>(repository, Example::class) {
    @Timed(
        value = "app.method.executions",
        extraTags = ["topic", "example-entity-mapping"],
        description = "The amount of time spent in the different methods.",
    )
    @NewSpan("dto-to-entity-mapping")
    override fun toEntity(
        @SpanTag("dto") dto: ExampleDTO,
    ): Example =
        Optional
            .ofNullable(dto.id)
            .map { getEntityId(it) }
            .map { it.apply { name = dto.name } }
            .orElseGet { Example(dto.name) }

    @Timed(
        value = "app.method.executions",
        extraTags = ["topic", "example-entity-mapping"],
        description = "The amount of time spent in the different methods.",
    )
    @NewSpan("entity-to-dto-mapping")
    override fun toDTO(
        @SpanTag("entity") entity: Example,
    ) = ExampleDTO(
        entity.name,
    ).apply {
        setBaseDTOFields(this, entity)
    }
}