Update DB QuizQuestion and misc

This commit is contained in:
Thomas Fransolet 2025-07-15 16:30:01 +02:00
parent a051ae5f70
commit 9671361a34
11 changed files with 2777 additions and 89 deletions

View File

@ -106,6 +106,7 @@ namespace ManagerService.Data
{
Mobile,
Tablet,
Web,
VR
}

View File

@ -47,6 +47,10 @@ namespace ManagerService.Data
public bool IsQRCode { get; set; }
public bool IsSearchText { get; set; } // True if we want to have search box (text type), false otherwise
public bool IsSearchNumber { get; set; } // True if we want to have search box (number type), false otherwise
public ConfigurationDTO ToDTO(List<string> sectionIds)
{
return new ConfigurationDTO()

View File

@ -180,20 +180,6 @@ namespace ManagerService.Data
v => JsonSerializer.Serialize(v, options),
v => JsonSerializer.Deserialize<List<TranslationDTO>>(v, options));
modelBuilder.Entity<GuidedStep>()
.Property(gp => gp.ValidationQuestion)
.HasColumnType("jsonb")
.HasConversion(
v => JsonSerializer.Serialize(v, options),
v => JsonSerializer.Deserialize<List<TranslationDTO>>(v, options));
modelBuilder.Entity<GuidedStep>()
.Property(gp => gp.ExpectedAnswer)
.HasColumnType("jsonb")
.HasConversion(
v => JsonSerializer.Serialize(v, options),
v => JsonSerializer.Deserialize<List<TranslationDTO>>(v, options));
modelBuilder.Entity<GuidedStep>()
.Property(gp => gp.TimerExpiredMessage)
.HasColumnType("jsonb")
@ -201,13 +187,6 @@ namespace ManagerService.Data
v => JsonSerializer.Serialize(v, options),
v => JsonSerializer.Deserialize<List<TranslationDTO>>(v, options));
modelBuilder.Entity<GuidedStep>()
.Property(gp => gp.MultipleChoiceOptions)
.HasColumnType("jsonb")
.HasConversion(
v => JsonSerializer.Serialize(v, options),
v => JsonSerializer.Deserialize<List<ChoiceOptionDTO>>(v, options));
modelBuilder.Entity<EventAgenda>()
.Property(s => s.Label)
.HasColumnType("jsonb")

View File

@ -28,12 +28,28 @@ namespace ManagerService.Data.SubSection
[Required]
[Column(TypeName = "jsonb")]
public List<ResponseDTO> Responses { get; set; } // TODO check
public List<ResponseDTO> Responses { get; set; }
public string SectionQuizId { get; set; }
public string? SectionQuizId { get; set; }
[ForeignKey("SectionQuizId")]
public SectionQuiz SectionQuiz { get; set; }
public SectionQuiz? SectionQuiz { get; set; }
public string? GuidedStepId { get; set; }
[ForeignKey("GuidedStepId")]
public GuidedStep? GuidedStep { get; set; }
public QuestionType ValidationQuestionType { get; set; } = QuestionType.Simple;
public string? PuzzleImageId { get; set; }
public Resource? PuzzleImage { get; set; } // But only image is possible
public int? PuzzleRows { get; set; } = 3;
public int? PuzzleCols { get; set; } = 3;
public bool IsSlidingPuzzle { get; set; } = false;
// TODO
/*public TranslationDTO ToDTO()
@ -54,4 +70,11 @@ namespace ManagerService.Data.SubSection
};
}*/
}
public enum QuestionType
{
Simple, // Réponse texte libre
MultipleChoice, // Choix parmi plusieurs options
Puzzle
}
}

View File

@ -45,7 +45,8 @@ namespace ManagerService.Data.SubSection
public Geometry Geometry { get; set; } // Peut être Point, LineString, Polygon
public string PolyColor { get; set; }
public string Icon { get; set; } // icon material if point
public ResourceDTO IconResourceDTO { get; set; } // Icon if point
public string IconResourceId { get; set; } // Icon resource id
public Resource IconResource { get; set; } // Icon resource
}
public enum GeometryType

View File

@ -190,17 +190,8 @@ namespace ManagerService.Data.SubSection
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
public List<QuizQuestion>? QuizQuestions { get; set; } // One or multiple question
// Option : si true, cette étape a un compte à rebourds, false sinon
public bool IsStepTimer { get; set; } = false;
@ -216,18 +207,7 @@ namespace ManagerService.Data.SubSection
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")

File diff suppressed because it is too large Load Diff

View File

