Split resource in Resource and resourceData + Add Audio ResourceType

This commit is contained in:
Fransolet Thomas 2022-10-26 17:11:45 +02:00
parent 390852ce4f
commit cf2d7759de
7 changed files with 205 additions and 25 deletions

View File

@ -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; }
}
}

View File

@ -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
}
}

View File

@ -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
{
/// <summary>
/// Resource Information
/// </summary>
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; }
}
}

View File

@ -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<ConfigurationController> _logger;
private readonly IConfiguration _configuration;
public ConfigurationController(IConfiguration configuration, ILogger<ConfigurationController> logger, ConfigurationDatabaseService configurationService, SectionDatabaseService sectionService, ResourceDatabaseService resourceService, DeviceDatabaseService deviceService)
public ConfigurationController(IConfiguration configuration, ILogger<ConfigurationController> 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<ResourceDTO> addResourceToList(List<ResourceDTO> 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;

View File

@ -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<ResourceController> _logger;
public ResourceController(ILogger<ResourceController> logger, ResourceDatabaseService resourceService, SectionDatabaseService sectionService, ConfigurationDatabaseService configurationService)
public ResourceController(ILogger<ResourceController> 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<Resource> resources = _resourceService.GetAll(instanceId);
return new OkObjectResult(resources.Select(r => r.ToDTO(r.Type == ResourceType.ImageUrl)));
List<ResourceDTO> resourceDTOs = new List<ResourceDTO>();
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
}
}
/// <summary>
/// Get a specific resource
/// </summary>
@ -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<Resource> resources = new List<Resource>();
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;
}
/// <summary>
/// Create a new resource
/// </summary>
@ -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 };

View File

@ -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<ResourceData> _ResourcesData;
public ResourceDataDatabaseService(IConfiguration config)
{
var client = new MongoClient(config.GetConnectionString("TabletDb"));
var database = client.GetDatabase("TabletDb");
_ResourcesData = database.GetCollection<ResourceData>("ResourcesData");
}
public List<ResourceData> GetAll(string instanceId)
{
return _ResourcesData.Find(r => r.InstanceId == instanceId).ToList();
}
public ResourceData GetById(string id)
{
return _ResourcesData.Find<ResourceData>(r => r.Id == id).FirstOrDefault();
}
public ResourceData GetByResourceId(string id)
{
return _ResourcesData.Find<ResourceData>(r => r.ResourceId == id).FirstOrDefault();
}
public bool IsExist(string id)
{
return _ResourcesData.Find<ResourceData>(r => r.Id == id).FirstOrDefault() != null ? true : false;
}
public bool IsExistResourceId(string id)
{
return _ResourcesData.Find<ResourceData>(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);
}
}
}

View File

@ -139,6 +139,7 @@ namespace ManagerService
services.AddScoped<SectionDatabaseService>();
services.AddScoped<ConfigurationDatabaseService>();
services.AddScoped<ResourceDatabaseService>();
services.AddScoped<ResourceDataDatabaseService>();
services.AddScoped<LanguageInit>();
services.AddScoped<DeviceDatabaseService>();
services.AddScoped<InstanceDatabaseService>();