diff --git a/src/main/java/org/example/projektarendehantering/application/ports/AuditLogPort.java b/src/main/java/org/example/projektarendehantering/application/ports/AuditLogPort.java deleted file mode 100644 index 23cd89d..0000000 --- a/src/main/java/org/example/projektarendehantering/application/ports/AuditLogPort.java +++ /dev/null @@ -1,9 +0,0 @@ -package org.example.projektarendehantering.application.ports; - -import org.example.projektarendehantering.domain.AuditEvent; - -public interface AuditLogPort { - - void append(AuditEvent event); -} - diff --git a/src/main/java/org/example/projektarendehantering/application/ports/CaseEventPublisherPort.java b/src/main/java/org/example/projektarendehantering/application/ports/CaseEventPublisherPort.java deleted file mode 100644 index 091f25f..0000000 --- a/src/main/java/org/example/projektarendehantering/application/ports/CaseEventPublisherPort.java +++ /dev/null @@ -1,10 +0,0 @@ -package org.example.projektarendehantering.application.ports; - -import org.example.projektarendehantering.domain.CaseEvent; - -public interface CaseEventPublisherPort { - - void publishCaseEvent(CaseEvent event); -} - -// Kommentar för att kunna pusha igen \ No newline at end of file diff --git a/src/main/java/org/example/projektarendehantering/application/ports/CaseRepositoryPort.java b/src/main/java/org/example/projektarendehantering/application/ports/CaseRepositoryPort.java deleted file mode 100644 index 925fc2a..0000000 --- a/src/main/java/org/example/projektarendehantering/application/ports/CaseRepositoryPort.java +++ /dev/null @@ -1,9 +0,0 @@ -package org.example.projektarendehantering.application.ports; - -import org.example.projektarendehantering.domain.Case; - -public interface CaseRepositoryPort { - - Case save(Case caseToSave); -} - diff --git a/src/main/java/org/example/projektarendehantering/application/ports/CurrentUserPort.java b/src/main/java/org/example/projektarendehantering/application/ports/CurrentUserPort.java deleted file mode 100644 index 1077088..0000000 --- a/src/main/java/org/example/projektarendehantering/application/ports/CurrentUserPort.java +++ /dev/null @@ -1,8 +0,0 @@ -package org.example.projektarendehantering.application.ports; - -import org.example.projektarendehantering.common.Actor; - -public interface CurrentUserPort { - Actor currentUser(); -} - diff --git a/src/main/java/org/example/projektarendehantering/domain/AuditEvent.java b/src/main/java/org/example/projektarendehantering/domain/AuditEvent.java deleted file mode 100644 index 5f95d0a..0000000 --- a/src/main/java/org/example/projektarendehantering/domain/AuditEvent.java +++ /dev/null @@ -1,52 +0,0 @@ -package org.example.projektarendehantering.domain; - -import org.example.projektarendehantering.common.Actor; - -import java.time.Instant; -import java.util.Map; -import java.util.Objects; -import java.util.UUID; - -/** - * Domain audit event value object. - */ -public record AuditEvent( - AuditEventType type, - Instant timestamp, - UUID actorId, - Map targetIdentifiers, - Map details -) { - - public AuditEvent { - Objects.requireNonNull(type, "type"); - Objects.requireNonNull(timestamp, "timestamp"); - Objects.requireNonNull(actorId, "actorId"); - targetIdentifiers = Map.copyOf(targetIdentifiers); - details = Map.copyOf(details); - } - - public static AuditEvent caseCreated(Actor actor, CaseId caseId, String title, String description) { - Objects.requireNonNull(actor, "actor"); - Objects.requireNonNull(caseId, "caseId"); - Objects.requireNonNull(title, "title"); - Objects.requireNonNull(description, "description"); - - Map targetIdentifiers = Map.of( - "caseId", caseId.value().toString() - ); - Map details = Map.of( - "title", title, - "description", description - ); - - return new AuditEvent( - AuditEventType.CASE_CREATED, - Instant.now(), - actor.userId(), - targetIdentifiers, - details - ); - } -} - diff --git a/src/main/java/org/example/projektarendehantering/domain/AuditEventType.java b/src/main/java/org/example/projektarendehantering/domain/AuditEventType.java deleted file mode 100644 index 463217f..0000000 --- a/src/main/java/org/example/projektarendehantering/domain/AuditEventType.java +++ /dev/null @@ -1,9 +0,0 @@ -package org.example.projektarendehantering.domain; - -/** - * Stable audit event types (intended for persistence/log parsing). - */ -public enum AuditEventType { - CASE_CREATED -} - diff --git a/src/main/java/org/example/projektarendehantering/domain/Case.java b/src/main/java/org/example/projektarendehantering/domain/Case.java deleted file mode 100644 index 53345ac..0000000 --- a/src/main/java/org/example/projektarendehantering/domain/Case.java +++ /dev/null @@ -1,87 +0,0 @@ -package org.example.projektarendehantering.domain; - -import org.example.projektarendehantering.common.Actor; - -import java.time.Instant; -import java.util.Objects; -import java.util.UUID; - -/** - * Case aggregate root. - */ -public final class Case { - - private final CaseId id; - private final CaseStatus status; - private final UUID ownerId; - private final String title; - private final String description; - private final Instant createdAt; - - private Case( - CaseId id, - CaseStatus status, - UUID ownerId, - String title, - String description, - Instant createdAt - ) { - this.id = id; - this.status = status; - this.ownerId = ownerId; - this.title = title; - this.description = description; - this.createdAt = createdAt; - } - - /** - * Creates a new OPEN case. - */ - public static Case open(Actor actor, String title, String description) { - Objects.requireNonNull(actor, "actor"); - Objects.requireNonNull(title, "title"); - Objects.requireNonNull(description, "description"); - - CaseId id = new CaseId(UUID.randomUUID()); - return new Case( - id, - CaseStatus.OPEN, - actor.userId(), - title, - description, - Instant.now() - ); - } - - /** - * Alias used by the first vertical slice ("create case"). - */ - public static Case create(Actor actor, String title, String description) { - return open(actor, title, description); - } - - public CaseId id() { - return id; - } - - public CaseStatus status() { - return status; - } - - public UUID ownerId() { - return ownerId; - } - - public String title() { - return title; - } - - public String description() { - return description; - } - - public Instant createdAt() { - return createdAt; - } -} - diff --git a/src/main/java/org/example/projektarendehantering/domain/CaseEvent.java b/src/main/java/org/example/projektarendehantering/domain/CaseEvent.java deleted file mode 100644 index d087d78..0000000 --- a/src/main/java/org/example/projektarendehantering/domain/CaseEvent.java +++ /dev/null @@ -1,17 +0,0 @@ -package org.example.projektarendehantering.domain; - -import java.util.Objects; - -/** - * Domain event emitted when a case lifecycle milestone happens. - */ -public record CaseEvent( - AuditEventType type, - CaseId caseId -) { - public static CaseEvent caseCreated(CaseId caseId) { - Objects.requireNonNull(caseId, "caseId"); - return new CaseEvent(AuditEventType.CASE_CREATED, caseId); - } -} - diff --git a/src/main/java/org/example/projektarendehantering/domain/CaseId.java b/src/main/java/org/example/projektarendehantering/domain/CaseId.java deleted file mode 100644 index 50e7caa..0000000 --- a/src/main/java/org/example/projektarendehantering/domain/CaseId.java +++ /dev/null @@ -1,15 +0,0 @@ -package org.example.projektarendehantering.domain; - -import java.util.Objects; -import java.util.UUID; - -/** - * Case identifier (value object). - */ -public record CaseId(UUID value) { - - public CaseId { - Objects.requireNonNull(value, "value"); - } -} - diff --git a/src/main/java/org/example/projektarendehantering/domain/CasePermissions.java b/src/main/java/org/example/projektarendehantering/domain/CasePermissions.java deleted file mode 100644 index 98f4efe..0000000 --- a/src/main/java/org/example/projektarendehantering/domain/CasePermissions.java +++ /dev/null @@ -1,28 +0,0 @@ -package org.example.projektarendehantering.domain; - -import org.example.projektarendehantering.common.Actor; -import org.example.projektarendehantering.common.NotAuthorizedException; -import org.example.projektarendehantering.common.Role; - -import java.util.Objects; - -/** - * Domain-level permissions for case lifecycle actions. - */ -public final class CasePermissions { - - private CasePermissions() { - } - - public static void assertCanCreate(Actor actor) { - Objects.requireNonNull(actor, "actor"); - - Role role = actor.role(); - if (role == Role.CASE_OWNER || role == Role.HANDLER || role == Role.ADMIN) { - return; - } - - throw new NotAuthorizedException("Actor is not authorized to create a case"); - } -} - diff --git a/src/main/java/org/example/projektarendehantering/domain/CaseStatus.java b/src/main/java/org/example/projektarendehantering/domain/CaseStatus.java deleted file mode 100644 index af4234d..0000000 --- a/src/main/java/org/example/projektarendehantering/domain/CaseStatus.java +++ /dev/null @@ -1,10 +0,0 @@ -package org.example.projektarendehantering.domain; - -/** - * Stable case lifecycle status. - */ -public enum CaseStatus { - OPEN, - CLOSED -} - diff --git a/src/main/java/org/example/projektarendehantering/infrastructure/audit/ConsoleAuditLogAdapter.java b/src/main/java/org/example/projektarendehantering/infrastructure/audit/ConsoleAuditLogAdapter.java deleted file mode 100644 index c7ddd36..0000000 --- a/src/main/java/org/example/projektarendehantering/infrastructure/audit/ConsoleAuditLogAdapter.java +++ /dev/null @@ -1,22 +0,0 @@ -package org.example.projektarendehantering.infrastructure.audit; - -import org.example.projektarendehantering.application.ports.AuditLogPort; -import org.example.projektarendehantering.domain.AuditEvent; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; -import org.springframework.stereotype.Component; - -import java.util.Objects; - -@Component -public class ConsoleAuditLogAdapter implements AuditLogPort { - - private static final Logger log = LoggerFactory.getLogger(ConsoleAuditLogAdapter.class); - - @Override - public void append(AuditEvent event) { - Objects.requireNonNull(event, "event"); - log.info("AUDIT {}", event); - } -} - diff --git a/src/main/java/org/example/projektarendehantering/infrastructure/persistence/InMemoryCaseRepositoryAdapter.java b/src/main/java/org/example/projektarendehantering/infrastructure/persistence/InMemoryCaseRepositoryAdapter.java deleted file mode 100644 index 8a0ede4..0000000 --- a/src/main/java/org/example/projektarendehantering/infrastructure/persistence/InMemoryCaseRepositoryAdapter.java +++ /dev/null @@ -1,161 +0,0 @@ -package org.example.projektarendehantering.infrastructure.persistence; - -import org.example.projektarendehantering.application.ports.CaseRepositoryPort; -import org.example.projektarendehantering.domain.Case; -import org.example.projektarendehantering.domain.CaseId; -import org.springframework.data.domain.Example; -import org.springframework.data.domain.Page; -import org.springframework.data.domain.Pageable; -import org.springframework.data.domain.Sort; -import org.springframework.data.repository.query.FluentQuery; -import org.springframework.stereotype.Repository; - -import java.util.ArrayList; -import java.util.List; -import java.util.Objects; -import java.util.Optional; -import java.util.UUID; -import java.util.concurrent.ConcurrentHashMap; -import java.util.concurrent.ConcurrentMap; -import java.util.function.Function; - -@Repository -public class InMemoryCaseRepositoryAdapter implements CaseRepositoryPort { - - private final ConcurrentMap domainCases = new ConcurrentHashMap<>(); - private final ConcurrentMap entities = new ConcurrentHashMap<>(); - - // Old Port implementation (for compatibility) - @Override - public Case save(Case caseToSave) { - Objects.requireNonNull(caseToSave, "caseToSave"); - domainCases.put(caseToSave.id(), caseToSave); - return caseToSave; - } - - // New Repository implementation (keeping the methods but not implementing CaseRepository) - public CaseEntity save(CaseEntity entity) { - Objects.requireNonNull(entity, "entity"); - if (entity.getId() == null) { - entity.setId(UUID.randomUUID()); - } - entities.put(entity.getId(), entity); - return entity; - } - - public Optional findById(UUID id) { - return Optional.ofNullable(entities.get(id)); - } - - public boolean existsById(UUID uuid) { - return false; - } - - public List saveAll(Iterable entities) { - return List.of(); - } - - public List findAll() { - return new ArrayList<>(entities.values()); - } - - public List findAllById(Iterable uuids) { - return List.of(); - } - - public long count() { - return 0; - } - - public void deleteById(UUID uuid) { - - } - - public void delete(CaseEntity entity) { - - } - - public void deleteAllById(Iterable uuids) { - - } - - public void deleteAll(Iterable entities) { - - } - - public void deleteAll() { - - } - - public void flush() { - - } - - public S saveAndFlush(S entity) { - return null; - } - - public List saveAllAndFlush(Iterable entities) { - return List.of(); - } - - public void deleteAllInBatch(Iterable entities) { - - } - - public void deleteAllByIdInBatch(Iterable uuids) { - - } - - public void deleteAllInBatch() { - - } - - public CaseEntity getOne(UUID uuid) { - return null; - } - - public CaseEntity getById(UUID uuid) { - return null; - } - - public CaseEntity getReferenceById(UUID uuid) { - return null; - } - - public Optional findOne(Example example) { - return Optional.empty(); - } - - public List findAll(Example example) { - return List.of(); - } - - public List findAll(Example example, Sort sort) { - return List.of(); - } - - public Page findAll(Example example, Pageable pageable) { - return null; - } - - public long count(Example example) { - return 0; - } - - public boolean exists(Example example) { - return false; - } - - public R findBy(Example example, Function, R> queryFunction) { - return null; - } - - public List findAll(Sort sort) { - return List.of(); - } - - public Page findAll(Pageable pageable) { - return null; - } -} diff --git a/src/main/java/org/example/projektarendehantering/infrastructure/realtime/NoopCaseEventPublisherAdapter.java b/src/main/java/org/example/projektarendehantering/infrastructure/realtime/NoopCaseEventPublisherAdapter.java deleted file mode 100644 index d8a60b3..0000000 --- a/src/main/java/org/example/projektarendehantering/infrastructure/realtime/NoopCaseEventPublisherAdapter.java +++ /dev/null @@ -1,23 +0,0 @@ -package org.example.projektarendehantering.infrastructure.realtime; - -import org.example.projektarendehantering.application.ports.CaseEventPublisherPort; -import org.example.projektarendehantering.domain.CaseEvent; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; -import org.springframework.stereotype.Component; - -import java.util.Objects; - -@Component -public class NoopCaseEventPublisherAdapter implements CaseEventPublisherPort { - - private static final Logger log = LoggerFactory.getLogger(NoopCaseEventPublisherAdapter.class); - - @Override - public void publishCaseEvent(CaseEvent event) { - Objects.requireNonNull(event, "event"); - // No-op stub for now; a real implementation can wire WebSocket/SSE delivery later. - log.debug("CaseEvent (noop) {}", event); - } -} - diff --git a/src/main/java/org/example/projektarendehantering/infrastructure/security/HeaderCurrentUserAdapter.java b/src/main/java/org/example/projektarendehantering/infrastructure/security/HeaderCurrentUserAdapter.java index 4473f28..041fe75 100644 --- a/src/main/java/org/example/projektarendehantering/infrastructure/security/HeaderCurrentUserAdapter.java +++ b/src/main/java/org/example/projektarendehantering/infrastructure/security/HeaderCurrentUserAdapter.java @@ -1,7 +1,6 @@ package org.example.projektarendehantering.infrastructure.security; import jakarta.servlet.http.HttpServletRequest; -import org.example.projektarendehantering.application.ports.CurrentUserPort; import org.example.projektarendehantering.common.Actor; import org.example.projektarendehantering.common.NotAuthorizedException; import org.example.projektarendehantering.common.Role; @@ -17,7 +16,7 @@ * - {@code X-Role}: must match {@link Role} enum constant names exactly */ @Component -public class HeaderCurrentUserAdapter implements CurrentUserPort { +public class HeaderCurrentUserAdapter { private final HttpServletRequest request; @@ -25,7 +24,6 @@ public HeaderCurrentUserAdapter(HttpServletRequest request) { this.request = request; } - @Override public Actor currentUser() { String userIdHeader = request.getHeader("X-User-Id"); String roleHeader = request.getHeader("X-Role"); diff --git a/src/main/java/org/example/projektarendehantering/presentation/dto/CreateCaseRequest.java b/src/main/java/org/example/projektarendehantering/presentation/dto/CreateCaseRequest.java deleted file mode 100644 index cdb4ec2..0000000 --- a/src/main/java/org/example/projektarendehantering/presentation/dto/CreateCaseRequest.java +++ /dev/null @@ -1,18 +0,0 @@ -package org.example.projektarendehantering.presentation.dto; - -import jakarta.validation.constraints.NotNull; -import jakarta.validation.constraints.Size; - -/** - * Incoming payload for creating a new case. - */ -public record CreateCaseRequest( - @NotNull - @Size(min = 1, max = 200) - String title, - @NotNull - @Size(min = 1, max = 4000) - String description -) { -} - diff --git a/src/main/java/org/example/projektarendehantering/presentation/dto/CreateCaseResponse.java b/src/main/java/org/example/projektarendehantering/presentation/dto/CreateCaseResponse.java deleted file mode 100644 index 9c9cec9..0000000 --- a/src/main/java/org/example/projektarendehantering/presentation/dto/CreateCaseResponse.java +++ /dev/null @@ -1,8 +0,0 @@ -package org.example.projektarendehantering.presentation.dto; - -/** - * Outgoing payload for creating a new case. - */ -public record CreateCaseResponse(String caseId) { -} -