@ -0,0 +1,183 @@
using Microsoft.EntityFrameworkCore.Migrations;
#nullable disable
namespace ManagerService.Migrations
{
/// <inheritdoc />
public partial class UpdateGuidedStepQuizQuestionAndMisc : Migration
{
/// <inheritdoc />
protected override void Up(MigrationBuilder migrationBuilder)
{
migrationBuilder.DropColumn(
name: "ExpectedAnswer",
table: "GuidedSteps");
migrationBuilder.DropColumn(
name: "MultipleChoiceOptions",
table: "GuidedSteps");
migrationBuilder.DropColumn(
name: "ValidationQuestion",
table: "GuidedSteps");
migrationBuilder.DropColumn(
name: "ValidationQuestionType",
table: "GuidedSteps");
migrationBuilder.AddColumn<string>(
name: "GuidedStepId",
table: "QuizQuestions",
type: "text",
nullable: true);
migrationBuilder.AddColumn<bool>(
name: "IsSlidingPuzzle",
table: "QuizQuestions",
type: "boolean",
nullable: false,
defaultValue: false);
migrationBuilder.AddColumn<int>(
name: "PuzzleCols",
table: "QuizQuestions",
type: "integer",
nullable: true);
migrationBuilder.AddColumn<string>(
name: "PuzzleImageId",
table: "QuizQuestions",
type: "text",
nullable: true);
migrationBuilder.AddColumn<int>(
name: "PuzzleRows",
table: "QuizQuestions",
type: "integer",
nullable: true);
migrationBuilder.AddColumn<int>(
name: "ValidationQuestionType",
table: "QuizQuestions",
type: "integer",
nullable: false,
defaultValue: 0);
migrationBuilder.AddColumn<bool>(
name: "IsSearchNumber",
table: "Configurations",
type: "boolean",
nullable: false,
defaultValue: false);
migrationBuilder.AddColumn<bool>(
name: "IsSearchText",
table: "Configurations",
type: "boolean",
nullable: false,
defaultValue: false);
migrationBuilder.CreateIndex(
name: "IX_QuizQuestions_GuidedStepId",
table: "QuizQuestions",
column: "GuidedStepId");
migrationBuilder.CreateIndex(
name: "IX_QuizQuestions_PuzzleImageId",
table: "QuizQuestions",
column: "PuzzleImageId");
migrationBuilder.AddForeignKey(
name: "FK_QuizQuestions_GuidedSteps_GuidedStepId",
table: "QuizQuestions",
column: "GuidedStepId",
principalTable: "GuidedSteps",
principalColumn: "Id");
migrationBuilder.AddForeignKey(
name: "FK_QuizQuestions_Resources_PuzzleImageId",
table: "QuizQuestions",
column: "PuzzleImageId",
principalTable: "Resources",
principalColumn: "Id");
}
/// <inheritdoc />
protected override void Down(MigrationBuilder migrationBuilder)
{
migrationBuilder.DropForeignKey(
name: "FK_QuizQuestions_GuidedSteps_GuidedStepId",
table: "QuizQuestions");
migrationBuilder.DropForeignKey(
name: "FK_QuizQuestions_Resources_PuzzleImageId",
table: "QuizQuestions");
migrationBuilder.DropIndex(
name: "IX_QuizQuestions_GuidedStepId",
table: "QuizQuestions");
migrationBuilder.DropIndex(
name: "IX_QuizQuestions_PuzzleImageId",
table: "QuizQuestions");
migrationBuilder.DropColumn(
name: "GuidedStepId",
table: "QuizQuestions");
migrationBuilder.DropColumn(
name: "IsSlidingPuzzle",
table: "QuizQuestions");
migrationBuilder.DropColumn(
name: "PuzzleCols",
table: "QuizQuestions");
migrationBuilder.DropColumn(
name: "PuzzleImageId",
table: "QuizQuestions");
migrationBuilder.DropColumn(
name: "PuzzleRows",
table: "QuizQuestions");
migrationBuilder.DropColumn(
name: "ValidationQuestionType",
table: "QuizQuestions");
migrationBuilder.DropColumn(
name: "IsSearchNumber",
table: "Configurations");
migrationBuilder.DropColumn(
name: "IsSearchText",
table: "Configurations");
migrationBuilder.AddColumn<string>(
name: "ExpectedAnswer",
table: "GuidedSteps",
type: "jsonb",
nullable: true);
migrationBuilder.AddColumn<string>(
name: "MultipleChoiceOptions",
table: "GuidedSteps",
type: "jsonb",
nullable: true);
migrationBuilder.AddColumn<string>(
name: "ValidationQuestion",
table: "GuidedSteps",
type: "jsonb",
nullable: true);
migrationBuilder.AddColumn<int>(
name: "ValidationQuestionType",
table: "GuidedSteps",
type: "integer",
nullable: false,
defaultValue: 0);
}
}
}

