initial commit from an older template

This commit is contained in:
2025-09-20 22:33:35 +03:00
commit b6778046c2
134 changed files with 6657 additions and 0 deletions

21
Models/DTO/AuthDTO.cs Executable file
View File

@@ -0,0 +1,21 @@
using System.ComponentModel.DataAnnotations;
namespace GamificationService.Models.DTO;
public class AuthDTO
{
[Required]
[StringLength(50, MinimumLength = 3, ErrorMessage = "Username must be between 3 and 50 characters")]
public string Username { get; set; } = null!;
[Required]
[EmailAddress(ErrorMessage = "Invalid email address")]
public string Email { get; set; } = null!;
[Required]
[StringLength(100, MinimumLength = 8, ErrorMessage = "Password must be between 8 and 100 characters")]
public string Password { get; set; } = null!;
[Required]
public bool RememberMe { get; set; }
}

View File

@@ -0,0 +1,7 @@
namespace GamificationService.Models.DTO;
public class DisableTwoFactorDTO
{
public int TwoFactorProvider { get; set; }
public string Code { get; set; }
}

View File

@@ -0,0 +1,6 @@
namespace GamificationService.Models.DTO;
public class EnableTwoFactorDTO
{
public int TwoFactorProvider { get; set; }
}

View File

@@ -0,0 +1,11 @@
using GamificationService.Models.Database;
namespace GamificationService.Models.DTO;
public class GetAllRightsResponse
{
public List<Right> Rights { get; set; }
public int TotalCount { get; set; }
public int PageNumber { get; set; }
public int PageSize { get; set; }
}

View File

@@ -0,0 +1,11 @@
using GamificationService.Models.Database;
namespace GamificationService.Models.DTO;
public class GetAllRolesResponse
{
public List<ApplicationRole> Roles { get; set; }
public int TotalCount { get; set; }
public int PageNumber { get; set; }
public int PageSize { get; set; }
}

View File

@@ -0,0 +1,11 @@
using System.ComponentModel.DataAnnotations;
namespace GamificationService.Models.DTO;
public class GetTwoFactorDTO
{
[Required]
public int TwoFactorProvider { get; set; }
[StringLength(50, MinimumLength = 3, ErrorMessage = "Username must be between 3 and 50 characters")]
public string? Username { get; set; } = null!;
}

View File

@@ -0,0 +1,14 @@
using System.ComponentModel.DataAnnotations;
namespace GamificationService.Models.DTO;
public class InstructionCategoryCreateDTO
{
public long? Id { get; set; }
[Required(ErrorMessage = "Title is required")]
public string Title { get; set; } = null!;
}

View File

@@ -0,0 +1,10 @@
namespace GamificationService.Models.DTO;
public class InstructionCategoryDTO
{
public long? Id { get; set; }
public string? Title { get; set; } = null!;
}

View File

@@ -0,0 +1,38 @@
using System.ComponentModel.DataAnnotations;
namespace GamificationService.Models.DTO;
public class InstructionCreateDTO
{
public long? Id { get; set; }
[Required(ErrorMessage = "Title is required")]
public string Title { get; set; } = null!;
public string? Description { get; set; }
[Required(ErrorMessage = "Paragraphs are required")]
public List<InstructionParagraphCreateDTO> Paragraphs { get; set; } = null!;
[Required(ErrorMessage = "Category id is required")]
public long CategoryId { get; set; }
/// <summary>
/// If AssignDate is set, the instruction will be automatically enabled
/// when the date is reached. If it's not set, the test will automatically
/// obtain the current date as its AssignDate as soon as the instruction
/// will be enabled by the IsEnabled parameter.
/// </summary>
public DateTime? AssignDate { get; set; }
/// <summary>
/// When deadline is reached, no more submissions are allowed for this instruction.
/// </summary>
public DateTime? DeadlineDate { get; set; }
/// <summary>
/// Disabled instructions cannot be seen by users.
/// Tests for such instructions cannot be submitted either.
/// </summary>
public bool IsEnabled { get; set; } = false;
}

View File

@@ -0,0 +1,21 @@
namespace GamificationService.Models.DTO;
public class InstructionDTO
{
public long? Id { get; set; }
public string? Title { get; set; }
public string? Description { get; set; }
public List<InstructionParagraphDTO> Paragraphs { get; set; } = new List<InstructionParagraphDTO>();
public long? CategoryId { get; set; }
public DateTime? AssignDate { get; set; }
public DateTime? DeadlineDate { get; set; }
public bool IsEnabled { get; set; }
}

