diff --git a/Tsi1.Api/Tsi1.Api/Controllers/SectionItemController.cs b/Tsi1.Api/Tsi1.Api/Controllers/SectionItemController.cs index 5722e8038684bc0a536d89355f00f383f960b0a7..4e278ca49c8c101e03e2c593a2cc5a895c3196d1 100644 --- a/Tsi1.Api/Tsi1.Api/Controllers/SectionItemController.cs +++ b/Tsi1.Api/Tsi1.Api/Controllers/SectionItemController.cs @@ -14,10 +14,12 @@ namespace Tsi1.Api.Controllers public class SectionItemController : ControllerBase { private readonly ISectionItemService _sectionItemService; + private readonly ISectionItemTypeService _sectionItemTypeService; - public SectionItemController(ISectionItemService sectionItemService) + public SectionItemController(ISectionItemService sectionItemService, ISectionItemTypeService sectionItemTypeService) { _sectionItemService = sectionItemService; + _sectionItemTypeService = sectionItemTypeService; } [HttpPost("Create")] @@ -55,5 +57,12 @@ namespace Tsi1.Api.Controllers return Ok(); } + + [HttpGet("GetSectionItemTypes")] + public async Task<IActionResult> GetSectionItemTypes() + { + var result = await _sectionItemTypeService.GetAll(); + return Ok(result.Data); + } } } diff --git a/Tsi1.Api/Tsi1.Api/Startup.cs b/Tsi1.Api/Tsi1.Api/Startup.cs index e8e1ee7b49656e865656cedf49d04cc0e9f60818..83b6a02d8a22b467419d17e42cfef500a8816edc 100644 --- a/Tsi1.Api/Tsi1.Api/Startup.cs +++ b/Tsi1.Api/Tsi1.Api/Startup.cs @@ -78,6 +78,7 @@ namespace Tsi1.Api services.AddScoped<IFileService, FileService>(); services.AddScoped<ISectionService, SectionService>(); services.AddScoped<ISectionItemService, SectionItemService>(); + services.AddScoped<ISectionItemTypeService, SectionItemTypeService>(); services.Configure<MailSettings>(Configuration.GetSection("MailSettings")); services.AddScoped<IEmailService, EmailService>(); diff --git a/Tsi1.Api/Tsi1.BusinessLayer/Dtos/SectionItemCreateDto.cs b/Tsi1.Api/Tsi1.BusinessLayer/Dtos/SectionItemCreateDto.cs index 60a7ac27e7c4959cb0bd158af94851c94379b950..9da60f96c22ec4674298ff8503a8d29b0b70cfb8 100644 --- a/Tsi1.Api/Tsi1.BusinessLayer/Dtos/SectionItemCreateDto.cs +++ b/Tsi1.Api/Tsi1.BusinessLayer/Dtos/SectionItemCreateDto.cs @@ -9,8 +9,6 @@ namespace Tsi1.BusinessLayer.Dtos public int Order { get; set; } public int SectionId { get; set; } public int SectionItemTypeId { get; set; } - public int? ForumId { get; set; } - public int? FileId { get; set; } public ForumCreateDto Forum { get; set; } public FileDto File { get; set; } diff --git a/Tsi1.Api/Tsi1.BusinessLayer/Dtos/SectionItemTypeDto.cs b/Tsi1.Api/Tsi1.BusinessLayer/Dtos/SectionItemTypeDto.cs new file mode 100644 index 0000000000000000000000000000000000000000..89a6ca311d3eca78d999f4b3c3448e2d21cc56b5 --- /dev/null +++ b/Tsi1.Api/Tsi1.BusinessLayer/Dtos/SectionItemTypeDto.cs @@ -0,0 +1,12 @@ +using System; +using System.Collections.Generic; +using System.Text; + +namespace Tsi1.BusinessLayer.Dtos +{ + public class SectionItemTypeDto + { + public int Id { get; set; } + public string Name { get; set; } + } +} diff --git a/Tsi1.Api/Tsi1.BusinessLayer/Helpers/ErrorMessages.cs b/Tsi1.Api/Tsi1.BusinessLayer/Helpers/ErrorMessages.cs index df38861e1f48d6e84e75e01135b2eda8626094f2..41b7cf04530200739506f9fc996dff91c0ac3b81 100644 --- a/Tsi1.Api/Tsi1.BusinessLayer/Helpers/ErrorMessages.cs +++ b/Tsi1.Api/Tsi1.BusinessLayer/Helpers/ErrorMessages.cs @@ -49,6 +49,7 @@ namespace Tsi1.BusinessLayer.Helpers public const string SectionItemDoesNotExist = "El item de seccion con id '{0}' no existe"; public const string DuplicateSectionItemOrder = "Hay items de seccion con el mismo orden"; + public const string SectionItemTypeDoesNotExist = "El tipo de item de seccion con id '{0}' no existe"; public const string InvalidSectionItemType = "El tipo de item de seccion '{0}' es invalido"; public const string ForumIsNull = "El foro es nulo"; public const string FileIsNull = "El archivo es nulo"; diff --git a/Tsi1.Api/Tsi1.BusinessLayer/Helpers/MappingProfile.cs b/Tsi1.Api/Tsi1.BusinessLayer/Helpers/MappingProfile.cs index 46914abb3518ddc23fc6e54189b6cfdecf77e1a2..09eb4e310085fb6485c472bf07996fec3d5eb8d3 100644 --- a/Tsi1.Api/Tsi1.BusinessLayer/Helpers/MappingProfile.cs +++ b/Tsi1.Api/Tsi1.BusinessLayer/Helpers/MappingProfile.cs @@ -34,6 +34,7 @@ namespace Tsi1.BusinessLayer.Helpers CreateMap<File, FileDto>(); CreateMap<SectionItem, SectionItemCreateDto>(); CreateMap<Section, SectionCreateDto>(); + CreateMap<SectionItemType, SectionItemTypeDto>(); CreateMap<ForumCreateDto, Forum>(); CreateMap<ForumPreviewDto, Forum>(); @@ -57,6 +58,7 @@ namespace Tsi1.BusinessLayer.Helpers CreateMap<FileDto, File>(); CreateMap<SectionItemCreateDto, SectionItem>(); CreateMap<SectionCreateDto, Section>(); + CreateMap<SectionItemTypeDto, SectionItemType>(); } } } diff --git a/Tsi1.Api/Tsi1.BusinessLayer/Interfaces/ISectionItemTypeService.cs b/Tsi1.Api/Tsi1.BusinessLayer/Interfaces/ISectionItemTypeService.cs new file mode 100644 index 0000000000000000000000000000000000000000..55112eb6f5da721e95ec5fba9da13b28b2e90fef --- /dev/null +++ b/Tsi1.Api/Tsi1.BusinessLayer/Interfaces/ISectionItemTypeService.cs @@ -0,0 +1,15 @@ +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 ISectionItemTypeService + { + Task<ServiceResult<List<SectionItemTypeDto>>> GetAll(); + Task<ServiceResult<SectionItemTypeDto>> GetById(int id); + } +} diff --git a/Tsi1.Api/Tsi1.BusinessLayer/Services/FileService.cs b/Tsi1.Api/Tsi1.BusinessLayer/Services/FileService.cs index 304ed2561ed50cb60bb7683252d89a6320204638..74c8fb4ff7b641e327843a8acfdcb1cd6e3bd99b 100644 --- a/Tsi1.Api/Tsi1.BusinessLayer/Services/FileService.cs +++ b/Tsi1.Api/Tsi1.BusinessLayer/Services/FileService.cs @@ -29,40 +29,18 @@ namespace Tsi1.BusinessLayer.Services _path = Path.Combine(hostingEnvironment.ContentRootPath, "StaticFiles"); } - public async Task<ServiceResult<string>> SaveFile(IFormFile file, string filePath) - { - var result = new ServiceResult<string>(); - var fileStream = new FileStream(filePath, FileMode.Create); - - try - { - await file.CopyToAsync(fileStream); - } - catch (Exception) - { - result.HasError = true; - result.Message = string.Format(ErrorMessages.ErrorSavingFile, filePath); - return result; - } - finally - { - fileStream.Close(); - } - - return result; - } - public async Task<ServiceResult<string>> Create(IFormFile file, string tenantId, string courseId) { var result = new ServiceResult<string>(); - var path = Path.Combine(_path, tenantId, courseId); - Directory.CreateDirectory(path); + var folder = Path.Combine(_path, tenantId, courseId); + Directory.CreateDirectory(folder); var fileName = GenerateFileName(file); - var filePath = Path.Combine(path, fileName); - var fileStream = new FileStream(filePath, FileMode.Create); + var relativePath = Path.Combine(tenantId, courseId, fileName); + var filePath = Path.Combine(_path, relativePath); + var fileStream = new FileStream(filePath, FileMode.Create); try { await file.CopyToAsync(fileStream); @@ -78,7 +56,7 @@ namespace Tsi1.BusinessLayer.Services fileStream.Close(); } - result.Data = filePath.Replace(_path, string.Empty); + result.Data = relativePath; return result; } @@ -113,7 +91,8 @@ namespace Tsi1.BusinessLayer.Services public List<string> GetPhysicalFiles() { - return Directory.GetFiles(_path, "*", SearchOption.AllDirectories).ToList(); + var fullPaths = Directory.GetFiles(_path, "*", SearchOption.AllDirectories); + return fullPaths.Select(x => Path.GetRelativePath(_path, x)).ToList(); } private string GenerateFileName(IFormFile file) diff --git a/Tsi1.Api/Tsi1.BusinessLayer/Services/SectionItemTypeService.cs b/Tsi1.Api/Tsi1.BusinessLayer/Services/SectionItemTypeService.cs new file mode 100644 index 0000000000000000000000000000000000000000..28b4a6b24f979d8e5cd5ee51a46dd62c7d011091 --- /dev/null +++ b/Tsi1.Api/Tsi1.BusinessLayer/Services/SectionItemTypeService.cs @@ -0,0 +1,49 @@ +using AutoMapper; +using Microsoft.EntityFrameworkCore; +using System; +using System.Collections.Generic; +using System.Text; +using System.Threading.Tasks; +using Tsi1.BusinessLayer.Dtos; +using Tsi1.BusinessLayer.Helpers; +using Tsi1.BusinessLayer.Interfaces; +using Tsi1.DataLayer; + +namespace Tsi1.BusinessLayer.Services +{ + public class SectionItemTypeService : ISectionItemTypeService + { + private readonly Tsi1Context _context; + private readonly IMapper _mapper; + + public SectionItemTypeService(Tsi1Context context, IMapper mapper) + { + _context = context; + _mapper = mapper; + } + public async Task<ServiceResult<List<SectionItemTypeDto>>> GetAll() + { + var result = new ServiceResult<List<SectionItemTypeDto>>(); + var sectionItemTypes = await _context.SectionItemTypes.ToListAsync(); + + result.Data = _mapper.Map<List<SectionItemTypeDto>>(sectionItemTypes); + return result; + } + + public async Task<ServiceResult<SectionItemTypeDto>> GetById(int id) + { + var result = new ServiceResult<SectionItemTypeDto>(); + + var sectionItemType = await _context.SectionItemTypes.FirstOrDefaultAsync(x => x.Id == id); + if (sectionItemType == null) + { + result.HasError = true; + result.AddMessage(string.Format(ErrorMessages.SectionItemTypeDoesNotExist, id)); + return result; + } + + result.Data = _mapper.Map<SectionItemTypeDto>(sectionItemType); + return result; + } + } +} diff --git a/Tsi1.Api/Tsi1.DataLayer/Entities/File.cs b/Tsi1.Api/Tsi1.DataLayer/Entities/File.cs index 19ce03f7ee44657a8927980b9bc7b0ccec3ffc94..ea3324a77bd99ec20579f7aee468186c3c4bd643 100644 --- a/Tsi1.Api/Tsi1.DataLayer/Entities/File.cs +++ b/Tsi1.Api/Tsi1.DataLayer/Entities/File.cs @@ -7,7 +7,6 @@ namespace Tsi1.DataLayer.Entities public class File { public int Id { get; set; } - public int SectionItemId { get; set; } public string Name { get; set; } public string Path { get; set; } diff --git a/Tsi1.Api/Tsi1.DataLayer/Entities/Forum.cs b/Tsi1.Api/Tsi1.DataLayer/Entities/Forum.cs index 1bb2559fb47b333c75de0b310f12015e8f2430ac..086df15e9e457f34c6715fb4a79a99b44da5bcb1 100644 --- a/Tsi1.Api/Tsi1.DataLayer/Entities/Forum.cs +++ b/Tsi1.Api/Tsi1.DataLayer/Entities/Forum.cs @@ -14,7 +14,6 @@ namespace Tsi1.DataLayer.Entities public int Id { get; set; } public string Name { get; set; } - public int SectionItemId { get; set; } public SectionItem SectionItem { get; set; } public ICollection<Post> Posts { get; set; } diff --git a/Tsi1.Api/Tsi1.DataLayer/EntityConfiguration/ForumConfiguration.cs b/Tsi1.Api/Tsi1.DataLayer/EntityConfiguration/ForumConfiguration.cs index 2c84b92e8aca5a120b46bf89bf11701a90fbb2bc..777e05129d429060775725fc5e81920c96ddf2e6 100644 --- a/Tsi1.Api/Tsi1.DataLayer/EntityConfiguration/ForumConfiguration.cs +++ b/Tsi1.Api/Tsi1.DataLayer/EntityConfiguration/ForumConfiguration.cs @@ -13,10 +13,6 @@ namespace Tsi1.DataLayer.EntityConfiguration builder.Property(x => x.Name) .IsRequired() .HasColumnType("character varying(50)"); - - builder.HasOne(x => x.SectionItem) - .WithOne(x => x.Forum) - .HasForeignKey<Forum>(x => x.SectionItemId); } } } diff --git a/Tsi1.Api/Tsi1.DataLayer/Migrations/20201107181002_fix-section-items.Designer.cs b/Tsi1.Api/Tsi1.DataLayer/Migrations/20201107181002_fix-section-items.Designer.cs new file mode 100644 index 0000000000000000000000000000000000000000..27f320d9ce062b4e979b01b4f86858827274e92b --- /dev/null +++ b/Tsi1.Api/Tsi1.DataLayer/Migrations/20201107181002_fix-section-items.Designer.cs @@ -0,0 +1,608 @@ +// <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("20201107181002_fix-section-items")] + partial class fixsectionitems + { + 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<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/20201107181002_fix-section-items.cs b/Tsi1.Api/Tsi1.DataLayer/Migrations/20201107181002_fix-section-items.cs new file mode 100644 index 0000000000000000000000000000000000000000..8c62edd2ca588155db26ae64cdef48b67efdc034 --- /dev/null +++ b/Tsi1.Api/Tsi1.DataLayer/Migrations/20201107181002_fix-section-items.cs @@ -0,0 +1,35 @@ +using Microsoft.EntityFrameworkCore.Migrations; + +namespace Tsi1.DataLayer.Migrations +{ + public partial class fixsectionitems : Migration + { + protected override void Up(MigrationBuilder migrationBuilder) + { + migrationBuilder.DropColumn( + name: "SectionItemId", + table: "Forums"); + + migrationBuilder.DropColumn( + name: "SectionItemId", + table: "Files"); + } + + protected override void Down(MigrationBuilder migrationBuilder) + { + migrationBuilder.AddColumn<int>( + name: "SectionItemId", + table: "Forums", + type: "integer", + nullable: false, + defaultValue: 0); + + migrationBuilder.AddColumn<int>( + name: "SectionItemId", + table: "Files", + type: "integer", + nullable: false, + defaultValue: 0); + } + } +} diff --git a/Tsi1.Api/Tsi1.DataLayer/Migrations/Tsi1ContextModelSnapshot.cs b/Tsi1.Api/Tsi1.DataLayer/Migrations/Tsi1ContextModelSnapshot.cs index b520b499f27030a9da8befb5dbd7aa75f05996d9..e661f62fc22750b698b1da14d4ac889d01af8e80 100644 --- a/Tsi1.Api/Tsi1.DataLayer/Migrations/Tsi1ContextModelSnapshot.cs +++ b/Tsi1.Api/Tsi1.DataLayer/Migrations/Tsi1ContextModelSnapshot.cs @@ -76,9 +76,6 @@ namespace Tsi1.DataLayer.Migrations .IsRequired() .HasColumnType("character varying(1000)"); - b.Property<int>("SectionItemId") - .HasColumnType("integer"); - b.HasKey("Id"); b.HasIndex("Path") @@ -98,9 +95,6 @@ namespace Tsi1.DataLayer.Migrations .IsRequired() .HasColumnType("character varying(50)"); - b.Property<int>("SectionItemId") - .HasColumnType("integer"); - b.HasKey("Id"); b.ToTable("Forums");