File diff suppressed because it is too large Load Diff

View File

@ -0,0 +1,80 @@
using System;
using Microsoft.EntityFrameworkCore.Migrations;
#nullable disable
namespace ManagerService.Migrations
{
/// <inheritdoc />
public partial class UpdateMapAnnotation : Migration
{
/// <inheritdoc />
protected override void Up(MigrationBuilder migrationBuilder)
{
migrationBuilder.DropForeignKey(
name: "FK_MapAnnotation_ResourceDTO_IconResourceDTOid",
table: "MapAnnotation");
migrationBuilder.DropTable(
name: "ResourceDTO");
migrationBuilder.RenameColumn(
name: "IconResourceDTOid",
table: "MapAnnotation",
newName: "IconResourceId");
migrationBuilder.RenameIndex(
name: "IX_MapAnnotation_IconResourceDTOid",
table: "MapAnnotation",
newName: "IX_MapAnnotation_IconResourceId");
migrationBuilder.AddForeignKey(
name: "FK_MapAnnotation_Resources_IconResourceId",
table: "MapAnnotation",
column: "IconResourceId",
principalTable: "Resources",
principalColumn: "Id");
}
/// <inheritdoc />
protected override void Down(MigrationBuilder migrationBuilder)
{
migrationBuilder.DropForeignKey(
name: "FK_MapAnnotation_Resources_IconResourceId",
table: "MapAnnotation");
migrationBuilder.RenameColumn(
name: "IconResourceId",
table: "MapAnnotation",
newName: "IconResourceDTOid");
migrationBuilder.RenameIndex(
name: "IX_MapAnnotation_IconResourceId",
table: "MapAnnotation",
newName: "IX_MapAnnotation_IconResourceDTOid");
migrationBuilder.CreateTable(
name: "ResourceDTO",
columns: table => new
{
id = table.Column<string>(type: "text", nullable: false),
dateCreation = table.Column<DateTime>(type: "timestamp with time zone", nullable: false),
instanceId = table.Column<string>(type: "text", nullable: true),
label = table.Column<string>(type: "text", nullable: true),
type = table.Column<int>(type: "integer", nullable: false),
url = table.Column<string>(type: "text", nullable: true)
},
constraints: table =>
{
table.PrimaryKey("PK_ResourceDTO", x => x.id);
});
migrationBuilder.AddForeignKey(
name: "FK_MapAnnotation_ResourceDTO_IconResourceDTOid",
table: "MapAnnotation",
column: "IconResourceDTOid",
principalTable: "ResourceDTO",
principalColumn: "id");
}
}
}

View File

