2025-07-09 17:44:48 +02:00

297 lines
10 KiB
C#
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

using Manager.DTOs;
using ManagerService.DTOs;
using System;
using System.Collections.Generic;
using System.ComponentModel.DataAnnotations;
using System.ComponentModel.DataAnnotations.Schema;
using System.Linq;
using static ManagerService.Data.SubSection.SectionEvent;
namespace ManagerService.Data.SubSection
{
/// <summary>
/// Section map
/// </summary>
public class SectionMap : Section
{
public int MapZoom { get; set; } // Default = 18
public MapTypeApp? MapMapType { get; set; } // Default = Hybrid for Google
public MapTypeMapBox? MapTypeMapbox { get; set; } // Default = standard for MapBox
public MapProvider? MapMapProvider { get; set; } // Default = Google
public List<GeoPoint> MapPoints { get; set; }
public string MapResourceId { get; set; }
public Resource MapResource { get; set; } // Icon
[Required]
[Column(TypeName = "jsonb")]
public List<CategorieDTO> MapCategories { get; set; }
public string MapCenterLatitude { get; set; } // Center on
public string MapCenterLongitude { get; set; } // Center on
public MapDTO ToDTO()
{
return new MapDTO()
{
id = Id,
label = Label,
title = Title.ToList(),
description = Description.ToList(),
order = Order,
type = Type,
imageId = ImageId,
imageSource = ImageSource,
configurationId = ConfigurationId,
isSubSection = IsSubSection,
parentId = ParentId,
dateCreation = DateCreation,
instanceId = InstanceId,
isBeacon = IsBeacon,
beaconId = BeaconId,
latitude = Latitude,
longitude = Longitude,
meterZoneGPS = MeterZoneGPS,
zoom = MapZoom,
mapType = MapMapType,
mapTypeMapbox = MapTypeMapbox,
mapProvider = MapMapProvider,
iconResourceId = MapResourceId,
categories = MapCategories,
centerLatitude = MapCenterLatitude,
centerLongitude = MapCenterLongitude
};
}
}
public class GeoPoint
{
[Required]
public int? Id { get; set; }
[Required]
[Column(TypeName = "jsonb")]
public List<TranslationDTO> Title { get; set; }
[Required]
[Column(TypeName = "jsonb")]
public List<TranslationDTO> Description { get; set; }
[Required]
[Column(TypeName = "jsonb")]
public List<ContentDTO> Contents { get; set; }
public int? CategorieId { get; set; }
public GeometryType GeometryType { get; set; }
[Column(TypeName = "jsonb")]
public List<Coordinate> Coordinates { get; set; } = new(); // 1 point = marker, plusieurs = polyline/polygon
public string PolyColor { get; set; } // color of the polyline or polygon
public string ImageResourceId { get; set; }
public string ImageUrl { get; set; }
[Required]
[Column(TypeName = "jsonb")]
public List<TranslationDTO> Schedules { get; set; }
[Required]
[Column(TypeName = "jsonb")]
public List<TranslationDTO> Prices { get; set; }
[Required]
[Column(TypeName = "jsonb")]
public List<TranslationDTO> Phone { get; set; }
[Required]
[Column(TypeName = "jsonb")]
public List<TranslationDTO> Email { get; set; }
[Required]
[Column(TypeName = "jsonb")]
public List<TranslationDTO> Site { get; set; }
public string? SectionMapId { get; set; }
[ForeignKey(nameof(SectionMapId))]
public SectionMap? SectionMap { get; set; }
public string? SectionEventId { get; set; }
[ForeignKey(nameof(SectionEventId))]
public SectionEvent? SectionEvent { get; set; }
}
public class GuidedPath // Parcours
{
[Key]
public string Id { get; set; }
[Required]
public string InstanceId { get; set; }
[Required]
[Column(TypeName = "jsonb")]
public List<TranslationDTO> Title { get; set; }
[Column(TypeName = "jsonb")]
public List<TranslationDTO> Description { get; set; }
// Lié à une carte (optionnel)
public string? SectionMapId { get; set; }
[ForeignKey("SectionMapId")]
public SectionMap? SectionMap { get; set; }
// Lié à un événement (optionnel)
public string? SectionEventId { get; set; }
[ForeignKey("SectionEventId")]
public SectionEvent? SectionEvent { get; set; }
// Type de parcours
public bool IsLinear { get; set; } = true; // Avancer dans lordre - Ordre obligatoire
public bool RequireSuccessToAdvance { get; set; } = false; // Par exemple: résoudre une énigme
public bool HideNextStepsUntilComplete { get; set; } = false; // Étapes cachées tant que non terminées
public int Order { get; set; }
public List<GuidedStep> Steps { get; set; } = new();
}
public class GuidedStep // Étape dun parcours
{
[Key]
public string Id { get; set; }
[Required]
public string GuidedPathId { get; set; }
[ForeignKey("GuidedPathId")]
public GuidedPath GuidedPath { get; set; }
public int Order { get; set; }
[Required]
[Column(TypeName = "jsonb")]
public List<TranslationDTO> Title { get; set; }
[Column(TypeName = "jsonb")]
public List<TranslationDTO> Description { get; set; }
public GeometryType GeometryType { get; set; } = GeometryType.Point; // Polygon, Circle, Point
[Column(TypeName = "jsonb")]
public List<Coordinate> Coordinates { get; set; } = new(); // Polygon ou centre du cercle
public double? ZoneRadiusMeters { get; set; } // Optionnel, utile si zone cercle ou point
public string ImageUrl { get; set; }
public int? TriggerGeoPointId { get; set; } // Lieu lié à l'étape et genre si on veut plus d'info ou pourrait afficher les infos du geopoint.
[ForeignKey("TriggerGeoPointId")]
public GeoPoint TriggerGeoPoint { get; set; }
public bool IsHiddenInitially { get; set; } = false;
public QuestionType ValidationQuestionType { get; set; } = QuestionType.Simple;
// Exemple pour escape game
[Column(TypeName = "jsonb")]
public List<TranslationDTO> ValidationQuestion { get; set; } // TODO type of question ? choix multiple ou direct ?
[Column(TypeName = "jsonb")]
public List<TranslationDTO> ExpectedAnswer { get; set; }
[Column(TypeName = "jsonb")]
public List<ChoiceOptionDTO> MultipleChoiceOptions { get; set; } // Pour choix multiples
// Option : si true, cette étape a un compte à rebourds, false sinon
public bool IsStepTimer { get; set; } = false;
// Option : si true, cette étape doit être validée avant de passer à la suivante
public bool IsStepLocked { get; set; } = true;
// Timer en secondes (durée max pour valider cette étape, optionnel)
public int? TimerSeconds { get; set; }
// Option : message ou action à effectuer si timer expire (ex: afficher aide, fin du jeu...)
[Column(TypeName = "jsonb")]
public List<TranslationDTO> TimerExpiredMessage { get; set; }
}
public class ChoiceOptionDTO
{
public string Id { get; set; } // Identifiant unique pour la réponse
public List<TranslationDTO> Label { get; set; } // Texte à afficher
public bool IsCorrect { get; set; } // Indique si cest une bonne réponse
}
public enum QuestionType
{
Simple, // Réponse texte libre
MultipleChoice // Choix parmi plusieurs options
}
// SectionMap "normal" comme avant => Via geopoints. Si il y a des guidedPath lié à la sectionMap alors il y a un parcours lié à la sectionMap, tu peux aussi avoir des geopoints classique mis là + des parcours. et aussi lier un guidedstep à un geopoint (pour le trigger et aussi pour "afficher plus")
// parcours libre
/*{
"IsLinear": false,
"RequireSuccessToAdvance": false,
"HideNextStepsUntilComplete": false,
"Steps": [
{ "Title": "La tour", "GeoPointId": "...", "IsOptional": false },
{ "Title": "Les jardins", "GeoPointId": "...", "IsOptional": false }
]
}*/
// Parcours escape game
/*{
"IsLinear": true,
"RequireSuccessToAdvance": true,
"HideNextStepsUntilComplete": true,
"Steps": [
{ "Title": "Enigme 1", "RiddleQuestion": "Quel est le code ?", "RiddleAnswer": "1234" },
{ "Title": "Enigme 2", "RiddleQuestion": "Combien de colonnes ?", "RiddleAnswer": "6" }
]
}*/
/*
* {
"Id": "escape001",
"IsLinear": true,
"RequireSuccessToAdvance": true,
"HideNextStepsUntilComplete": true,
"Steps": [
{
"Id": "step1",
"Title": [{ "Lang": "fr", "Text": "Enigme 1" }],
"TriggerGeoPoint": {
"GeometryType": "Circle",
"Coordinates": [{ "Latitude": 49.5, "Longitude": 5.9 }],
"ZoneRadiusMeters": 30
},
"ValidationQuestion": [{ "Lang": "fr", "Text": "Quel est le code secret ?" }],
"ExpectedAnswer": [{ "Lang": "fr", "Text": "1234" }],
"IsStepTimer": true,
"TimerSeconds": 300,
"IsStepLocked": true
},
{
"Id": "step2",
"Title": [{ "Lang": "fr", "Text": "Enigme 2" }],
"TriggerGeoPoint": {
"GeometryType": "Point",
"Coordinates": [{ "Latitude": 49.51, "Longitude": 5.91 }]
},
"ValidationQuestion": [{ "Lang": "fr", "Text": "Combien de colonnes ?" }],
"ExpectedAnswer": [{ "Lang": "fr", "Text": "6" }],
"IsStepTimer": false,
"IsStepLocked": true
}
]
}
*/
}