From 9803c50681757c460912399f55d79121dddd2f58 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=A2=D0=B0=D1=82=D1=8C=D1=8F=D0=BD=D0=B0=20=D0=90=D1=80?= =?UTF-8?q?=D1=82=D0=B0=D0=BC=D0=BE=D0=BD=D0=BE=D0=B2=D0=B0?= Date: Mon, 4 Nov 2024 22:26:40 +0400 Subject: [PATCH] =?UTF-8?q?=D0=91=D0=94,=20=D0=BA=D0=BE=D0=BD=D1=82=D1=80?= =?UTF-8?q?=D0=B0=D0=BA=D1=82=D1=8B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../CandidateReviewDatabase.cs | 24 ++ .../CandidateReviewDatabaseImplement.csproj | 24 ++ .../Implements/UserStorage.cs | 12 + .../20241104182335_InitialCreate.Designer.cs | 401 ++++++++++++++++++ .../20241104182335_InitialCreate.cs | 260 ++++++++++++ .../CandidateReviewDatabaseModelSnapshot.cs | 398 +++++++++++++++++ .../Models/Assessment.cs | 116 +++++ .../Models/AssessmentCriterion.cs | 17 + .../Models/Company.cs | 82 ++++ .../Models/Criterion.cs | 71 ++++ .../Models/Resume.cs | 104 +++++ .../Models/User.cs | 106 +++++ .../Models/Vacancy.cs | 109 +++++ .../BindingModels/AssessmentBindingModel.cs | 20 + .../BindingModels/CompanyBindingModel.cs | 19 + .../BindingModels/CriterionBindingModel.cs | 18 + .../BindingModels/MailConfigBindingModel.cs | 12 + .../BindingModels/MailSendInfoBindingModel.cs | 9 + .../BindingModels/ReportBindingModel.cs | 9 + .../BindingModels/ResumeBindingModel.cs | 28 ++ .../BindingModels/UserBindingModel.cs | 28 ++ .../BindingModels/VacancyBindingModel.cs | 30 ++ .../IAssessmentLogic.cs | 15 + .../BusinessLogicsContracts/ICompanyLogic.cs | 15 + .../ICriterionLogic.cs | 15 + .../BusinessLogicsContracts/IReportLogic.cs | 32 ++ .../BusinessLogicsContracts/IResumeLogic.cs | 15 + .../BusinessLogicsContracts/IUserLogic.cs | 15 + .../BusinessLogicsContracts/IVacancyLogic.cs | 15 + .../CandidateReviewContracts.csproj | 4 + .../SearchModels/AssessmentSearchModel.cs | 11 + .../SearchModels/CompanySearchModel.cs | 9 + .../SearchModels/CriterionSearchModel.cs | 9 + .../SearchModels/ResumeSearchModel.cs | 15 + .../SearchModels/UserSearchModel.cs | 15 + .../SearchModels/VacancySearchModel.cs | 15 + .../StoragesContracts/IAssessmentStorage.cs | 16 + .../StoragesContracts/ICompanyStorage.cs | 16 + .../StoragesContracts/ICriterionStorage.cs | 16 + .../StoragesContracts/IResumeStorage.cs | 16 + .../StoragesContracts/IUserStorage.cs | 16 + .../StoragesContracts/IVacancyStorage.cs | 16 + .../ViewModels/AssessmentViewModel.cs | 19 + .../ViewModels/CompanyViewModel.cs | 19 + .../ViewModels/CriterionViewModel.cs | 18 + .../ViewModels/ResumeViewModel.cs | 28 ++ .../ViewModels/UserViewModel.cs | 28 ++ .../ViewModels/VacancyViewModel.cs | 30 ++ ...sproj => CandidateReviewDataModels.csproj} | 0 .../Enums/CriterionTypeEnum.cs | 2 +- CourseWorkDataModels/Enums/JobTypeEnum.cs | 2 +- .../Enums/ResumeStatusEnum.cs | 2 +- CourseWorkDataModels/Enums/RoleEnum.cs | 2 +- .../Enums/VacancyStatusEnum.cs | 2 +- CourseWorkDataModels/IId.cs | 2 +- .../Models/IAssessmentModel.cs | 2 +- CourseWorkDataModels/Models/ICompanyModel.cs | 2 +- .../Models/ICriterionModel.cs | 4 +- CourseWorkDataModels/Models/IResumeModel.cs | 4 +- CourseWorkDataModels/Models/IUserModel.cs | 4 +- CourseWorkDataModels/Models/IVacancyModel.cs | 4 +- CourseWork_KPO/CandidateReview.csproj | 21 + CourseWork_KPO/CandidateReview.sln | 43 ++ CourseWork_KPO/Class1.cs | 2 +- CourseWork_KPO/CourseWork_KPO.sln | 31 -- 65 files changed, 2416 insertions(+), 48 deletions(-) create mode 100644 CandidateReviewDatabaseImplement/CandidateReviewDatabase.cs create mode 100644 CandidateReviewDatabaseImplement/CandidateReviewDatabaseImplement.csproj create mode 100644 CandidateReviewDatabaseImplement/Implements/UserStorage.cs create mode 100644 CandidateReviewDatabaseImplement/Migrations/20241104182335_InitialCreate.Designer.cs create mode 100644 CandidateReviewDatabaseImplement/Migrations/20241104182335_InitialCreate.cs create mode 100644 CandidateReviewDatabaseImplement/Migrations/CandidateReviewDatabaseModelSnapshot.cs create mode 100644 CandidateReviewDatabaseImplement/Models/Assessment.cs create mode 100644 CandidateReviewDatabaseImplement/Models/AssessmentCriterion.cs create mode 100644 CandidateReviewDatabaseImplement/Models/Company.cs create mode 100644 CandidateReviewDatabaseImplement/Models/Criterion.cs create mode 100644 CandidateReviewDatabaseImplement/Models/Resume.cs create mode 100644 CandidateReviewDatabaseImplement/Models/User.cs create mode 100644 CandidateReviewDatabaseImplement/Models/Vacancy.cs create mode 100644 CourseWorkContracts/BindingModels/AssessmentBindingModel.cs create mode 100644 CourseWorkContracts/BindingModels/CompanyBindingModel.cs create mode 100644 CourseWorkContracts/BindingModels/CriterionBindingModel.cs create mode 100644 CourseWorkContracts/BindingModels/MailConfigBindingModel.cs create mode 100644 CourseWorkContracts/BindingModels/MailSendInfoBindingModel.cs create mode 100644 CourseWorkContracts/BindingModels/ReportBindingModel.cs create mode 100644 CourseWorkContracts/BindingModels/ResumeBindingModel.cs create mode 100644 CourseWorkContracts/BindingModels/UserBindingModel.cs create mode 100644 CourseWorkContracts/BindingModels/VacancyBindingModel.cs create mode 100644 CourseWorkContracts/BusinessLogicsContracts/IAssessmentLogic.cs create mode 100644 CourseWorkContracts/BusinessLogicsContracts/ICompanyLogic.cs create mode 100644 CourseWorkContracts/BusinessLogicsContracts/ICriterionLogic.cs create mode 100644 CourseWorkContracts/BusinessLogicsContracts/IReportLogic.cs create mode 100644 CourseWorkContracts/BusinessLogicsContracts/IResumeLogic.cs create mode 100644 CourseWorkContracts/BusinessLogicsContracts/IUserLogic.cs create mode 100644 CourseWorkContracts/BusinessLogicsContracts/IVacancyLogic.cs rename CourseWork_KPO/CourseWork_KPO.csproj => CourseWorkContracts/CandidateReviewContracts.csproj (63%) create mode 100644 CourseWorkContracts/SearchModels/AssessmentSearchModel.cs create mode 100644 CourseWorkContracts/SearchModels/CompanySearchModel.cs create mode 100644 CourseWorkContracts/SearchModels/CriterionSearchModel.cs create mode 100644 CourseWorkContracts/SearchModels/ResumeSearchModel.cs create mode 100644 CourseWorkContracts/SearchModels/UserSearchModel.cs create mode 100644 CourseWorkContracts/SearchModels/VacancySearchModel.cs create mode 100644 CourseWorkContracts/StoragesContracts/IAssessmentStorage.cs create mode 100644 CourseWorkContracts/StoragesContracts/ICompanyStorage.cs create mode 100644 CourseWorkContracts/StoragesContracts/ICriterionStorage.cs create mode 100644 CourseWorkContracts/StoragesContracts/IResumeStorage.cs create mode 100644 CourseWorkContracts/StoragesContracts/IUserStorage.cs create mode 100644 CourseWorkContracts/StoragesContracts/IVacancyStorage.cs create mode 100644 CourseWorkContracts/ViewModels/AssessmentViewModel.cs create mode 100644 CourseWorkContracts/ViewModels/CompanyViewModel.cs create mode 100644 CourseWorkContracts/ViewModels/CriterionViewModel.cs create mode 100644 CourseWorkContracts/ViewModels/ResumeViewModel.cs create mode 100644 CourseWorkContracts/ViewModels/UserViewModel.cs create mode 100644 CourseWorkContracts/ViewModels/VacancyViewModel.cs rename CourseWorkDataModels/{CourseWorkDataModels.csproj => CandidateReviewDataModels.csproj} (100%) create mode 100644 CourseWork_KPO/CandidateReview.csproj create mode 100644 CourseWork_KPO/CandidateReview.sln delete mode 100644 CourseWork_KPO/CourseWork_KPO.sln diff --git a/CandidateReviewDatabaseImplement/CandidateReviewDatabase.cs b/CandidateReviewDatabaseImplement/CandidateReviewDatabase.cs new file mode 100644 index 0000000..8e4d231 --- /dev/null +++ b/CandidateReviewDatabaseImplement/CandidateReviewDatabase.cs @@ -0,0 +1,24 @@ +using CandidateReviewDatabaseImplement.Models; +using Microsoft.EntityFrameworkCore; + +namespace CandidateReviewDatabaseImplement +{ + public class CandidateReviewDatabase : DbContext + { + protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder) + { + if (optionsBuilder.IsConfigured == false) + { + optionsBuilder.UseNpgsql("Host=localhost;Port=5432;Database=CandidateReviewDatabase;Username=postgres;Password=12345"); + } + base.OnConfiguring(optionsBuilder); + } + public virtual DbSet Users { set; get; } + public virtual DbSet Companies { set; get; } + public virtual DbSet Vacancies { set; get; } + public virtual DbSet Resumes { set; get; } + public virtual DbSet Assessments { set; get; } + public virtual DbSet Criterions { set; get; } + public virtual DbSet AssessmentCriterions { set; get; } + } +} diff --git a/CandidateReviewDatabaseImplement/CandidateReviewDatabaseImplement.csproj b/CandidateReviewDatabaseImplement/CandidateReviewDatabaseImplement.csproj new file mode 100644 index 0000000..f82f4bf --- /dev/null +++ b/CandidateReviewDatabaseImplement/CandidateReviewDatabaseImplement.csproj @@ -0,0 +1,24 @@ + + + + net8.0 + enable + enable + + + + + + + all + runtime; build; native; contentfiles; analyzers; buildtransitive + + + + + + + + + + diff --git a/CandidateReviewDatabaseImplement/Implements/UserStorage.cs b/CandidateReviewDatabaseImplement/Implements/UserStorage.cs new file mode 100644 index 0000000..168b88b --- /dev/null +++ b/CandidateReviewDatabaseImplement/Implements/UserStorage.cs @@ -0,0 +1,12 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace CandidateReviewDatabaseImplement.Implements +{ + internal class UserStorage + { + } +} diff --git a/CandidateReviewDatabaseImplement/Migrations/20241104182335_InitialCreate.Designer.cs b/CandidateReviewDatabaseImplement/Migrations/20241104182335_InitialCreate.Designer.cs new file mode 100644 index 0000000..dace8f6 --- /dev/null +++ b/CandidateReviewDatabaseImplement/Migrations/20241104182335_InitialCreate.Designer.cs @@ -0,0 +1,401 @@ +// +using System; +using CandidateReviewDatabaseImplement; +using Microsoft.EntityFrameworkCore; +using Microsoft.EntityFrameworkCore.Infrastructure; +using Microsoft.EntityFrameworkCore.Migrations; +using Microsoft.EntityFrameworkCore.Storage.ValueConversion; +using Npgsql.EntityFrameworkCore.PostgreSQL.Metadata; + +#nullable disable + +namespace CandidateReviewDatabaseImplement.Migrations +{ + [DbContext(typeof(CandidateReviewDatabase))] + [Migration("20241104182335_InitialCreate")] + partial class InitialCreate + { + /// + protected override void BuildTargetModel(ModelBuilder modelBuilder) + { +#pragma warning disable 612, 618 + modelBuilder + .HasAnnotation("ProductVersion", "8.0.10") + .HasAnnotation("Relational:MaxIdentifierLength", 63); + + NpgsqlModelBuilderExtensions.UseIdentityByDefaultColumns(modelBuilder); + + modelBuilder.Entity("CandidateReviewDatabaseImplement.Models.Assessment", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("Comment") + .HasColumnType("text"); + + b.Property("CreatedAt") + .HasColumnType("timestamp with time zone"); + + b.Property("Rating") + .HasColumnType("integer"); + + b.Property("ResumeId") + .HasColumnType("integer"); + + b.Property("UserId") + .HasColumnType("integer"); + + b.HasKey("Id"); + + b.HasIndex("UserId"); + + b.ToTable("Assessments"); + }); + + modelBuilder.Entity("CandidateReviewDatabaseImplement.Models.AssessmentCriterion", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("AssessmentId") + .HasColumnType("integer"); + + b.Property("CriterionId") + .HasColumnType("integer"); + + b.Property("Value") + .HasColumnType("integer"); + + b.HasKey("Id"); + + b.HasIndex("AssessmentId"); + + b.HasIndex("CriterionId"); + + b.ToTable("AssessmentCriterions"); + }); + + modelBuilder.Entity("CandidateReviewDatabaseImplement.Models.Company", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("Address") + .HasColumnType("text"); + + b.Property("Contacts") + .HasColumnType("text"); + + b.Property("Description") + .HasColumnType("text"); + + b.Property("Name") + .IsRequired() + .HasColumnType("text"); + + b.Property("Website") + .HasColumnType("text"); + + b.HasKey("Id"); + + b.ToTable("Companies"); + }); + + modelBuilder.Entity("CandidateReviewDatabaseImplement.Models.Criterion", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("Description") + .HasColumnType("text"); + + b.Property("Name") + .IsRequired() + .HasColumnType("text"); + + b.Property("Type") + .HasColumnType("integer"); + + b.Property("Weight") + .HasColumnType("integer"); + + b.HasKey("Id"); + + b.ToTable("Criterions"); + }); + + modelBuilder.Entity("CandidateReviewDatabaseImplement.Models.Resume", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("Description") + .HasColumnType("text"); + + b.Property("Education") + .IsRequired() + .HasColumnType("text"); + + b.Property("Experience") + .IsRequired() + .HasColumnType("text"); + + b.Property("PhotoFilePath") + .HasColumnType("text"); + + b.Property("ResumeId") + .HasColumnType("integer"); + + b.Property("Skills") + .IsRequired() + .HasColumnType("text"); + + b.Property("Status") + .HasColumnType("integer"); + + b.Property("Title") + .IsRequired() + .HasColumnType("text"); + + b.Property("UserId") + .HasColumnType("integer"); + + b.Property("VacancyId") + .HasColumnType("integer"); + + b.HasKey("Id"); + + b.HasIndex("ResumeId") + .IsUnique(); + + b.HasIndex("UserId"); + + b.HasIndex("VacancyId"); + + b.ToTable("Resumes"); + }); + + modelBuilder.Entity("CandidateReviewDatabaseImplement.Models.User", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("CompanyId") + .IsRequired() + .HasColumnType("integer"); + + b.Property("Email") + .IsRequired() + .HasColumnType("text"); + + b.Property("EmailConfirmed") + .HasColumnType("boolean"); + + b.Property("LastName") + .HasColumnType("text"); + + b.Property("Name") + .IsRequired() + .HasColumnType("text"); + + b.Property("Password") + .IsRequired() + .HasColumnType("text"); + + b.Property("PhoneNumber") + .HasColumnType("text"); + + b.Property("Role") + .HasColumnType("integer"); + + b.Property("Surname") + .IsRequired() + .HasColumnType("text"); + + b.HasKey("Id"); + + b.HasIndex("CompanyId"); + + b.ToTable("Users"); + }); + + modelBuilder.Entity("CandidateReviewDatabaseImplement.Models.Vacancy", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("CompanyId") + .HasColumnType("integer"); + + b.Property("CreatedAt") + .HasColumnType("timestamp with time zone"); + + b.Property("Description") + .HasColumnType("text"); + + b.Property("JobTitle") + .IsRequired() + .HasColumnType("text"); + + b.Property("JobType") + .HasColumnType("integer"); + + b.Property("Requirements") + .IsRequired() + .HasColumnType("text"); + + b.Property("Responsibilities") + .IsRequired() + .HasColumnType("text"); + + b.Property("Salary") + .HasColumnType("text"); + + b.Property("Status") + .HasColumnType("integer"); + + b.Property("Tags") + .HasColumnType("text"); + + b.HasKey("Id"); + + b.HasIndex("CompanyId"); + + b.ToTable("Vacancies"); + }); + + modelBuilder.Entity("CandidateReviewDatabaseImplement.Models.Assessment", b => + { + b.HasOne("CandidateReviewDatabaseImplement.Models.User", "User") + .WithMany("Assessments") + .HasForeignKey("UserId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("User"); + }); + + modelBuilder.Entity("CandidateReviewDatabaseImplement.Models.AssessmentCriterion", b => + { + b.HasOne("CandidateReviewDatabaseImplement.Models.Assessment", "Assessment") + .WithMany("Criterions") + .HasForeignKey("AssessmentId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("CandidateReviewDatabaseImplement.Models.Criterion", "Criterion") + .WithMany("AssessmentCriterions") + .HasForeignKey("CriterionId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Assessment"); + + b.Navigation("Criterion"); + }); + + modelBuilder.Entity("CandidateReviewDatabaseImplement.Models.Resume", b => + { + b.HasOne("CandidateReviewDatabaseImplement.Models.Assessment", "Assessment") + .WithOne("Resume") + .HasForeignKey("CandidateReviewDatabaseImplement.Models.Resume", "ResumeId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("CandidateReviewDatabaseImplement.Models.User", "User") + .WithMany("Resumes") + .HasForeignKey("UserId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("CandidateReviewDatabaseImplement.Models.Vacancy", "Vacancy") + .WithMany("Resumes") + .HasForeignKey("VacancyId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Assessment"); + + b.Navigation("User"); + + b.Navigation("Vacancy"); + }); + + modelBuilder.Entity("CandidateReviewDatabaseImplement.Models.User", b => + { + b.HasOne("CandidateReviewDatabaseImplement.Models.Company", "Company") + .WithMany("Users") + .HasForeignKey("CompanyId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Company"); + }); + + modelBuilder.Entity("CandidateReviewDatabaseImplement.Models.Vacancy", b => + { + b.HasOne("CandidateReviewDatabaseImplement.Models.Company", "Company") + .WithMany("Vacancies") + .HasForeignKey("CompanyId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Company"); + }); + + modelBuilder.Entity("CandidateReviewDatabaseImplement.Models.Assessment", b => + { + b.Navigation("Criterions"); + + b.Navigation("Resume") + .IsRequired(); + }); + + modelBuilder.Entity("CandidateReviewDatabaseImplement.Models.Company", b => + { + b.Navigation("Users"); + + b.Navigation("Vacancies"); + }); + + modelBuilder.Entity("CandidateReviewDatabaseImplement.Models.Criterion", b => + { + b.Navigation("AssessmentCriterions"); + }); + + modelBuilder.Entity("CandidateReviewDatabaseImplement.Models.User", b => + { + b.Navigation("Assessments"); + + b.Navigation("Resumes"); + }); + + modelBuilder.Entity("CandidateReviewDatabaseImplement.Models.Vacancy", b => + { + b.Navigation("Resumes"); + }); +#pragma warning restore 612, 618 + } + } +} diff --git a/CandidateReviewDatabaseImplement/Migrations/20241104182335_InitialCreate.cs b/CandidateReviewDatabaseImplement/Migrations/20241104182335_InitialCreate.cs new file mode 100644 index 0000000..db76b78 --- /dev/null +++ b/CandidateReviewDatabaseImplement/Migrations/20241104182335_InitialCreate.cs @@ -0,0 +1,260 @@ +using System; +using Microsoft.EntityFrameworkCore.Migrations; +using Npgsql.EntityFrameworkCore.PostgreSQL.Metadata; + +#nullable disable + +namespace CandidateReviewDatabaseImplement.Migrations +{ + /// + public partial class InitialCreate : Migration + { + /// + protected override void Up(MigrationBuilder migrationBuilder) + { + migrationBuilder.CreateTable( + name: "Companies", + columns: table => new + { + Id = table.Column(type: "integer", nullable: false) + .Annotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.IdentityByDefaultColumn), + Name = table.Column(type: "text", nullable: false), + Description = table.Column(type: "text", nullable: true), + Website = table.Column(type: "text", nullable: true), + Address = table.Column(type: "text", nullable: true), + Contacts = table.Column(type: "text", nullable: true) + }, + constraints: table => + { + table.PrimaryKey("PK_Companies", x => x.Id); + }); + + migrationBuilder.CreateTable( + name: "Criterions", + columns: table => new + { + Id = table.Column(type: "integer", nullable: false) + .Annotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.IdentityByDefaultColumn), + Name = table.Column(type: "text", nullable: false), + Type = table.Column(type: "integer", nullable: false), + Description = table.Column(type: "text", nullable: true), + Weight = table.Column(type: "integer", nullable: false) + }, + constraints: table => + { + table.PrimaryKey("PK_Criterions", x => x.Id); + }); + + migrationBuilder.CreateTable( + name: "Users", + columns: table => new + { + Id = table.Column(type: "integer", nullable: false) + .Annotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.IdentityByDefaultColumn), + CompanyId = table.Column(type: "integer", nullable: false), + Surname = table.Column(type: "text", nullable: false), + Name = table.Column(type: "text", nullable: false), + LastName = table.Column(type: "text", nullable: true), + Email = table.Column(type: "text", nullable: false), + Password = table.Column(type: "text", nullable: false), + PhoneNumber = table.Column(type: "text", nullable: true), + EmailConfirmed = table.Column(type: "boolean", nullable: false), + Role = table.Column(type: "integer", nullable: false) + }, + constraints: table => + { + table.PrimaryKey("PK_Users", x => x.Id); + table.ForeignKey( + name: "FK_Users_Companies_CompanyId", + column: x => x.CompanyId, + principalTable: "Companies", + principalColumn: "Id", + onDelete: ReferentialAction.Cascade); + }); + + migrationBuilder.CreateTable( + name: "Vacancies", + columns: table => new + { + Id = table.Column(type: "integer", nullable: false) + .Annotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.IdentityByDefaultColumn), + CompanyId = table.Column(type: "integer", nullable: false), + JobTitle = table.Column(type: "text", nullable: false), + Requirements = table.Column(type: "text", nullable: false), + Responsibilities = table.Column(type: "text", nullable: false), + JobType = table.Column(type: "integer", nullable: false), + Salary = table.Column(type: "text", nullable: true), + Description = table.Column(type: "text", nullable: true), + Status = table.Column(type: "integer", nullable: false), + CreatedAt = table.Column(type: "timestamp with time zone", nullable: false), + Tags = table.Column(type: "text", nullable: true) + }, + constraints: table => + { + table.PrimaryKey("PK_Vacancies", x => x.Id); + table.ForeignKey( + name: "FK_Vacancies_Companies_CompanyId", + column: x => x.CompanyId, + principalTable: "Companies", + principalColumn: "Id", + onDelete: ReferentialAction.Cascade); + }); + + migrationBuilder.CreateTable( + name: "Assessments", + columns: table => new + { + Id = table.Column(type: "integer", nullable: false) + .Annotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.IdentityByDefaultColumn), + ResumeId = table.Column(type: "integer", nullable: false), + UserId = table.Column(type: "integer", nullable: false), + Rating = table.Column(type: "integer", nullable: true), + CreatedAt = table.Column(type: "timestamp with time zone", nullable: false), + Comment = table.Column(type: "text", nullable: true) + }, + constraints: table => + { + table.PrimaryKey("PK_Assessments", x => x.Id); + table.ForeignKey( + name: "FK_Assessments_Users_UserId", + column: x => x.UserId, + principalTable: "Users", + principalColumn: "Id", + onDelete: ReferentialAction.Cascade); + }); + + migrationBuilder.CreateTable( + name: "AssessmentCriterions", + columns: table => new + { + Id = table.Column(type: "integer", nullable: false) + .Annotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.IdentityByDefaultColumn), + AssessmentId = table.Column(type: "integer", nullable: false), + CriterionId = table.Column(type: "integer", nullable: false), + Value = table.Column(type: "integer", nullable: false) + }, + constraints: table => + { + table.PrimaryKey("PK_AssessmentCriterions", x => x.Id); + table.ForeignKey( + name: "FK_AssessmentCriterions_Assessments_AssessmentId", + column: x => x.AssessmentId, + principalTable: "Assessments", + principalColumn: "Id", + onDelete: ReferentialAction.Cascade); + table.ForeignKey( + name: "FK_AssessmentCriterions_Criterions_CriterionId", + column: x => x.CriterionId, + principalTable: "Criterions", + principalColumn: "Id", + onDelete: ReferentialAction.Cascade); + }); + + migrationBuilder.CreateTable( + name: "Resumes", + columns: table => new + { + Id = table.Column(type: "integer", nullable: false) + .Annotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.IdentityByDefaultColumn), + VacancyId = table.Column(type: "integer", nullable: false), + UserId = table.Column(type: "integer", nullable: false), + Title = table.Column(type: "text", nullable: false), + Experience = table.Column(type: "text", nullable: false), + Education = table.Column(type: "text", nullable: false), + PhotoFilePath = table.Column(type: "text", nullable: true), + Description = table.Column(type: "text", nullable: true), + Skills = table.Column(type: "text", nullable: false), + Status = table.Column(type: "integer", nullable: false), + ResumeId = table.Column(type: "integer", nullable: false) + }, + constraints: table => + { + table.PrimaryKey("PK_Resumes", x => x.Id); + table.ForeignKey( + name: "FK_Resumes_Assessments_ResumeId", + column: x => x.ResumeId, + principalTable: "Assessments", + principalColumn: "Id", + onDelete: ReferentialAction.Cascade); + table.ForeignKey( + name: "FK_Resumes_Users_UserId", + column: x => x.UserId, + principalTable: "Users", + principalColumn: "Id", + onDelete: ReferentialAction.Cascade); + table.ForeignKey( + name: "FK_Resumes_Vacancies_VacancyId", + column: x => x.VacancyId, + principalTable: "Vacancies", + principalColumn: "Id", + onDelete: ReferentialAction.Cascade); + }); + + migrationBuilder.CreateIndex( + name: "IX_AssessmentCriterions_AssessmentId", + table: "AssessmentCriterions", + column: "AssessmentId"); + + migrationBuilder.CreateIndex( + name: "IX_AssessmentCriterions_CriterionId", + table: "AssessmentCriterions", + column: "CriterionId"); + + migrationBuilder.CreateIndex( + name: "IX_Assessments_UserId", + table: "Assessments", + column: "UserId"); + + migrationBuilder.CreateIndex( + name: "IX_Resumes_ResumeId", + table: "Resumes", + column: "ResumeId", + unique: true); + + migrationBuilder.CreateIndex( + name: "IX_Resumes_UserId", + table: "Resumes", + column: "UserId"); + + migrationBuilder.CreateIndex( + name: "IX_Resumes_VacancyId", + table: "Resumes", + column: "VacancyId"); + + migrationBuilder.CreateIndex( + name: "IX_Users_CompanyId", + table: "Users", + column: "CompanyId"); + + migrationBuilder.CreateIndex( + name: "IX_Vacancies_CompanyId", + table: "Vacancies", + column: "CompanyId"); + } + + /// + protected override void Down(MigrationBuilder migrationBuilder) + { + migrationBuilder.DropTable( + name: "AssessmentCriterions"); + + migrationBuilder.DropTable( + name: "Resumes"); + + migrationBuilder.DropTable( + name: "Criterions"); + + migrationBuilder.DropTable( + name: "Assessments"); + + migrationBuilder.DropTable( + name: "Vacancies"); + + migrationBuilder.DropTable( + name: "Users"); + + migrationBuilder.DropTable( + name: "Companies"); + } + } +} diff --git a/CandidateReviewDatabaseImplement/Migrations/CandidateReviewDatabaseModelSnapshot.cs b/CandidateReviewDatabaseImplement/Migrations/CandidateReviewDatabaseModelSnapshot.cs new file mode 100644 index 0000000..5d7adb9 --- /dev/null +++ b/CandidateReviewDatabaseImplement/Migrations/CandidateReviewDatabaseModelSnapshot.cs @@ -0,0 +1,398 @@ +// +using System; +using CandidateReviewDatabaseImplement; +using Microsoft.EntityFrameworkCore; +using Microsoft.EntityFrameworkCore.Infrastructure; +using Microsoft.EntityFrameworkCore.Storage.ValueConversion; +using Npgsql.EntityFrameworkCore.PostgreSQL.Metadata; + +#nullable disable + +namespace CandidateReviewDatabaseImplement.Migrations +{ + [DbContext(typeof(CandidateReviewDatabase))] + partial class CandidateReviewDatabaseModelSnapshot : ModelSnapshot + { + protected override void BuildModel(ModelBuilder modelBuilder) + { +#pragma warning disable 612, 618 + modelBuilder + .HasAnnotation("ProductVersion", "8.0.10") + .HasAnnotation("Relational:MaxIdentifierLength", 63); + + NpgsqlModelBuilderExtensions.UseIdentityByDefaultColumns(modelBuilder); + + modelBuilder.Entity("CandidateReviewDatabaseImplement.Models.Assessment", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("Comment") + .HasColumnType("text"); + + b.Property("CreatedAt") + .HasColumnType("timestamp with time zone"); + + b.Property("Rating") + .HasColumnType("integer"); + + b.Property("ResumeId") + .HasColumnType("integer"); + + b.Property("UserId") + .HasColumnType("integer"); + + b.HasKey("Id"); + + b.HasIndex("UserId"); + + b.ToTable("Assessments"); + }); + + modelBuilder.Entity("CandidateReviewDatabaseImplement.Models.AssessmentCriterion", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("AssessmentId") + .HasColumnType("integer"); + + b.Property("CriterionId") + .HasColumnType("integer"); + + b.Property("Value") + .HasColumnType("integer"); + + b.HasKey("Id"); + + b.HasIndex("AssessmentId"); + + b.HasIndex("CriterionId"); + + b.ToTable("AssessmentCriterions"); + }); + + modelBuilder.Entity("CandidateReviewDatabaseImplement.Models.Company", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("Address") + .HasColumnType("text"); + + b.Property("Contacts") + .HasColumnType("text"); + + b.Property("Description") + .HasColumnType("text"); + + b.Property("Name") + .IsRequired() + .HasColumnType("text"); + + b.Property("Website") + .HasColumnType("text"); + + b.HasKey("Id"); + + b.ToTable("Companies"); + }); + + modelBuilder.Entity("CandidateReviewDatabaseImplement.Models.Criterion", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("Description") + .HasColumnType("text"); + + b.Property("Name") + .IsRequired() + .HasColumnType("text"); + + b.Property("Type") + .HasColumnType("integer"); + + b.Property("Weight") + .HasColumnType("integer"); + + b.HasKey("Id"); + + b.ToTable("Criterions"); + }); + + modelBuilder.Entity("CandidateReviewDatabaseImplement.Models.Resume", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("Description") + .HasColumnType("text"); + + b.Property("Education") + .IsRequired() + .HasColumnType("text"); + + b.Property("Experience") + .IsRequired() + .HasColumnType("text"); + + b.Property("PhotoFilePath") + .HasColumnType("text"); + + b.Property("ResumeId") + .HasColumnType("integer"); + + b.Property("Skills") + .IsRequired() + .HasColumnType("text"); + + b.Property("Status") + .HasColumnType("integer"); + + b.Property("Title") + .IsRequired() + .HasColumnType("text"); + + b.Property("UserId") + .HasColumnType("integer"); + + b.Property("VacancyId") + .HasColumnType("integer"); + + b.HasKey("Id"); + + b.HasIndex("ResumeId") + .IsUnique(); + + b.HasIndex("UserId"); + + b.HasIndex("VacancyId"); + + b.ToTable("Resumes"); + }); + + modelBuilder.Entity("CandidateReviewDatabaseImplement.Models.User", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("CompanyId") + .IsRequired() + .HasColumnType("integer"); + + b.Property("Email") + .IsRequired() + .HasColumnType("text"); + + b.Property("EmailConfirmed") + .HasColumnType("boolean"); + + b.Property("LastName") + .HasColumnType("text"); + + b.Property("Name") + .IsRequired() + .HasColumnType("text"); + + b.Property("Password") + .IsRequired() + .HasColumnType("text"); + + b.Property("PhoneNumber") + .HasColumnType("text"); + + b.Property("Role") + .HasColumnType("integer"); + + b.Property("Surname") + .IsRequired() + .HasColumnType("text"); + + b.HasKey("Id"); + + b.HasIndex("CompanyId"); + + b.ToTable("Users"); + }); + + modelBuilder.Entity("CandidateReviewDatabaseImplement.Models.Vacancy", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("CompanyId") + .HasColumnType("integer"); + + b.Property("CreatedAt") + .HasColumnType("timestamp with time zone"); + + b.Property("Description") + .HasColumnType("text"); + + b.Property("JobTitle") + .IsRequired() + .HasColumnType("text"); + + b.Property("JobType") + .HasColumnType("integer"); + + b.Property("Requirements") + .IsRequired() + .HasColumnType("text"); + + b.Property("Responsibilities") + .IsRequired() + .HasColumnType("text"); + + b.Property("Salary") + .HasColumnType("text"); + + b.Property("Status") + .HasColumnType("integer"); + + b.Property("Tags") + .HasColumnType("text"); + + b.HasKey("Id"); + + b.HasIndex("CompanyId"); + + b.ToTable("Vacancies"); + }); + + modelBuilder.Entity("CandidateReviewDatabaseImplement.Models.Assessment", b => + { + b.HasOne("CandidateReviewDatabaseImplement.Models.User", "User") + .WithMany("Assessments") + .HasForeignKey("UserId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("User"); + }); + + modelBuilder.Entity("CandidateReviewDatabaseImplement.Models.AssessmentCriterion", b => + { + b.HasOne("CandidateReviewDatabaseImplement.Models.Assessment", "Assessment") + .WithMany("Criterions") + .HasForeignKey("AssessmentId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("CandidateReviewDatabaseImplement.Models.Criterion", "Criterion") + .WithMany("AssessmentCriterions") + .HasForeignKey("CriterionId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Assessment"); + + b.Navigation("Criterion"); + }); + + modelBuilder.Entity("CandidateReviewDatabaseImplement.Models.Resume", b => + { + b.HasOne("CandidateReviewDatabaseImplement.Models.Assessment", "Assessment") + .WithOne("Resume") + .HasForeignKey("CandidateReviewDatabaseImplement.Models.Resume", "ResumeId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("CandidateReviewDatabaseImplement.Models.User", "User") + .WithMany("Resumes") + .HasForeignKey("UserId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("CandidateReviewDatabaseImplement.Models.Vacancy", "Vacancy") + .WithMany("Resumes") + .HasForeignKey("VacancyId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Assessment"); + + b.Navigation("User"); + + b.Navigation("Vacancy"); + }); + + modelBuilder.Entity("CandidateReviewDatabaseImplement.Models.User", b => + { + b.HasOne("CandidateReviewDatabaseImplement.Models.Company", "Company") + .WithMany("Users") + .HasForeignKey("CompanyId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Company"); + }); + + modelBuilder.Entity("CandidateReviewDatabaseImplement.Models.Vacancy", b => + { + b.HasOne("CandidateReviewDatabaseImplement.Models.Company", "Company") + .WithMany("Vacancies") + .HasForeignKey("CompanyId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Company"); + }); + + modelBuilder.Entity("CandidateReviewDatabaseImplement.Models.Assessment", b => + { + b.Navigation("Criterions"); + + b.Navigation("Resume") + .IsRequired(); + }); + + modelBuilder.Entity("CandidateReviewDatabaseImplement.Models.Company", b => + { + b.Navigation("Users"); + + b.Navigation("Vacancies"); + }); + + modelBuilder.Entity("CandidateReviewDatabaseImplement.Models.Criterion", b => + { + b.Navigation("AssessmentCriterions"); + }); + + modelBuilder.Entity("CandidateReviewDatabaseImplement.Models.User", b => + { + b.Navigation("Assessments"); + + b.Navigation("Resumes"); + }); + + modelBuilder.Entity("CandidateReviewDatabaseImplement.Models.Vacancy", b => + { + b.Navigation("Resumes"); + }); +#pragma warning restore 612, 618 + } + } +} diff --git a/CandidateReviewDatabaseImplement/Models/Assessment.cs b/CandidateReviewDatabaseImplement/Models/Assessment.cs new file mode 100644 index 0000000..a694911 --- /dev/null +++ b/CandidateReviewDatabaseImplement/Models/Assessment.cs @@ -0,0 +1,116 @@ +using CandidateReviewContracts.BindingModels; +using CandidateReviewContracts.ViewModels; +using CandidateReviewDataModels.Models; +using System.ComponentModel.DataAnnotations; +using System.ComponentModel.DataAnnotations.Schema; + +namespace CandidateReviewDatabaseImplement.Models +{ + public class Assessment : IAssessmentModel + { + [Required] + public int ResumeId { get; set; } + [Required] + public int UserId { get; set; } + + public int? Rating { get; set; } + [Required] + public DateTime CreatedAt { get; set; } + + public string? Comment { get; set; } + + public int Id { get; set; } + public virtual User User { get; set; } + public virtual Resume Resume { get; set; } + + private Dictionary? _assessmentCriterions = null; + + public Dictionary AssessmentCriterions + { + get + { + if (_assessmentCriterions == null) + { + _assessmentCriterions = Criterions + .ToDictionary(recAC => recAC.CriterionId, recAC => + (recAC.Criterion as ICriterionModel, recAC.Value)); + } + return _assessmentCriterions; + } + } + + [ForeignKey("AssessmentId")] + public virtual List Criterions { get; set; } = new(); + + public static Assessment? Create(CandidateReviewDatabase context, AssessmentBindingModel model) + { + if (model == null) + { + return null; + } + return new Assessment() + { + Id = model.Id, + ResumeId = model.ResumeId, + UserId = model.UserId, + Rating = model.Rating, + CreatedAt = model.CreatedAt, + Comment = model.Comment, + Criterions = model.AssessmentCriterions.Select(x => new AssessmentCriterion() + { + Criterion = context.Criterions.First(y => y.Id == x.Key), + Value = x.Value.Item2 + }).ToList() + }; + } + public void Update(AssessmentBindingModel model) + { + if (model == null) + { + return; + } + ResumeId = model.ResumeId; + UserId = model.UserId; + Rating = model.Rating; + CreatedAt = model.CreatedAt; + Comment = model.Comment; + } + public AssessmentViewModel GetViewModel => new() + { + Id = Id, + ResumeId = ResumeId, + UserId = UserId, + Rating = Rating, + CreatedAt = CreatedAt, + Comment = Comment + }; + + public void UpdateCriterions(CandidateReviewDatabase context, AssessmentBindingModel model) + { + var assessmentCriterions = context.AssessmentCriterions.Where(rec => rec.AssessmentId == model.Id).ToList(); + if (assessmentCriterions != null && assessmentCriterions.Count > 0) + { + context.AssessmentCriterions.RemoveRange(assessmentCriterions.Where(rec => !model.AssessmentCriterions.ContainsKey(rec.CriterionId))); + context.SaveChanges(); + foreach (var updateCriterion in assessmentCriterions) + { + updateCriterion.Value = model.AssessmentCriterions[updateCriterion.CriterionId].Item2; + model.AssessmentCriterions.Remove(updateCriterion.CriterionId); + } + context.SaveChanges(); + } + var assessment = context.Assessments.First(x => x.Id == Id); + foreach (var ac in model.AssessmentCriterions) + { + context.AssessmentCriterions.Add(new AssessmentCriterion + { + Assessment = assessment, + Criterion = context.Criterions.First(x => x.Id == ac.Key), + Value = ac.Value.Item2 + }); + context.SaveChanges(); + } + _assessmentCriterions = null; + } + } +} diff --git a/CandidateReviewDatabaseImplement/Models/AssessmentCriterion.cs b/CandidateReviewDatabaseImplement/Models/AssessmentCriterion.cs new file mode 100644 index 0000000..105d3e0 --- /dev/null +++ b/CandidateReviewDatabaseImplement/Models/AssessmentCriterion.cs @@ -0,0 +1,17 @@ +using System.ComponentModel.DataAnnotations; + +namespace CandidateReviewDatabaseImplement.Models +{ + public class AssessmentCriterion + { + public int Id { get; set; } + [Required] + public int AssessmentId { get; set; } + [Required] + public int CriterionId { get; set; } + [Required] + public int Value { get; set; } + public virtual Assessment Assessment { get; set; } = new(); + public virtual Criterion Criterion { get; set; } = new(); + } +} diff --git a/CandidateReviewDatabaseImplement/Models/Company.cs b/CandidateReviewDatabaseImplement/Models/Company.cs new file mode 100644 index 0000000..9e4a040 --- /dev/null +++ b/CandidateReviewDatabaseImplement/Models/Company.cs @@ -0,0 +1,82 @@ +using CandidateReviewContracts.BindingModels; +using CandidateReviewContracts.ViewModels; +using CandidateReviewDataModels.Models; +using System.ComponentModel.DataAnnotations; +using System.ComponentModel.DataAnnotations.Schema; + +namespace CandidateReviewDatabaseImplement.Models +{ + public class Company : ICompanyModel + { + [Required] + public string Name { get; set; } = string.Empty; + + public string? Description { get; set; } + + public string? Website { get; set; } + + public string? Address { get; set; } + + public string? Contacts { get; set; } + + public int Id { get; set; } + + [ForeignKey("CompanyId")] + public virtual List Users { get; set; } = new(); + + [ForeignKey("CompanyId")] + public virtual List Vacancies { get; set; } = new(); + + public static Company? Create(CompanyBindingModel model) + { + if (model == null) + { + return null; + } + return new Company() + { + Id = model.Id, + Name = model.Name, + Description = model.Description, + Website = model.Website, + Address = model.Address, + Contacts = model.Contacts + }; + } + + public static Company Create(CompanyViewModel model) + { + return new Company + { + Id = model.Id, + Name = model.Name, + Description = model.Description, + Website = model.Website, + Address = model.Address, + Contacts = model.Contacts + }; + } + + public void Update(CompanyBindingModel model) + { + if (model == null) + { + return; + } + Name = model.Name; + Description = model.Description; + Website = model.Website; + Address = model.Address; + Contacts = model.Contacts; + } + public CompanyViewModel GetViewModel => new() + { + Id = Id, + Name = Name, + Description = Description, + Website = Website, + Address = Address, + Contacts = Contacts + }; + } +} diff --git a/CandidateReviewDatabaseImplement/Models/Criterion.cs b/CandidateReviewDatabaseImplement/Models/Criterion.cs new file mode 100644 index 0000000..2eeb876 --- /dev/null +++ b/CandidateReviewDatabaseImplement/Models/Criterion.cs @@ -0,0 +1,71 @@ +using CandidateReviewContracts.BindingModels; +using CandidateReviewContracts.ViewModels; +using CandidateReviewDataModels.Enums; +using CandidateReviewDataModels.Models; +using System.ComponentModel.DataAnnotations; +using System.ComponentModel.DataAnnotations.Schema; + +namespace CandidateReviewDatabaseImplement.Models +{ + public class Criterion : ICriterionModel + { + [Required] + public string Name { get; set; } = string.Empty; + [Required] + public CriterionTypeEnum Type { get; set; } + + public string? Description { get; set; } + [Required] + public int Weight { get; set; } + + public int Id { get; set; } + [ForeignKey("CriterionId")] + public virtual List AssessmentCriterions { get; set; } = new(); + + public static Criterion? Create(CriterionBindingModel model) + { + if (model == null) + { + return null; + } + return new Criterion() + { + Id = model.Id, + Name = model.Name, + Type = model.Type, + Description = model.Description, + Weight = model.Weight + }; + } + public static Criterion Create(CriterionViewModel model) + { + return new Criterion + { + Id = model.Id, + Name = model.Name, + Type = model.Type, + Description = model.Description, + Weight = model.Weight + }; + } + public void Update(CriterionBindingModel model) + { + if (model == null) + { + return; + } + Name = model.Name; + Type = model.Type; + Description = model.Description; + Weight = model.Weight; + } + public CriterionViewModel GetViewModel => new() + { + Id = Id, + Name = Name, + Type = Type, + Description = Description, + Weight = Weight + }; + } +} diff --git a/CandidateReviewDatabaseImplement/Models/Resume.cs b/CandidateReviewDatabaseImplement/Models/Resume.cs new file mode 100644 index 0000000..2108a4d --- /dev/null +++ b/CandidateReviewDatabaseImplement/Models/Resume.cs @@ -0,0 +1,104 @@ +using CandidateReviewContracts.BindingModels; +using CandidateReviewContracts.ViewModels; +using CandidateReviewDataModels.Enums; +using CandidateReviewDataModels.Models; +using System.ComponentModel.DataAnnotations; +using System.ComponentModel.DataAnnotations.Schema; + +namespace CandidateReviewDatabaseImplement.Models +{ + public class Resume : IResumeModel + { + [Required] + public int VacancyId { get; set; } + [Required] + public int UserId { get; set; } + [Required] + public string Title { get; set; } = string.Empty; + [Required] + public string Experience { get; set; } = string.Empty; + [Required] + public string Education { get; set; } = string.Empty; + + public string? PhotoFilePath { get; set; } + + public string? Description { get; set; } + [Required] + public string Skills { get; set; } = string.Empty; + [Required] + public ResumeStatusEnum Status { get; set; } + + public int Id { get; set; } + + [ForeignKey("ResumeId")] + public virtual Assessment Assessment { get; set; } = new(); + public virtual Vacancy Vacancy { get; set; } + public virtual User User { get; set; } + + public static Resume? Create(ResumeBindingModel model) + { + if (model == null) + { + return null; + } + return new Resume() + { + Id = model.Id, + VacancyId = model.VacancyId, + UserId = model.UserId, + Title = model.Title, + Experience = model.Experience, + Education = model.Education, + PhotoFilePath = model.PhotoFilePath, + Description = model.Description, + Skills = model.Skills, + Status = model.Status + }; + } + public static Resume Create(ResumeViewModel model) + { + return new Resume + { + Id = model.Id, + VacancyId = model.VacancyId, + UserId = model.UserId, + Title = model.Title, + Experience = model.Experience, + Education = model.Education, + PhotoFilePath = model.PhotoFilePath, + Description = model.Description, + Skills = model.Skills, + Status = model.Status + }; + } + public void Update(ResumeBindingModel model) + { + if (model == null) + { + return; + } + VacancyId = model.VacancyId; + UserId = model.UserId; + Title = model.Title; + Experience = model.Experience; + Education = model.Education; + PhotoFilePath = model.PhotoFilePath; + Description = model.Description; + Skills = model.Skills; + Status = model.Status; + } + public ResumeViewModel GetViewModel => new() + { + Id = Id, + VacancyId = VacancyId, + UserId = UserId, + Title = Title, + Experience = Experience, + Education = Education, + PhotoFilePath = PhotoFilePath, + Description = Description, + Skills = Skills, + Status = Status + }; + } +} diff --git a/CandidateReviewDatabaseImplement/Models/User.cs b/CandidateReviewDatabaseImplement/Models/User.cs new file mode 100644 index 0000000..7602de0 --- /dev/null +++ b/CandidateReviewDatabaseImplement/Models/User.cs @@ -0,0 +1,106 @@ +using CandidateReviewContracts.BindingModels; +using CandidateReviewContracts.ViewModels; +using CandidateReviewDataModels.Enums; +using CandidateReviewDataModels.Models; +using System.ComponentModel.DataAnnotations; +using System.ComponentModel.DataAnnotations.Schema; + +namespace CandidateReviewDatabaseImplement.Models +{ + public class User : IUserModel + { + [Required] + public int? CompanyId { get; set; } + [Required] + public string Surname { get; set; } = string.Empty; + [Required] + public string Name { get; set; } = string.Empty; + + public string? LastName { get; set; } + [Required] + public string Email { get; set; } = string.Empty; + [Required] + public string Password { get; set; } = string.Empty; + + public string? PhoneNumber { get; set; } + [Required] + public bool EmailConfirmed { get; set; } + [Required] + public RoleEnum Role { get; set; } + + public int Id { get; set; } + public virtual Company Company { get; set; } + + [ForeignKey("UserId")] + public virtual List Resumes { get; set; } = new(); + + [ForeignKey("UserId")] + public virtual List Assessments { get; set; } = new(); + + public static User? Create(UserBindingModel model) + { + if (model == null) + { + return null; + } + return new User() + { + Id = model.Id, + Surname = model.Surname, + Name = model.Name, + LastName = model.LastName, + Email = model.Email, + Password = model.Password, + PhoneNumber = model.PhoneNumber, + EmailConfirmed = model.EmailConfirmed, + Role = model.Role, + CompanyId = model.CompanyId + }; + } + public static User Create(UserViewModel model) + { + return new User + { + Id = model.Id, + Surname = model.Surname, + Name = model.Name, + LastName = model.LastName, + Email = model.Email, + Password = model.Password, + PhoneNumber = model.PhoneNumber, + EmailConfirmed = model.EmailConfirmed, + Role = model.Role, + CompanyId = model.CompanyId + }; + } + public void Update(UserBindingModel model) + { + if (model == null) + { + return; + } + Surname = model.Surname; + Name = model.Name; + LastName = model.LastName; + Email = model.Email; + Password = model.Password; + PhoneNumber = model.PhoneNumber; + EmailConfirmed = model.EmailConfirmed; + Role = model.Role; + CompanyId = model.CompanyId; + } + public UserViewModel GetViewModel => new() + { + Id = Id, + Name = Name, + Surname = Surname, + LastName = LastName, + Email = Email, + Password = Password, + PhoneNumber = PhoneNumber, + EmailConfirmed = EmailConfirmed, + Role = Role, + CompanyId = CompanyId + }; + } +} diff --git a/CandidateReviewDatabaseImplement/Models/Vacancy.cs b/CandidateReviewDatabaseImplement/Models/Vacancy.cs new file mode 100644 index 0000000..6796d1c --- /dev/null +++ b/CandidateReviewDatabaseImplement/Models/Vacancy.cs @@ -0,0 +1,109 @@ +using CandidateReviewContracts.BindingModels; +using CandidateReviewContracts.ViewModels; +using CandidateReviewDataModels.Enums; +using CandidateReviewDataModels.Models; +using System.ComponentModel.DataAnnotations; +using System.ComponentModel.DataAnnotations.Schema; + +namespace CandidateReviewDatabaseImplement.Models +{ + public class Vacancy : IVacancyModel + { + [Required] + public int CompanyId { get; set; } + [Required] + public string JobTitle { get; set; } = string.Empty; + [Required] + public string Requirements { get; set; } = string.Empty; + [Required] + public string Responsibilities { get; set; } = string.Empty; + [Required] + public JobTypeEnum JobType { get; set; } + + public string? Salary { get; set; } + + public string? Description { get; set; } + [Required] + public VacancyStatusEnum Status { get; set; } + [Required] + public DateTime CreatedAt { get; set; } + + public string? Tags { get; set; } + + public int Id { get; set; } + public virtual Company Company { get; set; } + + [ForeignKey("VacancyId")] + public virtual List Resumes { get; set; } = new(); + + public static Vacancy? Create(VacancyBindingModel model) + { + if (model == null) + { + return null; + } + return new Vacancy() + { + Id = model.Id, + CompanyId = model.CompanyId, + JobTitle = model.JobTitle, + Requirements = model.Requirements, + Responsibilities = model.Responsibilities, + JobType = model.JobType, + Salary = model.Salary, + Description = model.Description, + Status = model.Status, + CreatedAt = model.CreatedAt, + Tags = model.Tags + }; + } + public static Vacancy Create(VacancyViewModel model) + { + return new Vacancy + { + Id = model.Id, + CompanyId = model.CompanyId, + JobTitle = model.JobTitle, + Requirements = model.Requirements, + Responsibilities = model.Responsibilities, + JobType = model.JobType, + Salary = model.Salary, + Description = model.Description, + Status = model.Status, + CreatedAt = model.CreatedAt, + Tags = model.Tags + }; + } + public void Update(VacancyBindingModel model) + { + if (model == null) + { + return; + } + CompanyId = model.CompanyId; + JobTitle = model.JobTitle; + Requirements = model.Requirements; + Responsibilities = model.Responsibilities; + JobType = model.JobType; + Salary = model.Salary; + Description = model.Description; + Status = model.Status; + CreatedAt = model.CreatedAt; + Tags = model.Tags; + } + public VacancyViewModel GetViewModel => new() + { + Id = Id, + CompanyId = CompanyId, + JobTitle = JobTitle, + Requirements = Requirements, + Responsibilities = Responsibilities, + JobType = JobType, + Salary = Salary, + Description = Description, + Status = Status, + CreatedAt = CreatedAt, + Tags = Tags + }; + } +} diff --git a/CourseWorkContracts/BindingModels/AssessmentBindingModel.cs b/CourseWorkContracts/BindingModels/AssessmentBindingModel.cs new file mode 100644 index 0000000..1b924a1 --- /dev/null +++ b/CourseWorkContracts/BindingModels/AssessmentBindingModel.cs @@ -0,0 +1,20 @@ +using CandidateReviewDataModels.Models; + +namespace CandidateReviewContracts.BindingModels +{ + public class AssessmentBindingModel : IAssessmentModel + { + public int ResumeId { get; set; } + + public int UserId { get; set; } + + public int? Rating { get; set; } + + public DateTime CreatedAt { get; set; } = DateTime.Now; + + public string? Comment { get; set; } + + public int Id { get; set; } + public Dictionary AssessmentCriterions { get; set; } = new(); + } +} diff --git a/CourseWorkContracts/BindingModels/CompanyBindingModel.cs b/CourseWorkContracts/BindingModels/CompanyBindingModel.cs new file mode 100644 index 0000000..4a4764b --- /dev/null +++ b/CourseWorkContracts/BindingModels/CompanyBindingModel.cs @@ -0,0 +1,19 @@ +using CandidateReviewDataModels.Models; + +namespace CandidateReviewContracts.BindingModels +{ + public class CompanyBindingModel : ICompanyModel + { + public string Name { get; set; } = string.Empty; + + public string? Description { get; set; } + + public string? Website { get; set; } + + public string? Address { get; set; } + + public string? Contacts { get; set; } + + public int Id { get; set; } + } +} diff --git a/CourseWorkContracts/BindingModels/CriterionBindingModel.cs b/CourseWorkContracts/BindingModels/CriterionBindingModel.cs new file mode 100644 index 0000000..7a250a7 --- /dev/null +++ b/CourseWorkContracts/BindingModels/CriterionBindingModel.cs @@ -0,0 +1,18 @@ +using CandidateReviewDataModels.Enums; +using CandidateReviewDataModels.Models; + +namespace CandidateReviewContracts.BindingModels +{ + public class CriterionBindingModel : ICriterionModel + { + public string Name { get; set; } = string.Empty; + + public CriterionTypeEnum Type { get; set; } + + public string? Description { get; set; } + + public int Weight { get; set; } + + public int Id { get; set; } + } +} diff --git a/CourseWorkContracts/BindingModels/MailConfigBindingModel.cs b/CourseWorkContracts/BindingModels/MailConfigBindingModel.cs new file mode 100644 index 0000000..8fe88e0 --- /dev/null +++ b/CourseWorkContracts/BindingModels/MailConfigBindingModel.cs @@ -0,0 +1,12 @@ +namespace CandidateReviewContracts.BindingModels +{ + public class MailConfigBindingModel + { + public string MailLogin { get; set; } = string.Empty; + public string MailPassword { get; set; } = string.Empty; + public string SmtpClientHost { get; set; } = string.Empty; + public int SmtpClientPort { get; set; } + public string PopHost { get; set; } = string.Empty; + public int PopPort { get; set; } + } +} diff --git a/CourseWorkContracts/BindingModels/MailSendInfoBindingModel.cs b/CourseWorkContracts/BindingModels/MailSendInfoBindingModel.cs new file mode 100644 index 0000000..b8e77b0 --- /dev/null +++ b/CourseWorkContracts/BindingModels/MailSendInfoBindingModel.cs @@ -0,0 +1,9 @@ +namespace CandidateReviewContracts.BindingModels +{ + public class MailSendInfoBindingModel + { + public string MailAddress { get; set; } = string.Empty; + public string Subject { get; set; } = string.Empty; + public string Text { get; set; } = string.Empty; + } +} diff --git a/CourseWorkContracts/BindingModels/ReportBindingModel.cs b/CourseWorkContracts/BindingModels/ReportBindingModel.cs new file mode 100644 index 0000000..111cd9b --- /dev/null +++ b/CourseWorkContracts/BindingModels/ReportBindingModel.cs @@ -0,0 +1,9 @@ +namespace CandidateReviewContracts.BindingModels +{ + public class ReportBindingModel + { + public string FileName { get; set; } = string.Empty; + public DateTime? DateFrom { get; set; } + public DateTime? DateTo { get; set; } + } +} diff --git a/CourseWorkContracts/BindingModels/ResumeBindingModel.cs b/CourseWorkContracts/BindingModels/ResumeBindingModel.cs new file mode 100644 index 0000000..bb6b2f7 --- /dev/null +++ b/CourseWorkContracts/BindingModels/ResumeBindingModel.cs @@ -0,0 +1,28 @@ +using CandidateReviewDataModels.Enums; +using CandidateReviewDataModels.Models; + +namespace CandidateReviewContracts.BindingModels +{ + public class ResumeBindingModel : IResumeModel + { + public int VacancyId { get; set; } + + public int UserId { get; set; } + + public string Title { get; set; } = string.Empty; + + public string Experience { get; set; } = string.Empty; + + public string Education { get; set; } = string.Empty; + + public string? PhotoFilePath { get; set; } + + public string? Description { get; set; } + + public string Skills { get; set; } = string.Empty; + + public ResumeStatusEnum Status { get; set; } + + public int Id { get; set; } + } +} diff --git a/CourseWorkContracts/BindingModels/UserBindingModel.cs b/CourseWorkContracts/BindingModels/UserBindingModel.cs new file mode 100644 index 0000000..7ad62ff --- /dev/null +++ b/CourseWorkContracts/BindingModels/UserBindingModel.cs @@ -0,0 +1,28 @@ +using CandidateReviewDataModels.Enums; +using CandidateReviewDataModels.Models; + +namespace CandidateReviewContracts.BindingModels +{ + public class UserBindingModel : IUserModel + { + public int? CompanyId { get; set; } + + public string Surname { get; set; } = string.Empty; + + public string Name { get; set; } = string.Empty; + + public string? LastName { get; set; } + + public string Email { get; set; } = string.Empty; + + public string Password { get; set; } = string.Empty; + + public string? PhoneNumber { get; set; } + + public bool EmailConfirmed { get; set; } + + public RoleEnum Role { get; set; } + + public int Id { get; set; } + } +} diff --git a/CourseWorkContracts/BindingModels/VacancyBindingModel.cs b/CourseWorkContracts/BindingModels/VacancyBindingModel.cs new file mode 100644 index 0000000..459e8d5 --- /dev/null +++ b/CourseWorkContracts/BindingModels/VacancyBindingModel.cs @@ -0,0 +1,30 @@ +using CandidateReviewDataModels.Enums; +using CandidateReviewDataModels.Models; + +namespace CandidateReviewContracts.BindingModels +{ + public class VacancyBindingModel : IVacancyModel + { + public int CompanyId { get; set; } + + public string JobTitle { get; set; } = string.Empty; + + public string Requirements { get; set; } = string.Empty; + + public string Responsibilities { get; set; } = string.Empty; + + public JobTypeEnum JobType { get; set; } + + public string? Salary { get; set; } + + public string? Description { get; set; } + + public VacancyStatusEnum Status { get; set; } + + public DateTime CreatedAt { get; set; } + + public string? Tags { get; set; } + + public int Id { get; set; } + } +} diff --git a/CourseWorkContracts/BusinessLogicsContracts/IAssessmentLogic.cs b/CourseWorkContracts/BusinessLogicsContracts/IAssessmentLogic.cs new file mode 100644 index 0000000..061469a --- /dev/null +++ b/CourseWorkContracts/BusinessLogicsContracts/IAssessmentLogic.cs @@ -0,0 +1,15 @@ +using CandidateReviewContracts.BindingModels; +using CandidateReviewContracts.SearchModels; +using CandidateReviewContracts.ViewModels; + +namespace CandidateReviewContracts.BusinessLogicsContracts +{ + public interface IAssessmentLogic + { + List? ReadList(AssessmentSearchModel? model); + AssessmentViewModel? ReadElement(AssessmentSearchModel model); + bool Create(AssessmentBindingModel model); + bool Update(AssessmentBindingModel model); + bool Delete(AssessmentBindingModel model); + } +} diff --git a/CourseWorkContracts/BusinessLogicsContracts/ICompanyLogic.cs b/CourseWorkContracts/BusinessLogicsContracts/ICompanyLogic.cs new file mode 100644 index 0000000..e98fa94 --- /dev/null +++ b/CourseWorkContracts/BusinessLogicsContracts/ICompanyLogic.cs @@ -0,0 +1,15 @@ +using CandidateReviewContracts.BindingModels; +using CandidateReviewContracts.SearchModels; +using CandidateReviewContracts.ViewModels; + +namespace CandidateReviewContracts.BusinessLogicsContracts +{ + public interface ICompanyLogic + { + List? ReadList(CompanySearchModel? model); + CompanyViewModel? ReadElement(CompanySearchModel model); + bool Create(CompanyBindingModel model); + bool Update(CompanyBindingModel model); + bool Delete(CompanyBindingModel model); + } +} diff --git a/CourseWorkContracts/BusinessLogicsContracts/ICriterionLogic.cs b/CourseWorkContracts/BusinessLogicsContracts/ICriterionLogic.cs new file mode 100644 index 0000000..9cccc9b --- /dev/null +++ b/CourseWorkContracts/BusinessLogicsContracts/ICriterionLogic.cs @@ -0,0 +1,15 @@ +using CandidateReviewContracts.BindingModels; +using CandidateReviewContracts.SearchModels; +using CandidateReviewContracts.ViewModels; + +namespace CandidateReviewContracts.BusinessLogicsContracts +{ + public interface ICriterionLogic + { + List? ReadList(CriterionSearchModel? model); + CriterionViewModel? ReadElement(CriterionSearchModel model); + bool Create(CriterionBindingModel model); + bool Update(CriterionBindingModel model); + bool Delete(CriterionBindingModel model); + } +} diff --git a/CourseWorkContracts/BusinessLogicsContracts/IReportLogic.cs b/CourseWorkContracts/BusinessLogicsContracts/IReportLogic.cs new file mode 100644 index 0000000..bfba23b --- /dev/null +++ b/CourseWorkContracts/BusinessLogicsContracts/IReportLogic.cs @@ -0,0 +1,32 @@ +namespace CandidateReviewContracts.BusinessLogicsContracts +{ + public interface IReportLogic + { + /*/// + /// Получение списка компонент с указанием, в каких изделиях используются + /// + /// + List GetEngineComponent(); + /// + /// Получение списка заказов за определенный период + /// + /// + /// + List GetOrders(ReportBindingModel model); + /// + /// Сохранение компонент в файл-Word + /// + /// + void SaveEnginesToWordFile(ReportBindingModel model); + /// + /// Сохранение компонент с указаеним продуктов в файл-Excel + /// + /// + void SaveEngineComponentToExcelFile(ReportBindingModel model); + /// + /// Сохранение заказов в файл-Pdf + /// + /// + void SaveOrdersToPdfFile(ReportBindingModel model);*/ + } +} diff --git a/CourseWorkContracts/BusinessLogicsContracts/IResumeLogic.cs b/CourseWorkContracts/BusinessLogicsContracts/IResumeLogic.cs new file mode 100644 index 0000000..4fe225a --- /dev/null +++ b/CourseWorkContracts/BusinessLogicsContracts/IResumeLogic.cs @@ -0,0 +1,15 @@ +using CandidateReviewContracts.BindingModels; +using CandidateReviewContracts.SearchModels; +using CandidateReviewContracts.ViewModels; + +namespace CandidateReviewContracts.BusinessLogicsContracts +{ + public interface IResumeLogic + { + List? ReadList(ResumeSearchModel? model); + ResumeViewModel? ReadElement(ResumeSearchModel model); + bool Create(ResumeBindingModel model); + bool Update(ResumeBindingModel model); + bool Delete(ResumeBindingModel model); + } +} diff --git a/CourseWorkContracts/BusinessLogicsContracts/IUserLogic.cs b/CourseWorkContracts/BusinessLogicsContracts/IUserLogic.cs new file mode 100644 index 0000000..cb880b1 --- /dev/null +++ b/CourseWorkContracts/BusinessLogicsContracts/IUserLogic.cs @@ -0,0 +1,15 @@ +using CandidateReviewContracts.BindingModels; +using CandidateReviewContracts.SearchModels; +using CandidateReviewContracts.ViewModels; + +namespace CandidateReviewContracts.BusinessLogicsContracts +{ + public interface IUserLogic + { + List? ReadList(UserSearchModel? model); + UserViewModel? ReadElement(UserSearchModel model); + bool Create(UserBindingModel model); + bool Update(UserBindingModel model); + bool Delete(UserBindingModel model); + } +} diff --git a/CourseWorkContracts/BusinessLogicsContracts/IVacancyLogic.cs b/CourseWorkContracts/BusinessLogicsContracts/IVacancyLogic.cs new file mode 100644 index 0000000..0284c2b --- /dev/null +++ b/CourseWorkContracts/BusinessLogicsContracts/IVacancyLogic.cs @@ -0,0 +1,15 @@ +using CandidateReviewContracts.BindingModels; +using CandidateReviewContracts.SearchModels; +using CandidateReviewContracts.ViewModels; + +namespace CandidateReviewContracts.BusinessLogicsContracts +{ + public interface IVacancyLogic + { + List? ReadList(VacancySearchModel? model); + VacancyViewModel? ReadElement(VacancySearchModel model); + bool Create(VacancyBindingModel model); + bool Update(VacancyBindingModel model); + bool Delete(VacancyBindingModel model); + } +} diff --git a/CourseWork_KPO/CourseWork_KPO.csproj b/CourseWorkContracts/CandidateReviewContracts.csproj similarity index 63% rename from CourseWork_KPO/CourseWork_KPO.csproj rename to CourseWorkContracts/CandidateReviewContracts.csproj index fa71b7a..f0cc561 100644 --- a/CourseWork_KPO/CourseWork_KPO.csproj +++ b/CourseWorkContracts/CandidateReviewContracts.csproj @@ -6,4 +6,8 @@ enable + + + + diff --git a/CourseWorkContracts/SearchModels/AssessmentSearchModel.cs b/CourseWorkContracts/SearchModels/AssessmentSearchModel.cs new file mode 100644 index 0000000..5e3e699 --- /dev/null +++ b/CourseWorkContracts/SearchModels/AssessmentSearchModel.cs @@ -0,0 +1,11 @@ +namespace CandidateReviewContracts.SearchModels +{ + public class AssessmentSearchModel + { + public int? ResumeId { get; set; } + + public int? UserId { get; set; } + + public int? Id { get; set; } + } +} diff --git a/CourseWorkContracts/SearchModels/CompanySearchModel.cs b/CourseWorkContracts/SearchModels/CompanySearchModel.cs new file mode 100644 index 0000000..99920f5 --- /dev/null +++ b/CourseWorkContracts/SearchModels/CompanySearchModel.cs @@ -0,0 +1,9 @@ +namespace CandidateReviewContracts.SearchModels +{ + public class CompanySearchModel + { + public string? Name { get; set; } + + public int Id { get; set; } + } +} diff --git a/CourseWorkContracts/SearchModels/CriterionSearchModel.cs b/CourseWorkContracts/SearchModels/CriterionSearchModel.cs new file mode 100644 index 0000000..2f19673 --- /dev/null +++ b/CourseWorkContracts/SearchModels/CriterionSearchModel.cs @@ -0,0 +1,9 @@ +namespace CandidateReviewContracts.SearchModels +{ + public class CriterionSearchModel + { + public string? Name { get; set; } + + public int? Id { get; set; } + } +} diff --git a/CourseWorkContracts/SearchModels/ResumeSearchModel.cs b/CourseWorkContracts/SearchModels/ResumeSearchModel.cs new file mode 100644 index 0000000..1035a48 --- /dev/null +++ b/CourseWorkContracts/SearchModels/ResumeSearchModel.cs @@ -0,0 +1,15 @@ +using CandidateReviewDataModels.Enums; + +namespace CandidateReviewContracts.SearchModels +{ + public class ResumeSearchModel + { + public int? VacancyId { get; set; } + + public int? UserId { get; set; } + + public string? Title { get; set; } + + public int? Id { get; set; } + } +} diff --git a/CourseWorkContracts/SearchModels/UserSearchModel.cs b/CourseWorkContracts/SearchModels/UserSearchModel.cs new file mode 100644 index 0000000..51f2b69 --- /dev/null +++ b/CourseWorkContracts/SearchModels/UserSearchModel.cs @@ -0,0 +1,15 @@ +namespace CandidateReviewContracts.SearchModels +{ + public class UserSearchModel + { + public int? CompanyId { get; set; } + + public string? Surname { get; set; } + + public string? Name { get; set; } + + public string? Email { get; set; } = string.Empty; + + public int? Id { get; set; } + } +} diff --git a/CourseWorkContracts/SearchModels/VacancySearchModel.cs b/CourseWorkContracts/SearchModels/VacancySearchModel.cs new file mode 100644 index 0000000..d246789 --- /dev/null +++ b/CourseWorkContracts/SearchModels/VacancySearchModel.cs @@ -0,0 +1,15 @@ +namespace CandidateReviewContracts.SearchModels +{ + public class VacancySearchModel + { + public int? CompanyId { get; set; } + + public string? JobTitle { get; set; } + + public string? Salary { get; set; } + + public string? Tags { get; set; } + + public int? Id { get; set; } + } +} diff --git a/CourseWorkContracts/StoragesContracts/IAssessmentStorage.cs b/CourseWorkContracts/StoragesContracts/IAssessmentStorage.cs new file mode 100644 index 0000000..ec65a23 --- /dev/null +++ b/CourseWorkContracts/StoragesContracts/IAssessmentStorage.cs @@ -0,0 +1,16 @@ +using CandidateReviewContracts.BindingModels; +using CandidateReviewContracts.SearchModels; +using CandidateReviewContracts.ViewModels; + +namespace CandidateReviewContracts.StoragesContracts +{ + public interface IAssessmentStorage + { + List GetFullList(); + List GetFilteredList(AssessmentSearchModel model); + AssessmentViewModel? GetElement(AssessmentSearchModel model); + AssessmentViewModel? Insert(AssessmentBindingModel model); + AssessmentViewModel? Update(AssessmentBindingModel model); + AssessmentViewModel? Delete(AssessmentBindingModel model); + } +} diff --git a/CourseWorkContracts/StoragesContracts/ICompanyStorage.cs b/CourseWorkContracts/StoragesContracts/ICompanyStorage.cs new file mode 100644 index 0000000..8b76e99 --- /dev/null +++ b/CourseWorkContracts/StoragesContracts/ICompanyStorage.cs @@ -0,0 +1,16 @@ +using CandidateReviewContracts.BindingModels; +using CandidateReviewContracts.SearchModels; +using CandidateReviewContracts.ViewModels; + +namespace CandidateReviewContracts.StoragesContracts +{ + public interface ICompanyStorage + { + List GetFullList(); + List GetFilteredList(CompanySearchModel model); + CompanyViewModel? GetElement(CompanySearchModel model); + CompanyViewModel? Insert(CompanyBindingModel model); + CompanyViewModel? Update(CompanyBindingModel model); + CompanyViewModel? Delete(CompanyBindingModel model); + } +} diff --git a/CourseWorkContracts/StoragesContracts/ICriterionStorage.cs b/CourseWorkContracts/StoragesContracts/ICriterionStorage.cs new file mode 100644 index 0000000..a266f8a --- /dev/null +++ b/CourseWorkContracts/StoragesContracts/ICriterionStorage.cs @@ -0,0 +1,16 @@ +using CandidateReviewContracts.BindingModels; +using CandidateReviewContracts.SearchModels; +using CandidateReviewContracts.ViewModels; + +namespace CandidateReviewContracts.StoragesContracts +{ + public interface ICriterionStorage + { + List GetFullList(); + List GetFilteredList(CriterionSearchModel model); + CriterionViewModel? GetElement(CriterionSearchModel model); + CriterionViewModel? Insert(CriterionBindingModel model); + CriterionViewModel? Update(CriterionBindingModel model); + CriterionViewModel? Delete(CriterionBindingModel model); + } +} diff --git a/CourseWorkContracts/StoragesContracts/IResumeStorage.cs b/CourseWorkContracts/StoragesContracts/IResumeStorage.cs new file mode 100644 index 0000000..937197f --- /dev/null +++ b/CourseWorkContracts/StoragesContracts/IResumeStorage.cs @@ -0,0 +1,16 @@ +using CandidateReviewContracts.BindingModels; +using CandidateReviewContracts.SearchModels; +using CandidateReviewContracts.ViewModels; + +namespace CandidateReviewContracts.StoragesContracts +{ + public interface IResumeStorage + { + List GetFullList(); + List GetFilteredList(ResumeSearchModel model); + ResumeViewModel? GetElement(ResumeSearchModel model); + ResumeViewModel? Insert(ResumeBindingModel model); + ResumeViewModel? Update(ResumeBindingModel model); + ResumeViewModel? Delete(ResumeBindingModel model); + } +} diff --git a/CourseWorkContracts/StoragesContracts/IUserStorage.cs b/CourseWorkContracts/StoragesContracts/IUserStorage.cs new file mode 100644 index 0000000..32cbde7 --- /dev/null +++ b/CourseWorkContracts/StoragesContracts/IUserStorage.cs @@ -0,0 +1,16 @@ +using CandidateReviewContracts.BindingModels; +using CandidateReviewContracts.SearchModels; +using CandidateReviewContracts.ViewModels; + +namespace CandidateReviewContracts.StoragesContracts +{ + public interface IUserStorage + { + List GetFullList(); + List GetFilteredList(UserSearchModel model); + UserViewModel? GetElement(UserSearchModel model); + UserViewModel? Insert(UserBindingModel model); + UserViewModel? Update(UserBindingModel model); + UserViewModel? Delete(UserBindingModel model); + } +} diff --git a/CourseWorkContracts/StoragesContracts/IVacancyStorage.cs b/CourseWorkContracts/StoragesContracts/IVacancyStorage.cs new file mode 100644 index 0000000..fc7c807 --- /dev/null +++ b/CourseWorkContracts/StoragesContracts/IVacancyStorage.cs @@ -0,0 +1,16 @@ +using CandidateReviewContracts.BindingModels; +using CandidateReviewContracts.SearchModels; +using CandidateReviewContracts.ViewModels; + +namespace CandidateReviewContracts.StoragesContracts +{ + public interface IVacancyStorage + { + List GetFullList(); + List GetFilteredList(VacancySearchModel model); + VacancyViewModel? GetElement(VacancySearchModel model); + VacancyViewModel? Insert(VacancyBindingModel model); + VacancyViewModel? Update(VacancyBindingModel model); + VacancyViewModel? Delete(VacancyBindingModel model); + } +} diff --git a/CourseWorkContracts/ViewModels/AssessmentViewModel.cs b/CourseWorkContracts/ViewModels/AssessmentViewModel.cs new file mode 100644 index 0000000..e0e1da1 --- /dev/null +++ b/CourseWorkContracts/ViewModels/AssessmentViewModel.cs @@ -0,0 +1,19 @@ +using CandidateReviewDataModels.Models; + +namespace CandidateReviewContracts.ViewModels +{ + public class AssessmentViewModel : IAssessmentModel + { + public int ResumeId { get; set; } + + public int UserId { get; set; } + + public int? Rating { get; set; } + + public DateTime CreatedAt { get; set; } + + public string? Comment { get; set; } + + public int Id { get; set; } + } +} diff --git a/CourseWorkContracts/ViewModels/CompanyViewModel.cs b/CourseWorkContracts/ViewModels/CompanyViewModel.cs new file mode 100644 index 0000000..8929ca4 --- /dev/null +++ b/CourseWorkContracts/ViewModels/CompanyViewModel.cs @@ -0,0 +1,19 @@ +using CandidateReviewDataModels.Models; + +namespace CandidateReviewContracts.ViewModels +{ + public class CompanyViewModel : ICompanyModel + { + public string Name { get; set; } = string.Empty; + + public string? Description { get; set; } + + public string? Website { get; set; } + + public string? Address { get; set; } + + public string? Contacts { get; set; } + + public int Id { get; set; } + } +} diff --git a/CourseWorkContracts/ViewModels/CriterionViewModel.cs b/CourseWorkContracts/ViewModels/CriterionViewModel.cs new file mode 100644 index 0000000..f58c32b --- /dev/null +++ b/CourseWorkContracts/ViewModels/CriterionViewModel.cs @@ -0,0 +1,18 @@ +using CandidateReviewDataModels.Enums; +using CandidateReviewDataModels.Models; + +namespace CandidateReviewContracts.ViewModels +{ + public class CriterionViewModel : ICriterionModel + { + public string Name { get; set; } = string.Empty; + + public CriterionTypeEnum Type { get; set; } + + public string? Description { get; set; } + + public int Weight { get; set; } + + public int Id { get; set; } + } +} diff --git a/CourseWorkContracts/ViewModels/ResumeViewModel.cs b/CourseWorkContracts/ViewModels/ResumeViewModel.cs new file mode 100644 index 0000000..0ada276 --- /dev/null +++ b/CourseWorkContracts/ViewModels/ResumeViewModel.cs @@ -0,0 +1,28 @@ +using CandidateReviewDataModels.Enums; +using CandidateReviewDataModels.Models; + +namespace CandidateReviewContracts.ViewModels +{ + public class ResumeViewModel : IResumeModel + { + public int VacancyId { get; set; } + + public int UserId { get; set; } + + public string Title { get; set; } = string.Empty; + + public string Experience { get; set; } = string.Empty; + + public string Education { get; set; } = string.Empty; + + public string? PhotoFilePath { get; set; } + + public string? Description { get; set; } + + public string Skills { get; set; } = string.Empty; + + public ResumeStatusEnum Status { get; set; } + + public int Id { get; set; } + } +} diff --git a/CourseWorkContracts/ViewModels/UserViewModel.cs b/CourseWorkContracts/ViewModels/UserViewModel.cs new file mode 100644 index 0000000..ecfe5cd --- /dev/null +++ b/CourseWorkContracts/ViewModels/UserViewModel.cs @@ -0,0 +1,28 @@ +using CandidateReviewDataModels.Enums; +using CandidateReviewDataModels.Models; + +namespace CandidateReviewContracts.ViewModels +{ + public class UserViewModel : IUserModel + { + public int? CompanyId { get; set; } + + public string Surname { get; set; } = string.Empty; + + public string Name { get; set; } = string.Empty; + + public string? LastName { get; set; } + + public string Email { get; set; } = string.Empty; + + public string Password { get; set; } = string.Empty; + + public string? PhoneNumber { get; set; } + + public bool EmailConfirmed { get; set; } + + public RoleEnum Role { get; set; } + + public int Id { get; set; } + } +} diff --git a/CourseWorkContracts/ViewModels/VacancyViewModel.cs b/CourseWorkContracts/ViewModels/VacancyViewModel.cs new file mode 100644 index 0000000..a5a853d --- /dev/null +++ b/CourseWorkContracts/ViewModels/VacancyViewModel.cs @@ -0,0 +1,30 @@ +using CandidateReviewDataModels.Enums; +using CandidateReviewDataModels.Models; + +namespace CandidateReviewContracts.ViewModels +{ + public class VacancyViewModel : IVacancyModel + { + public int CompanyId { get; set; } + + public string JobTitle { get; set; } = string.Empty; + + public string Requirements { get; set; } = string.Empty; + + public string Responsibilities { get; set; } = string.Empty; + + public JobTypeEnum JobType { get; set; } + + public string? Salary { get; set; } + + public string? Description { get; set; } + + public VacancyStatusEnum Status { get; set; } + + public DateTime CreatedAt { get; set; } + + public string? Tags { get; set; } + + public int Id { get; set; } + } +} diff --git a/CourseWorkDataModels/CourseWorkDataModels.csproj b/CourseWorkDataModels/CandidateReviewDataModels.csproj similarity index 100% rename from CourseWorkDataModels/CourseWorkDataModels.csproj rename to CourseWorkDataModels/CandidateReviewDataModels.csproj diff --git a/CourseWorkDataModels/Enums/CriterionTypeEnum.cs b/CourseWorkDataModels/Enums/CriterionTypeEnum.cs index 3523910..13dda8e 100644 --- a/CourseWorkDataModels/Enums/CriterionTypeEnum.cs +++ b/CourseWorkDataModels/Enums/CriterionTypeEnum.cs @@ -1,4 +1,4 @@ -namespace CourseWorkDataModels.Enums +namespace CandidateReviewDataModels.Enums { public enum CriterionTypeEnum { diff --git a/CourseWorkDataModels/Enums/JobTypeEnum.cs b/CourseWorkDataModels/Enums/JobTypeEnum.cs index f35ea69..774df4d 100644 --- a/CourseWorkDataModels/Enums/JobTypeEnum.cs +++ b/CourseWorkDataModels/Enums/JobTypeEnum.cs @@ -1,4 +1,4 @@ -namespace CourseWorkDataModels.Enums +namespace CandidateReviewDataModels.Enums { public enum JobTypeEnum { diff --git a/CourseWorkDataModels/Enums/ResumeStatusEnum.cs b/CourseWorkDataModels/Enums/ResumeStatusEnum.cs index 214dd02..7469c13 100644 --- a/CourseWorkDataModels/Enums/ResumeStatusEnum.cs +++ b/CourseWorkDataModels/Enums/ResumeStatusEnum.cs @@ -1,4 +1,4 @@ -namespace CourseWorkDataModels.Enums +namespace CandidateReviewDataModels.Enums { public enum ResumeStatusEnum { diff --git a/CourseWorkDataModels/Enums/RoleEnum.cs b/CourseWorkDataModels/Enums/RoleEnum.cs index abf6c0c..3bb9d2b 100644 --- a/CourseWorkDataModels/Enums/RoleEnum.cs +++ b/CourseWorkDataModels/Enums/RoleEnum.cs @@ -1,4 +1,4 @@ -namespace CourseWorkDataModels.Enums +namespace CandidateReviewDataModels.Enums { public enum RoleEnum { diff --git a/CourseWorkDataModels/Enums/VacancyStatusEnum.cs b/CourseWorkDataModels/Enums/VacancyStatusEnum.cs index 3a959f8..8850bae 100644 --- a/CourseWorkDataModels/Enums/VacancyStatusEnum.cs +++ b/CourseWorkDataModels/Enums/VacancyStatusEnum.cs @@ -1,4 +1,4 @@ -namespace CourseWorkDataModels.Enums +namespace CandidateReviewDataModels.Enums { public enum VacancyStatusEnum { diff --git a/CourseWorkDataModels/IId.cs b/CourseWorkDataModels/IId.cs index e0c8c57..4f0c0f6 100644 --- a/CourseWorkDataModels/IId.cs +++ b/CourseWorkDataModels/IId.cs @@ -1,4 +1,4 @@ -namespace CourseWorkDataModels +namespace CandidateReviewDataModels { public interface IId { diff --git a/CourseWorkDataModels/Models/IAssessmentModel.cs b/CourseWorkDataModels/Models/IAssessmentModel.cs index 4ab1a0d..a3a1d57 100644 --- a/CourseWorkDataModels/Models/IAssessmentModel.cs +++ b/CourseWorkDataModels/Models/IAssessmentModel.cs @@ -1,4 +1,4 @@ -namespace CourseWorkDataModels.Models +namespace CandidateReviewDataModels.Models { public interface IAssessmentModel : IId { diff --git a/CourseWorkDataModels/Models/ICompanyModel.cs b/CourseWorkDataModels/Models/ICompanyModel.cs index 69f00d6..24f70db 100644 --- a/CourseWorkDataModels/Models/ICompanyModel.cs +++ b/CourseWorkDataModels/Models/ICompanyModel.cs @@ -1,4 +1,4 @@ -namespace CourseWorkDataModels.Models +namespace CandidateReviewDataModels.Models { public interface ICompanyModel : IId { diff --git a/CourseWorkDataModels/Models/ICriterionModel.cs b/CourseWorkDataModels/Models/ICriterionModel.cs index 750c934..1f23f94 100644 --- a/CourseWorkDataModels/Models/ICriterionModel.cs +++ b/CourseWorkDataModels/Models/ICriterionModel.cs @@ -1,6 +1,6 @@ -using CourseWorkDataModels.Enums; +using CandidateReviewDataModels.Enums; -namespace CourseWorkDataModels.Models +namespace CandidateReviewDataModels.Models { public interface ICriterionModel : IId { diff --git a/CourseWorkDataModels/Models/IResumeModel.cs b/CourseWorkDataModels/Models/IResumeModel.cs index 02d97d0..c538b50 100644 --- a/CourseWorkDataModels/Models/IResumeModel.cs +++ b/CourseWorkDataModels/Models/IResumeModel.cs @@ -1,6 +1,6 @@ -using CourseWorkDataModels.Enums; +using CandidateReviewDataModels.Enums; -namespace CourseWorkDataModels.Models +namespace CandidateReviewDataModels.Models { public interface IResumeModel : IId { diff --git a/CourseWorkDataModels/Models/IUserModel.cs b/CourseWorkDataModels/Models/IUserModel.cs index 683dae8..c0d589f 100644 --- a/CourseWorkDataModels/Models/IUserModel.cs +++ b/CourseWorkDataModels/Models/IUserModel.cs @@ -1,6 +1,6 @@ -using CourseWorkDataModels.Enums; +using CandidateReviewDataModels.Enums; -namespace CourseWorkDataModels.Models +namespace CandidateReviewDataModels.Models { public interface IUserModel : IId { diff --git a/CourseWorkDataModels/Models/IVacancyModel.cs b/CourseWorkDataModels/Models/IVacancyModel.cs index e63beec..ddc47ec 100644 --- a/CourseWorkDataModels/Models/IVacancyModel.cs +++ b/CourseWorkDataModels/Models/IVacancyModel.cs @@ -1,6 +1,6 @@ -using CourseWorkDataModels.Enums; +using CandidateReviewDataModels.Enums; -namespace CourseWorkDataModels.Models +namespace CandidateReviewDataModels.Models { public interface IVacancyModel : IId { diff --git a/CourseWork_KPO/CandidateReview.csproj b/CourseWork_KPO/CandidateReview.csproj new file mode 100644 index 0000000..ac26a8b --- /dev/null +++ b/CourseWork_KPO/CandidateReview.csproj @@ -0,0 +1,21 @@ + + + + net8.0 + enable + enable + + + + + all + runtime; build; native; contentfiles; analyzers; buildtransitive + + + + + + + + + diff --git a/CourseWork_KPO/CandidateReview.sln b/CourseWork_KPO/CandidateReview.sln new file mode 100644 index 0000000..4986917 --- /dev/null +++ b/CourseWork_KPO/CandidateReview.sln @@ -0,0 +1,43 @@ + +Microsoft Visual Studio Solution File, Format Version 12.00 +# Visual Studio Version 17 +VisualStudioVersion = 17.9.34728.123 +MinimumVisualStudioVersion = 10.0.40219.1 +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "CandidateReview", "CandidateReview.csproj", "{33841075-EF26-40F4-8CE0-07C2095872D5}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "CandidateReviewDataModels", "..\CourseWorkDataModels\CandidateReviewDataModels.csproj", "{E0BF707A-5463-47A4-A990-0C89BCD6D18B}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "CandidateReviewContracts", "..\CourseWorkContracts\CandidateReviewContracts.csproj", "{5AD56404-B345-41E8-9674-7C2570966AAC}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "CandidateReviewDatabaseImplement", "..\CandidateReviewDatabaseImplement\CandidateReviewDatabaseImplement.csproj", "{746A65FE-AC70-4D79-9103-218A43903948}" +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + Debug|Any CPU = Debug|Any CPU + Release|Any CPU = Release|Any CPU + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {33841075-EF26-40F4-8CE0-07C2095872D5}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {33841075-EF26-40F4-8CE0-07C2095872D5}.Debug|Any CPU.Build.0 = Debug|Any CPU + {33841075-EF26-40F4-8CE0-07C2095872D5}.Release|Any CPU.ActiveCfg = Release|Any CPU + {33841075-EF26-40F4-8CE0-07C2095872D5}.Release|Any CPU.Build.0 = Release|Any CPU + {E0BF707A-5463-47A4-A990-0C89BCD6D18B}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {E0BF707A-5463-47A4-A990-0C89BCD6D18B}.Debug|Any CPU.Build.0 = Debug|Any CPU + {E0BF707A-5463-47A4-A990-0C89BCD6D18B}.Release|Any CPU.ActiveCfg = Release|Any CPU + {E0BF707A-5463-47A4-A990-0C89BCD6D18B}.Release|Any CPU.Build.0 = Release|Any CPU + {5AD56404-B345-41E8-9674-7C2570966AAC}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {5AD56404-B345-41E8-9674-7C2570966AAC}.Debug|Any CPU.Build.0 = Debug|Any CPU + {5AD56404-B345-41E8-9674-7C2570966AAC}.Release|Any CPU.ActiveCfg = Release|Any CPU + {5AD56404-B345-41E8-9674-7C2570966AAC}.Release|Any CPU.Build.0 = Release|Any CPU + {746A65FE-AC70-4D79-9103-218A43903948}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {746A65FE-AC70-4D79-9103-218A43903948}.Debug|Any CPU.Build.0 = Debug|Any CPU + {746A65FE-AC70-4D79-9103-218A43903948}.Release|Any CPU.ActiveCfg = Release|Any CPU + {746A65FE-AC70-4D79-9103-218A43903948}.Release|Any CPU.Build.0 = Release|Any CPU + EndGlobalSection + GlobalSection(SolutionProperties) = preSolution + HideSolutionNode = FALSE + EndGlobalSection + GlobalSection(ExtensibilityGlobals) = postSolution + SolutionGuid = {F2DC5290-D709-4D1F-84E6-97C8FE1E6590} + EndGlobalSection +EndGlobal diff --git a/CourseWork_KPO/Class1.cs b/CourseWork_KPO/Class1.cs index 58991b5..dde84fb 100644 --- a/CourseWork_KPO/Class1.cs +++ b/CourseWork_KPO/Class1.cs @@ -1,4 +1,4 @@ -namespace CourseWork_KPO +namespace CandidateReview_KPO { public class Class1 { diff --git a/CourseWork_KPO/CourseWork_KPO.sln b/CourseWork_KPO/CourseWork_KPO.sln deleted file mode 100644 index 86ba66d..0000000 --- a/CourseWork_KPO/CourseWork_KPO.sln +++ /dev/null @@ -1,31 +0,0 @@ - -Microsoft Visual Studio Solution File, Format Version 12.00 -# Visual Studio Version 17 -VisualStudioVersion = 17.9.34728.123 -MinimumVisualStudioVersion = 10.0.40219.1 -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "CourseWork_KPO", "CourseWork_KPO.csproj", "{33841075-EF26-40F4-8CE0-07C2095872D5}" -EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "CourseWorkDataModels", "..\CourseWorkDataModels\CourseWorkDataModels.csproj", "{E0BF707A-5463-47A4-A990-0C89BCD6D18B}" -EndProject -Global - GlobalSection(SolutionConfigurationPlatforms) = preSolution - Debug|Any CPU = Debug|Any CPU - Release|Any CPU = Release|Any CPU - EndGlobalSection - GlobalSection(ProjectConfigurationPlatforms) = postSolution - {33841075-EF26-40F4-8CE0-07C2095872D5}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {33841075-EF26-40F4-8CE0-07C2095872D5}.Debug|Any CPU.Build.0 = Debug|Any CPU - {33841075-EF26-40F4-8CE0-07C2095872D5}.Release|Any CPU.ActiveCfg = Release|Any CPU - {33841075-EF26-40F4-8CE0-07C2095872D5}.Release|Any CPU.Build.0 = Release|Any CPU - {E0BF707A-5463-47A4-A990-0C89BCD6D18B}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {E0BF707A-5463-47A4-A990-0C89BCD6D18B}.Debug|Any CPU.Build.0 = Debug|Any CPU - {E0BF707A-5463-47A4-A990-0C89BCD6D18B}.Release|Any CPU.ActiveCfg = Release|Any CPU - {E0BF707A-5463-47A4-A990-0C89BCD6D18B}.Release|Any CPU.Build.0 = Release|Any CPU - EndGlobalSection - GlobalSection(SolutionProperties) = preSolution - HideSolutionNode = FALSE - EndGlobalSection - GlobalSection(ExtensibilityGlobals) = postSolution - SolutionGuid = {F2DC5290-D709-4D1F-84E6-97C8FE1E6590} - EndGlobalSection -EndGlobal