From 149bd961e2f168b6aa2f96dd1f32ac7ce1a78bcb Mon Sep 17 00:00:00 2001 From: vladp Date: Tue, 25 Nov 2025 23:09:30 +0700 Subject: [PATCH] NCP-3 add UserContent entity --- .../no_copy/dto/UserContentResponse.java | 17 +++++ .../soune/no_copy/entity/ContentStatus.java | 5 ++ .../ru/soune/no_copy/entity/FileType.java | 5 ++ .../ru/soune/no_copy/entity/UserContent.java | 73 +++++++++++++++++++ .../repository/UserContentRepository.java | 20 +++++ 5 files changed, 120 insertions(+) create mode 100644 src/main/java/ru/soune/no_copy/dto/UserContentResponse.java create mode 100644 src/main/java/ru/soune/no_copy/entity/ContentStatus.java create mode 100644 src/main/java/ru/soune/no_copy/entity/FileType.java create mode 100644 src/main/java/ru/soune/no_copy/entity/UserContent.java create mode 100644 src/main/java/ru/soune/no_copy/repository/UserContentRepository.java diff --git a/src/main/java/ru/soune/no_copy/dto/UserContentResponse.java b/src/main/java/ru/soune/no_copy/dto/UserContentResponse.java new file mode 100644 index 0000000..86d1d84 --- /dev/null +++ b/src/main/java/ru/soune/no_copy/dto/UserContentResponse.java @@ -0,0 +1,17 @@ +package ru.soune.no_copy.dto; + +import ru.soune.no_copy.entity.ContentStatus; +import ru.soune.no_copy.entity.FileType; + +import java.time.LocalDateTime; + +public record UserContentResponse( + Long id, + String filename, + String originalFilename, + FileType fileType, + long fileSize, + String filePath, + ContentStatus status, + LocalDateTime uploadDate +) {} diff --git a/src/main/java/ru/soune/no_copy/entity/ContentStatus.java b/src/main/java/ru/soune/no_copy/entity/ContentStatus.java new file mode 100644 index 0000000..4009ee9 --- /dev/null +++ b/src/main/java/ru/soune/no_copy/entity/ContentStatus.java @@ -0,0 +1,5 @@ +package ru.soune.no_copy.entity; + +public enum ContentStatus { + PROCESSING, COMPLETED, ERROR +} diff --git a/src/main/java/ru/soune/no_copy/entity/FileType.java b/src/main/java/ru/soune/no_copy/entity/FileType.java new file mode 100644 index 0000000..b07bc9b --- /dev/null +++ b/src/main/java/ru/soune/no_copy/entity/FileType.java @@ -0,0 +1,5 @@ +package ru.soune.no_copy.entity; + +public enum FileType { + PHOTO, DOCUMENT, AUDIO, VIDEO +} diff --git a/src/main/java/ru/soune/no_copy/entity/UserContent.java b/src/main/java/ru/soune/no_copy/entity/UserContent.java new file mode 100644 index 0000000..eda224a --- /dev/null +++ b/src/main/java/ru/soune/no_copy/entity/UserContent.java @@ -0,0 +1,73 @@ +package ru.soune.no_copy.entity; + +import jakarta.persistence.*; +import lombok.*; +import org.hibernate.annotations.CreationTimestamp; + +import java.time.LocalDateTime; + +@Entity +@NoArgsConstructor +@AllArgsConstructor +@Builder +@Getter @Setter +@Table(name = "user_content", +indexes = { + @Index(name = "idx_user_id", columnList = "user_id"), + @Index(name = "idx_file_type", columnList = "file_type"), + @Index(name = "idx_upload_date", columnList = "upload_date") +}) +public class UserContent { + + @Id + @GeneratedValue(strategy = GenerationType.IDENTITY) + private Long id; + + @ManyToOne(fetch = FetchType.LAZY) + @JoinColumn(name = "user_id", nullable = false, + foreignKey = @ForeignKey(name = "fk_usercontent_user")) + private User user; + + @Column(nullable = false) + private String filename; + + @Column(name = "original_filename", nullable = false) + private String originalFilename; + + @Enumerated(EnumType.STRING) + @Column(name = "file_type", nullable = false, length = 16) + private FileType fileType; + + @Column(name = "file_extension", length = 16) + private String fileExtension; + + @Column(name = "file_size", nullable = false) + private Long fileSize; + + @Column(name = "file_path", columnDefinition = "TEXT", nullable = false) + private String filePath; + + @Column(name = "protection_level") + private Integer protectionLevel; + + @Column(name = "geometric_resistant") + private Boolean geometricResistant = false; + + @Column(name = "watermark_applied") + private Boolean watermarkApplied = false; + + @Column(name = "protection_hash", length = 64) + private String protectionHash; + + @Column(name = "watermark_id", length = 50) + private String watermarkId; + + @Enumerated(EnumType.STRING) + @Column(length = 16) + private ContentStatus status = ContentStatus.PROCESSING; + + @CreationTimestamp + @Column(name = "upload_date", nullable = false, updatable = false) + private LocalDateTime uploadDate; +} + diff --git a/src/main/java/ru/soune/no_copy/repository/UserContentRepository.java b/src/main/java/ru/soune/no_copy/repository/UserContentRepository.java new file mode 100644 index 0000000..aad8c79 --- /dev/null +++ b/src/main/java/ru/soune/no_copy/repository/UserContentRepository.java @@ -0,0 +1,20 @@ +package ru.soune.no_copy.repository; + +import org.springframework.data.domain.Pageable; +import org.springframework.data.jpa.repository.JpaRepository; +import ru.soune.no_copy.entity.FileType; +import ru.soune.no_copy.entity.UserContent; + +import java.util.List; + +public interface UserContentRepository extends JpaRepository { + List findByUserIdOrderByUploadDateDesc(Long userId); + + List findByUserIdAndFileTypeOrderByUploadDateDesc( + Long userId, FileType type, Pageable pageable + ); + + long countByUserIdAndFileType(Long userId, FileType type); + + long countByUserId(Long userId); +}