Skip to content
Extraits de code Groupes Projets
Valider bd79e013 rédigé par Mohamed Lemine BAILLAHI's avatar Mohamed Lemine BAILLAHI
Parcourir les fichiers

Merge branch 'feature/IA-417' into 'develop'

Add media Models

Closes IA-417

See merge request !45
parents 382c27e8 5f5cd63d
Branches
Étiquettes
1 requête de fusion!45Add media Models
Pipeline #20770 réussi avec les étapes
in 6 minutes et 13 secondes
......@@ -18,22 +18,8 @@
- Any security improvements.
## [0.0.34-RELEASE]
### Added
- New attribut in homeworkinteraction and Child .
- Add media and Tag Models and enums for media service .
### Changed
- Changes in existing functionality.
### Deprecated
- Soon-to-be removed features.
### Removed
-delete 3 entites. .
### Fixed
- Any bug fixes.
### Security
- Any security improvements.
## [0.0.33-RELEASE]
### Changed
- Add new attributes in Plan and StripeConfig models that was missing.
......
package com.marketingconfort.brainboost_common.Media.enums;
public enum MultimediaFormat {
// Images
JPG, JPEG, PNG, GIF, SVG, WEBP, BMP,
// Videos
MP4, AVI, MOV, WMV, FLV, MKV, WEBM,
// Audio
MP3, WAV, AAC, OGG, FLAC, M4A,
// Documents
PDF, DOC, DOCX, PPT, PPTX, XLS, XLSX, TXT,
// Archives
ZIP, RAR, TAR, GZ,
// Folder
FOLDER;
public static MultimediaFormat fromString(String format) {
if(format == null || format.trim().isEmpty()){
return null;
}
try{
return MultimediaFormat.valueOf(format.toUpperCase());
}catch (IllegalArgumentException e ){
return null;
}
}
}
\ No newline at end of file
package com.marketingconfort.brainboost_common.Media.enums;
public enum MultimediaStatus {
ACTIVE("active"),
INACTIVE("inactive"),
DELETED("deleted");
private final String value ;
MultimediaStatus(String value) {
this.value = value;
}
public String getValue() {
return value;
}
}
package com.marketingconfort.brainboost_common.Media.enums;
import com.marketingconfort.starter.core.exceptions.FunctionalException;
public enum MultimediaType {
IMAGE("image"),
VIDEO("video"),
AUDIO("audio"),
PDF("pdf"),
DOCUMENT("document"),
ARCHIVE("archive"),
FOLDER("dossier");
private final String value ;
MultimediaType(String value) {
this.value = value ;
}
public String getValue() {
return value;
}
public static MultimediaType fromValue(String value) throws FunctionalException {
for( MultimediaType m : MultimediaType.values()){
if(m.value.equalsIgnoreCase(value)){
return m ;
}
} throw new FunctionalException("Unkown multimedia type" + value) ;
}
}
\ No newline at end of file
package com.marketingconfort.brainboost_common.Media.models;
import com.marketingconfort.brainboost_common.Media.enums.MultimediaFormat;
import com.marketingconfort.brainboost_common.Media.enums.MultimediaStatus;
import com.marketingconfort.brainboost_common.Media.enums.MultimediaType;
import jakarta.persistence.*;
import jakarta.validation.constraints.Min;
import jakarta.validation.constraints.NotBlank;
import jakarta.validation.constraints.NotNull;
import jakarta.validation.constraints.Size;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
import org.springframework.data.annotation.CreatedDate;
import org.springframework.data.annotation.LastModifiedDate;
import org.springframework.data.jpa.domain.support.AuditingEntityListener;
import java.time.LocalDateTime;
import java.util.HashSet;
import java.util.Set;
@Entity
@Table(name = "multimedia", indexes = {
@Index(name = "idx_multimedia_name", columnList = "name"),
@Index(name = "idx_multimedia_type", columnList = "type"),
@Index(name = "idx_multimedia_parent", columnList = "parent_id"),
@Index(name = "idx_multimedia_required", columnList = "required"),
@Index(name = "idx_multimedia_status", columnList = "status"),
@Index(name = "idx_multimedia_created", columnList = "created_at")
})
@Data
@NoArgsConstructor
@AllArgsConstructor
@Builder
@EntityListeners(AuditingEntityListener.class)
public class Multimedia {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
@NotBlank(message = "Multimedia name cannot be blank")
@Size(min = 1, max = 255, message = "Multimedia name must be between 1 and 255 characters")
@Column(name = "name", nullable = false)
private String name;
@NotNull(message = "Multimedia type is required")
@Enumerated(EnumType.STRING)
@Column(name = "type", nullable = false, length = 20)
private MultimediaType type;
@Min(value = 0, message = "File size cannot be negative")
@Column(name = "size")
private Long size;
@Size(max = 1000, message = "Description cannot exceed 1000 characters")
@Column(name = "description", length = 1000)
private String description;
@Size(max = 500, message = "URL cannot exceed 500 characters")
@Column(name = "url", length = 500)
private String url;
@Enumerated(EnumType.STRING)
@Column(name = "format", length = 10)
private MultimediaFormat format;
@Builder.Default
@Column(name = "required", nullable = false)
private Boolean required = false;
@Builder.Default
@Min(value = 0, message = "Number of associations cannot be negative")
@Column(name = "number_of_associations", nullable = false)
private Integer numberOfAssociations = 0;
@Builder.Default
@Min(value = 0, message = "Display order cannot be negative")
@Column(name = "display_order", nullable = false)
private Integer displayOrder = 0;
@Builder.Default
@NotNull
@Enumerated(EnumType.STRING)
@Column(name = "status", nullable = false, length = 20)
private MultimediaStatus status = MultimediaStatus.ACTIVE;
// Hierarchical structure for folders
@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "parent_id")
private Multimedia parent;
@OneToMany(mappedBy = "parent", cascade = CascadeType.ALL, fetch = FetchType.LAZY)
@Builder.Default
private Set<Multimedia> children = new HashSet<>();
// Tags association
@ManyToMany(fetch = FetchType.LAZY, cascade = {CascadeType.PERSIST, CascadeType.MERGE})
@JoinTable(
name = "multimedia_tags",
joinColumns = @JoinColumn(name = "multimedia_id"),
inverseJoinColumns = @JoinColumn(name = "tag_id"),
indexes = {
@Index(name = "idx_multimedia_tags_multimedia", columnList = "multimedia_id"),
@Index(name = "idx_multimedia_tags_tag", columnList = "tag_id")
}
)
@Builder.Default
private Set<Tag> tags = new HashSet<>();
// Audit fields
@CreatedDate
@Column(name = "created_at", nullable = false, updatable = false)
private LocalDateTime createdAt;
@LastModifiedDate
@Column(name = "last_modified_at")
private LocalDateTime lastModifiedAt;
@Column(name = "uploaded_at")
private LocalDateTime uploadedAt;
@Size(max = 100, message = "Created by field cannot exceed 100 characters")
@Column(name = "created_by", length = 100)
private String createdBy;
@Size(max = 100, message = "Updated by field cannot exceed 100 characters")
@Column(name = "updated_by", length = 100)
private String updatedBy;
public boolean isFolder() {
return type == MultimediaType.FOLDER;
}
public boolean isFile() {
return type != MultimediaType.FOLDER;
}
public String getFileExtension() {
if (name == null || isFolder()) {
return null;
}
int lastDotIndex = name.lastIndexOf('.');
return lastDotIndex > 0 ? name.substring(lastDotIndex + 1).toLowerCase() : null;
}
public String getFormattedSize() {
if (size == null || size == 0) {
return "0 B";
}
String[] units = {"B", "KB", "MB", "GB", "TB"};
int unitIndex = 0;
double fileSize = size.doubleValue();
while (fileSize >= 1024 && unitIndex < units.length - 1) {
fileSize /= 1024;
unitIndex++;
}
return Math.round(fileSize * 100.0) / 100.0 + " " + units[unitIndex];
}
public void addTag(Tag tag) {
if (tag != null) {
tags.add(tag);
tag.getMultimediaFiles().add(this);
}
}
public void removeTag(Tag tag) {
if (tag != null) {
tags.remove(tag);
tag.getMultimediaFiles().remove(this);
}
}
public void addChild(Multimedia child) {
if (child != null && isFolder()) {
children.add(child);
child.setParent(this);
}
}
public void removeChild(Multimedia child) {
if (child != null) {
children.remove(child);
child.setParent(null);
}
}
public void incrementAssociations() {
if (numberOfAssociations == null) {
numberOfAssociations = 0;
}
numberOfAssociations++;
required = true;
}
public void decrementAssociations() {
if (numberOfAssociations == null || numberOfAssociations <= 0) {
numberOfAssociations = 0;
required = false;
} else {
numberOfAssociations--;
if (numberOfAssociations == 0) {
required = false;
}
}
}
public boolean hasAssociations() {
return numberOfAssociations != null && numberOfAssociations > 0;
}
public String getFullPath() {
if (parent == null) {
return name;
}
return parent.getFullPath() + "/" + name;
}
public void softDelete() {
this.status = MultimediaStatus.DELETED;
}
public void activate() {
this.status = MultimediaStatus.ACTIVE;
}
public void deactivate() {
this.status = MultimediaStatus.INACTIVE;
}
public boolean isActive() {
return status == MultimediaStatus.ACTIVE;
}
public boolean isDeleted() {
return status == MultimediaStatus.DELETED;
}
}
\ No newline at end of file
package com.marketingconfort.brainboost_common.Media.models;
import com.fasterxml.jackson.annotation.JsonIgnore;
import jakarta.persistence.*;
import jakarta.validation.constraints.NotBlank;
import jakarta.validation.constraints.Size;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
import org.springframework.data.annotation.CreatedDate;
import org.springframework.data.annotation.LastModifiedDate;
import org.springframework.data.jpa.domain.support.AuditingEntityListener;
import java.time.LocalDateTime;
import java.util.HashSet;
import java.util.Set;
@Entity
@Table(name = "tags", indexes = {
@Index(name = "idx_tag_name", columnList = "name")
})
@Data
@NoArgsConstructor
@AllArgsConstructor
@Builder
@EntityListeners(AuditingEntityListener.class)
public class Tag {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
@NotBlank(message = "Tag name cannot be blank")
@Size(min = 2, max = 50, message = "Tag name must be between 2 and 50 characters")
@Column(name = "name", nullable = false, unique = true, length = 50)
private String name;
@Size(max = 255, message = "Tag description cannot exceed 255 characters")
@Column(name = "description")
private String description;
@CreatedDate
@Column(name = "created_at", nullable = false, updatable = false)
private LocalDateTime createdAt;
@LastModifiedDate
@Column(name = "updated_at")
private LocalDateTime updatedAt;
@JsonIgnore
@ManyToMany(mappedBy = "tags", fetch = FetchType.LAZY)
private Set<Multimedia> multimediaFiles = new HashSet<>();
public Tag(String name) {
this.name = name;
}
}
0% ou .
You are about to add 0 people to the discussion. Proceed with caution.
Terminez d'abord l'édition de ce message.
Veuillez vous inscrire ou vous pour commenter