View File

@@ -0,0 +1,25 @@
using System.ComponentModel.DataAnnotations;
namespace GamificationService.Models.DTO;
public class InstructionParagraphCreateDTO
{
public long? Id { get; set; }
public long? InstructionId { get; set; }
/// <summary>
/// Order defines the order of the paragraphs inside the instruction.
/// There must not be two paragraphs with the same order.
/// </summary>
public int Order { get; set; }
[Required(ErrorMessage = "Text is required")]
public string Text { get; set; } = null!;
public string? ImageUrl { get; set; }
public string? VideoUrl { get; set; }
}

View File

@@ -0,0 +1,21 @@
namespace GamificationService.Models.DTO;
public class InstructionParagraphDTO
{
public long? Id { get; set; }
public long? InstructionId { get; set; }
/// <summary>
/// Order defines the order of the paragraphs inside the instruction.
/// There must not be two paragraphs with the same order.
/// </summary>
public int Order { get; set; }
public string? Text { get; set; } = null!;
public string? ImageUrl { get; set; }
public string? VideoUrl { get; set; }
}

View File

@@ -0,0 +1,20 @@
using System.ComponentModel.DataAnnotations;
using GamificationService.Utils.Enums;
namespace GamificationService.Models.DTO;
public class InstructionTestCreateDTO
{
public long? Id { get; set; }
public string? Title { get; set; }
[Required(ErrorMessage = "Questions must be specified")]
public ICollection<InstructionTestQuestionCreateDTO> Questions { get; set; } = null!;
public int MaxAttempts { get; set; } = 10;
[Range(0, 1.0, ErrorMessage = "Minimum score must be between 0.6 and 1.0")]
public double MinScore { get; set; } = 0.6;
public InstructionTestScoreCalcMethod ScoreCalcMethod { get; set; } = InstructionTestScoreCalcMethod.MaxGrade;
}

View File

@@ -0,0 +1,23 @@
using System.ComponentModel.DataAnnotations;
using GamificationService.Utils.Enums;
namespace GamificationService.Models.DTO;
public class InstructionTestDTO
{
public long? Id { get; set; }
// Reserved just in case
[StringLength(300, ErrorMessage = "Title cannot be longer than 300 characters")]
public string? Title { get; set; }
public int MaxAttempts { get; set; } = 10;
public double MinScore { get; set; } = 0.6;
public List<InstructionTestQuestionDTO> Questions { get; set; } = new List<InstructionTestQuestionDTO>();
public InstructionTestScoreCalcMethod ScoreCalcMethod { get; set; } = InstructionTestScoreCalcMethod.MaxGrade;
}

View File

@@ -0,0 +1,26 @@
using System.ComponentModel.DataAnnotations;
namespace GamificationService.Models.DTO;
public class InstructionTestQuestionCreateDTO
{
public long? Id { get; set; }
public bool IsMultipleAnswer { get; set; }
/// <summary>
/// Question will be displayed in the paragraph with the same order number.
/// There can be multiple questions attached to the same paragraph.
/// </summary>
public int Order { get; set; }
[Required(ErrorMessage = "Must have question text")]
public string Question { get; set; } = null!;
[Required(ErrorMessage = "Must have answer options")]
public ICollection<string> Answers { get; set; } = null!;
[Required(ErrorMessage = "Must have correct answers")]
public ICollection<int> CorrectAnswers { get; set; } = null!;
}

View File

@@ -0,0 +1,25 @@
using System.ComponentModel.DataAnnotations;
namespace GamificationService.Models.DTO;
public class InstructionTestQuestionDTO
{
public long? Id { get; set; }
public bool IsMultipleAnswer { get; set; }
/// <summary>
/// Question will be displayed in the paragraph with the same order number.
/// There can be multiple questions attached to the same paragraph.
/// </summary>
public int Order { get; set; }
[Required(ErrorMessage = "Must have question text")]
public string Question { get; set; } = null!;
[Required(ErrorMessage = "Must have answer options")]
public ICollection<string> Answers { get; set; } = null!;
public ICollection<int>? CorrectAnswers { get; set; }
}

View File

@@ -0,0 +1,12 @@
namespace GamificationService.Models.DTO;
public class InstructionTestResultDTO
{
public long? Id { get; set; }
public long? InstructionTestId { get; set; }
public long? UserId { get; set; }
public int Score { get; set; }
}

View File

