From cf2d7759deab3bb50c3618f4b3d15483f6817a3f Mon Sep 17 00:00:00 2001 From: Fransolet Thomas Date: Wed, 26 Oct 2022 17:11:45 +0200 Subject: [PATCH] Split resource in Resource and resourceData + Add Audio ResourceType --- Manager.Interfaces/DTO/ResourceDTO.cs | 2 +- Manager.Interfaces/Models/Resource.cs | 11 +- Manager.Interfaces/Models/ResourceData.cs | 31 ++++++ .../Controllers/ConfigurationController.cs | 19 +++- .../Controllers/ResourceController.cs | 102 +++++++++++++++--- .../Services/ResourceDataDatabaseService.cs | 64 +++++++++++ ManagerService/Startup.cs | 1 + 7 files changed, 205 insertions(+), 25 deletions(-) create mode 100644 Manager.Interfaces/Models/ResourceData.cs create mode 100644 ManagerService/Services/ResourceDataDatabaseService.cs diff --git a/Manager.Interfaces/DTO/ResourceDTO.cs b/Manager.Interfaces/DTO/ResourceDTO.cs index e9ed14d..63353f6 100644 --- a/Manager.Interfaces/DTO/ResourceDTO.cs +++ b/Manager.Interfaces/DTO/ResourceDTO.cs @@ -10,8 +10,8 @@ namespace Manager.Interfaces.DTO public string id { get; set; } public ResourceType type { get; set; } public string label { get; set; } - public DateTime dateCreation { get; set; } public string data { get; set; } + public DateTime dateCreation { get; set; } public string instanceId { get; set; } } } diff --git a/Manager.Interfaces/Models/Resource.cs b/Manager.Interfaces/Models/Resource.cs index 6e27168..57ca86f 100644 --- a/Manager.Interfaces/Models/Resource.cs +++ b/Manager.Interfaces/Models/Resource.cs @@ -27,22 +27,18 @@ namespace Manager.Interfaces.Models [BsonElement("DateCreation")] public DateTime DateCreation { get; set; } - [BsonElement("Data")] - [BsonRequired] - public string Data { get; set; } - [BsonElement("InstanceId")] [BsonRequired] public string InstanceId { get; set; } - public ResourceDTO ToDTO(bool isExport = false) + public ResourceDTO ToDTO(string data = null) // { return new ResourceDTO() { id = Id, label = Label, type = Type, - data = isExport ? Data : null, + data = data, dateCreation = DateCreation, instanceId = InstanceId }; @@ -54,6 +50,7 @@ namespace Manager.Interfaces.Models Image, Video, ImageUrl, - VideoUrl + VideoUrl, + Audio } } diff --git a/Manager.Interfaces/Models/ResourceData.cs b/Manager.Interfaces/Models/ResourceData.cs new file mode 100644 index 0000000..1a2c292 --- /dev/null +++ b/Manager.Interfaces/Models/ResourceData.cs @@ -0,0 +1,31 @@ +using Manager.Interfaces.DTO; +using MongoDB.Bson.Serialization.Attributes; +using System; +using System.Collections.Generic; +using System.Text; + + +namespace Manager.Interfaces.Models +{ + /// + /// Resource Information + /// + public class ResourceData + { + [BsonId] + [BsonRepresentation(MongoDB.Bson.BsonType.ObjectId)] + public string Id { get; set; } + + [BsonElement("Data")] + [BsonRequired] + public string Data { get; set; } + + [BsonElement("ResourceId")] + [BsonRequired] + public string ResourceId { get; set; } + + [BsonElement("InstanceId")] + [BsonRequired] + public string InstanceId { get; set; } + } +} diff --git a/ManagerService/Controllers/ConfigurationController.cs b/ManagerService/Controllers/ConfigurationController.cs index 5e91972..ac63e49 100644 --- a/ManagerService/Controllers/ConfigurationController.cs +++ b/ManagerService/Controllers/ConfigurationController.cs @@ -25,17 +25,19 @@ namespace ManagerService.Controllers private ConfigurationDatabaseService _configurationService; private SectionDatabaseService _sectionService; private ResourceDatabaseService _resourceService; + private ResourceDataDatabaseService _resourceDataService; private DeviceDatabaseService _deviceService; private readonly ILogger _logger; private readonly IConfiguration _configuration; - public ConfigurationController(IConfiguration configuration, ILogger logger, ConfigurationDatabaseService configurationService, SectionDatabaseService sectionService, ResourceDatabaseService resourceService, DeviceDatabaseService deviceService) + public ConfigurationController(IConfiguration configuration, ILogger logger, ConfigurationDatabaseService configurationService, SectionDatabaseService sectionService, ResourceDatabaseService resourceService, ResourceDataDatabaseService resourceDataService, DeviceDatabaseService deviceService) { _logger = logger; _configuration = configuration; _configurationService = configurationService; _sectionService = sectionService; _resourceService = resourceService; + _resourceDataService = resourceDataService; _deviceService = deviceService; } @@ -586,19 +588,28 @@ namespace ManagerService.Controllers resource.Type = resourceExport.type; resource.Label = resourceExport.label; resource.DateCreation = resourceExport.dateCreation; - resource.Data = resourceExport.data; + //resource.Data = resourceExport.data; + + ResourceData resourceData = new ResourceData(); + resourceData.ResourceId = resourceExport.id; + resourceData.InstanceId = resourceExport.instanceId; + resourceData.Data = resourceExport.data; if (!_resourceService.IsExist(resourceExport.id)) _resourceService.Create(resource); + + if (!_resourceDataService.IsExist(resourceExport.id)) + _resourceDataService.Create(resourceData); } } private List addResourceToList(List resourceDTOs, string resourceId) { if (!resourceDTOs.Select(r => r.id).Contains(resourceId)) { Resource resource = _resourceService.GetById(resourceId); + ResourceData resourceData = _resourceDataService.GetByResourceId(resourceId); - if (resource != null) { - resourceDTOs.Add(resource.ToDTO(true)); + if (resource != null && resourceData != null) { + resourceDTOs.Add(resource.ToDTO(resourceData.Data)); } } return resourceDTOs; diff --git a/ManagerService/Controllers/ResourceController.cs b/ManagerService/Controllers/ResourceController.cs index 85d61bc..dbe7f0c 100644 --- a/ManagerService/Controllers/ResourceController.cs +++ b/ManagerService/Controllers/ResourceController.cs @@ -26,14 +26,16 @@ namespace ManagerService.Controllers public class ResourceController : ControllerBase { private ResourceDatabaseService _resourceService; + private ResourceDataDatabaseService _resourceDataService; private SectionDatabaseService _sectionService; private ConfigurationDatabaseService _configurationService; private readonly ILogger _logger; - public ResourceController(ILogger logger, ResourceDatabaseService resourceService, SectionDatabaseService sectionService, ConfigurationDatabaseService configurationService) + public ResourceController(ILogger logger, ResourceDatabaseService resourceService, ResourceDataDatabaseService resourceDataService, SectionDatabaseService sectionService, ConfigurationDatabaseService configurationService) { _logger = logger; _resourceService = resourceService; + _resourceDataService = resourceDataService; _sectionService = sectionService; _configurationService = configurationService; } @@ -51,7 +53,20 @@ namespace ManagerService.Controllers { List resources = _resourceService.GetAll(instanceId); - return new OkObjectResult(resources.Select(r => r.ToDTO(r.Type == ResourceType.ImageUrl))); + List resourceDTOs = new List(); + foreach(var resource in resources) + { + ResourceDTO resourceDTO = new ResourceDTO(); + resourceDTO = resource.ToDTO(); + if(resource.Type == ResourceType.ImageUrl) + { + var resourceData = _resourceDataService.GetByResourceId(resource.Id); + resourceDTO.data = resourceData != null ? resourceData.Data : null; + } + resourceDTOs.Add(resourceDTO); + } + + return new OkObjectResult(resourceDTOs); } catch (Exception ex) { @@ -59,7 +74,6 @@ namespace ManagerService.Controllers } } - /// /// Get a specific resource /// @@ -78,7 +92,15 @@ namespace ManagerService.Controllers if (resource == null) throw new KeyNotFoundException("This resource was not found"); - return new OkObjectResult(resource.ToDTO(resource.Type == ResourceType.ImageUrl)); + ResourceDTO resourceDTO = new ResourceDTO(); + resourceDTO = resource.ToDTO(); + if (resource.Type == ResourceType.ImageUrl) + { + var resourceData = _resourceDataService.GetByResourceId(resource.Id); + resourceDTO.data = resourceData != null ? resourceData.Data : null; + } + + return new OkObjectResult(resourceDTO); } catch (KeyNotFoundException ex) { @@ -104,17 +126,18 @@ namespace ManagerService.Controllers try { Resource resource = _resourceService.GetById(id); + ResourceData resourceData = _resourceDataService.GetByResourceId(id); - if (resource == null) + if (resource == null || resourceData == null) throw new KeyNotFoundException("This resource was not found"); - var file = Convert.FromBase64String(resource.Data); + var file = Convert.FromBase64String(resourceData.Data); if (resource.Type == ResourceType.Image) { return new FileContentResult(file, "image/png"); } - if (resource.Type == ResourceType.Video) + if (resource.Type == ResourceType.Video || resource.Type == ResourceType.Audio) { return new FileContentResult(file, "application/octet-stream"); } @@ -145,6 +168,7 @@ namespace ManagerService.Controllers if (label == null || type == null || instanceId == null) throw new ArgumentNullException("One of resource params is null"); + var resourceType = (ResourceType)Enum.Parse(typeof(ResourceType), type); List resources = new List(); foreach (var file in Request.Form.Files) @@ -152,24 +176,36 @@ namespace ManagerService.Controllers if (file.Length > 0) { var stringResult = ""; - if (file.Length > 0) + double fileSizeibMbs = (double) ((double)file.Length) / (1024*1024); + if (fileSizeibMbs <= 2.01) { using (var ms = new MemoryStream()) { file.CopyTo(ms); var fileBytes = ms.ToArray(); + if (resourceType == ResourceType.Image) { + fileBytes = AddWatermark(fileBytes); + } stringResult = Convert.ToBase64String(fileBytes); } + } else + { + throw new FileLoadException(message: "Fichier inexistant ou trop volumineux (max 2Mb)"); } // Todo add some verification ? Resource resource = new Resource(); resource.Label = label; - resource.Type = (ResourceType)Enum.Parse(typeof(ResourceType), type); + resource.Type = resourceType; resource.DateCreation = DateTime.Now; - resource.Data = stringResult; resource.InstanceId = instanceId; Resource resourceCreated = _resourceService.Create(resource); resources.Add(resourceCreated); + + ResourceData resourceData = new ResourceData(); + resourceData.Data = stringResult; + resourceData.ResourceId = resourceCreated.Id; + resourceData.InstanceId = stringResult; + ResourceData resourceDataCreated = _resourceDataService.Create(resourceData); } } return Ok(resources.Select(r => r.ToDTO())); @@ -178,6 +214,10 @@ namespace ManagerService.Controllers { return new BadRequestObjectResult(ex.Message) { }; } + catch (FileLoadException ex) + { + return new BadRequestObjectResult(ex.Message) { }; + } catch (InvalidOperationException ex) { return new ConflictObjectResult(ex.Message) { }; @@ -188,6 +228,37 @@ namespace ManagerService.Controllers } } + private static byte[] AddWatermark(Byte[] bytes) + { + byte[] convertedToBytes; + + using (MemoryStream originalImageMemoryStream = new MemoryStream(bytes)) + { + using (Image image = Image.FromStream(originalImageMemoryStream)) + { + Font font = new Font("Arial", 25, FontStyle.Italic, GraphicsUnit.Pixel); + Color color = Color.DarkBlue; + Point point = new Point(image.Width /2, (int)Math.Round(image.Height - image.Height * 0.1)); + SolidBrush brush = new SolidBrush(color); + using (Graphics graphics = Graphics.FromImage(image)) + { + StringFormat stringFormat = new StringFormat(); + stringFormat.Alignment = StringAlignment.Center; + stringFormat.LineAlignment = StringAlignment.Center; + graphics.DrawString("fortsaintheribert.be", font, brush, point, stringFormat); + } + + using (MemoryStream updatedImageMemorySteam = new MemoryStream()) + { + image.Save(updatedImageMemorySteam, System.Drawing.Imaging.ImageFormat.Jpeg); + convertedToBytes = updatedImageMemorySteam.ToArray(); + } + } + } + + return convertedToBytes; + } + /// /// Create a new resource /// @@ -210,12 +281,12 @@ namespace ManagerService.Controllers resource.Label = newResource.label; resource.Type = newResource.type; resource.DateCreation = DateTime.Now; - resource.Data = newResource.data; + //resource.Data = newResource.data; resource.InstanceId = newResource.instanceId; Resource resourceCreated = _resourceService.Create(resource); - return new OkObjectResult(resourceCreated.ToDTO(resource.Type == ResourceType.ImageUrl)); + return new OkObjectResult(resourceCreated.ToDTO()); // WITHOUT DATA } catch (ArgumentNullException ex) { @@ -257,7 +328,7 @@ namespace ManagerService.Controllers resource.InstanceId = updatedResource.instanceId; resource.Label = updatedResource.label; resource.Type = updatedResource.type; - resource.Data = updatedResource.data; + //resource.Data = updatedResource.data; // NOT ALLOWED Resource resourceModified = _resourceService.Update(updatedResource.id, resource); @@ -295,6 +366,7 @@ namespace ManagerService.Controllers throw new ArgumentNullException("Resource param is null"); var ressource = _resourceService.GetById(id); + var ressourceData = _resourceDataService.GetByResourceId(id); if (ressource == null) throw new KeyNotFoundException("Resource does not exist"); @@ -389,6 +461,10 @@ namespace ManagerService.Controllers } _resourceService.Remove(id); + if (ressourceData != null) + { + _resourceDataService.Remove(ressourceData.Id); + } return new ObjectResult("The resource has been deleted") { StatusCode = 202 }; diff --git a/ManagerService/Services/ResourceDataDatabaseService.cs b/ManagerService/Services/ResourceDataDatabaseService.cs new file mode 100644 index 0000000..11a38c6 --- /dev/null +++ b/ManagerService/Services/ResourceDataDatabaseService.cs @@ -0,0 +1,64 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Threading.Tasks; +using Manager.Interfaces.Models; +using Microsoft.Extensions.Configuration; +using MongoDB.Driver; + +namespace Manager.Services +{ + public class ResourceDataDatabaseService + { + private readonly IMongoCollection _ResourcesData; + + public ResourceDataDatabaseService(IConfiguration config) + { + var client = new MongoClient(config.GetConnectionString("TabletDb")); + var database = client.GetDatabase("TabletDb"); + _ResourcesData = database.GetCollection("ResourcesData"); + } + public List GetAll(string instanceId) + { + return _ResourcesData.Find(r => r.InstanceId == instanceId).ToList(); + } + + public ResourceData GetById(string id) + { + return _ResourcesData.Find(r => r.Id == id).FirstOrDefault(); + } + + public ResourceData GetByResourceId(string id) + { + return _ResourcesData.Find(r => r.ResourceId == id).FirstOrDefault(); + } + + public bool IsExist(string id) + { + return _ResourcesData.Find(r => r.Id == id).FirstOrDefault() != null ? true : false; + } + + public bool IsExistResourceId(string id) + { + return _ResourcesData.Find(r => r.ResourceId == id).FirstOrDefault() != null ? true : false; + } + + public ResourceData Create(ResourceData resource) + { + _ResourcesData.InsertOne(resource); + return resource; + } + + public ResourceData Update(string id, ResourceData resourceIn) + { + _ResourcesData.ReplaceOne(r => r.Id == id, resourceIn); + return resourceIn; + } + + public void Remove(string id) + { + _ResourcesData.DeleteOne(r => r.Id == id); + } + + } +} diff --git a/ManagerService/Startup.cs b/ManagerService/Startup.cs index 862a43d..4818f89 100644 --- a/ManagerService/Startup.cs +++ b/ManagerService/Startup.cs @@ -139,6 +139,7 @@ namespace ManagerService services.AddScoped(); services.AddScoped(); services.AddScoped(); + services.AddScoped(); services.AddScoped(); services.AddScoped(); services.AddScoped();