From b1db47726a10f90dc6c75778200d805acc5c5d17 Mon Sep 17 00:00:00 2001 From: MaxchilKH Date: Thu, 8 Oct 2020 19:18:57 +0200 Subject: [PATCH 1/3] add document scan endpoint --- .../Controllers/DocumentsController.cs | 66 +++++++++++++++---- .../Queries/DocumentPublishRequest.cs | 3 +- .../Service/FileValidator.cs | 30 +++++++++ .../Services/IInternshipService.cs | 13 ---- .../Services/InternshipService.cs | 58 ---------------- src/InternshipSystem.Api/Startup.cs | 4 +- .../Entity/Internship/Internship.cs | 40 ++++++----- 7 files changed, 109 insertions(+), 105 deletions(-) create mode 100644 src/InternshipSystem.Api/Service/FileValidator.cs delete mode 100644 src/InternshipSystem.Api/Services/IInternshipService.cs delete mode 100644 src/InternshipSystem.Api/Services/InternshipService.cs diff --git a/src/InternshipSystem.Api/Controllers/DocumentsController.cs b/src/InternshipSystem.Api/Controllers/DocumentsController.cs index c88113b..d502fb7 100644 --- a/src/InternshipSystem.Api/Controllers/DocumentsController.cs +++ b/src/InternshipSystem.Api/Controllers/DocumentsController.cs @@ -1,11 +1,14 @@ -using System.Threading; +using System.IO; +using System.Threading; using System.Threading.Tasks; using InternshipSystem.Api.Queries; using InternshipSystem.Api.Security; -using InternshipSystem.Api.Services; +using InternshipSystem.Api.Service; +using InternshipSystem.Repository; using Microsoft.AspNetCore.Authorization; using Microsoft.AspNetCore.Http; using Microsoft.AspNetCore.Mvc; +using Microsoft.EntityFrameworkCore; namespace InternshipSystem.Api.Controllers { @@ -13,11 +16,13 @@ namespace InternshipSystem.Api.Controllers [Route("document")] public class DocumentsController : ControllerBase { - private readonly IInternshipService _internshipService; + private readonly InternshipDbContext _context; + private readonly FileValidator _fileValidator; - public DocumentsController(IInternshipService internshipService) + public DocumentsController(InternshipDbContext context, FileValidator fileValidator) { - _internshipService = internshipService; + _context = context; + _fileValidator = fileValidator; } /// @@ -34,18 +39,55 @@ namespace InternshipSystem.Api.Controllers [ProducesResponseType(StatusCodes.Status404NotFound)] [ProducesResponseType(StatusCodes.Status401Unauthorized)] [Authorize(Policy = Policies.RegisteredOnly)] - public async Task AddDocumentToInternship([FromBody] DocumentPublishRequest documentRequest, - [FromServices] User user, CancellationToken cancellationToken) + public async Task AddDocumentToInternship( + [FromBody] DocumentPublishRequest documentRequest, + [FromServices] User user, + CancellationToken cancellationToken) { var validator = new DocumentPublishRequest.Validator(); - var validationResult = await validator.ValidateAsync(documentRequest, cancellationToken); - - if (!validationResult.IsValid) + var result = await validator.ValidateAsync(documentRequest, cancellationToken); + + if (!result.IsValid) { - return BadRequest(validationResult.ToString()); + return BadRequest(result.ToString()); } - return await _internshipService.AddDocumentToInternship(documentRequest, user, cancellationToken); + var edition = await _context.Editions.FirstAsync(e => e.Id == user.EditionId, cancellationToken); + + var internship = + await _context.Entry(edition) + .Collection(e => e.Internships) + .Query() + .FirstAsync(i => i.Student.Id == user.PersonNumber, cancellationToken); + + internship.AddNewDocument(documentRequest.Description, documentRequest.Type); + + return Ok(); + } + + [HttpPut("{documentId}/scan")] + public async Task AddDocumentScan(long documentId, IFormFile documentScan, [FromServices] User user, CancellationToken cancellationToken) + { + await using var memoryStream = new MemoryStream(); + await documentScan.CopyToAsync(memoryStream, cancellationToken); + + if (!_fileValidator.IsValidFile(memoryStream.ToArray())) + { + return BadRequest("error.document.scan"); + } + + var edition = await _context.Editions.FirstAsync(e => e.Id == user.EditionId, cancellationToken); + + var internship = + await _context.Entry(edition) + .Collection(e => e.Internships) + .Query() + .Include(i => i.Documentation) + .FirstAsync(i => i.Student.Id == user.PersonNumber, cancellationToken); + + internship.UpdateDocumentScan(documentId, memoryStream.ToArray()); + + return Ok(); } } } \ No newline at end of file diff --git a/src/InternshipSystem.Api/Queries/DocumentPublishRequest.cs b/src/InternshipSystem.Api/Queries/DocumentPublishRequest.cs index 975b704..272775a 100644 --- a/src/InternshipSystem.Api/Queries/DocumentPublishRequest.cs +++ b/src/InternshipSystem.Api/Queries/DocumentPublishRequest.cs @@ -1,5 +1,6 @@ using FluentValidation; using InternshipSystem.Core.ValueObject; +using Microsoft.AspNetCore.Http; namespace InternshipSystem.Api.Queries { @@ -7,14 +8,12 @@ namespace InternshipSystem.Api.Queries { public long? Id { get; set; } public string Description { get; set; } - public byte[] Scan { get; set; } public DocumentType Type { get; set; } public class Validator : AbstractValidator { public Validator() { - RuleFor(document => document.Scan).NotEmpty(); RuleFor(document => document.Type).NotEmpty(); } } diff --git a/src/InternshipSystem.Api/Service/FileValidator.cs b/src/InternshipSystem.Api/Service/FileValidator.cs new file mode 100644 index 0000000..838081f --- /dev/null +++ b/src/InternshipSystem.Api/Service/FileValidator.cs @@ -0,0 +1,30 @@ +using System.Collections.Generic; +using System.Linq; + +namespace InternshipSystem.Api.Service +{ + public class FileValidator + { + private readonly Dictionary validFileTypes; + + public FileValidator() + { + validFileTypes = new Dictionary { + { "pdf", new byte[] { 0x25, 0x50, 0x44, 0x46 } } + }; + } + + public bool IsValidFile(byte[] scan) + { + return IsFileValidType(scan); + } + + private bool IsFileValidType(byte[] scan) + { + var validSignatures = validFileTypes.Values; + var header = scan[..4]; + + return validSignatures.Any(sig => header.SequenceEqual(header)); + } + } +} \ No newline at end of file diff --git a/src/InternshipSystem.Api/Services/IInternshipService.cs b/src/InternshipSystem.Api/Services/IInternshipService.cs deleted file mode 100644 index e3a7294..0000000 --- a/src/InternshipSystem.Api/Services/IInternshipService.cs +++ /dev/null @@ -1,13 +0,0 @@ -using System.Threading; -using System.Threading.Tasks; -using InternshipSystem.Api.Queries; -using InternshipSystem.Api.Security; -using Microsoft.AspNetCore.Mvc; - -namespace InternshipSystem.Api.Services -{ - public interface IInternshipService - { - Task AddDocumentToInternship(DocumentPublishRequest documentRequest, User user, CancellationToken cancellationToken); - } -} \ No newline at end of file diff --git a/src/InternshipSystem.Api/Services/InternshipService.cs b/src/InternshipSystem.Api/Services/InternshipService.cs deleted file mode 100644 index 3ea6a7a..0000000 --- a/src/InternshipSystem.Api/Services/InternshipService.cs +++ /dev/null @@ -1,58 +0,0 @@ -using System; -using System.Threading; -using System.Threading.Tasks; -using AutoMapper; -using InternshipSystem.Api.Queries; -using InternshipSystem.Api.Security; -using InternshipSystem.Core; -using InternshipSystem.Repository; -using Microsoft.AspNetCore.Mvc; -using Microsoft.EntityFrameworkCore; - -namespace InternshipSystem.Api.Services -{ - public class InternshipService : IInternshipService - { - private readonly InternshipDbContext _context; - private IMapper Mapper { get; } - - public InternshipService(InternshipDbContext context, IMapper mapper) - { - _context = context; - Mapper = mapper; - } - - public async Task AddDocumentToInternship(DocumentPublishRequest documentRequest, User user, - CancellationToken cancellationToken) - { - var edition = await _context.Editions.FindAsync(user.EditionId); - - var internship = await _context.Entry(edition) - .Collection(e => e.Internships) - .Query() - .Include(i => i.Documentation) - .SingleAsync(i => i.Student.Id == user.PersonNumber, cancellationToken); - - var document = Mapper.Map(documentRequest); - - if (documentRequest.Id.HasValue) - { - try - { - internship.UpdateDocument(document); - } - catch (InvalidOperationException) - { - return new NotFoundResult(); - } - } - else - { - internship.AddNewDocument(document); - } - - await _context.SaveChangesAsync(cancellationToken); - return new OkResult(); - } - } -} \ No newline at end of file diff --git a/src/InternshipSystem.Api/Startup.cs b/src/InternshipSystem.Api/Startup.cs index 916c84e..2eddcfe 100644 --- a/src/InternshipSystem.Api/Startup.cs +++ b/src/InternshipSystem.Api/Startup.cs @@ -7,7 +7,7 @@ using InternshipSystem.Api.Extensions; using InternshipSystem.Api.ModelBinders; using InternshipSystem.Api.Options; using InternshipSystem.Api.Security; -using InternshipSystem.Api.Services; +using InternshipSystem.Api.Service; using InternshipSystem.Repository; using Microsoft.AspNetCore.Builder; using Microsoft.AspNetCore.Hosting; @@ -44,7 +44,7 @@ namespace InternshipSystem.Api .AddDbContext(o => o.UseNpgsql(Configuration.GetConnectionString("InternshipDatabase"))) .AddScoped() - .AddScoped() + .AddScoped() .AddScoped() .AddAutoMapper(cfg => cfg.AddProfile()); diff --git a/src/InternshipSystem.Core/Entity/Internship/Internship.cs b/src/InternshipSystem.Core/Entity/Internship/Internship.cs index 10eafea..8251873 100644 --- a/src/InternshipSystem.Core/Entity/Internship/Internship.cs +++ b/src/InternshipSystem.Core/Entity/Internship/Internship.cs @@ -1,5 +1,6 @@ using System.Collections.Generic; using System.Linq; +using InternshipSystem.Core.ValueObject; namespace InternshipSystem.Core.Entity.Internship { @@ -14,24 +15,7 @@ namespace InternshipSystem.Core.Entity.Internship public Edition Edition { get; set; } - public float? Grade { get; set; } - - public void UpdateDocument(Document document) - { - var oldDocument = Documentation.First(d => d.Id == document.Id); - - oldDocument.Description = document.Description ?? oldDocument.Description; - oldDocument.Scan = document.Scan ?? oldDocument.Scan; - oldDocument.Type = document.Type; - oldDocument.State = DocumentState.Submitted; - } - - public void AddNewDocument(Document document) - { - document.State = DocumentState.Submitted; - - Documentation.Add(document); - } + public float? Grade { get; set; } public static Internship CreateStudentsInternship(Student student) { @@ -46,5 +30,25 @@ namespace InternshipSystem.Core.Entity.Internship return internship; } + + public void AddNewDocument(string description, DocumentType type) + { + var document = new Document + { + Description = description, + Type = type, + State = DocumentState.Draft + }; + + Documentation.Add(document); + } + + public void UpdateDocumentScan(long documentId, byte[] documentScan) + { + var document = Documentation.First(d => d.Id == documentId); + + document.Scan = documentScan; + document.State = DocumentState.Submitted; + } } } \ No newline at end of file -- 2.45.2 From 9a299b106c2a527b9e5d56538a06b2a8a91bda32 Mon Sep 17 00:00:00 2001 From: MaxchilKH Date: Sun, 18 Oct 2020 01:28:02 +0200 Subject: [PATCH 2/3] whatever --- .../Controllers/CompaniesController.cs | 2 + .../Controllers/DocumentsController.cs | 22 ++++++-- .../Controllers/InternshipController.cs | 54 +++++++++++++++++++ .../InternshipRegistrationController.cs | 34 +----------- .../Queries/DocumentPublishRequest.cs | 5 -- src/InternshipSystem.Api/Startup.cs | 7 ++- .../Entity/Internship/Internship.cs | 2 - 7 files changed, 80 insertions(+), 46 deletions(-) create mode 100644 src/InternshipSystem.Api/Controllers/InternshipController.cs diff --git a/src/InternshipSystem.Api/Controllers/CompaniesController.cs b/src/InternshipSystem.Api/Controllers/CompaniesController.cs index ed374c6..312d02e 100644 --- a/src/InternshipSystem.Api/Controllers/CompaniesController.cs +++ b/src/InternshipSystem.Api/Controllers/CompaniesController.cs @@ -38,6 +38,7 @@ namespace InternshipSystem.Api.Controllers public async Task>> SearchByNameAsync([FromQuery] CompanySearchQuery searchQuery, CancellationToken cancellationToken) => await Context.Companies .Where(c => c.Name.ToLower().Contains(searchQuery.Name.ToLower())) + .Where(c => c.Provider == 0) .OrderBy(o => o.Name) .Skip(searchQuery.Page * searchQuery.PerPage) .Take(searchQuery.PerPage) @@ -62,6 +63,7 @@ namespace InternshipSystem.Api.Controllers .Collection(c => c.Branches) .Query() .Where(office => office.Address.City.ToLower().Contains(searchQuery.City.ToLower())) + .Where(office => office.Provider == 0) .Skip(searchQuery.Page * searchQuery.PerPage) .Take(searchQuery.PerPage) .ToListAsync(token); diff --git a/src/InternshipSystem.Api/Controllers/DocumentsController.cs b/src/InternshipSystem.Api/Controllers/DocumentsController.cs index a59efb5..2f59065 100644 --- a/src/InternshipSystem.Api/Controllers/DocumentsController.cs +++ b/src/InternshipSystem.Api/Controllers/DocumentsController.cs @@ -6,6 +6,7 @@ using System.Threading.Tasks; using InternshipSystem.Api.Queries; using InternshipSystem.Api.Security; using InternshipSystem.Api.Service; +using InternshipSystem.Core; using InternshipSystem.Repository; using Microsoft.AspNetCore.Authorization; using Microsoft.AspNetCore.Http; @@ -47,7 +48,7 @@ namespace InternshipSystem.Api.Controllers CancellationToken cancellationToken) { var validator = new DocumentPublishRequest.Validator(); - var result = await validator.ValidateAsync(documentRequest, cancellationToken); + var result = await validator.ValidateAsync(documentRequest, cancellationToken); if (!result.IsValid) { @@ -85,11 +86,18 @@ namespace InternshipSystem.Api.Controllers await _context.Entry(edition) .Collection(e => e.Internships) .Query() - .Include(i => i.Documentation) .FirstAsync(i => i.Student.Id == user.PersonNumber, cancellationToken); - internship.UpdateDocumentScan(documentId, memoryStream.ToArray()); + var document = await _context.Entry(internship) + .Collection(i => i.Documentation) + .Query() + .FirstOrDefaultAsync(d => d.Id == documentId, cancellationToken); + document.Scan = memoryStream.ToArray(); + document.State = DocumentState.Submitted; + + await _context.SaveChangesAsync(cancellationToken); + return Ok(); } @@ -103,10 +111,14 @@ namespace InternshipSystem.Api.Controllers await _context.Entry(edition) .Collection(e => e.Internships) .Query() - .Include(i => i.Documentation) .FirstAsync(i => i.Student.Id == user.PersonNumber, cancellationToken); - var document = internship.Documentation.First(d => d.Id == documentId); + var document = + await _context.Entry(internship) + .Collection(i => i.Documentation) + .Query() + .FirstOrDefaultAsync(d => d.Id == documentId, cancellationToken); + var stream = new MemoryStream(document.Scan); return File(stream, "application/pdf"); diff --git a/src/InternshipSystem.Api/Controllers/InternshipController.cs b/src/InternshipSystem.Api/Controllers/InternshipController.cs new file mode 100644 index 0000000..e52bc44 --- /dev/null +++ b/src/InternshipSystem.Api/Controllers/InternshipController.cs @@ -0,0 +1,54 @@ +using System.Threading; +using System.Threading.Tasks; +using InternshipSystem.Api.Security; +using InternshipSystem.Core.Entity.Internship; +using InternshipSystem.Repository; +using Microsoft.AspNetCore.Authorization; +using Microsoft.AspNetCore.Http; +using Microsoft.AspNetCore.Mvc; +using Microsoft.EntityFrameworkCore; + +namespace InternshipSystem.Api.Controllers +{ + [ApiController] + [Route("internship")] + public class InternshipController : ControllerBase + { + private readonly InternshipDbContext _context; + + public InternshipController(InternshipDbContext context) + { + _context = context; + } + + /// + /// Get internship for current edition + /// + /// If current internship returned successfully + /// This action is only available for authorized student registered for current edition + [HttpGet] + [ProducesResponseType(StatusCodes.Status200OK)] + [ProducesResponseType(StatusCodes.Status400BadRequest)] + [ProducesResponseType(StatusCodes.Status401Unauthorized)] + [Authorize(Policy = Policies.RegisteredOnly)] + public async Task> GetCurrentEditionInternship([FromServices] User user, CancellationToken cancellationToken) + { + var edition = await _context.Editions + .FindAsync(user.EditionId); + + var internship = await _context.Entry(edition) + .Collection(e => e.Internships) + .Query() + .Include(i => i.Student) + .Include(i => i.InternshipRegistration) + .Include(i => i.InternshipRegistration.Company) + .Include(i => i.InternshipRegistration.BranchAddress) + .Include(i => i.InternshipRegistration.Type) + .Include(i => i.Report) + .Include(i => i.Documentation) + .SingleAsync(i => i.Student.Id == user.PersonNumber, cancellationToken); + + return Ok(internship); + } + } +} \ No newline at end of file diff --git a/src/InternshipSystem.Api/Controllers/InternshipRegistrationController.cs b/src/InternshipSystem.Api/Controllers/InternshipRegistrationController.cs index d2a98e9..c99b4d4 100644 --- a/src/InternshipSystem.Api/Controllers/InternshipRegistrationController.cs +++ b/src/InternshipSystem.Api/Controllers/InternshipRegistrationController.cs @@ -7,13 +7,13 @@ using InternshipSystem.Api.Security; using InternshipSystem.Api.UseCases; using InternshipSystem.Repository; using Microsoft.AspNetCore.Authorization; -using InternshipSystem.Core.Entity.Internship; using Microsoft.AspNetCore.Http; using Microsoft.AspNetCore.Mvc; using Microsoft.EntityFrameworkCore; namespace InternshipSystem.Api.Controllers { + [ApiController] [Route("internshipRegistration")] public class InternshipRegistrationController : ControllerBase { @@ -81,38 +81,6 @@ namespace InternshipSystem.Api.Controllers { return BadRequest(e.Message); } - - } - - /// - /// Get internship for current edition - /// - /// If current internship returned successfully - /// This action is only available for authorized student registered for current edition - [HttpGet] - [ProducesResponseType(StatusCodes.Status200OK)] - [ProducesResponseType(StatusCodes.Status400BadRequest)] - [ProducesResponseType(StatusCodes.Status401Unauthorized)] - [Authorize(Policy = Policies.RegisteredOnly)] - public async Task> GetCurrentEditionInternship([FromServices] User user, CancellationToken cancellationToken) - { - var edition = await _context.Editions - .FindAsync(user.EditionId); - - var internship = await _context.Entry(edition) - .Collection(e => e.Internships) - .Query() - .Include(i => i.Student) - .Include(i => i.InternshipRegistration) - .Include(i => i.InternshipRegistration.Company) - .Include(i => i.InternshipRegistration.BranchAddress) - .Include(i => i.InternshipRegistration.Type) - .Include(i => i.Report) - .Include(i => i.Approvals) - .Include(i => i.Documentation) - .SingleAsync(i => i.Student.Id == user.PersonNumber, cancellationToken); - - return Ok(internship); } } } \ No newline at end of file diff --git a/src/InternshipSystem.Api/Queries/DocumentPublishRequest.cs b/src/InternshipSystem.Api/Queries/DocumentPublishRequest.cs index 272775a..c7c3e6d 100644 --- a/src/InternshipSystem.Api/Queries/DocumentPublishRequest.cs +++ b/src/InternshipSystem.Api/Queries/DocumentPublishRequest.cs @@ -6,16 +6,11 @@ namespace InternshipSystem.Api.Queries { public class DocumentPublishRequest { - public long? Id { get; set; } public string Description { get; set; } public DocumentType Type { get; set; } public class Validator : AbstractValidator { - public Validator() - { - RuleFor(document => document.Type).NotEmpty(); - } } } } \ No newline at end of file diff --git a/src/InternshipSystem.Api/Startup.cs b/src/InternshipSystem.Api/Startup.cs index 2eddcfe..94246e8 100644 --- a/src/InternshipSystem.Api/Startup.cs +++ b/src/InternshipSystem.Api/Startup.cs @@ -17,6 +17,7 @@ using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.Hosting; using Microsoft.OpenApi.Models; using Newtonsoft.Json; +using Newtonsoft.Json.Converters; namespace InternshipSystem.Api { @@ -57,7 +58,11 @@ namespace InternshipSystem.Api options.IncludeXmlComments(xmlPath); }) .AddControllers(o => { o.ModelBinderProviders.Insert(0, new UserBinderProvider()); }) - .AddNewtonsoftJson(options => options.SerializerSettings.ReferenceLoopHandling = ReferenceLoopHandling.Ignore); + .AddNewtonsoftJson(options => + { + options.SerializerSettings.ReferenceLoopHandling = ReferenceLoopHandling.Ignore; + options.SerializerSettings.Converters.Add(new StringEnumConverter()); + }); } public void Configure(IApplicationBuilder app, IWebHostEnvironment env) diff --git a/src/InternshipSystem.Core/Entity/Internship/Internship.cs b/src/InternshipSystem.Core/Entity/Internship/Internship.cs index 8251873..91ff865 100644 --- a/src/InternshipSystem.Core/Entity/Internship/Internship.cs +++ b/src/InternshipSystem.Core/Entity/Internship/Internship.cs @@ -10,7 +10,6 @@ namespace InternshipSystem.Core.Entity.Internship public Student Student { get; set; } public InternshipRegistration InternshipRegistration { get; set; } public Report Report { get; set; } - public List Approvals { get; set; } public List Documentation { get; set; } public Edition Edition { get; set; } @@ -25,7 +24,6 @@ namespace InternshipSystem.Core.Entity.Internship internship.InternshipRegistration = InternshipRegistration.Create(); internship.Report = Report.Create(); - internship.Approvals = new List(); internship.Documentation = new List(); return internship; -- 2.45.2 From abd131e383b99791d6eac265886361d3c49542e2 Mon Sep 17 00:00:00 2001 From: MaxchilKH Date: Sun, 18 Oct 2020 02:14:45 +0200 Subject: [PATCH 3/3] fix documents and other stuff --- .../InternshipDbContext.cs | 10 + .../InternshipSystem.Repository.csproj | 4 - ...ner.cs => 20201018000658_Init.Designer.cs} | 46 +- ...5165238_init.cs => 20201018000658_Init.cs} | 38 +- .../InternshipDbContextModelSnapshot.cs | 680 ++++++++++++++++++ 5 files changed, 741 insertions(+), 37 deletions(-) rename src/InternshipSystem.Repository/Migrations/{20201015165238_init.Designer.cs => 20201018000658_Init.Designer.cs} (96%) rename src/InternshipSystem.Repository/Migrations/{20201015165238_init.cs => 20201018000658_Init.cs} (96%) create mode 100644 src/InternshipSystem.Repository/Migrations/InternshipDbContextModelSnapshot.cs diff --git a/src/InternshipSystem.Repository/InternshipDbContext.cs b/src/InternshipSystem.Repository/InternshipDbContext.cs index b60832b..7f3a294 100644 --- a/src/InternshipSystem.Repository/InternshipDbContext.cs +++ b/src/InternshipSystem.Repository/InternshipDbContext.cs @@ -31,6 +31,16 @@ namespace InternshipSystem.Repository modelBuilder.Entity() .OwnsOne(ir => ir.Mentor); + modelBuilder.Entity(builder => + { + builder + .HasKey(scan => scan.DocumentId); + + builder + .HasOne(s => s.Document) + .WithOne(d => d.Scan); + }); + modelBuilder.Entity(builder => { builder diff --git a/src/InternshipSystem.Repository/InternshipSystem.Repository.csproj b/src/InternshipSystem.Repository/InternshipSystem.Repository.csproj index 45f6950..ac1ea48 100644 --- a/src/InternshipSystem.Repository/InternshipSystem.Repository.csproj +++ b/src/InternshipSystem.Repository/InternshipSystem.Repository.csproj @@ -20,8 +20,4 @@ - - - - diff --git a/src/InternshipSystem.Repository/Migrations/20201015165238_init.Designer.cs b/src/InternshipSystem.Repository/Migrations/20201018000658_Init.Designer.cs similarity index 96% rename from src/InternshipSystem.Repository/Migrations/20201015165238_init.Designer.cs rename to src/InternshipSystem.Repository/Migrations/20201018000658_Init.Designer.cs index b242697..18c89c3 100644 --- a/src/InternshipSystem.Repository/Migrations/20201015165238_init.Designer.cs +++ b/src/InternshipSystem.Repository/Migrations/20201018000658_Init.Designer.cs @@ -10,8 +10,8 @@ using Npgsql.EntityFrameworkCore.PostgreSQL.Metadata; namespace InternshipSystem.Repository.Migrations { [DbContext(typeof(InternshipDbContext))] - [Migration("20201015165238_init")] - partial class init + [Migration("20201018000658_Init")] + partial class Init { protected override void BuildTargetModel(ModelBuilder modelBuilder) { @@ -106,18 +106,10 @@ namespace InternshipSystem.Repository.Migrations .HasColumnName("internship_id") .HasColumnType("bigint"); - b.Property("InternshipId1") - .HasColumnName("internship_id1") - .HasColumnType("bigint"); - b.Property("RejectionReason") .HasColumnName("rejection_reason") .HasColumnType("text"); - b.Property("Scan") - .HasColumnName("scan") - .HasColumnType("bytea"); - b.Property("State") .HasColumnName("state") .HasColumnType("integer"); @@ -132,12 +124,25 @@ namespace InternshipSystem.Repository.Migrations b.HasIndex("InternshipId") .HasName("ix_document_internship_id"); - b.HasIndex("InternshipId1") - .HasName("ix_document_internship_id1"); - b.ToTable("document"); }); + modelBuilder.Entity("InternshipSystem.Core.DocumentScan", b => + { + b.Property("DocumentId") + .HasColumnName("document_id") + .HasColumnType("bigint"); + + b.Property("File") + .HasColumnName("file") + .HasColumnType("bytea"); + + b.HasKey("DocumentId") + .HasName("pk_document_scan"); + + b.ToTable("document_scan"); + }); + modelBuilder.Entity("InternshipSystem.Core.Edition", b => { b.Property("Id") @@ -523,14 +528,19 @@ namespace InternshipSystem.Repository.Migrations modelBuilder.Entity("InternshipSystem.Core.Document", b => { b.HasOne("InternshipSystem.Core.Entity.Internship.Internship", null) - .WithMany("Approvals") + .WithMany("Documentation") .HasForeignKey("InternshipId") .HasConstraintName("fk_document_internship_internship_id"); + }); - b.HasOne("InternshipSystem.Core.Entity.Internship.Internship", null) - .WithMany("Documentation") - .HasForeignKey("InternshipId1") - .HasConstraintName("fk_document_internship_internship_id1"); + modelBuilder.Entity("InternshipSystem.Core.DocumentScan", b => + { + b.HasOne("InternshipSystem.Core.Document", "Document") + .WithOne("Scan") + .HasForeignKey("InternshipSystem.Core.DocumentScan", "DocumentId") + .HasConstraintName("fk_document_scan_document_document_id") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); }); modelBuilder.Entity("InternshipSystem.Core.Edition", b => diff --git a/src/InternshipSystem.Repository/Migrations/20201015165238_init.cs b/src/InternshipSystem.Repository/Migrations/20201018000658_Init.cs similarity index 96% rename from src/InternshipSystem.Repository/Migrations/20201015165238_init.cs rename to src/InternshipSystem.Repository/Migrations/20201018000658_Init.cs index cb37b77..427f37a 100644 --- a/src/InternshipSystem.Repository/Migrations/20201015165238_init.cs +++ b/src/InternshipSystem.Repository/Migrations/20201018000658_Init.cs @@ -4,7 +4,7 @@ using Npgsql.EntityFrameworkCore.PostgreSQL.Metadata; namespace InternshipSystem.Repository.Migrations { - public partial class init : Migration + public partial class Init : Migration { protected override void Up(MigrationBuilder migrationBuilder) { @@ -323,12 +323,10 @@ namespace InternshipSystem.Repository.Migrations id = table.Column(nullable: false) .Annotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.IdentityByDefaultColumn), description = table.Column(nullable: true), - scan = table.Column(nullable: true), type = table.Column(nullable: false), state = table.Column(nullable: false), rejection_reason = table.Column(nullable: true), - internship_id = table.Column(nullable: true), - internship_id1 = table.Column(nullable: true) + internship_id = table.Column(nullable: true) }, constraints: table => { @@ -339,12 +337,24 @@ namespace InternshipSystem.Repository.Migrations principalTable: "internship", principalColumn: "id", onDelete: ReferentialAction.Restrict); + }); + + migrationBuilder.CreateTable( + name: "document_scan", + columns: table => new + { + document_id = table.Column(nullable: false), + file = table.Column(nullable: true) + }, + constraints: table => + { + table.PrimaryKey("pk_document_scan", x => x.document_id); table.ForeignKey( - name: "fk_document_internship_internship_id1", - column: x => x.internship_id1, - principalTable: "internship", + name: "fk_document_scan_document_document_id", + column: x => x.document_id, + principalTable: "document", principalColumn: "id", - onDelete: ReferentialAction.Restrict); + onDelete: ReferentialAction.Cascade); }); migrationBuilder.CreateIndex( @@ -357,11 +367,6 @@ namespace InternshipSystem.Repository.Migrations table: "document", column: "internship_id"); - migrationBuilder.CreateIndex( - name: "ix_document_internship_id1", - table: "document", - column: "internship_id1"); - migrationBuilder.CreateIndex( name: "ix_edition_internship_type_internship_type_id", table: "edition_internship_type", @@ -421,7 +426,7 @@ namespace InternshipSystem.Repository.Migrations protected override void Down(MigrationBuilder migrationBuilder) { migrationBuilder.DropTable( - name: "document"); + name: "document_scan"); migrationBuilder.DropTable( name: "edition_internship_type"); @@ -436,11 +441,14 @@ namespace InternshipSystem.Repository.Migrations name: "static_pages"); migrationBuilder.DropTable( - name: "internship"); + name: "document"); migrationBuilder.DropTable( name: "internship_subject"); + migrationBuilder.DropTable( + name: "internship"); + migrationBuilder.DropTable( name: "editions"); diff --git a/src/InternshipSystem.Repository/Migrations/InternshipDbContextModelSnapshot.cs b/src/InternshipSystem.Repository/Migrations/InternshipDbContextModelSnapshot.cs new file mode 100644 index 0000000..2451970 --- /dev/null +++ b/src/InternshipSystem.Repository/Migrations/InternshipDbContextModelSnapshot.cs @@ -0,0 +1,680 @@ +// +using System; +using InternshipSystem.Repository; +using Microsoft.EntityFrameworkCore; +using Microsoft.EntityFrameworkCore.Infrastructure; +using Microsoft.EntityFrameworkCore.Storage.ValueConversion; +using Npgsql.EntityFrameworkCore.PostgreSQL.Metadata; + +namespace InternshipSystem.Repository.Migrations +{ + [DbContext(typeof(InternshipDbContext))] + partial class InternshipDbContextModelSnapshot : ModelSnapshot + { + protected override void BuildModel(ModelBuilder modelBuilder) + { +#pragma warning disable 612, 618 + modelBuilder + .HasAnnotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.IdentityByDefaultColumn) + .HasAnnotation("ProductVersion", "3.1.4") + .HasAnnotation("Relational:MaxIdentifierLength", 63); + + modelBuilder.Entity("InternshipSystem.Core.BranchOffice", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnName("id") + .HasColumnType("bigint") + .HasAnnotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.IdentityByDefaultColumn); + + b.Property("CompanyId") + .HasColumnName("company_id") + .HasColumnType("bigint"); + + b.Property("Provider") + .HasColumnName("provider") + .HasColumnType("bigint"); + + b.HasKey("Id") + .HasName("pk_branch_office"); + + b.HasIndex("CompanyId") + .HasName("ix_branch_office_company_id"); + + b.ToTable("branch_office"); + }); + + modelBuilder.Entity("InternshipSystem.Core.Company", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnName("id") + .HasColumnType("bigint") + .HasAnnotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.IdentityByDefaultColumn); + + b.Property("Name") + .HasColumnName("name") + .HasColumnType("text"); + + b.Property("Nip") + .HasColumnName("nip") + .HasColumnType("text"); + + b.Property("Provider") + .HasColumnName("provider") + .HasColumnType("bigint"); + + b.HasKey("Id") + .HasName("pk_companies"); + + b.ToTable("companies"); + }); + + modelBuilder.Entity("InternshipSystem.Core.Course", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnName("id") + .HasColumnType("bigint") + .HasAnnotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.IdentityByDefaultColumn); + + b.Property("Name") + .HasColumnName("name") + .HasColumnType("text"); + + b.HasKey("Id") + .HasName("pk_course"); + + b.ToTable("course"); + }); + + modelBuilder.Entity("InternshipSystem.Core.Document", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnName("id") + .HasColumnType("bigint") + .HasAnnotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.IdentityByDefaultColumn); + + b.Property("Description") + .HasColumnName("description") + .HasColumnType("text"); + + b.Property("InternshipId") + .HasColumnName("internship_id") + .HasColumnType("bigint"); + + b.Property("RejectionReason") + .HasColumnName("rejection_reason") + .HasColumnType("text"); + + b.Property("State") + .HasColumnName("state") + .HasColumnType("integer"); + + b.Property("Type") + .HasColumnName("type") + .HasColumnType("integer"); + + b.HasKey("Id") + .HasName("pk_document"); + + b.HasIndex("InternshipId") + .HasName("ix_document_internship_id"); + + b.ToTable("document"); + }); + + modelBuilder.Entity("InternshipSystem.Core.DocumentScan", b => + { + b.Property("DocumentId") + .HasColumnName("document_id") + .HasColumnType("bigint"); + + b.Property("File") + .HasColumnName("file") + .HasColumnType("bytea"); + + b.HasKey("DocumentId") + .HasName("pk_document_scan"); + + b.ToTable("document_scan"); + }); + + modelBuilder.Entity("InternshipSystem.Core.Edition", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnName("id") + .HasColumnType("uuid"); + + b.Property("CourseId") + .HasColumnName("course_id") + .HasColumnType("bigint"); + + b.Property("EditionFinish") + .HasColumnName("edition_finish") + .HasColumnType("timestamp without time zone"); + + b.Property("EditionStart") + .HasColumnName("edition_start") + .HasColumnType("timestamp without time zone"); + + b.Property("ReportingStart") + .HasColumnName("reporting_start") + .HasColumnType("timestamp without time zone"); + + b.HasKey("Id") + .HasName("pk_editions"); + + b.HasIndex("CourseId") + .HasName("ix_editions_course_id"); + + b.ToTable("editions"); + }); + + modelBuilder.Entity("InternshipSystem.Core.Entity.Internship.Internship", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnName("id") + .HasColumnType("bigint") + .HasAnnotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.IdentityByDefaultColumn); + + b.Property("EditionId") + .HasColumnName("edition_id") + .HasColumnType("uuid"); + + b.Property("Grade") + .HasColumnName("grade") + .HasColumnType("real"); + + b.Property("InternshipRegistrationId") + .HasColumnName("internship_registration_id") + .HasColumnType("bigint"); + + b.Property("ReportId") + .HasColumnName("report_id") + .HasColumnType("bigint"); + + b.Property("StudentId") + .HasColumnName("student_id") + .HasColumnType("bigint"); + + b.HasKey("Id") + .HasName("pk_internship"); + + b.HasIndex("EditionId") + .HasName("ix_internship_edition_id"); + + b.HasIndex("InternshipRegistrationId") + .HasName("ix_internship_internship_registration_id"); + + b.HasIndex("ReportId") + .HasName("ix_internship_report_id"); + + b.HasIndex("StudentId") + .HasName("ix_internship_student_id"); + + b.ToTable("internship"); + }); + + modelBuilder.Entity("InternshipSystem.Core.Entity.Internship.InternshipRegistration", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnName("id") + .HasColumnType("bigint") + .HasAnnotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.IdentityByDefaultColumn); + + b.Property("BranchAddressId") + .HasColumnName("branch_address_id") + .HasColumnType("bigint"); + + b.Property("CompanyId") + .HasColumnName("company_id") + .HasColumnType("bigint"); + + b.Property("DeclaredHours") + .HasColumnName("declared_hours") + .HasColumnType("integer"); + + b.Property("End") + .HasColumnName("end") + .HasColumnType("timestamp without time zone"); + + b.Property("Start") + .HasColumnName("start") + .HasColumnType("timestamp without time zone"); + + b.Property("State") + .HasColumnName("state") + .HasColumnType("integer"); + + b.Property("TypeId") + .HasColumnName("type_id") + .HasColumnType("bigint"); + + b.HasKey("Id") + .HasName("pk_internship_registration"); + + b.HasIndex("BranchAddressId") + .HasName("ix_internship_registration_branch_address_id"); + + b.HasIndex("CompanyId") + .HasName("ix_internship_registration_company_id"); + + b.HasIndex("TypeId") + .HasName("ix_internship_registration_type_id"); + + b.ToTable("internship_registration"); + }); + + modelBuilder.Entity("InternshipSystem.Core.Entity.Internship.InternshipSubject", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnName("id") + .HasColumnType("bigint") + .HasAnnotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.IdentityByDefaultColumn); + + b.Property("Description") + .HasColumnName("description") + .HasColumnType("text"); + + b.Property("DescriptionEng") + .HasColumnName("description_eng") + .HasColumnType("text"); + + b.HasKey("Id") + .HasName("pk_internship_subject"); + + b.ToTable("internship_subject"); + }); + + modelBuilder.Entity("InternshipSystem.Core.Entity.Internship.InternshipType", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnName("id") + .HasColumnType("bigint") + .HasAnnotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.IdentityByDefaultColumn); + + b.Property("Description") + .HasColumnName("description") + .HasColumnType("text"); + + b.Property("DescriptionEng") + .HasColumnName("description_eng") + .HasColumnType("text"); + + b.Property("Label") + .HasColumnName("label") + .HasColumnType("text"); + + b.Property("LabelEng") + .HasColumnName("label_eng") + .HasColumnType("text"); + + b.HasKey("Id") + .HasName("pk_internship_types"); + + b.ToTable("internship_types"); + }); + + modelBuilder.Entity("InternshipSystem.Core.Report", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnName("id") + .HasColumnType("bigint") + .HasAnnotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.IdentityByDefaultColumn); + + b.Property("Range") + .HasColumnName("range") + .HasColumnType("integer"); + + b.Property("SiteAddress") + .HasColumnName("site_address") + .HasColumnType("text"); + + b.Property("State") + .HasColumnName("state") + .HasColumnType("integer"); + + b.HasKey("Id") + .HasName("pk_report"); + + b.ToTable("report"); + }); + + modelBuilder.Entity("InternshipSystem.Core.StaticPage", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnName("id") + .HasColumnType("bigint") + .HasAnnotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.IdentityByDefaultColumn); + + b.Property("AccessName") + .HasColumnName("access_name") + .HasColumnType("text"); + + b.Property("Content") + .HasColumnName("content") + .HasColumnType("text"); + + b.Property("ContentEng") + .HasColumnName("content_eng") + .HasColumnType("text"); + + b.Property("Title") + .HasColumnName("title") + .HasColumnType("text"); + + b.Property("TitleEng") + .HasColumnName("title_eng") + .HasColumnType("text"); + + b.HasKey("Id") + .HasName("pk_static_pages"); + + b.ToTable("static_pages"); + }); + + modelBuilder.Entity("InternshipSystem.Core.Student", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnName("id") + .HasColumnType("bigint") + .HasAnnotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.IdentityByDefaultColumn); + + b.Property("AlbumNumber") + .HasColumnName("album_number") + .HasColumnType("integer"); + + b.Property("Course") + .HasColumnName("course") + .HasColumnType("text"); + + b.Property("Email") + .HasColumnName("email") + .HasColumnType("text"); + + b.Property("FirstName") + .HasColumnName("first_name") + .HasColumnType("text"); + + b.Property("LastName") + .HasColumnName("last_name") + .HasColumnType("text"); + + b.Property("Semester") + .HasColumnName("semester") + .HasColumnType("integer"); + + b.HasKey("Id") + .HasName("pk_students"); + + b.ToTable("students"); + }); + + modelBuilder.Entity("InternshipSystem.Core.UglyOrmArtifacts.EditionInternshipType", b => + { + b.Property("EditionId") + .HasColumnName("edition_id") + .HasColumnType("uuid"); + + b.Property("InternshipTypeId") + .HasColumnName("internship_type_id") + .HasColumnType("bigint"); + + b.HasKey("EditionId", "InternshipTypeId") + .HasName("pk_edition_internship_type"); + + b.HasIndex("InternshipTypeId") + .HasName("ix_edition_internship_type_internship_type_id"); + + b.ToTable("edition_internship_type"); + }); + + modelBuilder.Entity("InternshipSystem.Core.UglyOrmArtifacts.EditionSubject", b => + { + b.Property("EditionId") + .HasColumnName("edition_id") + .HasColumnType("uuid"); + + b.Property("InternshipSubjectId") + .HasColumnName("internship_subject_id") + .HasColumnType("bigint"); + + b.HasKey("EditionId", "InternshipSubjectId") + .HasName("pk_edition_subject"); + + b.HasIndex("InternshipSubjectId") + .HasName("ix_edition_subject_internship_subject_id"); + + b.ToTable("edition_subject"); + }); + + modelBuilder.Entity("InternshipSystem.Core.UglyOrmArtifacts.ProgramSubject", b => + { + b.Property("InternshipRegistrationId") + .HasColumnName("internship_registration_id") + .HasColumnType("bigint"); + + b.Property("InternshipSubjectId") + .HasColumnName("internship_subject_id") + .HasColumnType("bigint"); + + b.HasKey("InternshipRegistrationId", "InternshipSubjectId") + .HasName("pk_program_subject"); + + b.HasIndex("InternshipSubjectId") + .HasName("ix_program_subject_internship_subject_id"); + + b.ToTable("program_subject"); + }); + + modelBuilder.Entity("InternshipSystem.Core.BranchOffice", b => + { + b.HasOne("InternshipSystem.Core.Company", null) + .WithMany("Branches") + .HasForeignKey("CompanyId") + .HasConstraintName("fk_branch_office_companies_company_id"); + + b.OwnsOne("InternshipSystem.Core.BranchAddress", "Address", b1 => + { + b1.Property("BranchOfficeId") + .ValueGeneratedOnAdd() + .HasColumnName("id") + .HasColumnType("bigint") + .HasAnnotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.IdentityByDefaultColumn); + + b1.Property("Building") + .HasColumnName("building") + .HasColumnType("text"); + + b1.Property("City") + .HasColumnName("city") + .HasColumnType("text"); + + b1.Property("Country") + .HasColumnName("country") + .HasColumnType("text"); + + b1.Property("PostalCode") + .HasColumnName("postal_code") + .HasColumnType("text"); + + b1.Property("Street") + .HasColumnName("street") + .HasColumnType("text"); + + b1.HasKey("BranchOfficeId") + .HasName("pk_branch_office"); + + b1.ToTable("branch_office"); + + b1.WithOwner() + .HasForeignKey("BranchOfficeId") + .HasConstraintName("fk_branch_address_branch_office_branch_office_id"); + }); + }); + + modelBuilder.Entity("InternshipSystem.Core.Document", b => + { + b.HasOne("InternshipSystem.Core.Entity.Internship.Internship", null) + .WithMany("Documentation") + .HasForeignKey("InternshipId") + .HasConstraintName("fk_document_internship_internship_id"); + }); + + modelBuilder.Entity("InternshipSystem.Core.DocumentScan", b => + { + b.HasOne("InternshipSystem.Core.Document", "Document") + .WithOne("Scan") + .HasForeignKey("InternshipSystem.Core.DocumentScan", "DocumentId") + .HasConstraintName("fk_document_scan_document_document_id") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + }); + + modelBuilder.Entity("InternshipSystem.Core.Edition", b => + { + b.HasOne("InternshipSystem.Core.Course", "Course") + .WithMany() + .HasForeignKey("CourseId") + .HasConstraintName("fk_editions_course_course_id"); + }); + + modelBuilder.Entity("InternshipSystem.Core.Entity.Internship.Internship", b => + { + b.HasOne("InternshipSystem.Core.Edition", "Edition") + .WithMany("Internships") + .HasForeignKey("EditionId") + .HasConstraintName("fk_internship_editions_edition_id"); + + b.HasOne("InternshipSystem.Core.Entity.Internship.InternshipRegistration", "InternshipRegistration") + .WithMany() + .HasForeignKey("InternshipRegistrationId") + .HasConstraintName("fk_internship_internship_registration_internship_registration_"); + + b.HasOne("InternshipSystem.Core.Report", "Report") + .WithMany() + .HasForeignKey("ReportId") + .HasConstraintName("fk_internship_report_report_id"); + + b.HasOne("InternshipSystem.Core.Student", "Student") + .WithMany() + .HasForeignKey("StudentId") + .HasConstraintName("fk_internship_students_student_id"); + }); + + modelBuilder.Entity("InternshipSystem.Core.Entity.Internship.InternshipRegistration", b => + { + b.HasOne("InternshipSystem.Core.BranchOffice", "BranchAddress") + .WithMany() + .HasForeignKey("BranchAddressId") + .HasConstraintName("fk_internship_registration_branch_office_branch_address_id"); + + b.HasOne("InternshipSystem.Core.Company", "Company") + .WithMany() + .HasForeignKey("CompanyId") + .HasConstraintName("fk_internship_registration_companies_company_id"); + + b.HasOne("InternshipSystem.Core.Entity.Internship.InternshipType", "Type") + .WithMany() + .HasForeignKey("TypeId") + .HasConstraintName("fk_internship_registration_internship_types_type_id"); + + b.OwnsOne("InternshipSystem.Core.Mentor", "Mentor", b1 => + { + b1.Property("InternshipRegistrationId") + .ValueGeneratedOnAdd() + .HasColumnName("id") + .HasColumnType("bigint") + .HasAnnotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.IdentityByDefaultColumn); + + b1.Property("Email") + .HasColumnName("email") + .HasColumnType("text"); + + b1.Property("FirstName") + .HasColumnName("first_name") + .HasColumnType("text"); + + b1.Property("LastName") + .HasColumnName("last_name") + .HasColumnType("text"); + + b1.Property("PhoneNumber") + .HasColumnName("phone_number") + .HasColumnType("text"); + + b1.HasKey("InternshipRegistrationId") + .HasName("pk_internship_registration"); + + b1.ToTable("internship_registration"); + + b1.WithOwner() + .HasForeignKey("InternshipRegistrationId") + .HasConstraintName("fk_mentor_internship_registration_internship_registration_id"); + }); + }); + + modelBuilder.Entity("InternshipSystem.Core.UglyOrmArtifacts.EditionInternshipType", b => + { + b.HasOne("InternshipSystem.Core.Edition", "Edition") + .WithMany("AvailableInternshipTypes") + .HasForeignKey("EditionId") + .HasConstraintName("fk_edition_internship_type_editions_edition_id") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("InternshipSystem.Core.Entity.Internship.InternshipType", "InternshipType") + .WithMany() + .HasForeignKey("InternshipTypeId") + .HasConstraintName("fk_edition_internship_type_internship_types_internship_type_id") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + }); + + modelBuilder.Entity("InternshipSystem.Core.UglyOrmArtifacts.EditionSubject", b => + { + b.HasOne("InternshipSystem.Core.Edition", "Edition") + .WithMany("AvailableSubjects") + .HasForeignKey("EditionId") + .HasConstraintName("fk_edition_subject_editions_edition_id") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("InternshipSystem.Core.Entity.Internship.InternshipSubject", "Subject") + .WithMany() + .HasForeignKey("InternshipSubjectId") + .HasConstraintName("fk_edition_subject_internship_subject_internship_subject_id") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + }); + + modelBuilder.Entity("InternshipSystem.Core.UglyOrmArtifacts.ProgramSubject", b => + { + b.HasOne("InternshipSystem.Core.Entity.Internship.InternshipRegistration", "Registration") + .WithMany("Subjects") + .HasForeignKey("InternshipRegistrationId") + .HasConstraintName("fk_program_subject_internship_registration_internship_registrat") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("InternshipSystem.Core.Entity.Internship.InternshipSubject", "Subject") + .WithMany() + .HasForeignKey("InternshipSubjectId") + .HasConstraintName("fk_program_subject_internship_subject_internship_subject_id") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + }); +#pragma warning restore 612, 618 + } + } +} -- 2.45.2