diff --git a/src/JobsMedical.Web/Migrations/20260621074635_MedboomSource.Designer.cs b/src/JobsMedical.Web/Migrations/20260621074635_MedboomSource.Designer.cs
new file mode 100644
index 0000000..347f913
--- /dev/null
+++ b/src/JobsMedical.Web/Migrations/20260621074635_MedboomSource.Designer.cs
@@ -0,0 +1,1653 @@
+//
+using System;
+using JobsMedical.Web.Data;
+using Microsoft.EntityFrameworkCore;
+using Microsoft.EntityFrameworkCore.Infrastructure;
+using Microsoft.EntityFrameworkCore.Migrations;
+using Microsoft.EntityFrameworkCore.Storage.ValueConversion;
+using Npgsql.EntityFrameworkCore.PostgreSQL.Metadata;
+
+#nullable disable
+
+namespace JobsMedical.Web.Migrations
+{
+ [DbContext(typeof(AppDbContext))]
+ [Migration("20260621074635_MedboomSource")]
+ partial class MedboomSource
+ {
+ ///
+ protected override void BuildTargetModel(ModelBuilder modelBuilder)
+ {
+#pragma warning disable 612, 618
+ modelBuilder
+ .HasAnnotation("ProductVersion", "10.0.0")
+ .HasAnnotation("Relational:MaxIdentifierLength", 63);
+
+ NpgsqlModelBuilderExtensions.UseIdentityByDefaultColumns(modelBuilder);
+
+ modelBuilder.Entity("JobsMedical.Web.Models.AppSetting", b =>
+ {
+ b.Property("Id")
+ .ValueGeneratedOnAdd()
+ .HasColumnType("integer");
+
+ NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id"));
+
+ b.Property("AiApiKey")
+ .HasMaxLength(200)
+ .HasColumnType("character varying(200)");
+
+ b.Property("AiAutoApprove")
+ .HasColumnType("boolean");
+
+ b.Property("AiEnabled")
+ .HasColumnType("boolean");
+
+ b.Property("AiEndpoint")
+ .HasMaxLength(500)
+ .HasColumnType("character varying(500)");
+
+ b.Property("AiModel")
+ .HasMaxLength(120)
+ .HasColumnType("character varying(120)");
+
+ b.Property("AiSystemPrompt")
+ .IsRequired()
+ .HasMaxLength(4000)
+ .HasColumnType("character varying(4000)");
+
+ b.Property("AiUseProxy")
+ .HasColumnType("boolean");
+
+ b.Property("AutoIngestEnabled")
+ .HasColumnType("boolean");
+
+ b.Property("AutoPublishMinConfidence")
+ .HasColumnType("integer");
+
+ b.Property("BaleBotToken")
+ .HasMaxLength(200)
+ .HasColumnType("character varying(200)");
+
+ b.Property("BaleEnabled")
+ .HasColumnType("boolean");
+
+ b.Property("BaleUseProxy")
+ .HasColumnType("boolean");
+
+ b.Property("DemoMode")
+ .HasColumnType("boolean");
+
+ b.Property("DivarCity")
+ .HasMaxLength(60)
+ .HasColumnType("character varying(60)");
+
+ b.Property("DivarEnabled")
+ .HasColumnType("boolean");
+
+ b.Property("DivarQueries")
+ .HasMaxLength(2000)
+ .HasColumnType("character varying(2000)");
+
+ b.Property("DivarUseProxy")
+ .HasColumnType("boolean");
+
+ b.Property("IngestIntervalMinutes")
+ .HasColumnType("integer");
+
+ b.Property("IngestProxyEnabled")
+ .HasColumnType("boolean");
+
+ b.Property("IngestProxyUrl")
+ .HasMaxLength(200)
+ .HasColumnType("character varying(200)");
+
+ b.Property("InstagramHashtags")
+ .HasMaxLength(1000)
+ .HasColumnType("character varying(1000)");
+
+ b.Property("IranEstekhdamEnabled")
+ .HasColumnType("boolean");
+
+ b.Property("IranEstekhdamMaxAds")
+ .HasColumnType("integer");
+
+ b.Property("IranEstekhdamUseProxy")
+ .HasColumnType("boolean");
+
+ b.Property("MedboomEnabled")
+ .HasColumnType("boolean");
+
+ b.Property("MedboomMaxAds")
+ .HasColumnType("integer");
+
+ b.Property("MedboomUseProxy")
+ .HasColumnType("boolean");
+
+ b.Property("MedjobsEnabled")
+ .HasColumnType("boolean");
+
+ b.Property("MedjobsMaxAds")
+ .HasColumnType("integer");
+
+ b.Property("MedjobsUseProxy")
+ .HasColumnType("boolean");
+
+ b.Property("Mode")
+ .HasColumnType("integer");
+
+ b.Property("NeshanMapKey")
+ .HasMaxLength(200)
+ .HasColumnType("character varying(200)");
+
+ b.Property("PushEnabled")
+ .HasColumnType("boolean");
+
+ b.Property("SmsApiKey")
+ .HasMaxLength(200)
+ .HasColumnType("character varying(200)");
+
+ b.Property("SmsEnabled")
+ .HasColumnType("boolean");
+
+ b.Property("SmsSender")
+ .HasMaxLength(30)
+ .HasColumnType("character varying(30)");
+
+ b.Property("SmsTemplate")
+ .HasMaxLength(100)
+ .HasColumnType("character varying(100)");
+
+ b.Property("SocialBaleBotToken")
+ .HasMaxLength(200)
+ .HasColumnType("character varying(200)");
+
+ b.Property("SocialBaleChatId")
+ .HasMaxLength(120)
+ .HasColumnType("character varying(120)");
+
+ b.Property("SocialBaleEnabled")
+ .HasColumnType("boolean");
+
+ b.Property("SocialEnabled")
+ .HasColumnType("boolean");
+
+ b.Property("SocialFooter")
+ .HasMaxLength(1000)
+ .HasColumnType("character varying(1000)");
+
+ b.Property("SocialHeader")
+ .HasMaxLength(1000)
+ .HasColumnType("character varying(1000)");
+
+ b.Property("SocialInstagramEnabled")
+ .HasColumnType("boolean");
+
+ b.Property("SocialLastPostedAt")
+ .HasColumnType("timestamp with time zone");
+
+ b.Property("SocialPostsPerDay")
+ .HasColumnType("integer");
+
+ b.Property("SocialTelegramBotToken")
+ .HasMaxLength(200)
+ .HasColumnType("character varying(200)");
+
+ b.Property("SocialTelegramChatId")
+ .HasMaxLength(120)
+ .HasColumnType("character varying(120)");
+
+ b.Property("SocialTelegramEnabled")
+ .HasColumnType("boolean");
+
+ b.Property("SocialUseProxy")
+ .HasColumnType("boolean");
+
+ b.Property("TelegramChannels")
+ .HasMaxLength(2000)
+ .HasColumnType("character varying(2000)");
+
+ b.Property("TelegramEnabled")
+ .HasColumnType("boolean");
+
+ b.Property("TelegramUseProxy")
+ .HasColumnType("boolean");
+
+ b.Property("UpdatedAt")
+ .HasColumnType("timestamp with time zone");
+
+ b.Property("VapidPrivateKey")
+ .HasMaxLength(200)
+ .HasColumnType("character varying(200)");
+
+ b.Property("VapidPublicKey")
+ .HasMaxLength(200)
+ .HasColumnType("character varying(200)");
+
+ b.Property("VapidSubject")
+ .HasMaxLength(120)
+ .HasColumnType("character varying(120)");
+
+ b.Property("WebNotificationsEnabled")
+ .HasColumnType("boolean");
+
+ b.Property("WebsiteUrls")
+ .HasMaxLength(4000)
+ .HasColumnType("character varying(4000)");
+
+ b.Property("WebsitesEnabled")
+ .HasColumnType("boolean");
+
+ b.Property("WebsitesUseProxy")
+ .HasColumnType("boolean");
+
+ b.HasKey("Id");
+
+ b.ToTable("AppSettings");
+ });
+
+ modelBuilder.Entity("JobsMedical.Web.Models.Application", b =>
+ {
+ b.Property("Id")
+ .ValueGeneratedOnAdd()
+ .HasColumnType("integer");
+
+ NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id"));
+
+ b.Property("CreatedAt")
+ .HasColumnType("timestamp with time zone");
+
+ b.Property("DoctorId")
+ .HasColumnType("integer");
+
+ b.Property("Message")
+ .HasMaxLength(500)
+ .HasColumnType("character varying(500)");
+
+ b.Property("ShiftId")
+ .HasColumnType("integer");
+
+ b.Property("Status")
+ .HasColumnType("integer");
+
+ b.HasKey("Id");
+
+ b.HasIndex("DoctorId");
+
+ b.HasIndex("ShiftId", "DoctorId")
+ .IsUnique();
+
+ b.ToTable("Applications");
+ });
+
+ modelBuilder.Entity("JobsMedical.Web.Models.City", b =>
+ {
+ b.Property("Id")
+ .ValueGeneratedOnAdd()
+ .HasColumnType("integer");
+
+ NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id"));
+
+ b.Property("IsActive")
+ .HasColumnType("boolean");
+
+ b.Property("Name")
+ .IsRequired()
+ .HasMaxLength(100)
+ .HasColumnType("character varying(100)");
+
+ b.Property("Province")
+ .IsRequired()
+ .HasMaxLength(100)
+ .HasColumnType("character varying(100)");
+
+ b.HasKey("Id");
+
+ b.ToTable("Cities");
+ });
+
+ modelBuilder.Entity("JobsMedical.Web.Models.ContactMethod", b =>
+ {
+ b.Property("Id")
+ .ValueGeneratedOnAdd()
+ .HasColumnType("integer");
+
+ NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id"));
+
+ b.Property("JobOpeningId")
+ .HasColumnType("integer");
+
+ b.Property("ShiftId")
+ .HasColumnType("integer");
+
+ b.Property("SortOrder")
+ .HasColumnType("integer");
+
+ b.Property("TalentListingId")
+ .HasColumnType("integer");
+
+ b.Property("Type")
+ .HasColumnType("integer");
+
+ b.Property("Value")
+ .IsRequired()
+ .HasMaxLength(250)
+ .HasColumnType("character varying(250)");
+
+ b.HasKey("Id");
+
+ b.HasIndex("JobOpeningId");
+
+ b.HasIndex("ShiftId");
+
+ b.HasIndex("TalentListingId");
+
+ b.ToTable("ContactMethods");
+ });
+
+ modelBuilder.Entity("JobsMedical.Web.Models.District", b =>
+ {
+ b.Property("Id")
+ .ValueGeneratedOnAdd()
+ .HasColumnType("integer");
+
+ NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id"));
+
+ b.Property("CityId")
+ .HasColumnType("integer");
+
+ b.Property("IsActive")
+ .HasColumnType("boolean");
+
+ b.Property("Name")
+ .IsRequired()
+ .HasMaxLength(120)
+ .HasColumnType("character varying(120)");
+
+ b.HasKey("Id");
+
+ b.HasIndex("CityId");
+
+ b.ToTable("Districts");
+ });
+
+ modelBuilder.Entity("JobsMedical.Web.Models.DoctorProfile", b =>
+ {
+ b.Property("Id")
+ .ValueGeneratedOnAdd()
+ .HasColumnType("integer");
+
+ NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id"));
+
+ b.Property("Bio")
+ .HasMaxLength(1000)
+ .HasColumnType("character varying(1000)");
+
+ b.Property("CityId")
+ .HasColumnType("integer");
+
+ b.Property("IsVerified")
+ .HasColumnType("boolean");
+
+ b.Property("LicenseNo")
+ .HasMaxLength(20)
+ .HasColumnType("character varying(20)");
+
+ b.Property("RoleId")
+ .HasColumnType("integer");
+
+ b.Property("Specialty")
+ .IsRequired()
+ .HasMaxLength(100)
+ .HasColumnType("character varying(100)");
+
+ b.Property("UserId")
+ .HasColumnType("integer");
+
+ b.Property("YearsExperience")
+ .HasColumnType("integer");
+
+ b.HasKey("Id");
+
+ b.HasIndex("CityId");
+
+ b.HasIndex("RoleId");
+
+ b.HasIndex("UserId")
+ .IsUnique();
+
+ b.ToTable("DoctorProfiles");
+ });
+
+ modelBuilder.Entity("JobsMedical.Web.Models.Facility", b =>
+ {
+ b.Property("Id")
+ .ValueGeneratedOnAdd()
+ .HasColumnType("integer");
+
+ NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id"));
+
+ b.Property("Address")
+ .HasMaxLength(500)
+ .HasColumnType("character varying(500)");
+
+ b.Property("BaleId")
+ .HasMaxLength(50)
+ .HasColumnType("character varying(50)");
+
+ b.Property("CityId")
+ .HasColumnType("integer");
+
+ b.Property("CreatedAt")
+ .HasColumnType("timestamp with time zone");
+
+ b.Property("DistrictId")
+ .HasColumnType("integer");
+
+ b.Property("IsDemo")
+ .HasColumnType("boolean");
+
+ b.Property("IsVerified")
+ .HasColumnType("boolean");
+
+ b.Property("Lat")
+ .HasColumnType("double precision");
+
+ b.Property("Lng")
+ .HasColumnType("double precision");
+
+ b.Property("Name")
+ .IsRequired()
+ .HasMaxLength(200)
+ .HasColumnType("character varying(200)");
+
+ b.Property("OwnerUserId")
+ .HasColumnType("integer");
+
+ b.Property("Phone")
+ .HasMaxLength(20)
+ .HasColumnType("character varying(20)");
+
+ b.Property("Type")
+ .HasColumnType("integer");
+
+ b.Property("Verification")
+ .HasColumnType("integer");
+
+ b.Property("VerificationNote")
+ .HasMaxLength(500)
+ .HasColumnType("character varying(500)");
+
+ b.Property("VerificationRequestedAt")
+ .HasColumnType("timestamp with time zone");
+
+ b.HasKey("Id");
+
+ b.HasIndex("CityId");
+
+ b.HasIndex("DistrictId");
+
+ b.HasIndex("OwnerUserId");
+
+ b.ToTable("Facilities");
+ });
+
+ modelBuilder.Entity("JobsMedical.Web.Models.FacilityDocument", b =>
+ {
+ b.Property("Id")
+ .ValueGeneratedOnAdd()
+ .HasColumnType("integer");
+
+ NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id"));
+
+ b.Property("ContentType")
+ .IsRequired()
+ .HasMaxLength(120)
+ .HasColumnType("character varying(120)");
+
+ b.Property("Data")
+ .IsRequired()
+ .HasColumnType("bytea");
+
+ b.Property("FacilityId")
+ .HasColumnType("integer");
+
+ b.Property("FileName")
+ .IsRequired()
+ .HasMaxLength(200)
+ .HasColumnType("character varying(200)");
+
+ b.Property("Size")
+ .HasColumnType("bigint");
+
+ b.Property("UploadedAt")
+ .HasColumnType("timestamp with time zone");
+
+ b.HasKey("Id");
+
+ b.HasIndex("FacilityId");
+
+ b.ToTable("FacilityDocuments");
+ });
+
+ modelBuilder.Entity("JobsMedical.Web.Models.IngestionRun", b =>
+ {
+ b.Property("Id")
+ .ValueGeneratedOnAdd()
+ .HasColumnType("integer");
+
+ NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id"));
+
+ b.Property("Detail")
+ .HasMaxLength(2000)
+ .HasColumnType("character varying(2000)");
+
+ b.Property("Duplicates")
+ .HasColumnType("integer");
+
+ b.Property("Fetched")
+ .HasColumnType("integer");
+
+ b.Property("Flagged")
+ .HasColumnType("integer");
+
+ b.Property("Published")
+ .HasColumnType("integer");
+
+ b.Property("Queued")
+ .HasColumnType("integer");
+
+ b.Property("RunAt")
+ .HasColumnType("timestamp with time zone");
+
+ b.Property("Spam")
+ .HasColumnType("integer");
+
+ b.HasKey("Id");
+
+ b.ToTable("IngestionRuns");
+ });
+
+ modelBuilder.Entity("JobsMedical.Web.Models.InterestEvent", b =>
+ {
+ b.Property("Id")
+ .ValueGeneratedOnAdd()
+ .HasColumnType("bigint");
+
+ NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id"));
+
+ b.Property("CreatedAt")
+ .HasColumnType("timestamp with time zone");
+
+ b.Property("EventType")
+ .HasColumnType("integer");
+
+ b.Property("JobOpeningId")
+ .HasColumnType("integer");
+
+ b.Property("ShiftId")
+ .HasColumnType("integer");
+
+ b.Property("Status")
+ .HasColumnType("integer");
+
+ b.Property("VisitorId")
+ .IsRequired()
+ .HasColumnType("character varying(36)");
+
+ b.HasKey("Id");
+
+ b.HasIndex("JobOpeningId");
+
+ b.HasIndex("ShiftId");
+
+ b.HasIndex("VisitorId", "CreatedAt");
+
+ b.ToTable("InterestEvents");
+ });
+
+ modelBuilder.Entity("JobsMedical.Web.Models.JobAlert", b =>
+ {
+ b.Property("Id")
+ .ValueGeneratedOnAdd()
+ .HasColumnType("integer");
+
+ NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id"));
+
+ b.Property("CityId")
+ .HasColumnType("integer");
+
+ b.Property("CreatedAt")
+ .HasColumnType("timestamp with time zone");
+
+ b.Property("DistrictId")
+ .HasColumnType("integer");
+
+ b.Property("EmploymentType")
+ .HasColumnType("integer");
+
+ b.Property("IsActive")
+ .HasColumnType("boolean");
+
+ b.Property("Label")
+ .HasMaxLength(120)
+ .HasColumnType("character varying(120)");
+
+ b.Property("MinPay")
+ .HasColumnType("bigint");
+
+ b.Property("RoleId")
+ .HasColumnType("integer");
+
+ b.Property("Scope")
+ .HasColumnType("integer");
+
+ b.Property("ShiftType")
+ .HasColumnType("integer");
+
+ b.Property("UserId")
+ .HasColumnType("integer");
+
+ b.HasKey("Id");
+
+ b.HasIndex("CityId");
+
+ b.HasIndex("IsActive");
+
+ b.HasIndex("RoleId");
+
+ b.HasIndex("UserId");
+
+ b.ToTable("JobAlerts");
+ });
+
+ modelBuilder.Entity("JobsMedical.Web.Models.JobOpening", b =>
+ {
+ b.Property("Id")
+ .ValueGeneratedOnAdd()
+ .HasColumnType("integer");
+
+ NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id"));
+
+ b.Property("CreatedAt")
+ .HasColumnType("timestamp with time zone");
+
+ b.Property("Description")
+ .HasMaxLength(2000)
+ .HasColumnType("character varying(2000)");
+
+ b.Property("EmploymentType")
+ .HasColumnType("integer");
+
+ b.Property("FacilityId")
+ .HasColumnType("integer");
+
+ b.Property("GenderRequirement")
+ .HasColumnType("integer");
+
+ b.Property("Lat")
+ .HasColumnType("double precision");
+
+ b.Property("Lng")
+ .HasColumnType("double precision");
+
+ b.Property("Requirements")
+ .HasMaxLength(1000)
+ .HasColumnType("character varying(1000)");
+
+ b.Property("RoleId")
+ .HasColumnType("integer");
+
+ b.Property("SalaryMax")
+ .HasColumnType("bigint");
+
+ b.Property("SalaryMin")
+ .HasColumnType("bigint");
+
+ b.Property("Source")
+ .HasColumnType("integer");
+
+ b.Property("SourceUrl")
+ .HasMaxLength(500)
+ .HasColumnType("character varying(500)");
+
+ b.Property("Status")
+ .HasColumnType("integer");
+
+ b.Property("Title")
+ .IsRequired()
+ .HasMaxLength(200)
+ .HasColumnType("character varying(200)");
+
+ b.HasKey("Id");
+
+ b.HasIndex("FacilityId");
+
+ b.HasIndex("RoleId");
+
+ b.HasIndex("Status");
+
+ b.ToTable("JobOpenings");
+ });
+
+ modelBuilder.Entity("JobsMedical.Web.Models.Notification", b =>
+ {
+ b.Property("Id")
+ .ValueGeneratedOnAdd()
+ .HasColumnType("bigint");
+
+ NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id"));
+
+ b.Property("Body")
+ .HasMaxLength(500)
+ .HasColumnType("character varying(500)");
+
+ b.Property("CreatedAt")
+ .HasColumnType("timestamp with time zone");
+
+ b.Property("IsRead")
+ .HasColumnType("boolean");
+
+ b.Property("Title")
+ .IsRequired()
+ .HasMaxLength(200)
+ .HasColumnType("character varying(200)");
+
+ b.Property("Url")
+ .HasMaxLength(300)
+ .HasColumnType("character varying(300)");
+
+ b.Property("UserId")
+ .HasColumnType("integer");
+
+ b.HasKey("Id");
+
+ b.HasIndex("UserId", "IsRead", "CreatedAt");
+
+ b.ToTable("Notifications");
+ });
+
+ modelBuilder.Entity("JobsMedical.Web.Models.RawListing", b =>
+ {
+ b.Property("Id")
+ .ValueGeneratedOnAdd()
+ .HasColumnType("integer");
+
+ NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id"));
+
+ b.Property("Confidence")
+ .HasColumnType("integer");
+
+ b.Property("ContentHash")
+ .HasMaxLength(64)
+ .HasColumnType("character varying(64)");
+
+ b.Property("FetchedAt")
+ .HasColumnType("timestamp with time zone");
+
+ b.Property("Lat")
+ .HasColumnType("double precision");
+
+ b.Property("LinkedShiftId")
+ .HasColumnType("integer");
+
+ b.Property("LinkedTalentId")
+ .HasColumnType("integer");
+
+ b.Property("Lng")
+ .HasColumnType("double precision");
+
+ b.Property("ParsedJson")
+ .HasColumnType("text");
+
+ b.Property("RawText")
+ .IsRequired()
+ .HasColumnType("text");
+
+ b.Property("SourceChannel")
+ .IsRequired()
+ .HasMaxLength(200)
+ .HasColumnType("character varying(200)");
+
+ b.Property("SourceUrl")
+ .HasMaxLength(500)
+ .HasColumnType("character varying(500)");
+
+ b.Property("Status")
+ .HasColumnType("integer");
+
+ b.Property("ValidationNotes")
+ .HasMaxLength(1000)
+ .HasColumnType("character varying(1000)");
+
+ b.HasKey("Id");
+
+ b.HasIndex("ContentHash");
+
+ b.HasIndex("LinkedShiftId");
+
+ b.HasIndex("LinkedTalentId");
+
+ b.HasIndex("Status");
+
+ b.ToTable("RawListings");
+ });
+
+ modelBuilder.Entity("JobsMedical.Web.Models.Report", b =>
+ {
+ b.Property("Id")
+ .ValueGeneratedOnAdd()
+ .HasColumnType("integer");
+
+ NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id"));
+
+ b.Property("CreatedAt")
+ .HasColumnType("timestamp with time zone");
+
+ b.Property("Reason")
+ .IsRequired()
+ .HasMaxLength(500)
+ .HasColumnType("character varying(500)");
+
+ b.Property("ReporterUserId")
+ .HasColumnType("integer");
+
+ b.Property("ReporterVisitorId")
+ .HasMaxLength(36)
+ .HasColumnType("character varying(36)");
+
+ b.Property("Status")
+ .HasColumnType("integer");
+
+ b.Property("TargetId")
+ .HasColumnType("integer");
+
+ b.Property("TargetLabel")
+ .HasMaxLength(160)
+ .HasColumnType("character varying(160)");
+
+ b.Property("TargetType")
+ .HasColumnType("integer");
+
+ b.HasKey("Id");
+
+ b.HasIndex("Status");
+
+ b.ToTable("Reports");
+ });
+
+ modelBuilder.Entity("JobsMedical.Web.Models.Review", b =>
+ {
+ b.Property("Id")
+ .ValueGeneratedOnAdd()
+ .HasColumnType("integer");
+
+ NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id"));
+
+ b.Property("Comment")
+ .HasMaxLength(1000)
+ .HasColumnType("character varying(1000)");
+
+ b.Property("CreatedAt")
+ .HasColumnType("timestamp with time zone");
+
+ b.Property("FacilityId")
+ .HasColumnType("integer");
+
+ b.Property("IsApproved")
+ .HasColumnType("boolean");
+
+ b.Property("Stars")
+ .HasColumnType("integer");
+
+ b.Property("UserId")
+ .HasColumnType("integer");
+
+ b.HasKey("Id");
+
+ b.HasIndex("UserId");
+
+ b.HasIndex("FacilityId", "UserId")
+ .IsUnique();
+
+ b.ToTable("Reviews");
+ });
+
+ modelBuilder.Entity("JobsMedical.Web.Models.Role", b =>
+ {
+ b.Property("Id")
+ .ValueGeneratedOnAdd()
+ .HasColumnType("integer");
+
+ NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id"));
+
+ b.Property("Category")
+ .IsRequired()
+ .HasMaxLength(50)
+ .HasColumnType("character varying(50)");
+
+ b.Property("IsActive")
+ .HasColumnType("boolean");
+
+ b.Property("Name")
+ .IsRequired()
+ .HasMaxLength(100)
+ .HasColumnType("character varying(100)");
+
+ b.Property("SortOrder")
+ .HasColumnType("integer");
+
+ b.HasKey("Id");
+
+ b.ToTable("Roles");
+ });
+
+ modelBuilder.Entity("JobsMedical.Web.Models.Shift", b =>
+ {
+ b.Property("Id")
+ .ValueGeneratedOnAdd()
+ .HasColumnType("integer");
+
+ NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id"));
+
+ b.Property("CreatedAt")
+ .HasColumnType("timestamp with time zone");
+
+ b.Property("Date")
+ .HasColumnType("date");
+
+ b.Property("Description")
+ .HasMaxLength(1500)
+ .HasColumnType("character varying(1500)");
+
+ b.Property("EndTime")
+ .HasColumnType("time without time zone");
+
+ b.Property("FacilityId")
+ .HasColumnType("integer");
+
+ b.Property("GenderRequirement")
+ .HasColumnType("integer");
+
+ b.Property("Lat")
+ .HasColumnType("double precision");
+
+ b.Property("Lng")
+ .HasColumnType("double precision");
+
+ b.Property("PayAmount")
+ .HasColumnType("bigint");
+
+ b.Property("PayType")
+ .HasColumnType("integer");
+
+ b.Property("RoleId")
+ .HasColumnType("integer");
+
+ b.Property("SharePercent")
+ .HasColumnType("integer");
+
+ b.Property("ShiftType")
+ .HasColumnType("integer");
+
+ b.Property("Source")
+ .HasColumnType("integer");
+
+ b.Property("SourceUrl")
+ .HasMaxLength(500)
+ .HasColumnType("character varying(500)");
+
+ b.Property("SpecialtyRequired")
+ .IsRequired()
+ .HasMaxLength(100)
+ .HasColumnType("character varying(100)");
+
+ b.Property("StartTime")
+ .HasColumnType("time without time zone");
+
+ b.Property("Status")
+ .HasColumnType("integer");
+
+ b.HasKey("Id");
+
+ b.HasIndex("FacilityId");
+
+ b.HasIndex("RoleId");
+
+ b.HasIndex("Date", "Status");
+
+ b.ToTable("Shifts");
+ });
+
+ modelBuilder.Entity("JobsMedical.Web.Models.TalentListing", b =>
+ {
+ b.Property("Id")
+ .ValueGeneratedOnAdd()
+ .HasColumnType("integer");
+
+ NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id"));
+
+ b.Property("AreaNote")
+ .HasMaxLength(150)
+ .HasColumnType("character varying(150)");
+
+ b.Property("Availability")
+ .HasColumnType("integer");
+
+ b.Property("CityId")
+ .HasColumnType("integer");
+
+ b.Property("CreatedAt")
+ .HasColumnType("timestamp with time zone");
+
+ b.Property("Description")
+ .HasMaxLength(2000)
+ .HasColumnType("character varying(2000)");
+
+ b.Property("DistrictId")
+ .HasColumnType("integer");
+
+ b.Property("Gender")
+ .HasColumnType("integer");
+
+ b.Property("IsLicensed")
+ .HasColumnType("boolean");
+
+ b.Property("Lat")
+ .HasColumnType("double precision");
+
+ b.Property("Lng")
+ .HasColumnType("double precision");
+
+ b.Property("PayAmount")
+ .HasColumnType("bigint");
+
+ b.Property("PayType")
+ .HasColumnType("integer");
+
+ b.Property("PersonName")
+ .HasMaxLength(150)
+ .HasColumnType("character varying(150)");
+
+ b.Property