@@ -0,0 +1,12 @@
using System.ComponentModel.DataAnnotations;
namespace GamificationService.Models.DTO;
public class InstructionTestSubmissionDTO
{
[Required(ErrorMessage = "InstructionTestId is required")]
public int InstructionTestId { get; set; }
[Required(ErrorMessage = "Answers must be provided")]
public List<List<int>> Answers { get; set; } = null!;
}

View File

@@ -0,0 +1,9 @@
namespace GamificationService.Models.DTO;
public class LoginResultResponse
{
public bool? RequiresTwoFactorAuth { get; set; }
public bool Success { get; set; }
public RefreshTokenDTO? Token { get; set; }
public int? TwoFactorProvider { get; set; }
}

7
Models/DTO/RefreshTokenDTO.cs Executable file
View File

@@ -0,0 +1,7 @@
namespace GamificationService.Models.DTO;
public class RefreshTokenDTO
{
public string AccessToken { get; set; } = null!;
public string RefreshToken { get; set; } = null!;
}

7
Models/DTO/RightDTO.cs Normal file
View File

@@ -0,0 +1,7 @@
namespace GamificationService.Models.DTO;
public class RightDTO
{
public string Name { get; set; }
public string Description { get; set; }
}

7
Models/DTO/RoleDTO.cs Normal file
View File

@@ -0,0 +1,7 @@
namespace GamificationService.Models.DTO;
public class RoleDTO
{
public string Name { get; set; }
public string Description { get; set; }
}

16
Models/DTO/TwoFactorDTO.cs Executable file
View File

@@ -0,0 +1,16 @@
using System.ComponentModel.DataAnnotations;
namespace GamificationService.Models.DTO;
public class TwoFactorDTO
{
[Required]
public int TwoFactorProvider { get; set; }
[StringLength(50, MinimumLength = 3, ErrorMessage = "Username must be between 3 and 50 characters")]
public string? Username { get; set; } = null!;
[Required]
[StringLength(6, MinimumLength = 6, ErrorMessage = "Code must be 6 characters long")]
public string Code { get; set; } = null!;
public bool RememberMe { get; set; }
}

View File

@@ -0,0 +1,33 @@
using System.ComponentModel.DataAnnotations;
using GamificationService.Utils.Enums;
namespace GamificationService.Models.DTO;
public class UserProfileCreateDTO
{
[Required(ErrorMessage = "Name is required")]
[StringLength(100, ErrorMessage = "Name must be less than 100 characters")]
public string Name { get; set; } = null!;
[Required(ErrorMessage = "Surname is required")]
[StringLength(100, ErrorMessage = "Surname must be less than 100 characters")]
public string Surname { get; set; } = null!;
[StringLength(50, ErrorMessage = "Patronymic must be less than 50 characters")]
public string? Patronymic { get; set; }
[Required(ErrorMessage = "Birthdate is required")]
public DateTime Birthdate { get; set; }
[Required(ErrorMessage = "Gender is required")]
public Gender Gender { get; set; }
[EmailAddress(ErrorMessage = "Invalid email")]
public string? ContactEmail { get; set; }
[Phone(ErrorMessage = "Invalid contact phone number")]
public string? ContactPhone { get; set; }
[Url(ErrorMessage = "Invalid avatar url")]
public string? ProfilePicture { get; set; }
}

37
Models/DTO/UserProfileDTO.cs Executable file
View File

@@ -0,0 +1,37 @@
using System.ComponentModel.DataAnnotations;
using GamificationService.Utils.Enums;
namespace GamificationService.Models.DTO;
public class UserProfileDTO
{
public long? Id { get; set; }
public long? UserId { get; set; }
[Required(ErrorMessage = "Name is required")]
[StringLength(100, ErrorMessage = "Name must be less than 100 characters")]
public string Name { get; set; } = null!;
[Required(ErrorMessage = "Surname is required")]
[StringLength(100, ErrorMessage = "Surname must be less than 100 characters")]
public string Surname { get; set; } = null!;
[StringLength(50, ErrorMessage = "Patronymic must be less than 50 characters")]
public string? Patronymic { get; set; }
[Required(ErrorMessage = "Birthdate is required")]
public DateTime Birthdate { get; set; }
[Required(ErrorMessage = "Gender is required")]
public Gender Gender { get; set; }
[EmailAddress(ErrorMessage = "Invalid email")]
public string? ContactEmail { get; set; }
[Phone(ErrorMessage = "Invalid contact phone number")]
public string? ContactPhone { get; set; }
[Url(ErrorMessage = "Invalid avatar url")]
public string? ProfilePicture { get; set; }
}