using ManagerService.DTOs; using System; using System.ComponentModel.DataAnnotations; using Microsoft.EntityFrameworkCore; namespace ManagerService.Data { /// /// Resource Information /// [Index(nameof(InstanceId))] public class Resource : IAuditableEntity { [Key] [Required] /*[BsonId] [BsonRepresentation(MongoDB.Bson.BsonType.ObjectId)]*/ public string Id { get; set; } /*[BsonElement("Type")] [BsonRequired]*/ [Required] public ResourceType Type { get; set; } /*[BsonElement("Label")] [BsonRequired]*/ [Required] public string Label { get; set; } /*[BsonElement("DateCreation")]*/ public DateTime DateCreation { get; set; } public DateTime DateUpdate { get; set; } /*[BsonElement("InstanceId")] [BsonRequired]*/ [Required] public string InstanceId { get; set; } /*[BsonElement("URL")]*/ public string Url { get; set; } // Firebase url public long SizeBytes { get; set; } = 0; /// /// Clé relative dans le stockage (`pictures/{instanceId}/{resourceId}`), source de vérité. /// L'URL absolue à jeton reste dans Url, mais elle n'est plus ce dont on part. /// public string StoragePath { get; set; } /// /// Vrai nom de fichier ("brochure-2026.pdf"). Ni Label (libellé libre) ni Url (jeton) /// ne le donnent — nécessaire pour choisir l'extracteur et citer la source. /// public string FileName { get; set; } /// Inclure ce document dans les connaissances du guide IA. Exposé dans l'UI en V2 seulement. public bool IncludeInAiKnowledge { get; set; } = false; public AiIndexStatus AiIndexStatus { get; set; } = AiIndexStatus.NotIndexed; /// Raison de l'échec d'indexation, affichée telle quelle au client. public string AiIndexMessage { get; set; } public DateTime? AiIndexedAt { get; set; } public int AiChunkCount { get; set; } = 0; public ResourceDTO ToDTO() { return new ResourceDTO() { id = Id, label = Label, type = Type, url = Url, dateCreation = DateCreation, dateUpdate = DateUpdate, instanceId = InstanceId, sizeBytes = SizeBytes }; } } public enum ResourceType { // ⚠️ Persisté en int. Ne JAMAIS réordonner ni insérer au milieu : les valeurs // existantes en base se décaleraient (les PDF deviendraient des JSON). // Toute nouvelle valeur s'ajoute à la fin. Image, // 0 Video, // 1 ImageUrl, // 2 VideoUrl, // 3 Audio, // 4 PDF, // 5 JSON, // 6 JSONUrl, // 7 Word, // 8 PowerPoint, // 9 Text // 10 } public enum AiIndexStatus { NotIndexed = 0, Pending = 1, Indexed = 2, Failed = 3 } }