Update agenda sync (image management) + update isStatistics to hasStats (subscription plan)

This commit is contained in:
Thomas Fransolet 2026-05-07 22:00:42 +02:00
parent 9633ae43b7
commit 674655eb80
13 changed files with 3243 additions and 34 deletions

View File

@ -53,7 +53,7 @@ namespace ManagerService.Controllers
return new OkObjectResult(applicationInstances.Select(ai => { return new OkObjectResult(applicationInstances.Select(ai => {
var dto = ai.ToDTO(_myInfoMateDbContext); var dto = ai.ToDTO(_myInfoMateDbContext);
dto.isStatistic = instance?.IsStatistic ?? false; dto.hasStats = instance?.HasStats ?? false;
return dto; return dto;
}).OrderBy(c => c.appType)); }).OrderBy(c => c.appType));
} }

View File

@ -190,7 +190,6 @@ namespace ManagerService.Controllers
instance.Name = updatedInstance.name ?? instance.Name; instance.Name = updatedInstance.name ?? instance.Name;
instance.PinCode = updatedInstance.pinCode ?? instance.PinCode; instance.PinCode = updatedInstance.pinCode ?? instance.PinCode;
instance.IsPushNotification = updatedInstance.isPushNotification ?? instance.IsPushNotification; instance.IsPushNotification = updatedInstance.isPushNotification ?? instance.IsPushNotification;
instance.IsStatistic = updatedInstance.isStatistic ?? instance.IsStatistic;
instance.IsMobile = updatedInstance.isMobile ?? instance.IsMobile; instance.IsMobile = updatedInstance.isMobile ?? instance.IsMobile;
instance.IsTablet = updatedInstance.isTablet ?? instance.IsTablet; instance.IsTablet = updatedInstance.isTablet ?? instance.IsTablet;
instance.IsWeb = updatedInstance.isWeb ?? instance.IsWeb; instance.IsWeb = updatedInstance.isWeb ?? instance.IsWeb;

View File

@ -84,7 +84,7 @@ namespace ManagerService.Controllers
[ProducesResponseType(typeof(string), 404)] [ProducesResponseType(typeof(string), 404)]
[ProducesResponseType(typeof(string), 500)] [ProducesResponseType(typeof(string), 500)]
[HttpGet("{sectionAgendaId}/events/upcoming")] [HttpGet("{sectionAgendaId}/events/upcoming")]
public ObjectResult GetUpcomingEventAgendas(string sectionAgendaId) public ObjectResult GetUpcomingEventAgendas(string sectionAgendaId, [FromQuery] string? language = null)
{ {
try try
{ {
@ -96,6 +96,7 @@ namespace ManagerService.Controllers
var today = DateTime.Today; var today = DateTime.Today;
var upcoming = sectionAgenda.EventAgendas var upcoming = sectionAgenda.EventAgendas
.Where(ea => ea.DateFrom == null || ea.DateFrom >= today) .Where(ea => ea.DateFrom == null || ea.DateFrom >= today)
.Where(ea => language == null || ea.Label.Any(l => l.language == language))
.OrderBy(ea => ea.DateFrom) .OrderBy(ea => ea.DateFrom)
.Select(ea => ea.ToDTO()); .Select(ea => ea.ToDTO());

View File

@ -36,6 +36,6 @@ namespace ManagerService.DTOs
public bool isAssistant { get; set; } public bool isAssistant { get; set; }
public bool isStatistic { get; set; } public bool hasStats { get; set; }
} }
} }

View File

@ -10,7 +10,6 @@ namespace ManagerService.DTOs
public DateTime? dateCreation { get; set; } public DateTime? dateCreation { get; set; }
public string pinCode { get; set; } public string pinCode { get; set; }
public bool? isPushNotification { get; set; } public bool? isPushNotification { get; set; }
public bool? isStatistic { get; set; }
public bool? isMobile { get; set; } public bool? isMobile { get; set; }
public bool? isTablet { get; set; } public bool? isTablet { get; set; }
public bool? isWeb { get; set; } public bool? isWeb { get; set; }

