Thomas Fransolet fa92395d17 D2 : exposer DateUpdate sur ResourceDTO pour le filtre incremental
Le client ne pouvait pas savoir qu'une ressource avait change : il ne
recevait que dateCreation. La colonne existait deja sur l'entite, elle
n'etait simplement pas serialisee.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-08-12 17:46:37 +02:00

111 lines
3.2 KiB
C#

using ManagerService.DTOs;
using System;
using System.ComponentModel.DataAnnotations;
using Microsoft.EntityFrameworkCore;
namespace ManagerService.Data
{
/// <summary>
/// Resource Information
/// </summary>
[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;
/// <summary>
/// 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.
/// </summary>
public string StoragePath { get; set; }
/// <summary>
/// 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.
/// </summary>
public string FileName { get; set; }
/// <summary>Inclure ce document dans les connaissances du guide IA. Exposé dans l'UI en V2 seulement.</summary>
public bool IncludeInAiKnowledge { get; set; } = false;
public AiIndexStatus AiIndexStatus { get; set; } = AiIndexStatus.NotIndexed;
/// <summary>Raison de l'échec d'indexation, affichée telle quelle au client.</summary>
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
}
}