@ -27,31 +27,6 @@ namespace ManagerService.Migrations
NpgsqlModelBuilderExtensions.HasPostgresExtension(modelBuilder, "postgis");
NpgsqlModelBuilderExtensions.UseIdentityByDefaultColumns(modelBuilder);
modelBuilder.Entity("ManagerService.DTOs.ResourceDTO", b =>
{
b.Property<string>("id")
.HasColumnType("text");
b.Property<DateTime>("dateCreation")
.HasColumnType("timestamp with time zone");
b.Property<string>("instanceId")
.HasColumnType("text");
b.Property<string>("label")
.HasColumnType("text");
b.Property<int>("type")
.HasColumnType("integer");
b.Property<string>("url")
.HasColumnType("text");
b.HasKey("id");
b.ToTable("ResourceDTO");
});
modelBuilder.Entity("ManagerService.Data.AppConfigurationLink", b =>
{
b.Property<string>("Id")
@ -168,6 +143,12 @@ namespace ManagerService.Migrations
b.Property<bool>("IsQRCode")
.HasColumnType("boolean");
b.Property<bool>("IsSearchNumber")
.HasColumnType("boolean");
b.Property<bool>("IsSearchText")
.HasColumnType("boolean");
b.Property<string>("Label")
.IsRequired()
.HasColumnType("text");
@ -574,9 +555,6 @@ namespace ManagerService.Migrations
b.Property<string>("Description")
.HasColumnType("jsonb");
b.Property<string>("ExpectedAnswer")
.HasColumnType("jsonb");
b.Property<Geometry>("Geometry")
.HasColumnType("geometry");
@ -596,9 +574,6 @@ namespace ManagerService.Migrations
b.Property<bool>("IsStepTimer")
.HasColumnType("boolean");
b.Property<string>("MultipleChoiceOptions")
.HasColumnType("jsonb");
b.Property<int>("Order")
.HasColumnType("integer");
@ -615,12 +590,6 @@ namespace ManagerService.Migrations
b.Property<int?>("TriggerGeoPointId")
.HasColumnType("integer");
b.Property<string>("ValidationQuestion")
.HasColumnType("jsonb");
b.Property<int>("ValidationQuestionType")
.HasColumnType("integer");
b.Property<double?>("ZoneRadiusMeters")
.HasColumnType("double precision");
@ -641,6 +610,12 @@ namespace ManagerService.Migrations
NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property<int>("Id"));
b.Property<string>("GuidedStepId")
.HasColumnType("text");
b.Property<bool>("IsSlidingPuzzle")
.HasColumnType("boolean");
b.Property<List<TranslationAndResourceDTO>>("Label")
.IsRequired()
.HasColumnType("jsonb");
@ -648,6 +623,15 @@ namespace ManagerService.Migrations
b.Property<int>("Order")
.HasColumnType("integer");
b.Property<int?>("PuzzleCols")
.HasColumnType("integer");
b.Property<string>("PuzzleImageId")
.HasColumnType("text");
b.Property<int?>("PuzzleRows")
.HasColumnType("integer");
b.Property<string>("ResourceId")
.HasColumnType("text");
@ -658,8 +642,15 @@ namespace ManagerService.Migrations
b.Property<string>("SectionQuizId")
.HasColumnType("text");
b.Property<int>("ValidationQuestionType")
.HasColumnType("integer");
b.HasKey("Id");
b.HasIndex("GuidedStepId");
b.HasIndex("PuzzleImageId");
b.HasIndex("ResourceId");
b.HasIndex("SectionQuizId");
@ -681,7 +672,7 @@ namespace ManagerService.Migrations
b.Property<string>("Icon")
.HasColumnType("text");
b.Property<string>("IconResourceDTOid")
b.Property<string>("IconResourceId")
.HasColumnType("text");
b.Property<List<TranslationDTO>>("Label")
@ -698,7 +689,7 @@ namespace ManagerService.Migrations
b.HasKey("Id");
b.HasIndex("IconResourceDTOid");
b.HasIndex("IconResourceId");
b.HasIndex("ProgrammeBlockId");
@ -1095,6 +1086,14 @@ namespace ManagerService.Migrations
modelBuilder.Entity("ManagerService.Data.SubSection.QuizQuestion", b =>
{
b.HasOne("ManagerService.Data.SubSection.GuidedStep", "GuidedStep")
.WithMany("QuizQuestions")
.HasForeignKey("GuidedStepId");
b.HasOne("ManagerService.Data.Resource", "PuzzleImage")
.WithMany()
.HasForeignKey("PuzzleImageId");
b.HasOne("ManagerService.Data.Resource", "Resource")
.WithMany()
.HasForeignKey("ResourceId");
@ -1103,6 +1102,10 @@ namespace ManagerService.Migrations
.WithMany("QuizQuestions")
.HasForeignKey("SectionQuizId");
b.Navigation("GuidedStep");
b.Navigation("PuzzleImage");
b.Navigation("Resource");
b.Navigation("SectionQuiz");
@ -1110,15 +1113,15 @@ namespace ManagerService.Migrations
modelBuilder.Entity("ManagerService.Data.SubSection.SectionEvent+MapAnnotation", b =>
{
b.HasOne("ManagerService.DTOs.ResourceDTO", "IconResourceDTO")
b.HasOne("ManagerService.Data.Resource", "IconResource")
.WithMany()
.HasForeignKey("IconResourceDTOid");
.HasForeignKey("IconResourceId");
b.HasOne("ManagerService.Data.SubSection.SectionEvent+ProgrammeBlock", null)
.WithMany("MapAnnotations")
.HasForeignKey("ProgrammeBlockId");
b.Navigation("IconResourceDTO");
b.Navigation("IconResource");
});
modelBuilder.Entity("ManagerService.Data.SubSection.SectionEvent+ProgrammeBlock", b =>
@ -1156,6 +1159,11 @@ namespace ManagerService.Migrations
b.Navigation("Steps");
});
modelBuilder.Entity("ManagerService.Data.SubSection.GuidedStep", b =>
{
b.Navigation("QuizQuestions");
});
modelBuilder.Entity("ManagerService.Data.SubSection.SectionEvent+ProgrammeBlock", b =>
{
b.Navigation("MapAnnotations");