View File

@ -24,8 +24,6 @@ namespace ManagerService.Data
public bool IsPushNotification { get; set; } public bool IsPushNotification { get; set; }
public bool IsStatistic { get; set; }
public bool IsMobile { get; set; } public bool IsMobile { get; set; }
public bool IsTablet { get; set; } public bool IsTablet { get; set; }
@ -69,7 +67,6 @@ namespace ManagerService.Data
dateCreation = DateCreation, dateCreation = DateCreation,
pinCode = PinCode, pinCode = PinCode,
isPushNotification = IsPushNotification, isPushNotification = IsPushNotification,
isStatistic = IsStatistic,
isMobile = IsMobile, isMobile = IsMobile,
isTablet = IsTablet, isTablet = IsTablet,
isWeb = IsWeb, isWeb = IsWeb,
@ -96,7 +93,6 @@ namespace ManagerService.Data
DateCreation = instanceDTO.dateCreation != null ? instanceDTO.dateCreation.Value : DateTime.Now.ToUniversalTime(); DateCreation = instanceDTO.dateCreation != null ? instanceDTO.dateCreation.Value : DateTime.Now.ToUniversalTime();
PinCode = instanceDTO.pinCode; PinCode = instanceDTO.pinCode;
IsPushNotification = instanceDTO.isPushNotification ?? false; IsPushNotification = instanceDTO.isPushNotification ?? false;
IsStatistic = instanceDTO.isStatistic ?? false;
IsMobile = instanceDTO.isMobile ?? false; IsMobile = instanceDTO.isMobile ?? false;
IsTablet = instanceDTO.isTablet ?? false; IsTablet = instanceDTO.isTablet ?? false;
IsWeb = instanceDTO.isWeb ?? false; IsWeb = instanceDTO.isWeb ?? false;

View File

@ -38,6 +38,8 @@ namespace ManagerService.Data.SubSection
public Resource Resource { get; set; } // Background image public Resource Resource { get; set; } // Background image
public string? SyncedImageUrl { get; set; } // External image URL from sync (no Resource record created)
public string? VideoResourceId { get; set; } public string? VideoResourceId { get; set; }
[ForeignKey("VideoResourceId")] [ForeignKey("VideoResourceId")]
@ -79,7 +81,7 @@ namespace ManagerService.Data.SubSection
dateTo = DateTo, dateTo = DateTo,
website = Website, website = Website,
resourceId = ResourceId, resourceId = ResourceId,
resource = Resource?.ToDTO(), resource = Resource?.ToDTO() ?? (SyncedImageUrl != null ? new ResourceDTO { url = SyncedImageUrl, type = ResourceType.ImageUrl } : null),
videoResourceId = VideoResourceId, videoResourceId = VideoResourceId,
videoResource = VideoResource?.ToDTO(), videoResource = VideoResource?.ToDTO(),
address = Address != null ? new EventAddressDTO address = Address != null ? new EventAddressDTO

File diff suppressed because it is too large Load Diff

View File

@ -0,0 +1,28 @@
using Microsoft.EntityFrameworkCore.Migrations;
#nullable disable
namespace ManagerService.Migrations
{
/// <inheritdoc />
public partial class AddEventAgendaSyncedImageUrl : Migration
{
/// <inheritdoc />
protected override void Up(MigrationBuilder migrationBuilder)
{
migrationBuilder.AddColumn<string>(
name: "SyncedImageUrl",
table: "EventAgendas",
type: "text",
nullable: true);
}
/// <inheritdoc />
protected override void Down(MigrationBuilder migrationBuilder)
{
migrationBuilder.DropColumn(
name: "SyncedImageUrl",
table: "EventAgendas");
}
}
}

File diff suppressed because it is too large Load Diff

View File

