From 731690191b861875d2fc0b8dcd455b20c5d0740c Mon Sep 17 00:00:00 2001 From: hsiegeln <37154749+hsiegeln@users.noreply.github.com> Date: Sat, 4 Apr 2026 17:42:08 +0200 Subject: [PATCH] feat: add app entity and repository --- .../siegeln/cameleer/saas/app/AppEntity.java | 81 +++++++++++++++++++ .../cameleer/saas/app/AppRepository.java | 24 ++++++ 2 files changed, 105 insertions(+) create mode 100644 src/main/java/net/siegeln/cameleer/saas/app/AppEntity.java create mode 100644 src/main/java/net/siegeln/cameleer/saas/app/AppRepository.java diff --git a/src/main/java/net/siegeln/cameleer/saas/app/AppEntity.java b/src/main/java/net/siegeln/cameleer/saas/app/AppEntity.java new file mode 100644 index 0000000..eeecc7e --- /dev/null +++ b/src/main/java/net/siegeln/cameleer/saas/app/AppEntity.java @@ -0,0 +1,81 @@ +package net.siegeln.cameleer.saas.app; + +import jakarta.persistence.*; +import java.time.Instant; +import java.util.UUID; + +@Entity +@Table(name = "apps") +public class AppEntity { + + @Id + @GeneratedValue(strategy = GenerationType.UUID) + private UUID id; + + @Column(name = "environment_id", nullable = false) + private UUID environmentId; + + @Column(nullable = false, length = 100) + private String slug; + + @Column(name = "display_name", nullable = false) + private String displayName; + + @Column(name = "jar_storage_path", length = 500) + private String jarStoragePath; + + @Column(name = "jar_checksum", length = 64) + private String jarChecksum; + + @Column(name = "jar_original_filename") + private String jarOriginalFilename; + + @Column(name = "jar_size_bytes") + private Long jarSizeBytes; + + @Column(name = "current_deployment_id") + private UUID currentDeploymentId; + + @Column(name = "previous_deployment_id") + private UUID previousDeploymentId; + + @Column(name = "created_at", nullable = false) + private Instant createdAt; + + @Column(name = "updated_at", nullable = false) + private Instant updatedAt; + + @PrePersist + protected void onCreate() { + createdAt = Instant.now(); + updatedAt = Instant.now(); + } + + @PreUpdate + protected void onUpdate() { + updatedAt = Instant.now(); + } + + public UUID getId() { return id; } + public void setId(UUID id) { this.id = id; } + public UUID getEnvironmentId() { return environmentId; } + public void setEnvironmentId(UUID environmentId) { this.environmentId = environmentId; } + public String getSlug() { return slug; } + public void setSlug(String slug) { this.slug = slug; } + public String getDisplayName() { return displayName; } + public void setDisplayName(String displayName) { this.displayName = displayName; } + public String getJarStoragePath() { return jarStoragePath; } + public void setJarStoragePath(String jarStoragePath) { this.jarStoragePath = jarStoragePath; } + public String getJarChecksum() { return jarChecksum; } + public void setJarChecksum(String jarChecksum) { this.jarChecksum = jarChecksum; } + public String getJarOriginalFilename() { return jarOriginalFilename; } + public void setJarOriginalFilename(String jarOriginalFilename) { this.jarOriginalFilename = jarOriginalFilename; } + public Long getJarSizeBytes() { return jarSizeBytes; } + public void setJarSizeBytes(Long jarSizeBytes) { this.jarSizeBytes = jarSizeBytes; } + public UUID getCurrentDeploymentId() { return currentDeploymentId; } + public void setCurrentDeploymentId(UUID currentDeploymentId) { this.currentDeploymentId = currentDeploymentId; } + public UUID getPreviousDeploymentId() { return previousDeploymentId; } + public void setPreviousDeploymentId(UUID previousDeploymentId) { this.previousDeploymentId = previousDeploymentId; } + public Instant getCreatedAt() { return createdAt; } + public Instant getUpdatedAt() { return updatedAt; } +} diff --git a/src/main/java/net/siegeln/cameleer/saas/app/AppRepository.java b/src/main/java/net/siegeln/cameleer/saas/app/AppRepository.java new file mode 100644 index 0000000..c10f379 --- /dev/null +++ b/src/main/java/net/siegeln/cameleer/saas/app/AppRepository.java @@ -0,0 +1,24 @@ +package net.siegeln.cameleer.saas.app; + +import org.springframework.data.jpa.repository.JpaRepository; +import org.springframework.data.jpa.repository.Query; +import org.springframework.stereotype.Repository; + +import java.util.List; +import java.util.Optional; +import java.util.UUID; + +@Repository +public interface AppRepository extends JpaRepository { + + List findByEnvironmentId(UUID environmentId); + + Optional findByEnvironmentIdAndSlug(UUID environmentId, String slug); + + boolean existsByEnvironmentIdAndSlug(UUID environmentId, String slug); + + @Query("SELECT COUNT(a) FROM AppEntity a JOIN EnvironmentEntity e ON a.environmentId = e.id WHERE e.tenantId = :tenantId") + long countByTenantId(UUID tenantId); + + long countByEnvironmentId(UUID environmentId); +}