diff --git a/Tsi1.Api/Tsi1.Api/Controllers/CourseController.cs b/Tsi1.Api/Tsi1.Api/Controllers/CourseController.cs index 5469334a34225ac449c54dc52e9e4cfe9f9ca849..9097c5709a495950674f9eecd7ff4690e419aa4f 100644 --- a/Tsi1.Api/Tsi1.Api/Controllers/CourseController.cs +++ b/Tsi1.Api/Tsi1.Api/Controllers/CourseController.cs @@ -1,13 +1,9 @@ -using System; -using System.Collections.Generic; -using System.IO; -using System.Linq; +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.Api.Infrastructure; using Tsi1.BusinessLayer.Dtos; using Tsi1.BusinessLayer.Helpers; using Tsi1.BusinessLayer.Interfaces; @@ -167,10 +163,25 @@ namespace Tsi1.Api.Controllers return Ok(result.Data); } + [Authorize(Roles = UserTypes.FacultyAdmin)] + [HttpGet("GetAllTemplates")] + public async Task<IActionResult> GetAllTemplates() + { + var tenantId = int.Parse(HttpContext.User.Claims.FirstOrDefault(x => x.Type == "TenantId").Value); + + var result = await _courseService.GetAll(tenantId, true); + if (result.HasError) + { + return BadRequest(result.Message); + } + + return Ok(result.Data); + } + [Authorize(Roles = UserTypes.Professor + ", " + UserTypes.FacultyAdmin)] [HttpPut("Modify/{courseId}")] - public async Task<IActionResult> Modify(int courseId, CourseCreateDto courseDto) + public async Task<IActionResult> Modify(int courseId, CourseModifyDto courseDto) { var tenantId = int.Parse(HttpContext.User.Claims.FirstOrDefault(x => x.Type == "TenantId").Value); courseDto.TenantId = tenantId; @@ -222,7 +233,7 @@ namespace Tsi1.Api.Controllers return Ok(result.Data); } - [Authorize(Roles = UserTypes.Student + ", " + UserTypes.Professor)] + [Authorize(Roles = UserTypes.Student + ", " + UserTypes.Professor + ", " + UserTypes.FacultyAdmin)] [HttpGet("GetById/{courseId}")] public async Task<IActionResult> GetById(int courseId) { @@ -234,6 +245,5 @@ namespace Tsi1.Api.Controllers return Ok(result.Data); } - } } diff --git a/Tsi1.Api/Tsi1.Api/Controllers/SectionItemController.cs b/Tsi1.Api/Tsi1.Api/Controllers/SectionItemController.cs index 1a1a7c5e582cf3d7caf234e21ccf243de7bb0c8b..04e043b2a7b0bfd9a91f819e5b309596bde1ad32 100644 --- a/Tsi1.Api/Tsi1.Api/Controllers/SectionItemController.cs +++ b/Tsi1.Api/Tsi1.Api/Controllers/SectionItemController.cs @@ -28,7 +28,7 @@ namespace Tsi1.Api.Controllers { var tenantId = int.Parse(HttpContext.User.Claims.FirstOrDefault(x => x.Type == "TenantId").Value); - var result = await _sectionItemService.Create(sectionItem, tenantId); + var result = await _sectionItemService.Create(sectionItem); if (result.HasError) { return BadRequest(result.Message); diff --git a/Tsi1.Api/Tsi1.BusinessLayer/DataLoad/DataLoad.cs b/Tsi1.Api/Tsi1.BusinessLayer/DataLoad/DataLoad.cs index db3a8af45db895fce706b8f731064675f59f73d5..9f320e2a92c3c02d50fcce9a0249ba1f0acca4b0 100644 --- a/Tsi1.Api/Tsi1.BusinessLayer/DataLoad/DataLoad.cs +++ b/Tsi1.Api/Tsi1.BusinessLayer/DataLoad/DataLoad.cs @@ -36,256 +36,256 @@ namespace Tsi1.BusinessLayer.DataLoad public async Task LoadDataAsync() { - // TENANTS - var adminTenant = new TenantCreateDto - { - Name = TenantAdmin.Name, - }; - var adminTenantId = await _tenantService.Create(adminTenant); + //// TENANTS + //var adminTenant = new TenantCreateDto + //{ + // Name = TenantAdmin.Name, + //}; + //var adminTenantId = await _tenantService.Create(adminTenant); - var fingTenant = new TenantCreateDto - { - Name = "fing", - }; - var fingTenantId = await _tenantService.Create(fingTenant); + //var fingTenant = new TenantCreateDto + //{ + // Name = "fing", + //}; + //var fingTenantId = await _tenantService.Create(fingTenant); - // USER TYPES - var udelarAdminUserType = new UserType - { - Name = UserTypes.UdelarAdmin, - }; - _context.Add(udelarAdminUserType); + //// USER TYPES + //var udelarAdminUserType = new UserType + //{ + // Name = UserTypes.UdelarAdmin, + //}; + //_context.Add(udelarAdminUserType); - var facultyAdminUserType = new UserType - { - Name = UserTypes.FacultyAdmin, - }; - _context.Add(facultyAdminUserType); + //var facultyAdminUserType = new UserType + //{ + // Name = UserTypes.FacultyAdmin, + //}; + //_context.Add(facultyAdminUserType); - var professorUserType = new UserType - { - Name = UserTypes.Professor, - }; - _context.Add(professorUserType); + //var professorUserType = new UserType + //{ + // Name = UserTypes.Professor, + //}; + //_context.Add(professorUserType); - var studentUserType = new UserType - { - Name = UserTypes.Student, - }; - _context.Add(studentUserType); + //var studentUserType = new UserType + //{ + // Name = UserTypes.Student, + //}; + //_context.Add(studentUserType); - await _context.SaveChangesAsync(); + //await _context.SaveChangesAsync(); - // USERS - var userAdminUdelar = new UserRegisterDto - { - UserTypeId = udelarAdminUserType.Id, - Username = "admin", - Password = "admin", - FirstName = "admin", - LastName = "admin", - Email = "admin@mail.com", - IdentityCard = "12345678-9", - Age = 44 - }; - await _userService.Create(userAdminUdelar, udelarAdminUserType.Name, adminTenantId.Data.Id); + //// USERS + //var userAdminUdelar = new UserRegisterDto + //{ + // UserTypeId = udelarAdminUserType.Id, + // Username = "admin", + // Password = "admin", + // FirstName = "admin", + // LastName = "admin", + // Email = "admin@mail.com", + // IdentityCard = "12345678-9", + // Age = 44 + //}; + //await _userService.Create(userAdminUdelar, udelarAdminUserType.Name, adminTenantId.Data.Id); - var userStudent1 = new UserRegisterDto - { - UserTypeId = studentUserType.Id, - Username = "enzo", - Password = "enzo", - FirstName = "Enzo", - LastName = "Santangelo", - Email = "enzo@mail.com", - IdentityCard = "13242344-5", - Age = 25 - }; - await _userService.Create(userStudent1, studentUserType.Name, fingTenantId.Data.Id); + //var userStudent1 = new UserRegisterDto + //{ + // UserTypeId = studentUserType.Id, + // Username = "enzo", + // Password = "enzo", + // FirstName = "Enzo", + // LastName = "Santangelo", + // Email = "enzo@mail.com", + // IdentityCard = "13242344-5", + // Age = 25 + //}; + //await _userService.Create(userStudent1, studentUserType.Name, fingTenantId.Data.Id); - var userStudent2 = new UserRegisterDto - { - UserTypeId = studentUserType.Id, - Username = "mathias", - Password = "mathias", - FirstName = "Mathias", - LastName = "Martinez", - Email = "mathias@mail.com", - IdentityCard = "3782346-5", - Age = 26 - }; - await _userService.Create(userStudent2, studentUserType.Name, fingTenantId.Data.Id); + //var userStudent2 = new UserRegisterDto + //{ + // UserTypeId = studentUserType.Id, + // Username = "mathias", + // Password = "mathias", + // FirstName = "Mathias", + // LastName = "Martinez", + // Email = "mathias@mail.com", + // IdentityCard = "3782346-5", + // Age = 26 + //}; + //await _userService.Create(userStudent2, studentUserType.Name, fingTenantId.Data.Id); - var userProfessor = new UserRegisterDto - { - UserTypeId = professorUserType.Id, - Username = "prof1", - Password = "prof1", - FirstName = "Juan", - LastName = "Perez", - Email = "jp@mail.com", - IdentityCard = "98754342-5", - Age = 34 - }; - await _userService.Create(userProfessor, professorUserType.Name, fingTenantId.Data.Id); + //var userProfessor = new UserRegisterDto + //{ + // UserTypeId = professorUserType.Id, + // Username = "prof1", + // Password = "prof1", + // FirstName = "Juan", + // LastName = "Perez", + // Email = "jp@mail.com", + // IdentityCard = "98754342-5", + // Age = 34 + //}; + //await _userService.Create(userProfessor, professorUserType.Name, fingTenantId.Data.Id); - var userFingAdmin = new UserRegisterDto - { - UserTypeId = facultyAdminUserType.Id, - Username = "fing", - Password = "fing", - FirstName = "fing", - LastName = "fing", - Email = "fing@mail.com", - IdentityCard = "89547821-5", - Age = 45 - }; - await _userService.Create(userFingAdmin, facultyAdminUserType.Name, fingTenantId.Data.Id); + //var userFingAdmin = new UserRegisterDto + //{ + // UserTypeId = facultyAdminUserType.Id, + // Username = "fing", + // Password = "fing", + // FirstName = "fing", + // LastName = "fing", + // Email = "fing@mail.com", + // IdentityCard = "89547821-5", + // Age = 45 + //}; + //await _userService.Create(userFingAdmin, facultyAdminUserType.Name, fingTenantId.Data.Id); - // SECTION ITEM TYPES - var sectionItemTypeFile = new SectionItemType - { - Name = SectionItemTypes.File, - }; - _context.SectionItemTypes.Add(sectionItemTypeFile); + //// SECTION ITEM TYPES + //var sectionItemTypeFile = new SectionItemType + //{ + // Name = SectionItemTypes.File, + //}; + //_context.SectionItemTypes.Add(sectionItemTypeFile); - var sectionItemTypeForum = new SectionItemType - { - Name = SectionItemTypes.Forum, - }; - _context.SectionItemTypes.Add(sectionItemTypeForum); + //var sectionItemTypeForum = new SectionItemType + //{ + // Name = SectionItemTypes.Forum, + //}; + //_context.SectionItemTypes.Add(sectionItemTypeForum); - var sectionItemTypeSurvey = new SectionItemType - { - Name = SectionItemTypes.Survey, - }; - _context.SectionItemTypes.Add(sectionItemTypeSurvey); + //var sectionItemTypeSurvey = new SectionItemType + //{ + // Name = SectionItemTypes.Survey, + //}; + //_context.SectionItemTypes.Add(sectionItemTypeSurvey); - await _context.SaveChangesAsync(); + //await _context.SaveChangesAsync(); - // COURSES - var course1Dto = new CourseCreateDto - { - Name = "Calculo 1", - TenantId = fingTenantId.Data.Id - }; - var course1 = await _courseService.Create(course1Dto); + //// COURSES + //var course1Dto = new CourseCreateDto + //{ + // Name = "Calculo 1", + // TenantId = fingTenantId.Data.Id + //}; + //var course1 = await _courseService.Create(course1Dto); - var course2Dto = new CourseCreateDto - { - Name = "GAL 1", - TenantId = fingTenantId.Data.Id - }; - var course2 = await _courseService.Create(course2Dto); + //var course2Dto = new CourseCreateDto + //{ + // Name = "GAL 1", + // TenantId = fingTenantId.Data.Id + //}; + //var course2 = await _courseService.Create(course2Dto); - var course3Dto = new CourseCreateDto - { - Name = "Fisica 1", - TenantId = fingTenantId.Data.Id - }; - await _courseService.Create(course3Dto); + //var course3Dto = new CourseCreateDto + //{ + // Name = "Fisica 1", + // TenantId = fingTenantId.Data.Id + //}; + //await _courseService.Create(course3Dto); - // SECTIONS - var section1 = new SectionCreateDto - { - CourseId = course1.Data.Id, - Name = "General", - Order = 1 - }; - var section1Id = await _sectionService.Create(section1); + //// SECTIONS + //var section1 = new SectionCreateDto + //{ + // CourseId = course1.Data.Id, + // Name = "General", + // Order = 1 + //}; + //var section1Id = await _sectionService.Create(section1); - var section2 = new SectionCreateDto - { - CourseId = course2.Data.Id, - Name = "General", - Order = 1 - }; - var section2Id = await _sectionService.Create(section2); + //var section2 = new SectionCreateDto + //{ + // CourseId = course2.Data.Id, + // Name = "General", + // Order = 1 + //}; + //var section2Id = await _sectionService.Create(section2); - var section3 = new SectionCreateDto - { - CourseId = course1.Data.Id, - Name = "Tema 1", - Order = 2 - }; - var section3Id = await _sectionService.Create(section3); + //var section3 = new SectionCreateDto + //{ + // CourseId = course1.Data.Id, + // Name = "Tema 1", + // Order = 2 + //}; + //var section3Id = await _sectionService.Create(section3); - // SECTION ITEMS - var sectionItem1 = new SectionItemCreateDto - { - SectionId = section1Id.Data, - Order = 1, - SectionItemTypeId = sectionItemTypeForum.Id, - Forum = new ForumCreateDto - { - Name = "Novedades" - } - }; - await _sectionItemService.Create(sectionItem1, fingTenantId.Data.Id); + //// SECTION ITEMS + //var sectionItem1 = new SectionItemCreateDto + //{ + // SectionId = section1Id.Data, + // Order = 1, + // SectionItemTypeId = sectionItemTypeForum.Id, + // Forum = new ForumCreateDto + // { + // Name = "Novedades" + // } + //}; + //await _sectionItemService.Create(sectionItem1); - var sectionItem2 = new SectionItemCreateDto - { - SectionId = section2Id.Data, - Order = 1, - SectionItemTypeId = sectionItemTypeForum.Id, - Forum = new ForumCreateDto - { - Name = "Novedades" - } - }; - await _sectionItemService.Create(sectionItem2, fingTenantId.Data.Id); + //var sectionItem2 = new SectionItemCreateDto + //{ + // SectionId = section2Id.Data, + // Order = 1, + // SectionItemTypeId = sectionItemTypeForum.Id, + // Forum = new ForumCreateDto + // { + // Name = "Novedades" + // } + //}; + //await _sectionItemService.Create(sectionItem2); - var sectionItem3 = new SectionItemCreateDto - { - SectionId = section1Id.Data, - Order = 2, - SectionItemTypeId = sectionItemTypeForum.Id, - Forum = new ForumCreateDto - { - Name = "General" - } - }; - await _sectionItemService.Create(sectionItem3, fingTenantId.Data.Id); + //var sectionItem3 = new SectionItemCreateDto + //{ + // SectionId = section1Id.Data, + // Order = 2, + // SectionItemTypeId = sectionItemTypeForum.Id, + // Forum = new ForumCreateDto + // { + // Name = "General" + // } + //}; + //await _sectionItemService.Create(sectionItem3); - var sectionItem4 = new SectionItemCreateDto - { - SectionId = section3Id.Data, - Order = 1, - SectionItemTypeId = sectionItemTypeForum.Id, - Forum = new ForumCreateDto - { - Name = "Tema 1" - } - }; - await _sectionItemService.Create(sectionItem4, fingTenantId.Data.Id); + //var sectionItem4 = new SectionItemCreateDto + //{ + // SectionId = section3Id.Data, + // Order = 1, + // SectionItemTypeId = sectionItemTypeForum.Id, + // Forum = new ForumCreateDto + // { + // Name = "Tema 1" + // } + //}; + //await _sectionItemService.Create(sectionItem4); - // 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" - }, - }; + //// 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(); + //_context.AnswerOptions.AddRange(answerOptions); + //await _context.SaveChangesAsync(); } } diff --git a/Tsi1.Api/Tsi1.BusinessLayer/Dtos/CourseCreateDto.cs b/Tsi1.Api/Tsi1.BusinessLayer/Dtos/CourseCreateDto.cs index ffd3608d231c078c29b2a555f4b20ae565bfeaa8..97aae1c8c58c077d238007e0118ca3bb1b882199 100644 --- a/Tsi1.Api/Tsi1.BusinessLayer/Dtos/CourseCreateDto.cs +++ b/Tsi1.Api/Tsi1.BusinessLayer/Dtos/CourseCreateDto.cs @@ -8,6 +8,8 @@ namespace Tsi1.BusinessLayer.Dtos public class CourseCreateDto { public string Name { get; set; } + public bool IsTemplate { get; set; } + public List<SectionCreateDto> Sections { get; set; } [JsonIgnore] public int TenantId { get; set; } diff --git a/Tsi1.Api/Tsi1.BusinessLayer/Dtos/CourseModifyDto.cs b/Tsi1.Api/Tsi1.BusinessLayer/Dtos/CourseModifyDto.cs new file mode 100644 index 0000000000000000000000000000000000000000..fe5599cc0265bf047c8fae3b65abc1662837821e --- /dev/null +++ b/Tsi1.Api/Tsi1.BusinessLayer/Dtos/CourseModifyDto.cs @@ -0,0 +1,13 @@ +using System.Text.Json.Serialization; + +namespace Tsi1.BusinessLayer.Dtos +{ + public class CourseModifyDto + { + public string Name { get; set; } + public bool IsTemplate { get; set; } + + [JsonIgnore] + public int TenantId { get; set; } + } +} diff --git a/Tsi1.Api/Tsi1.BusinessLayer/Dtos/SectionCreateDto.cs b/Tsi1.Api/Tsi1.BusinessLayer/Dtos/SectionCreateDto.cs index 3eee0e09604a69c76dd551964a95e139f1694f13..0b1df64dde26878ecb8c7c40cc299fb0052afc2a 100644 --- a/Tsi1.Api/Tsi1.BusinessLayer/Dtos/SectionCreateDto.cs +++ b/Tsi1.Api/Tsi1.BusinessLayer/Dtos/SectionCreateDto.cs @@ -9,5 +9,7 @@ namespace Tsi1.BusinessLayer.Dtos public int CourseId { get; set; } public string Name { get; set; } public int Order { get; set; } + + public List<SectionItemCreateDto> SectionItems { get; set; } } } diff --git a/Tsi1.Api/Tsi1.BusinessLayer/Helpers/ErrorMessages.cs b/Tsi1.Api/Tsi1.BusinessLayer/Helpers/ErrorMessages.cs index 322b0643d8e329eb1a4f74025c356a389776e0cd..c61742af40d30ff6d921347d857a16d4487272e6 100644 --- a/Tsi1.Api/Tsi1.BusinessLayer/Helpers/ErrorMessages.cs +++ b/Tsi1.Api/Tsi1.BusinessLayer/Helpers/ErrorMessages.cs @@ -31,8 +31,9 @@ namespace Tsi1.BusinessLayer.Helpers public const string CannotAuthenticateToSmtpServer = "No se pudo autenticar en el servidor SMTP"; public const string CannotSendEmail = "No se pudo mandar el mail con asunto {0}"; - public const string CourseDoesNotExist = "El curso '{0}' no existe"; + public const string CourseDoesNotExist = "El curso con id '{0}' no existe"; public const string DuplicateCourseName = "Ya existe un curso con nombre '{0}'"; + public const string CourseIsTemplate = "El curso con id '{0}' es un template"; public const string TenantDoesNotExist = "La Facultad '{0}' no existe"; public const string DuplicateTenantName = "Ya existe una Facultad con nombre '{0}'"; diff --git a/Tsi1.Api/Tsi1.BusinessLayer/Helpers/MappingProfile.cs b/Tsi1.Api/Tsi1.BusinessLayer/Helpers/MappingProfile.cs index 1f30ef1cfdbb29e897c72ddc82dc175e8542b9b4..d7f378c5c8514fd0686903f929573bc0ccf71795 100644 --- a/Tsi1.Api/Tsi1.BusinessLayer/Helpers/MappingProfile.cs +++ b/Tsi1.Api/Tsi1.BusinessLayer/Helpers/MappingProfile.cs @@ -87,7 +87,6 @@ namespace Tsi1.BusinessLayer.Helpers CreateMap<SurveyResponseDetailDto, SurveyResponse>(); CreateMap<SurveyAnswerDetailDto, SurveyAnswer>(); CreateMap<SurveyAnswerCreateDto, SurveyAnswer>(); - } } } diff --git a/Tsi1.Api/Tsi1.BusinessLayer/Interfaces/ICourseService.cs b/Tsi1.Api/Tsi1.BusinessLayer/Interfaces/ICourseService.cs index 836612b7ca3f7dde220cf84c186e2b5892c9719e..9bd530cae25bdebd3116e32ad7084eb6bd2d369e 100644 --- a/Tsi1.Api/Tsi1.BusinessLayer/Interfaces/ICourseService.cs +++ b/Tsi1.Api/Tsi1.BusinessLayer/Interfaces/ICourseService.cs @@ -1,6 +1,4 @@ -using System; -using System.Collections.Generic; -using System.Text; +using System.Collections.Generic; using System.Threading.Tasks; using Tsi1.BusinessLayer.Dtos; using Tsi1.BusinessLayer.Helpers; @@ -12,15 +10,15 @@ namespace Tsi1.BusinessLayer.Interfaces { Task<ServiceResult<List<CoursePreviewDto>>> GetCoursePreviews(int userId, string userType); - Task<ServiceResult<Course>> Create(CourseCreateDto newCourse); + Task<ServiceResult<int>> Create(CourseCreateDto newCourse); Task<ServiceResult<bool>> Matriculate(int userId, int courseId); Task<ServiceResult<bool>> AddProfessorToCourse(ProfessorCourseDto professorCourseDto); - Task<ServiceResult<List<CoursePreviewDto>>> GetAll(int tenantId); + Task<ServiceResult<List<CoursePreviewDto>>> GetAll(int tenantId, bool isTemplate = false); - Task<ServiceResult<bool>> Modify(int courseId, CourseCreateDto courseDto); + Task<ServiceResult<bool>> Modify(int courseId, CourseModifyDto courseDto); Task<ServiceResult<Course>> Delete(int courseId); diff --git a/Tsi1.Api/Tsi1.BusinessLayer/Interfaces/ISectionItemService.cs b/Tsi1.Api/Tsi1.BusinessLayer/Interfaces/ISectionItemService.cs index ad048812770a41c268427b9a0d0c1aa1a8ca7812..2c8a8d4fdef9f9b7ee7a53069995d1bb1a912cb0 100644 --- a/Tsi1.Api/Tsi1.BusinessLayer/Interfaces/ISectionItemService.cs +++ b/Tsi1.Api/Tsi1.BusinessLayer/Interfaces/ISectionItemService.cs @@ -9,8 +9,9 @@ namespace Tsi1.BusinessLayer.Interfaces { public interface ISectionItemService { - Task<ServiceResult<bool>> Create(SectionItemCreateDto newSectionItem, int tenantId); + Task<ServiceResult<int>> Create(SectionItemCreateDto newSectionItem); Task<ServiceResult<bool>> Delete(int sectionItemId); Task<ServiceResult<bool>> OrderSectionItems(List<OrderDto> orderDtos); + Task<ServiceResult<int>> CreateValidations(List<SectionItemCreateDto> sectionItems, bool isFromCreateSection = false); } } diff --git a/Tsi1.Api/Tsi1.BusinessLayer/Interfaces/ISectionService.cs b/Tsi1.Api/Tsi1.BusinessLayer/Interfaces/ISectionService.cs index c73668e044ad33996b43c3554216d69c0ef03146..6fc24d9eb5360303dbc9fde63deef202a136ab03 100644 --- a/Tsi1.Api/Tsi1.BusinessLayer/Interfaces/ISectionService.cs +++ b/Tsi1.Api/Tsi1.BusinessLayer/Interfaces/ISectionService.cs @@ -13,5 +13,6 @@ namespace Tsi1.BusinessLayer.Interfaces Task<ServiceResult<bool>> Delete(int sectionId); Task<ServiceResult<bool>> OrderSections(List<OrderDto> orderDtos); Task<ServiceResult<bool>> Modify(int sectionId, string name); + Task<ServiceResult<int>> CreateValidations(List<SectionCreateDto> sections, bool isFromCreateCourse = false); } } diff --git a/Tsi1.Api/Tsi1.BusinessLayer/Services/CourseService.cs b/Tsi1.Api/Tsi1.BusinessLayer/Services/CourseService.cs index 326206b791ac86d65b5575c47373ff84fb7aab6e..cd9387af0662f7b09ffaab906c33620f35d0ad03 100644 --- a/Tsi1.Api/Tsi1.BusinessLayer/Services/CourseService.cs +++ b/Tsi1.Api/Tsi1.BusinessLayer/Services/CourseService.cs @@ -17,18 +17,19 @@ namespace Tsi1.BusinessLayer.Services public class CourseService : ICourseService { private readonly Tsi1Context _context; - private readonly IMapper _mapper; + private readonly ISectionService _sectionService; - public CourseService(Tsi1Context context, IMapper mapper) + public CourseService(Tsi1Context context, IMapper mapper, ISectionService sectionService) { _context = context; _mapper = mapper; + _sectionService = sectionService; } - public async Task<ServiceResult<Course>> Create(CourseCreateDto newCourse) + public async Task<ServiceResult<int>> Create(CourseCreateDto newCourse) { - var result = new ServiceResult<Course>(); + var result = new ServiceResult<int>(); var existingCourse = await _context.Courses .FirstOrDefaultAsync(x => x.Name == newCourse.Name && x.TenantId == newCourse.TenantId); @@ -40,13 +41,17 @@ namespace Tsi1.BusinessLayer.Services return result; } + result = await _sectionService.CreateValidations(newCourse.Sections, true); + if (result.HasError) + { + return result; + } + var course = _mapper.Map<Course>(newCourse); _context.Courses.Add(course); - await _context.SaveChangesAsync(); - result.Data = course; return result; } @@ -97,6 +102,7 @@ namespace Tsi1.BusinessLayer.Services if (user == null || user.Student == null) { + result.HasError = true; result.Message = string.Format(ErrorMessages.UserDoesNotExist, userId); return result; } @@ -105,10 +111,18 @@ namespace Tsi1.BusinessLayer.Services if (course == null) { + result.HasError = true; result.Message = string.Format(ErrorMessages.CourseDoesNotExist, courseId); return result; } + if (course.IsTemplate) + { + result.HasError = true; + result.AddMessage(string.Format(ErrorMessages.CourseIsTemplate, courseId)); + return result; + } + var existingStudentCourse = await _context.StudentCourses .FirstOrDefaultAsync(x => x.StudentId == user.StudentId && x.CourseId == course.Id); @@ -144,6 +158,7 @@ namespace Tsi1.BusinessLayer.Services if (user == null || user.Professor == null) { + result.HasError = true; result.Message = string.Format(ErrorMessages.UserDoesNotExist, user.Username); return result; } @@ -153,10 +168,18 @@ namespace Tsi1.BusinessLayer.Services if (course == null) { + result.HasError = true; result.Message = string.Format(ErrorMessages.CourseDoesNotExist, professorCourseDto.CourseId); return result; } + if (course.IsTemplate) + { + result.HasError = true; + result.AddMessage(string.Format(ErrorMessages.CourseIsTemplate, professorCourseDto.CourseId)); + return result; + } + var existingProfessorCourse = await _context.ProfessorCourses .FirstOrDefaultAsync(x => x.ProfessorId == user.ProfessorId && x.CourseId == course.Id); @@ -174,30 +197,28 @@ namespace Tsi1.BusinessLayer.Services }; _context.ProfessorCourses.Add(professorCourse); - await _context.SaveChangesAsync(); result.Data = true; - return result; } - public async Task<ServiceResult<List<CoursePreviewDto>>> GetAll(int tenantId) + public async Task<ServiceResult<List<CoursePreviewDto>>> GetAll(int tenantId, bool isTemplate = false) { var result = new ServiceResult<List<CoursePreviewDto>>(); var courses = await _context.Courses - .Where(x => x.TenantId == tenantId) + .Where(x => x.TenantId == tenantId + && x.IsTemplate == isTemplate) .ToListAsync(); var coursesDto = _mapper.Map<List<CoursePreviewDto>>(courses); result.Data = coursesDto; - return result; } - public async Task<ServiceResult<bool>> Modify(int courseId, CourseCreateDto courseDto) + public async Task<ServiceResult<bool>> Modify(int courseId, CourseModifyDto courseDto) { var result = new ServiceResult<bool>(); @@ -210,12 +231,10 @@ namespace Tsi1.BusinessLayer.Services return result; } - _mapper.Map(courseDto, course); - + _mapper.Map(courseDto, course); await _context.SaveChangesAsync(); result.Data = true; - return result; } @@ -233,11 +252,9 @@ namespace Tsi1.BusinessLayer.Services } _context.Courses.Remove(course); - await _context.SaveChangesAsync(); result.Data = course; - return result; } @@ -316,11 +333,9 @@ namespace Tsi1.BusinessLayer.Services } _context.ProfessorCourses.Remove(professorCourse); - await _context.SaveChangesAsync(); result.Data = true; - return result; } @@ -338,7 +353,6 @@ namespace Tsi1.BusinessLayer.Services var userDtos = _mapper.Map<List<UserPreviewDto>>(users); result.Data = userDtos; - return result; } diff --git a/Tsi1.Api/Tsi1.BusinessLayer/Services/SectionItemService.cs b/Tsi1.Api/Tsi1.BusinessLayer/Services/SectionItemService.cs index 70142c455cccf76b1996d8440e986b7231024b61..56cab256819ac1bea56eb5d31a1fd07aeaac3054 100644 --- a/Tsi1.Api/Tsi1.BusinessLayer/Services/SectionItemService.cs +++ b/Tsi1.Api/Tsi1.BusinessLayer/Services/SectionItemService.cs @@ -27,25 +27,31 @@ namespace Tsi1.BusinessLayer.Services _fileService = fileService; } - public async Task<ServiceResult<bool>> Create(SectionItemCreateDto newSectionItem, int tenantId) + public async Task<ServiceResult<int>> Create(SectionItemCreateDto newSectionItem) { - var sectionItem = _mapper.Map<SectionItem>(newSectionItem); + var result = await this.CreateValidations(new List<SectionItemCreateDto>() { newSectionItem }); + if (result.HasError) + { + return result; + } - var sectionItemType = await _context.SectionItemTypes - .FirstOrDefaultAsync(x => x.Id == sectionItem.SectionItemTypeId); + var sectionItem = _mapper.Map<SectionItem>(newSectionItem); + _context.SectionItems.Add(sectionItem); + await _context.SaveChangesAsync(); - var result = this.SectionItemValidations(sectionItem, sectionItemType); + return result; + } + public async Task<ServiceResult<int>> Create(List<SectionItemCreateDto> newSectionItem) + { + var result = await this.CreateValidations(newSectionItem); if (result.HasError) { return result; } - if (sectionItemType.Name == SectionItemTypes.Survey) - { - sectionItem.Survey.Tenant.Id = tenantId; - } - _context.SectionItems.Add(sectionItem); + var sectionItem = _mapper.Map<List<SectionItem>>(newSectionItem); + _context.SectionItems.AddRange(sectionItem); await _context.SaveChangesAsync(); return result; @@ -107,66 +113,91 @@ namespace Tsi1.BusinessLayer.Services return result; } - private ServiceResult<bool> SectionItemValidations(SectionItem sectionItem, SectionItemType sectionItemType) + public async Task<ServiceResult<int>> CreateValidations(List<SectionItemCreateDto> sectionItems, bool isFromCreateSection = false) { - var result = new ServiceResult<bool>(); - - if (sectionItemType == null) - { - result.HasError = true; - result.AddMessage(string.Format(ErrorMessages.InvalidSectionItemType, sectionItem.SectionItemTypeId)); - return result; - } + var result = new ServiceResult<int>(); - if (sectionItemType.Name == SectionItemTypes.Forum) + if (!isFromCreateSection) { - if (sectionItem.Forum == null) - { - result.HasError = true; - result.AddMessage(ErrorMessages.ForumIsNull); - } + var sectionId = sectionItems.Select(x => x.SectionId).SingleOrDefault(); + var section = await _context.SectionItems.AsNoTracking() + .FirstOrDefaultAsync(x => sectionId == x.Id); - if (sectionItem.File != null || sectionItem.Survey != null) + if (section == null) { result.HasError = true; - result.AddMessage(string.Format(ErrorMessages.InvalidSectionItemData, sectionItemType.Name, SectionItemTypes.File)); + result.AddMessage(string.Format(ErrorMessages.SectionDoesNotExist, sectionId)); + return result; } } - if (sectionItemType.Name == SectionItemTypes.File) + var sectionItemTypeIds = sectionItems.Select(x => x.SectionItemTypeId).Distinct(); + + var sectionItemTypes = await _context.SectionItemTypes.AsNoTracking() + .Where(x => sectionItemTypeIds.Contains(x.Id)) + .ToListAsync(); + + foreach (var sectionItem in sectionItems) { - if (sectionItem.File == null) - { - result.HasError = true; - result.AddMessage(ErrorMessages.FileIsNull); - } + var sectionItemType = sectionItemTypes.FirstOrDefault(x => x.Id == sectionItem.SectionItemTypeId); - if (sectionItem.Forum != null || sectionItem.Survey != null) + if (sectionItemType == null) { result.HasError = true; - result.AddMessage(string.Format(ErrorMessages.InvalidSectionItemData, sectionItemType.Name, SectionItemTypes.Forum)); + result.AddMessage(string.Format(ErrorMessages.InvalidSectionItemType, sectionItem.SectionItemTypeId)); + continue; } - if (!_fileService.ExistFile(sectionItem.File.Path)) + if (sectionItemType.Name == SectionItemTypes.Forum) { - result.HasError = true; - result.AddMessage(string.Format(ErrorMessages.FileDoesNotExist, sectionItem.File.Path)); + if (sectionItem.Forum == null) + { + result.HasError = true; + result.AddMessage(ErrorMessages.ForumIsNull); + } + + if (sectionItem.File != null || sectionItem.Survey != null) + { + result.HasError = true; + result.AddMessage(string.Format(ErrorMessages.InvalidSectionItemData, sectionItemType.Name, SectionItemTypes.File)); + } } - } - if (sectionItemType.Name == SectionItemTypes.Survey) - { - if (sectionItem.Survey == null) + if (sectionItemType.Name == SectionItemTypes.File) { - result.HasError = true; - result.AddMessage(ErrorMessages.SurveyIsNull); + if (sectionItem.File == null) + { + result.HasError = true; + result.AddMessage(ErrorMessages.FileIsNull); + } + + if (sectionItem.Forum != null || sectionItem.Survey != null) + { + result.HasError = true; + result.AddMessage(string.Format(ErrorMessages.InvalidSectionItemData, sectionItemType.Name, SectionItemTypes.Forum)); + } + + if (!_fileService.ExistFile(sectionItem.File.Path)) + { + result.HasError = true; + result.AddMessage(string.Format(ErrorMessages.FileDoesNotExist, sectionItem.File.Path)); + } } - if (sectionItem.File != null || sectionItem.Forum != null) + if (sectionItemType.Name == SectionItemTypes.Survey) { - result.HasError = true; - result.AddMessage(string.Format(ErrorMessages.InvalidSectionItemData, sectionItemType.Name, SectionItemTypes.File)); - } + 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/SectionService.cs b/Tsi1.Api/Tsi1.BusinessLayer/Services/SectionService.cs index 765fce4c4b076acde332f0d1cad7354ed5549d6d..97e47a4a40cc679e0d3d38252d083091293bab09 100644 --- a/Tsi1.Api/Tsi1.BusinessLayer/Services/SectionService.cs +++ b/Tsi1.Api/Tsi1.BusinessLayer/Services/SectionService.cs @@ -17,22 +17,20 @@ namespace Tsi1.BusinessLayer.Services { private readonly Tsi1Context _context; private readonly IMapper _mapper; + private readonly ISectionItemService _sectionItemService; - public SectionService(Tsi1Context context, IMapper mapper) + public SectionService(Tsi1Context context, IMapper mapper, ISectionItemService sectionItemService) { _context = context; _mapper = mapper; + _sectionItemService = sectionItemService; } public async Task<ServiceResult<int>> Create(SectionCreateDto newSection) { - var result = new ServiceResult<int>(); - - var course = await _context.Courses.FirstOrDefaultAsync(x => x.Id == newSection.CourseId); - if (course == null) + var result = await this.CreateValidations(new List<SectionCreateDto>() { newSection }); + if (result.HasError) { - result.HasError = true; - result.AddMessage(string.Format(ErrorMessages.CourseDoesNotExist, newSection.CourseId)); return result; } @@ -44,6 +42,21 @@ namespace Tsi1.BusinessLayer.Services return result; } + public async Task<ServiceResult<int>> Create(List<SectionCreateDto> newSections) + { + var result = await this.CreateValidations(newSections); + if (result.HasError) + { + return result; + } + + var sections = _mapper.Map<List<Section>>(newSections); + _context.Sections.AddRange(sections); + await _context.SaveChangesAsync(); + + return result; + } + public async Task<ServiceResult<bool>> Delete(int sectionId) { var result = new ServiceResult<bool>(); @@ -115,5 +128,29 @@ namespace Tsi1.BusinessLayer.Services return result; } + + public async Task<ServiceResult<int>> CreateValidations(List<SectionCreateDto> sections, bool isFromCreateCourse = false) + { + var result = new ServiceResult<int>(); + + if (!isFromCreateCourse) + { + var courseId = sections.Select(x => x.CourseId).SingleOrDefault(); + var course = await _context.Courses.AsNoTracking() + .SingleOrDefaultAsync(x => x.Id == courseId); + + if (course == null) + { + result.HasError = true; + result.AddMessage(string.Format(ErrorMessages.CourseDoesNotExist, courseId)); + return result; + } + } + + var sectionItems = sections.SelectMany(x => x.SectionItems).ToList(); + result = await _sectionItemService.CreateValidations(sectionItems, true); + + return result; + } } } diff --git a/Tsi1.Api/Tsi1.DataLayer/Entities/Course.cs b/Tsi1.Api/Tsi1.DataLayer/Entities/Course.cs index 942858fad3a54d8c23bb6142258eb9bdf7e14b23..80c429198380aaf675c92b39bd57261dbda4fc5e 100644 --- a/Tsi1.Api/Tsi1.DataLayer/Entities/Course.cs +++ b/Tsi1.Api/Tsi1.DataLayer/Entities/Course.cs @@ -16,6 +16,7 @@ namespace Tsi1.DataLayer.Entities public int Id { get; set; } public string Name { get; set; } public int TenantId { get; set; } + public bool IsTemplate { get; set; } public Tenant Tenant { get; set; } public ICollection<StudentCourse> StudentCourses { get; set; } diff --git a/Tsi1.Api/Tsi1.DataLayer/EntityConfiguration/CourseConfiguration.cs b/Tsi1.Api/Tsi1.DataLayer/EntityConfiguration/CourseConfiguration.cs index 4cea40149d552d51d4c6fab8bc3d4ae20e5b3b48..0676afd111a856e4a50a9a00483498980418509f 100644 --- a/Tsi1.Api/Tsi1.DataLayer/EntityConfiguration/CourseConfiguration.cs +++ b/Tsi1.Api/Tsi1.DataLayer/EntityConfiguration/CourseConfiguration.cs @@ -20,6 +20,9 @@ namespace Tsi1.DataLayer.EntityConfiguration .IsRequired() .HasColumnType("character varying(50)"); + builder.Property(x => x.IsTemplate) + .IsRequired(); + builder.HasOne(x => x.Tenant) .WithMany(x => x.Courses) .HasForeignKey(x => x.TenantId); diff --git a/Tsi1.Api/Tsi1.DataLayer/Migrations/20201112213633_course-template.Designer.cs b/Tsi1.Api/Tsi1.DataLayer/Migrations/20201112213633_course-template.Designer.cs new file mode 100644 index 0000000000000000000000000000000000000000..506ca6417e5346d99fad772524f8ee8d1f69992b --- /dev/null +++ b/Tsi1.Api/Tsi1.DataLayer/Migrations/20201112213633_course-template.Designer.cs @@ -0,0 +1,611 @@ +// <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("20201112213633_course-template")] + partial class coursetemplate + { + 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.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<bool>("IsTemplate") + .HasColumnType("boolean"); + + 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.HasKey("Id"); + + b.HasIndex("FileId") + .IsUnique(); + + b.HasIndex("ForumId") + .IsUnique(); + + b.HasIndex("SectionId"); + + b.HasIndex("SectionItemTypeId"); + + 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.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(); + }); + + 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.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/20201112213633_course-template.cs b/Tsi1.Api/Tsi1.DataLayer/Migrations/20201112213633_course-template.cs new file mode 100644 index 0000000000000000000000000000000000000000..36d655ab060b7b684c4e175907ac20e21b3b5625 --- /dev/null +++ b/Tsi1.Api/Tsi1.DataLayer/Migrations/20201112213633_course-template.cs @@ -0,0 +1,23 @@ +using Microsoft.EntityFrameworkCore.Migrations; + +namespace Tsi1.DataLayer.Migrations +{ + public partial class coursetemplate : Migration + { + protected override void Up(MigrationBuilder migrationBuilder) + { + migrationBuilder.AddColumn<bool>( + name: "IsTemplate", + table: "Courses", + nullable: false, + defaultValue: false); + } + + protected override void Down(MigrationBuilder migrationBuilder) + { + migrationBuilder.DropColumn( + name: "IsTemplate", + table: "Courses"); + } + } +} diff --git a/Tsi1.Api/Tsi1.DataLayer/Migrations/Tsi1ContextModelSnapshot.cs b/Tsi1.Api/Tsi1.DataLayer/Migrations/Tsi1ContextModelSnapshot.cs index 8216f4b4c15b9fbc380b98cd89567475da7dc6d2..eb633f950cb0dd895b448ec7f43fc6fdde3db67f 100644 --- a/Tsi1.Api/Tsi1.DataLayer/Migrations/Tsi1ContextModelSnapshot.cs +++ b/Tsi1.Api/Tsi1.DataLayer/Migrations/Tsi1ContextModelSnapshot.cs @@ -62,6 +62,9 @@ namespace Tsi1.DataLayer.Migrations .HasColumnType("integer") .HasAnnotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.IdentityByDefaultColumn); + b.Property<bool>("IsTemplate") + .HasColumnType("boolean"); + b.Property<string>("Name") .IsRequired() .HasColumnType("character varying(50)");