/
Chebarik
/
PackageManagement
Обзор
Документация
Войти
/
Chebarik
/
PackageManagement
Код
Запросы
0
Задачи
Вики
Пакеты
0
Релизы
0
CI/CD
Аналитика
Безопасность
master
src/main/java/com/packagemanagement/domain/model/Package.java
230 строк
7 KB
Николай Мехоношин
added domain layer entities and services
13 янв 2026, 20:38
13 янв 2026, 20:38
50e61ad
Код
Авторство
О чём код?
package com.packagemanagement.domain.model; import java.time.Instant; import java.util.ArrayList; import java.util.Collections; import java.util.Comparator; import java.util.List; import java.util.Objects; import java.util.Optional; public class Package { private final PackageId id; private String name; private String description; private final PackageFormat format; private final List<PackageVersion> versions; private final Instant createdAt; private Instant updatedAt; private Package(Builder builder) { this.id = builder.id; this.name = builder.name; this.description = builder.description; this.format = builder.format; this.versions = new ArrayList<>(builder.versions); this.createdAt = builder.createdAt; this.updatedAt = builder.updatedAt; } public static Package create(String name, String description, PackageFormat format) { validateName(name); Objects.requireNonNull(format, "Package format is required"); Instant now = Instant.now(); return builder() .id(PackageId.generate()) .name(name) .description(description) .format(format) .versions(new ArrayList<>()) .createdAt(now) .updatedAt(now) .build(); } public static Builder builder() { return new Builder(); } public PackageId getId() { return id; } public String getName() { return name; } public String getDescription() { return description; } public PackageFormat getFormat() { return format; } public List<PackageVersion> getVersions() { return Collections.unmodifiableList(versions); } public Instant getCreatedAt() { return createdAt; } public Instant getUpdatedAt() { return updatedAt; } public void addVersion(PackageVersion version) { Objects.requireNonNull(version, "Version cannot be null"); if (findVersion(version.getVersionNumber()).isPresent()) { throw new IllegalArgumentException( "Version " + version.getVersionNumber() + " already exists in package " + name); } versions.add(version); this.updatedAt = Instant.now(); } public void removeVersion(String versionNumber) { PackageVersion version = findVersion(versionNumber) .orElseThrow(() -> new IllegalArgumentException( "Version " + versionNumber + " not found in package " + name)); if (!version.canBeDeleted()) { throw new IllegalStateException( "Cannot delete version " + versionNumber + " with status " + version.getStatus()); } versions.remove(version); this.updatedAt = Instant.now(); } public Optional<PackageVersion> getLatestVersion() { return versions.stream() .filter(v -> v.getStatus() == VersionStatus.PUBLISHED) .max(Comparator.comparing(PackageVersion::getPublishedDate)); } public Optional<PackageVersion> getHighestVersion() { return versions.stream() .max(Comparator.comparing(PackageVersion::getVersionNumber)); } public Optional<PackageVersion> findVersion(String versionNumber) { return versions.stream() .filter(v -> v.getVersionNumber().equals(versionNumber)) .findFirst(); } public void updateMetadata(String name, String description) { if (name != null && !name.isBlank()) { validateName(name); this.name = name; } if (description != null) { this.description = description; } this.updatedAt = Instant.now(); } public int getVersionCount() { return versions.size(); } public boolean hasPublishedVersions() { return versions.stream().anyMatch(PackageVersion::isPublished); } private static void validateName(String name) { if (name == null || name.isBlank()) { throw new IllegalArgumentException("Package name cannot be null or blank"); } if (name.length() > 100) { throw new IllegalArgumentException("Package name cannot exceed 100 characters"); } if (!name.matches("^[a-zA-Z0-9._-]+$")) { throw new IllegalArgumentException( "Package name can only contain letters, numbers, dots, hyphens and underscores"); } } @Override public boolean equals(Object o) { if (this == o) return true; if (o == null || getClass() != o.getClass()) return false; Package aPackage = (Package) o; return Objects.equals(id, aPackage.id); } @Override public int hashCode() { return Objects.hash(id); } @Override public String toString() { return "Package{" + "id=" + id + ", name='" + name + '\'' + ", format=" + format + ", versionsCount=" + versions.size() + '}'; } public static class Builder { private PackageId id; private String name; private String description; private PackageFormat format; private List<PackageVersion> versions = new ArrayList<>(); private Instant createdAt; private Instant updatedAt; public Builder id(PackageId id) { this.id = id; return this; } public Builder name(String name) { this.name = name; return this; } public Builder description(String description) { this.description = description; return this; } public Builder format(PackageFormat format) { this.format = format; return this; } public Builder versions(List<PackageVersion> versions) { this.versions = versions; return this; } public Builder createdAt(Instant createdAt) { this.createdAt = createdAt; return this; } public Builder updatedAt(Instant updatedAt) { this.updatedAt = updatedAt; return this; } public Package build() { Objects.requireNonNull(id, "id is required"); Objects.requireNonNull(name, "name is required"); Objects.requireNonNull(format, "format is required"); Objects.requireNonNull(createdAt, "createdAt is required"); Objects.requireNonNull(updatedAt, "updatedAt is required"); return new Package(this); } } }