Skip to content
Extraits de code Groupes Projets
Valider 1cd70a9e rédigé par zakariaeyahya's avatar zakariaeyahya
Parcourir les fichiers

Merge branch 'develop' of...

Merge branch 'develop' of http://mc-git.com/marketing-confort/brainboost/brainboost-common into develop
parents 2bd6b997 66e1f3e9
Branches
Étiquettes
1 requête de fusion!48Resolve IA-439 "Feauture/"
Affichage de
avec 527 ajouts et 102 suppressions
## [0.0.34-RELEASE]
## [0.0.37-RELEASE]
### Added
- New features that have been added.
......@@ -16,6 +16,46 @@
### Security
- Any security improvements.
## [0.0.36-RELEASE]
### Added
- Added child management models (BeachSchedule, RestrictionContent, RestrictionTime, SettingsRestriction) and WeekDay enum for parental control features.
### Changed
- Changes in existing functionality.
### Deprecated
- Soon-to-be removed features.
### Removed
- Features that have been removed.
### Fixed
- Any bug fixes.
### Security
- Any security improvements.
## [0.0.35-RELEASE]
### Added
- New features that have been added.
### Changed
- Changes in existing functionality.
### Deprecated
- Soon-to-be removed features.
### Removed
- Features that have been removed.
### Fixed
- Any bug fixes.
### Security
- Any security improvements.
## [0.0.34-RELEASE]
### Added
- Add media and Tag Models and enums for media service .
## [0.0.33-RELEASE]
### Changed
- Add new attributes in Plan and StripeConfig models that was missing.
......
......@@ -5,13 +5,13 @@
<parent>
<groupId>com.marketingconfort</groupId>
<artifactId>mc-starter-parent</artifactId>
<version>1.0.60-RELEASE</version>
<version>1.0.63-RELEASE</version>
<relativePath/>
</parent>
<groupId>com.marketingconfort</groupId>
<artifactId>brainboost-common</artifactId>
<version>0.0.34-SNAPSHOT</version>
<version>0.0.37-SNAPSHOT</version>
<name>brainboost-common</name>
<description>Brain Boost common project </description>
<url/>
......
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;
}
}
package com.marketingconfort.brainboost_common.assistant_devoir.models;
import com.marketingconfort.brainboost_common.assistant_devoir.enums.*;
......@@ -61,10 +62,13 @@ public class HomeworkInteraction extends BaseEntity {
@Column(name = "conversion_timestamp")
private LocalDateTime conversionTimestamp;
@Column(name = "conversation_context", columnDefinition = "TEXT")
private String conversationContext;
@PrePersist
protected void onCreate() {
if (interactionDate == null) {
interactionDate = LocalDateTime.now();
}
}
}
}
\ No newline at end of file
package com.marketingconfort.brainboost_common.childManage.enums;
public enum WeekDay {
LUN, MAR, MER, JEU, VEN, SAM, DIM
}
package com.marketingconfort.brainboost_common.childManage.model;
import jakarta.persistence.Embeddable;
import lombok.Data;
import lombok.NoArgsConstructor;
@Data
@NoArgsConstructor
@Embeddable
public class AllowedTimeRange {
private int startHour;
private int startMinute;
private int endHour;
private int endMinute;
}
\ No newline at end of file
package com.marketingconfort.brainboost_common.childManage.model;
import jakarta.persistence.*;
import lombok.Data;
import lombok.NoArgsConstructor;
@Data
@NoArgsConstructor
@Entity
public class RestrictionContent {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
private boolean isRestrictionJapprends;
private boolean isRestrictionAccueilAssistant;
private boolean isRestrictionChallenge;
private boolean isRestrictionSearch;
}
package com.marketingconfort.brainboost_common.childManage.model;
import com.marketingconfort.brainboost_common.childManage.enums.WeekDay;
import jakarta.persistence.*;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.time.LocalTime;
import java.util.List;
@Data
@NoArgsConstructor
@Entity
@Table(name = "restriction_time")
public class RestrictionTime {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
private LocalTime maxUseDaytime;
@ElementCollection
@Enumerated(EnumType.STRING)
@CollectionTable(
name = "restriction_time_days_allowed",
joinColumns = @JoinColumn(name = "restriction_time_id")
)
@Column(name = "allowed_day")
private List<WeekDay> allowedDays;
@Embedded
private AllowedTimeRange allowedTimeRange;
}
package com.marketingconfort.brainboost_common.childManage.model;
import jakarta.persistence.*;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.util.List;
@Data
@NoArgsConstructor
@Entity
public class SettingsRestriction {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
@ElementCollection
private List<String> forbiddenWords;
@OneToOne(cascade = CascadeType.ALL)
private RestrictionTime restrictionTime;
@OneToOne(cascade = CascadeType.ALL)
private RestrictionContent restrictionContent;
}
package com.marketingconfort.brainboost_common.subjectmanagement.models;
import com.marketingconfort.brainboost_common.usermanagement.models.Admin;
import jakarta.persistence.*;
import lombok.*;
import java.util.*;
@Entity
@Getter
@Setter
@NoArgsConstructor
@AllArgsConstructor
public class Comment extends BaseEntity{
private String content;
@ManyToOne
@JoinColumn(name = "improvement_id")
private Improvement improvement;
@ManyToOne
@JoinColumn(name = "admin_id")
private Admin author;
@OneToMany(cascade = CascadeType.ALL)
@JoinColumn(name = "comment_id")
private List<Multimedia> attachments;
}
package com.marketingconfort.brainboost_common.subjectmanagement.models;
import com.marketingconfort.brainboost_common.subjectmanagement.enums.ImprovementStatus;
import com.marketingconfort.brainboost_common.subjectmanagement.enums.ImprovementType;
import com.marketingconfort.brainboost_common.subjectmanagement.mock.Exercise;
import com.marketingconfort.brainboost_common.usermanagement.models.Admin;
import jakarta.persistence.*;
import lombok.*;
import java.util.*;
@Entity
@Getter
@Setter
@NoArgsConstructor
@AllArgsConstructor
public class Improvement extends BaseEntity{
private String title;
private String description;
@Enumerated(EnumType.STRING)
private ImprovementStatus status;
@Enumerated(EnumType.STRING)
private ImprovementType type;
@OneToMany(cascade = CascadeType.ALL)
@JoinColumn(name = "improvement_id")
private List<Multimedia> attachments;
@OneToMany(mappedBy = "improvement", cascade = CascadeType.ALL)
private List<Comment> comments;
@ManyToOne
@JoinColumn(name = "level_id")
private Level level;
@ManyToOne
@JoinColumn(name = "subject_id")
private Subject subject;
@ManyToOne
@JoinColumn(name = "chapter_id")
private Chapter chapter;
@ManyToOne
@JoinColumn(name = "exercise_id")
private Exercise exercise;
@ManyToOne
@JoinColumn(name = "assignedby_id")
private Admin assignedBy;
@ManyToMany
@JoinTable(
name = "improvement_admin",
joinColumns = @JoinColumn(name = "improvement_id"),
inverseJoinColumns = @JoinColumn(name = "admin_id")
)
private List<Admin> assignedAdmins;
}
package com.marketingconfort.brainboost_common.subjectmanagement.models;
import com.marketingconfort.brainboost_common.subjectmanagement.enums.MultimediaType;
import jakarta.persistence.*;
import lombok.*;
import java.util.*;
@Entity
@Getter
@Setter
@NoArgsConstructor
@AllArgsConstructor
public class Multimedia extends BaseEntity{
private String name;
@Enumerated(EnumType.STRING)
private MultimediaType type;
private String format;
private Long size;
private String url;
@Temporal(TemporalType.TIMESTAMP)
private Date uploadedAt;
}
......@@ -20,5 +20,5 @@ public class Child extends User {
@OneToMany(mappedBy = "child", cascade = CascadeType.ALL, orphanRemoval = true)
private List<TimeScreen> timeScreens = new ArrayList<>();
private Long levelId;
}
\ No newline at end of file
@Column(name = "level_id") // Ajouter explicitement si nécessaire
private Long levelId;}
\ No newline at end of file
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