From b1db47726a10f90dc6c75778200d805acc5c5d17 Mon Sep 17 00:00:00 2001 From: MaxchilKH Date: Thu, 8 Oct 2020 19:18:57 +0200 Subject: [PATCH 1/2] 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 e59712a675634f6bbd832328008a5ed1b4dd296d Mon Sep 17 00:00:00 2001 From: MaxchilKH Date: Sat, 10 Oct 2020 15:33:20 +0200 Subject: [PATCH 2/2] add migration --- .../20201010133258_Hours.Designer.cs | 668 ++++++++++++++++++ .../Migrations/20201010133258_Hours.cs | 17 + .../InternshipSystem.cs | 3 +- 3 files changed, 687 insertions(+), 1 deletion(-) create mode 100644 src/InternshipSystem.Repository/Migrations/20201010133258_Hours.Designer.cs create mode 100644 src/InternshipSystem.Repository/Migrations/20201010133258_Hours.cs diff --git a/src/InternshipSystem.Repository/Migrations/20201010133258_Hours.Designer.cs b/src/InternshipSystem.Repository/Migrations/20201010133258_Hours.Designer.cs new file mode 100644 index 0000000..077e177 --- /dev/null +++ b/src/InternshipSystem.Repository/Migrations/20201010133258_Hours.Designer.cs @@ -0,0 +1,668 @@ +// +using System; +using InternshipSystem.Repository; +using Microsoft.EntityFrameworkCore; +using Microsoft.EntityFrameworkCore.Infrastructure; +using Microsoft.EntityFrameworkCore.Migrations; +using Microsoft.EntityFrameworkCore.Storage.ValueConversion; +using Npgsql.EntityFrameworkCore.PostgreSQL.Metadata; + +namespace InternshipSystem.Repository.Migrations +{ + [DbContext(typeof(InternshipDbContext))] + [Migration("20201010133258_Hours")] + partial class Hours + { + 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("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("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"); + + b.Property("Type") + .HasColumnName("type") + .HasColumnType("integer"); + + b.HasKey("Id") + .HasName("pk_document"); + + b.HasIndex("InternshipId") + .HasName("ix_document_internship_id"); + + b.HasIndex("InternshipId1") + .HasName("ix_document_internship_id1"); + + b.ToTable("document"); + }); + + 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("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("Approvals") + .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.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 + } + } +} diff --git a/src/InternshipSystem.Repository/Migrations/20201010133258_Hours.cs b/src/InternshipSystem.Repository/Migrations/20201010133258_Hours.cs new file mode 100644 index 0000000..5c22ace --- /dev/null +++ b/src/InternshipSystem.Repository/Migrations/20201010133258_Hours.cs @@ -0,0 +1,17 @@ +using Microsoft.EntityFrameworkCore.Migrations; + +namespace InternshipSystem.Repository.Migrations +{ + public partial class Hours : Migration + { + protected override void Up(MigrationBuilder migrationBuilder) + { + + } + + protected override void Down(MigrationBuilder migrationBuilder) + { + + } + } +} diff --git a/test/InternshipSystem.Api.Test/InternshipSystem.cs b/test/InternshipSystem.Api.Test/InternshipSystem.cs index e6b0db7..8801e35 100644 --- a/test/InternshipSystem.Api.Test/InternshipSystem.cs +++ b/test/InternshipSystem.Api.Test/InternshipSystem.cs @@ -77,7 +77,8 @@ namespace InternshipSystem.Api.Test var company = Company.CreateCompany("a", "b"); var internship = db.Editions.First(); - + + var list = new List {null}.Select(form => form.Company).ToList(); db.Companies.Add(company); -- 2.45.2