@ -0,0 +1,29 @@
using Microsoft.EntityFrameworkCore.Migrations;
#nullable disable
namespace ManagerService.Migrations
{
/// <inheritdoc />
public partial class RemoveIsStatistic : Migration
{
/// <inheritdoc />
protected override void Up(MigrationBuilder migrationBuilder)
{
migrationBuilder.DropColumn(
name: "IsStatistic",
table: "Instances");
}
/// <inheritdoc />
protected override void Down(MigrationBuilder migrationBuilder)
{
migrationBuilder.AddColumn<bool>(
name: "IsStatistic",
table: "Instances",
type: "boolean",
nullable: false,
defaultValue: false);
}
}
}

View File

@ -363,9 +363,6 @@ namespace ManagerService.Migrations
b.Property<bool>("IsPushNotification") b.Property<bool>("IsPushNotification")
.HasColumnType("boolean"); .HasColumnType("boolean");
b.Property<bool>("IsStatistic")
.HasColumnType("boolean");
b.Property<bool>("IsTablet") b.Property<bool>("IsTablet")
.HasColumnType("boolean"); .HasColumnType("boolean");
@ -608,6 +605,9 @@ namespace ManagerService.Migrations
b.Property<string>("SectionEventId") b.Property<string>("SectionEventId")
.HasColumnType("text"); .HasColumnType("text");
b.Property<string>("SyncedImageUrl")
.HasColumnType("text");
b.Property<string>("Type") b.Property<string>("Type")
.HasColumnType("text"); .HasColumnType("text");

View File

@ -51,7 +51,6 @@ namespace ManagerService.Services
var section = db.Sections.OfType<SectionAgenda>() var section = db.Sections.OfType<SectionAgenda>()
.Include(sa => sa.EventAgendas) .Include(sa => sa.EventAgendas)
.ThenInclude(ea => ea.Resource)
.FirstOrDefault(sa => sa.Id == sectionAgendaId); .FirstOrDefault(sa => sa.Id == sectionAgendaId);
if (section == null || !section.IsOnlineAgenda || section.AgendaResourceIds == null) if (section == null || !section.IsOnlineAgenda || section.AgendaResourceIds == null)
@ -84,12 +83,13 @@ namespace ManagerService.Services
{ {
var dateFrom = remote.GetDateFrom(); var dateFrom = remote.GetDateFrom();
// Match on DateFrom (date part only), restricted to IsSynced events // Match by date + name in the current language
var existing = section.EventAgendas.FirstOrDefault(ea => var existing = section.EventAgendas.FirstOrDefault(ea =>
ea.IsSynced && ea.IsSynced &&
ea.DateFrom.HasValue && ea.DateFrom.HasValue &&
dateFrom.HasValue && dateFrom.HasValue &&
ea.DateFrom.Value.Date == dateFrom.Value.Date); ea.DateFrom.Value.Date == dateFrom.Value.Date &&
ea.Label.Any(l => l.language == resourceRef.language && l.value == remote.name));
if (existing == null) if (existing == null)
{ {
@ -117,24 +117,8 @@ namespace ManagerService.Services
existing.IdVideoYoutube = remote.id_video_youtube; existing.IdVideoYoutube = remote.id_video_youtube;
existing.IsSynced = true; existing.IsSynced = true;
if (!string.IsNullOrEmpty(remote.image) && string.IsNullOrEmpty(existing.ResourceId)) if (!string.IsNullOrEmpty(remote.image) && string.IsNullOrEmpty(existing.SyncedImageUrl))
{ existing.SyncedImageUrl = remote.image;
var imageResource = db.Resources.FirstOrDefault(r => r.Url == remote.image && r.InstanceId == section.InstanceId);
if (imageResource == null)
{
imageResource = new Resource
{
Id = Guid.NewGuid().ToString(),
Type = ResourceType.ImageUrl,
Label = remote.name ?? "agenda-image",
Url = remote.image,
InstanceId = section.InstanceId,
DateCreation = DateTime.UtcNow,
};
db.Resources.Add(imageResource);
}
existing.ResourceId = imageResource.Id;
}
} }
} }