From 8d4b89d8d7d3d6e5be71deabb8b05026e8ec13c7 Mon Sep 17 00:00:00 2001 From: itzandroidtab Date: Sun, 24 Aug 2025 02:07:51 +0200 Subject: [PATCH 1/5] Added a option to turn off metadata fetch for existing parts for organisation --- .../ClientApp/src/pages/Inventory.js | 31 ++++++++++--------- .../ClientApp/src/pages/Settings.js | 27 ++++++++++++++-- .../Binner.Web/Controllers/PartController.cs | 12 ++++++- .../OrganizationConfiguration.cs | 5 +++ .../OrganizationConfiguration.cs | 5 +++ .../Binner.Model/Requests/SettingsRequest.cs | 5 +++ .../Responses/SettingsResponse.cs | 5 +++ .../OrganizationConfigurationProfile.cs | 2 ++ .../MappingProfiles/SettingsRequestProfile.cs | 3 ++ .../SettingsResponseProfile.cs | 8 +++++ 10 files changed, 86 insertions(+), 17 deletions(-) diff --git a/Binner/Binner.Web/ClientApp/src/pages/Inventory.js b/Binner/Binner.Web/ClientApp/src/pages/Inventory.js index b584a06a..415a8542 100644 --- a/Binner/Binner.Web/ClientApp/src/pages/Inventory.js +++ b/Binner/Binner.Web/ClientApp/src/pages/Inventory.js @@ -192,6 +192,9 @@ export function Inventory({ partNumber = "", ...rest }) { const [confirmReImport, setConfirmReImport] = useState(false); const [confirmReImportAction, setConfirmReImportAction] = useState(null); + // check if we are on the add page + const isAddPage = location.pathname === "/inventory/add"; + let blocker = useBlocker( ({ currentLocation, nextLocation }) => isDirty && currentLocation.pathname !== nextLocation.pathname @@ -242,8 +245,8 @@ export function Inventory({ partNumber = "", ...rest }) { setLoadingPartMetadata(false); } else if (rest.params.partNumberToAdd) { // a part number to add is specified in the URL path - const { data } = await doFetchPartMetadata(rest.params.partNumberToAdd, partToSearch, false); - processPartMetadataResponse(data, partToSearch.storedFiles, true, true); + const { data, responseCode } = await doFetchPartMetadata(rest.params.partNumberToAdd, partToSearch, false); + processPartMetadataResponse(data, partToSearch.storedFiles, true, true, responseCode); setLoadingPartMetadata(false); setIsDirty(true); } else { @@ -253,8 +256,8 @@ export function Inventory({ partNumber = "", ...rest }) { } else { // fetch part metadata, don't allow overwriting of fields that have already been entered setLoadingPartMetadata(true); - const { data } = await doFetchPartMetadata(targetPart.partNumber, partToSearch, false); - processPartMetadataResponse(data, partToSearch.storedFiles, true, false); // false, don't overwrite entered fields + const { data, responseCode } = await doFetchPartMetadata(targetPart.partNumber, partToSearch, false); + processPartMetadataResponse(data, partToSearch.storedFiles, true, false, responseCode); // false, don't overwrite entered fields setLoadingPartMetadata(false); setIsDirty(true); } @@ -295,7 +298,7 @@ export function Inventory({ partNumber = "", ...rest }) { setPartMetadataErrors([]); try { const includeInventorySearch = !pageHasParameters; - const { data, existsInInventory, inventoryPart } = await doFetchPartMetadata(input, localPart, includeInventorySearch); + const { data, existsInInventory, inventoryPart, responseCode } = await doFetchPartMetadata(input, localPart, includeInventorySearch); if (existsInInventory) { setPartExistsInInventory(true); setSuggestedPartNumber(inventoryPart); @@ -304,7 +307,7 @@ export function Inventory({ partNumber = "", ...rest }) { setSuggestedPartNumber(null); } - processPartMetadataResponse(data, localPart.storedFiles, !pageHasParameters, true); + processPartMetadataResponse(data, localPart.storedFiles, !pageHasParameters, true, responseCode); setLoadingPartMetadata(false); return { part: localPart, exists: existsInInventory }; } catch (ex) { @@ -462,7 +465,7 @@ export function Inventory({ partNumber = "", ...rest }) { return entity; }, []); - const processPartMetadataResponse = useCallback((data, storedFiles, allowSetFromMetadata, allowOverwrite) => { + const processPartMetadataResponse = useCallback((data, storedFiles, allowSetFromMetadata, allowOverwrite, responseCode) => { // cancelled or auth required if (!data) { setLoadingPartMetadata(false); @@ -484,7 +487,7 @@ export function Inventory({ partNumber = "", ...rest }) { if (allowSetFromMetadata) { updatedPart = setPartFromMetadata(metadataParts, { ...suggestedPart, quantity: -1 }, allowOverwrite); } - } else { + } else if (responseCode !== 204) { // no part metadata available setPartMetadataIsSubscribed(true); } @@ -511,7 +514,7 @@ export function Inventory({ partNumber = "", ...rest }) { Inventory.doFetchPartMetadataController?.abort(); Inventory.doFetchPartMetadataController = new AbortController(); try { - const response = await fetchApi(`/api/part/info?partNumber=${encodeURIComponent(partNumber.trim())}&partTypeId=${part.partTypeId}&mountingTypeId=${part.mountingTypeId}&supplierPartNumbers=digikey:${part.digiKeyPartNumber || ""},mouser:${part.mouserPartNumber || ""},arrow:${part.arrowPartNumber},tme:${part.tmePartNumber}`, { + const response = await fetchApi(`/api/part/info?newPart=${isAddPage}&partNumber=${encodeURIComponent(partNumber.trim())}&partTypeId=${part.partTypeId}&mountingTypeId=${part.mountingTypeId}&supplierPartNumbers=digikey:${part.digiKeyPartNumber || ""},mouser:${part.mouserPartNumber || ""},arrow:${part.arrowPartNumber},tme:${part.tmePartNumber}`, { signal: Inventory.doFetchPartMetadataController.signal }); const data = response.data; @@ -541,7 +544,7 @@ export function Inventory({ partNumber = "", ...rest }) { } // let caller handle errors - return { data, existsInInventory, inventoryPart: existingInventoryPartNumber }; + return { data, existsInInventory, inventoryPart: existingInventoryPartNumber, responseCode: response.responseObject.status }; } catch (ex) { if (ex?.name === "AbortError") { @@ -832,8 +835,8 @@ export function Inventory({ partNumber = "", ...rest }) { // part is not in inventory, add it as new setLoadingPartMetadata(true); - const { data } = await doFetchPartMetadata(cleanPartNumber, part, false); - const metaResult = processPartMetadataResponse(data, part.storedFiles, true, true); + const { data, responseCode} = await doFetchPartMetadata(cleanPartNumber, part, false); + const metaResult = processPartMetadataResponse(data, part.storedFiles, true, true, responseCode); setLoadingPartMetadata(false); setIsDirty(true); @@ -1442,8 +1445,8 @@ export function Inventory({ partNumber = "", ...rest }) { e.stopPropagation(); setLoadingPartMetadata(true); setConfirmRefreshPartIsOpen(false); - const { data } = await doFetchPartMetadata(inputPartNumber, part, false); - processPartMetadataResponse(data, part.storedFiles, true, true); + const { data, responseCode } = await doFetchPartMetadata(inputPartNumber, part, false); + processPartMetadataResponse(data, part.storedFiles, true, true, responseCode); setLoadingPartMetadata(false); setIsDirty(true); if (confirmRefreshPartDoNotAskAgain) { diff --git a/Binner/Binner.Web/ClientApp/src/pages/Settings.js b/Binner/Binner.Web/ClientApp/src/pages/Settings.js index 4a83fa51..fbce999e 100644 --- a/Binner/Binner.Web/ClientApp/src/pages/Settings.js +++ b/Binner/Binner.Web/ClientApp/src/pages/Settings.js @@ -104,6 +104,7 @@ export const Settings = () => { enableAutoPartSearch: true, enableDarkMode: false, enableCheckNewVersion: true, + allowPartMetadataFetchForExistingParts: true, }); const [integrationSettings, setIntegrationSettings] = useState({ binner: { @@ -187,10 +188,10 @@ export const Settings = () => { const { data } = response; setLoading(false); // break out data into multiple state variables to optimize render performance - const { licenseKey, maxCacheItems, cacheAbsoluteExpirationMinutes, cacheSlidingExpirationMinutes, enableAutoPartSearch, enableDarkMode, enableCheckNewVersion } = data; + const { licenseKey, maxCacheItems, cacheAbsoluteExpirationMinutes, cacheSlidingExpirationMinutes, enableAutoPartSearch, enableDarkMode, enableCheckNewVersion, allowPartMetadataFetchForExistingParts } = data; const language = data.locale.language; const currency = data.locale.currency; - setGlobalSettings({ licenseKey, language, currency, maxCacheItems, cacheAbsoluteExpirationMinutes, cacheSlidingExpirationMinutes, enableAutoPartSearch, enableDarkMode, enableCheckNewVersion }); + setGlobalSettings({ licenseKey, language, currency, maxCacheItems, cacheAbsoluteExpirationMinutes, cacheSlidingExpirationMinutes, enableAutoPartSearch, enableDarkMode, enableCheckNewVersion, allowPartMetadataFetchForExistingParts }); const { binner, digikey, mouser, arrow, octopart, tme } = data; setIntegrationSettings({ binner, digikey, mouser, arrow, octopart, tme }); setPrinterSettings({ printer: data.printer }); @@ -869,6 +870,28 @@ export const Settings = () => { } /> + + + + + Select this option to allow using the part search APIs to fetch metadata for existing parts in your inventory. + } + trigger={ + handleChange(e, control, 'global')} + /> + } + /> + ); diff --git a/Binner/Binner.Web/Controllers/PartController.cs b/Binner/Binner.Web/Controllers/PartController.cs index 02c79f6c..63246f3b 100644 --- a/Binner/Binner.Web/Controllers/PartController.cs +++ b/Binner/Binner.Web/Controllers/PartController.cs @@ -637,8 +637,18 @@ public async Task GetLowStockAsync([FromQuery] PaginatedRequest r /// List of supplier part numbers if known, in the format: 'suppliername:partnumber,suppliername2:partnumber' /// [HttpGet("info")] - public async Task GetPartInfoAsync([FromQuery] string partNumber, [FromQuery] string partTypeId = "", [FromQuery] string mountingTypeId = "", [FromQuery] string supplierPartNumbers = "") + public async Task GetPartInfoAsync([FromQuery] string partNumber, [FromQuery] string partTypeId = "", [FromQuery] string mountingTypeId = "", [FromQuery] string supplierPartNumbers = "", [FromQuery] bool? newPart = true) { + // get the organization configuration + var organisationConfig = await _userConfigurationService.GetOrganizationConfigurationAsync(); + + // check the settings if we need to skip non new part search requests + if (newPart != null && newPart == false && organisationConfig.AllowPartMetadataFetchForExistingParts == false) + { + // check if we should skip this request + return StatusCode(StatusCodes.Status204NoContent); + } + try { var partType = partTypeId; diff --git a/Binner/Data/Binner.Data.Model/OrganizationConfiguration.cs b/Binner/Data/Binner.Data.Model/OrganizationConfiguration.cs index d032847c..89cb0df0 100644 --- a/Binner/Data/Binner.Data.Model/OrganizationConfiguration.cs +++ b/Binner/Data/Binner.Data.Model/OrganizationConfiguration.cs @@ -51,6 +51,11 @@ public class OrganizationConfiguration : IEntity /// public string? KiCadSettingsJson { get; set; } + /// + /// If true, allows fetching part metadata for parts that already exist in inventory + /// + public bool AllowPartMetadataFetchForExistingParts { get; set; } = true; + /// /// Creation date /// diff --git a/Binner/Library/Binner.Model/Configuration/OrganizationConfiguration.cs b/Binner/Library/Binner.Model/Configuration/OrganizationConfiguration.cs index bc678989..0ff66c34 100644 --- a/Binner/Library/Binner.Model/Configuration/OrganizationConfiguration.cs +++ b/Binner/Library/Binner.Model/Configuration/OrganizationConfiguration.cs @@ -30,5 +30,10 @@ public class OrganizationConfiguration public int CacheAbsoluteExpirationMinutes { get; set; } = 0; public KiCadSettings KiCad { get; set; } = new (); + + /// + /// If true, allows fetching part metadata for parts that already exist in inventory + /// + public bool AllowPartMetadataFetchForExistingParts { get; set; } = true; } } diff --git a/Binner/Library/Binner.Model/Requests/SettingsRequest.cs b/Binner/Library/Binner.Model/Requests/SettingsRequest.cs index c002c37b..710a5606 100644 --- a/Binner/Library/Binner.Model/Requests/SettingsRequest.cs +++ b/Binner/Library/Binner.Model/Requests/SettingsRequest.cs @@ -102,5 +102,10 @@ public class SettingsRequest /// Absolute cache expiration in minutes (0 = never) /// public int CacheAbsoluteExpirationMinutes { get; set; } = 0; + + /// + /// If true, allows fetching part metadata for parts that already exist in inventory + /// + public bool AllowPartMetadataFetchForExistingParts { get; set; } = true; } } diff --git a/Binner/Library/Binner.Model/Responses/SettingsResponse.cs b/Binner/Library/Binner.Model/Responses/SettingsResponse.cs index a1c5959e..9479cc0b 100644 --- a/Binner/Library/Binner.Model/Responses/SettingsResponse.cs +++ b/Binner/Library/Binner.Model/Responses/SettingsResponse.cs @@ -100,5 +100,10 @@ public class SettingsResponse /// True to enable checking for new versions of Binner /// public bool EnableCheckNewVersion { get; set; } = true; + + /// + /// If true, allows fetching part metadata for parts that already exist in inventory + /// + public bool AllowPartMetadataFetchForExistingParts { get; set; } = true; } } diff --git a/Binner/Library/Binner.Services/MappingProfiles/ModelCommon/OrganizationConfigurationProfile.cs b/Binner/Library/Binner.Services/MappingProfiles/ModelCommon/OrganizationConfigurationProfile.cs index 4b518a1d..4e2f2f4b 100644 --- a/Binner/Library/Binner.Services/MappingProfiles/ModelCommon/OrganizationConfigurationProfile.cs +++ b/Binner/Library/Binner.Services/MappingProfiles/ModelCommon/OrganizationConfigurationProfile.cs @@ -17,6 +17,7 @@ public OrganizationConfigurationProfile() .ForMember(x => x.CacheSlidingExpirationMinutes, options => options.MapFrom(x => x.CacheSlidingExpirationMinutes)) .ForMember(x => x.CacheAbsoluteExpirationMinutes, options => options.MapFrom(x => x.CacheAbsoluteExpirationMinutes)) .ForMember(x => x.KiCad, options => options.MapFrom(x => string.IsNullOrEmpty(x.KiCadSettingsJson) ? new KiCadSettings() : JsonConvert.DeserializeObject(x.KiCadSettingsJson))) + .ForMember(x => x.AllowPartMetadataFetchForExistingParts, options => options.MapFrom(x => x.AllowPartMetadataFetchForExistingParts)) ; CreateMap() @@ -26,6 +27,7 @@ public OrganizationConfigurationProfile() .ForMember(x => x.CacheSlidingExpirationMinutes, options => options.MapFrom(x => x.CacheSlidingExpirationMinutes)) .ForMember(x => x.CacheAbsoluteExpirationMinutes, options => options.MapFrom(x => x.CacheAbsoluteExpirationMinutes)) .ForMember(x => x.KiCadSettingsJson, options => options.MapFrom(x => JsonConvert.SerializeObject(x.KiCad))) + .ForMember(x => x.AllowPartMetadataFetchForExistingParts, options => options.MapFrom(x => x.AllowPartMetadataFetchForExistingParts)) .ForMember(x => x.DateCreatedUtc, options => options.Ignore()) .ForMember(x => x.DateModifiedUtc, options => options.Ignore()) diff --git a/Binner/Library/Binner.Services/MappingProfiles/SettingsRequestProfile.cs b/Binner/Library/Binner.Services/MappingProfiles/SettingsRequestProfile.cs index ca1d3f81..7a1f0693 100644 --- a/Binner/Library/Binner.Services/MappingProfiles/SettingsRequestProfile.cs +++ b/Binner/Library/Binner.Services/MappingProfiles/SettingsRequestProfile.cs @@ -33,6 +33,7 @@ public SettingsRequestProfile() .ForMember(x => x.EnableAutoPartSearch, options => options.Ignore()) .ForMember(x => x.EnableDarkMode, options => options.Ignore()) .ForMember(x => x.EnableCheckNewVersion, options => options.Ignore()) + .ForMember(x => x.AllowPartMetadataFetchForExistingParts, options => options.Ignore()) .ReverseMap(); CreateMap(MemberList.None) @@ -137,6 +138,7 @@ public SettingsRequestProfile() .ForMember(x => x.MaxCacheItems, options => options.MapFrom(x => x.MaxCacheItems)) .ForMember(x => x.UseModule, options => options.MapFrom(x => x.UseModule)) .ForMember(x => x.KiCad, options => options.MapFrom(x => x.KiCad)) + .ForMember(x => x.AllowPartMetadataFetchForExistingParts, options => options.MapFrom(x => x.AllowPartMetadataFetchForExistingParts)) ; CreateMap() @@ -146,6 +148,7 @@ public SettingsRequestProfile() .ForMember(x => x.MaxCacheItems, options => options.MapFrom(x => x.MaxCacheItems)) .ForMember(x => x.UseModule, options => options.MapFrom(x => x.UseModule)) .ForMember(x => x.KiCad, options => options.MapFrom(x => x.KiCad)) + .ForMember(x => x.AllowPartMetadataFetchForExistingParts, options => options.MapFrom(x => x.AllowPartMetadataFetchForExistingParts)) .ForMember(x => x.Octopart, options => options.Ignore()) .ForMember(x => x.Digikey, options => options.Ignore()) diff --git a/Binner/Library/Binner.Services/MappingProfiles/SettingsResponseProfile.cs b/Binner/Library/Binner.Services/MappingProfiles/SettingsResponseProfile.cs index 4ee11536..5529339a 100644 --- a/Binner/Library/Binner.Services/MappingProfiles/SettingsResponseProfile.cs +++ b/Binner/Library/Binner.Services/MappingProfiles/SettingsResponseProfile.cs @@ -33,6 +33,7 @@ public SettingsResponseProfile() .ForMember(x => x.Printer, options => options.Ignore()) .ForMember(x => x.Barcode, options => options.Ignore()) .ForMember(x => x.KiCad, options => options.Ignore()) + .ForMember(x => x.AllowPartMetadataFetchForExistingParts, options => options.Ignore()) .ReverseMap(); CreateMap() @@ -44,6 +45,7 @@ public SettingsResponseProfile() .ForMember(x => x.Tme, options => options.Ignore()) .ForMember(x => x.Barcode, options => options.Ignore()) .ForMember(x => x.KiCad, options => options.Ignore()) + .ForMember(x => x.AllowPartMetadataFetchForExistingParts, options => options.Ignore()) .ForMember(x => x.UseModule, options => options.Ignore()) .ForMember(x => x.LicenseKey, options => options.Ignore()) .ForMember(x => x.MaxCacheItems, options => options.Ignore()) @@ -94,6 +96,7 @@ public SettingsResponseProfile() .ForMember(x => x.CustomFields, options => options.Ignore()) .ForMember(x => x.Printer, options => options.Ignore()) .ForMember(x => x.KiCad, options => options.Ignore()) + .ForMember(x => x.AllowPartMetadataFetchForExistingParts, options => options.Ignore()) .ReverseMap(); CreateMap() @@ -102,6 +105,7 @@ public SettingsResponseProfile() .ForMember(x => x.CacheSlidingExpirationMinutes, options => options.MapFrom(x => x.CacheSlidingExpirationMinutes)) .ForMember(x => x.CacheAbsoluteExpirationMinutes, options => options.MapFrom(x => x.CacheAbsoluteExpirationMinutes)) .ForMember(x => x.KiCad, options => options.MapFrom(x => x.KiCad)) + .ForMember(x => x.AllowPartMetadataFetchForExistingParts, options => options.MapFrom(x => x.AllowPartMetadataFetchForExistingParts)) .ForMember(x => x.UseModule, options => options.Ignore()) .ForMember(x => x.EnableAutoPartSearch, options => options.Ignore()) @@ -139,6 +143,7 @@ public SettingsResponseProfile() .ForMember(x => x.CacheAbsoluteExpirationMinutes, options => options.Ignore()) .ForMember(x => x.CustomFields, options => options.Ignore()) .ForMember(x => x.KiCad, options => options.Ignore()) + .ForMember(x => x.AllowPartMetadataFetchForExistingParts, options => options.Ignore()) .ForMember(x => x.Printer, options => options.MapFrom(x => new PrinterSettingsResponse { @@ -185,6 +190,7 @@ public SettingsResponseProfile() .ForMember(x => x.Printer, options => options.Ignore()) .ForMember(x => x.Locale, options => options.Ignore()) .ForMember(x => x.KiCad, options => options.Ignore()) + .ForMember(x => x.AllowPartMetadataFetchForExistingParts, options => options.Ignore()) .ForMember(x => x.Barcode, options => options.MapFrom(x => new BarcodeSettingsResponse { @@ -257,6 +263,7 @@ public SettingsResponseProfile() .ForMember(x => x.CacheAbsoluteExpirationMinutes, options => options.Ignore()) .ForMember(x => x.CustomFields, options => options.Ignore()) .ForMember(x => x.KiCad, options => options.Ignore()) + .ForMember(x => x.AllowPartMetadataFetchForExistingParts, options => options.Ignore()) .ReverseMap(); CreateMap() @@ -319,6 +326,7 @@ public SettingsResponseProfile() .ForMember(x => x.CacheAbsoluteExpirationMinutes, options => options.Ignore()) .ForMember(x => x.CustomFields, options => options.Ignore()) .ForMember(x => x.KiCad, options => options.Ignore()) + .ForMember(x => x.AllowPartMetadataFetchForExistingParts, options => options.Ignore()) .ReverseMap(); CreateMap() From 24b64c6af6c8cb730fd4700456ff0ae83a0b820c Mon Sep 17 00:00:00 2001 From: itzandroidtab Date: Sun, 24 Aug 2025 02:15:17 +0200 Subject: [PATCH 2/5] Added missing usings for building on latest master --- Binner/Binner.Web/Controllers/PartTypeController.cs | 2 ++ 1 file changed, 2 insertions(+) diff --git a/Binner/Binner.Web/Controllers/PartTypeController.cs b/Binner/Binner.Web/Controllers/PartTypeController.cs index fe7a75e8..2f1b02ca 100644 --- a/Binner/Binner.Web/Controllers/PartTypeController.cs +++ b/Binner/Binner.Web/Controllers/PartTypeController.cs @@ -12,6 +12,8 @@ using System.Linq; using System.Net.Mime; using System.Threading.Tasks; +using Microsoft.AspNetCore.Authorization; +using Microsoft.AspNetCore.Authentication.JwtBearer; namespace Binner.Web.Controllers { From 6421314bd68e88c2eddef67e5fcb700d896f948b Mon Sep 17 00:00:00 2001 From: itzandroidtab Date: Sun, 24 Aug 2025 15:08:00 +0200 Subject: [PATCH 3/5] bugfix inventory "refresh" button not working --- .../Binner.Web/ClientApp/src/pages/Inventory.js | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/Binner/Binner.Web/ClientApp/src/pages/Inventory.js b/Binner/Binner.Web/ClientApp/src/pages/Inventory.js index 415a8542..4ed6ab12 100644 --- a/Binner/Binner.Web/ClientApp/src/pages/Inventory.js +++ b/Binner/Binner.Web/ClientApp/src/pages/Inventory.js @@ -193,7 +193,7 @@ export function Inventory({ partNumber = "", ...rest }) { const [confirmReImportAction, setConfirmReImportAction] = useState(null); // check if we are on the add page - const isAddPage = location.pathname === "/inventory/add"; + const onAddPage = location.pathname === "/inventory/add"; let blocker = useBlocker( ({ currentLocation, nextLocation }) => @@ -245,7 +245,7 @@ export function Inventory({ partNumber = "", ...rest }) { setLoadingPartMetadata(false); } else if (rest.params.partNumberToAdd) { // a part number to add is specified in the URL path - const { data, responseCode } = await doFetchPartMetadata(rest.params.partNumberToAdd, partToSearch, false); + const { data, responseCode } = await doFetchPartMetadata(rest.params.partNumberToAdd, partToSearch, false, onAddPage); processPartMetadataResponse(data, partToSearch.storedFiles, true, true, responseCode); setLoadingPartMetadata(false); setIsDirty(true); @@ -256,7 +256,7 @@ export function Inventory({ partNumber = "", ...rest }) { } else { // fetch part metadata, don't allow overwriting of fields that have already been entered setLoadingPartMetadata(true); - const { data, responseCode } = await doFetchPartMetadata(targetPart.partNumber, partToSearch, false); + const { data, responseCode } = await doFetchPartMetadata(targetPart.partNumber, partToSearch, false, onAddPage); processPartMetadataResponse(data, partToSearch.storedFiles, true, false, responseCode); // false, don't overwrite entered fields setLoadingPartMetadata(false); setIsDirty(true); @@ -298,7 +298,7 @@ export function Inventory({ partNumber = "", ...rest }) { setPartMetadataErrors([]); try { const includeInventorySearch = !pageHasParameters; - const { data, existsInInventory, inventoryPart, responseCode } = await doFetchPartMetadata(input, localPart, includeInventorySearch); + const { data, existsInInventory, inventoryPart, responseCode } = await doFetchPartMetadata(input, localPart, includeInventorySearch, onAddPage); if (existsInInventory) { setPartExistsInInventory(true); setSuggestedPartNumber(inventoryPart); @@ -508,13 +508,13 @@ export function Inventory({ partNumber = "", ...rest }) { * @param {bool} includeInventorySearch true to also check local inventory for the part * @returns part information */ - const doFetchPartMetadata = async (partNumber, part, includeInventorySearch = true) => { + const doFetchPartMetadata = async (partNumber, part, includeInventorySearch = true, newPart = true) => { if (partTypesRef.current.length === 0) console.error("There are no partTypes! This shouldn't happen and is a bug."); Inventory.doFetchPartMetadataController?.abort(); Inventory.doFetchPartMetadataController = new AbortController(); try { - const response = await fetchApi(`/api/part/info?newPart=${isAddPage}&partNumber=${encodeURIComponent(partNumber.trim())}&partTypeId=${part.partTypeId}&mountingTypeId=${part.mountingTypeId}&supplierPartNumbers=digikey:${part.digiKeyPartNumber || ""},mouser:${part.mouserPartNumber || ""},arrow:${part.arrowPartNumber},tme:${part.tmePartNumber}`, { + const response = await fetchApi(`/api/part/info?newPart=${newPart}&partNumber=${encodeURIComponent(partNumber.trim())}&partTypeId=${part.partTypeId}&mountingTypeId=${part.mountingTypeId}&supplierPartNumbers=digikey:${part.digiKeyPartNumber || ""},mouser:${part.mouserPartNumber || ""},arrow:${part.arrowPartNumber},tme:${part.tmePartNumber}`, { signal: Inventory.doFetchPartMetadataController.signal }); const data = response.data; @@ -835,7 +835,7 @@ export function Inventory({ partNumber = "", ...rest }) { // part is not in inventory, add it as new setLoadingPartMetadata(true); - const { data, responseCode} = await doFetchPartMetadata(cleanPartNumber, part, false); + const { data, responseCode} = await doFetchPartMetadata(cleanPartNumber, part, false, onAddPage); const metaResult = processPartMetadataResponse(data, part.storedFiles, true, true, responseCode); setLoadingPartMetadata(false); setIsDirty(true); @@ -1445,7 +1445,7 @@ export function Inventory({ partNumber = "", ...rest }) { e.stopPropagation(); setLoadingPartMetadata(true); setConfirmRefreshPartIsOpen(false); - const { data, responseCode } = await doFetchPartMetadata(inputPartNumber, part, false); + const { data, responseCode } = await doFetchPartMetadata(inputPartNumber, part, false, true); processPartMetadataResponse(data, part.storedFiles, true, true, responseCode); setLoadingPartMetadata(false); setIsDirty(true); From 203eefaea82854572a5d7773fe87b58aa1f0bf1a Mon Sep 17 00:00:00 2001 From: itzandroidtab Date: Sun, 24 Aug 2025 15:28:32 +0200 Subject: [PATCH 4/5] renamed variable to match function more --- .../Binner.Web/ClientApp/src/pages/Settings.js | 16 ++++++++-------- Binner/Binner.Web/Controllers/PartController.cs | 2 +- .../OrganizationConfiguration.cs | 2 +- .../Configuration/OrganizationConfiguration.cs | 2 +- .../Binner.Model/Requests/SettingsRequest.cs | 2 +- .../Binner.Model/Responses/SettingsResponse.cs | 2 +- .../OrganizationConfigurationProfile.cs | 4 ++-- .../MappingProfiles/SettingsRequestProfile.cs | 6 +++--- .../MappingProfiles/SettingsResponseProfile.cs | 16 ++++++++-------- 9 files changed, 26 insertions(+), 26 deletions(-) diff --git a/Binner/Binner.Web/ClientApp/src/pages/Settings.js b/Binner/Binner.Web/ClientApp/src/pages/Settings.js index fbce999e..59692486 100644 --- a/Binner/Binner.Web/ClientApp/src/pages/Settings.js +++ b/Binner/Binner.Web/ClientApp/src/pages/Settings.js @@ -104,7 +104,7 @@ export const Settings = () => { enableAutoPartSearch: true, enableDarkMode: false, enableCheckNewVersion: true, - allowPartMetadataFetchForExistingParts: true, + enableAutomaticMetadataFetchingForExistingParts: true, }); const [integrationSettings, setIntegrationSettings] = useState({ binner: { @@ -188,10 +188,10 @@ export const Settings = () => { const { data } = response; setLoading(false); // break out data into multiple state variables to optimize render performance - const { licenseKey, maxCacheItems, cacheAbsoluteExpirationMinutes, cacheSlidingExpirationMinutes, enableAutoPartSearch, enableDarkMode, enableCheckNewVersion, allowPartMetadataFetchForExistingParts } = data; + const { licenseKey, maxCacheItems, cacheAbsoluteExpirationMinutes, cacheSlidingExpirationMinutes, enableAutoPartSearch, enableDarkMode, enableCheckNewVersion, enableAutomaticMetadataFetchingForExistingParts } = data; const language = data.locale.language; const currency = data.locale.currency; - setGlobalSettings({ licenseKey, language, currency, maxCacheItems, cacheAbsoluteExpirationMinutes, cacheSlidingExpirationMinutes, enableAutoPartSearch, enableDarkMode, enableCheckNewVersion, allowPartMetadataFetchForExistingParts }); + setGlobalSettings({ licenseKey, language, currency, maxCacheItems, cacheAbsoluteExpirationMinutes, cacheSlidingExpirationMinutes, enableAutoPartSearch, enableDarkMode, enableCheckNewVersion, enableAutomaticMetadataFetchingForExistingParts }); const { binner, digikey, mouser, arrow, octopart, tme } = data; setIntegrationSettings({ binner, digikey, mouser, arrow, octopart, tme }); setPrinterSettings({ printer: data.printer }); @@ -872,21 +872,21 @@ export const Settings = () => { - + - Select this option to allow using the part search APIs to fetch metadata for existing parts in your inventory. + content={ + Select this option to enable automatic updating using the part search APIs to fetch metadata for existing parts in your inventory when opening them in the inventory. } trigger={ handleChange(e, control, 'global')} /> } diff --git a/Binner/Binner.Web/Controllers/PartController.cs b/Binner/Binner.Web/Controllers/PartController.cs index 63246f3b..eca5450e 100644 --- a/Binner/Binner.Web/Controllers/PartController.cs +++ b/Binner/Binner.Web/Controllers/PartController.cs @@ -643,7 +643,7 @@ public async Task GetPartInfoAsync([FromQuery] string partNumber, var organisationConfig = await _userConfigurationService.GetOrganizationConfigurationAsync(); // check the settings if we need to skip non new part search requests - if (newPart != null && newPart == false && organisationConfig.AllowPartMetadataFetchForExistingParts == false) + if (newPart != null && newPart == false && organisationConfig.enableAutomaticMetadataFetchingForExistingParts == false) { // check if we should skip this request return StatusCode(StatusCodes.Status204NoContent); diff --git a/Binner/Data/Binner.Data.Model/OrganizationConfiguration.cs b/Binner/Data/Binner.Data.Model/OrganizationConfiguration.cs index 89cb0df0..4dd3697e 100644 --- a/Binner/Data/Binner.Data.Model/OrganizationConfiguration.cs +++ b/Binner/Data/Binner.Data.Model/OrganizationConfiguration.cs @@ -54,7 +54,7 @@ public class OrganizationConfiguration : IEntity /// /// If true, allows fetching part metadata for parts that already exist in inventory /// - public bool AllowPartMetadataFetchForExistingParts { get; set; } = true; + public bool enableAutomaticMetadataFetchingForExistingParts { get; set; } = true; /// /// Creation date diff --git a/Binner/Library/Binner.Model/Configuration/OrganizationConfiguration.cs b/Binner/Library/Binner.Model/Configuration/OrganizationConfiguration.cs index 0ff66c34..078b1f9c 100644 --- a/Binner/Library/Binner.Model/Configuration/OrganizationConfiguration.cs +++ b/Binner/Library/Binner.Model/Configuration/OrganizationConfiguration.cs @@ -34,6 +34,6 @@ public class OrganizationConfiguration /// /// If true, allows fetching part metadata for parts that already exist in inventory /// - public bool AllowPartMetadataFetchForExistingParts { get; set; } = true; + public bool enableAutomaticMetadataFetchingForExistingParts { get; set; } = true; } } diff --git a/Binner/Library/Binner.Model/Requests/SettingsRequest.cs b/Binner/Library/Binner.Model/Requests/SettingsRequest.cs index 710a5606..9a9896cf 100644 --- a/Binner/Library/Binner.Model/Requests/SettingsRequest.cs +++ b/Binner/Library/Binner.Model/Requests/SettingsRequest.cs @@ -106,6 +106,6 @@ public class SettingsRequest /// /// If true, allows fetching part metadata for parts that already exist in inventory /// - public bool AllowPartMetadataFetchForExistingParts { get; set; } = true; + public bool enableAutomaticMetadataFetchingForExistingParts { get; set; } = true; } } diff --git a/Binner/Library/Binner.Model/Responses/SettingsResponse.cs b/Binner/Library/Binner.Model/Responses/SettingsResponse.cs index 9479cc0b..f0b45784 100644 --- a/Binner/Library/Binner.Model/Responses/SettingsResponse.cs +++ b/Binner/Library/Binner.Model/Responses/SettingsResponse.cs @@ -104,6 +104,6 @@ public class SettingsResponse /// /// If true, allows fetching part metadata for parts that already exist in inventory /// - public bool AllowPartMetadataFetchForExistingParts { get; set; } = true; + public bool enableAutomaticMetadataFetchingForExistingParts { get; set; } = true; } } diff --git a/Binner/Library/Binner.Services/MappingProfiles/ModelCommon/OrganizationConfigurationProfile.cs b/Binner/Library/Binner.Services/MappingProfiles/ModelCommon/OrganizationConfigurationProfile.cs index 4e2f2f4b..9e035d80 100644 --- a/Binner/Library/Binner.Services/MappingProfiles/ModelCommon/OrganizationConfigurationProfile.cs +++ b/Binner/Library/Binner.Services/MappingProfiles/ModelCommon/OrganizationConfigurationProfile.cs @@ -17,7 +17,7 @@ public OrganizationConfigurationProfile() .ForMember(x => x.CacheSlidingExpirationMinutes, options => options.MapFrom(x => x.CacheSlidingExpirationMinutes)) .ForMember(x => x.CacheAbsoluteExpirationMinutes, options => options.MapFrom(x => x.CacheAbsoluteExpirationMinutes)) .ForMember(x => x.KiCad, options => options.MapFrom(x => string.IsNullOrEmpty(x.KiCadSettingsJson) ? new KiCadSettings() : JsonConvert.DeserializeObject(x.KiCadSettingsJson))) - .ForMember(x => x.AllowPartMetadataFetchForExistingParts, options => options.MapFrom(x => x.AllowPartMetadataFetchForExistingParts)) + .ForMember(x => x.enableAutomaticMetadataFetchingForExistingParts, options => options.MapFrom(x => x.enableAutomaticMetadataFetchingForExistingParts)) ; CreateMap() @@ -27,7 +27,7 @@ public OrganizationConfigurationProfile() .ForMember(x => x.CacheSlidingExpirationMinutes, options => options.MapFrom(x => x.CacheSlidingExpirationMinutes)) .ForMember(x => x.CacheAbsoluteExpirationMinutes, options => options.MapFrom(x => x.CacheAbsoluteExpirationMinutes)) .ForMember(x => x.KiCadSettingsJson, options => options.MapFrom(x => JsonConvert.SerializeObject(x.KiCad))) - .ForMember(x => x.AllowPartMetadataFetchForExistingParts, options => options.MapFrom(x => x.AllowPartMetadataFetchForExistingParts)) + .ForMember(x => x.enableAutomaticMetadataFetchingForExistingParts, options => options.MapFrom(x => x.enableAutomaticMetadataFetchingForExistingParts)) .ForMember(x => x.DateCreatedUtc, options => options.Ignore()) .ForMember(x => x.DateModifiedUtc, options => options.Ignore()) diff --git a/Binner/Library/Binner.Services/MappingProfiles/SettingsRequestProfile.cs b/Binner/Library/Binner.Services/MappingProfiles/SettingsRequestProfile.cs index 7a1f0693..dd973945 100644 --- a/Binner/Library/Binner.Services/MappingProfiles/SettingsRequestProfile.cs +++ b/Binner/Library/Binner.Services/MappingProfiles/SettingsRequestProfile.cs @@ -33,7 +33,7 @@ public SettingsRequestProfile() .ForMember(x => x.EnableAutoPartSearch, options => options.Ignore()) .ForMember(x => x.EnableDarkMode, options => options.Ignore()) .ForMember(x => x.EnableCheckNewVersion, options => options.Ignore()) - .ForMember(x => x.AllowPartMetadataFetchForExistingParts, options => options.Ignore()) + .ForMember(x => x.enableAutomaticMetadataFetchingForExistingParts, options => options.Ignore()) .ReverseMap(); CreateMap(MemberList.None) @@ -138,7 +138,7 @@ public SettingsRequestProfile() .ForMember(x => x.MaxCacheItems, options => options.MapFrom(x => x.MaxCacheItems)) .ForMember(x => x.UseModule, options => options.MapFrom(x => x.UseModule)) .ForMember(x => x.KiCad, options => options.MapFrom(x => x.KiCad)) - .ForMember(x => x.AllowPartMetadataFetchForExistingParts, options => options.MapFrom(x => x.AllowPartMetadataFetchForExistingParts)) + .ForMember(x => x.enableAutomaticMetadataFetchingForExistingParts, options => options.MapFrom(x => x.enableAutomaticMetadataFetchingForExistingParts)) ; CreateMap() @@ -148,7 +148,7 @@ public SettingsRequestProfile() .ForMember(x => x.MaxCacheItems, options => options.MapFrom(x => x.MaxCacheItems)) .ForMember(x => x.UseModule, options => options.MapFrom(x => x.UseModule)) .ForMember(x => x.KiCad, options => options.MapFrom(x => x.KiCad)) - .ForMember(x => x.AllowPartMetadataFetchForExistingParts, options => options.MapFrom(x => x.AllowPartMetadataFetchForExistingParts)) + .ForMember(x => x.enableAutomaticMetadataFetchingForExistingParts, options => options.MapFrom(x => x.enableAutomaticMetadataFetchingForExistingParts)) .ForMember(x => x.Octopart, options => options.Ignore()) .ForMember(x => x.Digikey, options => options.Ignore()) diff --git a/Binner/Library/Binner.Services/MappingProfiles/SettingsResponseProfile.cs b/Binner/Library/Binner.Services/MappingProfiles/SettingsResponseProfile.cs index 5529339a..a0a2f9cc 100644 --- a/Binner/Library/Binner.Services/MappingProfiles/SettingsResponseProfile.cs +++ b/Binner/Library/Binner.Services/MappingProfiles/SettingsResponseProfile.cs @@ -33,7 +33,7 @@ public SettingsResponseProfile() .ForMember(x => x.Printer, options => options.Ignore()) .ForMember(x => x.Barcode, options => options.Ignore()) .ForMember(x => x.KiCad, options => options.Ignore()) - .ForMember(x => x.AllowPartMetadataFetchForExistingParts, options => options.Ignore()) + .ForMember(x => x.enableAutomaticMetadataFetchingForExistingParts, options => options.Ignore()) .ReverseMap(); CreateMap() @@ -45,7 +45,7 @@ public SettingsResponseProfile() .ForMember(x => x.Tme, options => options.Ignore()) .ForMember(x => x.Barcode, options => options.Ignore()) .ForMember(x => x.KiCad, options => options.Ignore()) - .ForMember(x => x.AllowPartMetadataFetchForExistingParts, options => options.Ignore()) + .ForMember(x => x.enableAutomaticMetadataFetchingForExistingParts, options => options.Ignore()) .ForMember(x => x.UseModule, options => options.Ignore()) .ForMember(x => x.LicenseKey, options => options.Ignore()) .ForMember(x => x.MaxCacheItems, options => options.Ignore()) @@ -96,7 +96,7 @@ public SettingsResponseProfile() .ForMember(x => x.CustomFields, options => options.Ignore()) .ForMember(x => x.Printer, options => options.Ignore()) .ForMember(x => x.KiCad, options => options.Ignore()) - .ForMember(x => x.AllowPartMetadataFetchForExistingParts, options => options.Ignore()) + .ForMember(x => x.enableAutomaticMetadataFetchingForExistingParts, options => options.Ignore()) .ReverseMap(); CreateMap() @@ -105,7 +105,7 @@ public SettingsResponseProfile() .ForMember(x => x.CacheSlidingExpirationMinutes, options => options.MapFrom(x => x.CacheSlidingExpirationMinutes)) .ForMember(x => x.CacheAbsoluteExpirationMinutes, options => options.MapFrom(x => x.CacheAbsoluteExpirationMinutes)) .ForMember(x => x.KiCad, options => options.MapFrom(x => x.KiCad)) - .ForMember(x => x.AllowPartMetadataFetchForExistingParts, options => options.MapFrom(x => x.AllowPartMetadataFetchForExistingParts)) + .ForMember(x => x.enableAutomaticMetadataFetchingForExistingParts, options => options.MapFrom(x => x.enableAutomaticMetadataFetchingForExistingParts)) .ForMember(x => x.UseModule, options => options.Ignore()) .ForMember(x => x.EnableAutoPartSearch, options => options.Ignore()) @@ -143,7 +143,7 @@ public SettingsResponseProfile() .ForMember(x => x.CacheAbsoluteExpirationMinutes, options => options.Ignore()) .ForMember(x => x.CustomFields, options => options.Ignore()) .ForMember(x => x.KiCad, options => options.Ignore()) - .ForMember(x => x.AllowPartMetadataFetchForExistingParts, options => options.Ignore()) + .ForMember(x => x.enableAutomaticMetadataFetchingForExistingParts, options => options.Ignore()) .ForMember(x => x.Printer, options => options.MapFrom(x => new PrinterSettingsResponse { @@ -190,7 +190,7 @@ public SettingsResponseProfile() .ForMember(x => x.Printer, options => options.Ignore()) .ForMember(x => x.Locale, options => options.Ignore()) .ForMember(x => x.KiCad, options => options.Ignore()) - .ForMember(x => x.AllowPartMetadataFetchForExistingParts, options => options.Ignore()) + .ForMember(x => x.enableAutomaticMetadataFetchingForExistingParts, options => options.Ignore()) .ForMember(x => x.Barcode, options => options.MapFrom(x => new BarcodeSettingsResponse { @@ -263,7 +263,7 @@ public SettingsResponseProfile() .ForMember(x => x.CacheAbsoluteExpirationMinutes, options => options.Ignore()) .ForMember(x => x.CustomFields, options => options.Ignore()) .ForMember(x => x.KiCad, options => options.Ignore()) - .ForMember(x => x.AllowPartMetadataFetchForExistingParts, options => options.Ignore()) + .ForMember(x => x.enableAutomaticMetadataFetchingForExistingParts, options => options.Ignore()) .ReverseMap(); CreateMap() @@ -326,7 +326,7 @@ public SettingsResponseProfile() .ForMember(x => x.CacheAbsoluteExpirationMinutes, options => options.Ignore()) .ForMember(x => x.CustomFields, options => options.Ignore()) .ForMember(x => x.KiCad, options => options.Ignore()) - .ForMember(x => x.AllowPartMetadataFetchForExistingParts, options => options.Ignore()) + .ForMember(x => x.enableAutomaticMetadataFetchingForExistingParts, options => options.Ignore()) .ReverseMap(); CreateMap() From 2f179958cce9169f6a001fda7eb88ac8e68ea3d5 Mon Sep 17 00:00:00 2001 From: itzandroidtab Date: Sun, 24 Aug 2025 15:31:52 +0200 Subject: [PATCH 5/5] added migrations for metadata fetching + set default value to 'true' --- ...4132916_automaticMetadataFetch.Designer.cs | 2607 +++++++++++++++++ .../20250824132916_automaticMetadataFetch.cs | 31 + .../Migrations/BinnerContextModelSnapshot.cs | 3 + ...4132903_automaticMetadataFetch.Designer.cs | 2607 +++++++++++++++++ .../20250824132903_automaticMetadataFetch.cs | 31 + .../Migrations/BinnerContextModelSnapshot.cs | 3 + ...4132852_automaticMetadataFetch.Designer.cs | 2607 +++++++++++++++++ .../20250824132852_automaticMetadataFetch.cs | 31 + .../Migrations/BinnerContextModelSnapshot.cs | 3 + ...4132841_automaticMetadataFetch.Designer.cs | 2539 ++++++++++++++++ .../20250824132841_automaticMetadataFetch.cs | 31 + .../Migrations/BinnerContextModelSnapshot.cs | 3 + 12 files changed, 10496 insertions(+) create mode 100644 Binner/Data/Binner.Data.Migrations.MySql/Migrations/20250824132916_automaticMetadataFetch.Designer.cs create mode 100644 Binner/Data/Binner.Data.Migrations.MySql/Migrations/20250824132916_automaticMetadataFetch.cs create mode 100644 Binner/Data/Binner.Data.Migrations.Postgresql/Migrations/20250824132903_automaticMetadataFetch.Designer.cs create mode 100644 Binner/Data/Binner.Data.Migrations.Postgresql/Migrations/20250824132903_automaticMetadataFetch.cs create mode 100644 Binner/Data/Binner.Data.Migrations.SqlServer/Migrations/20250824132852_automaticMetadataFetch.Designer.cs create mode 100644 Binner/Data/Binner.Data.Migrations.SqlServer/Migrations/20250824132852_automaticMetadataFetch.cs create mode 100644 Binner/Data/Binner.Data.Migrations.Sqlite/Migrations/20250824132841_automaticMetadataFetch.Designer.cs create mode 100644 Binner/Data/Binner.Data.Migrations.Sqlite/Migrations/20250824132841_automaticMetadataFetch.cs diff --git a/Binner/Data/Binner.Data.Migrations.MySql/Migrations/20250824132916_automaticMetadataFetch.Designer.cs b/Binner/Data/Binner.Data.Migrations.MySql/Migrations/20250824132916_automaticMetadataFetch.Designer.cs new file mode 100644 index 00000000..0a18f16b --- /dev/null +++ b/Binner/Data/Binner.Data.Migrations.MySql/Migrations/20250824132916_automaticMetadataFetch.Designer.cs @@ -0,0 +1,2607 @@ +// +using System; +using Binner.Data; +using Microsoft.EntityFrameworkCore; +using Microsoft.EntityFrameworkCore.Infrastructure; +using Microsoft.EntityFrameworkCore.Metadata; +using Microsoft.EntityFrameworkCore.Migrations; +using Microsoft.EntityFrameworkCore.Storage.ValueConversion; + +#nullable disable + +namespace Binner.Data.Migrations.MySql.Migrations +{ + [DbContext(typeof(BinnerContext))] + [Migration("20250824132916_automaticMetadataFetch")] + partial class automaticMetadataFetch + { + /// + protected override void BuildTargetModel(ModelBuilder modelBuilder) + { +#pragma warning disable 612, 618 + modelBuilder + .HasDefaultSchema("dbo") + .HasAnnotation("ProductVersion", "9.0.6") + .HasAnnotation("Relational:MaxIdentifierLength", 64); + + MySqlModelBuilderExtensions.AutoIncrementColumns(modelBuilder); + + modelBuilder.Entity("Binner.Data.Model.CustomField", b => + { + b.Property("CustomFieldId") + .ValueGeneratedOnAdd() + .HasColumnType("bigint"); + + MySqlPropertyBuilderExtensions.UseMySqlIdentityColumn(b.Property("CustomFieldId")); + + b.Property("CustomFieldTypeId") + .HasColumnType("int"); + + b.Property("DateCreatedUtc") + .ValueGeneratedOnAdd() + .HasColumnType("datetime(6)") + .HasDefaultValueSql("getutcdate()"); + + b.Property("DateModifiedUtc") + .ValueGeneratedOnAdd() + .HasColumnType("datetime(6)") + .HasDefaultValueSql("getutcdate()"); + + b.Property("Description") + .HasColumnType("longtext"); + + b.Property("Name") + .IsRequired() + .HasColumnType("longtext"); + + b.Property("OrganizationId") + .HasColumnType("int"); + + b.Property("UserId") + .HasColumnType("int"); + + b.HasKey("CustomFieldId"); + + b.HasIndex("UserId"); + + b.ToTable("CustomFields", "dbo"); + }); + + modelBuilder.Entity("Binner.Data.Model.CustomFieldValue", b => + { + b.Property("CustomFieldValueId") + .ValueGeneratedOnAdd() + .HasColumnType("bigint"); + + MySqlPropertyBuilderExtensions.UseMySqlIdentityColumn(b.Property("CustomFieldValueId")); + + b.Property("CustomFieldId") + .HasColumnType("bigint"); + + b.Property("CustomFieldTypeId") + .HasColumnType("int"); + + b.Property("DateCreatedUtc") + .ValueGeneratedOnAdd() + .HasColumnType("datetime(6)") + .HasDefaultValueSql("getutcdate()"); + + b.Property("DateModifiedUtc") + .ValueGeneratedOnAdd() + .HasColumnType("datetime(6)") + .HasDefaultValueSql("getutcdate()"); + + b.Property("OrganizationId") + .HasColumnType("int"); + + b.Property("RecordId") + .HasColumnType("bigint"); + + b.Property("UserId") + .HasColumnType("int"); + + b.Property("Value") + .HasColumnType("longtext"); + + b.HasKey("CustomFieldValueId"); + + b.HasIndex("CustomFieldId"); + + b.HasIndex("UserId"); + + b.ToTable("CustomFieldValues", "dbo"); + }); + + modelBuilder.Entity("Binner.Data.Model.Label", b => + { + b.Property("LabelId") + .ValueGeneratedOnAdd() + .HasColumnType("int"); + + MySqlPropertyBuilderExtensions.UseMySqlIdentityColumn(b.Property("LabelId")); + + b.Property("DateCreatedUtc") + .ValueGeneratedOnAdd() + .HasColumnType("datetime(6)") + .HasDefaultValueSql("getutcdate()"); + + b.Property("DateModifiedUtc") + .ValueGeneratedOnAdd() + .HasColumnType("datetime(6)") + .HasDefaultValueSql("getutcdate()"); + + b.Property("IsPartLabelTemplate") + .HasColumnType("tinyint(1)"); + + b.Property("LabelTemplateId") + .HasColumnType("int"); + + b.Property("Name") + .IsRequired() + .HasColumnType("longtext"); + + b.Property("OrganizationId") + .HasColumnType("int"); + + b.Property("Template") + .IsRequired() + .HasColumnType("longtext"); + + b.Property("UserId") + .HasColumnType("int"); + + b.HasKey("LabelId"); + + b.HasIndex("LabelTemplateId"); + + b.ToTable("Labels", "dbo"); + }); + + modelBuilder.Entity("Binner.Data.Model.LabelTemplate", b => + { + b.Property("LabelTemplateId") + .ValueGeneratedOnAdd() + .HasColumnType("int"); + + MySqlPropertyBuilderExtensions.UseMySqlIdentityColumn(b.Property("LabelTemplateId")); + + b.Property("DateCreatedUtc") + .ValueGeneratedOnAdd() + .HasColumnType("datetime(6)") + .HasDefaultValueSql("getutcdate()"); + + b.Property("DateModifiedUtc") + .ValueGeneratedOnAdd() + .HasColumnType("datetime(6)") + .HasDefaultValueSql("getutcdate()"); + + b.Property("Description") + .HasColumnType("longtext"); + + b.Property("Dpi") + .HasColumnType("int"); + + b.Property("DriverHeight") + .HasColumnType("int"); + + b.Property("DriverName") + .HasColumnType("longtext"); + + b.Property("DriverWidth") + .HasColumnType("int"); + + b.Property("ExtraData") + .HasColumnType("longtext"); + + b.Property("Height") + .IsRequired() + .HasColumnType("longtext"); + + b.Property("LabelCount") + .HasColumnType("int"); + + b.Property("LabelPaperSource") + .HasColumnType("int"); + + b.Property("Margin") + .IsRequired() + .HasColumnType("longtext"); + + b.Property("Name") + .IsRequired() + .HasColumnType("longtext"); + + b.Property("OrganizationId") + .HasColumnType("int"); + + b.Property("UserId") + .HasColumnType("int"); + + b.Property("Width") + .IsRequired() + .HasColumnType("longtext"); + + b.HasKey("LabelTemplateId"); + + b.ToTable("LabelTemplates", "dbo"); + }); + + modelBuilder.Entity("Binner.Data.Model.MessageState", b => + { + b.Property("MessageStateId") + .ValueGeneratedOnAdd() + .HasColumnType("int"); + + MySqlPropertyBuilderExtensions.UseMySqlIdentityColumn(b.Property("MessageStateId")); + + b.Property("DateCreatedUtc") + .HasColumnType("datetime(6)"); + + b.Property("MessageId") + .HasColumnType("char(36)"); + + b.Property("OrganizationId") + .HasColumnType("int"); + + b.Property("ReadDateUtc") + .HasColumnType("datetime(6)"); + + b.Property("UserId") + .HasColumnType("int"); + + b.HasKey("MessageStateId"); + + b.ToTable("MessageStates", "dbo"); + }); + + modelBuilder.Entity("Binner.Data.Model.OAuthCredential", b => + { + b.Property("OAuthCredentialId") + .ValueGeneratedOnAdd() + .HasColumnType("int"); + + MySqlPropertyBuilderExtensions.UseMySqlIdentityColumn(b.Property("OAuthCredentialId")); + + b.Property("AccessToken") + .HasColumnType("longtext"); + + b.Property("ApiSettings") + .HasColumnType("longtext"); + + b.Property("DateCreatedUtc") + .ValueGeneratedOnAdd() + .HasColumnType("datetime(6)") + .HasDefaultValueSql("getutcdate()"); + + b.Property("DateExpiresUtc") + .HasColumnType("datetime(6)"); + + b.Property("DateModifiedUtc") + .ValueGeneratedOnAdd() + .HasColumnType("datetime(6)") + .HasDefaultValueSql("getutcdate()"); + + b.Property("Ip") + .ValueGeneratedOnAdd() + .HasColumnType("bigint") + .HasDefaultValue(0L); + + b.Property("OrganizationId") + .HasColumnType("int"); + + b.Property("Provider") + .IsRequired() + .HasMaxLength(128) + .HasColumnType("varchar(128)"); + + b.Property("RefreshToken") + .HasColumnType("longtext"); + + b.Property("UserId") + .HasColumnType("int"); + + b.HasKey("OAuthCredentialId"); + + b.HasIndex("UserId"); + + b.HasIndex("Provider", "UserId", "OrganizationId"); + + b.ToTable("OAuthCredentials", "dbo"); + }); + + modelBuilder.Entity("Binner.Data.Model.OAuthRequest", b => + { + b.Property("OAuthRequestId") + .ValueGeneratedOnAdd() + .HasColumnType("int"); + + MySqlPropertyBuilderExtensions.UseMySqlIdentityColumn(b.Property("OAuthRequestId")); + + b.Property("AuthorizationCode") + .HasColumnType("longtext"); + + b.Property("AuthorizationReceived") + .HasColumnType("tinyint(1)") + .HasDefaultValue(false); + + b.Property("DateCreatedUtc") + .ValueGeneratedOnAdd() + .HasColumnType("datetime(6)") + .HasDefaultValueSql("getutcdate()"); + + b.Property("DateModifiedUtc") + .ValueGeneratedOnAdd() + .HasColumnType("datetime(6)") + .HasDefaultValueSql("getutcdate()"); + + b.Property("Error") + .HasColumnType("longtext"); + + b.Property("ErrorDescription") + .HasColumnType("longtext"); + + b.Property("Ip") + .ValueGeneratedOnAdd() + .HasColumnType("bigint") + .HasDefaultValue(0L); + + b.Property("OrganizationId") + .HasColumnType("int"); + + b.Property("Provider") + .IsRequired() + .HasColumnType("longtext"); + + b.Property("RequestId") + .HasColumnType("char(36)"); + + b.Property("ReturnToUrl") + .HasColumnType("longtext"); + + b.Property("UserId") + .HasColumnType("int"); + + b.HasKey("OAuthRequestId"); + + b.HasIndex("UserId"); + + b.ToTable("OAuthRequests", "dbo"); + }); + + modelBuilder.Entity("Binner.Data.Model.OrderImportHistory", b => + { + b.Property("OrderImportHistoryId") + .ValueGeneratedOnAdd() + .HasColumnType("bigint"); + + MySqlPropertyBuilderExtensions.UseMySqlIdentityColumn(b.Property("OrderImportHistoryId")); + + b.Property("DateCreatedUtc") + .ValueGeneratedOnAdd() + .HasColumnType("datetime(6)") + .HasDefaultValueSql("getutcdate()"); + + b.Property("DateModifiedUtc") + .ValueGeneratedOnAdd() + .HasColumnType("datetime(6)") + .HasDefaultValueSql("getutcdate()"); + + b.Property("Invoice") + .HasColumnType("longtext"); + + b.Property("OrganizationId") + .HasColumnType("int"); + + b.Property("Packlist") + .HasColumnType("longtext"); + + b.Property("SalesOrder") + .IsRequired() + .HasColumnType("longtext"); + + b.Property("Supplier") + .IsRequired() + .HasColumnType("longtext"); + + b.Property("UserId") + .HasColumnType("int"); + + b.HasKey("OrderImportHistoryId"); + + b.HasIndex("UserId"); + + b.ToTable("OrderImportHistories", "dbo"); + }); + + modelBuilder.Entity("Binner.Data.Model.OrderImportHistoryLineItem", b => + { + b.Property("OrderImportHistoryLineItemId") + .ValueGeneratedOnAdd() + .HasColumnType("bigint"); + + MySqlPropertyBuilderExtensions.UseMySqlIdentityColumn(b.Property("OrderImportHistoryLineItemId")); + + b.Property("Cost") + .HasColumnType("double"); + + b.Property("CustomerReference") + .HasColumnType("longtext"); + + b.Property("DateCreatedUtc") + .ValueGeneratedOnAdd() + .HasColumnType("datetime(6)") + .HasDefaultValueSql("getutcdate()"); + + b.Property("DateModifiedUtc") + .ValueGeneratedOnAdd() + .HasColumnType("datetime(6)") + .HasDefaultValueSql("getutcdate()"); + + b.Property("Description") + .HasColumnType("longtext"); + + b.Property("Manufacturer") + .HasColumnType("longtext"); + + b.Property("ManufacturerPartNumber") + .HasColumnType("longtext"); + + b.Property("OrderImportHistoryId") + .HasColumnType("bigint"); + + b.Property("OrganizationId") + .HasColumnType("int"); + + b.Property("PartId") + .HasColumnType("bigint"); + + b.Property("PartNumber") + .HasColumnType("longtext"); + + b.Property("Quantity") + .HasColumnType("bigint"); + + b.Property("Supplier") + .HasColumnType("longtext"); + + b.Property("UserId") + .HasColumnType("int"); + + b.HasKey("OrderImportHistoryLineItemId"); + + b.HasIndex("OrderImportHistoryId"); + + b.HasIndex("UserId"); + + b.ToTable("OrderImportHistoryLineItems", "dbo"); + }); + + modelBuilder.Entity("Binner.Data.Model.Organization", b => + { + b.Property("OrganizationId") + .ValueGeneratedOnAdd() + .HasColumnType("int"); + + MySqlPropertyBuilderExtensions.UseMySqlIdentityColumn(b.Property("OrganizationId")); + + b.Property("DateCreatedUtc") + .ValueGeneratedOnAdd() + .HasColumnType("datetime(6)") + .HasDefaultValueSql("getutcdate()"); + + b.Property("DateLockedUtc") + .HasColumnType("datetime(6)"); + + b.Property("DateModifiedUtc") + .ValueGeneratedOnAdd() + .HasColumnType("datetime(6)") + .HasDefaultValueSql("getutcdate()"); + + b.Property("Description") + .HasColumnType("longtext"); + + b.Property("Name") + .HasColumnType("longtext"); + + b.HasKey("OrganizationId"); + + b.ToTable("Organizations", "dbo"); + }); + + modelBuilder.Entity("Binner.Data.Model.OrganizationConfiguration", b => + { + b.Property("OrganizationConfigurationId") + .ValueGeneratedOnAdd() + .HasColumnType("int"); + + MySqlPropertyBuilderExtensions.UseMySqlIdentityColumn(b.Property("OrganizationConfigurationId")); + + b.Property("CacheAbsoluteExpirationMinutes") + .HasColumnType("int"); + + b.Property("CacheSlidingExpirationMinutes") + .HasColumnType("int"); + + b.Property("DateCreatedUtc") + .ValueGeneratedOnAdd() + .HasColumnType("datetime(6)") + .HasDefaultValueSql("getutcdate()"); + + b.Property("DateModifiedUtc") + .ValueGeneratedOnAdd() + .HasColumnType("datetime(6)") + .HasDefaultValueSql("getutcdate()"); + + b.Property("KiCadSettingsJson") + .HasColumnType("longtext"); + + b.Property("LicenseKey") + .HasColumnType("longtext"); + + b.Property("MaxCacheItems") + .HasColumnType("int"); + + b.Property("OrganizationId") + .HasColumnType("int"); + + b.Property("UseModule") + .HasColumnType("int"); + + b.Property("UserId") + .HasColumnType("int"); + + b.Property("enableAutomaticMetadataFetchingForExistingParts") + .HasColumnType("tinyint(1)"); + + b.HasKey("OrganizationConfigurationId"); + + b.HasIndex("OrganizationId"); + + b.HasIndex("UserId"); + + b.ToTable("OrganizationConfigurations", "dbo"); + }); + + modelBuilder.Entity("Binner.Data.Model.OrganizationIntegrationConfiguration", b => + { + b.Property("OrganizationIntegrationConfigurationId") + .ValueGeneratedOnAdd() + .HasColumnType("int"); + + MySqlPropertyBuilderExtensions.UseMySqlIdentityColumn(b.Property("OrganizationIntegrationConfigurationId")); + + b.Property("ArrowApiKey") + .HasColumnType("longtext"); + + b.Property("ArrowApiUrl") + .IsRequired() + .HasColumnType("longtext"); + + b.Property("ArrowEnabled") + .HasColumnType("tinyint(1)"); + + b.Property("ArrowUsername") + .HasColumnType("longtext"); + + b.Property("DateCreatedUtc") + .ValueGeneratedOnAdd() + .HasColumnType("datetime(6)") + .HasDefaultValueSql("getutcdate()"); + + b.Property("DateModifiedUtc") + .ValueGeneratedOnAdd() + .HasColumnType("datetime(6)") + .HasDefaultValueSql("getutcdate()"); + + b.Property("DigiKeyApiUrl") + .HasColumnType("longtext"); + + b.Property("DigiKeyClientId") + .HasColumnType("longtext"); + + b.Property("DigiKeyClientSecret") + .HasColumnType("longtext"); + + b.Property("DigiKeyEnabled") + .HasColumnType("tinyint(1)"); + + b.Property("DigiKeyOAuthPostbackUrl") + .HasColumnType("longtext"); + + b.Property("DigiKeySite") + .HasColumnType("int"); + + b.Property("MouserApiUrl") + .HasColumnType("longtext"); + + b.Property("MouserCartApiKey") + .HasColumnType("longtext"); + + b.Property("MouserEnabled") + .HasColumnType("tinyint(1)"); + + b.Property("MouserOrderApiKey") + .HasColumnType("longtext"); + + b.Property("MouserSearchApiKey") + .HasColumnType("longtext"); + + b.Property("NexarClientId") + .HasColumnType("longtext"); + + b.Property("NexarClientSecret") + .HasColumnType("longtext"); + + b.Property("NexarEnabled") + .HasColumnType("tinyint(1)"); + + b.Property("OrganizationId") + .HasColumnType("int"); + + b.Property("SwarmApiKey") + .HasColumnType("longtext"); + + b.Property("SwarmApiUrl") + .HasColumnType("longtext"); + + b.Property("SwarmEnabled") + .HasColumnType("tinyint(1)"); + + b.Property("SwarmTimeout") + .HasColumnType("time(6)"); + + b.Property("TmeApiKey") + .HasColumnType("longtext"); + + b.Property("TmeApiUrl") + .IsRequired() + .HasColumnType("longtext"); + + b.Property("TmeApplicationSecret") + .HasColumnType("longtext"); + + b.Property("TmeCountry") + .HasColumnType("longtext"); + + b.Property("TmeEnabled") + .HasColumnType("tinyint(1)"); + + b.Property("TmeResolveExternalLinks") + .HasColumnType("tinyint(1)"); + + b.Property("UserId") + .HasColumnType("int"); + + b.HasKey("OrganizationIntegrationConfigurationId"); + + b.HasIndex("OrganizationId"); + + b.HasIndex("UserId"); + + b.ToTable("OrganizationIntegrationConfigurations", "dbo"); + }); + + modelBuilder.Entity("Binner.Data.Model.Part", b => + { + b.Property("PartId") + .ValueGeneratedOnAdd() + .HasColumnType("bigint"); + + MySqlPropertyBuilderExtensions.UseMySqlIdentityColumn(b.Property("PartId")); + + b.Property("ArrowPartNumber") + .HasColumnType("longtext"); + + b.Property("BaseProductNumber") + .HasColumnType("longtext"); + + b.Property("BinNumber") + .HasColumnType("varchar(255)"); + + b.Property("BinNumber2") + .HasColumnType("varchar(255)"); + + b.Property("Cost") + .HasColumnType("decimal(18,4)"); + + b.Property("Currency") + .HasColumnType("longtext"); + + b.Property("DataSource") + .HasColumnType("int"); + + b.Property("DataSourceId") + .HasColumnType("longtext"); + + b.Property("DatasheetUrl") + .HasColumnType("longtext"); + + b.Property("DateCreatedUtc") + .ValueGeneratedOnAdd() + .HasColumnType("datetime(6)") + .HasDefaultValueSql("getutcdate()"); + + b.Property("DateModifiedUtc") + .ValueGeneratedOnAdd() + .HasColumnType("datetime(6)") + .HasDefaultValueSql("getutcdate()"); + + b.Property("Description") + .HasColumnType("varchar(255)"); + + b.Property("DigiKeyPartNumber") + .HasColumnType("varchar(255)"); + + b.Property("ExportControlClassNumber") + .HasColumnType("longtext"); + + b.Property("ExtensionValue1") + .HasColumnType("longtext"); + + b.Property("ExtensionValue2") + .HasColumnType("longtext"); + + b.Property("FootprintName") + .HasColumnType("longtext"); + + b.Property("HtsusCode") + .HasColumnType("longtext"); + + b.Property("ImageUrl") + .HasColumnType("longtext"); + + b.Property("Keywords") + .HasColumnType("varchar(255)"); + + b.Property("LastSwarmSyncUtc") + .HasColumnType("datetime(6)"); + + b.Property("LeadTime") + .HasColumnType("longtext"); + + b.Property("Location") + .HasColumnType("varchar(255)"); + + b.Property("LowStockThreshold") + .HasColumnType("int"); + + b.Property("LowestCostSupplier") + .HasColumnType("longtext"); + + b.Property("LowestCostSupplierUrl") + .HasColumnType("longtext"); + + b.Property("Manufacturer") + .HasColumnType("varchar(255)"); + + b.Property("ManufacturerPartNumber") + .HasColumnType("varchar(255)"); + + b.Property("MetadataLastUpdatedUtc") + .HasColumnType("datetime(6)"); + + b.Property("MoistureSensitivityLevel") + .HasColumnType("longtext"); + + b.Property("MountingTypeId") + .HasColumnType("int"); + + b.Property("MouserPartNumber") + .HasColumnType("varchar(255)"); + + b.Property("OrganizationId") + .HasColumnType("int"); + + b.Property("OtherNames") + .HasColumnType("longtext"); + + b.Property("PackageType") + .HasColumnType("longtext"); + + b.Property("PartNumber") + .HasMaxLength(64) + .HasColumnType("varchar(64)"); + + b.Property("PartTypeId") + .HasColumnType("bigint"); + + b.Property("ProductStatus") + .HasColumnType("longtext"); + + b.Property("ProductUrl") + .HasColumnType("longtext"); + + b.Property("ProjectId") + .HasColumnType("bigint"); + + b.Property("Quantity") + .HasColumnType("bigint"); + + b.Property("ReachStatus") + .HasColumnType("longtext"); + + b.Property("RohsStatus") + .HasColumnType("longtext"); + + b.Property("Series") + .HasColumnType("longtext"); + + b.Property("ShortId") + .HasColumnType("longtext"); + + b.Property("SwarmPartNumberManufacturerId") + .HasColumnType("int"); + + b.Property("SymbolName") + .HasColumnType("longtext"); + + b.Property("TmePartNumber") + .HasColumnType("longtext"); + + b.Property("UserId") + .HasColumnType("int"); + + b.Property("Value") + .HasColumnType("longtext"); + + b.HasKey("PartId"); + + b.HasIndex("ProjectId"); + + b.HasIndex("UserId"); + + b.HasIndex("BinNumber", "UserId"); + + b.HasIndex("BinNumber2", "UserId"); + + b.HasIndex("Description", "UserId"); + + b.HasIndex("DigiKeyPartNumber", "UserId"); + + b.HasIndex("Keywords", "UserId"); + + b.HasIndex("Location", "UserId"); + + b.HasIndex("Manufacturer", "UserId"); + + b.HasIndex("ManufacturerPartNumber", "UserId"); + + b.HasIndex("MouserPartNumber", "UserId"); + + b.HasIndex("PartNumber", "UserId"); + + b.HasIndex("PartTypeId", "UserId"); + + b.ToTable("Parts", "dbo"); + }); + + modelBuilder.Entity("Binner.Data.Model.PartModel", b => + { + b.Property("PartModelId") + .ValueGeneratedOnAdd() + .HasColumnType("bigint"); + + MySqlPropertyBuilderExtensions.UseMySqlIdentityColumn(b.Property("PartModelId")); + + b.Property("DateCreatedUtc") + .ValueGeneratedOnAdd() + .HasColumnType("datetime(6)") + .HasDefaultValueSql("getutcdate()"); + + b.Property("DateModifiedUtc") + .ValueGeneratedOnAdd() + .HasColumnType("datetime(6)") + .HasDefaultValueSql("getutcdate()"); + + b.Property("Filename") + .HasColumnType("longtext"); + + b.Property("ModelType") + .HasColumnType("int"); + + b.Property("Name") + .IsRequired() + .HasColumnType("longtext"); + + b.Property("OrganizationId") + .HasColumnType("int"); + + b.Property("PartId") + .HasColumnType("bigint"); + + b.Property("Source") + .HasColumnType("int"); + + b.Property("Url") + .HasColumnType("longtext"); + + b.Property("UserId") + .HasColumnType("int"); + + b.HasKey("PartModelId"); + + b.HasIndex("UserId"); + + b.HasIndex("PartId", "OrganizationId"); + + b.ToTable("PartModels", "dbo"); + }); + + modelBuilder.Entity("Binner.Data.Model.PartParametric", b => + { + b.Property("PartParametricId") + .ValueGeneratedOnAdd() + .HasColumnType("bigint"); + + MySqlPropertyBuilderExtensions.UseMySqlIdentityColumn(b.Property("PartParametricId")); + + b.Property("DateCreatedUtc") + .ValueGeneratedOnAdd() + .HasColumnType("datetime(6)") + .HasDefaultValueSql("getutcdate()"); + + b.Property("DateModifiedUtc") + .ValueGeneratedOnAdd() + .HasColumnType("datetime(6)") + .HasDefaultValueSql("getutcdate()"); + + b.Property("DigiKeyParameterId") + .HasColumnType("int"); + + b.Property("DigiKeyParameterText") + .HasColumnType("longtext"); + + b.Property("DigiKeyParameterType") + .HasColumnType("longtext"); + + b.Property("DigiKeyValueId") + .HasColumnType("longtext"); + + b.Property("DigiKeyValueText") + .HasColumnType("longtext"); + + b.Property("Name") + .IsRequired() + .HasColumnType("longtext"); + + b.Property("OrganizationId") + .HasColumnType("int"); + + b.Property("PartId") + .HasColumnType("bigint"); + + b.Property("Units") + .HasColumnType("int"); + + b.Property("UserId") + .HasColumnType("int"); + + b.Property("Value") + .IsRequired() + .HasColumnType("longtext"); + + b.Property("ValueNumber") + .HasColumnType("decimal(18,4)"); + + b.HasKey("PartParametricId"); + + b.HasIndex("UserId"); + + b.HasIndex("PartId", "OrganizationId"); + + b.ToTable("PartParametrics", "dbo"); + }); + + modelBuilder.Entity("Binner.Data.Model.PartScanHistory", b => + { + b.Property("PartScanHistoryId") + .ValueGeneratedOnAdd() + .HasColumnType("bigint"); + + MySqlPropertyBuilderExtensions.UseMySqlIdentityColumn(b.Property("PartScanHistoryId")); + + b.Property("BarcodeType") + .HasColumnType("int"); + + b.Property("CountryOfOrigin") + .HasColumnType("longtext"); + + b.Property("Crc") + .HasColumnType("int"); + + b.Property("DateCreatedUtc") + .ValueGeneratedOnAdd() + .HasColumnType("datetime(6)") + .HasDefaultValueSql("getutcdate()"); + + b.Property("DateModifiedUtc") + .ValueGeneratedOnAdd() + .HasColumnType("datetime(6)") + .HasDefaultValueSql("getutcdate()"); + + b.Property("Description") + .HasColumnType("longtext"); + + b.Property("Invoice") + .HasColumnType("longtext"); + + b.Property("LotCode") + .HasColumnType("longtext"); + + b.Property("ManufacturerPartNumber") + .HasColumnType("longtext"); + + b.Property("Mid") + .HasColumnType("longtext"); + + b.Property("OrganizationId") + .HasColumnType("int"); + + b.Property("Packlist") + .HasColumnType("longtext"); + + b.Property("PartId") + .HasColumnType("bigint"); + + b.Property("Quantity") + .HasColumnType("int"); + + b.Property("RawScan") + .IsRequired() + .HasColumnType("longtext"); + + b.Property("SalesOrder") + .HasColumnType("longtext"); + + b.Property("ScannedLabelType") + .HasColumnType("int"); + + b.Property("Supplier") + .HasColumnType("int"); + + b.Property("SupplierPartNumber") + .HasColumnType("longtext"); + + b.Property("UserId") + .HasColumnType("int"); + + b.HasKey("PartScanHistoryId"); + + b.HasIndex("PartId"); + + b.HasIndex("UserId"); + + b.ToTable("PartScanHistories", "dbo"); + }); + + modelBuilder.Entity("Binner.Data.Model.PartSupplier", b => + { + b.Property("PartSupplierId") + .ValueGeneratedOnAdd() + .HasColumnType("bigint"); + + MySqlPropertyBuilderExtensions.UseMySqlIdentityColumn(b.Property("PartSupplierId")); + + b.Property("Cost") + .HasColumnType("decimal(18,4)"); + + b.Property("DateCreatedUtc") + .ValueGeneratedOnAdd() + .HasColumnType("datetime(6)") + .HasDefaultValueSql("getutcdate()"); + + b.Property("DateModifiedUtc") + .ValueGeneratedOnAdd() + .HasColumnType("datetime(6)") + .HasDefaultValueSql("getutcdate()"); + + b.Property("ImageUrl") + .HasColumnType("longtext"); + + b.Property("MinimumOrderQuantity") + .HasColumnType("int"); + + b.Property("Name") + .HasColumnType("longtext"); + + b.Property("OrganizationId") + .HasColumnType("int"); + + b.Property("PartId") + .HasColumnType("bigint"); + + b.Property("ProductUrl") + .HasColumnType("longtext"); + + b.Property("QuantityAvailable") + .HasColumnType("int"); + + b.Property("SupplierPartNumber") + .HasColumnType("longtext"); + + b.Property("UserId") + .HasColumnType("int"); + + b.HasKey("PartSupplierId"); + + b.HasIndex("PartId"); + + b.HasIndex("UserId"); + + b.ToTable("PartSuppliers", "dbo"); + }); + + modelBuilder.Entity("Binner.Data.Model.PartType", b => + { + b.Property("PartTypeId") + .ValueGeneratedOnAdd() + .HasColumnType("bigint"); + + MySqlPropertyBuilderExtensions.UseMySqlIdentityColumn(b.Property("PartTypeId")); + + b.Property("DateCreatedUtc") + .ValueGeneratedOnAdd() + .HasColumnType("datetime(6)") + .HasDefaultValueSql("getutcdate()"); + + b.Property("DateModifiedUtc") + .ValueGeneratedOnAdd() + .HasColumnType("datetime(6)") + .HasDefaultValueSql("getutcdate()"); + + b.Property("Description") + .HasColumnType("longtext"); + + b.Property("Icon") + .HasColumnType("longtext"); + + b.Property("Keywords") + .HasColumnType("longtext"); + + b.Property("Name") + .HasColumnType("varchar(255)"); + + b.Property("OrganizationId") + .HasColumnType("int"); + + b.Property("ParentPartTypeId") + .HasColumnType("bigint"); + + b.Property("ReferenceDesignator") + .HasColumnType("longtext"); + + b.Property("SymbolId") + .HasColumnType("longtext"); + + b.Property("UserId") + .HasColumnType("int"); + + b.HasKey("PartTypeId"); + + b.HasIndex("ParentPartTypeId"); + + b.HasIndex("UserId"); + + b.HasIndex("Name", "UserId"); + + b.ToTable("PartTypes", "dbo"); + }); + + modelBuilder.Entity("Binner.Data.Model.Pcb", b => + { + b.Property("PcbId") + .ValueGeneratedOnAdd() + .HasColumnType("bigint"); + + MySqlPropertyBuilderExtensions.UseMySqlIdentityColumn(b.Property("PcbId")); + + b.Property("Cost") + .HasColumnType("double"); + + b.Property("DateCreatedUtc") + .ValueGeneratedOnAdd() + .HasColumnType("datetime(6)") + .HasDefaultValueSql("getutcdate()"); + + b.Property("DateModifiedUtc") + .ValueGeneratedOnAdd() + .HasColumnType("datetime(6)") + .HasDefaultValueSql("getutcdate()"); + + b.Property("Description") + .HasColumnType("longtext"); + + b.Property("LastSerialNumber") + .HasColumnType("longtext"); + + b.Property("Name") + .HasColumnType("longtext"); + + b.Property("OrganizationId") + .HasColumnType("int"); + + b.Property("Quantity") + .HasColumnType("int"); + + b.Property("SerialNumberFormat") + .HasColumnType("longtext"); + + b.Property("UserId") + .HasColumnType("int"); + + b.HasKey("PcbId"); + + b.HasIndex("UserId"); + + b.ToTable("Pcbs", "dbo"); + }); + + modelBuilder.Entity("Binner.Data.Model.PcbStoredFileAssignment", b => + { + b.Property("PcbStoredFileAssignmentId") + .ValueGeneratedOnAdd() + .HasColumnType("bigint"); + + MySqlPropertyBuilderExtensions.UseMySqlIdentityColumn(b.Property("PcbStoredFileAssignmentId")); + + b.Property("DateCreatedUtc") + .ValueGeneratedOnAdd() + .HasColumnType("datetime(6)") + .HasDefaultValueSql("getutcdate()"); + + b.Property("DateModifiedUtc") + .ValueGeneratedOnAdd() + .HasColumnType("datetime(6)") + .HasDefaultValueSql("getutcdate()"); + + b.Property("Name") + .HasColumnType("longtext"); + + b.Property("Notes") + .HasColumnType("longtext"); + + b.Property("OrganizationId") + .HasColumnType("int"); + + b.Property("PcbId") + .HasColumnType("bigint"); + + b.Property("StoredFileId") + .HasColumnType("bigint"); + + b.Property("UserId") + .HasColumnType("int"); + + b.HasKey("PcbStoredFileAssignmentId"); + + b.HasIndex("PcbId"); + + b.HasIndex("StoredFileId"); + + b.HasIndex("UserId"); + + b.ToTable("PcbStoredFileAssignments", "dbo"); + }); + + modelBuilder.Entity("Binner.Data.Model.Project", b => + { + b.Property("ProjectId") + .ValueGeneratedOnAdd() + .HasColumnType("bigint"); + + MySqlPropertyBuilderExtensions.UseMySqlIdentityColumn(b.Property("ProjectId")); + + b.Property("Color") + .HasColumnType("int"); + + b.Property("DateCreatedUtc") + .ValueGeneratedOnAdd() + .HasColumnType("datetime(6)") + .HasDefaultValueSql("getutcdate()"); + + b.Property("DateModifiedUtc") + .ValueGeneratedOnAdd() + .HasColumnType("datetime(6)") + .HasDefaultValueSql("getutcdate()"); + + b.Property("Description") + .HasColumnType("longtext"); + + b.Property("Location") + .HasColumnType("longtext"); + + b.Property("Name") + .HasColumnType("varchar(255)"); + + b.Property("Notes") + .HasColumnType("longtext"); + + b.Property("OrganizationId") + .HasColumnType("int"); + + b.Property("UserId") + .HasColumnType("int"); + + b.HasKey("ProjectId"); + + b.HasIndex("UserId"); + + b.HasIndex("Name", "UserId"); + + b.ToTable("Projects", "dbo"); + }); + + modelBuilder.Entity("Binner.Data.Model.ProjectPartAssignment", b => + { + b.Property("ProjectPartAssignmentId") + .ValueGeneratedOnAdd() + .HasColumnType("bigint"); + + MySqlPropertyBuilderExtensions.UseMySqlIdentityColumn(b.Property("ProjectPartAssignmentId")); + + b.Property("Cost") + .HasColumnType("double"); + + b.Property("Currency") + .HasColumnType("longtext"); + + b.Property("CustomDescription") + .HasColumnType("longtext"); + + b.Property("DateCreatedUtc") + .ValueGeneratedOnAdd() + .HasColumnType("datetime(6)") + .HasDefaultValueSql("getutcdate()"); + + b.Property("DateModifiedUtc") + .ValueGeneratedOnAdd() + .HasColumnType("datetime(6)") + .HasDefaultValueSql("getutcdate()"); + + b.Property("FootprintName") + .HasColumnType("longtext"); + + b.Property("Notes") + .HasColumnType("longtext"); + + b.Property("OrganizationId") + .HasColumnType("int"); + + b.Property("PartId") + .HasColumnType("bigint"); + + b.Property("PartName") + .HasColumnType("longtext"); + + b.Property("PcbId") + .HasColumnType("bigint"); + + b.Property("ProjectId") + .HasColumnType("bigint"); + + b.Property("Quantity") + .HasColumnType("int"); + + b.Property("QuantityAvailable") + .HasColumnType("int"); + + b.Property("ReferenceId") + .HasColumnType("longtext"); + + b.Property("SchematicReferenceId") + .HasColumnType("longtext"); + + b.Property("SymbolName") + .HasColumnType("longtext"); + + b.Property("UserId") + .HasColumnType("int"); + + b.HasKey("ProjectPartAssignmentId"); + + b.HasIndex("PartId"); + + b.HasIndex("ProjectId"); + + b.HasIndex("UserId"); + + b.ToTable("ProjectPartAssignments", "dbo"); + }); + + modelBuilder.Entity("Binner.Data.Model.ProjectPcbAssignment", b => + { + b.Property("ProjectPcbAssignmentId") + .ValueGeneratedOnAdd() + .HasColumnType("bigint"); + + MySqlPropertyBuilderExtensions.UseMySqlIdentityColumn(b.Property("ProjectPcbAssignmentId")); + + b.Property("DateCreatedUtc") + .ValueGeneratedOnAdd() + .HasColumnType("datetime(6)") + .HasDefaultValueSql("getutcdate()"); + + b.Property("DateModifiedUtc") + .ValueGeneratedOnAdd() + .HasColumnType("datetime(6)") + .HasDefaultValueSql("getutcdate()"); + + b.Property("OrganizationId") + .HasColumnType("int"); + + b.Property("PcbId") + .HasColumnType("bigint"); + + b.Property("ProjectId") + .HasColumnType("bigint"); + + b.Property("UserId") + .HasColumnType("int"); + + b.HasKey("ProjectPcbAssignmentId"); + + b.HasIndex("PcbId"); + + b.HasIndex("ProjectId"); + + b.HasIndex("UserId"); + + b.ToTable("ProjectPcbAssignments", "dbo"); + }); + + modelBuilder.Entity("Binner.Data.Model.ProjectPcbProduceHistory", b => + { + b.Property("ProjectPcbProduceHistoryId") + .ValueGeneratedOnAdd() + .HasColumnType("bigint"); + + MySqlPropertyBuilderExtensions.UseMySqlIdentityColumn(b.Property("ProjectPcbProduceHistoryId")); + + b.Property("DateCreatedUtc") + .ValueGeneratedOnAdd() + .HasColumnType("datetime(6)") + .HasDefaultValueSql("getutcdate()"); + + b.Property("DateModifiedUtc") + .ValueGeneratedOnAdd() + .HasColumnType("datetime(6)") + .HasDefaultValueSql("getutcdate()"); + + b.Property("OrganizationId") + .HasColumnType("int"); + + b.Property("PartsConsumed") + .HasColumnType("int"); + + b.Property("PcbCost") + .HasColumnType("double"); + + b.Property("PcbId") + .HasColumnType("bigint"); + + b.Property("PcbQuantity") + .HasColumnType("int"); + + b.Property("ProjectProduceHistoryId") + .HasColumnType("bigint"); + + b.Property("SerialNumber") + .HasColumnType("longtext"); + + b.Property("UserId") + .HasColumnType("int"); + + b.HasKey("ProjectPcbProduceHistoryId"); + + b.HasIndex("PcbId"); + + b.HasIndex("ProjectProduceHistoryId"); + + b.HasIndex("UserId"); + + b.ToTable("ProjectPcbProduceHistory", "dbo"); + }); + + modelBuilder.Entity("Binner.Data.Model.ProjectProduceHistory", b => + { + b.Property("ProjectProduceHistoryId") + .ValueGeneratedOnAdd() + .HasColumnType("bigint"); + + MySqlPropertyBuilderExtensions.UseMySqlIdentityColumn(b.Property("ProjectProduceHistoryId")); + + b.Property("DateCreatedUtc") + .ValueGeneratedOnAdd() + .HasColumnType("datetime(6)") + .HasDefaultValueSql("getutcdate()"); + + b.Property("DateModifiedUtc") + .ValueGeneratedOnAdd() + .HasColumnType("datetime(6)") + .HasDefaultValueSql("getutcdate()"); + + b.Property("OrganizationId") + .HasColumnType("int"); + + b.Property("PartsConsumed") + .HasColumnType("int"); + + b.Property("ProduceUnassociated") + .HasColumnType("tinyint(1)"); + + b.Property("ProjectId") + .HasColumnType("bigint"); + + b.Property("Quantity") + .HasColumnType("int"); + + b.Property("UserId") + .HasColumnType("int"); + + b.HasKey("ProjectProduceHistoryId"); + + b.HasIndex("ProjectId"); + + b.HasIndex("UserId"); + + b.ToTable("ProjectProduceHistory", "dbo"); + }); + + modelBuilder.Entity("Binner.Data.Model.StoredFile", b => + { + b.Property("StoredFileId") + .ValueGeneratedOnAdd() + .HasColumnType("bigint"); + + MySqlPropertyBuilderExtensions.UseMySqlIdentityColumn(b.Property("StoredFileId")); + + b.Property("Crc32") + .HasColumnType("int"); + + b.Property("DateCreatedUtc") + .ValueGeneratedOnAdd() + .HasColumnType("datetime(6)") + .HasDefaultValueSql("getutcdate()"); + + b.Property("DateModifiedUtc") + .ValueGeneratedOnAdd() + .HasColumnType("datetime(6)") + .HasDefaultValueSql("getutcdate()"); + + b.Property("FileLength") + .HasColumnType("int"); + + b.Property("FileName") + .IsRequired() + .HasColumnType("longtext"); + + b.Property("OrganizationId") + .HasColumnType("int"); + + b.Property("OriginalFileName") + .IsRequired() + .HasColumnType("longtext"); + + b.Property("PartId") + .HasColumnType("bigint"); + + b.Property("RecordId") + .HasColumnType("bigint"); + + b.Property("RecordType") + .HasColumnType("int"); + + b.Property("StoredFileType") + .HasColumnType("int"); + + b.Property("UserId") + .HasColumnType("int"); + + b.HasKey("StoredFileId"); + + b.HasIndex("PartId"); + + b.HasIndex("UserId"); + + b.ToTable("StoredFiles", "dbo"); + }); + + modelBuilder.Entity("Binner.Data.Model.User", b => + { + b.Property("UserId") + .ValueGeneratedOnAdd() + .HasColumnType("int"); + + MySqlPropertyBuilderExtensions.UseMySqlIdentityColumn(b.Property("UserId")); + + b.Property("DateCreatedUtc") + .ValueGeneratedOnAdd() + .HasColumnType("datetime(6)") + .HasDefaultValueSql("getutcdate()"); + + b.Property("DateEmailConfirmedUtc") + .HasColumnType("datetime(6)"); + + b.Property("DateLastActiveUtc") + .HasColumnType("datetime(6)"); + + b.Property("DateLastLoginUtc") + .HasColumnType("datetime(6)"); + + b.Property("DateLockedUtc") + .HasColumnType("datetime(6)"); + + b.Property("DateModifiedUtc") + .ValueGeneratedOnAdd() + .HasColumnType("datetime(6)") + .HasDefaultValueSql("getutcdate()"); + + b.Property("EmailAddress") + .IsRequired() + .HasColumnType("varchar(255)"); + + b.Property("EmailConfirmationToken") + .HasColumnType("longtext"); + + b.Property("EmailConfirmedIp") + .ValueGeneratedOnAdd() + .HasColumnType("bigint") + .HasDefaultValue(0L); + + b.Property("Ip") + .ValueGeneratedOnAdd() + .HasColumnType("bigint") + .HasDefaultValue(0L); + + b.Property("IsAdmin") + .HasColumnType("tinyint(1)"); + + b.Property("IsEmailConfirmed") + .HasColumnType("tinyint(1)"); + + b.Property("IsEmailSubscribed") + .HasColumnType("tinyint(1)"); + + b.Property("LastSetPasswordIp") + .ValueGeneratedOnAdd() + .HasColumnType("bigint") + .HasDefaultValue(0L); + + b.Property("LocaleCurrency") + .HasColumnType("longtext"); + + b.Property("LocaleLanguage") + .HasColumnType("longtext"); + + b.Property("Name") + .IsRequired() + .HasColumnType("varchar(255)"); + + b.Property("OrganizationId") + .HasColumnType("int"); + + b.Property("PasswordHash") + .IsRequired() + .HasColumnType("longtext"); + + b.Property("PhoneNumber") + .HasColumnType("varchar(255)"); + + b.Property("ProfileImage") + .HasColumnType("longblob"); + + b.Property("ReCaptchaScore") + .HasColumnType("double"); + + b.HasKey("UserId"); + + b.HasIndex("EmailAddress"); + + b.HasIndex("Name"); + + b.HasIndex("OrganizationId"); + + b.HasIndex("PhoneNumber"); + + b.ToTable("Users", "dbo"); + }); + + modelBuilder.Entity("Binner.Data.Model.UserConfiguration", b => + { + b.Property("UserConfigurationId") + .ValueGeneratedOnAdd() + .HasColumnType("int"); + + MySqlPropertyBuilderExtensions.UseMySqlIdentityColumn(b.Property("UserConfigurationId")); + + b.Property("BarcodeBufferTime") + .HasColumnType("int"); + + b.Property("BarcodeEnabled") + .HasColumnType("tinyint(1)"); + + b.Property("BarcodeIsDebug") + .HasColumnType("tinyint(1)"); + + b.Property("BarcodeMaxKeystrokeThresholdMs") + .HasColumnType("int"); + + b.Property("BarcodePrefix2D") + .IsRequired() + .HasColumnType("longtext"); + + b.Property("BarcodeProfile") + .HasColumnType("int"); + + b.Property("Currency") + .HasColumnType("int"); + + b.Property("DateCreatedUtc") + .ValueGeneratedOnAdd() + .HasColumnType("datetime(6)") + .HasDefaultValueSql("getutcdate()"); + + b.Property("DateModifiedUtc") + .ValueGeneratedOnAdd() + .HasColumnType("datetime(6)") + .HasDefaultValueSql("getutcdate()"); + + b.Property("DefaultPartLabelId") + .HasColumnType("int"); + + b.Property("EnableAutoPartSearch") + .HasColumnType("tinyint(1)"); + + b.Property("EnableCheckNewVersion") + .HasColumnType("tinyint(1)"); + + b.Property("EnableDarkMode") + .HasColumnType("tinyint(1)"); + + b.Property("Language") + .HasColumnType("int"); + + b.Property("OrganizationId") + .HasColumnType("int"); + + b.Property("UserId") + .HasColumnType("int"); + + b.HasKey("UserConfigurationId"); + + b.HasIndex("UserId"); + + b.ToTable("UserConfigurations", "dbo"); + }); + + modelBuilder.Entity("Binner.Data.Model.UserLoginHistory", b => + { + b.Property("UserLoginHistoryId") + .ValueGeneratedOnAdd() + .HasColumnType("int"); + + MySqlPropertyBuilderExtensions.UseMySqlIdentityColumn(b.Property("UserLoginHistoryId")); + + b.Property("CanLogin") + .HasColumnType("tinyint(1)"); + + b.Property("DateCreatedUtc") + .ValueGeneratedOnAdd() + .HasColumnType("datetime(6)") + .HasDefaultValueSql("getutcdate()"); + + b.Property("DateModifiedUtc") + .ValueGeneratedOnAdd() + .HasColumnType("datetime(6)") + .HasDefaultValueSql("getutcdate()"); + + b.Property("EmailAddress") + .HasColumnType("longtext"); + + b.Property("Ip") + .ValueGeneratedOnAdd() + .HasColumnType("bigint") + .HasDefaultValue(0L); + + b.Property("IsSuccessful") + .HasColumnType("tinyint(1)"); + + b.Property("Message") + .HasColumnType("longtext"); + + b.Property("OrganizationId") + .HasColumnType("int"); + + b.Property("ReCaptchaScore") + .HasColumnType("double"); + + b.Property("UserId") + .HasColumnType("int"); + + b.HasKey("UserLoginHistoryId"); + + b.HasIndex("UserId"); + + b.ToTable("UserLoginHistory", "dbo"); + }); + + modelBuilder.Entity("Binner.Data.Model.UserPrinterConfiguration", b => + { + b.Property("UserPrinterConfigurationId") + .ValueGeneratedOnAdd() + .HasColumnType("int"); + + MySqlPropertyBuilderExtensions.UseMySqlIdentityColumn(b.Property("UserPrinterConfigurationId")); + + b.Property("DateCreatedUtc") + .ValueGeneratedOnAdd() + .HasColumnType("datetime(6)") + .HasDefaultValueSql("getutcdate()"); + + b.Property("DateModifiedUtc") + .ValueGeneratedOnAdd() + .HasColumnType("datetime(6)") + .HasDefaultValueSql("getutcdate()"); + + b.Property("OrganizationId") + .HasColumnType("int"); + + b.Property("PartLabelName") + .IsRequired() + .HasColumnType("longtext"); + + b.Property("PartLabelSource") + .HasColumnType("int"); + + b.Property("PrintMode") + .HasColumnType("int"); + + b.Property("PrinterName") + .IsRequired() + .HasColumnType("longtext"); + + b.Property("RemoteAddressUrl") + .HasColumnType("longtext"); + + b.Property("UserId") + .HasColumnType("int"); + + b.HasKey("UserPrinterConfigurationId"); + + b.HasIndex("UserId"); + + b.ToTable("UserPrinterConfigurations", "dbo"); + }); + + modelBuilder.Entity("Binner.Data.Model.UserPrinterTemplateConfiguration", b => + { + b.Property("UserPrinterTemplateConfigurationId") + .ValueGeneratedOnAdd() + .HasColumnType("int"); + + MySqlPropertyBuilderExtensions.UseMySqlIdentityColumn(b.Property("UserPrinterTemplateConfigurationId")); + + b.Property("AutoSize") + .HasColumnType("tinyint(1)"); + + b.Property("Barcode") + .HasColumnType("tinyint(1)"); + + b.Property("Color") + .HasColumnType("longtext"); + + b.Property("Content") + .HasColumnType("longtext"); + + b.Property("DateCreatedUtc") + .ValueGeneratedOnAdd() + .HasColumnType("datetime(6)") + .HasDefaultValueSql("getutcdate()"); + + b.Property("DateModifiedUtc") + .ValueGeneratedOnAdd() + .HasColumnType("datetime(6)") + .HasDefaultValueSql("getutcdate()"); + + b.Property("FontName") + .IsRequired() + .HasColumnType("longtext"); + + b.Property("FontSize") + .HasColumnType("int"); + + b.Property("Label") + .HasColumnType("int"); + + b.Property("Line") + .HasColumnType("int"); + + b.Property("LowerCase") + .HasColumnType("tinyint(1)"); + + b.Property("MarginBottom") + .HasColumnType("int"); + + b.Property("MarginLeft") + .HasColumnType("int"); + + b.Property("MarginRight") + .HasColumnType("int"); + + b.Property("MarginTop") + .HasColumnType("int"); + + b.Property("OrganizationId") + .HasColumnType("int"); + + b.Property("Position") + .HasColumnType("int"); + + b.Property("Rotate") + .HasColumnType("int"); + + b.Property("UpperCase") + .HasColumnType("tinyint(1)"); + + b.Property("UserId") + .HasColumnType("int"); + + b.Property("UserPrinterConfigurationId") + .HasColumnType("int"); + + b.HasKey("UserPrinterTemplateConfigurationId"); + + b.HasIndex("UserId"); + + b.HasIndex("UserPrinterConfigurationId"); + + b.ToTable("UserPrinterTemplateConfigurations", "dbo"); + }); + + modelBuilder.Entity("Binner.Data.Model.UserToken", b => + { + b.Property("UserTokenId") + .ValueGeneratedOnAdd() + .HasColumnType("int"); + + MySqlPropertyBuilderExtensions.UseMySqlIdentityColumn(b.Property("UserTokenId")); + + b.Property("DateCreatedUtc") + .ValueGeneratedOnAdd() + .HasColumnType("datetime(6)") + .HasDefaultValueSql("getutcdate()"); + + b.Property("DateExpiredUtc") + .HasColumnType("datetime(6)"); + + b.Property("DateModifiedUtc") + .ValueGeneratedOnAdd() + .HasColumnType("datetime(6)") + .HasDefaultValueSql("getutcdate()"); + + b.Property("DateRevokedUtc") + .HasColumnType("datetime(6)"); + + b.Property("Ip") + .ValueGeneratedOnAdd() + .HasColumnType("bigint") + .HasDefaultValue(0L); + + b.Property("OrganizationId") + .HasColumnType("int"); + + b.Property("ReplacedByToken") + .HasColumnType("longtext"); + + b.Property("Token") + .IsRequired() + .HasColumnType("longtext"); + + b.Property("TokenConfig") + .HasColumnType("longtext"); + + b.Property("TokenTypeId") + .HasColumnType("int"); + + b.Property("UserId") + .HasColumnType("int"); + + b.HasKey("UserTokenId"); + + b.HasIndex("UserId"); + + b.ToTable("UserTokens", "dbo"); + }); + + modelBuilder.Entity("Binner.Data.Model.CustomField", b => + { + b.HasOne("Binner.Data.Model.User", "User") + .WithMany("CustomFields") + .HasForeignKey("UserId") + .OnDelete(DeleteBehavior.Restrict); + + b.Navigation("User"); + }); + + modelBuilder.Entity("Binner.Data.Model.CustomFieldValue", b => + { + b.HasOne("Binner.Data.Model.CustomField", "CustomField") + .WithMany("CustomFieldValues") + .HasForeignKey("CustomFieldId") + .OnDelete(DeleteBehavior.Restrict) + .IsRequired(); + + b.HasOne("Binner.Data.Model.User", "User") + .WithMany("CustomFieldValues") + .HasForeignKey("UserId") + .OnDelete(DeleteBehavior.Restrict); + + b.Navigation("CustomField"); + + b.Navigation("User"); + }); + + modelBuilder.Entity("Binner.Data.Model.Label", b => + { + b.HasOne("Binner.Data.Model.LabelTemplate", "LabelTemplate") + .WithMany("Labels") + .HasForeignKey("LabelTemplateId") + .OnDelete(DeleteBehavior.Restrict) + .IsRequired(); + + b.Navigation("LabelTemplate"); + }); + + modelBuilder.Entity("Binner.Data.Model.OAuthCredential", b => + { + b.HasOne("Binner.Data.Model.User", "User") + .WithMany("OAuthCredentials") + .HasForeignKey("UserId") + .OnDelete(DeleteBehavior.Restrict); + + b.Navigation("User"); + }); + + modelBuilder.Entity("Binner.Data.Model.OAuthRequest", b => + { + b.HasOne("Binner.Data.Model.User", "User") + .WithMany("OAuthRequests") + .HasForeignKey("UserId") + .OnDelete(DeleteBehavior.Restrict); + + b.Navigation("User"); + }); + + modelBuilder.Entity("Binner.Data.Model.OrderImportHistory", b => + { + b.HasOne("Binner.Data.Model.User", "User") + .WithMany("OrderImportHistory") + .HasForeignKey("UserId") + .OnDelete(DeleteBehavior.SetNull); + + b.Navigation("User"); + }); + + modelBuilder.Entity("Binner.Data.Model.OrderImportHistoryLineItem", b => + { + b.HasOne("Binner.Data.Model.OrderImportHistory", "OrderImportHistory") + .WithMany("OrderImportHistoryLineItems") + .HasForeignKey("OrderImportHistoryId") + .OnDelete(DeleteBehavior.Restrict) + .IsRequired(); + + b.HasOne("Binner.Data.Model.User", "User") + .WithMany("OrderImportHistoryLineItems") + .HasForeignKey("UserId") + .OnDelete(DeleteBehavior.SetNull); + + b.Navigation("OrderImportHistory"); + + b.Navigation("User"); + }); + + modelBuilder.Entity("Binner.Data.Model.OrganizationConfiguration", b => + { + b.HasOne("Binner.Data.Model.Organization", "Organization") + .WithMany("OrganizationConfigurations") + .HasForeignKey("OrganizationId") + .OnDelete(DeleteBehavior.Restrict); + + b.HasOne("Binner.Data.Model.User", null) + .WithMany("OrganizationConfigurations") + .HasForeignKey("UserId"); + + b.Navigation("Organization"); + }); + + modelBuilder.Entity("Binner.Data.Model.OrganizationIntegrationConfiguration", b => + { + b.HasOne("Binner.Data.Model.Organization", "Organization") + .WithMany("OrganizationIntegrationConfigurations") + .HasForeignKey("OrganizationId") + .OnDelete(DeleteBehavior.Restrict); + + b.HasOne("Binner.Data.Model.User", null) + .WithMany("OrganizationIntegrationConfigurations") + .HasForeignKey("UserId"); + + b.Navigation("Organization"); + }); + + modelBuilder.Entity("Binner.Data.Model.Part", b => + { + b.HasOne("Binner.Data.Model.PartType", "PartType") + .WithMany("Parts") + .HasForeignKey("PartTypeId") + .OnDelete(DeleteBehavior.Restrict) + .IsRequired(); + + b.HasOne("Binner.Data.Model.Project", "Project") + .WithMany("Parts") + .HasForeignKey("ProjectId") + .OnDelete(DeleteBehavior.Restrict); + + b.HasOne("Binner.Data.Model.User", "User") + .WithMany("Parts") + .HasForeignKey("UserId") + .OnDelete(DeleteBehavior.SetNull); + + b.Navigation("PartType"); + + b.Navigation("Project"); + + b.Navigation("User"); + }); + + modelBuilder.Entity("Binner.Data.Model.PartModel", b => + { + b.HasOne("Binner.Data.Model.Part", "Part") + .WithMany("PartModels") + .HasForeignKey("PartId") + .OnDelete(DeleteBehavior.Restrict) + .IsRequired(); + + b.HasOne("Binner.Data.Model.User", "User") + .WithMany("PartModels") + .HasForeignKey("UserId") + .OnDelete(DeleteBehavior.SetNull); + + b.Navigation("Part"); + + b.Navigation("User"); + }); + + modelBuilder.Entity("Binner.Data.Model.PartParametric", b => + { + b.HasOne("Binner.Data.Model.Part", "Part") + .WithMany("PartParametrics") + .HasForeignKey("PartId") + .OnDelete(DeleteBehavior.Restrict) + .IsRequired(); + + b.HasOne("Binner.Data.Model.User", "User") + .WithMany("PartParametrics") + .HasForeignKey("UserId") + .OnDelete(DeleteBehavior.SetNull); + + b.Navigation("Part"); + + b.Navigation("User"); + }); + + modelBuilder.Entity("Binner.Data.Model.PartScanHistory", b => + { + b.HasOne("Binner.Data.Model.Part", "Part") + .WithMany("PartScanHistories") + .HasForeignKey("PartId") + .OnDelete(DeleteBehavior.Restrict); + + b.HasOne("Binner.Data.Model.User", "User") + .WithMany("PartScanHistories") + .HasForeignKey("UserId") + .OnDelete(DeleteBehavior.SetNull); + + b.Navigation("Part"); + + b.Navigation("User"); + }); + + modelBuilder.Entity("Binner.Data.Model.PartSupplier", b => + { + b.HasOne("Binner.Data.Model.Part", "Part") + .WithMany("PartSuppliers") + .HasForeignKey("PartId") + .OnDelete(DeleteBehavior.Restrict) + .IsRequired(); + + b.HasOne("Binner.Data.Model.User", "User") + .WithMany("PartSuppliers") + .HasForeignKey("UserId") + .OnDelete(DeleteBehavior.SetNull); + + b.Navigation("Part"); + + b.Navigation("User"); + }); + + modelBuilder.Entity("Binner.Data.Model.PartType", b => + { + b.HasOne("Binner.Data.Model.PartType", "ParentPartType") + .WithMany() + .HasForeignKey("ParentPartTypeId") + .OnDelete(DeleteBehavior.Restrict); + + b.HasOne("Binner.Data.Model.User", "User") + .WithMany("PartTypes") + .HasForeignKey("UserId") + .OnDelete(DeleteBehavior.SetNull); + + b.Navigation("ParentPartType"); + + b.Navigation("User"); + }); + + modelBuilder.Entity("Binner.Data.Model.Pcb", b => + { + b.HasOne("Binner.Data.Model.User", "User") + .WithMany("Pcbs") + .HasForeignKey("UserId") + .OnDelete(DeleteBehavior.SetNull); + + b.Navigation("User"); + }); + + modelBuilder.Entity("Binner.Data.Model.PcbStoredFileAssignment", b => + { + b.HasOne("Binner.Data.Model.Pcb", "Pcb") + .WithMany("PcbStoredFileAssignments") + .HasForeignKey("PcbId") + .OnDelete(DeleteBehavior.Restrict) + .IsRequired(); + + b.HasOne("Binner.Data.Model.StoredFile", "StoredFile") + .WithMany("PcbStoredFileAssignments") + .HasForeignKey("StoredFileId") + .OnDelete(DeleteBehavior.Restrict) + .IsRequired(); + + b.HasOne("Binner.Data.Model.User", "User") + .WithMany("PcbStoredFileAssignments") + .HasForeignKey("UserId") + .OnDelete(DeleteBehavior.SetNull); + + b.Navigation("Pcb"); + + b.Navigation("StoredFile"); + + b.Navigation("User"); + }); + + modelBuilder.Entity("Binner.Data.Model.Project", b => + { + b.HasOne("Binner.Data.Model.User", "User") + .WithMany("Projects") + .HasForeignKey("UserId") + .OnDelete(DeleteBehavior.SetNull); + + b.Navigation("User"); + }); + + modelBuilder.Entity("Binner.Data.Model.ProjectPartAssignment", b => + { + b.HasOne("Binner.Data.Model.Part", "Part") + .WithMany("ProjectPartAssignments") + .HasForeignKey("PartId") + .OnDelete(DeleteBehavior.Restrict); + + b.HasOne("Binner.Data.Model.Project", "Project") + .WithMany("ProjectPartAssignments") + .HasForeignKey("ProjectId") + .OnDelete(DeleteBehavior.Restrict) + .IsRequired(); + + b.HasOne("Binner.Data.Model.User", "User") + .WithMany("ProjectPartAssignments") + .HasForeignKey("UserId") + .OnDelete(DeleteBehavior.SetNull); + + b.Navigation("Part"); + + b.Navigation("Project"); + + b.Navigation("User"); + }); + + modelBuilder.Entity("Binner.Data.Model.ProjectPcbAssignment", b => + { + b.HasOne("Binner.Data.Model.Pcb", "Pcb") + .WithMany("ProjectPcbAssignments") + .HasForeignKey("PcbId") + .OnDelete(DeleteBehavior.Restrict) + .IsRequired(); + + b.HasOne("Binner.Data.Model.Project", "Project") + .WithMany("ProjectPcbAssignments") + .HasForeignKey("ProjectId") + .OnDelete(DeleteBehavior.Restrict) + .IsRequired(); + + b.HasOne("Binner.Data.Model.User", "User") + .WithMany("ProjectPcbAssignments") + .HasForeignKey("UserId") + .OnDelete(DeleteBehavior.SetNull); + + b.Navigation("Pcb"); + + b.Navigation("Project"); + + b.Navigation("User"); + }); + + modelBuilder.Entity("Binner.Data.Model.ProjectPcbProduceHistory", b => + { + b.HasOne("Binner.Data.Model.Pcb", "Pcb") + .WithMany("ProjectPcbProduceHistory") + .HasForeignKey("PcbId"); + + b.HasOne("Binner.Data.Model.ProjectProduceHistory", "ProjectProduceHistory") + .WithMany("ProjectPcbProduceHistory") + .HasForeignKey("ProjectProduceHistoryId") + .OnDelete(DeleteBehavior.Restrict) + .IsRequired(); + + b.HasOne("Binner.Data.Model.User", "User") + .WithMany("ProjectPcbProduceHistory") + .HasForeignKey("UserId") + .OnDelete(DeleteBehavior.SetNull); + + b.Navigation("Pcb"); + + b.Navigation("ProjectProduceHistory"); + + b.Navigation("User"); + }); + + modelBuilder.Entity("Binner.Data.Model.ProjectProduceHistory", b => + { + b.HasOne("Binner.Data.Model.Project", "Project") + .WithMany("ProjectProduceHistory") + .HasForeignKey("ProjectId") + .OnDelete(DeleteBehavior.Restrict) + .IsRequired(); + + b.HasOne("Binner.Data.Model.User", "User") + .WithMany("ProjectProduceHistory") + .HasForeignKey("UserId") + .OnDelete(DeleteBehavior.SetNull); + + b.Navigation("Project"); + + b.Navigation("User"); + }); + + modelBuilder.Entity("Binner.Data.Model.StoredFile", b => + { + b.HasOne("Binner.Data.Model.Part", "Part") + .WithMany("StoredFiles") + .HasForeignKey("PartId") + .OnDelete(DeleteBehavior.Restrict); + + b.HasOne("Binner.Data.Model.User", "User") + .WithMany("StoredFiles") + .HasForeignKey("UserId") + .OnDelete(DeleteBehavior.SetNull); + + b.Navigation("Part"); + + b.Navigation("User"); + }); + + modelBuilder.Entity("Binner.Data.Model.User", b => + { + b.HasOne("Binner.Data.Model.Organization", "Organization") + .WithMany("Users") + .HasForeignKey("OrganizationId") + .OnDelete(DeleteBehavior.Restrict) + .IsRequired(); + + b.Navigation("Organization"); + }); + + modelBuilder.Entity("Binner.Data.Model.UserConfiguration", b => + { + b.HasOne("Binner.Data.Model.User", "User") + .WithMany("UserConfigurations") + .HasForeignKey("UserId") + .OnDelete(DeleteBehavior.Restrict); + + b.Navigation("User"); + }); + + modelBuilder.Entity("Binner.Data.Model.UserLoginHistory", b => + { + b.HasOne("Binner.Data.Model.User", "User") + .WithMany("UserLoginHistory") + .HasForeignKey("UserId") + .OnDelete(DeleteBehavior.SetNull); + + b.Navigation("User"); + }); + + modelBuilder.Entity("Binner.Data.Model.UserPrinterConfiguration", b => + { + b.HasOne("Binner.Data.Model.User", "User") + .WithMany("UserPrinterConfigurations") + .HasForeignKey("UserId") + .OnDelete(DeleteBehavior.Restrict); + + b.Navigation("User"); + }); + + modelBuilder.Entity("Binner.Data.Model.UserPrinterTemplateConfiguration", b => + { + b.HasOne("Binner.Data.Model.User", "User") + .WithMany("UserPrinterTemplateConfigurations") + .HasForeignKey("UserId") + .OnDelete(DeleteBehavior.Restrict); + + b.HasOne("Binner.Data.Model.UserPrinterConfiguration", "UserPrinterConfiguration") + .WithMany("UserPrinterTemplateConfigurations") + .HasForeignKey("UserPrinterConfigurationId") + .OnDelete(DeleteBehavior.Restrict) + .IsRequired(); + + b.Navigation("User"); + + b.Navigation("UserPrinterConfiguration"); + }); + + modelBuilder.Entity("Binner.Data.Model.UserToken", b => + { + b.HasOne("Binner.Data.Model.User", "User") + .WithMany("UserTokens") + .HasForeignKey("UserId") + .OnDelete(DeleteBehavior.SetNull); + + b.Navigation("User"); + }); + + modelBuilder.Entity("Binner.Data.Model.CustomField", b => + { + b.Navigation("CustomFieldValues"); + }); + + modelBuilder.Entity("Binner.Data.Model.LabelTemplate", b => + { + b.Navigation("Labels"); + }); + + modelBuilder.Entity("Binner.Data.Model.OrderImportHistory", b => + { + b.Navigation("OrderImportHistoryLineItems"); + }); + + modelBuilder.Entity("Binner.Data.Model.Organization", b => + { + b.Navigation("OrganizationConfigurations"); + + b.Navigation("OrganizationIntegrationConfigurations"); + + b.Navigation("Users"); + }); + + modelBuilder.Entity("Binner.Data.Model.Part", b => + { + b.Navigation("PartModels"); + + b.Navigation("PartParametrics"); + + b.Navigation("PartScanHistories"); + + b.Navigation("PartSuppliers"); + + b.Navigation("ProjectPartAssignments"); + + b.Navigation("StoredFiles"); + }); + + modelBuilder.Entity("Binner.Data.Model.PartType", b => + { + b.Navigation("Parts"); + }); + + modelBuilder.Entity("Binner.Data.Model.Pcb", b => + { + b.Navigation("PcbStoredFileAssignments"); + + b.Navigation("ProjectPcbAssignments"); + + b.Navigation("ProjectPcbProduceHistory"); + }); + + modelBuilder.Entity("Binner.Data.Model.Project", b => + { + b.Navigation("Parts"); + + b.Navigation("ProjectPartAssignments"); + + b.Navigation("ProjectPcbAssignments"); + + b.Navigation("ProjectProduceHistory"); + }); + + modelBuilder.Entity("Binner.Data.Model.ProjectProduceHistory", b => + { + b.Navigation("ProjectPcbProduceHistory"); + }); + + modelBuilder.Entity("Binner.Data.Model.StoredFile", b => + { + b.Navigation("PcbStoredFileAssignments"); + }); + + modelBuilder.Entity("Binner.Data.Model.User", b => + { + b.Navigation("CustomFieldValues"); + + b.Navigation("CustomFields"); + + b.Navigation("OAuthCredentials"); + + b.Navigation("OAuthRequests"); + + b.Navigation("OrderImportHistory"); + + b.Navigation("OrderImportHistoryLineItems"); + + b.Navigation("OrganizationConfigurations"); + + b.Navigation("OrganizationIntegrationConfigurations"); + + b.Navigation("PartModels"); + + b.Navigation("PartParametrics"); + + b.Navigation("PartScanHistories"); + + b.Navigation("PartSuppliers"); + + b.Navigation("PartTypes"); + + b.Navigation("Parts"); + + b.Navigation("PcbStoredFileAssignments"); + + b.Navigation("Pcbs"); + + b.Navigation("ProjectPartAssignments"); + + b.Navigation("ProjectPcbAssignments"); + + b.Navigation("ProjectPcbProduceHistory"); + + b.Navigation("ProjectProduceHistory"); + + b.Navigation("Projects"); + + b.Navigation("StoredFiles"); + + b.Navigation("UserConfigurations"); + + b.Navigation("UserLoginHistory"); + + b.Navigation("UserPrinterConfigurations"); + + b.Navigation("UserPrinterTemplateConfigurations"); + + b.Navigation("UserTokens"); + }); + + modelBuilder.Entity("Binner.Data.Model.UserPrinterConfiguration", b => + { + b.Navigation("UserPrinterTemplateConfigurations"); + }); +#pragma warning restore 612, 618 + } + } +} diff --git a/Binner/Data/Binner.Data.Migrations.MySql/Migrations/20250824132916_automaticMetadataFetch.cs b/Binner/Data/Binner.Data.Migrations.MySql/Migrations/20250824132916_automaticMetadataFetch.cs new file mode 100644 index 00000000..a17c11eb --- /dev/null +++ b/Binner/Data/Binner.Data.Migrations.MySql/Migrations/20250824132916_automaticMetadataFetch.cs @@ -0,0 +1,31 @@ +using Microsoft.EntityFrameworkCore.Migrations; + +#nullable disable + +namespace Binner.Data.Migrations.MySql.Migrations +{ + /// + public partial class automaticMetadataFetch : Migration + { + /// + protected override void Up(MigrationBuilder migrationBuilder) + { + migrationBuilder.AddColumn( + name: "enableAutomaticMetadataFetchingForExistingParts", + schema: "dbo", + table: "OrganizationConfigurations", + type: "tinyint(1)", + nullable: false, + defaultValue: true); + } + + /// + protected override void Down(MigrationBuilder migrationBuilder) + { + migrationBuilder.DropColumn( + name: "enableAutomaticMetadataFetchingForExistingParts", + schema: "dbo", + table: "OrganizationConfigurations"); + } + } +} diff --git a/Binner/Data/Binner.Data.Migrations.MySql/Migrations/BinnerContextModelSnapshot.cs b/Binner/Data/Binner.Data.Migrations.MySql/Migrations/BinnerContextModelSnapshot.cs index e024c3a2..d2fa84e7 100644 --- a/Binner/Data/Binner.Data.Migrations.MySql/Migrations/BinnerContextModelSnapshot.cs +++ b/Binner/Data/Binner.Data.Migrations.MySql/Migrations/BinnerContextModelSnapshot.cs @@ -547,6 +547,9 @@ protected override void BuildModel(ModelBuilder modelBuilder) b.Property("UserId") .HasColumnType("int"); + b.Property("enableAutomaticMetadataFetchingForExistingParts") + .HasColumnType("tinyint(1)"); + b.HasKey("OrganizationConfigurationId"); b.HasIndex("OrganizationId"); diff --git a/Binner/Data/Binner.Data.Migrations.Postgresql/Migrations/20250824132903_automaticMetadataFetch.Designer.cs b/Binner/Data/Binner.Data.Migrations.Postgresql/Migrations/20250824132903_automaticMetadataFetch.Designer.cs new file mode 100644 index 00000000..d2c6763e --- /dev/null +++ b/Binner/Data/Binner.Data.Migrations.Postgresql/Migrations/20250824132903_automaticMetadataFetch.Designer.cs @@ -0,0 +1,2607 @@ +// +using System; +using Binner.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 Binner.Data.Migrations.Postgresql.Migrations +{ + [DbContext(typeof(BinnerContext))] + [Migration("20250824132903_automaticMetadataFetch")] + partial class automaticMetadataFetch + { + /// + protected override void BuildTargetModel(ModelBuilder modelBuilder) + { +#pragma warning disable 612, 618 + modelBuilder + .HasDefaultSchema("dbo") + .HasAnnotation("ProductVersion", "9.0.6") + .HasAnnotation("Relational:MaxIdentifierLength", 63); + + NpgsqlModelBuilderExtensions.UseIdentityByDefaultColumns(modelBuilder); + + modelBuilder.Entity("Binner.Data.Model.CustomField", b => + { + b.Property("CustomFieldId") + .ValueGeneratedOnAdd() + .HasColumnType("bigint"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("CustomFieldId")); + + b.Property("CustomFieldTypeId") + .HasColumnType("integer"); + + b.Property("DateCreatedUtc") + .ValueGeneratedOnAdd() + .HasColumnType("timestamp with time zone") + .HasDefaultValueSql("getutcdate()"); + + b.Property("DateModifiedUtc") + .ValueGeneratedOnAdd() + .HasColumnType("timestamp with time zone") + .HasDefaultValueSql("getutcdate()"); + + b.Property("Description") + .HasColumnType("text"); + + b.Property("Name") + .IsRequired() + .HasColumnType("text"); + + b.Property("OrganizationId") + .HasColumnType("integer"); + + b.Property("UserId") + .HasColumnType("integer"); + + b.HasKey("CustomFieldId"); + + b.HasIndex("UserId"); + + b.ToTable("CustomFields", "dbo"); + }); + + modelBuilder.Entity("Binner.Data.Model.CustomFieldValue", b => + { + b.Property("CustomFieldValueId") + .ValueGeneratedOnAdd() + .HasColumnType("bigint"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("CustomFieldValueId")); + + b.Property("CustomFieldId") + .HasColumnType("bigint"); + + b.Property("CustomFieldTypeId") + .HasColumnType("integer"); + + b.Property("DateCreatedUtc") + .ValueGeneratedOnAdd() + .HasColumnType("timestamp with time zone") + .HasDefaultValueSql("getutcdate()"); + + b.Property("DateModifiedUtc") + .ValueGeneratedOnAdd() + .HasColumnType("timestamp with time zone") + .HasDefaultValueSql("getutcdate()"); + + b.Property("OrganizationId") + .HasColumnType("integer"); + + b.Property("RecordId") + .HasColumnType("bigint"); + + b.Property("UserId") + .HasColumnType("integer"); + + b.Property("Value") + .HasColumnType("text"); + + b.HasKey("CustomFieldValueId"); + + b.HasIndex("CustomFieldId"); + + b.HasIndex("UserId"); + + b.ToTable("CustomFieldValues", "dbo"); + }); + + modelBuilder.Entity("Binner.Data.Model.Label", b => + { + b.Property("LabelId") + .ValueGeneratedOnAdd() + .HasColumnType("integer"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("LabelId")); + + b.Property("DateCreatedUtc") + .ValueGeneratedOnAdd() + .HasColumnType("timestamp with time zone") + .HasDefaultValueSql("getutcdate()"); + + b.Property("DateModifiedUtc") + .ValueGeneratedOnAdd() + .HasColumnType("timestamp with time zone") + .HasDefaultValueSql("getutcdate()"); + + b.Property("IsPartLabelTemplate") + .HasColumnType("boolean"); + + b.Property("LabelTemplateId") + .HasColumnType("integer"); + + b.Property("Name") + .IsRequired() + .HasColumnType("text"); + + b.Property("OrganizationId") + .HasColumnType("integer"); + + b.Property("Template") + .IsRequired() + .HasColumnType("text"); + + b.Property("UserId") + .HasColumnType("integer"); + + b.HasKey("LabelId"); + + b.HasIndex("LabelTemplateId"); + + b.ToTable("Labels", "dbo"); + }); + + modelBuilder.Entity("Binner.Data.Model.LabelTemplate", b => + { + b.Property("LabelTemplateId") + .ValueGeneratedOnAdd() + .HasColumnType("integer"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("LabelTemplateId")); + + b.Property("DateCreatedUtc") + .ValueGeneratedOnAdd() + .HasColumnType("timestamp with time zone") + .HasDefaultValueSql("getutcdate()"); + + b.Property("DateModifiedUtc") + .ValueGeneratedOnAdd() + .HasColumnType("timestamp with time zone") + .HasDefaultValueSql("getutcdate()"); + + b.Property("Description") + .HasColumnType("text"); + + b.Property("Dpi") + .HasColumnType("integer"); + + b.Property("DriverHeight") + .HasColumnType("integer"); + + b.Property("DriverName") + .HasColumnType("text"); + + b.Property("DriverWidth") + .HasColumnType("integer"); + + b.Property("ExtraData") + .HasColumnType("text"); + + b.Property("Height") + .IsRequired() + .HasColumnType("text"); + + b.Property("LabelCount") + .HasColumnType("integer"); + + b.Property("LabelPaperSource") + .HasColumnType("integer"); + + b.Property("Margin") + .IsRequired() + .HasColumnType("text"); + + b.Property("Name") + .IsRequired() + .HasColumnType("text"); + + b.Property("OrganizationId") + .HasColumnType("integer"); + + b.Property("UserId") + .HasColumnType("integer"); + + b.Property("Width") + .IsRequired() + .HasColumnType("text"); + + b.HasKey("LabelTemplateId"); + + b.ToTable("LabelTemplates", "dbo"); + }); + + modelBuilder.Entity("Binner.Data.Model.MessageState", b => + { + b.Property("MessageStateId") + .ValueGeneratedOnAdd() + .HasColumnType("integer"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("MessageStateId")); + + b.Property("DateCreatedUtc") + .HasColumnType("timestamp with time zone"); + + b.Property("MessageId") + .HasColumnType("uuid"); + + b.Property("OrganizationId") + .HasColumnType("integer"); + + b.Property("ReadDateUtc") + .HasColumnType("timestamp with time zone"); + + b.Property("UserId") + .HasColumnType("integer"); + + b.HasKey("MessageStateId"); + + b.ToTable("MessageStates", "dbo"); + }); + + modelBuilder.Entity("Binner.Data.Model.OAuthCredential", b => + { + b.Property("OAuthCredentialId") + .ValueGeneratedOnAdd() + .HasColumnType("integer"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("OAuthCredentialId")); + + b.Property("AccessToken") + .HasColumnType("text"); + + b.Property("ApiSettings") + .HasColumnType("text"); + + b.Property("DateCreatedUtc") + .ValueGeneratedOnAdd() + .HasColumnType("timestamp with time zone") + .HasDefaultValueSql("getutcdate()"); + + b.Property("DateExpiresUtc") + .HasColumnType("timestamp with time zone"); + + b.Property("DateModifiedUtc") + .ValueGeneratedOnAdd() + .HasColumnType("timestamp with time zone") + .HasDefaultValueSql("getutcdate()"); + + b.Property("Ip") + .ValueGeneratedOnAdd() + .HasColumnType("bigint") + .HasDefaultValue(0L); + + b.Property("OrganizationId") + .HasColumnType("integer"); + + b.Property("Provider") + .IsRequired() + .HasMaxLength(128) + .HasColumnType("character varying(128)"); + + b.Property("RefreshToken") + .HasColumnType("text"); + + b.Property("UserId") + .HasColumnType("integer"); + + b.HasKey("OAuthCredentialId"); + + b.HasIndex("UserId"); + + b.HasIndex("Provider", "UserId", "OrganizationId"); + + b.ToTable("OAuthCredentials", "dbo"); + }); + + modelBuilder.Entity("Binner.Data.Model.OAuthRequest", b => + { + b.Property("OAuthRequestId") + .ValueGeneratedOnAdd() + .HasColumnType("integer"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("OAuthRequestId")); + + b.Property("AuthorizationCode") + .HasColumnType("text"); + + b.Property("AuthorizationReceived") + .HasColumnType("boolean") + .HasDefaultValue(false); + + b.Property("DateCreatedUtc") + .ValueGeneratedOnAdd() + .HasColumnType("timestamp with time zone") + .HasDefaultValueSql("getutcdate()"); + + b.Property("DateModifiedUtc") + .ValueGeneratedOnAdd() + .HasColumnType("timestamp with time zone") + .HasDefaultValueSql("getutcdate()"); + + b.Property("Error") + .HasColumnType("text"); + + b.Property("ErrorDescription") + .HasColumnType("text"); + + b.Property("Ip") + .ValueGeneratedOnAdd() + .HasColumnType("bigint") + .HasDefaultValue(0L); + + b.Property("OrganizationId") + .HasColumnType("integer"); + + b.Property("Provider") + .IsRequired() + .HasColumnType("text"); + + b.Property("RequestId") + .HasColumnType("uuid"); + + b.Property("ReturnToUrl") + .HasColumnType("text"); + + b.Property("UserId") + .HasColumnType("integer"); + + b.HasKey("OAuthRequestId"); + + b.HasIndex("UserId"); + + b.ToTable("OAuthRequests", "dbo"); + }); + + modelBuilder.Entity("Binner.Data.Model.OrderImportHistory", b => + { + b.Property("OrderImportHistoryId") + .ValueGeneratedOnAdd() + .HasColumnType("bigint"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("OrderImportHistoryId")); + + b.Property("DateCreatedUtc") + .ValueGeneratedOnAdd() + .HasColumnType("timestamp with time zone") + .HasDefaultValueSql("getutcdate()"); + + b.Property("DateModifiedUtc") + .ValueGeneratedOnAdd() + .HasColumnType("timestamp with time zone") + .HasDefaultValueSql("getutcdate()"); + + b.Property("Invoice") + .HasColumnType("text"); + + b.Property("OrganizationId") + .HasColumnType("integer"); + + b.Property("Packlist") + .HasColumnType("text"); + + b.Property("SalesOrder") + .IsRequired() + .HasColumnType("text"); + + b.Property("Supplier") + .IsRequired() + .HasColumnType("text"); + + b.Property("UserId") + .HasColumnType("integer"); + + b.HasKey("OrderImportHistoryId"); + + b.HasIndex("UserId"); + + b.ToTable("OrderImportHistories", "dbo"); + }); + + modelBuilder.Entity("Binner.Data.Model.OrderImportHistoryLineItem", b => + { + b.Property("OrderImportHistoryLineItemId") + .ValueGeneratedOnAdd() + .HasColumnType("bigint"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("OrderImportHistoryLineItemId")); + + b.Property("Cost") + .HasColumnType("double precision"); + + b.Property("CustomerReference") + .HasColumnType("text"); + + b.Property("DateCreatedUtc") + .ValueGeneratedOnAdd() + .HasColumnType("timestamp with time zone") + .HasDefaultValueSql("getutcdate()"); + + b.Property("DateModifiedUtc") + .ValueGeneratedOnAdd() + .HasColumnType("timestamp with time zone") + .HasDefaultValueSql("getutcdate()"); + + b.Property("Description") + .HasColumnType("text"); + + b.Property("Manufacturer") + .HasColumnType("text"); + + b.Property("ManufacturerPartNumber") + .HasColumnType("text"); + + b.Property("OrderImportHistoryId") + .HasColumnType("bigint"); + + b.Property("OrganizationId") + .HasColumnType("integer"); + + b.Property("PartId") + .HasColumnType("bigint"); + + b.Property("PartNumber") + .HasColumnType("text"); + + b.Property("Quantity") + .HasColumnType("bigint"); + + b.Property("Supplier") + .HasColumnType("text"); + + b.Property("UserId") + .HasColumnType("integer"); + + b.HasKey("OrderImportHistoryLineItemId"); + + b.HasIndex("OrderImportHistoryId"); + + b.HasIndex("UserId"); + + b.ToTable("OrderImportHistoryLineItems", "dbo"); + }); + + modelBuilder.Entity("Binner.Data.Model.Organization", b => + { + b.Property("OrganizationId") + .ValueGeneratedOnAdd() + .HasColumnType("integer"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("OrganizationId")); + + b.Property("DateCreatedUtc") + .ValueGeneratedOnAdd() + .HasColumnType("timestamp with time zone") + .HasDefaultValueSql("getutcdate()"); + + b.Property("DateLockedUtc") + .HasColumnType("timestamp with time zone"); + + b.Property("DateModifiedUtc") + .ValueGeneratedOnAdd() + .HasColumnType("timestamp with time zone") + .HasDefaultValueSql("getutcdate()"); + + b.Property("Description") + .HasColumnType("text"); + + b.Property("Name") + .HasColumnType("text"); + + b.HasKey("OrganizationId"); + + b.ToTable("Organizations", "dbo"); + }); + + modelBuilder.Entity("Binner.Data.Model.OrganizationConfiguration", b => + { + b.Property("OrganizationConfigurationId") + .ValueGeneratedOnAdd() + .HasColumnType("integer"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("OrganizationConfigurationId")); + + b.Property("CacheAbsoluteExpirationMinutes") + .HasColumnType("integer"); + + b.Property("CacheSlidingExpirationMinutes") + .HasColumnType("integer"); + + b.Property("DateCreatedUtc") + .ValueGeneratedOnAdd() + .HasColumnType("timestamp with time zone") + .HasDefaultValueSql("getutcdate()"); + + b.Property("DateModifiedUtc") + .ValueGeneratedOnAdd() + .HasColumnType("timestamp with time zone") + .HasDefaultValueSql("getutcdate()"); + + b.Property("KiCadSettingsJson") + .HasColumnType("text"); + + b.Property("LicenseKey") + .HasColumnType("text"); + + b.Property("MaxCacheItems") + .HasColumnType("integer"); + + b.Property("OrganizationId") + .HasColumnType("integer"); + + b.Property("UseModule") + .HasColumnType("integer"); + + b.Property("UserId") + .HasColumnType("integer"); + + b.Property("enableAutomaticMetadataFetchingForExistingParts") + .HasColumnType("boolean"); + + b.HasKey("OrganizationConfigurationId"); + + b.HasIndex("OrganizationId"); + + b.HasIndex("UserId"); + + b.ToTable("OrganizationConfigurations", "dbo"); + }); + + modelBuilder.Entity("Binner.Data.Model.OrganizationIntegrationConfiguration", b => + { + b.Property("OrganizationIntegrationConfigurationId") + .ValueGeneratedOnAdd() + .HasColumnType("integer"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("OrganizationIntegrationConfigurationId")); + + b.Property("ArrowApiKey") + .HasColumnType("text"); + + b.Property("ArrowApiUrl") + .IsRequired() + .HasColumnType("text"); + + b.Property("ArrowEnabled") + .HasColumnType("boolean"); + + b.Property("ArrowUsername") + .HasColumnType("text"); + + b.Property("DateCreatedUtc") + .ValueGeneratedOnAdd() + .HasColumnType("timestamp with time zone") + .HasDefaultValueSql("getutcdate()"); + + b.Property("DateModifiedUtc") + .ValueGeneratedOnAdd() + .HasColumnType("timestamp with time zone") + .HasDefaultValueSql("getutcdate()"); + + b.Property("DigiKeyApiUrl") + .HasColumnType("text"); + + b.Property("DigiKeyClientId") + .HasColumnType("text"); + + b.Property("DigiKeyClientSecret") + .HasColumnType("text"); + + b.Property("DigiKeyEnabled") + .HasColumnType("boolean"); + + b.Property("DigiKeyOAuthPostbackUrl") + .HasColumnType("text"); + + b.Property("DigiKeySite") + .HasColumnType("integer"); + + b.Property("MouserApiUrl") + .HasColumnType("text"); + + b.Property("MouserCartApiKey") + .HasColumnType("text"); + + b.Property("MouserEnabled") + .HasColumnType("boolean"); + + b.Property("MouserOrderApiKey") + .HasColumnType("text"); + + b.Property("MouserSearchApiKey") + .HasColumnType("text"); + + b.Property("NexarClientId") + .HasColumnType("text"); + + b.Property("NexarClientSecret") + .HasColumnType("text"); + + b.Property("NexarEnabled") + .HasColumnType("boolean"); + + b.Property("OrganizationId") + .HasColumnType("integer"); + + b.Property("SwarmApiKey") + .HasColumnType("text"); + + b.Property("SwarmApiUrl") + .HasColumnType("text"); + + b.Property("SwarmEnabled") + .HasColumnType("boolean"); + + b.Property("SwarmTimeout") + .HasColumnType("interval"); + + b.Property("TmeApiKey") + .HasColumnType("text"); + + b.Property("TmeApiUrl") + .IsRequired() + .HasColumnType("text"); + + b.Property("TmeApplicationSecret") + .HasColumnType("text"); + + b.Property("TmeCountry") + .HasColumnType("text"); + + b.Property("TmeEnabled") + .HasColumnType("boolean"); + + b.Property("TmeResolveExternalLinks") + .HasColumnType("boolean"); + + b.Property("UserId") + .HasColumnType("integer"); + + b.HasKey("OrganizationIntegrationConfigurationId"); + + b.HasIndex("OrganizationId"); + + b.HasIndex("UserId"); + + b.ToTable("OrganizationIntegrationConfigurations", "dbo"); + }); + + modelBuilder.Entity("Binner.Data.Model.Part", b => + { + b.Property("PartId") + .ValueGeneratedOnAdd() + .HasColumnType("bigint"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("PartId")); + + b.Property("ArrowPartNumber") + .HasColumnType("text"); + + b.Property("BaseProductNumber") + .HasColumnType("text"); + + b.Property("BinNumber") + .HasColumnType("text"); + + b.Property("BinNumber2") + .HasColumnType("text"); + + b.Property("Cost") + .HasColumnType("decimal(18,4)"); + + b.Property("Currency") + .HasColumnType("text"); + + b.Property("DataSource") + .HasColumnType("integer"); + + b.Property("DataSourceId") + .HasColumnType("text"); + + b.Property("DatasheetUrl") + .HasColumnType("text"); + + b.Property("DateCreatedUtc") + .ValueGeneratedOnAdd() + .HasColumnType("timestamp with time zone") + .HasDefaultValueSql("getutcdate()"); + + b.Property("DateModifiedUtc") + .ValueGeneratedOnAdd() + .HasColumnType("timestamp with time zone") + .HasDefaultValueSql("getutcdate()"); + + b.Property("Description") + .HasColumnType("text"); + + b.Property("DigiKeyPartNumber") + .HasColumnType("text"); + + b.Property("ExportControlClassNumber") + .HasColumnType("text"); + + b.Property("ExtensionValue1") + .HasColumnType("text"); + + b.Property("ExtensionValue2") + .HasColumnType("text"); + + b.Property("FootprintName") + .HasColumnType("text"); + + b.Property("HtsusCode") + .HasColumnType("text"); + + b.Property("ImageUrl") + .HasColumnType("text"); + + b.Property("Keywords") + .HasColumnType("text"); + + b.Property("LastSwarmSyncUtc") + .HasColumnType("timestamp with time zone"); + + b.Property("LeadTime") + .HasColumnType("text"); + + b.Property("Location") + .HasColumnType("text"); + + b.Property("LowStockThreshold") + .HasColumnType("integer"); + + b.Property("LowestCostSupplier") + .HasColumnType("text"); + + b.Property("LowestCostSupplierUrl") + .HasColumnType("text"); + + b.Property("Manufacturer") + .HasColumnType("text"); + + b.Property("ManufacturerPartNumber") + .HasColumnType("text"); + + b.Property("MetadataLastUpdatedUtc") + .HasColumnType("timestamp with time zone"); + + b.Property("MoistureSensitivityLevel") + .HasColumnType("text"); + + b.Property("MountingTypeId") + .HasColumnType("integer"); + + b.Property("MouserPartNumber") + .HasColumnType("text"); + + b.Property("OrganizationId") + .HasColumnType("integer"); + + b.Property("OtherNames") + .HasColumnType("text"); + + b.Property("PackageType") + .HasColumnType("text"); + + b.Property("PartNumber") + .HasMaxLength(64) + .HasColumnType("character varying(64)"); + + b.Property("PartTypeId") + .HasColumnType("bigint"); + + b.Property("ProductStatus") + .HasColumnType("text"); + + b.Property("ProductUrl") + .HasColumnType("text"); + + b.Property("ProjectId") + .HasColumnType("bigint"); + + b.Property("Quantity") + .HasColumnType("bigint"); + + b.Property("ReachStatus") + .HasColumnType("text"); + + b.Property("RohsStatus") + .HasColumnType("text"); + + b.Property("Series") + .HasColumnType("text"); + + b.Property("ShortId") + .HasColumnType("text"); + + b.Property("SwarmPartNumberManufacturerId") + .HasColumnType("integer"); + + b.Property("SymbolName") + .HasColumnType("text"); + + b.Property("TmePartNumber") + .HasColumnType("text"); + + b.Property("UserId") + .HasColumnType("integer"); + + b.Property("Value") + .HasColumnType("text"); + + b.HasKey("PartId"); + + b.HasIndex("ProjectId"); + + b.HasIndex("UserId"); + + b.HasIndex("BinNumber", "UserId"); + + b.HasIndex("BinNumber2", "UserId"); + + b.HasIndex("Description", "UserId"); + + b.HasIndex("DigiKeyPartNumber", "UserId"); + + b.HasIndex("Keywords", "UserId"); + + b.HasIndex("Location", "UserId"); + + b.HasIndex("Manufacturer", "UserId"); + + b.HasIndex("ManufacturerPartNumber", "UserId"); + + b.HasIndex("MouserPartNumber", "UserId"); + + b.HasIndex("PartNumber", "UserId"); + + b.HasIndex("PartTypeId", "UserId"); + + b.ToTable("Parts", "dbo"); + }); + + modelBuilder.Entity("Binner.Data.Model.PartModel", b => + { + b.Property("PartModelId") + .ValueGeneratedOnAdd() + .HasColumnType("bigint"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("PartModelId")); + + b.Property("DateCreatedUtc") + .ValueGeneratedOnAdd() + .HasColumnType("timestamp with time zone") + .HasDefaultValueSql("getutcdate()"); + + b.Property("DateModifiedUtc") + .ValueGeneratedOnAdd() + .HasColumnType("timestamp with time zone") + .HasDefaultValueSql("getutcdate()"); + + b.Property("Filename") + .HasColumnType("text"); + + b.Property("ModelType") + .HasColumnType("integer"); + + b.Property("Name") + .IsRequired() + .HasColumnType("text"); + + b.Property("OrganizationId") + .HasColumnType("integer"); + + b.Property("PartId") + .HasColumnType("bigint"); + + b.Property("Source") + .HasColumnType("integer"); + + b.Property("Url") + .HasColumnType("text"); + + b.Property("UserId") + .HasColumnType("integer"); + + b.HasKey("PartModelId"); + + b.HasIndex("UserId"); + + b.HasIndex("PartId", "OrganizationId"); + + b.ToTable("PartModels", "dbo"); + }); + + modelBuilder.Entity("Binner.Data.Model.PartParametric", b => + { + b.Property("PartParametricId") + .ValueGeneratedOnAdd() + .HasColumnType("bigint"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("PartParametricId")); + + b.Property("DateCreatedUtc") + .ValueGeneratedOnAdd() + .HasColumnType("timestamp with time zone") + .HasDefaultValueSql("getutcdate()"); + + b.Property("DateModifiedUtc") + .ValueGeneratedOnAdd() + .HasColumnType("timestamp with time zone") + .HasDefaultValueSql("getutcdate()"); + + b.Property("DigiKeyParameterId") + .HasColumnType("integer"); + + b.Property("DigiKeyParameterText") + .HasColumnType("text"); + + b.Property("DigiKeyParameterType") + .HasColumnType("text"); + + b.Property("DigiKeyValueId") + .HasColumnType("text"); + + b.Property("DigiKeyValueText") + .HasColumnType("text"); + + b.Property("Name") + .IsRequired() + .HasColumnType("text"); + + b.Property("OrganizationId") + .HasColumnType("integer"); + + b.Property("PartId") + .HasColumnType("bigint"); + + b.Property("Units") + .HasColumnType("integer"); + + b.Property("UserId") + .HasColumnType("integer"); + + b.Property("Value") + .IsRequired() + .HasColumnType("text"); + + b.Property("ValueNumber") + .HasColumnType("decimal(18,4)"); + + b.HasKey("PartParametricId"); + + b.HasIndex("UserId"); + + b.HasIndex("PartId", "OrganizationId"); + + b.ToTable("PartParametrics", "dbo"); + }); + + modelBuilder.Entity("Binner.Data.Model.PartScanHistory", b => + { + b.Property("PartScanHistoryId") + .ValueGeneratedOnAdd() + .HasColumnType("bigint"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("PartScanHistoryId")); + + b.Property("BarcodeType") + .HasColumnType("integer"); + + b.Property("CountryOfOrigin") + .HasColumnType("text"); + + b.Property("Crc") + .HasColumnType("integer"); + + b.Property("DateCreatedUtc") + .ValueGeneratedOnAdd() + .HasColumnType("timestamp with time zone") + .HasDefaultValueSql("getutcdate()"); + + b.Property("DateModifiedUtc") + .ValueGeneratedOnAdd() + .HasColumnType("timestamp with time zone") + .HasDefaultValueSql("getutcdate()"); + + b.Property("Description") + .HasColumnType("text"); + + b.Property("Invoice") + .HasColumnType("text"); + + b.Property("LotCode") + .HasColumnType("text"); + + b.Property("ManufacturerPartNumber") + .HasColumnType("text"); + + b.Property("Mid") + .HasColumnType("text"); + + b.Property("OrganizationId") + .HasColumnType("integer"); + + b.Property("Packlist") + .HasColumnType("text"); + + b.Property("PartId") + .HasColumnType("bigint"); + + b.Property("Quantity") + .HasColumnType("integer"); + + b.Property("RawScan") + .IsRequired() + .HasColumnType("text"); + + b.Property("SalesOrder") + .HasColumnType("text"); + + b.Property("ScannedLabelType") + .HasColumnType("integer"); + + b.Property("Supplier") + .HasColumnType("integer"); + + b.Property("SupplierPartNumber") + .HasColumnType("text"); + + b.Property("UserId") + .HasColumnType("integer"); + + b.HasKey("PartScanHistoryId"); + + b.HasIndex("PartId"); + + b.HasIndex("UserId"); + + b.ToTable("PartScanHistories", "dbo"); + }); + + modelBuilder.Entity("Binner.Data.Model.PartSupplier", b => + { + b.Property("PartSupplierId") + .ValueGeneratedOnAdd() + .HasColumnType("bigint"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("PartSupplierId")); + + b.Property("Cost") + .HasColumnType("decimal(18,4)"); + + b.Property("DateCreatedUtc") + .ValueGeneratedOnAdd() + .HasColumnType("timestamp with time zone") + .HasDefaultValueSql("getutcdate()"); + + b.Property("DateModifiedUtc") + .ValueGeneratedOnAdd() + .HasColumnType("timestamp with time zone") + .HasDefaultValueSql("getutcdate()"); + + b.Property("ImageUrl") + .HasColumnType("text"); + + b.Property("MinimumOrderQuantity") + .HasColumnType("integer"); + + b.Property("Name") + .HasColumnType("text"); + + b.Property("OrganizationId") + .HasColumnType("integer"); + + b.Property("PartId") + .HasColumnType("bigint"); + + b.Property("ProductUrl") + .HasColumnType("text"); + + b.Property("QuantityAvailable") + .HasColumnType("integer"); + + b.Property("SupplierPartNumber") + .HasColumnType("text"); + + b.Property("UserId") + .HasColumnType("integer"); + + b.HasKey("PartSupplierId"); + + b.HasIndex("PartId"); + + b.HasIndex("UserId"); + + b.ToTable("PartSuppliers", "dbo"); + }); + + modelBuilder.Entity("Binner.Data.Model.PartType", b => + { + b.Property("PartTypeId") + .ValueGeneratedOnAdd() + .HasColumnType("bigint"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("PartTypeId")); + + b.Property("DateCreatedUtc") + .ValueGeneratedOnAdd() + .HasColumnType("timestamp with time zone") + .HasDefaultValueSql("getutcdate()"); + + b.Property("DateModifiedUtc") + .ValueGeneratedOnAdd() + .HasColumnType("timestamp with time zone") + .HasDefaultValueSql("getutcdate()"); + + b.Property("Description") + .HasColumnType("text"); + + b.Property("Icon") + .HasColumnType("text"); + + b.Property("Keywords") + .HasColumnType("text"); + + b.Property("Name") + .HasColumnType("text"); + + b.Property("OrganizationId") + .HasColumnType("integer"); + + b.Property("ParentPartTypeId") + .HasColumnType("bigint"); + + b.Property("ReferenceDesignator") + .HasColumnType("text"); + + b.Property("SymbolId") + .HasColumnType("text"); + + b.Property("UserId") + .HasColumnType("integer"); + + b.HasKey("PartTypeId"); + + b.HasIndex("ParentPartTypeId"); + + b.HasIndex("UserId"); + + b.HasIndex("Name", "UserId"); + + b.ToTable("PartTypes", "dbo"); + }); + + modelBuilder.Entity("Binner.Data.Model.Pcb", b => + { + b.Property("PcbId") + .ValueGeneratedOnAdd() + .HasColumnType("bigint"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("PcbId")); + + b.Property("Cost") + .HasColumnType("double precision"); + + b.Property("DateCreatedUtc") + .ValueGeneratedOnAdd() + .HasColumnType("timestamp with time zone") + .HasDefaultValueSql("getutcdate()"); + + b.Property("DateModifiedUtc") + .ValueGeneratedOnAdd() + .HasColumnType("timestamp with time zone") + .HasDefaultValueSql("getutcdate()"); + + b.Property("Description") + .HasColumnType("text"); + + b.Property("LastSerialNumber") + .HasColumnType("text"); + + b.Property("Name") + .HasColumnType("text"); + + b.Property("OrganizationId") + .HasColumnType("integer"); + + b.Property("Quantity") + .HasColumnType("integer"); + + b.Property("SerialNumberFormat") + .HasColumnType("text"); + + b.Property("UserId") + .HasColumnType("integer"); + + b.HasKey("PcbId"); + + b.HasIndex("UserId"); + + b.ToTable("Pcbs", "dbo"); + }); + + modelBuilder.Entity("Binner.Data.Model.PcbStoredFileAssignment", b => + { + b.Property("PcbStoredFileAssignmentId") + .ValueGeneratedOnAdd() + .HasColumnType("bigint"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("PcbStoredFileAssignmentId")); + + b.Property("DateCreatedUtc") + .ValueGeneratedOnAdd() + .HasColumnType("timestamp with time zone") + .HasDefaultValueSql("getutcdate()"); + + b.Property("DateModifiedUtc") + .ValueGeneratedOnAdd() + .HasColumnType("timestamp with time zone") + .HasDefaultValueSql("getutcdate()"); + + b.Property("Name") + .HasColumnType("text"); + + b.Property("Notes") + .HasColumnType("text"); + + b.Property("OrganizationId") + .HasColumnType("integer"); + + b.Property("PcbId") + .HasColumnType("bigint"); + + b.Property("StoredFileId") + .HasColumnType("bigint"); + + b.Property("UserId") + .HasColumnType("integer"); + + b.HasKey("PcbStoredFileAssignmentId"); + + b.HasIndex("PcbId"); + + b.HasIndex("StoredFileId"); + + b.HasIndex("UserId"); + + b.ToTable("PcbStoredFileAssignments", "dbo"); + }); + + modelBuilder.Entity("Binner.Data.Model.Project", b => + { + b.Property("ProjectId") + .ValueGeneratedOnAdd() + .HasColumnType("bigint"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("ProjectId")); + + b.Property("Color") + .HasColumnType("integer"); + + b.Property("DateCreatedUtc") + .ValueGeneratedOnAdd() + .HasColumnType("timestamp with time zone") + .HasDefaultValueSql("getutcdate()"); + + b.Property("DateModifiedUtc") + .ValueGeneratedOnAdd() + .HasColumnType("timestamp with time zone") + .HasDefaultValueSql("getutcdate()"); + + b.Property("Description") + .HasColumnType("text"); + + b.Property("Location") + .HasColumnType("text"); + + b.Property("Name") + .HasColumnType("text"); + + b.Property("Notes") + .HasColumnType("text"); + + b.Property("OrganizationId") + .HasColumnType("integer"); + + b.Property("UserId") + .HasColumnType("integer"); + + b.HasKey("ProjectId"); + + b.HasIndex("UserId"); + + b.HasIndex("Name", "UserId"); + + b.ToTable("Projects", "dbo"); + }); + + modelBuilder.Entity("Binner.Data.Model.ProjectPartAssignment", b => + { + b.Property("ProjectPartAssignmentId") + .ValueGeneratedOnAdd() + .HasColumnType("bigint"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("ProjectPartAssignmentId")); + + b.Property("Cost") + .HasColumnType("double precision"); + + b.Property("Currency") + .HasColumnType("text"); + + b.Property("CustomDescription") + .HasColumnType("text"); + + b.Property("DateCreatedUtc") + .ValueGeneratedOnAdd() + .HasColumnType("timestamp with time zone") + .HasDefaultValueSql("getutcdate()"); + + b.Property("DateModifiedUtc") + .ValueGeneratedOnAdd() + .HasColumnType("timestamp with time zone") + .HasDefaultValueSql("getutcdate()"); + + b.Property("FootprintName") + .HasColumnType("text"); + + b.Property("Notes") + .HasColumnType("text"); + + b.Property("OrganizationId") + .HasColumnType("integer"); + + b.Property("PartId") + .HasColumnType("bigint"); + + b.Property("PartName") + .HasColumnType("text"); + + b.Property("PcbId") + .HasColumnType("bigint"); + + b.Property("ProjectId") + .HasColumnType("bigint"); + + b.Property("Quantity") + .HasColumnType("integer"); + + b.Property("QuantityAvailable") + .HasColumnType("integer"); + + b.Property("ReferenceId") + .HasColumnType("text"); + + b.Property("SchematicReferenceId") + .HasColumnType("text"); + + b.Property("SymbolName") + .HasColumnType("text"); + + b.Property("UserId") + .HasColumnType("integer"); + + b.HasKey("ProjectPartAssignmentId"); + + b.HasIndex("PartId"); + + b.HasIndex("ProjectId"); + + b.HasIndex("UserId"); + + b.ToTable("ProjectPartAssignments", "dbo"); + }); + + modelBuilder.Entity("Binner.Data.Model.ProjectPcbAssignment", b => + { + b.Property("ProjectPcbAssignmentId") + .ValueGeneratedOnAdd() + .HasColumnType("bigint"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("ProjectPcbAssignmentId")); + + b.Property("DateCreatedUtc") + .ValueGeneratedOnAdd() + .HasColumnType("timestamp with time zone") + .HasDefaultValueSql("getutcdate()"); + + b.Property("DateModifiedUtc") + .ValueGeneratedOnAdd() + .HasColumnType("timestamp with time zone") + .HasDefaultValueSql("getutcdate()"); + + b.Property("OrganizationId") + .HasColumnType("integer"); + + b.Property("PcbId") + .HasColumnType("bigint"); + + b.Property("ProjectId") + .HasColumnType("bigint"); + + b.Property("UserId") + .HasColumnType("integer"); + + b.HasKey("ProjectPcbAssignmentId"); + + b.HasIndex("PcbId"); + + b.HasIndex("ProjectId"); + + b.HasIndex("UserId"); + + b.ToTable("ProjectPcbAssignments", "dbo"); + }); + + modelBuilder.Entity("Binner.Data.Model.ProjectPcbProduceHistory", b => + { + b.Property("ProjectPcbProduceHistoryId") + .ValueGeneratedOnAdd() + .HasColumnType("bigint"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("ProjectPcbProduceHistoryId")); + + b.Property("DateCreatedUtc") + .ValueGeneratedOnAdd() + .HasColumnType("timestamp with time zone") + .HasDefaultValueSql("getutcdate()"); + + b.Property("DateModifiedUtc") + .ValueGeneratedOnAdd() + .HasColumnType("timestamp with time zone") + .HasDefaultValueSql("getutcdate()"); + + b.Property("OrganizationId") + .HasColumnType("integer"); + + b.Property("PartsConsumed") + .HasColumnType("integer"); + + b.Property("PcbCost") + .HasColumnType("double precision"); + + b.Property("PcbId") + .HasColumnType("bigint"); + + b.Property("PcbQuantity") + .HasColumnType("integer"); + + b.Property("ProjectProduceHistoryId") + .HasColumnType("bigint"); + + b.Property("SerialNumber") + .HasColumnType("text"); + + b.Property("UserId") + .HasColumnType("integer"); + + b.HasKey("ProjectPcbProduceHistoryId"); + + b.HasIndex("PcbId"); + + b.HasIndex("ProjectProduceHistoryId"); + + b.HasIndex("UserId"); + + b.ToTable("ProjectPcbProduceHistory", "dbo"); + }); + + modelBuilder.Entity("Binner.Data.Model.ProjectProduceHistory", b => + { + b.Property("ProjectProduceHistoryId") + .ValueGeneratedOnAdd() + .HasColumnType("bigint"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("ProjectProduceHistoryId")); + + b.Property("DateCreatedUtc") + .ValueGeneratedOnAdd() + .HasColumnType("timestamp with time zone") + .HasDefaultValueSql("getutcdate()"); + + b.Property("DateModifiedUtc") + .ValueGeneratedOnAdd() + .HasColumnType("timestamp with time zone") + .HasDefaultValueSql("getutcdate()"); + + b.Property("OrganizationId") + .HasColumnType("integer"); + + b.Property("PartsConsumed") + .HasColumnType("integer"); + + b.Property("ProduceUnassociated") + .HasColumnType("boolean"); + + b.Property("ProjectId") + .HasColumnType("bigint"); + + b.Property("Quantity") + .HasColumnType("integer"); + + b.Property("UserId") + .HasColumnType("integer"); + + b.HasKey("ProjectProduceHistoryId"); + + b.HasIndex("ProjectId"); + + b.HasIndex("UserId"); + + b.ToTable("ProjectProduceHistory", "dbo"); + }); + + modelBuilder.Entity("Binner.Data.Model.StoredFile", b => + { + b.Property("StoredFileId") + .ValueGeneratedOnAdd() + .HasColumnType("bigint"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("StoredFileId")); + + b.Property("Crc32") + .HasColumnType("integer"); + + b.Property("DateCreatedUtc") + .ValueGeneratedOnAdd() + .HasColumnType("timestamp with time zone") + .HasDefaultValueSql("getutcdate()"); + + b.Property("DateModifiedUtc") + .ValueGeneratedOnAdd() + .HasColumnType("timestamp with time zone") + .HasDefaultValueSql("getutcdate()"); + + b.Property("FileLength") + .HasColumnType("integer"); + + b.Property("FileName") + .IsRequired() + .HasColumnType("text"); + + b.Property("OrganizationId") + .HasColumnType("integer"); + + b.Property("OriginalFileName") + .IsRequired() + .HasColumnType("text"); + + b.Property("PartId") + .HasColumnType("bigint"); + + b.Property("RecordId") + .HasColumnType("bigint"); + + b.Property("RecordType") + .HasColumnType("integer"); + + b.Property("StoredFileType") + .HasColumnType("integer"); + + b.Property("UserId") + .HasColumnType("integer"); + + b.HasKey("StoredFileId"); + + b.HasIndex("PartId"); + + b.HasIndex("UserId"); + + b.ToTable("StoredFiles", "dbo"); + }); + + modelBuilder.Entity("Binner.Data.Model.User", b => + { + b.Property("UserId") + .ValueGeneratedOnAdd() + .HasColumnType("integer"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("UserId")); + + b.Property("DateCreatedUtc") + .ValueGeneratedOnAdd() + .HasColumnType("timestamp with time zone") + .HasDefaultValueSql("getutcdate()"); + + b.Property("DateEmailConfirmedUtc") + .HasColumnType("timestamp with time zone"); + + b.Property("DateLastActiveUtc") + .HasColumnType("timestamp with time zone"); + + b.Property("DateLastLoginUtc") + .HasColumnType("timestamp with time zone"); + + b.Property("DateLockedUtc") + .HasColumnType("timestamp with time zone"); + + b.Property("DateModifiedUtc") + .ValueGeneratedOnAdd() + .HasColumnType("timestamp with time zone") + .HasDefaultValueSql("getutcdate()"); + + b.Property("EmailAddress") + .IsRequired() + .HasColumnType("text"); + + b.Property("EmailConfirmationToken") + .HasColumnType("text"); + + b.Property("EmailConfirmedIp") + .ValueGeneratedOnAdd() + .HasColumnType("bigint") + .HasDefaultValue(0L); + + b.Property("Ip") + .ValueGeneratedOnAdd() + .HasColumnType("bigint") + .HasDefaultValue(0L); + + b.Property("IsAdmin") + .HasColumnType("boolean"); + + b.Property("IsEmailConfirmed") + .HasColumnType("boolean"); + + b.Property("IsEmailSubscribed") + .HasColumnType("boolean"); + + b.Property("LastSetPasswordIp") + .ValueGeneratedOnAdd() + .HasColumnType("bigint") + .HasDefaultValue(0L); + + b.Property("LocaleCurrency") + .HasColumnType("text"); + + b.Property("LocaleLanguage") + .HasColumnType("text"); + + b.Property("Name") + .IsRequired() + .HasColumnType("text"); + + b.Property("OrganizationId") + .HasColumnType("integer"); + + b.Property("PasswordHash") + .IsRequired() + .HasColumnType("text"); + + b.Property("PhoneNumber") + .HasColumnType("text"); + + b.Property("ProfileImage") + .HasColumnType("bytea"); + + b.Property("ReCaptchaScore") + .HasColumnType("double precision"); + + b.HasKey("UserId"); + + b.HasIndex("EmailAddress"); + + b.HasIndex("Name"); + + b.HasIndex("OrganizationId"); + + b.HasIndex("PhoneNumber"); + + b.ToTable("Users", "dbo"); + }); + + modelBuilder.Entity("Binner.Data.Model.UserConfiguration", b => + { + b.Property("UserConfigurationId") + .ValueGeneratedOnAdd() + .HasColumnType("integer"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("UserConfigurationId")); + + b.Property("BarcodeBufferTime") + .HasColumnType("integer"); + + b.Property("BarcodeEnabled") + .HasColumnType("boolean"); + + b.Property("BarcodeIsDebug") + .HasColumnType("boolean"); + + b.Property("BarcodeMaxKeystrokeThresholdMs") + .HasColumnType("integer"); + + b.Property("BarcodePrefix2D") + .IsRequired() + .HasColumnType("text"); + + b.Property("BarcodeProfile") + .HasColumnType("integer"); + + b.Property("Currency") + .HasColumnType("integer"); + + b.Property("DateCreatedUtc") + .ValueGeneratedOnAdd() + .HasColumnType("timestamp with time zone") + .HasDefaultValueSql("getutcdate()"); + + b.Property("DateModifiedUtc") + .ValueGeneratedOnAdd() + .HasColumnType("timestamp with time zone") + .HasDefaultValueSql("getutcdate()"); + + b.Property("DefaultPartLabelId") + .HasColumnType("integer"); + + b.Property("EnableAutoPartSearch") + .HasColumnType("boolean"); + + b.Property("EnableCheckNewVersion") + .HasColumnType("boolean"); + + b.Property("EnableDarkMode") + .HasColumnType("boolean"); + + b.Property("Language") + .HasColumnType("integer"); + + b.Property("OrganizationId") + .HasColumnType("integer"); + + b.Property("UserId") + .HasColumnType("integer"); + + b.HasKey("UserConfigurationId"); + + b.HasIndex("UserId"); + + b.ToTable("UserConfigurations", "dbo"); + }); + + modelBuilder.Entity("Binner.Data.Model.UserLoginHistory", b => + { + b.Property("UserLoginHistoryId") + .ValueGeneratedOnAdd() + .HasColumnType("integer"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("UserLoginHistoryId")); + + b.Property("CanLogin") + .HasColumnType("boolean"); + + b.Property("DateCreatedUtc") + .ValueGeneratedOnAdd() + .HasColumnType("timestamp with time zone") + .HasDefaultValueSql("getutcdate()"); + + b.Property("DateModifiedUtc") + .ValueGeneratedOnAdd() + .HasColumnType("timestamp with time zone") + .HasDefaultValueSql("getutcdate()"); + + b.Property("EmailAddress") + .HasColumnType("text"); + + b.Property("Ip") + .ValueGeneratedOnAdd() + .HasColumnType("bigint") + .HasDefaultValue(0L); + + b.Property("IsSuccessful") + .HasColumnType("boolean"); + + b.Property("Message") + .HasColumnType("text"); + + b.Property("OrganizationId") + .HasColumnType("integer"); + + b.Property("ReCaptchaScore") + .HasColumnType("double precision"); + + b.Property("UserId") + .HasColumnType("integer"); + + b.HasKey("UserLoginHistoryId"); + + b.HasIndex("UserId"); + + b.ToTable("UserLoginHistory", "dbo"); + }); + + modelBuilder.Entity("Binner.Data.Model.UserPrinterConfiguration", b => + { + b.Property("UserPrinterConfigurationId") + .ValueGeneratedOnAdd() + .HasColumnType("integer"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("UserPrinterConfigurationId")); + + b.Property("DateCreatedUtc") + .ValueGeneratedOnAdd() + .HasColumnType("timestamp with time zone") + .HasDefaultValueSql("getutcdate()"); + + b.Property("DateModifiedUtc") + .ValueGeneratedOnAdd() + .HasColumnType("timestamp with time zone") + .HasDefaultValueSql("getutcdate()"); + + b.Property("OrganizationId") + .HasColumnType("integer"); + + b.Property("PartLabelName") + .IsRequired() + .HasColumnType("text"); + + b.Property("PartLabelSource") + .HasColumnType("integer"); + + b.Property("PrintMode") + .HasColumnType("integer"); + + b.Property("PrinterName") + .IsRequired() + .HasColumnType("text"); + + b.Property("RemoteAddressUrl") + .HasColumnType("text"); + + b.Property("UserId") + .HasColumnType("integer"); + + b.HasKey("UserPrinterConfigurationId"); + + b.HasIndex("UserId"); + + b.ToTable("UserPrinterConfigurations", "dbo"); + }); + + modelBuilder.Entity("Binner.Data.Model.UserPrinterTemplateConfiguration", b => + { + b.Property("UserPrinterTemplateConfigurationId") + .ValueGeneratedOnAdd() + .HasColumnType("integer"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("UserPrinterTemplateConfigurationId")); + + b.Property("AutoSize") + .HasColumnType("boolean"); + + b.Property("Barcode") + .HasColumnType("boolean"); + + b.Property("Color") + .HasColumnType("text"); + + b.Property("Content") + .HasColumnType("text"); + + b.Property("DateCreatedUtc") + .ValueGeneratedOnAdd() + .HasColumnType("timestamp with time zone") + .HasDefaultValueSql("getutcdate()"); + + b.Property("DateModifiedUtc") + .ValueGeneratedOnAdd() + .HasColumnType("timestamp with time zone") + .HasDefaultValueSql("getutcdate()"); + + b.Property("FontName") + .IsRequired() + .HasColumnType("text"); + + b.Property("FontSize") + .HasColumnType("integer"); + + b.Property("Label") + .HasColumnType("integer"); + + b.Property("Line") + .HasColumnType("integer"); + + b.Property("LowerCase") + .HasColumnType("boolean"); + + b.Property("MarginBottom") + .HasColumnType("integer"); + + b.Property("MarginLeft") + .HasColumnType("integer"); + + b.Property("MarginRight") + .HasColumnType("integer"); + + b.Property("MarginTop") + .HasColumnType("integer"); + + b.Property("OrganizationId") + .HasColumnType("integer"); + + b.Property("Position") + .HasColumnType("integer"); + + b.Property("Rotate") + .HasColumnType("integer"); + + b.Property("UpperCase") + .HasColumnType("boolean"); + + b.Property("UserId") + .HasColumnType("integer"); + + b.Property("UserPrinterConfigurationId") + .HasColumnType("integer"); + + b.HasKey("UserPrinterTemplateConfigurationId"); + + b.HasIndex("UserId"); + + b.HasIndex("UserPrinterConfigurationId"); + + b.ToTable("UserPrinterTemplateConfigurations", "dbo"); + }); + + modelBuilder.Entity("Binner.Data.Model.UserToken", b => + { + b.Property("UserTokenId") + .ValueGeneratedOnAdd() + .HasColumnType("integer"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("UserTokenId")); + + b.Property("DateCreatedUtc") + .ValueGeneratedOnAdd() + .HasColumnType("timestamp with time zone") + .HasDefaultValueSql("getutcdate()"); + + b.Property("DateExpiredUtc") + .HasColumnType("timestamp with time zone"); + + b.Property("DateModifiedUtc") + .ValueGeneratedOnAdd() + .HasColumnType("timestamp with time zone") + .HasDefaultValueSql("getutcdate()"); + + b.Property("DateRevokedUtc") + .HasColumnType("timestamp with time zone"); + + b.Property("Ip") + .ValueGeneratedOnAdd() + .HasColumnType("bigint") + .HasDefaultValue(0L); + + b.Property("OrganizationId") + .HasColumnType("integer"); + + b.Property("ReplacedByToken") + .HasColumnType("text"); + + b.Property("Token") + .IsRequired() + .HasColumnType("text"); + + b.Property("TokenConfig") + .HasColumnType("text"); + + b.Property("TokenTypeId") + .HasColumnType("integer"); + + b.Property("UserId") + .HasColumnType("integer"); + + b.HasKey("UserTokenId"); + + b.HasIndex("UserId"); + + b.ToTable("UserTokens", "dbo"); + }); + + modelBuilder.Entity("Binner.Data.Model.CustomField", b => + { + b.HasOne("Binner.Data.Model.User", "User") + .WithMany("CustomFields") + .HasForeignKey("UserId") + .OnDelete(DeleteBehavior.Restrict); + + b.Navigation("User"); + }); + + modelBuilder.Entity("Binner.Data.Model.CustomFieldValue", b => + { + b.HasOne("Binner.Data.Model.CustomField", "CustomField") + .WithMany("CustomFieldValues") + .HasForeignKey("CustomFieldId") + .OnDelete(DeleteBehavior.Restrict) + .IsRequired(); + + b.HasOne("Binner.Data.Model.User", "User") + .WithMany("CustomFieldValues") + .HasForeignKey("UserId") + .OnDelete(DeleteBehavior.Restrict); + + b.Navigation("CustomField"); + + b.Navigation("User"); + }); + + modelBuilder.Entity("Binner.Data.Model.Label", b => + { + b.HasOne("Binner.Data.Model.LabelTemplate", "LabelTemplate") + .WithMany("Labels") + .HasForeignKey("LabelTemplateId") + .OnDelete(DeleteBehavior.Restrict) + .IsRequired(); + + b.Navigation("LabelTemplate"); + }); + + modelBuilder.Entity("Binner.Data.Model.OAuthCredential", b => + { + b.HasOne("Binner.Data.Model.User", "User") + .WithMany("OAuthCredentials") + .HasForeignKey("UserId") + .OnDelete(DeleteBehavior.Restrict); + + b.Navigation("User"); + }); + + modelBuilder.Entity("Binner.Data.Model.OAuthRequest", b => + { + b.HasOne("Binner.Data.Model.User", "User") + .WithMany("OAuthRequests") + .HasForeignKey("UserId") + .OnDelete(DeleteBehavior.Restrict); + + b.Navigation("User"); + }); + + modelBuilder.Entity("Binner.Data.Model.OrderImportHistory", b => + { + b.HasOne("Binner.Data.Model.User", "User") + .WithMany("OrderImportHistory") + .HasForeignKey("UserId") + .OnDelete(DeleteBehavior.SetNull); + + b.Navigation("User"); + }); + + modelBuilder.Entity("Binner.Data.Model.OrderImportHistoryLineItem", b => + { + b.HasOne("Binner.Data.Model.OrderImportHistory", "OrderImportHistory") + .WithMany("OrderImportHistoryLineItems") + .HasForeignKey("OrderImportHistoryId") + .OnDelete(DeleteBehavior.Restrict) + .IsRequired(); + + b.HasOne("Binner.Data.Model.User", "User") + .WithMany("OrderImportHistoryLineItems") + .HasForeignKey("UserId") + .OnDelete(DeleteBehavior.SetNull); + + b.Navigation("OrderImportHistory"); + + b.Navigation("User"); + }); + + modelBuilder.Entity("Binner.Data.Model.OrganizationConfiguration", b => + { + b.HasOne("Binner.Data.Model.Organization", "Organization") + .WithMany("OrganizationConfigurations") + .HasForeignKey("OrganizationId") + .OnDelete(DeleteBehavior.Restrict); + + b.HasOne("Binner.Data.Model.User", null) + .WithMany("OrganizationConfigurations") + .HasForeignKey("UserId"); + + b.Navigation("Organization"); + }); + + modelBuilder.Entity("Binner.Data.Model.OrganizationIntegrationConfiguration", b => + { + b.HasOne("Binner.Data.Model.Organization", "Organization") + .WithMany("OrganizationIntegrationConfigurations") + .HasForeignKey("OrganizationId") + .OnDelete(DeleteBehavior.Restrict); + + b.HasOne("Binner.Data.Model.User", null) + .WithMany("OrganizationIntegrationConfigurations") + .HasForeignKey("UserId"); + + b.Navigation("Organization"); + }); + + modelBuilder.Entity("Binner.Data.Model.Part", b => + { + b.HasOne("Binner.Data.Model.PartType", "PartType") + .WithMany("Parts") + .HasForeignKey("PartTypeId") + .OnDelete(DeleteBehavior.Restrict) + .IsRequired(); + + b.HasOne("Binner.Data.Model.Project", "Project") + .WithMany("Parts") + .HasForeignKey("ProjectId") + .OnDelete(DeleteBehavior.Restrict); + + b.HasOne("Binner.Data.Model.User", "User") + .WithMany("Parts") + .HasForeignKey("UserId") + .OnDelete(DeleteBehavior.SetNull); + + b.Navigation("PartType"); + + b.Navigation("Project"); + + b.Navigation("User"); + }); + + modelBuilder.Entity("Binner.Data.Model.PartModel", b => + { + b.HasOne("Binner.Data.Model.Part", "Part") + .WithMany("PartModels") + .HasForeignKey("PartId") + .OnDelete(DeleteBehavior.Restrict) + .IsRequired(); + + b.HasOne("Binner.Data.Model.User", "User") + .WithMany("PartModels") + .HasForeignKey("UserId") + .OnDelete(DeleteBehavior.SetNull); + + b.Navigation("Part"); + + b.Navigation("User"); + }); + + modelBuilder.Entity("Binner.Data.Model.PartParametric", b => + { + b.HasOne("Binner.Data.Model.Part", "Part") + .WithMany("PartParametrics") + .HasForeignKey("PartId") + .OnDelete(DeleteBehavior.Restrict) + .IsRequired(); + + b.HasOne("Binner.Data.Model.User", "User") + .WithMany("PartParametrics") + .HasForeignKey("UserId") + .OnDelete(DeleteBehavior.SetNull); + + b.Navigation("Part"); + + b.Navigation("User"); + }); + + modelBuilder.Entity("Binner.Data.Model.PartScanHistory", b => + { + b.HasOne("Binner.Data.Model.Part", "Part") + .WithMany("PartScanHistories") + .HasForeignKey("PartId") + .OnDelete(DeleteBehavior.Restrict); + + b.HasOne("Binner.Data.Model.User", "User") + .WithMany("PartScanHistories") + .HasForeignKey("UserId") + .OnDelete(DeleteBehavior.SetNull); + + b.Navigation("Part"); + + b.Navigation("User"); + }); + + modelBuilder.Entity("Binner.Data.Model.PartSupplier", b => + { + b.HasOne("Binner.Data.Model.Part", "Part") + .WithMany("PartSuppliers") + .HasForeignKey("PartId") + .OnDelete(DeleteBehavior.Restrict) + .IsRequired(); + + b.HasOne("Binner.Data.Model.User", "User") + .WithMany("PartSuppliers") + .HasForeignKey("UserId") + .OnDelete(DeleteBehavior.SetNull); + + b.Navigation("Part"); + + b.Navigation("User"); + }); + + modelBuilder.Entity("Binner.Data.Model.PartType", b => + { + b.HasOne("Binner.Data.Model.PartType", "ParentPartType") + .WithMany() + .HasForeignKey("ParentPartTypeId") + .OnDelete(DeleteBehavior.Restrict); + + b.HasOne("Binner.Data.Model.User", "User") + .WithMany("PartTypes") + .HasForeignKey("UserId") + .OnDelete(DeleteBehavior.SetNull); + + b.Navigation("ParentPartType"); + + b.Navigation("User"); + }); + + modelBuilder.Entity("Binner.Data.Model.Pcb", b => + { + b.HasOne("Binner.Data.Model.User", "User") + .WithMany("Pcbs") + .HasForeignKey("UserId") + .OnDelete(DeleteBehavior.SetNull); + + b.Navigation("User"); + }); + + modelBuilder.Entity("Binner.Data.Model.PcbStoredFileAssignment", b => + { + b.HasOne("Binner.Data.Model.Pcb", "Pcb") + .WithMany("PcbStoredFileAssignments") + .HasForeignKey("PcbId") + .OnDelete(DeleteBehavior.Restrict) + .IsRequired(); + + b.HasOne("Binner.Data.Model.StoredFile", "StoredFile") + .WithMany("PcbStoredFileAssignments") + .HasForeignKey("StoredFileId") + .OnDelete(DeleteBehavior.Restrict) + .IsRequired(); + + b.HasOne("Binner.Data.Model.User", "User") + .WithMany("PcbStoredFileAssignments") + .HasForeignKey("UserId") + .OnDelete(DeleteBehavior.SetNull); + + b.Navigation("Pcb"); + + b.Navigation("StoredFile"); + + b.Navigation("User"); + }); + + modelBuilder.Entity("Binner.Data.Model.Project", b => + { + b.HasOne("Binner.Data.Model.User", "User") + .WithMany("Projects") + .HasForeignKey("UserId") + .OnDelete(DeleteBehavior.SetNull); + + b.Navigation("User"); + }); + + modelBuilder.Entity("Binner.Data.Model.ProjectPartAssignment", b => + { + b.HasOne("Binner.Data.Model.Part", "Part") + .WithMany("ProjectPartAssignments") + .HasForeignKey("PartId") + .OnDelete(DeleteBehavior.Restrict); + + b.HasOne("Binner.Data.Model.Project", "Project") + .WithMany("ProjectPartAssignments") + .HasForeignKey("ProjectId") + .OnDelete(DeleteBehavior.Restrict) + .IsRequired(); + + b.HasOne("Binner.Data.Model.User", "User") + .WithMany("ProjectPartAssignments") + .HasForeignKey("UserId") + .OnDelete(DeleteBehavior.SetNull); + + b.Navigation("Part"); + + b.Navigation("Project"); + + b.Navigation("User"); + }); + + modelBuilder.Entity("Binner.Data.Model.ProjectPcbAssignment", b => + { + b.HasOne("Binner.Data.Model.Pcb", "Pcb") + .WithMany("ProjectPcbAssignments") + .HasForeignKey("PcbId") + .OnDelete(DeleteBehavior.Restrict) + .IsRequired(); + + b.HasOne("Binner.Data.Model.Project", "Project") + .WithMany("ProjectPcbAssignments") + .HasForeignKey("ProjectId") + .OnDelete(DeleteBehavior.Restrict) + .IsRequired(); + + b.HasOne("Binner.Data.Model.User", "User") + .WithMany("ProjectPcbAssignments") + .HasForeignKey("UserId") + .OnDelete(DeleteBehavior.SetNull); + + b.Navigation("Pcb"); + + b.Navigation("Project"); + + b.Navigation("User"); + }); + + modelBuilder.Entity("Binner.Data.Model.ProjectPcbProduceHistory", b => + { + b.HasOne("Binner.Data.Model.Pcb", "Pcb") + .WithMany("ProjectPcbProduceHistory") + .HasForeignKey("PcbId"); + + b.HasOne("Binner.Data.Model.ProjectProduceHistory", "ProjectProduceHistory") + .WithMany("ProjectPcbProduceHistory") + .HasForeignKey("ProjectProduceHistoryId") + .OnDelete(DeleteBehavior.Restrict) + .IsRequired(); + + b.HasOne("Binner.Data.Model.User", "User") + .WithMany("ProjectPcbProduceHistory") + .HasForeignKey("UserId") + .OnDelete(DeleteBehavior.SetNull); + + b.Navigation("Pcb"); + + b.Navigation("ProjectProduceHistory"); + + b.Navigation("User"); + }); + + modelBuilder.Entity("Binner.Data.Model.ProjectProduceHistory", b => + { + b.HasOne("Binner.Data.Model.Project", "Project") + .WithMany("ProjectProduceHistory") + .HasForeignKey("ProjectId") + .OnDelete(DeleteBehavior.Restrict) + .IsRequired(); + + b.HasOne("Binner.Data.Model.User", "User") + .WithMany("ProjectProduceHistory") + .HasForeignKey("UserId") + .OnDelete(DeleteBehavior.SetNull); + + b.Navigation("Project"); + + b.Navigation("User"); + }); + + modelBuilder.Entity("Binner.Data.Model.StoredFile", b => + { + b.HasOne("Binner.Data.Model.Part", "Part") + .WithMany("StoredFiles") + .HasForeignKey("PartId") + .OnDelete(DeleteBehavior.Restrict); + + b.HasOne("Binner.Data.Model.User", "User") + .WithMany("StoredFiles") + .HasForeignKey("UserId") + .OnDelete(DeleteBehavior.SetNull); + + b.Navigation("Part"); + + b.Navigation("User"); + }); + + modelBuilder.Entity("Binner.Data.Model.User", b => + { + b.HasOne("Binner.Data.Model.Organization", "Organization") + .WithMany("Users") + .HasForeignKey("OrganizationId") + .OnDelete(DeleteBehavior.Restrict) + .IsRequired(); + + b.Navigation("Organization"); + }); + + modelBuilder.Entity("Binner.Data.Model.UserConfiguration", b => + { + b.HasOne("Binner.Data.Model.User", "User") + .WithMany("UserConfigurations") + .HasForeignKey("UserId") + .OnDelete(DeleteBehavior.Restrict); + + b.Navigation("User"); + }); + + modelBuilder.Entity("Binner.Data.Model.UserLoginHistory", b => + { + b.HasOne("Binner.Data.Model.User", "User") + .WithMany("UserLoginHistory") + .HasForeignKey("UserId") + .OnDelete(DeleteBehavior.SetNull); + + b.Navigation("User"); + }); + + modelBuilder.Entity("Binner.Data.Model.UserPrinterConfiguration", b => + { + b.HasOne("Binner.Data.Model.User", "User") + .WithMany("UserPrinterConfigurations") + .HasForeignKey("UserId") + .OnDelete(DeleteBehavior.Restrict); + + b.Navigation("User"); + }); + + modelBuilder.Entity("Binner.Data.Model.UserPrinterTemplateConfiguration", b => + { + b.HasOne("Binner.Data.Model.User", "User") + .WithMany("UserPrinterTemplateConfigurations") + .HasForeignKey("UserId") + .OnDelete(DeleteBehavior.Restrict); + + b.HasOne("Binner.Data.Model.UserPrinterConfiguration", "UserPrinterConfiguration") + .WithMany("UserPrinterTemplateConfigurations") + .HasForeignKey("UserPrinterConfigurationId") + .OnDelete(DeleteBehavior.Restrict) + .IsRequired(); + + b.Navigation("User"); + + b.Navigation("UserPrinterConfiguration"); + }); + + modelBuilder.Entity("Binner.Data.Model.UserToken", b => + { + b.HasOne("Binner.Data.Model.User", "User") + .WithMany("UserTokens") + .HasForeignKey("UserId") + .OnDelete(DeleteBehavior.SetNull); + + b.Navigation("User"); + }); + + modelBuilder.Entity("Binner.Data.Model.CustomField", b => + { + b.Navigation("CustomFieldValues"); + }); + + modelBuilder.Entity("Binner.Data.Model.LabelTemplate", b => + { + b.Navigation("Labels"); + }); + + modelBuilder.Entity("Binner.Data.Model.OrderImportHistory", b => + { + b.Navigation("OrderImportHistoryLineItems"); + }); + + modelBuilder.Entity("Binner.Data.Model.Organization", b => + { + b.Navigation("OrganizationConfigurations"); + + b.Navigation("OrganizationIntegrationConfigurations"); + + b.Navigation("Users"); + }); + + modelBuilder.Entity("Binner.Data.Model.Part", b => + { + b.Navigation("PartModels"); + + b.Navigation("PartParametrics"); + + b.Navigation("PartScanHistories"); + + b.Navigation("PartSuppliers"); + + b.Navigation("ProjectPartAssignments"); + + b.Navigation("StoredFiles"); + }); + + modelBuilder.Entity("Binner.Data.Model.PartType", b => + { + b.Navigation("Parts"); + }); + + modelBuilder.Entity("Binner.Data.Model.Pcb", b => + { + b.Navigation("PcbStoredFileAssignments"); + + b.Navigation("ProjectPcbAssignments"); + + b.Navigation("ProjectPcbProduceHistory"); + }); + + modelBuilder.Entity("Binner.Data.Model.Project", b => + { + b.Navigation("Parts"); + + b.Navigation("ProjectPartAssignments"); + + b.Navigation("ProjectPcbAssignments"); + + b.Navigation("ProjectProduceHistory"); + }); + + modelBuilder.Entity("Binner.Data.Model.ProjectProduceHistory", b => + { + b.Navigation("ProjectPcbProduceHistory"); + }); + + modelBuilder.Entity("Binner.Data.Model.StoredFile", b => + { + b.Navigation("PcbStoredFileAssignments"); + }); + + modelBuilder.Entity("Binner.Data.Model.User", b => + { + b.Navigation("CustomFieldValues"); + + b.Navigation("CustomFields"); + + b.Navigation("OAuthCredentials"); + + b.Navigation("OAuthRequests"); + + b.Navigation("OrderImportHistory"); + + b.Navigation("OrderImportHistoryLineItems"); + + b.Navigation("OrganizationConfigurations"); + + b.Navigation("OrganizationIntegrationConfigurations"); + + b.Navigation("PartModels"); + + b.Navigation("PartParametrics"); + + b.Navigation("PartScanHistories"); + + b.Navigation("PartSuppliers"); + + b.Navigation("PartTypes"); + + b.Navigation("Parts"); + + b.Navigation("PcbStoredFileAssignments"); + + b.Navigation("Pcbs"); + + b.Navigation("ProjectPartAssignments"); + + b.Navigation("ProjectPcbAssignments"); + + b.Navigation("ProjectPcbProduceHistory"); + + b.Navigation("ProjectProduceHistory"); + + b.Navigation("Projects"); + + b.Navigation("StoredFiles"); + + b.Navigation("UserConfigurations"); + + b.Navigation("UserLoginHistory"); + + b.Navigation("UserPrinterConfigurations"); + + b.Navigation("UserPrinterTemplateConfigurations"); + + b.Navigation("UserTokens"); + }); + + modelBuilder.Entity("Binner.Data.Model.UserPrinterConfiguration", b => + { + b.Navigation("UserPrinterTemplateConfigurations"); + }); +#pragma warning restore 612, 618 + } + } +} diff --git a/Binner/Data/Binner.Data.Migrations.Postgresql/Migrations/20250824132903_automaticMetadataFetch.cs b/Binner/Data/Binner.Data.Migrations.Postgresql/Migrations/20250824132903_automaticMetadataFetch.cs new file mode 100644 index 00000000..f938400d --- /dev/null +++ b/Binner/Data/Binner.Data.Migrations.Postgresql/Migrations/20250824132903_automaticMetadataFetch.cs @@ -0,0 +1,31 @@ +using Microsoft.EntityFrameworkCore.Migrations; + +#nullable disable + +namespace Binner.Data.Migrations.Postgresql.Migrations +{ + /// + public partial class automaticMetadataFetch : Migration + { + /// + protected override void Up(MigrationBuilder migrationBuilder) + { + migrationBuilder.AddColumn( + name: "enableAutomaticMetadataFetchingForExistingParts", + schema: "dbo", + table: "OrganizationConfigurations", + type: "boolean", + nullable: false, + defaultValue: true); + } + + /// + protected override void Down(MigrationBuilder migrationBuilder) + { + migrationBuilder.DropColumn( + name: "enableAutomaticMetadataFetchingForExistingParts", + schema: "dbo", + table: "OrganizationConfigurations"); + } + } +} diff --git a/Binner/Data/Binner.Data.Migrations.Postgresql/Migrations/BinnerContextModelSnapshot.cs b/Binner/Data/Binner.Data.Migrations.Postgresql/Migrations/BinnerContextModelSnapshot.cs index 1b0a1f3b..21aa3067 100644 --- a/Binner/Data/Binner.Data.Migrations.Postgresql/Migrations/BinnerContextModelSnapshot.cs +++ b/Binner/Data/Binner.Data.Migrations.Postgresql/Migrations/BinnerContextModelSnapshot.cs @@ -547,6 +547,9 @@ protected override void BuildModel(ModelBuilder modelBuilder) b.Property("UserId") .HasColumnType("integer"); + b.Property("enableAutomaticMetadataFetchingForExistingParts") + .HasColumnType("boolean"); + b.HasKey("OrganizationConfigurationId"); b.HasIndex("OrganizationId"); diff --git a/Binner/Data/Binner.Data.Migrations.SqlServer/Migrations/20250824132852_automaticMetadataFetch.Designer.cs b/Binner/Data/Binner.Data.Migrations.SqlServer/Migrations/20250824132852_automaticMetadataFetch.Designer.cs new file mode 100644 index 00000000..a2f8b9b4 --- /dev/null +++ b/Binner/Data/Binner.Data.Migrations.SqlServer/Migrations/20250824132852_automaticMetadataFetch.Designer.cs @@ -0,0 +1,2607 @@ +// +using System; +using Binner.Data; +using Microsoft.EntityFrameworkCore; +using Microsoft.EntityFrameworkCore.Infrastructure; +using Microsoft.EntityFrameworkCore.Metadata; +using Microsoft.EntityFrameworkCore.Migrations; +using Microsoft.EntityFrameworkCore.Storage.ValueConversion; + +#nullable disable + +namespace Binner.Data.Migrations.SqlServer.Migrations +{ + [DbContext(typeof(BinnerContext))] + [Migration("20250824132852_automaticMetadataFetch")] + partial class automaticMetadataFetch + { + /// + protected override void BuildTargetModel(ModelBuilder modelBuilder) + { +#pragma warning disable 612, 618 + modelBuilder + .HasDefaultSchema("dbo") + .HasAnnotation("ProductVersion", "9.0.6") + .HasAnnotation("Relational:MaxIdentifierLength", 128); + + SqlServerModelBuilderExtensions.UseIdentityColumns(modelBuilder); + + modelBuilder.Entity("Binner.Data.Model.CustomField", b => + { + b.Property("CustomFieldId") + .ValueGeneratedOnAdd() + .HasColumnType("bigint"); + + SqlServerPropertyBuilderExtensions.UseIdentityColumn(b.Property("CustomFieldId")); + + b.Property("CustomFieldTypeId") + .HasColumnType("int"); + + b.Property("DateCreatedUtc") + .ValueGeneratedOnAdd() + .HasColumnType("datetime2") + .HasDefaultValueSql("getutcdate()"); + + b.Property("DateModifiedUtc") + .ValueGeneratedOnAdd() + .HasColumnType("datetime2") + .HasDefaultValueSql("getutcdate()"); + + b.Property("Description") + .HasColumnType("nvarchar(max)"); + + b.Property("Name") + .IsRequired() + .HasColumnType("nvarchar(max)"); + + b.Property("OrganizationId") + .HasColumnType("int"); + + b.Property("UserId") + .HasColumnType("int"); + + b.HasKey("CustomFieldId"); + + b.HasIndex("UserId"); + + b.ToTable("CustomFields", "dbo"); + }); + + modelBuilder.Entity("Binner.Data.Model.CustomFieldValue", b => + { + b.Property("CustomFieldValueId") + .ValueGeneratedOnAdd() + .HasColumnType("bigint"); + + SqlServerPropertyBuilderExtensions.UseIdentityColumn(b.Property("CustomFieldValueId")); + + b.Property("CustomFieldId") + .HasColumnType("bigint"); + + b.Property("CustomFieldTypeId") + .HasColumnType("int"); + + b.Property("DateCreatedUtc") + .ValueGeneratedOnAdd() + .HasColumnType("datetime2") + .HasDefaultValueSql("getutcdate()"); + + b.Property("DateModifiedUtc") + .ValueGeneratedOnAdd() + .HasColumnType("datetime2") + .HasDefaultValueSql("getutcdate()"); + + b.Property("OrganizationId") + .HasColumnType("int"); + + b.Property("RecordId") + .HasColumnType("bigint"); + + b.Property("UserId") + .HasColumnType("int"); + + b.Property("Value") + .HasColumnType("nvarchar(max)"); + + b.HasKey("CustomFieldValueId"); + + b.HasIndex("CustomFieldId"); + + b.HasIndex("UserId"); + + b.ToTable("CustomFieldValues", "dbo"); + }); + + modelBuilder.Entity("Binner.Data.Model.Label", b => + { + b.Property("LabelId") + .ValueGeneratedOnAdd() + .HasColumnType("int"); + + SqlServerPropertyBuilderExtensions.UseIdentityColumn(b.Property("LabelId")); + + b.Property("DateCreatedUtc") + .ValueGeneratedOnAdd() + .HasColumnType("datetime2") + .HasDefaultValueSql("getutcdate()"); + + b.Property("DateModifiedUtc") + .ValueGeneratedOnAdd() + .HasColumnType("datetime2") + .HasDefaultValueSql("getutcdate()"); + + b.Property("IsPartLabelTemplate") + .HasColumnType("bit"); + + b.Property("LabelTemplateId") + .HasColumnType("int"); + + b.Property("Name") + .IsRequired() + .HasColumnType("nvarchar(max)"); + + b.Property("OrganizationId") + .HasColumnType("int"); + + b.Property("Template") + .IsRequired() + .HasColumnType("nvarchar(max)"); + + b.Property("UserId") + .HasColumnType("int"); + + b.HasKey("LabelId"); + + b.HasIndex("LabelTemplateId"); + + b.ToTable("Labels", "dbo"); + }); + + modelBuilder.Entity("Binner.Data.Model.LabelTemplate", b => + { + b.Property("LabelTemplateId") + .ValueGeneratedOnAdd() + .HasColumnType("int"); + + SqlServerPropertyBuilderExtensions.UseIdentityColumn(b.Property("LabelTemplateId")); + + b.Property("DateCreatedUtc") + .ValueGeneratedOnAdd() + .HasColumnType("datetime2") + .HasDefaultValueSql("getutcdate()"); + + b.Property("DateModifiedUtc") + .ValueGeneratedOnAdd() + .HasColumnType("datetime2") + .HasDefaultValueSql("getutcdate()"); + + b.Property("Description") + .HasColumnType("nvarchar(max)"); + + b.Property("Dpi") + .HasColumnType("int"); + + b.Property("DriverHeight") + .HasColumnType("int"); + + b.Property("DriverName") + .HasColumnType("nvarchar(max)"); + + b.Property("DriverWidth") + .HasColumnType("int"); + + b.Property("ExtraData") + .HasColumnType("nvarchar(max)"); + + b.Property("Height") + .IsRequired() + .HasColumnType("nvarchar(max)"); + + b.Property("LabelCount") + .HasColumnType("int"); + + b.Property("LabelPaperSource") + .HasColumnType("int"); + + b.Property("Margin") + .IsRequired() + .HasColumnType("nvarchar(max)"); + + b.Property("Name") + .IsRequired() + .HasColumnType("nvarchar(max)"); + + b.Property("OrganizationId") + .HasColumnType("int"); + + b.Property("UserId") + .HasColumnType("int"); + + b.Property("Width") + .IsRequired() + .HasColumnType("nvarchar(max)"); + + b.HasKey("LabelTemplateId"); + + b.ToTable("LabelTemplates", "dbo"); + }); + + modelBuilder.Entity("Binner.Data.Model.MessageState", b => + { + b.Property("MessageStateId") + .ValueGeneratedOnAdd() + .HasColumnType("int"); + + SqlServerPropertyBuilderExtensions.UseIdentityColumn(b.Property("MessageStateId")); + + b.Property("DateCreatedUtc") + .HasColumnType("datetime2"); + + b.Property("MessageId") + .HasColumnType("uniqueidentifier"); + + b.Property("OrganizationId") + .HasColumnType("int"); + + b.Property("ReadDateUtc") + .HasColumnType("datetime2"); + + b.Property("UserId") + .HasColumnType("int"); + + b.HasKey("MessageStateId"); + + b.ToTable("MessageStates", "dbo"); + }); + + modelBuilder.Entity("Binner.Data.Model.OAuthCredential", b => + { + b.Property("OAuthCredentialId") + .ValueGeneratedOnAdd() + .HasColumnType("int"); + + SqlServerPropertyBuilderExtensions.UseIdentityColumn(b.Property("OAuthCredentialId")); + + b.Property("AccessToken") + .HasColumnType("nvarchar(max)"); + + b.Property("ApiSettings") + .HasColumnType("nvarchar(max)"); + + b.Property("DateCreatedUtc") + .ValueGeneratedOnAdd() + .HasColumnType("datetime2") + .HasDefaultValueSql("getutcdate()"); + + b.Property("DateExpiresUtc") + .HasColumnType("datetime2"); + + b.Property("DateModifiedUtc") + .ValueGeneratedOnAdd() + .HasColumnType("datetime2") + .HasDefaultValueSql("getutcdate()"); + + b.Property("Ip") + .ValueGeneratedOnAdd() + .HasColumnType("bigint") + .HasDefaultValue(0L); + + b.Property("OrganizationId") + .HasColumnType("int"); + + b.Property("Provider") + .IsRequired() + .HasMaxLength(128) + .HasColumnType("nvarchar(128)"); + + b.Property("RefreshToken") + .HasColumnType("nvarchar(max)"); + + b.Property("UserId") + .HasColumnType("int"); + + b.HasKey("OAuthCredentialId"); + + b.HasIndex("UserId"); + + b.HasIndex("Provider", "UserId", "OrganizationId"); + + b.ToTable("OAuthCredentials", "dbo"); + }); + + modelBuilder.Entity("Binner.Data.Model.OAuthRequest", b => + { + b.Property("OAuthRequestId") + .ValueGeneratedOnAdd() + .HasColumnType("int"); + + SqlServerPropertyBuilderExtensions.UseIdentityColumn(b.Property("OAuthRequestId")); + + b.Property("AuthorizationCode") + .HasColumnType("nvarchar(max)"); + + b.Property("AuthorizationReceived") + .HasColumnType("bit") + .HasDefaultValue(false); + + b.Property("DateCreatedUtc") + .ValueGeneratedOnAdd() + .HasColumnType("datetime2") + .HasDefaultValueSql("getutcdate()"); + + b.Property("DateModifiedUtc") + .ValueGeneratedOnAdd() + .HasColumnType("datetime2") + .HasDefaultValueSql("getutcdate()"); + + b.Property("Error") + .HasColumnType("nvarchar(max)"); + + b.Property("ErrorDescription") + .HasColumnType("nvarchar(max)"); + + b.Property("Ip") + .ValueGeneratedOnAdd() + .HasColumnType("bigint") + .HasDefaultValue(0L); + + b.Property("OrganizationId") + .HasColumnType("int"); + + b.Property("Provider") + .IsRequired() + .HasColumnType("nvarchar(max)"); + + b.Property("RequestId") + .HasColumnType("uniqueidentifier"); + + b.Property("ReturnToUrl") + .HasColumnType("nvarchar(max)"); + + b.Property("UserId") + .HasColumnType("int"); + + b.HasKey("OAuthRequestId"); + + b.HasIndex("UserId"); + + b.ToTable("OAuthRequests", "dbo"); + }); + + modelBuilder.Entity("Binner.Data.Model.OrderImportHistory", b => + { + b.Property("OrderImportHistoryId") + .ValueGeneratedOnAdd() + .HasColumnType("bigint"); + + SqlServerPropertyBuilderExtensions.UseIdentityColumn(b.Property("OrderImportHistoryId")); + + b.Property("DateCreatedUtc") + .ValueGeneratedOnAdd() + .HasColumnType("datetime2") + .HasDefaultValueSql("getutcdate()"); + + b.Property("DateModifiedUtc") + .ValueGeneratedOnAdd() + .HasColumnType("datetime2") + .HasDefaultValueSql("getutcdate()"); + + b.Property("Invoice") + .HasColumnType("nvarchar(max)"); + + b.Property("OrganizationId") + .HasColumnType("int"); + + b.Property("Packlist") + .HasColumnType("nvarchar(max)"); + + b.Property("SalesOrder") + .IsRequired() + .HasColumnType("nvarchar(max)"); + + b.Property("Supplier") + .IsRequired() + .HasColumnType("nvarchar(max)"); + + b.Property("UserId") + .HasColumnType("int"); + + b.HasKey("OrderImportHistoryId"); + + b.HasIndex("UserId"); + + b.ToTable("OrderImportHistories", "dbo"); + }); + + modelBuilder.Entity("Binner.Data.Model.OrderImportHistoryLineItem", b => + { + b.Property("OrderImportHistoryLineItemId") + .ValueGeneratedOnAdd() + .HasColumnType("bigint"); + + SqlServerPropertyBuilderExtensions.UseIdentityColumn(b.Property("OrderImportHistoryLineItemId")); + + b.Property("Cost") + .HasColumnType("float"); + + b.Property("CustomerReference") + .HasColumnType("nvarchar(max)"); + + b.Property("DateCreatedUtc") + .ValueGeneratedOnAdd() + .HasColumnType("datetime2") + .HasDefaultValueSql("getutcdate()"); + + b.Property("DateModifiedUtc") + .ValueGeneratedOnAdd() + .HasColumnType("datetime2") + .HasDefaultValueSql("getutcdate()"); + + b.Property("Description") + .HasColumnType("nvarchar(max)"); + + b.Property("Manufacturer") + .HasColumnType("nvarchar(max)"); + + b.Property("ManufacturerPartNumber") + .HasColumnType("nvarchar(max)"); + + b.Property("OrderImportHistoryId") + .HasColumnType("bigint"); + + b.Property("OrganizationId") + .HasColumnType("int"); + + b.Property("PartId") + .HasColumnType("bigint"); + + b.Property("PartNumber") + .HasColumnType("nvarchar(max)"); + + b.Property("Quantity") + .HasColumnType("bigint"); + + b.Property("Supplier") + .HasColumnType("nvarchar(max)"); + + b.Property("UserId") + .HasColumnType("int"); + + b.HasKey("OrderImportHistoryLineItemId"); + + b.HasIndex("OrderImportHistoryId"); + + b.HasIndex("UserId"); + + b.ToTable("OrderImportHistoryLineItems", "dbo"); + }); + + modelBuilder.Entity("Binner.Data.Model.Organization", b => + { + b.Property("OrganizationId") + .ValueGeneratedOnAdd() + .HasColumnType("int"); + + SqlServerPropertyBuilderExtensions.UseIdentityColumn(b.Property("OrganizationId")); + + b.Property("DateCreatedUtc") + .ValueGeneratedOnAdd() + .HasColumnType("datetime2") + .HasDefaultValueSql("getutcdate()"); + + b.Property("DateLockedUtc") + .HasColumnType("datetime2"); + + b.Property("DateModifiedUtc") + .ValueGeneratedOnAdd() + .HasColumnType("datetime2") + .HasDefaultValueSql("getutcdate()"); + + b.Property("Description") + .HasColumnType("nvarchar(max)"); + + b.Property("Name") + .HasColumnType("nvarchar(max)"); + + b.HasKey("OrganizationId"); + + b.ToTable("Organizations", "dbo"); + }); + + modelBuilder.Entity("Binner.Data.Model.OrganizationConfiguration", b => + { + b.Property("OrganizationConfigurationId") + .ValueGeneratedOnAdd() + .HasColumnType("int"); + + SqlServerPropertyBuilderExtensions.UseIdentityColumn(b.Property("OrganizationConfigurationId")); + + b.Property("CacheAbsoluteExpirationMinutes") + .HasColumnType("int"); + + b.Property("CacheSlidingExpirationMinutes") + .HasColumnType("int"); + + b.Property("DateCreatedUtc") + .ValueGeneratedOnAdd() + .HasColumnType("datetime2") + .HasDefaultValueSql("getutcdate()"); + + b.Property("DateModifiedUtc") + .ValueGeneratedOnAdd() + .HasColumnType("datetime2") + .HasDefaultValueSql("getutcdate()"); + + b.Property("KiCadSettingsJson") + .HasColumnType("nvarchar(max)"); + + b.Property("LicenseKey") + .HasColumnType("nvarchar(max)"); + + b.Property("MaxCacheItems") + .HasColumnType("int"); + + b.Property("OrganizationId") + .HasColumnType("int"); + + b.Property("UseModule") + .HasColumnType("int"); + + b.Property("UserId") + .HasColumnType("int"); + + b.Property("enableAutomaticMetadataFetchingForExistingParts") + .HasColumnType("bit"); + + b.HasKey("OrganizationConfigurationId"); + + b.HasIndex("OrganizationId"); + + b.HasIndex("UserId"); + + b.ToTable("OrganizationConfigurations", "dbo"); + }); + + modelBuilder.Entity("Binner.Data.Model.OrganizationIntegrationConfiguration", b => + { + b.Property("OrganizationIntegrationConfigurationId") + .ValueGeneratedOnAdd() + .HasColumnType("int"); + + SqlServerPropertyBuilderExtensions.UseIdentityColumn(b.Property("OrganizationIntegrationConfigurationId")); + + b.Property("ArrowApiKey") + .HasColumnType("nvarchar(max)"); + + b.Property("ArrowApiUrl") + .IsRequired() + .HasColumnType("nvarchar(max)"); + + b.Property("ArrowEnabled") + .HasColumnType("bit"); + + b.Property("ArrowUsername") + .HasColumnType("nvarchar(max)"); + + b.Property("DateCreatedUtc") + .ValueGeneratedOnAdd() + .HasColumnType("datetime2") + .HasDefaultValueSql("getutcdate()"); + + b.Property("DateModifiedUtc") + .ValueGeneratedOnAdd() + .HasColumnType("datetime2") + .HasDefaultValueSql("getutcdate()"); + + b.Property("DigiKeyApiUrl") + .HasColumnType("nvarchar(max)"); + + b.Property("DigiKeyClientId") + .HasColumnType("nvarchar(max)"); + + b.Property("DigiKeyClientSecret") + .HasColumnType("nvarchar(max)"); + + b.Property("DigiKeyEnabled") + .HasColumnType("bit"); + + b.Property("DigiKeyOAuthPostbackUrl") + .HasColumnType("nvarchar(max)"); + + b.Property("DigiKeySite") + .HasColumnType("int"); + + b.Property("MouserApiUrl") + .HasColumnType("nvarchar(max)"); + + b.Property("MouserCartApiKey") + .HasColumnType("nvarchar(max)"); + + b.Property("MouserEnabled") + .HasColumnType("bit"); + + b.Property("MouserOrderApiKey") + .HasColumnType("nvarchar(max)"); + + b.Property("MouserSearchApiKey") + .HasColumnType("nvarchar(max)"); + + b.Property("NexarClientId") + .HasColumnType("nvarchar(max)"); + + b.Property("NexarClientSecret") + .HasColumnType("nvarchar(max)"); + + b.Property("NexarEnabled") + .HasColumnType("bit"); + + b.Property("OrganizationId") + .HasColumnType("int"); + + b.Property("SwarmApiKey") + .HasColumnType("nvarchar(max)"); + + b.Property("SwarmApiUrl") + .HasColumnType("nvarchar(max)"); + + b.Property("SwarmEnabled") + .HasColumnType("bit"); + + b.Property("SwarmTimeout") + .HasColumnType("time"); + + b.Property("TmeApiKey") + .HasColumnType("nvarchar(max)"); + + b.Property("TmeApiUrl") + .IsRequired() + .HasColumnType("nvarchar(max)"); + + b.Property("TmeApplicationSecret") + .HasColumnType("nvarchar(max)"); + + b.Property("TmeCountry") + .HasColumnType("nvarchar(max)"); + + b.Property("TmeEnabled") + .HasColumnType("bit"); + + b.Property("TmeResolveExternalLinks") + .HasColumnType("bit"); + + b.Property("UserId") + .HasColumnType("int"); + + b.HasKey("OrganizationIntegrationConfigurationId"); + + b.HasIndex("OrganizationId"); + + b.HasIndex("UserId"); + + b.ToTable("OrganizationIntegrationConfigurations", "dbo"); + }); + + modelBuilder.Entity("Binner.Data.Model.Part", b => + { + b.Property("PartId") + .ValueGeneratedOnAdd() + .HasColumnType("bigint"); + + SqlServerPropertyBuilderExtensions.UseIdentityColumn(b.Property("PartId")); + + b.Property("ArrowPartNumber") + .HasColumnType("nvarchar(max)"); + + b.Property("BaseProductNumber") + .HasColumnType("nvarchar(max)"); + + b.Property("BinNumber") + .HasColumnType("nvarchar(450)"); + + b.Property("BinNumber2") + .HasColumnType("nvarchar(450)"); + + b.Property("Cost") + .HasColumnType("decimal(18,4)"); + + b.Property("Currency") + .HasColumnType("nvarchar(max)"); + + b.Property("DataSource") + .HasColumnType("int"); + + b.Property("DataSourceId") + .HasColumnType("nvarchar(max)"); + + b.Property("DatasheetUrl") + .HasColumnType("nvarchar(max)"); + + b.Property("DateCreatedUtc") + .ValueGeneratedOnAdd() + .HasColumnType("datetime2") + .HasDefaultValueSql("getutcdate()"); + + b.Property("DateModifiedUtc") + .ValueGeneratedOnAdd() + .HasColumnType("datetime2") + .HasDefaultValueSql("getutcdate()"); + + b.Property("Description") + .HasColumnType("nvarchar(450)"); + + b.Property("DigiKeyPartNumber") + .HasColumnType("nvarchar(450)"); + + b.Property("ExportControlClassNumber") + .HasColumnType("nvarchar(max)"); + + b.Property("ExtensionValue1") + .HasColumnType("nvarchar(max)"); + + b.Property("ExtensionValue2") + .HasColumnType("nvarchar(max)"); + + b.Property("FootprintName") + .HasColumnType("nvarchar(max)"); + + b.Property("HtsusCode") + .HasColumnType("nvarchar(max)"); + + b.Property("ImageUrl") + .HasColumnType("nvarchar(max)"); + + b.Property("Keywords") + .HasColumnType("nvarchar(450)"); + + b.Property("LastSwarmSyncUtc") + .HasColumnType("datetime2"); + + b.Property("LeadTime") + .HasColumnType("nvarchar(max)"); + + b.Property("Location") + .HasColumnType("nvarchar(450)"); + + b.Property("LowStockThreshold") + .HasColumnType("int"); + + b.Property("LowestCostSupplier") + .HasColumnType("nvarchar(max)"); + + b.Property("LowestCostSupplierUrl") + .HasColumnType("nvarchar(max)"); + + b.Property("Manufacturer") + .HasColumnType("nvarchar(450)"); + + b.Property("ManufacturerPartNumber") + .HasColumnType("nvarchar(450)"); + + b.Property("MetadataLastUpdatedUtc") + .HasColumnType("datetime2"); + + b.Property("MoistureSensitivityLevel") + .HasColumnType("nvarchar(max)"); + + b.Property("MountingTypeId") + .HasColumnType("int"); + + b.Property("MouserPartNumber") + .HasColumnType("nvarchar(450)"); + + b.Property("OrganizationId") + .HasColumnType("int"); + + b.Property("OtherNames") + .HasColumnType("nvarchar(max)"); + + b.Property("PackageType") + .HasColumnType("nvarchar(max)"); + + b.Property("PartNumber") + .HasMaxLength(64) + .HasColumnType("nvarchar(64)"); + + b.Property("PartTypeId") + .HasColumnType("bigint"); + + b.Property("ProductStatus") + .HasColumnType("nvarchar(max)"); + + b.Property("ProductUrl") + .HasColumnType("nvarchar(max)"); + + b.Property("ProjectId") + .HasColumnType("bigint"); + + b.Property("Quantity") + .HasColumnType("bigint"); + + b.Property("ReachStatus") + .HasColumnType("nvarchar(max)"); + + b.Property("RohsStatus") + .HasColumnType("nvarchar(max)"); + + b.Property("Series") + .HasColumnType("nvarchar(max)"); + + b.Property("ShortId") + .HasColumnType("nvarchar(max)"); + + b.Property("SwarmPartNumberManufacturerId") + .HasColumnType("int"); + + b.Property("SymbolName") + .HasColumnType("nvarchar(max)"); + + b.Property("TmePartNumber") + .HasColumnType("nvarchar(max)"); + + b.Property("UserId") + .HasColumnType("int"); + + b.Property("Value") + .HasColumnType("nvarchar(max)"); + + b.HasKey("PartId"); + + b.HasIndex("ProjectId"); + + b.HasIndex("UserId"); + + b.HasIndex("BinNumber", "UserId"); + + b.HasIndex("BinNumber2", "UserId"); + + b.HasIndex("Description", "UserId"); + + b.HasIndex("DigiKeyPartNumber", "UserId"); + + b.HasIndex("Keywords", "UserId"); + + b.HasIndex("Location", "UserId"); + + b.HasIndex("Manufacturer", "UserId"); + + b.HasIndex("ManufacturerPartNumber", "UserId"); + + b.HasIndex("MouserPartNumber", "UserId"); + + b.HasIndex("PartNumber", "UserId"); + + b.HasIndex("PartTypeId", "UserId"); + + b.ToTable("Parts", "dbo"); + }); + + modelBuilder.Entity("Binner.Data.Model.PartModel", b => + { + b.Property("PartModelId") + .ValueGeneratedOnAdd() + .HasColumnType("bigint"); + + SqlServerPropertyBuilderExtensions.UseIdentityColumn(b.Property("PartModelId")); + + b.Property("DateCreatedUtc") + .ValueGeneratedOnAdd() + .HasColumnType("datetime2") + .HasDefaultValueSql("getutcdate()"); + + b.Property("DateModifiedUtc") + .ValueGeneratedOnAdd() + .HasColumnType("datetime2") + .HasDefaultValueSql("getutcdate()"); + + b.Property("Filename") + .HasColumnType("nvarchar(max)"); + + b.Property("ModelType") + .HasColumnType("int"); + + b.Property("Name") + .IsRequired() + .HasColumnType("nvarchar(max)"); + + b.Property("OrganizationId") + .HasColumnType("int"); + + b.Property("PartId") + .HasColumnType("bigint"); + + b.Property("Source") + .HasColumnType("int"); + + b.Property("Url") + .HasColumnType("nvarchar(max)"); + + b.Property("UserId") + .HasColumnType("int"); + + b.HasKey("PartModelId"); + + b.HasIndex("UserId"); + + b.HasIndex("PartId", "OrganizationId"); + + b.ToTable("PartModels", "dbo"); + }); + + modelBuilder.Entity("Binner.Data.Model.PartParametric", b => + { + b.Property("PartParametricId") + .ValueGeneratedOnAdd() + .HasColumnType("bigint"); + + SqlServerPropertyBuilderExtensions.UseIdentityColumn(b.Property("PartParametricId")); + + b.Property("DateCreatedUtc") + .ValueGeneratedOnAdd() + .HasColumnType("datetime2") + .HasDefaultValueSql("getutcdate()"); + + b.Property("DateModifiedUtc") + .ValueGeneratedOnAdd() + .HasColumnType("datetime2") + .HasDefaultValueSql("getutcdate()"); + + b.Property("DigiKeyParameterId") + .HasColumnType("int"); + + b.Property("DigiKeyParameterText") + .HasColumnType("nvarchar(max)"); + + b.Property("DigiKeyParameterType") + .HasColumnType("nvarchar(max)"); + + b.Property("DigiKeyValueId") + .HasColumnType("nvarchar(max)"); + + b.Property("DigiKeyValueText") + .HasColumnType("nvarchar(max)"); + + b.Property("Name") + .IsRequired() + .HasColumnType("nvarchar(max)"); + + b.Property("OrganizationId") + .HasColumnType("int"); + + b.Property("PartId") + .HasColumnType("bigint"); + + b.Property("Units") + .HasColumnType("int"); + + b.Property("UserId") + .HasColumnType("int"); + + b.Property("Value") + .IsRequired() + .HasColumnType("nvarchar(max)"); + + b.Property("ValueNumber") + .HasColumnType("decimal(18,4)"); + + b.HasKey("PartParametricId"); + + b.HasIndex("UserId"); + + b.HasIndex("PartId", "OrganizationId"); + + b.ToTable("PartParametrics", "dbo"); + }); + + modelBuilder.Entity("Binner.Data.Model.PartScanHistory", b => + { + b.Property("PartScanHistoryId") + .ValueGeneratedOnAdd() + .HasColumnType("bigint"); + + SqlServerPropertyBuilderExtensions.UseIdentityColumn(b.Property("PartScanHistoryId")); + + b.Property("BarcodeType") + .HasColumnType("int"); + + b.Property("CountryOfOrigin") + .HasColumnType("nvarchar(max)"); + + b.Property("Crc") + .HasColumnType("int"); + + b.Property("DateCreatedUtc") + .ValueGeneratedOnAdd() + .HasColumnType("datetime2") + .HasDefaultValueSql("getutcdate()"); + + b.Property("DateModifiedUtc") + .ValueGeneratedOnAdd() + .HasColumnType("datetime2") + .HasDefaultValueSql("getutcdate()"); + + b.Property("Description") + .HasColumnType("nvarchar(max)"); + + b.Property("Invoice") + .HasColumnType("nvarchar(max)"); + + b.Property("LotCode") + .HasColumnType("nvarchar(max)"); + + b.Property("ManufacturerPartNumber") + .HasColumnType("nvarchar(max)"); + + b.Property("Mid") + .HasColumnType("nvarchar(max)"); + + b.Property("OrganizationId") + .HasColumnType("int"); + + b.Property("Packlist") + .HasColumnType("nvarchar(max)"); + + b.Property("PartId") + .HasColumnType("bigint"); + + b.Property("Quantity") + .HasColumnType("int"); + + b.Property("RawScan") + .IsRequired() + .HasColumnType("nvarchar(max)"); + + b.Property("SalesOrder") + .HasColumnType("nvarchar(max)"); + + b.Property("ScannedLabelType") + .HasColumnType("int"); + + b.Property("Supplier") + .HasColumnType("int"); + + b.Property("SupplierPartNumber") + .HasColumnType("nvarchar(max)"); + + b.Property("UserId") + .HasColumnType("int"); + + b.HasKey("PartScanHistoryId"); + + b.HasIndex("PartId"); + + b.HasIndex("UserId"); + + b.ToTable("PartScanHistories", "dbo"); + }); + + modelBuilder.Entity("Binner.Data.Model.PartSupplier", b => + { + b.Property("PartSupplierId") + .ValueGeneratedOnAdd() + .HasColumnType("bigint"); + + SqlServerPropertyBuilderExtensions.UseIdentityColumn(b.Property("PartSupplierId")); + + b.Property("Cost") + .HasColumnType("decimal(18,4)"); + + b.Property("DateCreatedUtc") + .ValueGeneratedOnAdd() + .HasColumnType("datetime2") + .HasDefaultValueSql("getutcdate()"); + + b.Property("DateModifiedUtc") + .ValueGeneratedOnAdd() + .HasColumnType("datetime2") + .HasDefaultValueSql("getutcdate()"); + + b.Property("ImageUrl") + .HasColumnType("nvarchar(max)"); + + b.Property("MinimumOrderQuantity") + .HasColumnType("int"); + + b.Property("Name") + .HasColumnType("nvarchar(max)"); + + b.Property("OrganizationId") + .HasColumnType("int"); + + b.Property("PartId") + .HasColumnType("bigint"); + + b.Property("ProductUrl") + .HasColumnType("nvarchar(max)"); + + b.Property("QuantityAvailable") + .HasColumnType("int"); + + b.Property("SupplierPartNumber") + .HasColumnType("nvarchar(max)"); + + b.Property("UserId") + .HasColumnType("int"); + + b.HasKey("PartSupplierId"); + + b.HasIndex("PartId"); + + b.HasIndex("UserId"); + + b.ToTable("PartSuppliers", "dbo"); + }); + + modelBuilder.Entity("Binner.Data.Model.PartType", b => + { + b.Property("PartTypeId") + .ValueGeneratedOnAdd() + .HasColumnType("bigint"); + + SqlServerPropertyBuilderExtensions.UseIdentityColumn(b.Property("PartTypeId")); + + b.Property("DateCreatedUtc") + .ValueGeneratedOnAdd() + .HasColumnType("datetime2") + .HasDefaultValueSql("getutcdate()"); + + b.Property("DateModifiedUtc") + .ValueGeneratedOnAdd() + .HasColumnType("datetime2") + .HasDefaultValueSql("getutcdate()"); + + b.Property("Description") + .HasColumnType("nvarchar(max)"); + + b.Property("Icon") + .HasColumnType("nvarchar(max)"); + + b.Property("Keywords") + .HasColumnType("nvarchar(max)"); + + b.Property("Name") + .HasColumnType("nvarchar(450)"); + + b.Property("OrganizationId") + .HasColumnType("int"); + + b.Property("ParentPartTypeId") + .HasColumnType("bigint"); + + b.Property("ReferenceDesignator") + .HasColumnType("nvarchar(max)"); + + b.Property("SymbolId") + .HasColumnType("nvarchar(max)"); + + b.Property("UserId") + .HasColumnType("int"); + + b.HasKey("PartTypeId"); + + b.HasIndex("ParentPartTypeId"); + + b.HasIndex("UserId"); + + b.HasIndex("Name", "UserId"); + + b.ToTable("PartTypes", "dbo"); + }); + + modelBuilder.Entity("Binner.Data.Model.Pcb", b => + { + b.Property("PcbId") + .ValueGeneratedOnAdd() + .HasColumnType("bigint"); + + SqlServerPropertyBuilderExtensions.UseIdentityColumn(b.Property("PcbId")); + + b.Property("Cost") + .HasColumnType("float"); + + b.Property("DateCreatedUtc") + .ValueGeneratedOnAdd() + .HasColumnType("datetime2") + .HasDefaultValueSql("getutcdate()"); + + b.Property("DateModifiedUtc") + .ValueGeneratedOnAdd() + .HasColumnType("datetime2") + .HasDefaultValueSql("getutcdate()"); + + b.Property("Description") + .HasColumnType("nvarchar(max)"); + + b.Property("LastSerialNumber") + .HasColumnType("nvarchar(max)"); + + b.Property("Name") + .HasColumnType("nvarchar(max)"); + + b.Property("OrganizationId") + .HasColumnType("int"); + + b.Property("Quantity") + .HasColumnType("int"); + + b.Property("SerialNumberFormat") + .HasColumnType("nvarchar(max)"); + + b.Property("UserId") + .HasColumnType("int"); + + b.HasKey("PcbId"); + + b.HasIndex("UserId"); + + b.ToTable("Pcbs", "dbo"); + }); + + modelBuilder.Entity("Binner.Data.Model.PcbStoredFileAssignment", b => + { + b.Property("PcbStoredFileAssignmentId") + .ValueGeneratedOnAdd() + .HasColumnType("bigint"); + + SqlServerPropertyBuilderExtensions.UseIdentityColumn(b.Property("PcbStoredFileAssignmentId")); + + b.Property("DateCreatedUtc") + .ValueGeneratedOnAdd() + .HasColumnType("datetime2") + .HasDefaultValueSql("getutcdate()"); + + b.Property("DateModifiedUtc") + .ValueGeneratedOnAdd() + .HasColumnType("datetime2") + .HasDefaultValueSql("getutcdate()"); + + b.Property("Name") + .HasColumnType("nvarchar(max)"); + + b.Property("Notes") + .HasColumnType("nvarchar(max)"); + + b.Property("OrganizationId") + .HasColumnType("int"); + + b.Property("PcbId") + .HasColumnType("bigint"); + + b.Property("StoredFileId") + .HasColumnType("bigint"); + + b.Property("UserId") + .HasColumnType("int"); + + b.HasKey("PcbStoredFileAssignmentId"); + + b.HasIndex("PcbId"); + + b.HasIndex("StoredFileId"); + + b.HasIndex("UserId"); + + b.ToTable("PcbStoredFileAssignments", "dbo"); + }); + + modelBuilder.Entity("Binner.Data.Model.Project", b => + { + b.Property("ProjectId") + .ValueGeneratedOnAdd() + .HasColumnType("bigint"); + + SqlServerPropertyBuilderExtensions.UseIdentityColumn(b.Property("ProjectId")); + + b.Property("Color") + .HasColumnType("int"); + + b.Property("DateCreatedUtc") + .ValueGeneratedOnAdd() + .HasColumnType("datetime2") + .HasDefaultValueSql("getutcdate()"); + + b.Property("DateModifiedUtc") + .ValueGeneratedOnAdd() + .HasColumnType("datetime2") + .HasDefaultValueSql("getutcdate()"); + + b.Property("Description") + .HasColumnType("nvarchar(max)"); + + b.Property("Location") + .HasColumnType("nvarchar(max)"); + + b.Property("Name") + .HasColumnType("nvarchar(450)"); + + b.Property("Notes") + .HasColumnType("nvarchar(max)"); + + b.Property("OrganizationId") + .HasColumnType("int"); + + b.Property("UserId") + .HasColumnType("int"); + + b.HasKey("ProjectId"); + + b.HasIndex("UserId"); + + b.HasIndex("Name", "UserId"); + + b.ToTable("Projects", "dbo"); + }); + + modelBuilder.Entity("Binner.Data.Model.ProjectPartAssignment", b => + { + b.Property("ProjectPartAssignmentId") + .ValueGeneratedOnAdd() + .HasColumnType("bigint"); + + SqlServerPropertyBuilderExtensions.UseIdentityColumn(b.Property("ProjectPartAssignmentId")); + + b.Property("Cost") + .HasColumnType("float"); + + b.Property("Currency") + .HasColumnType("nvarchar(max)"); + + b.Property("CustomDescription") + .HasColumnType("nvarchar(max)"); + + b.Property("DateCreatedUtc") + .ValueGeneratedOnAdd() + .HasColumnType("datetime2") + .HasDefaultValueSql("getutcdate()"); + + b.Property("DateModifiedUtc") + .ValueGeneratedOnAdd() + .HasColumnType("datetime2") + .HasDefaultValueSql("getutcdate()"); + + b.Property("FootprintName") + .HasColumnType("nvarchar(max)"); + + b.Property("Notes") + .HasColumnType("nvarchar(max)"); + + b.Property("OrganizationId") + .HasColumnType("int"); + + b.Property("PartId") + .HasColumnType("bigint"); + + b.Property("PartName") + .HasColumnType("nvarchar(max)"); + + b.Property("PcbId") + .HasColumnType("bigint"); + + b.Property("ProjectId") + .HasColumnType("bigint"); + + b.Property("Quantity") + .HasColumnType("int"); + + b.Property("QuantityAvailable") + .HasColumnType("int"); + + b.Property("ReferenceId") + .HasColumnType("nvarchar(max)"); + + b.Property("SchematicReferenceId") + .HasColumnType("nvarchar(max)"); + + b.Property("SymbolName") + .HasColumnType("nvarchar(max)"); + + b.Property("UserId") + .HasColumnType("int"); + + b.HasKey("ProjectPartAssignmentId"); + + b.HasIndex("PartId"); + + b.HasIndex("ProjectId"); + + b.HasIndex("UserId"); + + b.ToTable("ProjectPartAssignments", "dbo"); + }); + + modelBuilder.Entity("Binner.Data.Model.ProjectPcbAssignment", b => + { + b.Property("ProjectPcbAssignmentId") + .ValueGeneratedOnAdd() + .HasColumnType("bigint"); + + SqlServerPropertyBuilderExtensions.UseIdentityColumn(b.Property("ProjectPcbAssignmentId")); + + b.Property("DateCreatedUtc") + .ValueGeneratedOnAdd() + .HasColumnType("datetime2") + .HasDefaultValueSql("getutcdate()"); + + b.Property("DateModifiedUtc") + .ValueGeneratedOnAdd() + .HasColumnType("datetime2") + .HasDefaultValueSql("getutcdate()"); + + b.Property("OrganizationId") + .HasColumnType("int"); + + b.Property("PcbId") + .HasColumnType("bigint"); + + b.Property("ProjectId") + .HasColumnType("bigint"); + + b.Property("UserId") + .HasColumnType("int"); + + b.HasKey("ProjectPcbAssignmentId"); + + b.HasIndex("PcbId"); + + b.HasIndex("ProjectId"); + + b.HasIndex("UserId"); + + b.ToTable("ProjectPcbAssignments", "dbo"); + }); + + modelBuilder.Entity("Binner.Data.Model.ProjectPcbProduceHistory", b => + { + b.Property("ProjectPcbProduceHistoryId") + .ValueGeneratedOnAdd() + .HasColumnType("bigint"); + + SqlServerPropertyBuilderExtensions.UseIdentityColumn(b.Property("ProjectPcbProduceHistoryId")); + + b.Property("DateCreatedUtc") + .ValueGeneratedOnAdd() + .HasColumnType("datetime2") + .HasDefaultValueSql("getutcdate()"); + + b.Property("DateModifiedUtc") + .ValueGeneratedOnAdd() + .HasColumnType("datetime2") + .HasDefaultValueSql("getutcdate()"); + + b.Property("OrganizationId") + .HasColumnType("int"); + + b.Property("PartsConsumed") + .HasColumnType("int"); + + b.Property("PcbCost") + .HasColumnType("float"); + + b.Property("PcbId") + .HasColumnType("bigint"); + + b.Property("PcbQuantity") + .HasColumnType("int"); + + b.Property("ProjectProduceHistoryId") + .HasColumnType("bigint"); + + b.Property("SerialNumber") + .HasColumnType("nvarchar(max)"); + + b.Property("UserId") + .HasColumnType("int"); + + b.HasKey("ProjectPcbProduceHistoryId"); + + b.HasIndex("PcbId"); + + b.HasIndex("ProjectProduceHistoryId"); + + b.HasIndex("UserId"); + + b.ToTable("ProjectPcbProduceHistory", "dbo"); + }); + + modelBuilder.Entity("Binner.Data.Model.ProjectProduceHistory", b => + { + b.Property("ProjectProduceHistoryId") + .ValueGeneratedOnAdd() + .HasColumnType("bigint"); + + SqlServerPropertyBuilderExtensions.UseIdentityColumn(b.Property("ProjectProduceHistoryId")); + + b.Property("DateCreatedUtc") + .ValueGeneratedOnAdd() + .HasColumnType("datetime2") + .HasDefaultValueSql("getutcdate()"); + + b.Property("DateModifiedUtc") + .ValueGeneratedOnAdd() + .HasColumnType("datetime2") + .HasDefaultValueSql("getutcdate()"); + + b.Property("OrganizationId") + .HasColumnType("int"); + + b.Property("PartsConsumed") + .HasColumnType("int"); + + b.Property("ProduceUnassociated") + .HasColumnType("bit"); + + b.Property("ProjectId") + .HasColumnType("bigint"); + + b.Property("Quantity") + .HasColumnType("int"); + + b.Property("UserId") + .HasColumnType("int"); + + b.HasKey("ProjectProduceHistoryId"); + + b.HasIndex("ProjectId"); + + b.HasIndex("UserId"); + + b.ToTable("ProjectProduceHistory", "dbo"); + }); + + modelBuilder.Entity("Binner.Data.Model.StoredFile", b => + { + b.Property("StoredFileId") + .ValueGeneratedOnAdd() + .HasColumnType("bigint"); + + SqlServerPropertyBuilderExtensions.UseIdentityColumn(b.Property("StoredFileId")); + + b.Property("Crc32") + .HasColumnType("int"); + + b.Property("DateCreatedUtc") + .ValueGeneratedOnAdd() + .HasColumnType("datetime2") + .HasDefaultValueSql("getutcdate()"); + + b.Property("DateModifiedUtc") + .ValueGeneratedOnAdd() + .HasColumnType("datetime2") + .HasDefaultValueSql("getutcdate()"); + + b.Property("FileLength") + .HasColumnType("int"); + + b.Property("FileName") + .IsRequired() + .HasColumnType("nvarchar(max)"); + + b.Property("OrganizationId") + .HasColumnType("int"); + + b.Property("OriginalFileName") + .IsRequired() + .HasColumnType("nvarchar(max)"); + + b.Property("PartId") + .HasColumnType("bigint"); + + b.Property("RecordId") + .HasColumnType("bigint"); + + b.Property("RecordType") + .HasColumnType("int"); + + b.Property("StoredFileType") + .HasColumnType("int"); + + b.Property("UserId") + .HasColumnType("int"); + + b.HasKey("StoredFileId"); + + b.HasIndex("PartId"); + + b.HasIndex("UserId"); + + b.ToTable("StoredFiles", "dbo"); + }); + + modelBuilder.Entity("Binner.Data.Model.User", b => + { + b.Property("UserId") + .ValueGeneratedOnAdd() + .HasColumnType("int"); + + SqlServerPropertyBuilderExtensions.UseIdentityColumn(b.Property("UserId")); + + b.Property("DateCreatedUtc") + .ValueGeneratedOnAdd() + .HasColumnType("datetime2") + .HasDefaultValueSql("getutcdate()"); + + b.Property("DateEmailConfirmedUtc") + .HasColumnType("datetime2"); + + b.Property("DateLastActiveUtc") + .HasColumnType("datetime2"); + + b.Property("DateLastLoginUtc") + .HasColumnType("datetime2"); + + b.Property("DateLockedUtc") + .HasColumnType("datetime2"); + + b.Property("DateModifiedUtc") + .ValueGeneratedOnAdd() + .HasColumnType("datetime2") + .HasDefaultValueSql("getutcdate()"); + + b.Property("EmailAddress") + .IsRequired() + .HasColumnType("nvarchar(450)"); + + b.Property("EmailConfirmationToken") + .HasColumnType("nvarchar(max)"); + + b.Property("EmailConfirmedIp") + .ValueGeneratedOnAdd() + .HasColumnType("bigint") + .HasDefaultValue(0L); + + b.Property("Ip") + .ValueGeneratedOnAdd() + .HasColumnType("bigint") + .HasDefaultValue(0L); + + b.Property("IsAdmin") + .HasColumnType("bit"); + + b.Property("IsEmailConfirmed") + .HasColumnType("bit"); + + b.Property("IsEmailSubscribed") + .HasColumnType("bit"); + + b.Property("LastSetPasswordIp") + .ValueGeneratedOnAdd() + .HasColumnType("bigint") + .HasDefaultValue(0L); + + b.Property("LocaleCurrency") + .HasColumnType("nvarchar(max)"); + + b.Property("LocaleLanguage") + .HasColumnType("nvarchar(max)"); + + b.Property("Name") + .IsRequired() + .HasColumnType("nvarchar(450)"); + + b.Property("OrganizationId") + .HasColumnType("int"); + + b.Property("PasswordHash") + .IsRequired() + .HasColumnType("nvarchar(max)"); + + b.Property("PhoneNumber") + .HasColumnType("nvarchar(450)"); + + b.Property("ProfileImage") + .HasColumnType("varbinary(max)"); + + b.Property("ReCaptchaScore") + .HasColumnType("float"); + + b.HasKey("UserId"); + + b.HasIndex("EmailAddress"); + + b.HasIndex("Name"); + + b.HasIndex("OrganizationId"); + + b.HasIndex("PhoneNumber"); + + b.ToTable("Users", "dbo"); + }); + + modelBuilder.Entity("Binner.Data.Model.UserConfiguration", b => + { + b.Property("UserConfigurationId") + .ValueGeneratedOnAdd() + .HasColumnType("int"); + + SqlServerPropertyBuilderExtensions.UseIdentityColumn(b.Property("UserConfigurationId")); + + b.Property("BarcodeBufferTime") + .HasColumnType("int"); + + b.Property("BarcodeEnabled") + .HasColumnType("bit"); + + b.Property("BarcodeIsDebug") + .HasColumnType("bit"); + + b.Property("BarcodeMaxKeystrokeThresholdMs") + .HasColumnType("int"); + + b.Property("BarcodePrefix2D") + .IsRequired() + .HasColumnType("nvarchar(max)"); + + b.Property("BarcodeProfile") + .HasColumnType("int"); + + b.Property("Currency") + .HasColumnType("int"); + + b.Property("DateCreatedUtc") + .ValueGeneratedOnAdd() + .HasColumnType("datetime2") + .HasDefaultValueSql("getutcdate()"); + + b.Property("DateModifiedUtc") + .ValueGeneratedOnAdd() + .HasColumnType("datetime2") + .HasDefaultValueSql("getutcdate()"); + + b.Property("DefaultPartLabelId") + .HasColumnType("int"); + + b.Property("EnableAutoPartSearch") + .HasColumnType("bit"); + + b.Property("EnableCheckNewVersion") + .HasColumnType("bit"); + + b.Property("EnableDarkMode") + .HasColumnType("bit"); + + b.Property("Language") + .HasColumnType("int"); + + b.Property("OrganizationId") + .HasColumnType("int"); + + b.Property("UserId") + .HasColumnType("int"); + + b.HasKey("UserConfigurationId"); + + b.HasIndex("UserId"); + + b.ToTable("UserConfigurations", "dbo"); + }); + + modelBuilder.Entity("Binner.Data.Model.UserLoginHistory", b => + { + b.Property("UserLoginHistoryId") + .ValueGeneratedOnAdd() + .HasColumnType("int"); + + SqlServerPropertyBuilderExtensions.UseIdentityColumn(b.Property("UserLoginHistoryId")); + + b.Property("CanLogin") + .HasColumnType("bit"); + + b.Property("DateCreatedUtc") + .ValueGeneratedOnAdd() + .HasColumnType("datetime2") + .HasDefaultValueSql("getutcdate()"); + + b.Property("DateModifiedUtc") + .ValueGeneratedOnAdd() + .HasColumnType("datetime2") + .HasDefaultValueSql("getutcdate()"); + + b.Property("EmailAddress") + .HasColumnType("nvarchar(max)"); + + b.Property("Ip") + .ValueGeneratedOnAdd() + .HasColumnType("bigint") + .HasDefaultValue(0L); + + b.Property("IsSuccessful") + .HasColumnType("bit"); + + b.Property("Message") + .HasColumnType("nvarchar(max)"); + + b.Property("OrganizationId") + .HasColumnType("int"); + + b.Property("ReCaptchaScore") + .HasColumnType("float"); + + b.Property("UserId") + .HasColumnType("int"); + + b.HasKey("UserLoginHistoryId"); + + b.HasIndex("UserId"); + + b.ToTable("UserLoginHistory", "dbo"); + }); + + modelBuilder.Entity("Binner.Data.Model.UserPrinterConfiguration", b => + { + b.Property("UserPrinterConfigurationId") + .ValueGeneratedOnAdd() + .HasColumnType("int"); + + SqlServerPropertyBuilderExtensions.UseIdentityColumn(b.Property("UserPrinterConfigurationId")); + + b.Property("DateCreatedUtc") + .ValueGeneratedOnAdd() + .HasColumnType("datetime2") + .HasDefaultValueSql("getutcdate()"); + + b.Property("DateModifiedUtc") + .ValueGeneratedOnAdd() + .HasColumnType("datetime2") + .HasDefaultValueSql("getutcdate()"); + + b.Property("OrganizationId") + .HasColumnType("int"); + + b.Property("PartLabelName") + .IsRequired() + .HasColumnType("nvarchar(max)"); + + b.Property("PartLabelSource") + .HasColumnType("int"); + + b.Property("PrintMode") + .HasColumnType("int"); + + b.Property("PrinterName") + .IsRequired() + .HasColumnType("nvarchar(max)"); + + b.Property("RemoteAddressUrl") + .HasColumnType("nvarchar(max)"); + + b.Property("UserId") + .HasColumnType("int"); + + b.HasKey("UserPrinterConfigurationId"); + + b.HasIndex("UserId"); + + b.ToTable("UserPrinterConfigurations", "dbo"); + }); + + modelBuilder.Entity("Binner.Data.Model.UserPrinterTemplateConfiguration", b => + { + b.Property("UserPrinterTemplateConfigurationId") + .ValueGeneratedOnAdd() + .HasColumnType("int"); + + SqlServerPropertyBuilderExtensions.UseIdentityColumn(b.Property("UserPrinterTemplateConfigurationId")); + + b.Property("AutoSize") + .HasColumnType("bit"); + + b.Property("Barcode") + .HasColumnType("bit"); + + b.Property("Color") + .HasColumnType("nvarchar(max)"); + + b.Property("Content") + .HasColumnType("nvarchar(max)"); + + b.Property("DateCreatedUtc") + .ValueGeneratedOnAdd() + .HasColumnType("datetime2") + .HasDefaultValueSql("getutcdate()"); + + b.Property("DateModifiedUtc") + .ValueGeneratedOnAdd() + .HasColumnType("datetime2") + .HasDefaultValueSql("getutcdate()"); + + b.Property("FontName") + .IsRequired() + .HasColumnType("nvarchar(max)"); + + b.Property("FontSize") + .HasColumnType("int"); + + b.Property("Label") + .HasColumnType("int"); + + b.Property("Line") + .HasColumnType("int"); + + b.Property("LowerCase") + .HasColumnType("bit"); + + b.Property("MarginBottom") + .HasColumnType("int"); + + b.Property("MarginLeft") + .HasColumnType("int"); + + b.Property("MarginRight") + .HasColumnType("int"); + + b.Property("MarginTop") + .HasColumnType("int"); + + b.Property("OrganizationId") + .HasColumnType("int"); + + b.Property("Position") + .HasColumnType("int"); + + b.Property("Rotate") + .HasColumnType("int"); + + b.Property("UpperCase") + .HasColumnType("bit"); + + b.Property("UserId") + .HasColumnType("int"); + + b.Property("UserPrinterConfigurationId") + .HasColumnType("int"); + + b.HasKey("UserPrinterTemplateConfigurationId"); + + b.HasIndex("UserId"); + + b.HasIndex("UserPrinterConfigurationId"); + + b.ToTable("UserPrinterTemplateConfigurations", "dbo"); + }); + + modelBuilder.Entity("Binner.Data.Model.UserToken", b => + { + b.Property("UserTokenId") + .ValueGeneratedOnAdd() + .HasColumnType("int"); + + SqlServerPropertyBuilderExtensions.UseIdentityColumn(b.Property("UserTokenId")); + + b.Property("DateCreatedUtc") + .ValueGeneratedOnAdd() + .HasColumnType("datetime2") + .HasDefaultValueSql("getutcdate()"); + + b.Property("DateExpiredUtc") + .HasColumnType("datetime2"); + + b.Property("DateModifiedUtc") + .ValueGeneratedOnAdd() + .HasColumnType("datetime2") + .HasDefaultValueSql("getutcdate()"); + + b.Property("DateRevokedUtc") + .HasColumnType("datetime2"); + + b.Property("Ip") + .ValueGeneratedOnAdd() + .HasColumnType("bigint") + .HasDefaultValue(0L); + + b.Property("OrganizationId") + .HasColumnType("int"); + + b.Property("ReplacedByToken") + .HasColumnType("nvarchar(max)"); + + b.Property("Token") + .IsRequired() + .HasColumnType("nvarchar(max)"); + + b.Property("TokenConfig") + .HasColumnType("nvarchar(max)"); + + b.Property("TokenTypeId") + .HasColumnType("int"); + + b.Property("UserId") + .HasColumnType("int"); + + b.HasKey("UserTokenId"); + + b.HasIndex("UserId"); + + b.ToTable("UserTokens", "dbo"); + }); + + modelBuilder.Entity("Binner.Data.Model.CustomField", b => + { + b.HasOne("Binner.Data.Model.User", "User") + .WithMany("CustomFields") + .HasForeignKey("UserId") + .OnDelete(DeleteBehavior.Restrict); + + b.Navigation("User"); + }); + + modelBuilder.Entity("Binner.Data.Model.CustomFieldValue", b => + { + b.HasOne("Binner.Data.Model.CustomField", "CustomField") + .WithMany("CustomFieldValues") + .HasForeignKey("CustomFieldId") + .OnDelete(DeleteBehavior.Restrict) + .IsRequired(); + + b.HasOne("Binner.Data.Model.User", "User") + .WithMany("CustomFieldValues") + .HasForeignKey("UserId") + .OnDelete(DeleteBehavior.Restrict); + + b.Navigation("CustomField"); + + b.Navigation("User"); + }); + + modelBuilder.Entity("Binner.Data.Model.Label", b => + { + b.HasOne("Binner.Data.Model.LabelTemplate", "LabelTemplate") + .WithMany("Labels") + .HasForeignKey("LabelTemplateId") + .OnDelete(DeleteBehavior.Restrict) + .IsRequired(); + + b.Navigation("LabelTemplate"); + }); + + modelBuilder.Entity("Binner.Data.Model.OAuthCredential", b => + { + b.HasOne("Binner.Data.Model.User", "User") + .WithMany("OAuthCredentials") + .HasForeignKey("UserId") + .OnDelete(DeleteBehavior.Restrict); + + b.Navigation("User"); + }); + + modelBuilder.Entity("Binner.Data.Model.OAuthRequest", b => + { + b.HasOne("Binner.Data.Model.User", "User") + .WithMany("OAuthRequests") + .HasForeignKey("UserId") + .OnDelete(DeleteBehavior.Restrict); + + b.Navigation("User"); + }); + + modelBuilder.Entity("Binner.Data.Model.OrderImportHistory", b => + { + b.HasOne("Binner.Data.Model.User", "User") + .WithMany("OrderImportHistory") + .HasForeignKey("UserId") + .OnDelete(DeleteBehavior.SetNull); + + b.Navigation("User"); + }); + + modelBuilder.Entity("Binner.Data.Model.OrderImportHistoryLineItem", b => + { + b.HasOne("Binner.Data.Model.OrderImportHistory", "OrderImportHistory") + .WithMany("OrderImportHistoryLineItems") + .HasForeignKey("OrderImportHistoryId") + .OnDelete(DeleteBehavior.Restrict) + .IsRequired(); + + b.HasOne("Binner.Data.Model.User", "User") + .WithMany("OrderImportHistoryLineItems") + .HasForeignKey("UserId") + .OnDelete(DeleteBehavior.SetNull); + + b.Navigation("OrderImportHistory"); + + b.Navigation("User"); + }); + + modelBuilder.Entity("Binner.Data.Model.OrganizationConfiguration", b => + { + b.HasOne("Binner.Data.Model.Organization", "Organization") + .WithMany("OrganizationConfigurations") + .HasForeignKey("OrganizationId") + .OnDelete(DeleteBehavior.Restrict); + + b.HasOne("Binner.Data.Model.User", null) + .WithMany("OrganizationConfigurations") + .HasForeignKey("UserId"); + + b.Navigation("Organization"); + }); + + modelBuilder.Entity("Binner.Data.Model.OrganizationIntegrationConfiguration", b => + { + b.HasOne("Binner.Data.Model.Organization", "Organization") + .WithMany("OrganizationIntegrationConfigurations") + .HasForeignKey("OrganizationId") + .OnDelete(DeleteBehavior.Restrict); + + b.HasOne("Binner.Data.Model.User", null) + .WithMany("OrganizationIntegrationConfigurations") + .HasForeignKey("UserId"); + + b.Navigation("Organization"); + }); + + modelBuilder.Entity("Binner.Data.Model.Part", b => + { + b.HasOne("Binner.Data.Model.PartType", "PartType") + .WithMany("Parts") + .HasForeignKey("PartTypeId") + .OnDelete(DeleteBehavior.Restrict) + .IsRequired(); + + b.HasOne("Binner.Data.Model.Project", "Project") + .WithMany("Parts") + .HasForeignKey("ProjectId") + .OnDelete(DeleteBehavior.Restrict); + + b.HasOne("Binner.Data.Model.User", "User") + .WithMany("Parts") + .HasForeignKey("UserId") + .OnDelete(DeleteBehavior.SetNull); + + b.Navigation("PartType"); + + b.Navigation("Project"); + + b.Navigation("User"); + }); + + modelBuilder.Entity("Binner.Data.Model.PartModel", b => + { + b.HasOne("Binner.Data.Model.Part", "Part") + .WithMany("PartModels") + .HasForeignKey("PartId") + .OnDelete(DeleteBehavior.Restrict) + .IsRequired(); + + b.HasOne("Binner.Data.Model.User", "User") + .WithMany("PartModels") + .HasForeignKey("UserId") + .OnDelete(DeleteBehavior.SetNull); + + b.Navigation("Part"); + + b.Navigation("User"); + }); + + modelBuilder.Entity("Binner.Data.Model.PartParametric", b => + { + b.HasOne("Binner.Data.Model.Part", "Part") + .WithMany("PartParametrics") + .HasForeignKey("PartId") + .OnDelete(DeleteBehavior.Restrict) + .IsRequired(); + + b.HasOne("Binner.Data.Model.User", "User") + .WithMany("PartParametrics") + .HasForeignKey("UserId") + .OnDelete(DeleteBehavior.SetNull); + + b.Navigation("Part"); + + b.Navigation("User"); + }); + + modelBuilder.Entity("Binner.Data.Model.PartScanHistory", b => + { + b.HasOne("Binner.Data.Model.Part", "Part") + .WithMany("PartScanHistories") + .HasForeignKey("PartId") + .OnDelete(DeleteBehavior.Restrict); + + b.HasOne("Binner.Data.Model.User", "User") + .WithMany("PartScanHistories") + .HasForeignKey("UserId") + .OnDelete(DeleteBehavior.SetNull); + + b.Navigation("Part"); + + b.Navigation("User"); + }); + + modelBuilder.Entity("Binner.Data.Model.PartSupplier", b => + { + b.HasOne("Binner.Data.Model.Part", "Part") + .WithMany("PartSuppliers") + .HasForeignKey("PartId") + .OnDelete(DeleteBehavior.Restrict) + .IsRequired(); + + b.HasOne("Binner.Data.Model.User", "User") + .WithMany("PartSuppliers") + .HasForeignKey("UserId") + .OnDelete(DeleteBehavior.SetNull); + + b.Navigation("Part"); + + b.Navigation("User"); + }); + + modelBuilder.Entity("Binner.Data.Model.PartType", b => + { + b.HasOne("Binner.Data.Model.PartType", "ParentPartType") + .WithMany() + .HasForeignKey("ParentPartTypeId") + .OnDelete(DeleteBehavior.Restrict); + + b.HasOne("Binner.Data.Model.User", "User") + .WithMany("PartTypes") + .HasForeignKey("UserId") + .OnDelete(DeleteBehavior.SetNull); + + b.Navigation("ParentPartType"); + + b.Navigation("User"); + }); + + modelBuilder.Entity("Binner.Data.Model.Pcb", b => + { + b.HasOne("Binner.Data.Model.User", "User") + .WithMany("Pcbs") + .HasForeignKey("UserId") + .OnDelete(DeleteBehavior.SetNull); + + b.Navigation("User"); + }); + + modelBuilder.Entity("Binner.Data.Model.PcbStoredFileAssignment", b => + { + b.HasOne("Binner.Data.Model.Pcb", "Pcb") + .WithMany("PcbStoredFileAssignments") + .HasForeignKey("PcbId") + .OnDelete(DeleteBehavior.Restrict) + .IsRequired(); + + b.HasOne("Binner.Data.Model.StoredFile", "StoredFile") + .WithMany("PcbStoredFileAssignments") + .HasForeignKey("StoredFileId") + .OnDelete(DeleteBehavior.Restrict) + .IsRequired(); + + b.HasOne("Binner.Data.Model.User", "User") + .WithMany("PcbStoredFileAssignments") + .HasForeignKey("UserId") + .OnDelete(DeleteBehavior.SetNull); + + b.Navigation("Pcb"); + + b.Navigation("StoredFile"); + + b.Navigation("User"); + }); + + modelBuilder.Entity("Binner.Data.Model.Project", b => + { + b.HasOne("Binner.Data.Model.User", "User") + .WithMany("Projects") + .HasForeignKey("UserId") + .OnDelete(DeleteBehavior.SetNull); + + b.Navigation("User"); + }); + + modelBuilder.Entity("Binner.Data.Model.ProjectPartAssignment", b => + { + b.HasOne("Binner.Data.Model.Part", "Part") + .WithMany("ProjectPartAssignments") + .HasForeignKey("PartId") + .OnDelete(DeleteBehavior.Restrict); + + b.HasOne("Binner.Data.Model.Project", "Project") + .WithMany("ProjectPartAssignments") + .HasForeignKey("ProjectId") + .OnDelete(DeleteBehavior.Restrict) + .IsRequired(); + + b.HasOne("Binner.Data.Model.User", "User") + .WithMany("ProjectPartAssignments") + .HasForeignKey("UserId") + .OnDelete(DeleteBehavior.SetNull); + + b.Navigation("Part"); + + b.Navigation("Project"); + + b.Navigation("User"); + }); + + modelBuilder.Entity("Binner.Data.Model.ProjectPcbAssignment", b => + { + b.HasOne("Binner.Data.Model.Pcb", "Pcb") + .WithMany("ProjectPcbAssignments") + .HasForeignKey("PcbId") + .OnDelete(DeleteBehavior.Restrict) + .IsRequired(); + + b.HasOne("Binner.Data.Model.Project", "Project") + .WithMany("ProjectPcbAssignments") + .HasForeignKey("ProjectId") + .OnDelete(DeleteBehavior.Restrict) + .IsRequired(); + + b.HasOne("Binner.Data.Model.User", "User") + .WithMany("ProjectPcbAssignments") + .HasForeignKey("UserId") + .OnDelete(DeleteBehavior.SetNull); + + b.Navigation("Pcb"); + + b.Navigation("Project"); + + b.Navigation("User"); + }); + + modelBuilder.Entity("Binner.Data.Model.ProjectPcbProduceHistory", b => + { + b.HasOne("Binner.Data.Model.Pcb", "Pcb") + .WithMany("ProjectPcbProduceHistory") + .HasForeignKey("PcbId"); + + b.HasOne("Binner.Data.Model.ProjectProduceHistory", "ProjectProduceHistory") + .WithMany("ProjectPcbProduceHistory") + .HasForeignKey("ProjectProduceHistoryId") + .OnDelete(DeleteBehavior.Restrict) + .IsRequired(); + + b.HasOne("Binner.Data.Model.User", "User") + .WithMany("ProjectPcbProduceHistory") + .HasForeignKey("UserId") + .OnDelete(DeleteBehavior.SetNull); + + b.Navigation("Pcb"); + + b.Navigation("ProjectProduceHistory"); + + b.Navigation("User"); + }); + + modelBuilder.Entity("Binner.Data.Model.ProjectProduceHistory", b => + { + b.HasOne("Binner.Data.Model.Project", "Project") + .WithMany("ProjectProduceHistory") + .HasForeignKey("ProjectId") + .OnDelete(DeleteBehavior.Restrict) + .IsRequired(); + + b.HasOne("Binner.Data.Model.User", "User") + .WithMany("ProjectProduceHistory") + .HasForeignKey("UserId") + .OnDelete(DeleteBehavior.SetNull); + + b.Navigation("Project"); + + b.Navigation("User"); + }); + + modelBuilder.Entity("Binner.Data.Model.StoredFile", b => + { + b.HasOne("Binner.Data.Model.Part", "Part") + .WithMany("StoredFiles") + .HasForeignKey("PartId") + .OnDelete(DeleteBehavior.Restrict); + + b.HasOne("Binner.Data.Model.User", "User") + .WithMany("StoredFiles") + .HasForeignKey("UserId") + .OnDelete(DeleteBehavior.SetNull); + + b.Navigation("Part"); + + b.Navigation("User"); + }); + + modelBuilder.Entity("Binner.Data.Model.User", b => + { + b.HasOne("Binner.Data.Model.Organization", "Organization") + .WithMany("Users") + .HasForeignKey("OrganizationId") + .OnDelete(DeleteBehavior.Restrict) + .IsRequired(); + + b.Navigation("Organization"); + }); + + modelBuilder.Entity("Binner.Data.Model.UserConfiguration", b => + { + b.HasOne("Binner.Data.Model.User", "User") + .WithMany("UserConfigurations") + .HasForeignKey("UserId") + .OnDelete(DeleteBehavior.Restrict); + + b.Navigation("User"); + }); + + modelBuilder.Entity("Binner.Data.Model.UserLoginHistory", b => + { + b.HasOne("Binner.Data.Model.User", "User") + .WithMany("UserLoginHistory") + .HasForeignKey("UserId") + .OnDelete(DeleteBehavior.SetNull); + + b.Navigation("User"); + }); + + modelBuilder.Entity("Binner.Data.Model.UserPrinterConfiguration", b => + { + b.HasOne("Binner.Data.Model.User", "User") + .WithMany("UserPrinterConfigurations") + .HasForeignKey("UserId") + .OnDelete(DeleteBehavior.Restrict); + + b.Navigation("User"); + }); + + modelBuilder.Entity("Binner.Data.Model.UserPrinterTemplateConfiguration", b => + { + b.HasOne("Binner.Data.Model.User", "User") + .WithMany("UserPrinterTemplateConfigurations") + .HasForeignKey("UserId") + .OnDelete(DeleteBehavior.Restrict); + + b.HasOne("Binner.Data.Model.UserPrinterConfiguration", "UserPrinterConfiguration") + .WithMany("UserPrinterTemplateConfigurations") + .HasForeignKey("UserPrinterConfigurationId") + .OnDelete(DeleteBehavior.Restrict) + .IsRequired(); + + b.Navigation("User"); + + b.Navigation("UserPrinterConfiguration"); + }); + + modelBuilder.Entity("Binner.Data.Model.UserToken", b => + { + b.HasOne("Binner.Data.Model.User", "User") + .WithMany("UserTokens") + .HasForeignKey("UserId") + .OnDelete(DeleteBehavior.SetNull); + + b.Navigation("User"); + }); + + modelBuilder.Entity("Binner.Data.Model.CustomField", b => + { + b.Navigation("CustomFieldValues"); + }); + + modelBuilder.Entity("Binner.Data.Model.LabelTemplate", b => + { + b.Navigation("Labels"); + }); + + modelBuilder.Entity("Binner.Data.Model.OrderImportHistory", b => + { + b.Navigation("OrderImportHistoryLineItems"); + }); + + modelBuilder.Entity("Binner.Data.Model.Organization", b => + { + b.Navigation("OrganizationConfigurations"); + + b.Navigation("OrganizationIntegrationConfigurations"); + + b.Navigation("Users"); + }); + + modelBuilder.Entity("Binner.Data.Model.Part", b => + { + b.Navigation("PartModels"); + + b.Navigation("PartParametrics"); + + b.Navigation("PartScanHistories"); + + b.Navigation("PartSuppliers"); + + b.Navigation("ProjectPartAssignments"); + + b.Navigation("StoredFiles"); + }); + + modelBuilder.Entity("Binner.Data.Model.PartType", b => + { + b.Navigation("Parts"); + }); + + modelBuilder.Entity("Binner.Data.Model.Pcb", b => + { + b.Navigation("PcbStoredFileAssignments"); + + b.Navigation("ProjectPcbAssignments"); + + b.Navigation("ProjectPcbProduceHistory"); + }); + + modelBuilder.Entity("Binner.Data.Model.Project", b => + { + b.Navigation("Parts"); + + b.Navigation("ProjectPartAssignments"); + + b.Navigation("ProjectPcbAssignments"); + + b.Navigation("ProjectProduceHistory"); + }); + + modelBuilder.Entity("Binner.Data.Model.ProjectProduceHistory", b => + { + b.Navigation("ProjectPcbProduceHistory"); + }); + + modelBuilder.Entity("Binner.Data.Model.StoredFile", b => + { + b.Navigation("PcbStoredFileAssignments"); + }); + + modelBuilder.Entity("Binner.Data.Model.User", b => + { + b.Navigation("CustomFieldValues"); + + b.Navigation("CustomFields"); + + b.Navigation("OAuthCredentials"); + + b.Navigation("OAuthRequests"); + + b.Navigation("OrderImportHistory"); + + b.Navigation("OrderImportHistoryLineItems"); + + b.Navigation("OrganizationConfigurations"); + + b.Navigation("OrganizationIntegrationConfigurations"); + + b.Navigation("PartModels"); + + b.Navigation("PartParametrics"); + + b.Navigation("PartScanHistories"); + + b.Navigation("PartSuppliers"); + + b.Navigation("PartTypes"); + + b.Navigation("Parts"); + + b.Navigation("PcbStoredFileAssignments"); + + b.Navigation("Pcbs"); + + b.Navigation("ProjectPartAssignments"); + + b.Navigation("ProjectPcbAssignments"); + + b.Navigation("ProjectPcbProduceHistory"); + + b.Navigation("ProjectProduceHistory"); + + b.Navigation("Projects"); + + b.Navigation("StoredFiles"); + + b.Navigation("UserConfigurations"); + + b.Navigation("UserLoginHistory"); + + b.Navigation("UserPrinterConfigurations"); + + b.Navigation("UserPrinterTemplateConfigurations"); + + b.Navigation("UserTokens"); + }); + + modelBuilder.Entity("Binner.Data.Model.UserPrinterConfiguration", b => + { + b.Navigation("UserPrinterTemplateConfigurations"); + }); +#pragma warning restore 612, 618 + } + } +} diff --git a/Binner/Data/Binner.Data.Migrations.SqlServer/Migrations/20250824132852_automaticMetadataFetch.cs b/Binner/Data/Binner.Data.Migrations.SqlServer/Migrations/20250824132852_automaticMetadataFetch.cs new file mode 100644 index 00000000..3b5a29e5 --- /dev/null +++ b/Binner/Data/Binner.Data.Migrations.SqlServer/Migrations/20250824132852_automaticMetadataFetch.cs @@ -0,0 +1,31 @@ +using Microsoft.EntityFrameworkCore.Migrations; + +#nullable disable + +namespace Binner.Data.Migrations.SqlServer.Migrations +{ + /// + public partial class automaticMetadataFetch : Migration + { + /// + protected override void Up(MigrationBuilder migrationBuilder) + { + migrationBuilder.AddColumn( + name: "enableAutomaticMetadataFetchingForExistingParts", + schema: "dbo", + table: "OrganizationConfigurations", + type: "bit", + nullable: false, + defaultValue: true); + } + + /// + protected override void Down(MigrationBuilder migrationBuilder) + { + migrationBuilder.DropColumn( + name: "enableAutomaticMetadataFetchingForExistingParts", + schema: "dbo", + table: "OrganizationConfigurations"); + } + } +} diff --git a/Binner/Data/Binner.Data.Migrations.SqlServer/Migrations/BinnerContextModelSnapshot.cs b/Binner/Data/Binner.Data.Migrations.SqlServer/Migrations/BinnerContextModelSnapshot.cs index 42b646d7..d69bed25 100644 --- a/Binner/Data/Binner.Data.Migrations.SqlServer/Migrations/BinnerContextModelSnapshot.cs +++ b/Binner/Data/Binner.Data.Migrations.SqlServer/Migrations/BinnerContextModelSnapshot.cs @@ -547,6 +547,9 @@ protected override void BuildModel(ModelBuilder modelBuilder) b.Property("UserId") .HasColumnType("int"); + b.Property("enableAutomaticMetadataFetchingForExistingParts") + .HasColumnType("bit"); + b.HasKey("OrganizationConfigurationId"); b.HasIndex("OrganizationId"); diff --git a/Binner/Data/Binner.Data.Migrations.Sqlite/Migrations/20250824132841_automaticMetadataFetch.Designer.cs b/Binner/Data/Binner.Data.Migrations.Sqlite/Migrations/20250824132841_automaticMetadataFetch.Designer.cs new file mode 100644 index 00000000..8094f551 --- /dev/null +++ b/Binner/Data/Binner.Data.Migrations.Sqlite/Migrations/20250824132841_automaticMetadataFetch.Designer.cs @@ -0,0 +1,2539 @@ +// +using System; +using Binner.Data; +using Microsoft.EntityFrameworkCore; +using Microsoft.EntityFrameworkCore.Infrastructure; +using Microsoft.EntityFrameworkCore.Migrations; +using Microsoft.EntityFrameworkCore.Storage.ValueConversion; + +#nullable disable + +namespace Binner.Data.Migrations.Sqlite.Migrations +{ + [DbContext(typeof(BinnerContext))] + [Migration("20250824132841_automaticMetadataFetch")] + partial class automaticMetadataFetch + { + /// + protected override void BuildTargetModel(ModelBuilder modelBuilder) + { +#pragma warning disable 612, 618 + modelBuilder + .HasDefaultSchema("dbo") + .HasAnnotation("ProductVersion", "9.0.6"); + + modelBuilder.Entity("Binner.Data.Model.CustomField", b => + { + b.Property("CustomFieldId") + .ValueGeneratedOnAdd() + .HasColumnType("INTEGER"); + + b.Property("CustomFieldTypeId") + .HasColumnType("INTEGER"); + + b.Property("DateCreatedUtc") + .ValueGeneratedOnAdd() + .HasColumnType("TEXT") + .HasDefaultValueSql("getutcdate()"); + + b.Property("DateModifiedUtc") + .ValueGeneratedOnAdd() + .HasColumnType("TEXT") + .HasDefaultValueSql("getutcdate()"); + + b.Property("Description") + .HasColumnType("TEXT"); + + b.Property("Name") + .IsRequired() + .HasColumnType("TEXT"); + + b.Property("OrganizationId") + .HasColumnType("INTEGER"); + + b.Property("UserId") + .HasColumnType("INTEGER"); + + b.HasKey("CustomFieldId"); + + b.HasIndex("UserId"); + + b.ToTable("CustomFields", "dbo"); + }); + + modelBuilder.Entity("Binner.Data.Model.CustomFieldValue", b => + { + b.Property("CustomFieldValueId") + .ValueGeneratedOnAdd() + .HasColumnType("INTEGER"); + + b.Property("CustomFieldId") + .HasColumnType("INTEGER"); + + b.Property("CustomFieldTypeId") + .HasColumnType("INTEGER"); + + b.Property("DateCreatedUtc") + .ValueGeneratedOnAdd() + .HasColumnType("TEXT") + .HasDefaultValueSql("getutcdate()"); + + b.Property("DateModifiedUtc") + .ValueGeneratedOnAdd() + .HasColumnType("TEXT") + .HasDefaultValueSql("getutcdate()"); + + b.Property("OrganizationId") + .HasColumnType("INTEGER"); + + b.Property("RecordId") + .HasColumnType("INTEGER"); + + b.Property("UserId") + .HasColumnType("INTEGER"); + + b.Property("Value") + .HasColumnType("TEXT"); + + b.HasKey("CustomFieldValueId"); + + b.HasIndex("CustomFieldId"); + + b.HasIndex("UserId"); + + b.ToTable("CustomFieldValues", "dbo"); + }); + + modelBuilder.Entity("Binner.Data.Model.Label", b => + { + b.Property("LabelId") + .ValueGeneratedOnAdd() + .HasColumnType("INTEGER"); + + b.Property("DateCreatedUtc") + .ValueGeneratedOnAdd() + .HasColumnType("TEXT") + .HasDefaultValueSql("getutcdate()"); + + b.Property("DateModifiedUtc") + .ValueGeneratedOnAdd() + .HasColumnType("TEXT") + .HasDefaultValueSql("getutcdate()"); + + b.Property("IsPartLabelTemplate") + .HasColumnType("INTEGER"); + + b.Property("LabelTemplateId") + .HasColumnType("INTEGER"); + + b.Property("Name") + .IsRequired() + .HasColumnType("TEXT"); + + b.Property("OrganizationId") + .HasColumnType("INTEGER"); + + b.Property("Template") + .IsRequired() + .HasColumnType("TEXT"); + + b.Property("UserId") + .HasColumnType("INTEGER"); + + b.HasKey("LabelId"); + + b.HasIndex("LabelTemplateId"); + + b.ToTable("Labels", "dbo"); + }); + + modelBuilder.Entity("Binner.Data.Model.LabelTemplate", b => + { + b.Property("LabelTemplateId") + .ValueGeneratedOnAdd() + .HasColumnType("INTEGER"); + + b.Property("DateCreatedUtc") + .ValueGeneratedOnAdd() + .HasColumnType("TEXT") + .HasDefaultValueSql("getutcdate()"); + + b.Property("DateModifiedUtc") + .ValueGeneratedOnAdd() + .HasColumnType("TEXT") + .HasDefaultValueSql("getutcdate()"); + + b.Property("Description") + .HasColumnType("TEXT"); + + b.Property("Dpi") + .HasColumnType("INTEGER"); + + b.Property("DriverHeight") + .HasColumnType("INTEGER"); + + b.Property("DriverName") + .HasColumnType("TEXT"); + + b.Property("DriverWidth") + .HasColumnType("INTEGER"); + + b.Property("ExtraData") + .HasColumnType("TEXT"); + + b.Property("Height") + .IsRequired() + .HasColumnType("TEXT"); + + b.Property("LabelCount") + .HasColumnType("INTEGER"); + + b.Property("LabelPaperSource") + .HasColumnType("INTEGER"); + + b.Property("Margin") + .IsRequired() + .HasColumnType("TEXT"); + + b.Property("Name") + .IsRequired() + .HasColumnType("TEXT"); + + b.Property("OrganizationId") + .HasColumnType("INTEGER"); + + b.Property("UserId") + .HasColumnType("INTEGER"); + + b.Property("Width") + .IsRequired() + .HasColumnType("TEXT"); + + b.HasKey("LabelTemplateId"); + + b.ToTable("LabelTemplates", "dbo"); + }); + + modelBuilder.Entity("Binner.Data.Model.MessageState", b => + { + b.Property("MessageStateId") + .ValueGeneratedOnAdd() + .HasColumnType("INTEGER"); + + b.Property("DateCreatedUtc") + .HasColumnType("TEXT"); + + b.Property("MessageId") + .HasColumnType("TEXT"); + + b.Property("OrganizationId") + .HasColumnType("INTEGER"); + + b.Property("ReadDateUtc") + .HasColumnType("TEXT"); + + b.Property("UserId") + .HasColumnType("INTEGER"); + + b.HasKey("MessageStateId"); + + b.ToTable("MessageStates", "dbo"); + }); + + modelBuilder.Entity("Binner.Data.Model.OAuthCredential", b => + { + b.Property("OAuthCredentialId") + .ValueGeneratedOnAdd() + .HasColumnType("INTEGER"); + + b.Property("AccessToken") + .HasColumnType("TEXT"); + + b.Property("ApiSettings") + .HasColumnType("TEXT"); + + b.Property("DateCreatedUtc") + .ValueGeneratedOnAdd() + .HasColumnType("TEXT") + .HasDefaultValueSql("getutcdate()"); + + b.Property("DateExpiresUtc") + .HasColumnType("TEXT"); + + b.Property("DateModifiedUtc") + .ValueGeneratedOnAdd() + .HasColumnType("TEXT") + .HasDefaultValueSql("getutcdate()"); + + b.Property("Ip") + .ValueGeneratedOnAdd() + .HasColumnType("INTEGER") + .HasDefaultValue(0L); + + b.Property("OrganizationId") + .HasColumnType("INTEGER"); + + b.Property("Provider") + .IsRequired() + .HasMaxLength(128) + .HasColumnType("TEXT"); + + b.Property("RefreshToken") + .HasColumnType("TEXT"); + + b.Property("UserId") + .HasColumnType("INTEGER"); + + b.HasKey("OAuthCredentialId"); + + b.HasIndex("UserId"); + + b.HasIndex("Provider", "UserId", "OrganizationId"); + + b.ToTable("OAuthCredentials", "dbo"); + }); + + modelBuilder.Entity("Binner.Data.Model.OAuthRequest", b => + { + b.Property("OAuthRequestId") + .ValueGeneratedOnAdd() + .HasColumnType("INTEGER"); + + b.Property("AuthorizationCode") + .HasColumnType("TEXT"); + + b.Property("AuthorizationReceived") + .HasColumnType("INTEGER") + .HasDefaultValue(false); + + b.Property("DateCreatedUtc") + .ValueGeneratedOnAdd() + .HasColumnType("TEXT") + .HasDefaultValueSql("getutcdate()"); + + b.Property("DateModifiedUtc") + .ValueGeneratedOnAdd() + .HasColumnType("TEXT") + .HasDefaultValueSql("getutcdate()"); + + b.Property("Error") + .HasColumnType("TEXT"); + + b.Property("ErrorDescription") + .HasColumnType("TEXT"); + + b.Property("Ip") + .ValueGeneratedOnAdd() + .HasColumnType("INTEGER") + .HasDefaultValue(0L); + + b.Property("OrganizationId") + .HasColumnType("INTEGER"); + + b.Property("Provider") + .IsRequired() + .HasColumnType("TEXT"); + + b.Property("RequestId") + .HasColumnType("TEXT"); + + b.Property("ReturnToUrl") + .HasColumnType("TEXT"); + + b.Property("UserId") + .HasColumnType("INTEGER"); + + b.HasKey("OAuthRequestId"); + + b.HasIndex("UserId"); + + b.ToTable("OAuthRequests", "dbo"); + }); + + modelBuilder.Entity("Binner.Data.Model.OrderImportHistory", b => + { + b.Property("OrderImportHistoryId") + .ValueGeneratedOnAdd() + .HasColumnType("INTEGER"); + + b.Property("DateCreatedUtc") + .ValueGeneratedOnAdd() + .HasColumnType("TEXT") + .HasDefaultValueSql("getutcdate()"); + + b.Property("DateModifiedUtc") + .ValueGeneratedOnAdd() + .HasColumnType("TEXT") + .HasDefaultValueSql("getutcdate()"); + + b.Property("Invoice") + .HasColumnType("TEXT"); + + b.Property("OrganizationId") + .HasColumnType("INTEGER"); + + b.Property("Packlist") + .HasColumnType("TEXT"); + + b.Property("SalesOrder") + .IsRequired() + .HasColumnType("TEXT"); + + b.Property("Supplier") + .IsRequired() + .HasColumnType("TEXT"); + + b.Property("UserId") + .HasColumnType("INTEGER"); + + b.HasKey("OrderImportHistoryId"); + + b.HasIndex("UserId"); + + b.ToTable("OrderImportHistories", "dbo"); + }); + + modelBuilder.Entity("Binner.Data.Model.OrderImportHistoryLineItem", b => + { + b.Property("OrderImportHistoryLineItemId") + .ValueGeneratedOnAdd() + .HasColumnType("INTEGER"); + + b.Property("Cost") + .HasColumnType("REAL"); + + b.Property("CustomerReference") + .HasColumnType("TEXT"); + + b.Property("DateCreatedUtc") + .ValueGeneratedOnAdd() + .HasColumnType("TEXT") + .HasDefaultValueSql("getutcdate()"); + + b.Property("DateModifiedUtc") + .ValueGeneratedOnAdd() + .HasColumnType("TEXT") + .HasDefaultValueSql("getutcdate()"); + + b.Property("Description") + .HasColumnType("TEXT"); + + b.Property("Manufacturer") + .HasColumnType("TEXT"); + + b.Property("ManufacturerPartNumber") + .HasColumnType("TEXT"); + + b.Property("OrderImportHistoryId") + .HasColumnType("INTEGER"); + + b.Property("OrganizationId") + .HasColumnType("INTEGER"); + + b.Property("PartId") + .HasColumnType("INTEGER"); + + b.Property("PartNumber") + .HasColumnType("TEXT"); + + b.Property("Quantity") + .HasColumnType("INTEGER"); + + b.Property("Supplier") + .HasColumnType("TEXT"); + + b.Property("UserId") + .HasColumnType("INTEGER"); + + b.HasKey("OrderImportHistoryLineItemId"); + + b.HasIndex("OrderImportHistoryId"); + + b.HasIndex("UserId"); + + b.ToTable("OrderImportHistoryLineItems", "dbo"); + }); + + modelBuilder.Entity("Binner.Data.Model.Organization", b => + { + b.Property("OrganizationId") + .ValueGeneratedOnAdd() + .HasColumnType("INTEGER"); + + b.Property("DateCreatedUtc") + .ValueGeneratedOnAdd() + .HasColumnType("TEXT") + .HasDefaultValueSql("getutcdate()"); + + b.Property("DateLockedUtc") + .HasColumnType("TEXT"); + + b.Property("DateModifiedUtc") + .ValueGeneratedOnAdd() + .HasColumnType("TEXT") + .HasDefaultValueSql("getutcdate()"); + + b.Property("Description") + .HasColumnType("TEXT"); + + b.Property("Name") + .HasColumnType("TEXT"); + + b.HasKey("OrganizationId"); + + b.ToTable("Organizations", "dbo"); + }); + + modelBuilder.Entity("Binner.Data.Model.OrganizationConfiguration", b => + { + b.Property("OrganizationConfigurationId") + .ValueGeneratedOnAdd() + .HasColumnType("INTEGER"); + + b.Property("CacheAbsoluteExpirationMinutes") + .HasColumnType("INTEGER"); + + b.Property("CacheSlidingExpirationMinutes") + .HasColumnType("INTEGER"); + + b.Property("DateCreatedUtc") + .ValueGeneratedOnAdd() + .HasColumnType("TEXT") + .HasDefaultValueSql("getutcdate()"); + + b.Property("DateModifiedUtc") + .ValueGeneratedOnAdd() + .HasColumnType("TEXT") + .HasDefaultValueSql("getutcdate()"); + + b.Property("KiCadSettingsJson") + .HasColumnType("TEXT"); + + b.Property("LicenseKey") + .HasColumnType("TEXT"); + + b.Property("MaxCacheItems") + .HasColumnType("INTEGER"); + + b.Property("OrganizationId") + .HasColumnType("INTEGER"); + + b.Property("UseModule") + .HasColumnType("INTEGER"); + + b.Property("UserId") + .HasColumnType("INTEGER"); + + b.Property("enableAutomaticMetadataFetchingForExistingParts") + .HasColumnType("INTEGER"); + + b.HasKey("OrganizationConfigurationId"); + + b.HasIndex("OrganizationId"); + + b.HasIndex("UserId"); + + b.ToTable("OrganizationConfigurations", "dbo"); + }); + + modelBuilder.Entity("Binner.Data.Model.OrganizationIntegrationConfiguration", b => + { + b.Property("OrganizationIntegrationConfigurationId") + .ValueGeneratedOnAdd() + .HasColumnType("INTEGER"); + + b.Property("ArrowApiKey") + .HasColumnType("TEXT"); + + b.Property("ArrowApiUrl") + .IsRequired() + .HasColumnType("TEXT"); + + b.Property("ArrowEnabled") + .HasColumnType("INTEGER"); + + b.Property("ArrowUsername") + .HasColumnType("TEXT"); + + b.Property("DateCreatedUtc") + .ValueGeneratedOnAdd() + .HasColumnType("TEXT") + .HasDefaultValueSql("getutcdate()"); + + b.Property("DateModifiedUtc") + .ValueGeneratedOnAdd() + .HasColumnType("TEXT") + .HasDefaultValueSql("getutcdate()"); + + b.Property("DigiKeyApiUrl") + .HasColumnType("TEXT"); + + b.Property("DigiKeyClientId") + .HasColumnType("TEXT"); + + b.Property("DigiKeyClientSecret") + .HasColumnType("TEXT"); + + b.Property("DigiKeyEnabled") + .HasColumnType("INTEGER"); + + b.Property("DigiKeyOAuthPostbackUrl") + .HasColumnType("TEXT"); + + b.Property("DigiKeySite") + .HasColumnType("INTEGER"); + + b.Property("MouserApiUrl") + .HasColumnType("TEXT"); + + b.Property("MouserCartApiKey") + .HasColumnType("TEXT"); + + b.Property("MouserEnabled") + .HasColumnType("INTEGER"); + + b.Property("MouserOrderApiKey") + .HasColumnType("TEXT"); + + b.Property("MouserSearchApiKey") + .HasColumnType("TEXT"); + + b.Property("NexarClientId") + .HasColumnType("TEXT"); + + b.Property("NexarClientSecret") + .HasColumnType("TEXT"); + + b.Property("NexarEnabled") + .HasColumnType("INTEGER"); + + b.Property("OrganizationId") + .HasColumnType("INTEGER"); + + b.Property("SwarmApiKey") + .HasColumnType("TEXT"); + + b.Property("SwarmApiUrl") + .HasColumnType("TEXT"); + + b.Property("SwarmEnabled") + .HasColumnType("INTEGER"); + + b.Property("SwarmTimeout") + .HasColumnType("TEXT"); + + b.Property("TmeApiKey") + .HasColumnType("TEXT"); + + b.Property("TmeApiUrl") + .IsRequired() + .HasColumnType("TEXT"); + + b.Property("TmeApplicationSecret") + .HasColumnType("TEXT"); + + b.Property("TmeCountry") + .HasColumnType("TEXT"); + + b.Property("TmeEnabled") + .HasColumnType("INTEGER"); + + b.Property("TmeResolveExternalLinks") + .HasColumnType("INTEGER"); + + b.Property("UserId") + .HasColumnType("INTEGER"); + + b.HasKey("OrganizationIntegrationConfigurationId"); + + b.HasIndex("OrganizationId"); + + b.HasIndex("UserId"); + + b.ToTable("OrganizationIntegrationConfigurations", "dbo"); + }); + + modelBuilder.Entity("Binner.Data.Model.Part", b => + { + b.Property("PartId") + .ValueGeneratedOnAdd() + .HasColumnType("INTEGER"); + + b.Property("ArrowPartNumber") + .HasColumnType("TEXT"); + + b.Property("BaseProductNumber") + .HasColumnType("TEXT"); + + b.Property("BinNumber") + .HasColumnType("TEXT"); + + b.Property("BinNumber2") + .HasColumnType("TEXT"); + + b.Property("Cost") + .HasColumnType("decimal(18,4)"); + + b.Property("Currency") + .HasColumnType("TEXT"); + + b.Property("DataSource") + .HasColumnType("INTEGER"); + + b.Property("DataSourceId") + .HasColumnType("TEXT"); + + b.Property("DatasheetUrl") + .HasColumnType("TEXT"); + + b.Property("DateCreatedUtc") + .ValueGeneratedOnAdd() + .HasColumnType("TEXT") + .HasDefaultValueSql("getutcdate()"); + + b.Property("DateModifiedUtc") + .ValueGeneratedOnAdd() + .HasColumnType("TEXT") + .HasDefaultValueSql("getutcdate()"); + + b.Property("Description") + .HasColumnType("TEXT"); + + b.Property("DigiKeyPartNumber") + .HasColumnType("TEXT"); + + b.Property("ExportControlClassNumber") + .HasColumnType("TEXT"); + + b.Property("ExtensionValue1") + .HasColumnType("TEXT"); + + b.Property("ExtensionValue2") + .HasColumnType("TEXT"); + + b.Property("FootprintName") + .HasColumnType("TEXT"); + + b.Property("HtsusCode") + .HasColumnType("TEXT"); + + b.Property("ImageUrl") + .HasColumnType("TEXT"); + + b.Property("Keywords") + .HasColumnType("TEXT"); + + b.Property("LastSwarmSyncUtc") + .HasColumnType("TEXT"); + + b.Property("LeadTime") + .HasColumnType("TEXT"); + + b.Property("Location") + .HasColumnType("TEXT"); + + b.Property("LowStockThreshold") + .HasColumnType("INTEGER"); + + b.Property("LowestCostSupplier") + .HasColumnType("TEXT"); + + b.Property("LowestCostSupplierUrl") + .HasColumnType("TEXT"); + + b.Property("Manufacturer") + .HasColumnType("TEXT"); + + b.Property("ManufacturerPartNumber") + .HasColumnType("TEXT"); + + b.Property("MetadataLastUpdatedUtc") + .HasColumnType("TEXT"); + + b.Property("MoistureSensitivityLevel") + .HasColumnType("TEXT"); + + b.Property("MountingTypeId") + .HasColumnType("INTEGER"); + + b.Property("MouserPartNumber") + .HasColumnType("TEXT"); + + b.Property("OrganizationId") + .HasColumnType("INTEGER"); + + b.Property("OtherNames") + .HasColumnType("TEXT"); + + b.Property("PackageType") + .HasColumnType("TEXT"); + + b.Property("PartNumber") + .HasMaxLength(64) + .HasColumnType("TEXT"); + + b.Property("PartTypeId") + .HasColumnType("INTEGER"); + + b.Property("ProductStatus") + .HasColumnType("TEXT"); + + b.Property("ProductUrl") + .HasColumnType("TEXT"); + + b.Property("ProjectId") + .HasColumnType("INTEGER"); + + b.Property("Quantity") + .HasColumnType("INTEGER"); + + b.Property("ReachStatus") + .HasColumnType("TEXT"); + + b.Property("RohsStatus") + .HasColumnType("TEXT"); + + b.Property("Series") + .HasColumnType("TEXT"); + + b.Property("ShortId") + .HasColumnType("TEXT"); + + b.Property("SwarmPartNumberManufacturerId") + .HasColumnType("INTEGER"); + + b.Property("SymbolName") + .HasColumnType("TEXT"); + + b.Property("TmePartNumber") + .HasColumnType("TEXT"); + + b.Property("UserId") + .HasColumnType("INTEGER"); + + b.Property("Value") + .HasColumnType("TEXT"); + + b.HasKey("PartId"); + + b.HasIndex("ProjectId"); + + b.HasIndex("UserId"); + + b.HasIndex("BinNumber", "UserId"); + + b.HasIndex("BinNumber2", "UserId"); + + b.HasIndex("Description", "UserId"); + + b.HasIndex("DigiKeyPartNumber", "UserId"); + + b.HasIndex("Keywords", "UserId"); + + b.HasIndex("Location", "UserId"); + + b.HasIndex("Manufacturer", "UserId"); + + b.HasIndex("ManufacturerPartNumber", "UserId"); + + b.HasIndex("MouserPartNumber", "UserId"); + + b.HasIndex("PartNumber", "UserId"); + + b.HasIndex("PartTypeId", "UserId"); + + b.ToTable("Parts", "dbo"); + }); + + modelBuilder.Entity("Binner.Data.Model.PartModel", b => + { + b.Property("PartModelId") + .ValueGeneratedOnAdd() + .HasColumnType("INTEGER"); + + b.Property("DateCreatedUtc") + .ValueGeneratedOnAdd() + .HasColumnType("TEXT") + .HasDefaultValueSql("getutcdate()"); + + b.Property("DateModifiedUtc") + .ValueGeneratedOnAdd() + .HasColumnType("TEXT") + .HasDefaultValueSql("getutcdate()"); + + b.Property("Filename") + .HasColumnType("TEXT"); + + b.Property("ModelType") + .HasColumnType("INTEGER"); + + b.Property("Name") + .IsRequired() + .HasColumnType("TEXT"); + + b.Property("OrganizationId") + .HasColumnType("INTEGER"); + + b.Property("PartId") + .HasColumnType("INTEGER"); + + b.Property("Source") + .HasColumnType("INTEGER"); + + b.Property("Url") + .HasColumnType("TEXT"); + + b.Property("UserId") + .HasColumnType("INTEGER"); + + b.HasKey("PartModelId"); + + b.HasIndex("UserId"); + + b.HasIndex("PartId", "OrganizationId"); + + b.ToTable("PartModels", "dbo"); + }); + + modelBuilder.Entity("Binner.Data.Model.PartParametric", b => + { + b.Property("PartParametricId") + .ValueGeneratedOnAdd() + .HasColumnType("INTEGER"); + + b.Property("DateCreatedUtc") + .ValueGeneratedOnAdd() + .HasColumnType("TEXT") + .HasDefaultValueSql("getutcdate()"); + + b.Property("DateModifiedUtc") + .ValueGeneratedOnAdd() + .HasColumnType("TEXT") + .HasDefaultValueSql("getutcdate()"); + + b.Property("DigiKeyParameterId") + .HasColumnType("INTEGER"); + + b.Property("DigiKeyParameterText") + .HasColumnType("TEXT"); + + b.Property("DigiKeyParameterType") + .HasColumnType("TEXT"); + + b.Property("DigiKeyValueId") + .HasColumnType("TEXT"); + + b.Property("DigiKeyValueText") + .HasColumnType("TEXT"); + + b.Property("Name") + .IsRequired() + .HasColumnType("TEXT"); + + b.Property("OrganizationId") + .HasColumnType("INTEGER"); + + b.Property("PartId") + .HasColumnType("INTEGER"); + + b.Property("Units") + .HasColumnType("INTEGER"); + + b.Property("UserId") + .HasColumnType("INTEGER"); + + b.Property("Value") + .IsRequired() + .HasColumnType("TEXT"); + + b.Property("ValueNumber") + .HasColumnType("decimal(18,4)"); + + b.HasKey("PartParametricId"); + + b.HasIndex("UserId"); + + b.HasIndex("PartId", "OrganizationId"); + + b.ToTable("PartParametrics", "dbo"); + }); + + modelBuilder.Entity("Binner.Data.Model.PartScanHistory", b => + { + b.Property("PartScanHistoryId") + .ValueGeneratedOnAdd() + .HasColumnType("INTEGER"); + + b.Property("BarcodeType") + .HasColumnType("INTEGER"); + + b.Property("CountryOfOrigin") + .HasColumnType("TEXT"); + + b.Property("Crc") + .HasColumnType("INTEGER"); + + b.Property("DateCreatedUtc") + .ValueGeneratedOnAdd() + .HasColumnType("TEXT") + .HasDefaultValueSql("getutcdate()"); + + b.Property("DateModifiedUtc") + .ValueGeneratedOnAdd() + .HasColumnType("TEXT") + .HasDefaultValueSql("getutcdate()"); + + b.Property("Description") + .HasColumnType("TEXT"); + + b.Property("Invoice") + .HasColumnType("TEXT"); + + b.Property("LotCode") + .HasColumnType("TEXT"); + + b.Property("ManufacturerPartNumber") + .HasColumnType("TEXT"); + + b.Property("Mid") + .HasColumnType("TEXT"); + + b.Property("OrganizationId") + .HasColumnType("INTEGER"); + + b.Property("Packlist") + .HasColumnType("TEXT"); + + b.Property("PartId") + .HasColumnType("INTEGER"); + + b.Property("Quantity") + .HasColumnType("INTEGER"); + + b.Property("RawScan") + .IsRequired() + .HasColumnType("TEXT"); + + b.Property("SalesOrder") + .HasColumnType("TEXT"); + + b.Property("ScannedLabelType") + .HasColumnType("INTEGER"); + + b.Property("Supplier") + .HasColumnType("INTEGER"); + + b.Property("SupplierPartNumber") + .HasColumnType("TEXT"); + + b.Property("UserId") + .HasColumnType("INTEGER"); + + b.HasKey("PartScanHistoryId"); + + b.HasIndex("PartId"); + + b.HasIndex("UserId"); + + b.ToTable("PartScanHistories", "dbo"); + }); + + modelBuilder.Entity("Binner.Data.Model.PartSupplier", b => + { + b.Property("PartSupplierId") + .ValueGeneratedOnAdd() + .HasColumnType("INTEGER"); + + b.Property("Cost") + .HasColumnType("decimal(18,4)"); + + b.Property("DateCreatedUtc") + .ValueGeneratedOnAdd() + .HasColumnType("TEXT") + .HasDefaultValueSql("getutcdate()"); + + b.Property("DateModifiedUtc") + .ValueGeneratedOnAdd() + .HasColumnType("TEXT") + .HasDefaultValueSql("getutcdate()"); + + b.Property("ImageUrl") + .HasColumnType("TEXT"); + + b.Property("MinimumOrderQuantity") + .HasColumnType("INTEGER"); + + b.Property("Name") + .HasColumnType("TEXT"); + + b.Property("OrganizationId") + .HasColumnType("INTEGER"); + + b.Property("PartId") + .HasColumnType("INTEGER"); + + b.Property("ProductUrl") + .HasColumnType("TEXT"); + + b.Property("QuantityAvailable") + .HasColumnType("INTEGER"); + + b.Property("SupplierPartNumber") + .HasColumnType("TEXT"); + + b.Property("UserId") + .HasColumnType("INTEGER"); + + b.HasKey("PartSupplierId"); + + b.HasIndex("PartId"); + + b.HasIndex("UserId"); + + b.ToTable("PartSuppliers", "dbo"); + }); + + modelBuilder.Entity("Binner.Data.Model.PartType", b => + { + b.Property("PartTypeId") + .ValueGeneratedOnAdd() + .HasColumnType("INTEGER"); + + b.Property("DateCreatedUtc") + .ValueGeneratedOnAdd() + .HasColumnType("TEXT") + .HasDefaultValueSql("getutcdate()"); + + b.Property("DateModifiedUtc") + .ValueGeneratedOnAdd() + .HasColumnType("TEXT") + .HasDefaultValueSql("getutcdate()"); + + b.Property("Description") + .HasColumnType("TEXT"); + + b.Property("Icon") + .HasColumnType("TEXT"); + + b.Property("Keywords") + .HasColumnType("TEXT"); + + b.Property("Name") + .HasColumnType("TEXT"); + + b.Property("OrganizationId") + .HasColumnType("INTEGER"); + + b.Property("ParentPartTypeId") + .HasColumnType("INTEGER"); + + b.Property("ReferenceDesignator") + .HasColumnType("TEXT"); + + b.Property("SymbolId") + .HasColumnType("TEXT"); + + b.Property("UserId") + .HasColumnType("INTEGER"); + + b.HasKey("PartTypeId"); + + b.HasIndex("ParentPartTypeId"); + + b.HasIndex("UserId"); + + b.HasIndex("Name", "UserId"); + + b.ToTable("PartTypes", "dbo"); + }); + + modelBuilder.Entity("Binner.Data.Model.Pcb", b => + { + b.Property("PcbId") + .ValueGeneratedOnAdd() + .HasColumnType("INTEGER"); + + b.Property("Cost") + .HasColumnType("REAL"); + + b.Property("DateCreatedUtc") + .ValueGeneratedOnAdd() + .HasColumnType("TEXT") + .HasDefaultValueSql("getutcdate()"); + + b.Property("DateModifiedUtc") + .ValueGeneratedOnAdd() + .HasColumnType("TEXT") + .HasDefaultValueSql("getutcdate()"); + + b.Property("Description") + .HasColumnType("TEXT"); + + b.Property("LastSerialNumber") + .HasColumnType("TEXT"); + + b.Property("Name") + .HasColumnType("TEXT"); + + b.Property("OrganizationId") + .HasColumnType("INTEGER"); + + b.Property("Quantity") + .HasColumnType("INTEGER"); + + b.Property("SerialNumberFormat") + .HasColumnType("TEXT"); + + b.Property("UserId") + .HasColumnType("INTEGER"); + + b.HasKey("PcbId"); + + b.HasIndex("UserId"); + + b.ToTable("Pcbs", "dbo"); + }); + + modelBuilder.Entity("Binner.Data.Model.PcbStoredFileAssignment", b => + { + b.Property("PcbStoredFileAssignmentId") + .ValueGeneratedOnAdd() + .HasColumnType("INTEGER"); + + b.Property("DateCreatedUtc") + .ValueGeneratedOnAdd() + .HasColumnType("TEXT") + .HasDefaultValueSql("getutcdate()"); + + b.Property("DateModifiedUtc") + .ValueGeneratedOnAdd() + .HasColumnType("TEXT") + .HasDefaultValueSql("getutcdate()"); + + b.Property("Name") + .HasColumnType("TEXT"); + + b.Property("Notes") + .HasColumnType("TEXT"); + + b.Property("OrganizationId") + .HasColumnType("INTEGER"); + + b.Property("PcbId") + .HasColumnType("INTEGER"); + + b.Property("StoredFileId") + .HasColumnType("INTEGER"); + + b.Property("UserId") + .HasColumnType("INTEGER"); + + b.HasKey("PcbStoredFileAssignmentId"); + + b.HasIndex("PcbId"); + + b.HasIndex("StoredFileId"); + + b.HasIndex("UserId"); + + b.ToTable("PcbStoredFileAssignments", "dbo"); + }); + + modelBuilder.Entity("Binner.Data.Model.Project", b => + { + b.Property("ProjectId") + .ValueGeneratedOnAdd() + .HasColumnType("INTEGER"); + + b.Property("Color") + .HasColumnType("INTEGER"); + + b.Property("DateCreatedUtc") + .ValueGeneratedOnAdd() + .HasColumnType("TEXT") + .HasDefaultValueSql("getutcdate()"); + + b.Property("DateModifiedUtc") + .ValueGeneratedOnAdd() + .HasColumnType("TEXT") + .HasDefaultValueSql("getutcdate()"); + + b.Property("Description") + .HasColumnType("TEXT"); + + b.Property("Location") + .HasColumnType("TEXT"); + + b.Property("Name") + .HasColumnType("TEXT"); + + b.Property("Notes") + .HasColumnType("TEXT"); + + b.Property("OrganizationId") + .HasColumnType("INTEGER"); + + b.Property("UserId") + .HasColumnType("INTEGER"); + + b.HasKey("ProjectId"); + + b.HasIndex("UserId"); + + b.HasIndex("Name", "UserId"); + + b.ToTable("Projects", "dbo"); + }); + + modelBuilder.Entity("Binner.Data.Model.ProjectPartAssignment", b => + { + b.Property("ProjectPartAssignmentId") + .ValueGeneratedOnAdd() + .HasColumnType("INTEGER"); + + b.Property("Cost") + .HasColumnType("REAL"); + + b.Property("Currency") + .HasColumnType("TEXT"); + + b.Property("CustomDescription") + .HasColumnType("TEXT"); + + b.Property("DateCreatedUtc") + .ValueGeneratedOnAdd() + .HasColumnType("TEXT") + .HasDefaultValueSql("getutcdate()"); + + b.Property("DateModifiedUtc") + .ValueGeneratedOnAdd() + .HasColumnType("TEXT") + .HasDefaultValueSql("getutcdate()"); + + b.Property("FootprintName") + .HasColumnType("TEXT"); + + b.Property("Notes") + .HasColumnType("TEXT"); + + b.Property("OrganizationId") + .HasColumnType("INTEGER"); + + b.Property("PartId") + .HasColumnType("INTEGER"); + + b.Property("PartName") + .HasColumnType("TEXT"); + + b.Property("PcbId") + .HasColumnType("INTEGER"); + + b.Property("ProjectId") + .HasColumnType("INTEGER"); + + b.Property("Quantity") + .HasColumnType("INTEGER"); + + b.Property("QuantityAvailable") + .HasColumnType("INTEGER"); + + b.Property("ReferenceId") + .HasColumnType("TEXT"); + + b.Property("SchematicReferenceId") + .HasColumnType("TEXT"); + + b.Property("SymbolName") + .HasColumnType("TEXT"); + + b.Property("UserId") + .HasColumnType("INTEGER"); + + b.HasKey("ProjectPartAssignmentId"); + + b.HasIndex("PartId"); + + b.HasIndex("ProjectId"); + + b.HasIndex("UserId"); + + b.ToTable("ProjectPartAssignments", "dbo"); + }); + + modelBuilder.Entity("Binner.Data.Model.ProjectPcbAssignment", b => + { + b.Property("ProjectPcbAssignmentId") + .ValueGeneratedOnAdd() + .HasColumnType("INTEGER"); + + b.Property("DateCreatedUtc") + .ValueGeneratedOnAdd() + .HasColumnType("TEXT") + .HasDefaultValueSql("getutcdate()"); + + b.Property("DateModifiedUtc") + .ValueGeneratedOnAdd() + .HasColumnType("TEXT") + .HasDefaultValueSql("getutcdate()"); + + b.Property("OrganizationId") + .HasColumnType("INTEGER"); + + b.Property("PcbId") + .HasColumnType("INTEGER"); + + b.Property("ProjectId") + .HasColumnType("INTEGER"); + + b.Property("UserId") + .HasColumnType("INTEGER"); + + b.HasKey("ProjectPcbAssignmentId"); + + b.HasIndex("PcbId"); + + b.HasIndex("ProjectId"); + + b.HasIndex("UserId"); + + b.ToTable("ProjectPcbAssignments", "dbo"); + }); + + modelBuilder.Entity("Binner.Data.Model.ProjectPcbProduceHistory", b => + { + b.Property("ProjectPcbProduceHistoryId") + .ValueGeneratedOnAdd() + .HasColumnType("INTEGER"); + + b.Property("DateCreatedUtc") + .ValueGeneratedOnAdd() + .HasColumnType("TEXT") + .HasDefaultValueSql("getutcdate()"); + + b.Property("DateModifiedUtc") + .ValueGeneratedOnAdd() + .HasColumnType("TEXT") + .HasDefaultValueSql("getutcdate()"); + + b.Property("OrganizationId") + .HasColumnType("INTEGER"); + + b.Property("PartsConsumed") + .HasColumnType("INTEGER"); + + b.Property("PcbCost") + .HasColumnType("REAL"); + + b.Property("PcbId") + .HasColumnType("INTEGER"); + + b.Property("PcbQuantity") + .HasColumnType("INTEGER"); + + b.Property("ProjectProduceHistoryId") + .HasColumnType("INTEGER"); + + b.Property("SerialNumber") + .HasColumnType("TEXT"); + + b.Property("UserId") + .HasColumnType("INTEGER"); + + b.HasKey("ProjectPcbProduceHistoryId"); + + b.HasIndex("PcbId"); + + b.HasIndex("ProjectProduceHistoryId"); + + b.HasIndex("UserId"); + + b.ToTable("ProjectPcbProduceHistory", "dbo"); + }); + + modelBuilder.Entity("Binner.Data.Model.ProjectProduceHistory", b => + { + b.Property("ProjectProduceHistoryId") + .ValueGeneratedOnAdd() + .HasColumnType("INTEGER"); + + b.Property("DateCreatedUtc") + .ValueGeneratedOnAdd() + .HasColumnType("TEXT") + .HasDefaultValueSql("getutcdate()"); + + b.Property("DateModifiedUtc") + .ValueGeneratedOnAdd() + .HasColumnType("TEXT") + .HasDefaultValueSql("getutcdate()"); + + b.Property("OrganizationId") + .HasColumnType("INTEGER"); + + b.Property("PartsConsumed") + .HasColumnType("INTEGER"); + + b.Property("ProduceUnassociated") + .HasColumnType("INTEGER"); + + b.Property("ProjectId") + .HasColumnType("INTEGER"); + + b.Property("Quantity") + .HasColumnType("INTEGER"); + + b.Property("UserId") + .HasColumnType("INTEGER"); + + b.HasKey("ProjectProduceHistoryId"); + + b.HasIndex("ProjectId"); + + b.HasIndex("UserId"); + + b.ToTable("ProjectProduceHistory", "dbo"); + }); + + modelBuilder.Entity("Binner.Data.Model.StoredFile", b => + { + b.Property("StoredFileId") + .ValueGeneratedOnAdd() + .HasColumnType("INTEGER"); + + b.Property("Crc32") + .HasColumnType("INTEGER"); + + b.Property("DateCreatedUtc") + .ValueGeneratedOnAdd() + .HasColumnType("TEXT") + .HasDefaultValueSql("getutcdate()"); + + b.Property("DateModifiedUtc") + .ValueGeneratedOnAdd() + .HasColumnType("TEXT") + .HasDefaultValueSql("getutcdate()"); + + b.Property("FileLength") + .HasColumnType("INTEGER"); + + b.Property("FileName") + .IsRequired() + .HasColumnType("TEXT"); + + b.Property("OrganizationId") + .HasColumnType("INTEGER"); + + b.Property("OriginalFileName") + .IsRequired() + .HasColumnType("TEXT"); + + b.Property("PartId") + .HasColumnType("INTEGER"); + + b.Property("RecordId") + .HasColumnType("INTEGER"); + + b.Property("RecordType") + .HasColumnType("INTEGER"); + + b.Property("StoredFileType") + .HasColumnType("INTEGER"); + + b.Property("UserId") + .HasColumnType("INTEGER"); + + b.HasKey("StoredFileId"); + + b.HasIndex("PartId"); + + b.HasIndex("UserId"); + + b.ToTable("StoredFiles", "dbo"); + }); + + modelBuilder.Entity("Binner.Data.Model.User", b => + { + b.Property("UserId") + .ValueGeneratedOnAdd() + .HasColumnType("INTEGER"); + + b.Property("DateCreatedUtc") + .ValueGeneratedOnAdd() + .HasColumnType("TEXT") + .HasDefaultValueSql("getutcdate()"); + + b.Property("DateEmailConfirmedUtc") + .HasColumnType("TEXT"); + + b.Property("DateLastActiveUtc") + .HasColumnType("TEXT"); + + b.Property("DateLastLoginUtc") + .HasColumnType("TEXT"); + + b.Property("DateLockedUtc") + .HasColumnType("TEXT"); + + b.Property("DateModifiedUtc") + .ValueGeneratedOnAdd() + .HasColumnType("TEXT") + .HasDefaultValueSql("getutcdate()"); + + b.Property("EmailAddress") + .IsRequired() + .HasColumnType("TEXT"); + + b.Property("EmailConfirmationToken") + .HasColumnType("TEXT"); + + b.Property("EmailConfirmedIp") + .ValueGeneratedOnAdd() + .HasColumnType("INTEGER") + .HasDefaultValue(0L); + + b.Property("Ip") + .ValueGeneratedOnAdd() + .HasColumnType("INTEGER") + .HasDefaultValue(0L); + + b.Property("IsAdmin") + .HasColumnType("INTEGER"); + + b.Property("IsEmailConfirmed") + .HasColumnType("INTEGER"); + + b.Property("IsEmailSubscribed") + .HasColumnType("INTEGER"); + + b.Property("LastSetPasswordIp") + .ValueGeneratedOnAdd() + .HasColumnType("INTEGER") + .HasDefaultValue(0L); + + b.Property("LocaleCurrency") + .HasColumnType("TEXT"); + + b.Property("LocaleLanguage") + .HasColumnType("TEXT"); + + b.Property("Name") + .IsRequired() + .HasColumnType("TEXT"); + + b.Property("OrganizationId") + .HasColumnType("INTEGER"); + + b.Property("PasswordHash") + .IsRequired() + .HasColumnType("TEXT"); + + b.Property("PhoneNumber") + .HasColumnType("TEXT"); + + b.Property("ProfileImage") + .HasColumnType("BLOB"); + + b.Property("ReCaptchaScore") + .HasColumnType("REAL"); + + b.HasKey("UserId"); + + b.HasIndex("EmailAddress"); + + b.HasIndex("Name"); + + b.HasIndex("OrganizationId"); + + b.HasIndex("PhoneNumber"); + + b.ToTable("Users", "dbo"); + }); + + modelBuilder.Entity("Binner.Data.Model.UserConfiguration", b => + { + b.Property("UserConfigurationId") + .ValueGeneratedOnAdd() + .HasColumnType("INTEGER"); + + b.Property("BarcodeBufferTime") + .HasColumnType("INTEGER"); + + b.Property("BarcodeEnabled") + .HasColumnType("INTEGER"); + + b.Property("BarcodeIsDebug") + .HasColumnType("INTEGER"); + + b.Property("BarcodeMaxKeystrokeThresholdMs") + .HasColumnType("INTEGER"); + + b.Property("BarcodePrefix2D") + .IsRequired() + .HasColumnType("TEXT"); + + b.Property("BarcodeProfile") + .HasColumnType("INTEGER"); + + b.Property("Currency") + .HasColumnType("INTEGER"); + + b.Property("DateCreatedUtc") + .ValueGeneratedOnAdd() + .HasColumnType("TEXT") + .HasDefaultValueSql("getutcdate()"); + + b.Property("DateModifiedUtc") + .ValueGeneratedOnAdd() + .HasColumnType("TEXT") + .HasDefaultValueSql("getutcdate()"); + + b.Property("DefaultPartLabelId") + .HasColumnType("INTEGER"); + + b.Property("EnableAutoPartSearch") + .HasColumnType("INTEGER"); + + b.Property("EnableCheckNewVersion") + .HasColumnType("INTEGER"); + + b.Property("EnableDarkMode") + .HasColumnType("INTEGER"); + + b.Property("Language") + .HasColumnType("INTEGER"); + + b.Property("OrganizationId") + .HasColumnType("INTEGER"); + + b.Property("UserId") + .HasColumnType("INTEGER"); + + b.HasKey("UserConfigurationId"); + + b.HasIndex("UserId"); + + b.ToTable("UserConfigurations", "dbo"); + }); + + modelBuilder.Entity("Binner.Data.Model.UserLoginHistory", b => + { + b.Property("UserLoginHistoryId") + .ValueGeneratedOnAdd() + .HasColumnType("INTEGER"); + + b.Property("CanLogin") + .HasColumnType("INTEGER"); + + b.Property("DateCreatedUtc") + .ValueGeneratedOnAdd() + .HasColumnType("TEXT") + .HasDefaultValueSql("getutcdate()"); + + b.Property("DateModifiedUtc") + .ValueGeneratedOnAdd() + .HasColumnType("TEXT") + .HasDefaultValueSql("getutcdate()"); + + b.Property("EmailAddress") + .HasColumnType("TEXT"); + + b.Property("Ip") + .ValueGeneratedOnAdd() + .HasColumnType("INTEGER") + .HasDefaultValue(0L); + + b.Property("IsSuccessful") + .HasColumnType("INTEGER"); + + b.Property("Message") + .HasColumnType("TEXT"); + + b.Property("OrganizationId") + .HasColumnType("INTEGER"); + + b.Property("ReCaptchaScore") + .HasColumnType("REAL"); + + b.Property("UserId") + .HasColumnType("INTEGER"); + + b.HasKey("UserLoginHistoryId"); + + b.HasIndex("UserId"); + + b.ToTable("UserLoginHistory", "dbo"); + }); + + modelBuilder.Entity("Binner.Data.Model.UserPrinterConfiguration", b => + { + b.Property("UserPrinterConfigurationId") + .ValueGeneratedOnAdd() + .HasColumnType("INTEGER"); + + b.Property("DateCreatedUtc") + .ValueGeneratedOnAdd() + .HasColumnType("TEXT") + .HasDefaultValueSql("getutcdate()"); + + b.Property("DateModifiedUtc") + .ValueGeneratedOnAdd() + .HasColumnType("TEXT") + .HasDefaultValueSql("getutcdate()"); + + b.Property("OrganizationId") + .HasColumnType("INTEGER"); + + b.Property("PartLabelName") + .IsRequired() + .HasColumnType("TEXT"); + + b.Property("PartLabelSource") + .HasColumnType("INTEGER"); + + b.Property("PrintMode") + .HasColumnType("INTEGER"); + + b.Property("PrinterName") + .IsRequired() + .HasColumnType("TEXT"); + + b.Property("RemoteAddressUrl") + .HasColumnType("TEXT"); + + b.Property("UserId") + .HasColumnType("INTEGER"); + + b.HasKey("UserPrinterConfigurationId"); + + b.HasIndex("UserId"); + + b.ToTable("UserPrinterConfigurations", "dbo"); + }); + + modelBuilder.Entity("Binner.Data.Model.UserPrinterTemplateConfiguration", b => + { + b.Property("UserPrinterTemplateConfigurationId") + .ValueGeneratedOnAdd() + .HasColumnType("INTEGER"); + + b.Property("AutoSize") + .HasColumnType("INTEGER"); + + b.Property("Barcode") + .HasColumnType("INTEGER"); + + b.Property("Color") + .HasColumnType("TEXT"); + + b.Property("Content") + .HasColumnType("TEXT"); + + b.Property("DateCreatedUtc") + .ValueGeneratedOnAdd() + .HasColumnType("TEXT") + .HasDefaultValueSql("getutcdate()"); + + b.Property("DateModifiedUtc") + .ValueGeneratedOnAdd() + .HasColumnType("TEXT") + .HasDefaultValueSql("getutcdate()"); + + b.Property("FontName") + .IsRequired() + .HasColumnType("TEXT"); + + b.Property("FontSize") + .HasColumnType("INTEGER"); + + b.Property("Label") + .HasColumnType("INTEGER"); + + b.Property("Line") + .HasColumnType("INTEGER"); + + b.Property("LowerCase") + .HasColumnType("INTEGER"); + + b.Property("MarginBottom") + .HasColumnType("INTEGER"); + + b.Property("MarginLeft") + .HasColumnType("INTEGER"); + + b.Property("MarginRight") + .HasColumnType("INTEGER"); + + b.Property("MarginTop") + .HasColumnType("INTEGER"); + + b.Property("OrganizationId") + .HasColumnType("INTEGER"); + + b.Property("Position") + .HasColumnType("INTEGER"); + + b.Property("Rotate") + .HasColumnType("INTEGER"); + + b.Property("UpperCase") + .HasColumnType("INTEGER"); + + b.Property("UserId") + .HasColumnType("INTEGER"); + + b.Property("UserPrinterConfigurationId") + .HasColumnType("INTEGER"); + + b.HasKey("UserPrinterTemplateConfigurationId"); + + b.HasIndex("UserId"); + + b.HasIndex("UserPrinterConfigurationId"); + + b.ToTable("UserPrinterTemplateConfigurations", "dbo"); + }); + + modelBuilder.Entity("Binner.Data.Model.UserToken", b => + { + b.Property("UserTokenId") + .ValueGeneratedOnAdd() + .HasColumnType("INTEGER"); + + b.Property("DateCreatedUtc") + .ValueGeneratedOnAdd() + .HasColumnType("TEXT") + .HasDefaultValueSql("getutcdate()"); + + b.Property("DateExpiredUtc") + .HasColumnType("TEXT"); + + b.Property("DateModifiedUtc") + .ValueGeneratedOnAdd() + .HasColumnType("TEXT") + .HasDefaultValueSql("getutcdate()"); + + b.Property("DateRevokedUtc") + .HasColumnType("TEXT"); + + b.Property("Ip") + .ValueGeneratedOnAdd() + .HasColumnType("INTEGER") + .HasDefaultValue(0L); + + b.Property("OrganizationId") + .HasColumnType("INTEGER"); + + b.Property("ReplacedByToken") + .HasColumnType("TEXT"); + + b.Property("Token") + .IsRequired() + .HasColumnType("TEXT"); + + b.Property("TokenConfig") + .HasColumnType("TEXT"); + + b.Property("TokenTypeId") + .HasColumnType("INTEGER"); + + b.Property("UserId") + .HasColumnType("INTEGER"); + + b.HasKey("UserTokenId"); + + b.HasIndex("UserId"); + + b.ToTable("UserTokens", "dbo"); + }); + + modelBuilder.Entity("Binner.Data.Model.CustomField", b => + { + b.HasOne("Binner.Data.Model.User", "User") + .WithMany("CustomFields") + .HasForeignKey("UserId") + .OnDelete(DeleteBehavior.Restrict); + + b.Navigation("User"); + }); + + modelBuilder.Entity("Binner.Data.Model.CustomFieldValue", b => + { + b.HasOne("Binner.Data.Model.CustomField", "CustomField") + .WithMany("CustomFieldValues") + .HasForeignKey("CustomFieldId") + .OnDelete(DeleteBehavior.Restrict) + .IsRequired(); + + b.HasOne("Binner.Data.Model.User", "User") + .WithMany("CustomFieldValues") + .HasForeignKey("UserId") + .OnDelete(DeleteBehavior.Restrict); + + b.Navigation("CustomField"); + + b.Navigation("User"); + }); + + modelBuilder.Entity("Binner.Data.Model.Label", b => + { + b.HasOne("Binner.Data.Model.LabelTemplate", "LabelTemplate") + .WithMany("Labels") + .HasForeignKey("LabelTemplateId") + .OnDelete(DeleteBehavior.Restrict) + .IsRequired(); + + b.Navigation("LabelTemplate"); + }); + + modelBuilder.Entity("Binner.Data.Model.OAuthCredential", b => + { + b.HasOne("Binner.Data.Model.User", "User") + .WithMany("OAuthCredentials") + .HasForeignKey("UserId") + .OnDelete(DeleteBehavior.Restrict); + + b.Navigation("User"); + }); + + modelBuilder.Entity("Binner.Data.Model.OAuthRequest", b => + { + b.HasOne("Binner.Data.Model.User", "User") + .WithMany("OAuthRequests") + .HasForeignKey("UserId") + .OnDelete(DeleteBehavior.Restrict); + + b.Navigation("User"); + }); + + modelBuilder.Entity("Binner.Data.Model.OrderImportHistory", b => + { + b.HasOne("Binner.Data.Model.User", "User") + .WithMany("OrderImportHistory") + .HasForeignKey("UserId") + .OnDelete(DeleteBehavior.SetNull); + + b.Navigation("User"); + }); + + modelBuilder.Entity("Binner.Data.Model.OrderImportHistoryLineItem", b => + { + b.HasOne("Binner.Data.Model.OrderImportHistory", "OrderImportHistory") + .WithMany("OrderImportHistoryLineItems") + .HasForeignKey("OrderImportHistoryId") + .OnDelete(DeleteBehavior.Restrict) + .IsRequired(); + + b.HasOne("Binner.Data.Model.User", "User") + .WithMany("OrderImportHistoryLineItems") + .HasForeignKey("UserId") + .OnDelete(DeleteBehavior.SetNull); + + b.Navigation("OrderImportHistory"); + + b.Navigation("User"); + }); + + modelBuilder.Entity("Binner.Data.Model.OrganizationConfiguration", b => + { + b.HasOne("Binner.Data.Model.Organization", "Organization") + .WithMany("OrganizationConfigurations") + .HasForeignKey("OrganizationId") + .OnDelete(DeleteBehavior.Restrict); + + b.HasOne("Binner.Data.Model.User", null) + .WithMany("OrganizationConfigurations") + .HasForeignKey("UserId"); + + b.Navigation("Organization"); + }); + + modelBuilder.Entity("Binner.Data.Model.OrganizationIntegrationConfiguration", b => + { + b.HasOne("Binner.Data.Model.Organization", "Organization") + .WithMany("OrganizationIntegrationConfigurations") + .HasForeignKey("OrganizationId") + .OnDelete(DeleteBehavior.Restrict); + + b.HasOne("Binner.Data.Model.User", null) + .WithMany("OrganizationIntegrationConfigurations") + .HasForeignKey("UserId"); + + b.Navigation("Organization"); + }); + + modelBuilder.Entity("Binner.Data.Model.Part", b => + { + b.HasOne("Binner.Data.Model.PartType", "PartType") + .WithMany("Parts") + .HasForeignKey("PartTypeId") + .OnDelete(DeleteBehavior.Restrict) + .IsRequired(); + + b.HasOne("Binner.Data.Model.Project", "Project") + .WithMany("Parts") + .HasForeignKey("ProjectId") + .OnDelete(DeleteBehavior.Restrict); + + b.HasOne("Binner.Data.Model.User", "User") + .WithMany("Parts") + .HasForeignKey("UserId") + .OnDelete(DeleteBehavior.SetNull); + + b.Navigation("PartType"); + + b.Navigation("Project"); + + b.Navigation("User"); + }); + + modelBuilder.Entity("Binner.Data.Model.PartModel", b => + { + b.HasOne("Binner.Data.Model.Part", "Part") + .WithMany("PartModels") + .HasForeignKey("PartId") + .OnDelete(DeleteBehavior.Restrict) + .IsRequired(); + + b.HasOne("Binner.Data.Model.User", "User") + .WithMany("PartModels") + .HasForeignKey("UserId") + .OnDelete(DeleteBehavior.SetNull); + + b.Navigation("Part"); + + b.Navigation("User"); + }); + + modelBuilder.Entity("Binner.Data.Model.PartParametric", b => + { + b.HasOne("Binner.Data.Model.Part", "Part") + .WithMany("PartParametrics") + .HasForeignKey("PartId") + .OnDelete(DeleteBehavior.Restrict) + .IsRequired(); + + b.HasOne("Binner.Data.Model.User", "User") + .WithMany("PartParametrics") + .HasForeignKey("UserId") + .OnDelete(DeleteBehavior.SetNull); + + b.Navigation("Part"); + + b.Navigation("User"); + }); + + modelBuilder.Entity("Binner.Data.Model.PartScanHistory", b => + { + b.HasOne("Binner.Data.Model.Part", "Part") + .WithMany("PartScanHistories") + .HasForeignKey("PartId") + .OnDelete(DeleteBehavior.Restrict); + + b.HasOne("Binner.Data.Model.User", "User") + .WithMany("PartScanHistories") + .HasForeignKey("UserId") + .OnDelete(DeleteBehavior.SetNull); + + b.Navigation("Part"); + + b.Navigation("User"); + }); + + modelBuilder.Entity("Binner.Data.Model.PartSupplier", b => + { + b.HasOne("Binner.Data.Model.Part", "Part") + .WithMany("PartSuppliers") + .HasForeignKey("PartId") + .OnDelete(DeleteBehavior.Restrict) + .IsRequired(); + + b.HasOne("Binner.Data.Model.User", "User") + .WithMany("PartSuppliers") + .HasForeignKey("UserId") + .OnDelete(DeleteBehavior.SetNull); + + b.Navigation("Part"); + + b.Navigation("User"); + }); + + modelBuilder.Entity("Binner.Data.Model.PartType", b => + { + b.HasOne("Binner.Data.Model.PartType", "ParentPartType") + .WithMany() + .HasForeignKey("ParentPartTypeId") + .OnDelete(DeleteBehavior.Restrict); + + b.HasOne("Binner.Data.Model.User", "User") + .WithMany("PartTypes") + .HasForeignKey("UserId") + .OnDelete(DeleteBehavior.SetNull); + + b.Navigation("ParentPartType"); + + b.Navigation("User"); + }); + + modelBuilder.Entity("Binner.Data.Model.Pcb", b => + { + b.HasOne("Binner.Data.Model.User", "User") + .WithMany("Pcbs") + .HasForeignKey("UserId") + .OnDelete(DeleteBehavior.SetNull); + + b.Navigation("User"); + }); + + modelBuilder.Entity("Binner.Data.Model.PcbStoredFileAssignment", b => + { + b.HasOne("Binner.Data.Model.Pcb", "Pcb") + .WithMany("PcbStoredFileAssignments") + .HasForeignKey("PcbId") + .OnDelete(DeleteBehavior.Restrict) + .IsRequired(); + + b.HasOne("Binner.Data.Model.StoredFile", "StoredFile") + .WithMany("PcbStoredFileAssignments") + .HasForeignKey("StoredFileId") + .OnDelete(DeleteBehavior.Restrict) + .IsRequired(); + + b.HasOne("Binner.Data.Model.User", "User") + .WithMany("PcbStoredFileAssignments") + .HasForeignKey("UserId") + .OnDelete(DeleteBehavior.SetNull); + + b.Navigation("Pcb"); + + b.Navigation("StoredFile"); + + b.Navigation("User"); + }); + + modelBuilder.Entity("Binner.Data.Model.Project", b => + { + b.HasOne("Binner.Data.Model.User", "User") + .WithMany("Projects") + .HasForeignKey("UserId") + .OnDelete(DeleteBehavior.SetNull); + + b.Navigation("User"); + }); + + modelBuilder.Entity("Binner.Data.Model.ProjectPartAssignment", b => + { + b.HasOne("Binner.Data.Model.Part", "Part") + .WithMany("ProjectPartAssignments") + .HasForeignKey("PartId") + .OnDelete(DeleteBehavior.Restrict); + + b.HasOne("Binner.Data.Model.Project", "Project") + .WithMany("ProjectPartAssignments") + .HasForeignKey("ProjectId") + .OnDelete(DeleteBehavior.Restrict) + .IsRequired(); + + b.HasOne("Binner.Data.Model.User", "User") + .WithMany("ProjectPartAssignments") + .HasForeignKey("UserId") + .OnDelete(DeleteBehavior.SetNull); + + b.Navigation("Part"); + + b.Navigation("Project"); + + b.Navigation("User"); + }); + + modelBuilder.Entity("Binner.Data.Model.ProjectPcbAssignment", b => + { + b.HasOne("Binner.Data.Model.Pcb", "Pcb") + .WithMany("ProjectPcbAssignments") + .HasForeignKey("PcbId") + .OnDelete(DeleteBehavior.Restrict) + .IsRequired(); + + b.HasOne("Binner.Data.Model.Project", "Project") + .WithMany("ProjectPcbAssignments") + .HasForeignKey("ProjectId") + .OnDelete(DeleteBehavior.Restrict) + .IsRequired(); + + b.HasOne("Binner.Data.Model.User", "User") + .WithMany("ProjectPcbAssignments") + .HasForeignKey("UserId") + .OnDelete(DeleteBehavior.SetNull); + + b.Navigation("Pcb"); + + b.Navigation("Project"); + + b.Navigation("User"); + }); + + modelBuilder.Entity("Binner.Data.Model.ProjectPcbProduceHistory", b => + { + b.HasOne("Binner.Data.Model.Pcb", "Pcb") + .WithMany("ProjectPcbProduceHistory") + .HasForeignKey("PcbId"); + + b.HasOne("Binner.Data.Model.ProjectProduceHistory", "ProjectProduceHistory") + .WithMany("ProjectPcbProduceHistory") + .HasForeignKey("ProjectProduceHistoryId") + .OnDelete(DeleteBehavior.Restrict) + .IsRequired(); + + b.HasOne("Binner.Data.Model.User", "User") + .WithMany("ProjectPcbProduceHistory") + .HasForeignKey("UserId") + .OnDelete(DeleteBehavior.SetNull); + + b.Navigation("Pcb"); + + b.Navigation("ProjectProduceHistory"); + + b.Navigation("User"); + }); + + modelBuilder.Entity("Binner.Data.Model.ProjectProduceHistory", b => + { + b.HasOne("Binner.Data.Model.Project", "Project") + .WithMany("ProjectProduceHistory") + .HasForeignKey("ProjectId") + .OnDelete(DeleteBehavior.Restrict) + .IsRequired(); + + b.HasOne("Binner.Data.Model.User", "User") + .WithMany("ProjectProduceHistory") + .HasForeignKey("UserId") + .OnDelete(DeleteBehavior.SetNull); + + b.Navigation("Project"); + + b.Navigation("User"); + }); + + modelBuilder.Entity("Binner.Data.Model.StoredFile", b => + { + b.HasOne("Binner.Data.Model.Part", "Part") + .WithMany("StoredFiles") + .HasForeignKey("PartId") + .OnDelete(DeleteBehavior.Restrict); + + b.HasOne("Binner.Data.Model.User", "User") + .WithMany("StoredFiles") + .HasForeignKey("UserId") + .OnDelete(DeleteBehavior.SetNull); + + b.Navigation("Part"); + + b.Navigation("User"); + }); + + modelBuilder.Entity("Binner.Data.Model.User", b => + { + b.HasOne("Binner.Data.Model.Organization", "Organization") + .WithMany("Users") + .HasForeignKey("OrganizationId") + .OnDelete(DeleteBehavior.Restrict) + .IsRequired(); + + b.Navigation("Organization"); + }); + + modelBuilder.Entity("Binner.Data.Model.UserConfiguration", b => + { + b.HasOne("Binner.Data.Model.User", "User") + .WithMany("UserConfigurations") + .HasForeignKey("UserId") + .OnDelete(DeleteBehavior.Restrict); + + b.Navigation("User"); + }); + + modelBuilder.Entity("Binner.Data.Model.UserLoginHistory", b => + { + b.HasOne("Binner.Data.Model.User", "User") + .WithMany("UserLoginHistory") + .HasForeignKey("UserId") + .OnDelete(DeleteBehavior.SetNull); + + b.Navigation("User"); + }); + + modelBuilder.Entity("Binner.Data.Model.UserPrinterConfiguration", b => + { + b.HasOne("Binner.Data.Model.User", "User") + .WithMany("UserPrinterConfigurations") + .HasForeignKey("UserId") + .OnDelete(DeleteBehavior.Restrict); + + b.Navigation("User"); + }); + + modelBuilder.Entity("Binner.Data.Model.UserPrinterTemplateConfiguration", b => + { + b.HasOne("Binner.Data.Model.User", "User") + .WithMany("UserPrinterTemplateConfigurations") + .HasForeignKey("UserId") + .OnDelete(DeleteBehavior.Restrict); + + b.HasOne("Binner.Data.Model.UserPrinterConfiguration", "UserPrinterConfiguration") + .WithMany("UserPrinterTemplateConfigurations") + .HasForeignKey("UserPrinterConfigurationId") + .OnDelete(DeleteBehavior.Restrict) + .IsRequired(); + + b.Navigation("User"); + + b.Navigation("UserPrinterConfiguration"); + }); + + modelBuilder.Entity("Binner.Data.Model.UserToken", b => + { + b.HasOne("Binner.Data.Model.User", "User") + .WithMany("UserTokens") + .HasForeignKey("UserId") + .OnDelete(DeleteBehavior.SetNull); + + b.Navigation("User"); + }); + + modelBuilder.Entity("Binner.Data.Model.CustomField", b => + { + b.Navigation("CustomFieldValues"); + }); + + modelBuilder.Entity("Binner.Data.Model.LabelTemplate", b => + { + b.Navigation("Labels"); + }); + + modelBuilder.Entity("Binner.Data.Model.OrderImportHistory", b => + { + b.Navigation("OrderImportHistoryLineItems"); + }); + + modelBuilder.Entity("Binner.Data.Model.Organization", b => + { + b.Navigation("OrganizationConfigurations"); + + b.Navigation("OrganizationIntegrationConfigurations"); + + b.Navigation("Users"); + }); + + modelBuilder.Entity("Binner.Data.Model.Part", b => + { + b.Navigation("PartModels"); + + b.Navigation("PartParametrics"); + + b.Navigation("PartScanHistories"); + + b.Navigation("PartSuppliers"); + + b.Navigation("ProjectPartAssignments"); + + b.Navigation("StoredFiles"); + }); + + modelBuilder.Entity("Binner.Data.Model.PartType", b => + { + b.Navigation("Parts"); + }); + + modelBuilder.Entity("Binner.Data.Model.Pcb", b => + { + b.Navigation("PcbStoredFileAssignments"); + + b.Navigation("ProjectPcbAssignments"); + + b.Navigation("ProjectPcbProduceHistory"); + }); + + modelBuilder.Entity("Binner.Data.Model.Project", b => + { + b.Navigation("Parts"); + + b.Navigation("ProjectPartAssignments"); + + b.Navigation("ProjectPcbAssignments"); + + b.Navigation("ProjectProduceHistory"); + }); + + modelBuilder.Entity("Binner.Data.Model.ProjectProduceHistory", b => + { + b.Navigation("ProjectPcbProduceHistory"); + }); + + modelBuilder.Entity("Binner.Data.Model.StoredFile", b => + { + b.Navigation("PcbStoredFileAssignments"); + }); + + modelBuilder.Entity("Binner.Data.Model.User", b => + { + b.Navigation("CustomFieldValues"); + + b.Navigation("CustomFields"); + + b.Navigation("OAuthCredentials"); + + b.Navigation("OAuthRequests"); + + b.Navigation("OrderImportHistory"); + + b.Navigation("OrderImportHistoryLineItems"); + + b.Navigation("OrganizationConfigurations"); + + b.Navigation("OrganizationIntegrationConfigurations"); + + b.Navigation("PartModels"); + + b.Navigation("PartParametrics"); + + b.Navigation("PartScanHistories"); + + b.Navigation("PartSuppliers"); + + b.Navigation("PartTypes"); + + b.Navigation("Parts"); + + b.Navigation("PcbStoredFileAssignments"); + + b.Navigation("Pcbs"); + + b.Navigation("ProjectPartAssignments"); + + b.Navigation("ProjectPcbAssignments"); + + b.Navigation("ProjectPcbProduceHistory"); + + b.Navigation("ProjectProduceHistory"); + + b.Navigation("Projects"); + + b.Navigation("StoredFiles"); + + b.Navigation("UserConfigurations"); + + b.Navigation("UserLoginHistory"); + + b.Navigation("UserPrinterConfigurations"); + + b.Navigation("UserPrinterTemplateConfigurations"); + + b.Navigation("UserTokens"); + }); + + modelBuilder.Entity("Binner.Data.Model.UserPrinterConfiguration", b => + { + b.Navigation("UserPrinterTemplateConfigurations"); + }); +#pragma warning restore 612, 618 + } + } +} diff --git a/Binner/Data/Binner.Data.Migrations.Sqlite/Migrations/20250824132841_automaticMetadataFetch.cs b/Binner/Data/Binner.Data.Migrations.Sqlite/Migrations/20250824132841_automaticMetadataFetch.cs new file mode 100644 index 00000000..99f9f036 --- /dev/null +++ b/Binner/Data/Binner.Data.Migrations.Sqlite/Migrations/20250824132841_automaticMetadataFetch.cs @@ -0,0 +1,31 @@ +using Microsoft.EntityFrameworkCore.Migrations; + +#nullable disable + +namespace Binner.Data.Migrations.Sqlite.Migrations +{ + /// + public partial class automaticMetadataFetch : Migration + { + /// + protected override void Up(MigrationBuilder migrationBuilder) + { + migrationBuilder.AddColumn( + name: "enableAutomaticMetadataFetchingForExistingParts", + schema: "dbo", + table: "OrganizationConfigurations", + type: "INTEGER", + nullable: false, + defaultValue: true); + } + + /// + protected override void Down(MigrationBuilder migrationBuilder) + { + migrationBuilder.DropColumn( + name: "enableAutomaticMetadataFetchingForExistingParts", + schema: "dbo", + table: "OrganizationConfigurations"); + } + } +} diff --git a/Binner/Data/Binner.Data.Migrations.Sqlite/Migrations/BinnerContextModelSnapshot.cs b/Binner/Data/Binner.Data.Migrations.Sqlite/Migrations/BinnerContextModelSnapshot.cs index 4b35f763..4f4d7977 100644 --- a/Binner/Data/Binner.Data.Migrations.Sqlite/Migrations/BinnerContextModelSnapshot.cs +++ b/Binner/Data/Binner.Data.Migrations.Sqlite/Migrations/BinnerContextModelSnapshot.cs @@ -521,6 +521,9 @@ protected override void BuildModel(ModelBuilder modelBuilder) b.Property("UserId") .HasColumnType("INTEGER"); + b.Property("enableAutomaticMetadataFetchingForExistingParts") + .HasColumnType("INTEGER"); + b.HasKey("OrganizationConfigurationId"); b.HasIndex("OrganizationId");