RememberedProjectService.java

package de.mirkosertic.powerstaff.project.command;

import de.mirkosertic.powerstaff.project.query.ProjectQueryService;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import java.util.Optional;

@Service
@Transactional
public class RememberedProjectService {

    private final RememberedProjectRepository repository;
    private final ProjectQueryService projectQueryService;

    public RememberedProjectService(final RememberedProjectRepository repository,
                                    final ProjectQueryService projectQueryService) {
        this.repository = repository;
        this.projectQueryService = projectQueryService;
    }

    /**
     * Setzt das gemerkte Projekt für einen User (Upsert).
     * Existiert bereits ein Eintrag, wird er überschrieben.
     */
    public void set(final String userId, final Long projectId) {
        final boolean exists = repository.existsById(userId);
        repository.save(new RememberedProject(userId, projectId, !exists));
    }

    @Transactional(readOnly = true)
    public Optional<Long> get(final String userId) {
        return repository.findById(userId).map(RememberedProject::getProjectId);
    }

    public void clear(final String userId) {
        repository.deleteById(userId);
    }

    /**
     * Gibt die Anzeige-Infos des gemerkten Projekts zurück.
     * Für andere Module – vermeidet direkten Zugriff auf ProjectQueryService aus Fremd-Modulen.
     */
    @Transactional(readOnly = true)
    public Optional<RememberedProjectInfo> getRememberedProjectInfo(final String userId) {
        return get(userId)
                .flatMap(projectQueryService::findById)
                .map(p -> new RememberedProjectInfo(p.id(), p.projectNumber(), p.descriptionShort()));
    }
}