diff --git a/Tsi1.Api/Tsi1.Api/Controllers/CourseController.cs b/Tsi1.Api/Tsi1.Api/Controllers/CourseController.cs index 22545bafce6ac73370db0e94dc5c9dd2803d2adb..70af980b0a475dcdc632c92aa6d211e8caaa8c44 100644 --- a/Tsi1.Api/Tsi1.Api/Controllers/CourseController.cs +++ b/Tsi1.Api/Tsi1.Api/Controllers/CourseController.cs @@ -21,12 +21,9 @@ namespace Tsi1.Api.Controllers { private readonly ICourseService _courseService; - private readonly IFileService _fileService; - - public CourseController(ICourseService courseService, IFileService fileService) + public CourseController(ICourseService courseService) { _courseService = courseService; - _fileService = fileService; } [Authorize(Roles = UserTypes.Student + ", " + UserTypes.Professor)] diff --git a/Tsi1.Api/Tsi1.Api/Controllers/SectionItemController.cs b/Tsi1.Api/Tsi1.Api/Controllers/SectionItemController.cs index 4e278ca49c8c101e03e2c593a2cc5a895c3196d1..1a1a7c5e582cf3d7caf234e21ccf243de7bb0c8b 100644 --- a/Tsi1.Api/Tsi1.Api/Controllers/SectionItemController.cs +++ b/Tsi1.Api/Tsi1.Api/Controllers/SectionItemController.cs @@ -1,4 +1,5 @@ using System.Collections.Generic; +using System.Linq; using System.Threading.Tasks; using Microsoft.AspNetCore.Authorization; using Microsoft.AspNetCore.Mvc; @@ -25,7 +26,9 @@ namespace Tsi1.Api.Controllers [HttpPost("Create")] public async Task<IActionResult> Create(SectionItemCreateDto sectionItem) { - var result = await _sectionItemService.Create(sectionItem); + var tenantId = int.Parse(HttpContext.User.Claims.FirstOrDefault(x => x.Type == "TenantId").Value); + + var result = await _sectionItemService.Create(sectionItem, tenantId); if (result.HasError) { return BadRequest(result.Message); diff --git a/Tsi1.Api/Tsi1.Api/Controllers/SurveyController.cs b/Tsi1.Api/Tsi1.Api/Controllers/SurveyController.cs new file mode 100644 index 0000000000000000000000000000000000000000..48ae7c43759b9c5743eb0cddd78675961e71c601 --- /dev/null +++ b/Tsi1.Api/Tsi1.Api/Controllers/SurveyController.cs @@ -0,0 +1,136 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Security.Claims; +using System.Threading.Tasks; +using Microsoft.AspNetCore.Authorization; +using Microsoft.AspNetCore.Http; +using Microsoft.AspNetCore.Mvc; +using Tsi1.BusinessLayer.Dtos; +using Tsi1.BusinessLayer.Helpers; +using Tsi1.BusinessLayer.Interfaces; +using Tsi1.DataLayer.Entities; + +namespace Tsi1.Api.Controllers +{ + [Route("api/[controller]")] + [ApiController] + public class SurveyController : ControllerBase + { + private readonly ISurveyService _surveyService; + + public SurveyController(ISurveyService surveyService) + { + _surveyService = surveyService; + } + + [Authorize(Roles = UserTypes.FacultyAdmin + ", " + UserTypes.UdelarAdmin)] + [HttpPost("Create")] + public async Task<IActionResult> Create(SurveyCreateDto newSurvey, int tenantId) + { + var userType = HttpContext.User.Claims.FirstOrDefault(x => x.Type == ClaimTypes.Role).Value; + if (userType == UserTypes.FacultyAdmin) + { + tenantId = int.Parse(HttpContext.User.Claims.FirstOrDefault(x => x.Type == "TenantId").Value); + } + newSurvey.IsGlobal = true; + + var result = await _surveyService.CreateGlobalSurvey(newSurvey, tenantId); + + if (result.HasError) + { + return BadRequest(result.Message); + } + + return Ok(); + } + + [Authorize(Roles = UserTypes.FacultyAdmin + ", " + UserTypes.UdelarAdmin)] + [HttpDelete("Delete/{surveyId}")] + public async Task<IActionResult> Delete(int surveyId) + { + var userType = HttpContext.User.Claims.FirstOrDefault(x => x.Type == ClaimTypes.Role).Value; + var tenantId = int.Parse(HttpContext.User.Claims.FirstOrDefault(x => x.Type == "TenantId").Value); + + var result = await _surveyService.DeleteGlobalSurvey(surveyId, userType, tenantId); + + if (result.HasError) + { + return BadRequest(result.Message); + } + + return Ok(); + } + + [Authorize(Roles = UserTypes.FacultyAdmin + ", " + UserTypes.UdelarAdmin)] + [HttpGet("GetAllGlobalSurveys")] + public async Task<IActionResult> GetAllGlobalSurveys(int tenantId) + { + var userType = HttpContext.User.Claims.FirstOrDefault(x => x.Type == ClaimTypes.Role).Value; + if (userType == UserTypes.FacultyAdmin) + { + tenantId = int.Parse(HttpContext.User.Claims.FirstOrDefault(x => x.Type == "TenantId").Value); + } + + var result = await _surveyService.GetAllGlobalSurveys(tenantId, userType); + + if (result.HasError) + { + return BadRequest(result.Message); + } + + return Ok(result.Data); + } + + [Authorize(Roles = UserTypes.FacultyAdmin + ", " + UserTypes.UdelarAdmin + ", " + UserTypes.Professor + ", " + UserTypes.Student)] + [HttpGet("GetMySurvey/{surveyId}")] + public async Task<IActionResult> GetMySurvey(int surveyId) + { + var userId = int.Parse(HttpContext.User.Claims.FirstOrDefault(x => x.Type == "Id").Value); + + var result = await _surveyService.GetMySurvey(surveyId, userId); + + if (result.HasError) + { + return NotFound(result.Message); + } + + return Ok(result.Data); + } + + [Authorize(Roles = UserTypes.Student)] + [HttpPost("Complete")] + public async Task<IActionResult> Complete(SurveyResponseCreateDto surveyResponse) + { + var userId = int.Parse(HttpContext.User.Claims.FirstOrDefault(x => x.Type == "Id").Value); + surveyResponse.UserId = userId; + + var result = await _surveyService.Complete(surveyResponse); + + if (result.HasError) + { + return NotFound(result.Message); + } + + return Ok(result.Data); + } + + [Authorize(Roles = UserTypes.FacultyAdmin + ", " + UserTypes.UdelarAdmin + ", " + UserTypes.Professor)] + [HttpGet("GetAllResponses/{surveyId}")] + public async Task<IActionResult> GetAllResponses(int surveyId) + { + var userType = HttpContext.User.Claims.FirstOrDefault(x => x.Type == ClaimTypes.Role).Value; + var tenantId = int.Parse(HttpContext.User.Claims.FirstOrDefault(x => x.Type == "TenantId").Value); + + var result = await _surveyService.GetAllResponses(surveyId, userType, tenantId); + + if (result.HasError) + { + return NotFound(result.Message); + } + + return Ok(result.Data); + } + + } +} diff --git a/Tsi1.Api/Tsi1.Api/Controllers/UserController.cs b/Tsi1.Api/Tsi1.Api/Controllers/UserController.cs index e2abf687b6751ddbe19028264e3f2444c8b14269..1b3c61298f9767f9460ff360c5b6a997e6b24df6 100644 --- a/Tsi1.Api/Tsi1.Api/Controllers/UserController.cs +++ b/Tsi1.Api/Tsi1.Api/Controllers/UserController.cs @@ -332,6 +332,22 @@ namespace Tsi1.Api.Controllers return Ok(result.Data); } + [Authorize(Roles = UserTypes.FacultyAdmin + ", " + UserTypes.UdelarAdmin)] + [HttpGet("GetAdmins")] + public async Task<IActionResult> GetAdmins() + { + var tenantId = int.Parse(HttpContext.User.Claims.FirstOrDefault(x => x.Type == "TenantId").Value); + var userType = HttpContext.User.Claims.FirstOrDefault(x => x.Type == ClaimTypes.Role).Value; + + var result = await _userService.GetAdmins(tenantId, userType); + + if (result.HasError) + { + return BadRequest(result.Message); + } + + return Ok(result.Data); + } [Authorize(Roles = UserTypes.Student + ", " + UserTypes.Professor)] [HttpGet("GetById/{userId}")] diff --git a/Tsi1.Api/Tsi1.Api/Startup.cs b/Tsi1.Api/Tsi1.Api/Startup.cs index b15b91cef5d34e74460756ba52fd1a1da80d42c0..369da763de4eb9e1b36021dafd89bb2e15651955 100644 --- a/Tsi1.Api/Tsi1.Api/Startup.cs +++ b/Tsi1.Api/Tsi1.Api/Startup.cs @@ -91,6 +91,7 @@ namespace Tsi1.Api services.AddScoped<ISectionItemService, SectionItemService>(); services.AddScoped<ISectionItemTypeService, SectionItemTypeService>(); services.AddScoped<IDataLoad, DataLoad>(); + services.AddScoped<ISurveyService, SurveyService>(); services.Configure<MailSettings>(Configuration.GetSection("MailSettings")); services.AddScoped<IEmailService, EmailService>(); diff --git a/Tsi1.Api/Tsi1.BusinessLayer/DataLoad/DataLoad.cs b/Tsi1.Api/Tsi1.BusinessLayer/DataLoad/DataLoad.cs index ea09ddf721818c249411dcdc6219633d99d350ad..db3a8af45db895fce706b8f731064675f59f73d5 100644 --- a/Tsi1.Api/Tsi1.BusinessLayer/DataLoad/DataLoad.cs +++ b/Tsi1.Api/Tsi1.BusinessLayer/DataLoad/DataLoad.cs @@ -13,29 +13,23 @@ namespace Tsi1.BusinessLayer.DataLoad public class DataLoad : IDataLoad { private readonly Tsi1Context _context; - private readonly IUserTypeService _userTypeService; private readonly ITenantService _tenantService; private readonly IUserService _userService; private readonly ICourseService _courseService; - private readonly ISectionItemTypeService _sectionItemTypeService; private readonly ISectionService _sectionService; private readonly ISectionItemService _sectionItemService; public DataLoad(Tsi1Context context, - IUserTypeService userTypeService, ITenantService tenantService, IUserService userService, ICourseService courseService, - ISectionItemTypeService sectionItemTypeService, ISectionService sectionService, ISectionItemService sectionItemService) { _context = context; - _userTypeService = userTypeService; _tenantService = tenantService; _userService = userService; _courseService = courseService; - _sectionItemTypeService = sectionItemTypeService; _sectionService = sectionService; _sectionItemService = sectionItemService; } @@ -161,6 +155,12 @@ namespace Tsi1.BusinessLayer.DataLoad }; _context.SectionItemTypes.Add(sectionItemTypeForum); + var sectionItemTypeSurvey = new SectionItemType + { + Name = SectionItemTypes.Survey, + }; + _context.SectionItemTypes.Add(sectionItemTypeSurvey); + await _context.SaveChangesAsync(); // COURSES @@ -183,7 +183,7 @@ namespace Tsi1.BusinessLayer.DataLoad Name = "Fisica 1", TenantId = fingTenantId.Data.Id }; - var course3 = await _courseService.Create(course3Dto); + await _courseService.Create(course3Dto); // SECTIONS var section1 = new SectionCreateDto @@ -221,7 +221,7 @@ namespace Tsi1.BusinessLayer.DataLoad Name = "Novedades" } }; - await _sectionItemService.Create(sectionItem1); + await _sectionItemService.Create(sectionItem1, fingTenantId.Data.Id); var sectionItem2 = new SectionItemCreateDto { @@ -233,7 +233,7 @@ namespace Tsi1.BusinessLayer.DataLoad Name = "Novedades" } }; - await _sectionItemService.Create(sectionItem2); + await _sectionItemService.Create(sectionItem2, fingTenantId.Data.Id); var sectionItem3 = new SectionItemCreateDto { @@ -245,7 +245,7 @@ namespace Tsi1.BusinessLayer.DataLoad Name = "General" } }; - await _sectionItemService.Create(sectionItem3); + await _sectionItemService.Create(sectionItem3, fingTenantId.Data.Id); var sectionItem4 = new SectionItemCreateDto { @@ -257,7 +257,36 @@ namespace Tsi1.BusinessLayer.DataLoad Name = "Tema 1" } }; - await _sectionItemService.Create(sectionItem4); + await _sectionItemService.Create(sectionItem4, fingTenantId.Data.Id); + + // ANSWER OPTIONS + var answerOptions = new List<AnswerOption> + { + new AnswerOption + { + Name = "Excelente" + }, + new AnswerOption + { + Name = "Conforme" + }, + new AnswerOption + { + Name = "Neutro" + }, + new AnswerOption + { + Name = "No Conforme" + }, + new AnswerOption + { + Name = "Mal" + }, + }; + + _context.AnswerOptions.AddRange(answerOptions); + await _context.SaveChangesAsync(); + } } } \ No newline at end of file diff --git a/Tsi1.Api/Tsi1.BusinessLayer/Dtos/SectionItemCreateDto.cs b/Tsi1.Api/Tsi1.BusinessLayer/Dtos/SectionItemCreateDto.cs index 9da60f96c22ec4674298ff8503a8d29b0b70cfb8..6ddb3a53587dc01c31fbe715054739d69f4cc871 100644 --- a/Tsi1.Api/Tsi1.BusinessLayer/Dtos/SectionItemCreateDto.cs +++ b/Tsi1.Api/Tsi1.BusinessLayer/Dtos/SectionItemCreateDto.cs @@ -12,5 +12,7 @@ namespace Tsi1.BusinessLayer.Dtos public ForumCreateDto Forum { get; set; } public FileDto File { get; set; } + + public SurveyCreateDto Survey { get; set; } } } diff --git a/Tsi1.Api/Tsi1.BusinessLayer/Dtos/SectionItemDetailDto.cs b/Tsi1.Api/Tsi1.BusinessLayer/Dtos/SectionItemDetailDto.cs index 9b6929057d90d5d05100f272a1818a7f01772e54..242f74d5178763ad580e4cd006ad5f71a698d645 100644 --- a/Tsi1.Api/Tsi1.BusinessLayer/Dtos/SectionItemDetailDto.cs +++ b/Tsi1.Api/Tsi1.BusinessLayer/Dtos/SectionItemDetailDto.cs @@ -11,5 +11,6 @@ namespace Tsi1.BusinessLayer.Dtos public int SectionItemTypeId { get; set; } public ForumPreviewDto Forum { get; set; } public FileDetailDto File { get; set; } + public SurveyDetailDto Survey { get; set; } } } diff --git a/Tsi1.Api/Tsi1.BusinessLayer/Dtos/SurveyAnswerCreateDto.cs b/Tsi1.Api/Tsi1.BusinessLayer/Dtos/SurveyAnswerCreateDto.cs new file mode 100644 index 0000000000000000000000000000000000000000..2b261bbc014c40692bb438284506f3055d07cd66 --- /dev/null +++ b/Tsi1.Api/Tsi1.BusinessLayer/Dtos/SurveyAnswerCreateDto.cs @@ -0,0 +1,13 @@ +using System; +using System.Collections.Generic; +using System.Text; +using System.Text.Json.Serialization; + +namespace Tsi1.BusinessLayer.Dtos +{ + public class SurveyAnswerCreateDto + { + public int AnswerOptionId { get; set; } + public int SurveyQuestionId { get; set; } + } +} diff --git a/Tsi1.Api/Tsi1.BusinessLayer/Dtos/SurveyAnswerDetailDto.cs b/Tsi1.Api/Tsi1.BusinessLayer/Dtos/SurveyAnswerDetailDto.cs new file mode 100644 index 0000000000000000000000000000000000000000..d51d83f915a2dc32286c2568e84987fcb880a64c --- /dev/null +++ b/Tsi1.Api/Tsi1.BusinessLayer/Dtos/SurveyAnswerDetailDto.cs @@ -0,0 +1,14 @@ +using System; +using System.Collections.Generic; +using System.Text; + +namespace Tsi1.BusinessLayer.Dtos +{ + public class SurveyAnswerDetailDto + { + public int Id { get; set; } + public int AnswerOptionId { get; set; } + public int SurveyResponseId { get; set; } + public int SurveyQuestionId { get; set; } + } +} diff --git a/Tsi1.Api/Tsi1.BusinessLayer/Dtos/SurveyCreateDto.cs b/Tsi1.Api/Tsi1.BusinessLayer/Dtos/SurveyCreateDto.cs new file mode 100644 index 0000000000000000000000000000000000000000..3721d0de114a82137a8affea3344d0e2c68e357d --- /dev/null +++ b/Tsi1.Api/Tsi1.BusinessLayer/Dtos/SurveyCreateDto.cs @@ -0,0 +1,17 @@ +using System; +using System.Collections.Generic; +using System.Text; +using System.Text.Json.Serialization; + +namespace Tsi1.BusinessLayer.Dtos +{ + public class SurveyCreateDto + { + public string Name { get; set; } + + [JsonIgnore] + public bool IsGlobal { get; set; } + + public List<SurveyQuestionCreateDto> SurveyQuestions { get; set; } + } +} diff --git a/Tsi1.Api/Tsi1.BusinessLayer/Dtos/SurveyDetailDto.cs b/Tsi1.Api/Tsi1.BusinessLayer/Dtos/SurveyDetailDto.cs new file mode 100644 index 0000000000000000000000000000000000000000..4b29dcd667e7db7dc09e2f0d1921b6bd539b44a2 --- /dev/null +++ b/Tsi1.Api/Tsi1.BusinessLayer/Dtos/SurveyDetailDto.cs @@ -0,0 +1,18 @@ +using System; +using System.Collections.Generic; +using System.Text; + +namespace Tsi1.BusinessLayer.Dtos +{ + public class SurveyDetailDto + { + public int Id { get; set; } + public string Name { get; set; } + public bool IsGlobal { get; set; } + + public List<SurveyQuestionPreviewDto> SurveyQuestions { get; set; } + + public SurveyResponseDetailDto SurveyResponse { get; set; } + + } +} diff --git a/Tsi1.Api/Tsi1.BusinessLayer/Dtos/SurveyPreviewDto.cs b/Tsi1.Api/Tsi1.BusinessLayer/Dtos/SurveyPreviewDto.cs new file mode 100644 index 0000000000000000000000000000000000000000..ac5fd309bff78020ac7035cebe4a66c948c26be0 --- /dev/null +++ b/Tsi1.Api/Tsi1.BusinessLayer/Dtos/SurveyPreviewDto.cs @@ -0,0 +1,13 @@ +using System; +using System.Collections.Generic; +using System.Text; + +namespace Tsi1.BusinessLayer.Dtos +{ + public class SurveyPreviewDto + { + public int Id { get; set; } + public string Name { get; set; } + + } +} diff --git a/Tsi1.Api/Tsi1.BusinessLayer/Dtos/SurveyQuestionCreateDto.cs b/Tsi1.Api/Tsi1.BusinessLayer/Dtos/SurveyQuestionCreateDto.cs new file mode 100644 index 0000000000000000000000000000000000000000..e9b9f89a41fde5227c6b670e096025933563f98d --- /dev/null +++ b/Tsi1.Api/Tsi1.BusinessLayer/Dtos/SurveyQuestionCreateDto.cs @@ -0,0 +1,11 @@ +using System; +using System.Collections.Generic; +using System.Text; + +namespace Tsi1.BusinessLayer.Dtos +{ + public class SurveyQuestionCreateDto + { + public string Question { get; set; } + } +} diff --git a/Tsi1.Api/Tsi1.BusinessLayer/Dtos/SurveyQuestionPreviewDto.cs b/Tsi1.Api/Tsi1.BusinessLayer/Dtos/SurveyQuestionPreviewDto.cs new file mode 100644 index 0000000000000000000000000000000000000000..3767f926acf956024b1a427caec6ad8dc9879051 --- /dev/null +++ b/Tsi1.Api/Tsi1.BusinessLayer/Dtos/SurveyQuestionPreviewDto.cs @@ -0,0 +1,12 @@ +using System; +using System.Collections.Generic; +using System.Text; + +namespace Tsi1.BusinessLayer.Dtos +{ + public class SurveyQuestionPreviewDto + { + public int Id { get; set; } + public string Question { get; set; } + } +} diff --git a/Tsi1.Api/Tsi1.BusinessLayer/Dtos/SurveyResponseCreateDto.cs b/Tsi1.Api/Tsi1.BusinessLayer/Dtos/SurveyResponseCreateDto.cs new file mode 100644 index 0000000000000000000000000000000000000000..2d8a31cf2b60df97ef20893561b9bf23f1edd8b1 --- /dev/null +++ b/Tsi1.Api/Tsi1.BusinessLayer/Dtos/SurveyResponseCreateDto.cs @@ -0,0 +1,15 @@ +using System; +using System.Collections.Generic; +using System.Text; +using System.Text.Json.Serialization; + +namespace Tsi1.BusinessLayer.Dtos +{ + public class SurveyResponseCreateDto + { + [JsonIgnore] + public int UserId { get; set; } + public int SurveyId { get; set; } + public List<SurveyAnswerCreateDto> SurveyAnswers { get; set; } + } +} diff --git a/Tsi1.Api/Tsi1.BusinessLayer/Dtos/SurveyResponseDetailDto.cs b/Tsi1.Api/Tsi1.BusinessLayer/Dtos/SurveyResponseDetailDto.cs new file mode 100644 index 0000000000000000000000000000000000000000..70f064b0c2014ba58ec0b17032c1b3e39a0cdc41 --- /dev/null +++ b/Tsi1.Api/Tsi1.BusinessLayer/Dtos/SurveyResponseDetailDto.cs @@ -0,0 +1,14 @@ +using System; +using System.Collections.Generic; +using System.Text; + +namespace Tsi1.BusinessLayer.Dtos +{ + public class SurveyResponseDetailDto + { + public int Id { get; set; } + public int UserId { get; set; } + public int SurveyId { get; set; } + public List<SurveyAnswerDetailDto> SurveyAnswers { get; set; } + } +} diff --git a/Tsi1.Api/Tsi1.BusinessLayer/Helpers/ErrorMessages.cs b/Tsi1.Api/Tsi1.BusinessLayer/Helpers/ErrorMessages.cs index a004f7a3bab816594826a1ebb47d53beb6f8c741..c61742af40d30ff6d921347d857a16d4487272e6 100644 --- a/Tsi1.Api/Tsi1.BusinessLayer/Helpers/ErrorMessages.cs +++ b/Tsi1.Api/Tsi1.BusinessLayer/Helpers/ErrorMessages.cs @@ -55,5 +55,11 @@ namespace Tsi1.BusinessLayer.Helpers public const string ForumIsNull = "El foro es nulo"; public const string FileIsNull = "El archivo es nulo"; public const string InvalidSectionItemData = "El tipo de item de seccion '{0}' no coincide con su contenido '{1}'"; + + public const string SurveyDoesNotExist = "La encuesta con id '{0}' no existe"; + public const string SurveyIsNull = "La encuesta es nula"; + public const string SurveyHasNoQuestions = "La encuesta no tiene preguntas"; + public const string InvalidSurvey = "La encuesta no pertenece a la facultad con id '{0}'"; + public const string SurveyResponseAlreadyExist = "El usuario '{0}' ya completo la encuesta '{1}'"; } } diff --git a/Tsi1.Api/Tsi1.BusinessLayer/Helpers/MappingProfile.cs b/Tsi1.Api/Tsi1.BusinessLayer/Helpers/MappingProfile.cs index da9824d33e9b439b34192a98f1d6553c76f3a90d..00f542a5b5736b52cff851debcdd154bd037ee0c 100644 --- a/Tsi1.Api/Tsi1.BusinessLayer/Helpers/MappingProfile.cs +++ b/Tsi1.Api/Tsi1.BusinessLayer/Helpers/MappingProfile.cs @@ -35,13 +35,20 @@ namespace Tsi1.BusinessLayer.Helpers CreateMap<File, FileDto>(); CreateMap<SectionItem, SectionItemCreateDto>(); CreateMap<Section, SectionCreateDto>(); - CreateMap<SectionItemType, SectionItemTypeDto>(); - + CreateMap<SectionItemType, SectionItemTypeDto>(); CreateMap<Course, CourseDetailDto>(); CreateMap<Section, SectionDetailDto>(); CreateMap<SectionItem, SectionItemDetailDto>(); CreateMap<File, FileDetailDto>(); - + CreateMap<Survey, SurveyCreateDto>(); + CreateMap<Survey, SurveyPreviewDto>(); + CreateMap<Survey, SurveyDetailDto>(); + CreateMap<SurveyQuestion, SurveyQuestionCreateDto>(); + CreateMap<SurveyQuestion, SurveyQuestionPreviewDto>(); + CreateMap<SurveyResponse, SurveyResponseCreateDto>(); + CreateMap<SurveyResponse, SurveyResponseDetailDto>(); + CreateMap<SurveyAnswer, SurveyAnswerDetailDto>(); + CreateMap<SurveyAnswer, SurveyAnswerCreateDto>(); CreateMap<ForumCreateDto, Forum>(); CreateMap<ForumPreviewDto, Forum>(); @@ -67,11 +74,20 @@ namespace Tsi1.BusinessLayer.Helpers CreateMap<SectionItemCreateDto, SectionItem>(); CreateMap<SectionCreateDto, Section>(); CreateMap<SectionItemTypeDto, SectionItemType>(); - CreateMap<CourseDetailDto, Course>(); CreateMap<SectionDetailDto, Section>(); CreateMap<SectionItemDetailDto, SectionItem>(); CreateMap<FileDetailDto, File>(); + CreateMap<SurveyCreateDto, Survey>(); + CreateMap<SurveyDetailDto, Survey>(); + CreateMap<SurveyPreviewDto, Survey>(); + CreateMap<SurveyQuestionCreateDto, SurveyQuestion>(); + CreateMap<SurveyQuestionPreviewDto, SurveyQuestion>(); + CreateMap<SurveyResponseCreateDto, SurveyResponse>(); + CreateMap<SurveyResponseDetailDto, SurveyResponse>(); + CreateMap<SurveyAnswerDetailDto, SurveyAnswer>(); + CreateMap<SurveyAnswerCreateDto, SurveyAnswer>(); + CreateMap<Course, Course>().ForMember(x => x.Id, opt => opt.Ignore()); CreateMap<Tenant, Tenant>().ForMember(x => x.Id, opt => opt.Ignore()); diff --git a/Tsi1.Api/Tsi1.BusinessLayer/Helpers/SectionItemTypes.cs b/Tsi1.Api/Tsi1.BusinessLayer/Helpers/SectionItemTypes.cs index 0eee4f0c3bd2dd3c53204e5539652b839534a794..a889446941100b1eb36fb20075cd6b8228dd614c 100644 --- a/Tsi1.Api/Tsi1.BusinessLayer/Helpers/SectionItemTypes.cs +++ b/Tsi1.Api/Tsi1.BusinessLayer/Helpers/SectionItemTypes.cs @@ -8,5 +8,6 @@ namespace Tsi1.BusinessLayer.Helpers { public const string Forum = nameof(Forum); public const string File = nameof(File); + public const string Survey = nameof(Survey); } } diff --git a/Tsi1.Api/Tsi1.BusinessLayer/Interfaces/ISectionItemService.cs b/Tsi1.Api/Tsi1.BusinessLayer/Interfaces/ISectionItemService.cs index 4834f03114b891bfae163d7d87ac1be83dfced28..ad048812770a41c268427b9a0d0c1aa1a8ca7812 100644 --- a/Tsi1.Api/Tsi1.BusinessLayer/Interfaces/ISectionItemService.cs +++ b/Tsi1.Api/Tsi1.BusinessLayer/Interfaces/ISectionItemService.cs @@ -9,7 +9,7 @@ namespace Tsi1.BusinessLayer.Interfaces { public interface ISectionItemService { - Task<ServiceResult<bool>> Create(SectionItemCreateDto newSectionItem); + Task<ServiceResult<bool>> Create(SectionItemCreateDto newSectionItem, int tenantId); Task<ServiceResult<bool>> Delete(int sectionItemId); Task<ServiceResult<bool>> OrderSectionItems(List<OrderDto> orderDtos); } diff --git a/Tsi1.Api/Tsi1.BusinessLayer/Interfaces/ISurveyService.cs b/Tsi1.Api/Tsi1.BusinessLayer/Interfaces/ISurveyService.cs new file mode 100644 index 0000000000000000000000000000000000000000..166da72495011ee0b30a6ccaee67e8f108288c3b --- /dev/null +++ b/Tsi1.Api/Tsi1.BusinessLayer/Interfaces/ISurveyService.cs @@ -0,0 +1,19 @@ +using System; +using System.Collections.Generic; +using System.Text; +using System.Threading.Tasks; +using Tsi1.BusinessLayer.Dtos; +using Tsi1.BusinessLayer.Helpers; + +namespace Tsi1.BusinessLayer.Interfaces +{ + public interface ISurveyService + { + Task<ServiceResult<bool>> CreateGlobalSurvey(SurveyCreateDto newSurvey, int tenantId); + Task<ServiceResult<bool>> DeleteGlobalSurvey(int surveyId, string userType, int tenantId); + Task<ServiceResult<List<SurveyPreviewDto>>> GetAllGlobalSurveys(int tenantId, string userType); + Task<ServiceResult<SurveyDetailDto>> GetMySurvey(int surveyId, int userId); + Task<ServiceResult<bool>> Complete(SurveyResponseCreateDto surveyResponse); + Task<ServiceResult<List<SurveyResponseDetailDto>>> GetAllResponses(int surveyId, string userType, int tenantId); + } +} diff --git a/Tsi1.Api/Tsi1.BusinessLayer/Interfaces/IUserService.cs b/Tsi1.Api/Tsi1.BusinessLayer/Interfaces/IUserService.cs index 1fbf3d8f98fe9bb37e97efba2d5df19c33f524bf..d503323a5aee281cb5fa54a7307829d7d90dcd6d 100644 --- a/Tsi1.Api/Tsi1.BusinessLayer/Interfaces/IUserService.cs +++ b/Tsi1.Api/Tsi1.BusinessLayer/Interfaces/IUserService.cs @@ -33,5 +33,6 @@ namespace Tsi1.BusinessLayer.Interfaces Task<ServiceResult<List<UserPreviewDto>>> GetStudents(int tenantId); Task<ServiceResult<List<UserPreviewDto>>> GetProfessors(int tenantId); + Task<ServiceResult<List<UserPreviewDto>>> GetAdmins(int tenantId, string userType); } } diff --git a/Tsi1.Api/Tsi1.BusinessLayer/Services/CourseService.cs b/Tsi1.Api/Tsi1.BusinessLayer/Services/CourseService.cs index 8152ca0b1ff477e95df6aee7eca516ef3f9259a3..64cc381f8d20ba83e9dc85bece6cc21829a0a3ea 100644 --- a/Tsi1.Api/Tsi1.BusinessLayer/Services/CourseService.cs +++ b/Tsi1.Api/Tsi1.BusinessLayer/Services/CourseService.cs @@ -362,6 +362,9 @@ namespace Tsi1.BusinessLayer.Services .Include(x => x.Sections) .ThenInclude(x => x.SectionItems) .ThenInclude(x => x.File) + .Include(x => x.Sections) + .ThenInclude(x => x.SectionItems) + .ThenInclude(x => x.Survey) .FirstOrDefaultAsync(x => x.Id == courseId); if (course == null) diff --git a/Tsi1.Api/Tsi1.BusinessLayer/Services/EmailService.cs b/Tsi1.Api/Tsi1.BusinessLayer/Services/EmailService.cs index 9519fc5b0cf3037535e101a866a297392b786825..6be1396f8a82712544d99e643c9550d44407dfcd 100644 --- a/Tsi1.Api/Tsi1.BusinessLayer/Services/EmailService.cs +++ b/Tsi1.Api/Tsi1.BusinessLayer/Services/EmailService.cs @@ -29,14 +29,16 @@ namespace Tsi1.BusinessLayer.Services message.Sender = MailboxAddress.Parse(_mailSettings.Mail); - var client = new SmtpClient(); - client.CheckCertificateRevocation = false; + var client = new SmtpClient + { + CheckCertificateRevocation = false + }; try { await client.ConnectAsync(_mailSettings.Host, _mailSettings.Port, SecureSocketOptions.StartTls); } - catch (Exception e) + catch (Exception) { result.HasError = true; result.Message = ErrorMessages.CannotConnectToSmtpServer; diff --git a/Tsi1.Api/Tsi1.BusinessLayer/Services/SectionItemService.cs b/Tsi1.Api/Tsi1.BusinessLayer/Services/SectionItemService.cs index ae0eedca11130f202ca5cc31688ea5725eea6525..70142c455cccf76b1996d8440e986b7231024b61 100644 --- a/Tsi1.Api/Tsi1.BusinessLayer/Services/SectionItemService.cs +++ b/Tsi1.Api/Tsi1.BusinessLayer/Services/SectionItemService.cs @@ -27,17 +27,24 @@ namespace Tsi1.BusinessLayer.Services _fileService = fileService; } - public async Task<ServiceResult<bool>> Create(SectionItemCreateDto newSectionItem) + public async Task<ServiceResult<bool>> Create(SectionItemCreateDto newSectionItem, int tenantId) { var sectionItem = _mapper.Map<SectionItem>(newSectionItem); - var result = await this.SectionItemValidations(sectionItem); + var sectionItemType = await _context.SectionItemTypes + .FirstOrDefaultAsync(x => x.Id == sectionItem.SectionItemTypeId); + + var result = this.SectionItemValidations(sectionItem, sectionItemType); if (result.HasError) { return result; } + if (sectionItemType.Name == SectionItemTypes.Survey) + { + sectionItem.Survey.Tenant.Id = tenantId; + } _context.SectionItems.Add(sectionItem); await _context.SaveChangesAsync(); @@ -100,13 +107,10 @@ namespace Tsi1.BusinessLayer.Services return result; } - private async Task<ServiceResult<bool>> SectionItemValidations(SectionItem sectionItem) + private ServiceResult<bool> SectionItemValidations(SectionItem sectionItem, SectionItemType sectionItemType) { var result = new ServiceResult<bool>(); - - var sectionItemType = await _context.SectionItemTypes - .FirstOrDefaultAsync(x => x.Id == sectionItem.SectionItemTypeId); - + if (sectionItemType == null) { result.HasError = true; @@ -122,7 +126,7 @@ namespace Tsi1.BusinessLayer.Services result.AddMessage(ErrorMessages.ForumIsNull); } - if (sectionItem.File != null) + if (sectionItem.File != null || sectionItem.Survey != null) { result.HasError = true; result.AddMessage(string.Format(ErrorMessages.InvalidSectionItemData, sectionItemType.Name, SectionItemTypes.File)); @@ -137,7 +141,7 @@ namespace Tsi1.BusinessLayer.Services result.AddMessage(ErrorMessages.FileIsNull); } - if (sectionItem.Forum != null) + if (sectionItem.Forum != null || sectionItem.Survey != null) { result.HasError = true; result.AddMessage(string.Format(ErrorMessages.InvalidSectionItemData, sectionItemType.Name, SectionItemTypes.Forum)); @@ -150,6 +154,21 @@ namespace Tsi1.BusinessLayer.Services } } + if (sectionItemType.Name == SectionItemTypes.Survey) + { + if (sectionItem.Survey == null) + { + result.HasError = true; + result.AddMessage(ErrorMessages.SurveyIsNull); + } + + if (sectionItem.File != null || sectionItem.Forum != null) + { + result.HasError = true; + result.AddMessage(string.Format(ErrorMessages.InvalidSectionItemData, sectionItemType.Name, SectionItemTypes.File)); + } + } + return result; } } diff --git a/Tsi1.Api/Tsi1.BusinessLayer/Services/SurveyService.cs b/Tsi1.Api/Tsi1.BusinessLayer/Services/SurveyService.cs new file mode 100644 index 0000000000000000000000000000000000000000..51beed6b69060913983701c8c88f8b1889fc5e1e --- /dev/null +++ b/Tsi1.Api/Tsi1.BusinessLayer/Services/SurveyService.cs @@ -0,0 +1,210 @@ +using AutoMapper; +using Microsoft.EntityFrameworkCore; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using Tsi1.BusinessLayer.Dtos; +using Tsi1.BusinessLayer.Helpers; +using Tsi1.BusinessLayer.Interfaces; +using Tsi1.DataLayer; +using Tsi1.DataLayer.Entities; + +namespace Tsi1.BusinessLayer.Services +{ + public class SurveyService : ISurveyService + { + private readonly Tsi1Context _context; + private readonly IMapper _mapper; + + public SurveyService(Tsi1Context context, IMapper mapper) + { + _context = context; + _mapper = mapper; + } + + public async Task<ServiceResult<bool>> CreateGlobalSurvey(SurveyCreateDto newSurvey, int tenantId) + { + var result = new ServiceResult<bool>(); + + var tenant = await _context.Tenants.FirstOrDefaultAsync(x => x.Id == tenantId); + + if (tenant == null) + { + result.HasError = true; + result.AddMessage(string.Format(ErrorMessages.TenantDoesNotExist, tenantId)); + return result; + } + + var survey = _mapper.Map<Survey>(newSurvey); + + if (!survey.SurveyQuestions.Any()) + { + result.HasError = true; + result.AddMessage(ErrorMessages.SurveyHasNoQuestions); + return result; + } + + survey.Tenant = tenant; + _context.Surveys.Add(survey); + + await _context.SaveChangesAsync(); + + return result; + } + + public async Task<ServiceResult<bool>> DeleteGlobalSurvey(int surveyId, string userType, int tenantId) + { + var result = new ServiceResult<bool>(); + + var survey = await _context.Surveys + .Include(x => x.Tenant) + .FirstOrDefaultAsync(x => x.Id == surveyId); + + if (survey == null) + { + result.HasError = true; + result.AddMessage(string.Format(ErrorMessages.SurveyDoesNotExist, surveyId)); + return result; + } + + if (userType == UserTypes.FacultyAdmin && survey.Tenant.Id != tenantId) + { + result.HasError = true; + result.AddMessage("No se puede borrar una encuesta de otra facultad"); + return result; + } + + _context.Surveys.Remove(survey); + + await _context.SaveChangesAsync(); + + return result; + } + + public async Task<ServiceResult<List<SurveyPreviewDto>>> GetAllGlobalSurveys(int tenantId, string userType) + { + var result = new ServiceResult<List<SurveyPreviewDto>>(); + + var tenant = await _context.Tenants.FirstOrDefaultAsync(x => x.Id == tenantId); + var tenantAdmin = await _context.Tenants.FirstOrDefaultAsync(x => x.Name == TenantAdmin.Name); + + if (tenant == null || userType == UserTypes.UdelarAdmin && tenantAdmin.Id == tenantId) + { + result.HasError = true; + result.AddMessage(string.Format(ErrorMessages.TenantDoesNotExist, tenantId)); + return result; + } + + var surveys = await _context.Surveys + .Include(x => x.Tenant) + .Where(x => x.IsGlobal && x.Tenant.Id == tenantId) + .ToListAsync(); + + result.Data = _mapper.Map<List<SurveyPreviewDto>>(surveys); + + return result; + } + + public async Task<ServiceResult<SurveyDetailDto>> GetMySurvey(int surveyId, int userId) + { + var result = new ServiceResult<SurveyDetailDto>(); + + var survey = await _context.Surveys + .Include(x => x.SurveyQuestions) + .FirstOrDefaultAsync(x => x.Id == surveyId); + + if (survey == null) + { + result.HasError = true; + result.AddMessage(string.Format(ErrorMessages.SurveyDoesNotExist, surveyId)); + return result; + } + + var surveyResponse = await _context.SurveyResponses + .Include(x => x.SurveyAnswers) + .FirstOrDefaultAsync(x => x.SurveyId == surveyId && x.UserId == userId); + + var surveyResponseDto = _mapper.Map<SurveyResponseDetailDto>(surveyResponse); + var surveyDto = _mapper.Map<SurveyDetailDto>(survey); + surveyDto.SurveyResponse = surveyResponseDto; + + result.Data = surveyDto; + return result; + } + + public async Task<ServiceResult<bool>> Complete(SurveyResponseCreateDto surveyResponse) + { + var result = new ServiceResult<bool>(); + + var survey = await _context.Surveys + .FirstOrDefaultAsync(x => x.Id == surveyResponse.SurveyId); + + if (survey == null) + { + result.HasError = true; + result.AddMessage(string.Format(ErrorMessages.SurveyDoesNotExist, surveyResponse.SurveyId)); + return result; + } + + var existingSurveyResponse = await _context.SurveyResponses + .Include(x => x.SurveyAnswers) + .FirstOrDefaultAsync(x => x.SurveyId == surveyResponse.SurveyId && x.UserId == surveyResponse.UserId); + + if (existingSurveyResponse != null) + { + result.HasError = true; + result.AddMessage(string.Format(ErrorMessages.SurveyResponseAlreadyExist, surveyResponse.UserId, surveyResponse.SurveyId)); + return result; + } + + var newSurveyResponse = _mapper.Map<SurveyResponse>(surveyResponse); + _context.Add(newSurveyResponse); + + + await _context.SaveChangesAsync(); + + return result; + } + + public async Task<ServiceResult<List<SurveyResponseDetailDto>>> GetAllResponses(int surveyId, string userType, int tenantId) + { + var result = new ServiceResult<List<SurveyResponseDetailDto>>(); + + var tenant = await _context.Tenants.FirstOrDefaultAsync(x => x.Id == tenantId); + + if (tenant == null) + { + result.HasError = true; + result.AddMessage(string.Format(ErrorMessages.TenantDoesNotExist, tenantId)); + return result; + } + + var survey = await _context.Surveys.FirstOrDefaultAsync(x => x.Id == surveyId); + + if (survey == null) + { + result.HasError = true; + result.AddMessage(string.Format(ErrorMessages.SurveyDoesNotExist, surveyId)); + return result; + } + + if (userType == UserTypes.Professor) + { + result.HasError = true; + result.AddMessage(string.Format(ErrorMessages.InvalidSurvey, surveyId)); + return result; + } + + var surveyResponses = await _context.SurveyResponses + .Include(x => x.SurveyAnswers) + .Where(x => x.SurveyId == surveyId) + .ToListAsync(); + + result.Data = _mapper.Map<List<SurveyResponseDetailDto>>(surveyResponses); + + return result; + } + } +} diff --git a/Tsi1.Api/Tsi1.BusinessLayer/Services/UserService.cs b/Tsi1.Api/Tsi1.BusinessLayer/Services/UserService.cs index f7710da8edce4efe65a498e4a24a6034da930c49..1e8f2b1174c63264ef9ac92bc91a87fc09400475 100644 --- a/Tsi1.Api/Tsi1.BusinessLayer/Services/UserService.cs +++ b/Tsi1.Api/Tsi1.BusinessLayer/Services/UserService.cs @@ -332,5 +332,31 @@ namespace Tsi1.BusinessLayer.Services return result; } + + public async Task<ServiceResult<List<UserPreviewDto>>> GetAdmins(int tenantId, string userType) + { + var result = new ServiceResult<List<UserPreviewDto>>(); + + var users = new List<User>(); + + if (userType == UserTypes.UdelarAdmin) + { + users = await _context.Users + .Where(x => x.UserType.Name == UserTypes.UdelarAdmin || x.UserType.Name == UserTypes.FacultyAdmin) + .ToListAsync(); + } + else + { + users = await _context.Users + .Where(x => x.UserType.Name == UserTypes.FacultyAdmin && x.TenantId == tenantId) + .ToListAsync(); + } + + var usersDto = _mapper.Map<List<UserPreviewDto>>(users); + + result.Data = usersDto; + + return result; + } } } diff --git a/Tsi1.Api/Tsi1.DataLayer/Entities/AnswerOption.cs b/Tsi1.Api/Tsi1.DataLayer/Entities/AnswerOption.cs new file mode 100644 index 0000000000000000000000000000000000000000..bf05fa1f904e6cabe57457c029ec4b82c923924c --- /dev/null +++ b/Tsi1.Api/Tsi1.DataLayer/Entities/AnswerOption.cs @@ -0,0 +1,19 @@ +using System; +using System.Collections.Generic; +using System.Text; + +namespace Tsi1.DataLayer.Entities +{ + public class AnswerOption + { + public AnswerOption() + { + SurveyAnswers = new HashSet<SurveyAnswer>(); + } + + public int Id { get; set; } + public string Name { get; set; } + + public ICollection<SurveyAnswer> SurveyAnswers { get; set; } + } +} diff --git a/Tsi1.Api/Tsi1.DataLayer/Entities/SectionItem.cs b/Tsi1.Api/Tsi1.DataLayer/Entities/SectionItem.cs index 3bd1ea22fc82fb58c6cc1015adeeae598bc64c67..f42b25859f23d392b954868de6e9059b5cc3356b 100644 --- a/Tsi1.Api/Tsi1.DataLayer/Entities/SectionItem.cs +++ b/Tsi1.Api/Tsi1.DataLayer/Entities/SectionItem.cs @@ -13,9 +13,13 @@ namespace Tsi1.DataLayer.Entities public int? ForumId { get; set; } public int? FileId { get; set; } + public int? SurveyId { get; set; } + public Section Section { get; set; } public SectionItemType SectionItemType { get; set; } public Forum Forum { get; set; } public File File { get; set; } + + public Survey Survey { get; set; } } } diff --git a/Tsi1.Api/Tsi1.DataLayer/Entities/Survey.cs b/Tsi1.Api/Tsi1.DataLayer/Entities/Survey.cs new file mode 100644 index 0000000000000000000000000000000000000000..8ab2b1100066d5ad5258fa248871548fa573fd4c --- /dev/null +++ b/Tsi1.Api/Tsi1.DataLayer/Entities/Survey.cs @@ -0,0 +1,24 @@ +using System; +using System.Collections.Generic; +using System.Text; + +namespace Tsi1.DataLayer.Entities +{ + public class Survey + { + public Survey() + { + SurveyQuestions = new HashSet<SurveyQuestion>(); + SurveyResponses = new HashSet<SurveyResponse>(); + } + public int Id { get; set; } + public string Name { get; set; } + public bool IsGlobal { get; set; } + + public SectionItem SectionItem { get; set; } + public Tenant Tenant { get; set; } + + public ICollection<SurveyQuestion> SurveyQuestions { get; set; } + public ICollection<SurveyResponse> SurveyResponses { get; set; } + } +} diff --git a/Tsi1.Api/Tsi1.DataLayer/Entities/SurveyAnswer.cs b/Tsi1.Api/Tsi1.DataLayer/Entities/SurveyAnswer.cs new file mode 100644 index 0000000000000000000000000000000000000000..f7d573bd0fd37a269d4d18d7fe17695f2684d39a --- /dev/null +++ b/Tsi1.Api/Tsi1.DataLayer/Entities/SurveyAnswer.cs @@ -0,0 +1,18 @@ +using System; +using System.Collections.Generic; +using System.Text; + +namespace Tsi1.DataLayer.Entities +{ + public class SurveyAnswer + { + public int Id { get; set; } + public int AnswerOptionId { get; set; } + public int SurveyResponseId { get; set; } + public int SurveyQuestionId { get; set; } + + public AnswerOption AnswerOption { get; set; } + public SurveyResponse SurveyResponse { get; set; } + public SurveyQuestion SurveyQuestion { get; set; } + } +} diff --git a/Tsi1.Api/Tsi1.DataLayer/Entities/SurveyQuestion.cs b/Tsi1.Api/Tsi1.DataLayer/Entities/SurveyQuestion.cs new file mode 100644 index 0000000000000000000000000000000000000000..32769392e5a21636f11181be36fe3c3da4815045 --- /dev/null +++ b/Tsi1.Api/Tsi1.DataLayer/Entities/SurveyQuestion.cs @@ -0,0 +1,22 @@ +using System; +using System.Collections.Generic; +using System.Text; + +namespace Tsi1.DataLayer.Entities +{ + public class SurveyQuestion + { + public SurveyQuestion() + { + SurveyAnswers = new HashSet<SurveyAnswer>(); + } + + public int Id { get; set; } + public string Question { get; set; } + public int SurveyId { get; set; } + public Survey Survey { get; set; } + + public ICollection<SurveyAnswer> SurveyAnswers { get; set; } + + } +} diff --git a/Tsi1.Api/Tsi1.DataLayer/Entities/SurveyResponse.cs b/Tsi1.Api/Tsi1.DataLayer/Entities/SurveyResponse.cs new file mode 100644 index 0000000000000000000000000000000000000000..c5af9e970ca490d625d4cc482c9dd3716172fef7 --- /dev/null +++ b/Tsi1.Api/Tsi1.DataLayer/Entities/SurveyResponse.cs @@ -0,0 +1,22 @@ +using System; +using System.Collections.Generic; +using System.Text; + +namespace Tsi1.DataLayer.Entities +{ + public class SurveyResponse + { + public SurveyResponse() + { + SurveyAnswers = new HashSet<SurveyAnswer>(); + } + + public int Id { get; set; } + public int UserId { get; set; } + public int SurveyId { get; set; } + + public User User { get; set; } + public Survey Survey { get; set; } + public ICollection<SurveyAnswer> SurveyAnswers { get; set; } + } +} diff --git a/Tsi1.Api/Tsi1.DataLayer/Entities/Tenant.cs b/Tsi1.Api/Tsi1.DataLayer/Entities/Tenant.cs index ce807be9044482303da464874681b0f0b4814d67..0a153f83884dc7a09793b79647cb6dc174309b54 100644 --- a/Tsi1.Api/Tsi1.DataLayer/Entities/Tenant.cs +++ b/Tsi1.Api/Tsi1.DataLayer/Entities/Tenant.cs @@ -12,6 +12,7 @@ namespace Tsi1.DataLayer.Entities Professors = new HashSet<Professor>(); Students = new HashSet<Student>(); Users = new HashSet<User>(); + Surveys = new HashSet<Survey>(); } public int Id { get; set; } @@ -22,5 +23,6 @@ namespace Tsi1.DataLayer.Entities public ICollection<Professor> Professors { get; set; } public ICollection<Student> Students { get; set; } public ICollection<User> Users { get; set; } + public ICollection<Survey> Surveys { get; set; } } } diff --git a/Tsi1.Api/Tsi1.DataLayer/Entities/User.cs b/Tsi1.Api/Tsi1.DataLayer/Entities/User.cs index a62c4662edc5a781040ab78d454b33875ebb76d3..e3656322faa236d10a84b18c1fc4985cb240280d 100644 --- a/Tsi1.Api/Tsi1.DataLayer/Entities/User.cs +++ b/Tsi1.Api/Tsi1.DataLayer/Entities/User.cs @@ -11,6 +11,7 @@ namespace Tsi1.DataLayer.Entities Posts = new HashSet<Post>(); PostMessages = new HashSet<PostMessage>(); ForumUsers = new HashSet<ForumUser>(); + SurveyResponses = new HashSet<SurveyResponse>(); } public int Id { get; set; } @@ -41,5 +42,6 @@ namespace Tsi1.DataLayer.Entities public ICollection<Post> Posts { get; set; } public ICollection<PostMessage> PostMessages { get; set; } public ICollection<ForumUser> ForumUsers { get; set; } + public ICollection<SurveyResponse> SurveyResponses { get; set; } } } diff --git a/Tsi1.Api/Tsi1.DataLayer/EntityConfiguration/AnswerOptionConfiguration.cs b/Tsi1.Api/Tsi1.DataLayer/EntityConfiguration/AnswerOptionConfiguration.cs new file mode 100644 index 0000000000000000000000000000000000000000..e0ef2bbf59cffa846bf1e88b7e343da1c55a78ee --- /dev/null +++ b/Tsi1.Api/Tsi1.DataLayer/EntityConfiguration/AnswerOptionConfiguration.cs @@ -0,0 +1,23 @@ +using Microsoft.EntityFrameworkCore; +using Microsoft.EntityFrameworkCore.Metadata.Builders; +using System; +using System.Collections.Generic; +using System.Text; +using Tsi1.DataLayer.Entities; + +namespace Tsi1.DataLayer.EntityConfiguration +{ + public class AnswerOptionConfiguration : IEntityTypeConfiguration<AnswerOption> + { + public void Configure(EntityTypeBuilder<AnswerOption> builder) + { + builder.HasKey(x => x.Id); + + builder.HasIndex(x => x.Name); + + builder.Property(x => x.Name) + .IsRequired() + .HasColumnType("character varying(100)"); + } + } +} diff --git a/Tsi1.Api/Tsi1.DataLayer/EntityConfiguration/SectionItemConfiguration.cs b/Tsi1.Api/Tsi1.DataLayer/EntityConfiguration/SectionItemConfiguration.cs index ffcda8dfd6c0f26718219dd2e30e04fcd6a1db81..592b44415b20ebc4ec13287c82e07a252ded9b92 100644 --- a/Tsi1.Api/Tsi1.DataLayer/EntityConfiguration/SectionItemConfiguration.cs +++ b/Tsi1.Api/Tsi1.DataLayer/EntityConfiguration/SectionItemConfiguration.cs @@ -31,6 +31,10 @@ namespace Tsi1.DataLayer.EntityConfiguration builder.HasOne(x => x.Section) .WithMany(x => x.SectionItems) .HasForeignKey(x => x.SectionId); + + builder.HasOne(x => x.Survey) + .WithOne(x => x.SectionItem) + .HasForeignKey<SectionItem>(x => x.SurveyId); } } } diff --git a/Tsi1.Api/Tsi1.DataLayer/EntityConfiguration/SurveyAnswerConfiguration.cs b/Tsi1.Api/Tsi1.DataLayer/EntityConfiguration/SurveyAnswerConfiguration.cs new file mode 100644 index 0000000000000000000000000000000000000000..8b4f6739f8a13c3590f6494ff8a177441b95ef94 --- /dev/null +++ b/Tsi1.Api/Tsi1.DataLayer/EntityConfiguration/SurveyAnswerConfiguration.cs @@ -0,0 +1,29 @@ +using Microsoft.EntityFrameworkCore; +using Microsoft.EntityFrameworkCore.Metadata.Builders; +using System; +using System.Collections.Generic; +using System.Text; +using Tsi1.DataLayer.Entities; + +namespace Tsi1.DataLayer.EntityConfiguration +{ + public class SurveyAnswerConfiguration : IEntityTypeConfiguration<SurveyAnswer> + { + public void Configure(EntityTypeBuilder<SurveyAnswer> builder) + { + builder.HasKey(x => x.Id); + + builder.HasOne(x => x.AnswerOption) + .WithMany(x => x.SurveyAnswers) + .HasForeignKey(x => x.AnswerOptionId); + + builder.HasOne(x => x.SurveyResponse) + .WithMany(x => x.SurveyAnswers) + .HasForeignKey(x => x.SurveyResponseId); + + builder.HasOne(x => x.SurveyQuestion) + .WithMany(x => x.SurveyAnswers) + .HasForeignKey(x => x.SurveyQuestionId); + } + } +} diff --git a/Tsi1.Api/Tsi1.DataLayer/EntityConfiguration/SurveyConfiguration.cs b/Tsi1.Api/Tsi1.DataLayer/EntityConfiguration/SurveyConfiguration.cs new file mode 100644 index 0000000000000000000000000000000000000000..2340c231d7dab274d9eb31e35b44346483330008 --- /dev/null +++ b/Tsi1.Api/Tsi1.DataLayer/EntityConfiguration/SurveyConfiguration.cs @@ -0,0 +1,24 @@ +using Microsoft.EntityFrameworkCore; +using Microsoft.EntityFrameworkCore.Metadata.Builders; +using System; +using System.Collections.Generic; +using System.Text; +using Tsi1.DataLayer.Entities; + +namespace Tsi1.DataLayer.EntityConfiguration +{ + public class SurveyConfiguration : IEntityTypeConfiguration<Survey> + { + public void Configure(EntityTypeBuilder<Survey> builder) + { + builder.HasKey(x => x.Id); + + builder.HasIndex(x => x.Name); + + builder.Property(x => x.Name) + .IsRequired() + .HasColumnType("character varying(255)"); + + } + } +} diff --git a/Tsi1.Api/Tsi1.DataLayer/EntityConfiguration/SurveyQuestionConfiguration.cs b/Tsi1.Api/Tsi1.DataLayer/EntityConfiguration/SurveyQuestionConfiguration.cs new file mode 100644 index 0000000000000000000000000000000000000000..34fc8b49ae3de6e20a421fb47adc8fecdef054e1 --- /dev/null +++ b/Tsi1.Api/Tsi1.DataLayer/EntityConfiguration/SurveyQuestionConfiguration.cs @@ -0,0 +1,25 @@ +using Microsoft.EntityFrameworkCore; +using Microsoft.EntityFrameworkCore.Metadata.Builders; +using System; +using System.Collections.Generic; +using System.Text; +using Tsi1.DataLayer.Entities; + +namespace Tsi1.DataLayer.EntityConfiguration +{ + public class SurveyQuestionConfiguration : IEntityTypeConfiguration<SurveyQuestion> + { + public void Configure(EntityTypeBuilder<SurveyQuestion> builder) + { + builder.HasKey(x => x.Id); + + builder.Property(x => x.Question) + .IsRequired() + .HasColumnType("character varying(255)"); + + builder.HasOne(x => x.Survey) + .WithMany(x => x.SurveyQuestions) + .HasForeignKey(x => x.SurveyId); + } + } +} diff --git a/Tsi1.Api/Tsi1.DataLayer/EntityConfiguration/SurveyResponseConfiguration.cs b/Tsi1.Api/Tsi1.DataLayer/EntityConfiguration/SurveyResponseConfiguration.cs new file mode 100644 index 0000000000000000000000000000000000000000..b9ad0c750d5acff46cb6dbffd5b95f9c78d343f8 --- /dev/null +++ b/Tsi1.Api/Tsi1.DataLayer/EntityConfiguration/SurveyResponseConfiguration.cs @@ -0,0 +1,25 @@ +using Microsoft.EntityFrameworkCore; +using Microsoft.EntityFrameworkCore.Metadata.Builders; +using System; +using System.Collections.Generic; +using System.Text; +using Tsi1.DataLayer.Entities; + +namespace Tsi1.DataLayer.EntityConfiguration +{ + public class SurveyResponseConfiguration : IEntityTypeConfiguration<SurveyResponse> + { + public void Configure(EntityTypeBuilder<SurveyResponse> builder) + { + builder.HasKey(x => x.Id); + + builder.HasOne(x => x.User) + .WithMany(x => x.SurveyResponses) + .HasForeignKey(x => x.UserId); + + builder.HasOne(x => x.Survey) + .WithMany(x => x.SurveyResponses) + .HasForeignKey(x => x.SurveyId); + } + } +} diff --git a/Tsi1.Api/Tsi1.DataLayer/Migrations/20201108233000_add-survey-entities.Designer.cs b/Tsi1.Api/Tsi1.DataLayer/Migrations/20201108233000_add-survey-entities.Designer.cs new file mode 100644 index 0000000000000000000000000000000000000000..8e3d4e0be10bfcc9a7f8e9e7429ae05f8022d492 --- /dev/null +++ b/Tsi1.Api/Tsi1.DataLayer/Migrations/20201108233000_add-survey-entities.Designer.cs @@ -0,0 +1,786 @@ +// <auto-generated /> +using System; +using Microsoft.EntityFrameworkCore; +using Microsoft.EntityFrameworkCore.Infrastructure; +using Microsoft.EntityFrameworkCore.Migrations; +using Microsoft.EntityFrameworkCore.Storage.ValueConversion; +using Npgsql.EntityFrameworkCore.PostgreSQL.Metadata; +using Tsi1.DataLayer; + +namespace Tsi1.DataLayer.Migrations +{ + [DbContext(typeof(Tsi1Context))] + [Migration("20201108233000_add-survey-entities")] + partial class addsurveyentities + { + protected override void BuildTargetModel(ModelBuilder modelBuilder) + { +#pragma warning disable 612, 618 + modelBuilder + .HasAnnotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.IdentityByDefaultColumn) + .HasAnnotation("ProductVersion", "3.1.4") + .HasAnnotation("Relational:MaxIdentifierLength", 63); + + modelBuilder.Entity("Tsi1.DataLayer.Entities.AnswerOption", b => + { + b.Property<int>("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer") + .HasAnnotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.IdentityByDefaultColumn); + + b.Property<string>("Name") + .IsRequired() + .HasColumnType("character varying(100)"); + + b.HasKey("Id"); + + b.HasIndex("Name"); + + b.ToTable("AnswerOptions"); + }); + + modelBuilder.Entity("Tsi1.DataLayer.Entities.Connection", b => + { + b.Property<string>("ConnectionId") + .HasColumnType("text"); + + b.Property<string>("GroupName") + .HasColumnType("text"); + + b.Property<int>("UserId") + .HasColumnType("integer"); + + b.HasKey("ConnectionId"); + + b.HasIndex("GroupName"); + + b.ToTable("Connections"); + }); + + modelBuilder.Entity("Tsi1.DataLayer.Entities.Course", b => + { + b.Property<int>("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer") + .HasAnnotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.IdentityByDefaultColumn); + + b.Property<string>("Name") + .IsRequired() + .HasColumnType("character varying(50)"); + + b.Property<int>("TenantId") + .HasColumnType("integer"); + + b.HasKey("Id"); + + b.HasIndex("TenantId"); + + b.HasIndex("Name", "TenantId") + .IsUnique(); + + b.ToTable("Courses"); + }); + + modelBuilder.Entity("Tsi1.DataLayer.Entities.File", b => + { + b.Property<int>("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer") + .HasAnnotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.IdentityByDefaultColumn); + + b.Property<string>("Name") + .IsRequired() + .HasColumnType("character varying(50)"); + + b.Property<string>("Path") + .IsRequired() + .HasColumnType("character varying(1000)"); + + b.HasKey("Id"); + + b.HasIndex("Path") + .IsUnique(); + + b.ToTable("Files"); + }); + + modelBuilder.Entity("Tsi1.DataLayer.Entities.Forum", b => + { + b.Property<int>("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer") + .HasAnnotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.IdentityByDefaultColumn); + + b.Property<string>("Name") + .IsRequired() + .HasColumnType("character varying(50)"); + + b.HasKey("Id"); + + b.ToTable("Forums"); + }); + + modelBuilder.Entity("Tsi1.DataLayer.Entities.ForumUser", b => + { + b.Property<int>("ForumId") + .HasColumnType("integer"); + + b.Property<int>("UserId") + .HasColumnType("integer"); + + b.HasKey("ForumId", "UserId"); + + b.HasIndex("UserId"); + + b.ToTable("ForumUsers"); + }); + + modelBuilder.Entity("Tsi1.DataLayer.Entities.Group", b => + { + b.Property<string>("Name") + .HasColumnType("text"); + + b.HasKey("Name"); + + b.ToTable("Groups"); + }); + + modelBuilder.Entity("Tsi1.DataLayer.Entities.Post", b => + { + b.Property<int>("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer") + .HasAnnotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.IdentityByDefaultColumn); + + b.Property<DateTime>("Date") + .HasColumnType("timestamp without time zone"); + + b.Property<int>("ForumId") + .HasColumnType("integer"); + + b.Property<string>("Title") + .IsRequired() + .HasColumnType("character varying(100)"); + + b.Property<int>("UserId") + .HasColumnType("integer"); + + b.HasKey("Id"); + + b.HasIndex("UserId"); + + b.HasIndex("ForumId", "Title") + .IsUnique(); + + b.ToTable("Posts"); + }); + + modelBuilder.Entity("Tsi1.DataLayer.Entities.PostMessage", b => + { + b.Property<int>("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer") + .HasAnnotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.IdentityByDefaultColumn); + + b.Property<string>("Content") + .IsRequired() + .HasColumnType("character varying(10485760)"); + + b.Property<DateTime>("Date") + .HasColumnType("timestamp without time zone"); + + b.Property<int>("PostId") + .HasColumnType("integer"); + + b.Property<int>("UserId") + .HasColumnType("integer"); + + b.HasKey("Id"); + + b.HasIndex("PostId"); + + b.HasIndex("UserId"); + + b.ToTable("PostMessages"); + }); + + modelBuilder.Entity("Tsi1.DataLayer.Entities.Professor", b => + { + b.Property<int>("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer") + .HasAnnotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.IdentityByDefaultColumn); + + b.Property<string>("IdentityCard") + .IsRequired() + .HasColumnType("character varying(50)"); + + b.Property<int>("TenantId") + .HasColumnType("integer"); + + b.HasKey("Id"); + + b.HasIndex("TenantId"); + + b.HasIndex("IdentityCard", "TenantId") + .IsUnique(); + + b.ToTable("Professors"); + }); + + modelBuilder.Entity("Tsi1.DataLayer.Entities.ProfessorCourse", b => + { + b.Property<int>("ProfessorId") + .HasColumnType("integer"); + + b.Property<int>("CourseId") + .HasColumnType("integer"); + + b.HasKey("ProfessorId", "CourseId"); + + b.HasIndex("CourseId"); + + b.ToTable("ProfessorCourses"); + }); + + modelBuilder.Entity("Tsi1.DataLayer.Entities.Section", b => + { + b.Property<int>("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer") + .HasAnnotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.IdentityByDefaultColumn); + + b.Property<int>("CourseId") + .HasColumnType("integer"); + + b.Property<string>("Name") + .IsRequired() + .HasColumnType("character varying(255)"); + + b.Property<int>("Order") + .HasColumnType("integer"); + + b.HasKey("Id"); + + b.HasIndex("CourseId"); + + b.ToTable("Sections"); + }); + + modelBuilder.Entity("Tsi1.DataLayer.Entities.SectionItem", b => + { + b.Property<int>("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer") + .HasAnnotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.IdentityByDefaultColumn); + + b.Property<int?>("FileId") + .HasColumnType("integer"); + + b.Property<int?>("ForumId") + .HasColumnType("integer"); + + b.Property<int>("Order") + .HasColumnType("integer"); + + b.Property<int>("SectionId") + .HasColumnType("integer"); + + b.Property<int>("SectionItemTypeId") + .HasColumnType("integer"); + + b.Property<int?>("SurveyId") + .HasColumnType("integer"); + + b.HasKey("Id"); + + b.HasIndex("FileId") + .IsUnique(); + + b.HasIndex("ForumId") + .IsUnique(); + + b.HasIndex("SectionId"); + + b.HasIndex("SectionItemTypeId"); + + b.HasIndex("SurveyId") + .IsUnique(); + + b.ToTable("SectionItems"); + }); + + modelBuilder.Entity("Tsi1.DataLayer.Entities.SectionItemType", b => + { + b.Property<int>("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer") + .HasAnnotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.IdentityByDefaultColumn); + + b.Property<string>("Name") + .IsRequired() + .HasColumnType("character varying(100)"); + + b.HasKey("Id"); + + b.ToTable("SectionItemTypes"); + }); + + modelBuilder.Entity("Tsi1.DataLayer.Entities.Student", b => + { + b.Property<int>("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer") + .HasAnnotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.IdentityByDefaultColumn); + + b.Property<int>("Age") + .HasColumnType("integer"); + + b.Property<string>("IdentityCard") + .IsRequired() + .HasColumnType("character varying(50)"); + + b.Property<int>("TenantId") + .HasColumnType("integer"); + + b.HasKey("Id"); + + b.HasIndex("TenantId"); + + b.HasIndex("IdentityCard", "TenantId") + .IsUnique(); + + b.ToTable("Students"); + }); + + modelBuilder.Entity("Tsi1.DataLayer.Entities.StudentCourse", b => + { + b.Property<int>("StudentId") + .HasColumnType("integer"); + + b.Property<int>("CourseId") + .HasColumnType("integer"); + + b.HasKey("StudentId", "CourseId"); + + b.HasIndex("CourseId"); + + b.ToTable("StudentCourses"); + }); + + modelBuilder.Entity("Tsi1.DataLayer.Entities.Survey", b => + { + b.Property<int>("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer") + .HasAnnotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.IdentityByDefaultColumn); + + b.Property<bool>("IsGlobal") + .HasColumnType("boolean"); + + b.Property<string>("Name") + .IsRequired() + .HasColumnType("character varying(255)"); + + b.Property<int>("TenantId") + .HasColumnType("integer"); + + b.HasKey("Id"); + + b.HasIndex("Name"); + + b.HasIndex("TenantId"); + + b.ToTable("Surveys"); + }); + + modelBuilder.Entity("Tsi1.DataLayer.Entities.SurveyAnswer", b => + { + b.Property<int>("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer") + .HasAnnotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.IdentityByDefaultColumn); + + b.Property<int>("AnswerOptionId") + .HasColumnType("integer"); + + b.Property<int>("SurveyQuestionId") + .HasColumnType("integer"); + + b.Property<int>("SurveyResponseId") + .HasColumnType("integer"); + + b.HasKey("Id"); + + b.HasIndex("AnswerOptionId"); + + b.HasIndex("SurveyQuestionId"); + + b.HasIndex("SurveyResponseId"); + + b.ToTable("SurveyAnswers"); + }); + + modelBuilder.Entity("Tsi1.DataLayer.Entities.SurveyQuestion", b => + { + b.Property<int>("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer") + .HasAnnotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.IdentityByDefaultColumn); + + b.Property<string>("Question") + .IsRequired() + .HasColumnType("character varying(255)"); + + b.Property<int>("SurveyId") + .HasColumnType("integer"); + + b.HasKey("Id"); + + b.HasIndex("SurveyId"); + + b.ToTable("SurveyQuestions"); + }); + + modelBuilder.Entity("Tsi1.DataLayer.Entities.SurveyResponse", b => + { + b.Property<int>("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer") + .HasAnnotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.IdentityByDefaultColumn); + + b.Property<int>("SurveyId") + .HasColumnType("integer"); + + b.Property<int>("UserId") + .HasColumnType("integer"); + + b.HasKey("Id"); + + b.HasIndex("SurveyId"); + + b.HasIndex("UserId"); + + b.ToTable("SurveyResponses"); + }); + + modelBuilder.Entity("Tsi1.DataLayer.Entities.Tenant", b => + { + b.Property<int>("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer") + .HasAnnotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.IdentityByDefaultColumn); + + b.Property<string>("Name") + .IsRequired() + .HasColumnType("character varying(50)"); + + b.HasKey("Id"); + + b.HasIndex("Name") + .IsUnique(); + + b.ToTable("Tenants"); + }); + + modelBuilder.Entity("Tsi1.DataLayer.Entities.User", b => + { + b.Property<int>("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer") + .HasAnnotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.IdentityByDefaultColumn); + + b.Property<string>("Email") + .IsRequired() + .HasColumnType("character varying(255)"); + + b.Property<string>("FirstName") + .IsRequired() + .HasColumnType("character varying(255)"); + + b.Property<string>("LastName") + .IsRequired() + .HasColumnType("character varying(255)"); + + b.Property<string>("Password") + .IsRequired() + .HasColumnType("character varying(255)"); + + b.Property<int?>("ProfessorId") + .HasColumnType("integer"); + + b.Property<int?>("StudentId") + .HasColumnType("integer"); + + b.Property<int>("TenantId") + .HasColumnType("integer"); + + b.Property<int>("UserTypeId") + .HasColumnType("integer"); + + b.Property<string>("Username") + .IsRequired() + .HasColumnType("character varying(50)"); + + b.HasKey("Id"); + + b.HasIndex("ProfessorId") + .IsUnique(); + + b.HasIndex("StudentId") + .IsUnique(); + + b.HasIndex("TenantId"); + + b.HasIndex("UserTypeId"); + + b.HasIndex("Username", "TenantId") + .IsUnique(); + + b.ToTable("Users"); + }); + + modelBuilder.Entity("Tsi1.DataLayer.Entities.UserType", b => + { + b.Property<int>("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer") + .HasAnnotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.IdentityByDefaultColumn); + + b.Property<string>("Name") + .IsRequired() + .HasColumnType("character varying(50)"); + + b.HasKey("Id"); + + b.HasIndex("Name") + .IsUnique(); + + b.ToTable("UserTypes"); + }); + + modelBuilder.Entity("Tsi1.DataLayer.Entities.Connection", b => + { + b.HasOne("Tsi1.DataLayer.Entities.Group", "Group") + .WithMany("Connections") + .HasForeignKey("GroupName"); + }); + + modelBuilder.Entity("Tsi1.DataLayer.Entities.Course", b => + { + b.HasOne("Tsi1.DataLayer.Entities.Tenant", "Tenant") + .WithMany("Courses") + .HasForeignKey("TenantId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + }); + + modelBuilder.Entity("Tsi1.DataLayer.Entities.ForumUser", b => + { + b.HasOne("Tsi1.DataLayer.Entities.Forum", "Forum") + .WithMany("ForumUsers") + .HasForeignKey("ForumId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Tsi1.DataLayer.Entities.User", "User") + .WithMany("ForumUsers") + .HasForeignKey("UserId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + }); + + modelBuilder.Entity("Tsi1.DataLayer.Entities.Post", b => + { + b.HasOne("Tsi1.DataLayer.Entities.Forum", "Forum") + .WithMany("Posts") + .HasForeignKey("ForumId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Tsi1.DataLayer.Entities.User", "User") + .WithMany("Posts") + .HasForeignKey("UserId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + }); + + modelBuilder.Entity("Tsi1.DataLayer.Entities.PostMessage", b => + { + b.HasOne("Tsi1.DataLayer.Entities.Post", "Post") + .WithMany("PostMessages") + .HasForeignKey("PostId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Tsi1.DataLayer.Entities.User", "User") + .WithMany("PostMessages") + .HasForeignKey("UserId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + }); + + modelBuilder.Entity("Tsi1.DataLayer.Entities.Professor", b => + { + b.HasOne("Tsi1.DataLayer.Entities.Tenant", "Tenant") + .WithMany("Professors") + .HasForeignKey("TenantId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + }); + + modelBuilder.Entity("Tsi1.DataLayer.Entities.ProfessorCourse", b => + { + b.HasOne("Tsi1.DataLayer.Entities.Course", "Course") + .WithMany("ProfessorCourses") + .HasForeignKey("CourseId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Tsi1.DataLayer.Entities.Professor", "Professor") + .WithMany("ProfessorCourses") + .HasForeignKey("ProfessorId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + }); + + modelBuilder.Entity("Tsi1.DataLayer.Entities.Section", b => + { + b.HasOne("Tsi1.DataLayer.Entities.Course", "Course") + .WithMany("Sections") + .HasForeignKey("CourseId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + }); + + modelBuilder.Entity("Tsi1.DataLayer.Entities.SectionItem", b => + { + b.HasOne("Tsi1.DataLayer.Entities.File", "File") + .WithOne("SectionItem") + .HasForeignKey("Tsi1.DataLayer.Entities.SectionItem", "FileId"); + + b.HasOne("Tsi1.DataLayer.Entities.Forum", "Forum") + .WithOne("SectionItem") + .HasForeignKey("Tsi1.DataLayer.Entities.SectionItem", "ForumId"); + + b.HasOne("Tsi1.DataLayer.Entities.Section", "Section") + .WithMany("SectionItems") + .HasForeignKey("SectionId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Tsi1.DataLayer.Entities.SectionItemType", "SectionItemType") + .WithMany("SectionItems") + .HasForeignKey("SectionItemTypeId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Tsi1.DataLayer.Entities.Survey", "Survey") + .WithOne("SectionItem") + .HasForeignKey("Tsi1.DataLayer.Entities.SectionItem", "SurveyId"); + }); + + modelBuilder.Entity("Tsi1.DataLayer.Entities.Student", b => + { + b.HasOne("Tsi1.DataLayer.Entities.Tenant", "Tenant") + .WithMany("Students") + .HasForeignKey("TenantId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + }); + + modelBuilder.Entity("Tsi1.DataLayer.Entities.StudentCourse", b => + { + b.HasOne("Tsi1.DataLayer.Entities.Course", "Course") + .WithMany("StudentCourses") + .HasForeignKey("CourseId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Tsi1.DataLayer.Entities.Student", "Student") + .WithMany("StudentCourses") + .HasForeignKey("StudentId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + }); + + modelBuilder.Entity("Tsi1.DataLayer.Entities.Survey", b => + { + b.HasOne("Tsi1.DataLayer.Entities.Tenant", "Tenant") + .WithMany("Surveys") + .HasForeignKey("TenantId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + }); + + modelBuilder.Entity("Tsi1.DataLayer.Entities.SurveyAnswer", b => + { + b.HasOne("Tsi1.DataLayer.Entities.AnswerOption", "AnswerOption") + .WithMany("SurveyAnswers") + .HasForeignKey("AnswerOptionId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Tsi1.DataLayer.Entities.SurveyQuestion", "SurveyQuestion") + .WithMany("SurveyAnswers") + .HasForeignKey("SurveyQuestionId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Tsi1.DataLayer.Entities.SurveyResponse", "SurveyResponse") + .WithMany("SurveyAnswers") + .HasForeignKey("SurveyResponseId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + }); + + modelBuilder.Entity("Tsi1.DataLayer.Entities.SurveyQuestion", b => + { + b.HasOne("Tsi1.DataLayer.Entities.Survey", "Survey") + .WithMany("SurveyQuestions") + .HasForeignKey("SurveyId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + }); + + modelBuilder.Entity("Tsi1.DataLayer.Entities.SurveyResponse", b => + { + b.HasOne("Tsi1.DataLayer.Entities.Survey", "Survey") + .WithMany("SurveyResponses") + .HasForeignKey("SurveyId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Tsi1.DataLayer.Entities.User", "User") + .WithMany("SurveyResponses") + .HasForeignKey("UserId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + }); + + modelBuilder.Entity("Tsi1.DataLayer.Entities.User", b => + { + b.HasOne("Tsi1.DataLayer.Entities.Professor", "Professor") + .WithOne("User") + .HasForeignKey("Tsi1.DataLayer.Entities.User", "ProfessorId"); + + b.HasOne("Tsi1.DataLayer.Entities.Student", "Student") + .WithOne("User") + .HasForeignKey("Tsi1.DataLayer.Entities.User", "StudentId"); + + b.HasOne("Tsi1.DataLayer.Entities.Tenant", "Tenant") + .WithMany("Users") + .HasForeignKey("TenantId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Tsi1.DataLayer.Entities.UserType", "UserType") + .WithMany() + .HasForeignKey("UserTypeId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + }); +#pragma warning restore 612, 618 + } + } +} diff --git a/Tsi1.Api/Tsi1.DataLayer/Migrations/20201108233000_add-survey-entities.cs b/Tsi1.Api/Tsi1.DataLayer/Migrations/20201108233000_add-survey-entities.cs new file mode 100644 index 0000000000000000000000000000000000000000..9ec24a5d00e7bc9f7e894209671769346c8f6895 --- /dev/null +++ b/Tsi1.Api/Tsi1.DataLayer/Migrations/20201108233000_add-survey-entities.cs @@ -0,0 +1,218 @@ +using Microsoft.EntityFrameworkCore.Migrations; +using Npgsql.EntityFrameworkCore.PostgreSQL.Metadata; + +namespace Tsi1.DataLayer.Migrations +{ + public partial class addsurveyentities : Migration + { + protected override void Up(MigrationBuilder migrationBuilder) + { + migrationBuilder.AddColumn<int>( + name: "SurveyId", + table: "SectionItems", + nullable: true); + + migrationBuilder.CreateTable( + name: "AnswerOptions", + columns: table => new + { + Id = table.Column<int>(nullable: false) + .Annotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.IdentityByDefaultColumn), + Name = table.Column<string>(type: "character varying(100)", nullable: false) + }, + constraints: table => + { + table.PrimaryKey("PK_AnswerOptions", x => x.Id); + }); + + migrationBuilder.CreateTable( + name: "Surveys", + columns: table => new + { + Id = table.Column<int>(nullable: false) + .Annotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.IdentityByDefaultColumn), + Name = table.Column<string>(type: "character varying(255)", nullable: false), + IsGlobal = table.Column<bool>(nullable: false), + TenantId = table.Column<int>(nullable: false) + }, + constraints: table => + { + table.PrimaryKey("PK_Surveys", x => x.Id); + table.ForeignKey( + name: "FK_Surveys_Tenants_TenantId", + column: x => x.TenantId, + principalTable: "Tenants", + principalColumn: "Id", + onDelete: ReferentialAction.Cascade); + }); + + migrationBuilder.CreateTable( + name: "SurveyQuestions", + columns: table => new + { + Id = table.Column<int>(nullable: false) + .Annotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.IdentityByDefaultColumn), + Question = table.Column<string>(type: "character varying(255)", nullable: false), + SurveyId = table.Column<int>(nullable: false) + }, + constraints: table => + { + table.PrimaryKey("PK_SurveyQuestions", x => x.Id); + table.ForeignKey( + name: "FK_SurveyQuestions_Surveys_SurveyId", + column: x => x.SurveyId, + principalTable: "Surveys", + principalColumn: "Id", + onDelete: ReferentialAction.Cascade); + }); + + migrationBuilder.CreateTable( + name: "SurveyResponses", + columns: table => new + { + Id = table.Column<int>(nullable: false) + .Annotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.IdentityByDefaultColumn), + UserId = table.Column<int>(nullable: false), + SurveyId = table.Column<int>(nullable: false) + }, + constraints: table => + { + table.PrimaryKey("PK_SurveyResponses", x => x.Id); + table.ForeignKey( + name: "FK_SurveyResponses_Surveys_SurveyId", + column: x => x.SurveyId, + principalTable: "Surveys", + principalColumn: "Id", + onDelete: ReferentialAction.Cascade); + table.ForeignKey( + name: "FK_SurveyResponses_Users_UserId", + column: x => x.UserId, + principalTable: "Users", + principalColumn: "Id", + onDelete: ReferentialAction.Cascade); + }); + + migrationBuilder.CreateTable( + name: "SurveyAnswers", + columns: table => new + { + Id = table.Column<int>(nullable: false) + .Annotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.IdentityByDefaultColumn), + AnswerOptionId = table.Column<int>(nullable: false), + SurveyResponseId = table.Column<int>(nullable: false), + SurveyQuestionId = table.Column<int>(nullable: false) + }, + constraints: table => + { + table.PrimaryKey("PK_SurveyAnswers", x => x.Id); + table.ForeignKey( + name: "FK_SurveyAnswers_AnswerOptions_AnswerOptionId", + column: x => x.AnswerOptionId, + principalTable: "AnswerOptions", + principalColumn: "Id", + onDelete: ReferentialAction.Cascade); + table.ForeignKey( + name: "FK_SurveyAnswers_SurveyQuestions_SurveyQuestionId", + column: x => x.SurveyQuestionId, + principalTable: "SurveyQuestions", + principalColumn: "Id", + onDelete: ReferentialAction.Cascade); + table.ForeignKey( + name: "FK_SurveyAnswers_SurveyResponses_SurveyResponseId", + column: x => x.SurveyResponseId, + principalTable: "SurveyResponses", + principalColumn: "Id", + onDelete: ReferentialAction.Cascade); + }); + + migrationBuilder.CreateIndex( + name: "IX_SectionItems_SurveyId", + table: "SectionItems", + column: "SurveyId", + unique: true); + + migrationBuilder.CreateIndex( + name: "IX_AnswerOptions_Name", + table: "AnswerOptions", + column: "Name"); + + migrationBuilder.CreateIndex( + name: "IX_SurveyAnswers_AnswerOptionId", + table: "SurveyAnswers", + column: "AnswerOptionId"); + + migrationBuilder.CreateIndex( + name: "IX_SurveyAnswers_SurveyQuestionId", + table: "SurveyAnswers", + column: "SurveyQuestionId"); + + migrationBuilder.CreateIndex( + name: "IX_SurveyAnswers_SurveyResponseId", + table: "SurveyAnswers", + column: "SurveyResponseId"); + + migrationBuilder.CreateIndex( + name: "IX_SurveyQuestions_SurveyId", + table: "SurveyQuestions", + column: "SurveyId"); + + migrationBuilder.CreateIndex( + name: "IX_SurveyResponses_SurveyId", + table: "SurveyResponses", + column: "SurveyId"); + + migrationBuilder.CreateIndex( + name: "IX_SurveyResponses_UserId", + table: "SurveyResponses", + column: "UserId"); + + migrationBuilder.CreateIndex( + name: "IX_Surveys_Name", + table: "Surveys", + column: "Name"); + + migrationBuilder.CreateIndex( + name: "IX_Surveys_TenantId", + table: "Surveys", + column: "TenantId"); + + migrationBuilder.AddForeignKey( + name: "FK_SectionItems_Surveys_SurveyId", + table: "SectionItems", + column: "SurveyId", + principalTable: "Surveys", + principalColumn: "Id", + onDelete: ReferentialAction.Restrict); + } + + protected override void Down(MigrationBuilder migrationBuilder) + { + migrationBuilder.DropForeignKey( + name: "FK_SectionItems_Surveys_SurveyId", + table: "SectionItems"); + + migrationBuilder.DropTable( + name: "SurveyAnswers"); + + migrationBuilder.DropTable( + name: "AnswerOptions"); + + migrationBuilder.DropTable( + name: "SurveyQuestions"); + + migrationBuilder.DropTable( + name: "SurveyResponses"); + + migrationBuilder.DropTable( + name: "Surveys"); + + migrationBuilder.DropIndex( + name: "IX_SectionItems_SurveyId", + table: "SectionItems"); + + migrationBuilder.DropColumn( + name: "SurveyId", + table: "SectionItems"); + } + } +} diff --git a/Tsi1.Api/Tsi1.DataLayer/Migrations/20201112225623_fix-survey.Designer.cs b/Tsi1.Api/Tsi1.DataLayer/Migrations/20201112225623_fix-survey.Designer.cs new file mode 100644 index 0000000000000000000000000000000000000000..69b5ff244f791fa4686adf5831e99f80cfea40a8 --- /dev/null +++ b/Tsi1.Api/Tsi1.DataLayer/Migrations/20201112225623_fix-survey.Designer.cs @@ -0,0 +1,784 @@ +// <auto-generated /> +using System; +using Microsoft.EntityFrameworkCore; +using Microsoft.EntityFrameworkCore.Infrastructure; +using Microsoft.EntityFrameworkCore.Migrations; +using Microsoft.EntityFrameworkCore.Storage.ValueConversion; +using Npgsql.EntityFrameworkCore.PostgreSQL.Metadata; +using Tsi1.DataLayer; + +namespace Tsi1.DataLayer.Migrations +{ + [DbContext(typeof(Tsi1Context))] + [Migration("20201112225623_fix-survey")] + partial class fixsurvey + { + protected override void BuildTargetModel(ModelBuilder modelBuilder) + { +#pragma warning disable 612, 618 + modelBuilder + .HasAnnotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.IdentityByDefaultColumn) + .HasAnnotation("ProductVersion", "3.1.4") + .HasAnnotation("Relational:MaxIdentifierLength", 63); + + modelBuilder.Entity("Tsi1.DataLayer.Entities.AnswerOption", b => + { + b.Property<int>("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer") + .HasAnnotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.IdentityByDefaultColumn); + + b.Property<string>("Name") + .IsRequired() + .HasColumnType("character varying(100)"); + + b.HasKey("Id"); + + b.HasIndex("Name"); + + b.ToTable("AnswerOptions"); + }); + + modelBuilder.Entity("Tsi1.DataLayer.Entities.Connection", b => + { + b.Property<string>("ConnectionId") + .HasColumnType("text"); + + b.Property<string>("GroupName") + .HasColumnType("text"); + + b.Property<int>("UserId") + .HasColumnType("integer"); + + b.HasKey("ConnectionId"); + + b.HasIndex("GroupName"); + + b.ToTable("Connections"); + }); + + modelBuilder.Entity("Tsi1.DataLayer.Entities.Course", b => + { + b.Property<int>("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer") + .HasAnnotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.IdentityByDefaultColumn); + + b.Property<string>("Name") + .IsRequired() + .HasColumnType("character varying(50)"); + + b.Property<int>("TenantId") + .HasColumnType("integer"); + + b.HasKey("Id"); + + b.HasIndex("TenantId"); + + b.HasIndex("Name", "TenantId") + .IsUnique(); + + b.ToTable("Courses"); + }); + + modelBuilder.Entity("Tsi1.DataLayer.Entities.File", b => + { + b.Property<int>("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer") + .HasAnnotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.IdentityByDefaultColumn); + + b.Property<string>("Name") + .IsRequired() + .HasColumnType("character varying(50)"); + + b.Property<string>("Path") + .IsRequired() + .HasColumnType("character varying(1000)"); + + b.HasKey("Id"); + + b.HasIndex("Path") + .IsUnique(); + + b.ToTable("Files"); + }); + + modelBuilder.Entity("Tsi1.DataLayer.Entities.Forum", b => + { + b.Property<int>("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer") + .HasAnnotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.IdentityByDefaultColumn); + + b.Property<string>("Name") + .IsRequired() + .HasColumnType("character varying(50)"); + + b.HasKey("Id"); + + b.ToTable("Forums"); + }); + + modelBuilder.Entity("Tsi1.DataLayer.Entities.ForumUser", b => + { + b.Property<int>("ForumId") + .HasColumnType("integer"); + + b.Property<int>("UserId") + .HasColumnType("integer"); + + b.HasKey("ForumId", "UserId"); + + b.HasIndex("UserId"); + + b.ToTable("ForumUsers"); + }); + + modelBuilder.Entity("Tsi1.DataLayer.Entities.Group", b => + { + b.Property<string>("Name") + .HasColumnType("text"); + + b.HasKey("Name"); + + b.ToTable("Groups"); + }); + + modelBuilder.Entity("Tsi1.DataLayer.Entities.Post", b => + { + b.Property<int>("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer") + .HasAnnotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.IdentityByDefaultColumn); + + b.Property<DateTime>("Date") + .HasColumnType("timestamp without time zone"); + + b.Property<int>("ForumId") + .HasColumnType("integer"); + + b.Property<string>("Title") + .IsRequired() + .HasColumnType("character varying(100)"); + + b.Property<int>("UserId") + .HasColumnType("integer"); + + b.HasKey("Id"); + + b.HasIndex("UserId"); + + b.HasIndex("ForumId", "Title") + .IsUnique(); + + b.ToTable("Posts"); + }); + + modelBuilder.Entity("Tsi1.DataLayer.Entities.PostMessage", b => + { + b.Property<int>("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer") + .HasAnnotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.IdentityByDefaultColumn); + + b.Property<string>("Content") + .IsRequired() + .HasColumnType("character varying(10485760)"); + + b.Property<DateTime>("Date") + .HasColumnType("timestamp without time zone"); + + b.Property<int>("PostId") + .HasColumnType("integer"); + + b.Property<int>("UserId") + .HasColumnType("integer"); + + b.HasKey("Id"); + + b.HasIndex("PostId"); + + b.HasIndex("UserId"); + + b.ToTable("PostMessages"); + }); + + modelBuilder.Entity("Tsi1.DataLayer.Entities.Professor", b => + { + b.Property<int>("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer") + .HasAnnotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.IdentityByDefaultColumn); + + b.Property<string>("IdentityCard") + .IsRequired() + .HasColumnType("character varying(50)"); + + b.Property<int>("TenantId") + .HasColumnType("integer"); + + b.HasKey("Id"); + + b.HasIndex("TenantId"); + + b.HasIndex("IdentityCard", "TenantId") + .IsUnique(); + + b.ToTable("Professors"); + }); + + modelBuilder.Entity("Tsi1.DataLayer.Entities.ProfessorCourse", b => + { + b.Property<int>("ProfessorId") + .HasColumnType("integer"); + + b.Property<int>("CourseId") + .HasColumnType("integer"); + + b.HasKey("ProfessorId", "CourseId"); + + b.HasIndex("CourseId"); + + b.ToTable("ProfessorCourses"); + }); + + modelBuilder.Entity("Tsi1.DataLayer.Entities.Section", b => + { + b.Property<int>("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer") + .HasAnnotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.IdentityByDefaultColumn); + + b.Property<int>("CourseId") + .HasColumnType("integer"); + + b.Property<string>("Name") + .IsRequired() + .HasColumnType("character varying(255)"); + + b.Property<int>("Order") + .HasColumnType("integer"); + + b.HasKey("Id"); + + b.HasIndex("CourseId"); + + b.ToTable("Sections"); + }); + + modelBuilder.Entity("Tsi1.DataLayer.Entities.SectionItem", b => + { + b.Property<int>("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer") + .HasAnnotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.IdentityByDefaultColumn); + + b.Property<int?>("FileId") + .HasColumnType("integer"); + + b.Property<int?>("ForumId") + .HasColumnType("integer"); + + b.Property<int>("Order") + .HasColumnType("integer"); + + b.Property<int>("SectionId") + .HasColumnType("integer"); + + b.Property<int>("SectionItemTypeId") + .HasColumnType("integer"); + + b.Property<int?>("SurveyId") + .HasColumnType("integer"); + + b.HasKey("Id"); + + b.HasIndex("FileId") + .IsUnique(); + + b.HasIndex("ForumId") + .IsUnique(); + + b.HasIndex("SectionId"); + + b.HasIndex("SectionItemTypeId"); + + b.HasIndex("SurveyId") + .IsUnique(); + + b.ToTable("SectionItems"); + }); + + modelBuilder.Entity("Tsi1.DataLayer.Entities.SectionItemType", b => + { + b.Property<int>("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer") + .HasAnnotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.IdentityByDefaultColumn); + + b.Property<string>("Name") + .IsRequired() + .HasColumnType("character varying(100)"); + + b.HasKey("Id"); + + b.ToTable("SectionItemTypes"); + }); + + modelBuilder.Entity("Tsi1.DataLayer.Entities.Student", b => + { + b.Property<int>("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer") + .HasAnnotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.IdentityByDefaultColumn); + + b.Property<int>("Age") + .HasColumnType("integer"); + + b.Property<string>("IdentityCard") + .IsRequired() + .HasColumnType("character varying(50)"); + + b.Property<int>("TenantId") + .HasColumnType("integer"); + + b.HasKey("Id"); + + b.HasIndex("TenantId"); + + b.HasIndex("IdentityCard", "TenantId") + .IsUnique(); + + b.ToTable("Students"); + }); + + modelBuilder.Entity("Tsi1.DataLayer.Entities.StudentCourse", b => + { + b.Property<int>("StudentId") + .HasColumnType("integer"); + + b.Property<int>("CourseId") + .HasColumnType("integer"); + + b.HasKey("StudentId", "CourseId"); + + b.HasIndex("CourseId"); + + b.ToTable("StudentCourses"); + }); + + modelBuilder.Entity("Tsi1.DataLayer.Entities.Survey", b => + { + b.Property<int>("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer") + .HasAnnotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.IdentityByDefaultColumn); + + b.Property<bool>("IsGlobal") + .HasColumnType("boolean"); + + b.Property<string>("Name") + .IsRequired() + .HasColumnType("character varying(255)"); + + b.Property<int?>("TenantId") + .HasColumnType("integer"); + + b.HasKey("Id"); + + b.HasIndex("Name"); + + b.HasIndex("TenantId"); + + b.ToTable("Surveys"); + }); + + modelBuilder.Entity("Tsi1.DataLayer.Entities.SurveyAnswer", b => + { + b.Property<int>("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer") + .HasAnnotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.IdentityByDefaultColumn); + + b.Property<int>("AnswerOptionId") + .HasColumnType("integer"); + + b.Property<int>("SurveyQuestionId") + .HasColumnType("integer"); + + b.Property<int>("SurveyResponseId") + .HasColumnType("integer"); + + b.HasKey("Id"); + + b.HasIndex("AnswerOptionId"); + + b.HasIndex("SurveyQuestionId"); + + b.HasIndex("SurveyResponseId"); + + b.ToTable("SurveyAnswers"); + }); + + modelBuilder.Entity("Tsi1.DataLayer.Entities.SurveyQuestion", b => + { + b.Property<int>("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer") + .HasAnnotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.IdentityByDefaultColumn); + + b.Property<string>("Question") + .IsRequired() + .HasColumnType("character varying(255)"); + + b.Property<int>("SurveyId") + .HasColumnType("integer"); + + b.HasKey("Id"); + + b.HasIndex("SurveyId"); + + b.ToTable("SurveyQuestions"); + }); + + modelBuilder.Entity("Tsi1.DataLayer.Entities.SurveyResponse", b => + { + b.Property<int>("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer") + .HasAnnotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.IdentityByDefaultColumn); + + b.Property<int>("SurveyId") + .HasColumnType("integer"); + + b.Property<int>("UserId") + .HasColumnType("integer"); + + b.HasKey("Id"); + + b.HasIndex("SurveyId"); + + b.HasIndex("UserId"); + + b.ToTable("SurveyResponses"); + }); + + modelBuilder.Entity("Tsi1.DataLayer.Entities.Tenant", b => + { + b.Property<int>("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer") + .HasAnnotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.IdentityByDefaultColumn); + + b.Property<string>("Name") + .IsRequired() + .HasColumnType("character varying(50)"); + + b.HasKey("Id"); + + b.HasIndex("Name") + .IsUnique(); + + b.ToTable("Tenants"); + }); + + modelBuilder.Entity("Tsi1.DataLayer.Entities.User", b => + { + b.Property<int>("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer") + .HasAnnotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.IdentityByDefaultColumn); + + b.Property<string>("Email") + .IsRequired() + .HasColumnType("character varying(255)"); + + b.Property<string>("FirstName") + .IsRequired() + .HasColumnType("character varying(255)"); + + b.Property<string>("LastName") + .IsRequired() + .HasColumnType("character varying(255)"); + + b.Property<string>("Password") + .IsRequired() + .HasColumnType("character varying(255)"); + + b.Property<int?>("ProfessorId") + .HasColumnType("integer"); + + b.Property<int?>("StudentId") + .HasColumnType("integer"); + + b.Property<int>("TenantId") + .HasColumnType("integer"); + + b.Property<int>("UserTypeId") + .HasColumnType("integer"); + + b.Property<string>("Username") + .IsRequired() + .HasColumnType("character varying(50)"); + + b.HasKey("Id"); + + b.HasIndex("ProfessorId") + .IsUnique(); + + b.HasIndex("StudentId") + .IsUnique(); + + b.HasIndex("TenantId"); + + b.HasIndex("UserTypeId"); + + b.HasIndex("Username", "TenantId") + .IsUnique(); + + b.ToTable("Users"); + }); + + modelBuilder.Entity("Tsi1.DataLayer.Entities.UserType", b => + { + b.Property<int>("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer") + .HasAnnotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.IdentityByDefaultColumn); + + b.Property<string>("Name") + .IsRequired() + .HasColumnType("character varying(50)"); + + b.HasKey("Id"); + + b.HasIndex("Name") + .IsUnique(); + + b.ToTable("UserTypes"); + }); + + modelBuilder.Entity("Tsi1.DataLayer.Entities.Connection", b => + { + b.HasOne("Tsi1.DataLayer.Entities.Group", "Group") + .WithMany("Connections") + .HasForeignKey("GroupName"); + }); + + modelBuilder.Entity("Tsi1.DataLayer.Entities.Course", b => + { + b.HasOne("Tsi1.DataLayer.Entities.Tenant", "Tenant") + .WithMany("Courses") + .HasForeignKey("TenantId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + }); + + modelBuilder.Entity("Tsi1.DataLayer.Entities.ForumUser", b => + { + b.HasOne("Tsi1.DataLayer.Entities.Forum", "Forum") + .WithMany("ForumUsers") + .HasForeignKey("ForumId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Tsi1.DataLayer.Entities.User", "User") + .WithMany("ForumUsers") + .HasForeignKey("UserId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + }); + + modelBuilder.Entity("Tsi1.DataLayer.Entities.Post", b => + { + b.HasOne("Tsi1.DataLayer.Entities.Forum", "Forum") + .WithMany("Posts") + .HasForeignKey("ForumId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Tsi1.DataLayer.Entities.User", "User") + .WithMany("Posts") + .HasForeignKey("UserId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + }); + + modelBuilder.Entity("Tsi1.DataLayer.Entities.PostMessage", b => + { + b.HasOne("Tsi1.DataLayer.Entities.Post", "Post") + .WithMany("PostMessages") + .HasForeignKey("PostId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Tsi1.DataLayer.Entities.User", "User") + .WithMany("PostMessages") + .HasForeignKey("UserId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + }); + + modelBuilder.Entity("Tsi1.DataLayer.Entities.Professor", b => + { + b.HasOne("Tsi1.DataLayer.Entities.Tenant", "Tenant") + .WithMany("Professors") + .HasForeignKey("TenantId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + }); + + modelBuilder.Entity("Tsi1.DataLayer.Entities.ProfessorCourse", b => + { + b.HasOne("Tsi1.DataLayer.Entities.Course", "Course") + .WithMany("ProfessorCourses") + .HasForeignKey("CourseId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Tsi1.DataLayer.Entities.Professor", "Professor") + .WithMany("ProfessorCourses") + .HasForeignKey("ProfessorId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + }); + + modelBuilder.Entity("Tsi1.DataLayer.Entities.Section", b => + { + b.HasOne("Tsi1.DataLayer.Entities.Course", "Course") + .WithMany("Sections") + .HasForeignKey("CourseId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + }); + + modelBuilder.Entity("Tsi1.DataLayer.Entities.SectionItem", b => + { + b.HasOne("Tsi1.DataLayer.Entities.File", "File") + .WithOne("SectionItem") + .HasForeignKey("Tsi1.DataLayer.Entities.SectionItem", "FileId"); + + b.HasOne("Tsi1.DataLayer.Entities.Forum", "Forum") + .WithOne("SectionItem") + .HasForeignKey("Tsi1.DataLayer.Entities.SectionItem", "ForumId"); + + b.HasOne("Tsi1.DataLayer.Entities.Section", "Section") + .WithMany("SectionItems") + .HasForeignKey("SectionId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Tsi1.DataLayer.Entities.SectionItemType", "SectionItemType") + .WithMany("SectionItems") + .HasForeignKey("SectionItemTypeId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Tsi1.DataLayer.Entities.Survey", "Survey") + .WithOne("SectionItem") + .HasForeignKey("Tsi1.DataLayer.Entities.SectionItem", "SurveyId"); + }); + + modelBuilder.Entity("Tsi1.DataLayer.Entities.Student", b => + { + b.HasOne("Tsi1.DataLayer.Entities.Tenant", "Tenant") + .WithMany("Students") + .HasForeignKey("TenantId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + }); + + modelBuilder.Entity("Tsi1.DataLayer.Entities.StudentCourse", b => + { + b.HasOne("Tsi1.DataLayer.Entities.Course", "Course") + .WithMany("StudentCourses") + .HasForeignKey("CourseId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Tsi1.DataLayer.Entities.Student", "Student") + .WithMany("StudentCourses") + .HasForeignKey("StudentId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + }); + + modelBuilder.Entity("Tsi1.DataLayer.Entities.Survey", b => + { + b.HasOne("Tsi1.DataLayer.Entities.Tenant", "Tenant") + .WithMany("Surveys") + .HasForeignKey("TenantId"); + }); + + modelBuilder.Entity("Tsi1.DataLayer.Entities.SurveyAnswer", b => + { + b.HasOne("Tsi1.DataLayer.Entities.AnswerOption", "AnswerOption") + .WithMany("SurveyAnswers") + .HasForeignKey("AnswerOptionId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Tsi1.DataLayer.Entities.SurveyQuestion", "SurveyQuestion") + .WithMany("SurveyAnswers") + .HasForeignKey("SurveyQuestionId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Tsi1.DataLayer.Entities.SurveyResponse", "SurveyResponse") + .WithMany("SurveyAnswers") + .HasForeignKey("SurveyResponseId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + }); + + modelBuilder.Entity("Tsi1.DataLayer.Entities.SurveyQuestion", b => + { + b.HasOne("Tsi1.DataLayer.Entities.Survey", "Survey") + .WithMany("SurveyQuestions") + .HasForeignKey("SurveyId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + }); + + modelBuilder.Entity("Tsi1.DataLayer.Entities.SurveyResponse", b => + { + b.HasOne("Tsi1.DataLayer.Entities.Survey", "Survey") + .WithMany("SurveyResponses") + .HasForeignKey("SurveyId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Tsi1.DataLayer.Entities.User", "User") + .WithMany("SurveyResponses") + .HasForeignKey("UserId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + }); + + modelBuilder.Entity("Tsi1.DataLayer.Entities.User", b => + { + b.HasOne("Tsi1.DataLayer.Entities.Professor", "Professor") + .WithOne("User") + .HasForeignKey("Tsi1.DataLayer.Entities.User", "ProfessorId"); + + b.HasOne("Tsi1.DataLayer.Entities.Student", "Student") + .WithOne("User") + .HasForeignKey("Tsi1.DataLayer.Entities.User", "StudentId"); + + b.HasOne("Tsi1.DataLayer.Entities.Tenant", "Tenant") + .WithMany("Users") + .HasForeignKey("TenantId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Tsi1.DataLayer.Entities.UserType", "UserType") + .WithMany() + .HasForeignKey("UserTypeId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + }); +#pragma warning restore 612, 618 + } + } +} diff --git a/Tsi1.Api/Tsi1.DataLayer/Migrations/20201112225623_fix-survey.cs b/Tsi1.Api/Tsi1.DataLayer/Migrations/20201112225623_fix-survey.cs new file mode 100644 index 0000000000000000000000000000000000000000..3293f991ce1fbba90d705846ddaab6a8e1bdfd2a --- /dev/null +++ b/Tsi1.Api/Tsi1.DataLayer/Migrations/20201112225623_fix-survey.cs @@ -0,0 +1,52 @@ +using Microsoft.EntityFrameworkCore.Migrations; + +namespace Tsi1.DataLayer.Migrations +{ + public partial class fixsurvey : Migration + { + protected override void Up(MigrationBuilder migrationBuilder) + { + migrationBuilder.DropForeignKey( + name: "FK_Surveys_Tenants_TenantId", + table: "Surveys"); + + migrationBuilder.AlterColumn<int>( + name: "TenantId", + table: "Surveys", + nullable: true, + oldClrType: typeof(int), + oldType: "integer"); + + migrationBuilder.AddForeignKey( + name: "FK_Surveys_Tenants_TenantId", + table: "Surveys", + column: "TenantId", + principalTable: "Tenants", + principalColumn: "Id", + onDelete: ReferentialAction.Restrict); + } + + protected override void Down(MigrationBuilder migrationBuilder) + { + migrationBuilder.DropForeignKey( + name: "FK_Surveys_Tenants_TenantId", + table: "Surveys"); + + migrationBuilder.AlterColumn<int>( + name: "TenantId", + table: "Surveys", + type: "integer", + nullable: false, + oldClrType: typeof(int), + oldNullable: true); + + migrationBuilder.AddForeignKey( + name: "FK_Surveys_Tenants_TenantId", + table: "Surveys", + column: "TenantId", + principalTable: "Tenants", + principalColumn: "Id", + onDelete: ReferentialAction.Cascade); + } + } +} diff --git a/Tsi1.Api/Tsi1.DataLayer/Migrations/Tsi1ContextModelSnapshot.cs b/Tsi1.Api/Tsi1.DataLayer/Migrations/Tsi1ContextModelSnapshot.cs index e07d8848bc5c062202f58b780c9384a0dbf80650..eb633f950cb0dd895b448ec7f43fc6fdde3db67f 100644 --- a/Tsi1.Api/Tsi1.DataLayer/Migrations/Tsi1ContextModelSnapshot.cs +++ b/Tsi1.Api/Tsi1.DataLayer/Migrations/Tsi1ContextModelSnapshot.cs @@ -19,6 +19,24 @@ namespace Tsi1.DataLayer.Migrations .HasAnnotation("ProductVersion", "3.1.4") .HasAnnotation("Relational:MaxIdentifierLength", 63); + modelBuilder.Entity("Tsi1.DataLayer.Entities.AnswerOption", b => + { + b.Property<int>("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer") + .HasAnnotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.IdentityByDefaultColumn); + + b.Property<string>("Name") + .IsRequired() + .HasColumnType("character varying(100)"); + + b.HasKey("Id"); + + b.HasIndex("Name"); + + b.ToTable("AnswerOptions"); + }); + modelBuilder.Entity("Tsi1.DataLayer.Entities.Connection", b => { b.Property<string>("ConnectionId") @@ -272,6 +290,9 @@ namespace Tsi1.DataLayer.Migrations b.Property<int>("SectionItemTypeId") .HasColumnType("integer"); + b.Property<int?>("SurveyId") + .HasColumnType("integer"); + b.HasKey("Id"); b.HasIndex("FileId") @@ -284,6 +305,9 @@ namespace Tsi1.DataLayer.Migrations b.HasIndex("SectionItemTypeId"); + b.HasIndex("SurveyId") + .IsUnique(); + b.ToTable("SectionItems"); }); @@ -345,6 +369,102 @@ namespace Tsi1.DataLayer.Migrations b.ToTable("StudentCourses"); }); + modelBuilder.Entity("Tsi1.DataLayer.Entities.Survey", b => + { + b.Property<int>("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer") + .HasAnnotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.IdentityByDefaultColumn); + + b.Property<bool>("IsGlobal") + .HasColumnType("boolean"); + + b.Property<string>("Name") + .IsRequired() + .HasColumnType("character varying(255)"); + + b.Property<int?>("TenantId") + .HasColumnType("integer"); + + b.HasKey("Id"); + + b.HasIndex("Name"); + + b.HasIndex("TenantId"); + + b.ToTable("Surveys"); + }); + + modelBuilder.Entity("Tsi1.DataLayer.Entities.SurveyAnswer", b => + { + b.Property<int>("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer") + .HasAnnotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.IdentityByDefaultColumn); + + b.Property<int>("AnswerOptionId") + .HasColumnType("integer"); + + b.Property<int>("SurveyQuestionId") + .HasColumnType("integer"); + + b.Property<int>("SurveyResponseId") + .HasColumnType("integer"); + + b.HasKey("Id"); + + b.HasIndex("AnswerOptionId"); + + b.HasIndex("SurveyQuestionId"); + + b.HasIndex("SurveyResponseId"); + + b.ToTable("SurveyAnswers"); + }); + + modelBuilder.Entity("Tsi1.DataLayer.Entities.SurveyQuestion", b => + { + b.Property<int>("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer") + .HasAnnotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.IdentityByDefaultColumn); + + b.Property<string>("Question") + .IsRequired() + .HasColumnType("character varying(255)"); + + b.Property<int>("SurveyId") + .HasColumnType("integer"); + + b.HasKey("Id"); + + b.HasIndex("SurveyId"); + + b.ToTable("SurveyQuestions"); + }); + + modelBuilder.Entity("Tsi1.DataLayer.Entities.SurveyResponse", b => + { + b.Property<int>("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer") + .HasAnnotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.IdentityByDefaultColumn); + + b.Property<int>("SurveyId") + .HasColumnType("integer"); + + b.Property<int>("UserId") + .HasColumnType("integer"); + + b.HasKey("Id"); + + b.HasIndex("SurveyId"); + + b.HasIndex("UserId"); + + b.ToTable("SurveyResponses"); + }); + modelBuilder.Entity("Tsi1.DataLayer.Entities.Tenant", b => { b.Property<int>("Id") @@ -555,6 +675,10 @@ namespace Tsi1.DataLayer.Migrations .HasForeignKey("SectionItemTypeId") .OnDelete(DeleteBehavior.Cascade) .IsRequired(); + + b.HasOne("Tsi1.DataLayer.Entities.Survey", "Survey") + .WithOne("SectionItem") + .HasForeignKey("Tsi1.DataLayer.Entities.SectionItem", "SurveyId"); }); modelBuilder.Entity("Tsi1.DataLayer.Entities.Student", b => @@ -581,6 +705,58 @@ namespace Tsi1.DataLayer.Migrations .IsRequired(); }); + modelBuilder.Entity("Tsi1.DataLayer.Entities.Survey", b => + { + b.HasOne("Tsi1.DataLayer.Entities.Tenant", "Tenant") + .WithMany("Surveys") + .HasForeignKey("TenantId"); + }); + + modelBuilder.Entity("Tsi1.DataLayer.Entities.SurveyAnswer", b => + { + b.HasOne("Tsi1.DataLayer.Entities.AnswerOption", "AnswerOption") + .WithMany("SurveyAnswers") + .HasForeignKey("AnswerOptionId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Tsi1.DataLayer.Entities.SurveyQuestion", "SurveyQuestion") + .WithMany("SurveyAnswers") + .HasForeignKey("SurveyQuestionId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Tsi1.DataLayer.Entities.SurveyResponse", "SurveyResponse") + .WithMany("SurveyAnswers") + .HasForeignKey("SurveyResponseId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + }); + + modelBuilder.Entity("Tsi1.DataLayer.Entities.SurveyQuestion", b => + { + b.HasOne("Tsi1.DataLayer.Entities.Survey", "Survey") + .WithMany("SurveyQuestions") + .HasForeignKey("SurveyId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + }); + + modelBuilder.Entity("Tsi1.DataLayer.Entities.SurveyResponse", b => + { + b.HasOne("Tsi1.DataLayer.Entities.Survey", "Survey") + .WithMany("SurveyResponses") + .HasForeignKey("SurveyId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Tsi1.DataLayer.Entities.User", "User") + .WithMany("SurveyResponses") + .HasForeignKey("UserId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + }); + modelBuilder.Entity("Tsi1.DataLayer.Entities.User", b => { b.HasOne("Tsi1.DataLayer.Entities.Professor", "Professor") diff --git a/Tsi1.Api/Tsi1.DataLayer/Tsi1Context.cs b/Tsi1.Api/Tsi1.DataLayer/Tsi1Context.cs index ba1524c725417ba94a5672a0254a9cd05d66f911..468e7dd1b6849216aedf0fee5ad9ae03bffd44b9 100644 --- a/Tsi1.Api/Tsi1.DataLayer/Tsi1Context.cs +++ b/Tsi1.Api/Tsi1.DataLayer/Tsi1Context.cs @@ -27,6 +27,12 @@ namespace Tsi1.DataLayer public DbSet<Section> Sections { get; set; } public DbSet<SectionItem> SectionItems { get; set; } public DbSet<SectionItemType> SectionItemTypes { get; set; } + public DbSet<Survey> Surveys { get; set; } + public DbSet<SurveyAnswer> SurveyAnswers { get; set; } + public DbSet<SurveyQuestion> SurveyQuestions { get; set; } + public DbSet<SurveyResponse> SurveyResponses { get; set; } + public DbSet<AnswerOption> AnswerOptions { get; set; } + public Tsi1Context(DbContextOptions options) : base(options) { } @@ -51,6 +57,11 @@ namespace Tsi1.DataLayer modelBuilder.ApplyConfiguration(new SectionConfiguration()); modelBuilder.ApplyConfiguration(new SectionItemConfiguration()); modelBuilder.ApplyConfiguration(new SectionItemTypeConfiguration()); + modelBuilder.ApplyConfiguration(new SurveyConfiguration()); + modelBuilder.ApplyConfiguration(new SurveyAnswerConfiguration()); + modelBuilder.ApplyConfiguration(new SurveyQuestionConfiguration()); + modelBuilder.ApplyConfiguration(new SurveyResponseConfiguration()); + modelBuilder.ApplyConfiguration(new AnswerOptionConfiguration()); } } }