Performans ve Cors çalışması

This commit is contained in:
Sedat Öztürk 2025-08-12 00:35:35 +03:00
parent 943221ff5a
commit fc5a4c3d7c
16 changed files with 431 additions and 231 deletions

View file

@ -1,4 +1,5 @@
using System; using System;
using System.Collections.Generic;
using System.Globalization; using System.Globalization;
using System.IO; using System.IO;
using System.Linq; using System.Linq;
@ -58,6 +59,7 @@ public class PlatformDataSeeder : IDataSeedContributor, ITransientDependency
private readonly IRepository<Product, Guid> _productRepository; private readonly IRepository<Product, Guid> _productRepository;
private readonly IRepository<PaymentMethod, String> _paymentMethodRepository; private readonly IRepository<PaymentMethod, String> _paymentMethodRepository;
private readonly IRepository<InstallmentOption, int> _installmentOptionRepository; private readonly IRepository<InstallmentOption, int> _installmentOptionRepository;
private readonly IRepository<CustomComponent, Guid> _customComponentRepository;
public PlatformDataSeeder( public PlatformDataSeeder(
@ -93,7 +95,8 @@ public class PlatformDataSeeder : IDataSeedContributor, ITransientDependency
IRepository<CustomEndpoint, Guid> CustomEndpointRepository, IRepository<CustomEndpoint, Guid> CustomEndpointRepository,
IRepository<Product, Guid> ProductRepository, IRepository<Product, Guid> ProductRepository,
IRepository<PaymentMethod, String> PaymentMethodRepository, IRepository<PaymentMethod, String> PaymentMethodRepository,
IRepository<InstallmentOption, int> InstallmentOptionRepository IRepository<InstallmentOption, int> InstallmentOptionRepository,
IRepository<CustomComponent, Guid> CustomComponentRepository
) )
{ {
_languages = languages; _languages = languages;
@ -129,6 +132,7 @@ public class PlatformDataSeeder : IDataSeedContributor, ITransientDependency
_productRepository = ProductRepository; _productRepository = ProductRepository;
_paymentMethodRepository = PaymentMethodRepository; _paymentMethodRepository = PaymentMethodRepository;
_installmentOptionRepository = InstallmentOptionRepository; _installmentOptionRepository = InstallmentOptionRepository;
_customComponentRepository = CustomComponentRepository;
} }
private static IConfigurationRoot BuildConfiguration() private static IConfigurationRoot BuildConfiguration()
@ -730,5 +734,22 @@ public class PlatformDataSeeder : IDataSeedContributor, ITransientDependency
item.Commission)); item.Commission));
} }
} }
foreach (var item in items.CustomComponents)
{
var exists = await _customComponentRepository.AnyAsync(x => x.Name == item.Name);
if (!exists)
{
await _customComponentRepository.InsertAsync(new CustomComponent(
item.Name,
item.Code,
item.Props,
item.Description,
item.IsActive,
JsonSerializer.Serialize(item.Dependencies)));
} }
} }
}
}

View file

@ -8643,7 +8643,10 @@
"descriptionKey": "Abp.Localization.DefaultLanguage.Description", "descriptionKey": "Abp.Localization.DefaultLanguage.Description",
"defaultValue": "en", "defaultValue": "en",
"isVisibleToClients": false, "isVisibleToClients": false,
"providers": ["G", "D"], "providers": [
"G",
"D"
],
"isInherited": false, "isInherited": false,
"isEncrypted": false, "isEncrypted": false,
"mainGroupKey": "App.SiteManagement", "mainGroupKey": "App.SiteManagement",
@ -8677,7 +8680,10 @@
"descriptionKey": "Abp.Localization.Timezone.Description", "descriptionKey": "Abp.Localization.Timezone.Description",
"defaultValue": "UTC", "defaultValue": "UTC",
"isVisibleToClients": false, "isVisibleToClients": false,
"providers": ["G", "D"], "providers": [
"G",
"D"
],
"isInherited": false, "isInherited": false,
"isEncrypted": false, "isEncrypted": false,
"mainGroupKey": "App.SiteManagement", "mainGroupKey": "App.SiteManagement",
@ -8833,7 +8839,11 @@
"descriptionKey": "App.SiteManagement.Theme.Style.Description", "descriptionKey": "App.SiteManagement.Theme.Style.Description",
"defaultValue": "dx.light.compact", "defaultValue": "dx.light.compact",
"isVisibleToClients": true, "isVisibleToClients": true,
"providers": ["U", "G", "D"], "providers": [
"U",
"G",
"D"
],
"isInherited": false, "isInherited": false,
"isEncrypted": false, "isEncrypted": false,
"mainGroupKey": "App.SiteManagement", "mainGroupKey": "App.SiteManagement",
@ -8881,7 +8891,10 @@
"descriptionKey": "App.SiteManagement.General.NewMemberNotificationEmails.Description", "descriptionKey": "App.SiteManagement.General.NewMemberNotificationEmails.Description",
"defaultValue": "system@sozsoft.com", "defaultValue": "system@sozsoft.com",
"isVisibleToClients": false, "isVisibleToClients": false,
"providers": ["G", "D"], "providers": [
"G",
"D"
],
"isInherited": false, "isInherited": false,
"isEncrypted": false, "isEncrypted": false,
"mainGroupKey": "App.SiteManagement", "mainGroupKey": "App.SiteManagement",
@ -8897,7 +8910,10 @@
"descriptionKey": "App.SiteManagement.General.TimedLoginEmails.Description", "descriptionKey": "App.SiteManagement.General.TimedLoginEmails.Description",
"defaultValue": "system@sozsoft.com", "defaultValue": "system@sozsoft.com",
"isVisibleToClients": false, "isVisibleToClients": false,
"providers": ["G", "D"], "providers": [
"G",
"D"
],
"isInherited": false, "isInherited": false,
"isEncrypted": false, "isEncrypted": false,
"mainGroupKey": "App.SiteManagement", "mainGroupKey": "App.SiteManagement",
@ -8913,7 +8929,11 @@
"descriptionKey": "App.Sender.Sms.PostaGuvercini.Url.Description", "descriptionKey": "App.Sender.Sms.PostaGuvercini.Url.Description",
"defaultValue": "https://www.postaguvercini.com/api_http", "defaultValue": "https://www.postaguvercini.com/api_http",
"isVisibleToClients": false, "isVisibleToClients": false,
"providers": ["T", "G", "D"], "providers": [
"T",
"G",
"D"
],
"isInherited": false, "isInherited": false,
"isEncrypted": false, "isEncrypted": false,
"mainGroupKey": "App.Sender", "mainGroupKey": "App.Sender",
@ -8929,7 +8949,11 @@
"descriptionKey": "App.Sender.Sms.PostaGuvercini.Username.Description", "descriptionKey": "App.Sender.Sms.PostaGuvercini.Username.Description",
"defaultValue": "2AIlj4QlCrvlbDDBS/712A==", "defaultValue": "2AIlj4QlCrvlbDDBS/712A==",
"isVisibleToClients": false, "isVisibleToClients": false,
"providers": ["T", "G", "D"], "providers": [
"T",
"G",
"D"
],
"isInherited": false, "isInherited": false,
"isEncrypted": true, "isEncrypted": true,
"mainGroupKey": "App.Sender", "mainGroupKey": "App.Sender",
@ -8945,7 +8969,11 @@
"descriptionKey": "App.Sender.Sms.PostaGuvercini.Password.Description", "descriptionKey": "App.Sender.Sms.PostaGuvercini.Password.Description",
"defaultValue": "oTuwyZM9sxfJI+jDH5wJAw==", "defaultValue": "oTuwyZM9sxfJI+jDH5wJAw==",
"isVisibleToClients": false, "isVisibleToClients": false,
"providers": ["T", "G", "D"], "providers": [
"T",
"G",
"D"
],
"isInherited": false, "isInherited": false,
"isEncrypted": true, "isEncrypted": true,
"mainGroupKey": "App.Sender", "mainGroupKey": "App.Sender",
@ -8961,7 +8989,11 @@
"descriptionKey": "App.Sender.WhatsApp.Url.Description", "descriptionKey": "App.Sender.WhatsApp.Url.Description",
"defaultValue": "https://graph.facebook.com/v21.0", "defaultValue": "https://graph.facebook.com/v21.0",
"isVisibleToClients": false, "isVisibleToClients": false,
"providers": ["T", "G", "D"], "providers": [
"T",
"G",
"D"
],
"isInherited": false, "isInherited": false,
"isEncrypted": false, "isEncrypted": false,
"mainGroupKey": "App.Sender", "mainGroupKey": "App.Sender",
@ -8977,7 +9009,11 @@
"descriptionKey": "App.Sender.WhatsApp.PhoneNumberId.Description", "descriptionKey": "App.Sender.WhatsApp.PhoneNumberId.Description",
"defaultValue": "442035112335974", "defaultValue": "442035112335974",
"isVisibleToClients": false, "isVisibleToClients": false,
"providers": ["T", "G", "D"], "providers": [
"T",
"G",
"D"
],
"isInherited": false, "isInherited": false,
"isEncrypted": false, "isEncrypted": false,
"mainGroupKey": "App.Sender", "mainGroupKey": "App.Sender",
@ -8993,7 +9029,11 @@
"descriptionKey": "App.Sender.WhatsApp.Token.Description", "descriptionKey": "App.Sender.WhatsApp.Token.Description",
"defaultValue": "EAANoftqZAJ64BO5oPwXPqniUtNGF70u8TKvQVzGZBaYQh5UY8fYrgQkcXP9UbQUqT9PWRah1L7TzcBIiWQMacT8AkmZB33AP1begLoywIZCsQSdBSUz21GQaCowfVosYgBoXSyqH8irSBPQDLIjxxVxrC2n76SD9X6zPXeHgOqIPY92DqJXplstWrlhtZCAZDZD", "defaultValue": "EAANoftqZAJ64BO5oPwXPqniUtNGF70u8TKvQVzGZBaYQh5UY8fYrgQkcXP9UbQUqT9PWRah1L7TzcBIiWQMacT8AkmZB33AP1begLoywIZCsQSdBSUz21GQaCowfVosYgBoXSyqH8irSBPQDLIjxxVxrC2n76SD9X6zPXeHgOqIPY92DqJXplstWrlhtZCAZDZD",
"isVisibleToClients": false, "isVisibleToClients": false,
"providers": ["T", "G", "D"], "providers": [
"T",
"G",
"D"
],
"isInherited": false, "isInherited": false,
"isEncrypted": false, "isEncrypted": false,
"mainGroupKey": "App.Sender", "mainGroupKey": "App.Sender",
@ -9009,7 +9049,11 @@
"descriptionKey": "App.Sender.WhatsApp.TemplateName.Description", "descriptionKey": "App.Sender.WhatsApp.TemplateName.Description",
"defaultValue": "kurs_platform_notification", "defaultValue": "kurs_platform_notification",
"isVisibleToClients": false, "isVisibleToClients": false,
"providers": ["T", "G", "D"], "providers": [
"T",
"G",
"D"
],
"isInherited": false, "isInherited": false,
"isEncrypted": false, "isEncrypted": false,
"mainGroupKey": "App.Sender", "mainGroupKey": "App.Sender",
@ -9025,7 +9069,10 @@
"descriptionKey": "App.Sender.Rocket.Url.Description", "descriptionKey": "App.Sender.Rocket.Url.Description",
"defaultValue": "https://chat.sozsoft.com/api/v1", "defaultValue": "https://chat.sozsoft.com/api/v1",
"isVisibleToClients": false, "isVisibleToClients": false,
"providers": ["G", "D"], "providers": [
"G",
"D"
],
"isInherited": false, "isInherited": false,
"isEncrypted": false, "isEncrypted": false,
"mainGroupKey": "App.Sender", "mainGroupKey": "App.Sender",
@ -9041,7 +9088,10 @@
"descriptionKey": "App.Sender.Rocket.UserId.Description", "descriptionKey": "App.Sender.Rocket.UserId.Description",
"defaultValue": "LfpzPjzag4QJXm84N", "defaultValue": "LfpzPjzag4QJXm84N",
"isVisibleToClients": false, "isVisibleToClients": false,
"providers": ["G", "D"], "providers": [
"G",
"D"
],
"isInherited": false, "isInherited": false,
"isEncrypted": false, "isEncrypted": false,
"mainGroupKey": "App.Sender", "mainGroupKey": "App.Sender",
@ -9057,7 +9107,10 @@
"descriptionKey": "App.Sender.Rocket.Token.Description", "descriptionKey": "App.Sender.Rocket.Token.Description",
"defaultValue": "jvqALawvXn0Q7c6FfHJV3h58DCHDfQLgFF5y7oIc7oc", "defaultValue": "jvqALawvXn0Q7c6FfHJV3h58DCHDfQLgFF5y7oIc7oc",
"isVisibleToClients": false, "isVisibleToClients": false,
"providers": ["G", "D"], "providers": [
"G",
"D"
],
"isInherited": false, "isInherited": false,
"isEncrypted": false, "isEncrypted": false,
"mainGroupKey": "App.Sender", "mainGroupKey": "App.Sender",
@ -9073,7 +9126,11 @@
"descriptionKey": "Abp.Mailing.DefaultFromDisplayName.Description", "descriptionKey": "Abp.Mailing.DefaultFromDisplayName.Description",
"defaultValue": "Kurs", "defaultValue": "Kurs",
"isVisibleToClients": false, "isVisibleToClients": false,
"providers": ["T", "G", "D"], "providers": [
"T",
"G",
"D"
],
"isInherited": false, "isInherited": false,
"isEncrypted": false, "isEncrypted": false,
"mainGroupKey": "Abp.Mailing", "mainGroupKey": "Abp.Mailing",
@ -9089,7 +9146,11 @@
"descriptionKey": "Abp.Mailing.DefaultFromAddress.Description", "descriptionKey": "Abp.Mailing.DefaultFromAddress.Description",
"defaultValue": "system@sozsoft.com", "defaultValue": "system@sozsoft.com",
"isVisibleToClients": false, "isVisibleToClients": false,
"providers": ["T", "G", "D"], "providers": [
"T",
"G",
"D"
],
"isInherited": false, "isInherited": false,
"isEncrypted": false, "isEncrypted": false,
"mainGroupKey": "Abp.Mailing", "mainGroupKey": "Abp.Mailing",
@ -9105,7 +9166,11 @@
"descriptionKey": "Abp.Mailing.Smtp.UserName.Description", "descriptionKey": "Abp.Mailing.Smtp.UserName.Description",
"defaultValue": "system@sozsoft.com", "defaultValue": "system@sozsoft.com",
"isVisibleToClients": false, "isVisibleToClients": false,
"providers": ["T", "G", "D"], "providers": [
"T",
"G",
"D"
],
"isInherited": false, "isInherited": false,
"isEncrypted": false, "isEncrypted": false,
"mainGroupKey": "Abp.Mailing", "mainGroupKey": "Abp.Mailing",
@ -9121,7 +9186,11 @@
"descriptionKey": "Abp.Mailing.Smtp.Password.Description", "descriptionKey": "Abp.Mailing.Smtp.Password.Description",
"defaultValue": "QT9L7BCl1CT/1Hq19HoSlQ==", "defaultValue": "QT9L7BCl1CT/1Hq19HoSlQ==",
"isVisibleToClients": false, "isVisibleToClients": false,
"providers": ["T", "G", "D"], "providers": [
"T",
"G",
"D"
],
"isInherited": false, "isInherited": false,
"isEncrypted": true, "isEncrypted": true,
"mainGroupKey": "Abp.Mailing", "mainGroupKey": "Abp.Mailing",
@ -9137,7 +9206,11 @@
"descriptionKey": "Abp.Mailing.Smtp.Host.Description", "descriptionKey": "Abp.Mailing.Smtp.Host.Description",
"defaultValue": "127.0.0.1", "defaultValue": "127.0.0.1",
"isVisibleToClients": false, "isVisibleToClients": false,
"providers": ["T", "G", "D"], "providers": [
"T",
"G",
"D"
],
"isInherited": false, "isInherited": false,
"isEncrypted": false, "isEncrypted": false,
"mainGroupKey": "Abp.Mailing", "mainGroupKey": "Abp.Mailing",
@ -9153,7 +9226,11 @@
"descriptionKey": "Abp.Mailing.Smtp.Port.Description", "descriptionKey": "Abp.Mailing.Smtp.Port.Description",
"defaultValue": "25", "defaultValue": "25",
"isVisibleToClients": false, "isVisibleToClients": false,
"providers": ["T", "G", "D"], "providers": [
"T",
"G",
"D"
],
"isInherited": false, "isInherited": false,
"isEncrypted": false, "isEncrypted": false,
"mainGroupKey": "Abp.Mailing", "mainGroupKey": "Abp.Mailing",
@ -9169,7 +9246,11 @@
"descriptionKey": "Abp.Mailing.Smtp.Domain.Description", "descriptionKey": "Abp.Mailing.Smtp.Domain.Description",
"defaultValue": "sozsoft.com", "defaultValue": "sozsoft.com",
"isVisibleToClients": false, "isVisibleToClients": false,
"providers": ["T", "G", "D"], "providers": [
"T",
"G",
"D"
],
"isInherited": false, "isInherited": false,
"isEncrypted": false, "isEncrypted": false,
"mainGroupKey": "Abp.Mailing", "mainGroupKey": "Abp.Mailing",
@ -9185,7 +9266,11 @@
"descriptionKey": "Abp.Mailing.Smtp.EnableSsl.Description", "descriptionKey": "Abp.Mailing.Smtp.EnableSsl.Description",
"defaultValue": "True", "defaultValue": "True",
"isVisibleToClients": false, "isVisibleToClients": false,
"providers": ["T", "G", "D"], "providers": [
"T",
"G",
"D"
],
"isInherited": false, "isInherited": false,
"isEncrypted": false, "isEncrypted": false,
"mainGroupKey": "Abp.Mailing", "mainGroupKey": "Abp.Mailing",
@ -9201,7 +9286,11 @@
"descriptionKey": "Abp.Mailing.AWS.Profile.Description", "descriptionKey": "Abp.Mailing.AWS.Profile.Description",
"defaultValue": "mail-sdk-user", "defaultValue": "mail-sdk-user",
"isVisibleToClients": false, "isVisibleToClients": false,
"providers": ["T", "G", "D"], "providers": [
"T",
"G",
"D"
],
"isInherited": false, "isInherited": false,
"isEncrypted": false, "isEncrypted": false,
"mainGroupKey": "Abp.Mailing", "mainGroupKey": "Abp.Mailing",
@ -9217,7 +9306,11 @@
"descriptionKey": "Abp.Mailing.AWS.Region.Description", "descriptionKey": "Abp.Mailing.AWS.Region.Description",
"defaultValue": "eu-central-1", "defaultValue": "eu-central-1",
"isVisibleToClients": false, "isVisibleToClients": false,
"providers": ["T", "G", "D"], "providers": [
"T",
"G",
"D"
],
"isInherited": false, "isInherited": false,
"isEncrypted": false, "isEncrypted": false,
"mainGroupKey": "Abp.Mailing", "mainGroupKey": "Abp.Mailing",
@ -9233,7 +9326,11 @@
"descriptionKey": "Abp.Mailing.AWS.AccessKey.Description", "descriptionKey": "Abp.Mailing.AWS.AccessKey.Description",
"defaultValue": "aXW8L21rP6dPO6Txj76Be2FCpWRBa25EMrSAVL76", "defaultValue": "aXW8L21rP6dPO6Txj76Be2FCpWRBa25EMrSAVL76",
"isVisibleToClients": false, "isVisibleToClients": false,
"providers": ["T", "G", "D"], "providers": [
"T",
"G",
"D"
],
"isInherited": false, "isInherited": false,
"isEncrypted": false, "isEncrypted": false,
"mainGroupKey": "Abp.Mailing", "mainGroupKey": "Abp.Mailing",
@ -9249,7 +9346,11 @@
"descriptionKey": "Abp.Mailing.AWS.AccessKeyId.Description", "descriptionKey": "Abp.Mailing.AWS.AccessKeyId.Description",
"defaultValue": "AKIATULUYBLX4IY3S2P1", "defaultValue": "AKIATULUYBLX4IY3S2P1",
"isVisibleToClients": false, "isVisibleToClients": false,
"providers": ["T", "G", "D"], "providers": [
"T",
"G",
"D"
],
"isInherited": false, "isInherited": false,
"isEncrypted": false, "isEncrypted": false,
"mainGroupKey": "Abp.Mailing", "mainGroupKey": "Abp.Mailing",
@ -9265,7 +9366,10 @@
"descriptionKey": "Abp.Account.IsSelfRegistrationEnabled.Description", "descriptionKey": "Abp.Account.IsSelfRegistrationEnabled.Description",
"defaultValue": "True", "defaultValue": "True",
"isVisibleToClients": false, "isVisibleToClients": false,
"providers": ["G", "D"], "providers": [
"G",
"D"
],
"isInherited": false, "isInherited": false,
"isEncrypted": false, "isEncrypted": false,
"mainGroupKey": "Abp.Account", "mainGroupKey": "Abp.Account",
@ -9281,7 +9385,10 @@
"descriptionKey": "Abp.Account.EnableLocalLogin.Description", "descriptionKey": "Abp.Account.EnableLocalLogin.Description",
"defaultValue": "True", "defaultValue": "True",
"isVisibleToClients": false, "isVisibleToClients": false,
"providers": ["G", "D"], "providers": [
"G",
"D"
],
"isInherited": false, "isInherited": false,
"isEncrypted": false, "isEncrypted": false,
"mainGroupKey": "Abp.Account", "mainGroupKey": "Abp.Account",
@ -9297,7 +9404,11 @@
"descriptionKey": "Abp.Account.TwoFactor.Enabled.Description", "descriptionKey": "Abp.Account.TwoFactor.Enabled.Description",
"defaultValue": "True", "defaultValue": "True",
"isVisibleToClients": false, "isVisibleToClients": false,
"providers": ["T", "G", "D"], "providers": [
"T",
"G",
"D"
],
"isInherited": false, "isInherited": false,
"isEncrypted": false, "isEncrypted": false,
"mainGroupKey": "Abp.Account", "mainGroupKey": "Abp.Account",
@ -9313,7 +9424,10 @@
"descriptionKey": "Abp.Account.Captcha.MaxFailedAccessAttempts.Description", "descriptionKey": "Abp.Account.Captcha.MaxFailedAccessAttempts.Description",
"defaultValue": "3", "defaultValue": "3",
"isVisibleToClients": false, "isVisibleToClients": false,
"providers": ["G", "D"], "providers": [
"G",
"D"
],
"isInherited": false, "isInherited": false,
"isEncrypted": false, "isEncrypted": false,
"mainGroupKey": "Abp.Account", "mainGroupKey": "Abp.Account",
@ -9329,7 +9443,10 @@
"descriptionKey": "Abp.Account.Captcha.EndPoint.Description", "descriptionKey": "Abp.Account.Captcha.EndPoint.Description",
"defaultValue": "https://challenges.cloudflare.com/turnstile/v0/siteverify", "defaultValue": "https://challenges.cloudflare.com/turnstile/v0/siteverify",
"isVisibleToClients": false, "isVisibleToClients": false,
"providers": ["G", "D"], "providers": [
"G",
"D"
],
"isInherited": false, "isInherited": false,
"isEncrypted": false, "isEncrypted": false,
"mainGroupKey": "Abp.Account", "mainGroupKey": "Abp.Account",
@ -9345,7 +9462,10 @@
"descriptionKey": "Abp.Account.Captcha.SiteKey.Description", "descriptionKey": "Abp.Account.Captcha.SiteKey.Description",
"defaultValue": "0x4AAAAAAAGadwQME-GSYuJU", "defaultValue": "0x4AAAAAAAGadwQME-GSYuJU",
"isVisibleToClients": false, "isVisibleToClients": false,
"providers": ["G", "D"], "providers": [
"G",
"D"
],
"isInherited": false, "isInherited": false,
"isEncrypted": false, "isEncrypted": false,
"mainGroupKey": "Abp.Account", "mainGroupKey": "Abp.Account",
@ -9361,7 +9481,10 @@
"descriptionKey": "Abp.Account.Captcha.SecretKey.Description", "descriptionKey": "Abp.Account.Captcha.SecretKey.Description",
"defaultValue": "0x4AAAAAAAGad_f_WP47IcNBs9FTu5DhNX8", "defaultValue": "0x4AAAAAAAGad_f_WP47IcNBs9FTu5DhNX8",
"isVisibleToClients": false, "isVisibleToClients": false,
"providers": ["G", "D"], "providers": [
"G",
"D"
],
"isInherited": false, "isInherited": false,
"isEncrypted": false, "isEncrypted": false,
"mainGroupKey": "Abp.Account", "mainGroupKey": "Abp.Account",
@ -9377,7 +9500,11 @@
"descriptionKey": "Abp.Identity.Profile.General.RequireVerifiedAccount.Description", "descriptionKey": "Abp.Identity.Profile.General.RequireVerifiedAccount.Description",
"defaultValue": "True", "defaultValue": "True",
"isVisibleToClients": false, "isVisibleToClients": false,
"providers": ["T", "G", "D"], "providers": [
"T",
"G",
"D"
],
"isInherited": false, "isInherited": false,
"isEncrypted": false, "isEncrypted": false,
"mainGroupKey": "Abp.Identity", "mainGroupKey": "Abp.Identity",
@ -9393,7 +9520,11 @@
"descriptionKey": "Abp.Identity.Profile.General.BlacklistedEmailProviders.Description", "descriptionKey": "Abp.Identity.Profile.General.BlacklistedEmailProviders.Description",
"defaultValue": "gmail.com\r\nyahoo.com\r\nhotmail.com", "defaultValue": "gmail.com\r\nyahoo.com\r\nhotmail.com",
"isVisibleToClients": false, "isVisibleToClients": false,
"providers": ["T", "G", "D"], "providers": [
"T",
"G",
"D"
],
"isInherited": false, "isInherited": false,
"isEncrypted": false, "isEncrypted": false,
"mainGroupKey": "Abp.Identity", "mainGroupKey": "Abp.Identity",
@ -9409,7 +9540,11 @@
"descriptionKey": "Abp.Identity.Password.ForceUsersToPeriodicallyChangePassword.Description", "descriptionKey": "Abp.Identity.Password.ForceUsersToPeriodicallyChangePassword.Description",
"defaultValue": "True", "defaultValue": "True",
"isVisibleToClients": false, "isVisibleToClients": false,
"providers": ["T", "G", "D"], "providers": [
"T",
"G",
"D"
],
"isInherited": false, "isInherited": false,
"isEncrypted": false, "isEncrypted": false,
"mainGroupKey": "Abp.Identity", "mainGroupKey": "Abp.Identity",
@ -9425,7 +9560,11 @@
"descriptionKey": "Abp.Identity.Password.PasswordChangePeriodDays.Description", "descriptionKey": "Abp.Identity.Password.PasswordChangePeriodDays.Description",
"defaultValue": "0", "defaultValue": "0",
"isVisibleToClients": false, "isVisibleToClients": false,
"providers": ["T", "G", "D"], "providers": [
"T",
"G",
"D"
],
"isInherited": false, "isInherited": false,
"isEncrypted": false, "isEncrypted": false,
"mainGroupKey": "Abp.Identity", "mainGroupKey": "Abp.Identity",
@ -9441,7 +9580,11 @@
"descriptionKey": "Abp.Identity.Password.RequiredLength.Description", "descriptionKey": "Abp.Identity.Password.RequiredLength.Description",
"defaultValue": "6", "defaultValue": "6",
"isVisibleToClients": false, "isVisibleToClients": false,
"providers": ["T", "G", "D"], "providers": [
"T",
"G",
"D"
],
"isInherited": false, "isInherited": false,
"isEncrypted": false, "isEncrypted": false,
"mainGroupKey": "Abp.Identity", "mainGroupKey": "Abp.Identity",
@ -9457,7 +9600,11 @@
"descriptionKey": "Abp.Identity.Password.RequiredUniqueChars.Description", "descriptionKey": "Abp.Identity.Password.RequiredUniqueChars.Description",
"defaultValue": "1", "defaultValue": "1",
"isVisibleToClients": false, "isVisibleToClients": false,
"providers": ["T", "G", "D"], "providers": [
"T",
"G",
"D"
],
"isInherited": false, "isInherited": false,
"isEncrypted": false, "isEncrypted": false,
"mainGroupKey": "Abp.Identity", "mainGroupKey": "Abp.Identity",
@ -9473,7 +9620,11 @@
"descriptionKey": "Abp.Identity.Password.RequireNonAlphanumeric.Description", "descriptionKey": "Abp.Identity.Password.RequireNonAlphanumeric.Description",
"defaultValue": "True", "defaultValue": "True",
"isVisibleToClients": false, "isVisibleToClients": false,
"providers": ["T", "G", "D"], "providers": [
"T",
"G",
"D"
],
"isInherited": false, "isInherited": false,
"isEncrypted": false, "isEncrypted": false,
"mainGroupKey": "Abp.Identity", "mainGroupKey": "Abp.Identity",
@ -9489,7 +9640,11 @@
"descriptionKey": "Abp.Identity.Password.RequireLowercase.Description", "descriptionKey": "Abp.Identity.Password.RequireLowercase.Description",
"defaultValue": "True", "defaultValue": "True",
"isVisibleToClients": false, "isVisibleToClients": false,
"providers": ["T", "G", "D"], "providers": [
"T",
"G",
"D"
],
"isInherited": false, "isInherited": false,
"isEncrypted": false, "isEncrypted": false,
"mainGroupKey": "Abp.Identity", "mainGroupKey": "Abp.Identity",
@ -9505,7 +9660,11 @@
"descriptionKey": "Abp.Identity.Password.RequireUppercase.Description", "descriptionKey": "Abp.Identity.Password.RequireUppercase.Description",
"defaultValue": "True", "defaultValue": "True",
"isVisibleToClients": false, "isVisibleToClients": false,
"providers": ["T", "G", "D"], "providers": [
"T",
"G",
"D"
],
"isInherited": false, "isInherited": false,
"isEncrypted": false, "isEncrypted": false,
"mainGroupKey": "Abp.Identity", "mainGroupKey": "Abp.Identity",
@ -9521,7 +9680,11 @@
"descriptionKey": "Abp.Identity.Password.RequireDigit.Description", "descriptionKey": "Abp.Identity.Password.RequireDigit.Description",
"defaultValue": "True", "defaultValue": "True",
"isVisibleToClients": false, "isVisibleToClients": false,
"providers": ["T", "G", "D"], "providers": [
"T",
"G",
"D"
],
"isInherited": false, "isInherited": false,
"isEncrypted": false, "isEncrypted": false,
"mainGroupKey": "Abp.Identity", "mainGroupKey": "Abp.Identity",
@ -9537,7 +9700,11 @@
"descriptionKey": "Abp.Identity.Lockout.AllowedForNewUsers.Description", "descriptionKey": "Abp.Identity.Lockout.AllowedForNewUsers.Description",
"defaultValue": "True", "defaultValue": "True",
"isVisibleToClients": false, "isVisibleToClients": false,
"providers": ["T", "G", "D"], "providers": [
"T",
"G",
"D"
],
"isInherited": false, "isInherited": false,
"isEncrypted": false, "isEncrypted": false,
"mainGroupKey": "Abp.Identity", "mainGroupKey": "Abp.Identity",
@ -9553,7 +9720,11 @@
"descriptionKey": "Abp.Identity.Lockout.LockoutDuration.Description", "descriptionKey": "Abp.Identity.Lockout.LockoutDuration.Description",
"defaultValue": "300", "defaultValue": "300",
"isVisibleToClients": false, "isVisibleToClients": false,
"providers": ["T", "G", "D"], "providers": [
"T",
"G",
"D"
],
"isInherited": false, "isInherited": false,
"isEncrypted": false, "isEncrypted": false,
"mainGroupKey": "Abp.Identity", "mainGroupKey": "Abp.Identity",
@ -9569,7 +9740,11 @@
"descriptionKey": "Abp.Identity.Lockout.MaxFailedAccessAttempts.Description", "descriptionKey": "Abp.Identity.Lockout.MaxFailedAccessAttempts.Description",
"defaultValue": "5", "defaultValue": "5",
"isVisibleToClients": false, "isVisibleToClients": false,
"providers": ["T", "G", "D"], "providers": [
"T",
"G",
"D"
],
"isInherited": false, "isInherited": false,
"isEncrypted": false, "isEncrypted": false,
"mainGroupKey": "Abp.Identity", "mainGroupKey": "Abp.Identity",
@ -9585,7 +9760,10 @@
"descriptionKey": "Abp.Identity.SignIn.RequireConfirmedEmail.Description", "descriptionKey": "Abp.Identity.SignIn.RequireConfirmedEmail.Description",
"defaultValue": "True", "defaultValue": "True",
"isVisibleToClients": false, "isVisibleToClients": false,
"providers": ["G", "D"], "providers": [
"G",
"D"
],
"isInherited": false, "isInherited": false,
"isEncrypted": false, "isEncrypted": false,
"mainGroupKey": "Abp.Identity", "mainGroupKey": "Abp.Identity",
@ -9601,7 +9779,10 @@
"descriptionKey": "Abp.Identity.SignIn.RequireConfirmedPhoneNumber.Description", "descriptionKey": "Abp.Identity.SignIn.RequireConfirmedPhoneNumber.Description",
"defaultValue": "False", "defaultValue": "False",
"isVisibleToClients": false, "isVisibleToClients": false,
"providers": ["G", "D"], "providers": [
"G",
"D"
],
"isInherited": false, "isInherited": false,
"isEncrypted": false, "isEncrypted": false,
"mainGroupKey": "Abp.Identity", "mainGroupKey": "Abp.Identity",
@ -9617,7 +9798,10 @@
"descriptionKey": "Abp.Identity.User.IsUserNameUpdateEnabled.Description", "descriptionKey": "Abp.Identity.User.IsUserNameUpdateEnabled.Description",
"defaultValue": "True", "defaultValue": "True",
"isVisibleToClients": false, "isVisibleToClients": false,
"providers": ["G", "D"], "providers": [
"G",
"D"
],
"isInherited": false, "isInherited": false,
"isEncrypted": false, "isEncrypted": false,
"mainGroupKey": "Abp.Identity", "mainGroupKey": "Abp.Identity",
@ -9633,7 +9817,10 @@
"descriptionKey": "Abp.Identity.User.IsEmailUpdateEnabled.Description", "descriptionKey": "Abp.Identity.User.IsEmailUpdateEnabled.Description",
"defaultValue": "True", "defaultValue": "True",
"isVisibleToClients": false, "isVisibleToClients": false,
"providers": ["G", "D"], "providers": [
"G",
"D"
],
"isInherited": false, "isInherited": false,
"isEncrypted": false, "isEncrypted": false,
"mainGroupKey": "Abp.Identity", "mainGroupKey": "Abp.Identity",
@ -25775,5 +25962,23 @@
"name": "12 Taksit", "name": "12 Taksit",
"commission": 0.275 "commission": 0.275
} }
],
"CustomComponents": [
{
"name": "AxiosListComponent",
"code": "import React, { useEffect, useState } from \"react\";\nimport axios from \"axios\";\n\ninterface AxiosListComponentProps {\n title: string;\n}\n\nconst api = axios.create({\n baseURL: \"https://localhost:44344\", // defaults'ı her seferinde set etme\n});\n\nconst AxiosListComponent: React.FC<AxiosListComponentProps> = ({ title }) => {\n const [data, setData] = useState<Array<{ id: string; name: string }>>([]);\n const [loading, setLoading] = useState(false);\n const [error, setError] = useState<string | null>(null);\n\n useEffect(() => {\n const fetchData = async () => {\n setLoading(true);\n setError(null);\n\n try {\n const res = await api.get(`/api/app/dynamic/${title}`);\n const raw = Array.isArray(res.data) ? res.data : res.data?.items ?? [];\n\n const filtered = raw.map((item: any) => ({\n id: item.Id ?? item.id,\n name: item.Name ?? item.name,\n }));\n\n setData(filtered);\n } catch (err: any) {\n setError(err.message || \"Failed to fetch data\");\n } finally {\n setLoading(false);\n }\n };\n\n if (title) fetchData();\n }, [title]);\n\n if (loading) return <div>Loading...</div>;\n if (error) return <div className=\"text-red-600\">Error: {error}</div>;\n if (!data.length) return <div>No records found</div>;\n\n const headers = [\"id\", \"name\", \"actions\"];\n\n return (\n <div className=\"overflow-auto\">\n <table className=\"min-w-full bg-white border border-slate-200 shadow-sm rounded-lg\">\n <thead className=\"bg-slate-100\">\n <tr>\n {headers.map((key) => (\n <th\n key={key}\n className=\"text-left px-4 py-2 border-b border-slate-200 text-sm font-medium text-slate-700\"\n >\n {key === \"actions\" ? \"Actions\" : key}\n </th>\n ))}\n </tr>\n </thead>\n <tbody>\n {data.map((item, rowIndex) => (\n <tr key={rowIndex} className=\"hover:bg-slate-50\">\n <td className=\"px-4 py-2 border-b border-slate-100 text-sm text-slate-800\">\n {item.id}\n </td>\n <td className=\"px-4 py-2 border-b border-slate-100 text-sm text-slate-800\">\n {item.name}\n </td>\n <td className=\"px-4 py-2 border-b border-slate-100\">\n <button\n onClick={() => alert(item.name)}\n className=\"bg-blue-600 hover:bg-blue-700 text-white text-sm px-3 py-1 rounded-lg shadow-sm transition\"\n >\n Show Name\n </button>\n </td>\n </tr>\n ))}\n </tbody>\n </table>\n </div>\n );\n};\n\nexport default AxiosListComponent;",
"props": null,
"description": null,
"isActive": true,
"dependencies": []
},
{
"name": "EntityListComponent",
"code": "const EntityListComponent = ({\n title = \"Product\"\n}) => {\n return (\n <AxiosListComponent id=\"c_mdljvvmq_fno52v\" title={title} />\n );\n};\n\nexport default EntityListComponent;",
"props": null,
"description": null,
"isActive": true,
"dependencies": ["AxiosListComponent"]
}
] ]
} }

View file

@ -42,6 +42,7 @@ public class SeederDto
public List<ProductSeedDto> Products { get; set; } public List<ProductSeedDto> Products { get; set; }
public List<PaymentMethodSeedDto> PaymentMethods { get; set; } public List<PaymentMethodSeedDto> PaymentMethods { get; set; }
public List<InstallmentOptionSeedDto> InstallmentOptions { get; set; } public List<InstallmentOptionSeedDto> InstallmentOptions { get; set; }
public List<CustomComponentSeedDto> CustomComponents { get; set; }
} }
public class ChartsSeedDto public class ChartsSeedDto
@ -298,3 +299,13 @@ public class InstallmentOptionSeedDto
public string Name { get; set; } // e.g. "Tek Çekim", "2 Taksit" public string Name { get; set; } // e.g. "Tek Çekim", "2 Taksit"
public decimal Commission { get; set; } public decimal Commission { get; set; }
} }
public class CustomComponentSeedDto
{
public string Name { get; set; }
public string Code { get; set; }
public string? Props { get; set; }
public string? Description { get; set; }
public bool IsActive { get; set; }
public List<string> Dependencies { get; set; } = new();
}

View file

@ -13,4 +13,14 @@ public class CustomComponent : FullAuditedEntity<Guid>, IMultiTenant
public string? Description { get; set; } public string? Description { get; set; }
public bool IsActive { get; set; } = true; public bool IsActive { get; set; } = true;
public string? Dependencies { get; set; } // JSON string of component names public string? Dependencies { get; set; } // JSON string of component names
public CustomComponent(string name, string code, string? props, string? description, bool isActive, string? dependencies)
{
Name = name;
Code = code;
Props = props;
Description = description;
IsActive = isActive;
Dependencies = dependencies;
}
} }

View file

@ -73,7 +73,86 @@ public class Program
.UseAutofac() .UseAutofac()
.UseSerilog(); .UseSerilog();
await builder.AddApplicationAsync<PlatformHttpApiHostModule>(); await builder.AddApplicationAsync<PlatformHttpApiHostModule>();
var baseDomain = builder.Configuration["App:BaseDomain"]?.Trim();
var extraOrigins = (builder.Configuration["App:CorsOrigins"] ?? "")
.Split(',', StringSplitOptions.RemoveEmptyEntries | StringSplitOptions.TrimEntries);
// Her ortamda tek policy tanımla; kuralları içeride ayır
builder.Services.AddCors(options =>
{
options.AddPolicy("Dynamic", policy =>
{
policy
.AllowAnyHeader()
.AllowAnyMethod()
.AllowCredentials()
.SetIsOriginAllowed(origin =>
{
if (!Uri.TryCreate(origin, UriKind.Absolute, out var uri))
return false;
var scheme = uri.Scheme.ToLowerInvariant();
var host = uri.Host.ToLowerInvariant();
if (builder.Environment.IsProduction())
{
// PROD: sadece HTTPS + *.baseDomain + (isteğe bağlı) extraOrigins
if (scheme != "https") return false;
if (!string.IsNullOrWhiteSpace(baseDomain))
{
var bd = baseDomain.ToLowerInvariant();
if (host == bd || host.EndsWith("." + bd))
return true;
}
// App:CorsOrigins içindeki tam domainleri de kabul et
foreach (var o in extraOrigins)
{
if (Uri.TryCreate(o, UriKind.Absolute, out var eo)
&& eo.Scheme.Equals("https", StringComparison.OrdinalIgnoreCase)
&& eo.Host.Equals(host, StringComparison.OrdinalIgnoreCase))
{
return true;
}
}
return false;
}
else
{
// DEV/LOCAL: localhost ve dev-* subdomainleri
if (host == "localhost" || host == "127.0.0.1" || host == "[::1]")
return true;
// Örn. dev-*.sozsoft.com gibi bir pattern istiyorsan:
if (!string.IsNullOrWhiteSpace(baseDomain) &&
(host.StartsWith("dev-") && host.EndsWith("." + baseDomain!.ToLowerInvariant())))
return true;
// İstersen http de kabul et (vite genelde http çalışır)
if (scheme == "http" && (host == "localhost" || host == "127.0.0.1"))
return true;
// İsteğe bağlı: extraOrigins developmentta da geçerli olsun dersen:
foreach (var o in extraOrigins)
{
if (Uri.TryCreate(o, UriKind.Absolute, out var eo)
&& eo.Host.Equals(host, StringComparison.OrdinalIgnoreCase))
{
return true;
}
}
return false;
}
});
});
});
var app = builder.Build(); var app = builder.Build();
app.UseCors("Dynamic");
await app.InitializeApplicationAsync(); await app.InitializeApplicationAsync();
await app.RunAsync(); await app.RunAsync();
return 0; return 0;

View file

@ -2,7 +2,7 @@
"App": { "App": {
"SelfUrl": "https://dev-api.sozsoft.com", "SelfUrl": "https://dev-api.sozsoft.com",
"ClientUrl": "https://dev.sozsoft.com", "ClientUrl": "https://dev.sozsoft.com",
"CorsOrigins": "https://sozsoft.com,https://dev.sozsoft.com", "CorsOrigins": "https://dev.sozsoft.com",
"RedirectAllowedUrls": "https://dev.sozsoft.com,https://dev.sozsoft.com/authentication/callback", "RedirectAllowedUrls": "https://dev.sozsoft.com,https://dev.sozsoft.com/authentication/callback",
"AttachmentsPath": "/etc/api/mail-queue/attachments", "AttachmentsPath": "/etc/api/mail-queue/attachments",
"CdnPath": "/etc/api/cdn", "CdnPath": "/etc/api/cdn",

View file

@ -2,7 +2,8 @@
"App": { "App": {
"SelfUrl": "https://api.sozsoft.com", "SelfUrl": "https://api.sozsoft.com",
"ClientUrl": "https://sozsoft.com", "ClientUrl": "https://sozsoft.com",
"CorsOrigins": "https://sozsoft.com,https://sozsoft.com,https://demo.sozsoft.com", "BaseDomain": "sozsoft.com",
"CorsOrigins": "https://sozsoft.com",
"RedirectAllowedUrls": "https://sozsoft.com,https://sozsoft.com/authentication/callback", "RedirectAllowedUrls": "https://sozsoft.com,https://sozsoft.com/authentication/callback",
"AttachmentsPath": "/etc/api/mail-queue/attachments", "AttachmentsPath": "/etc/api/mail-queue/attachments",
"CdnPath": "/etc/api/cdn", "CdnPath": "/etc/api/cdn",

View file

@ -82,7 +82,7 @@ define(['./workbox-54d0af47'], (function (workbox) { 'use strict';
"revision": "3ca0b8505b4bec776b69afdba2768812" "revision": "3ca0b8505b4bec776b69afdba2768812"
}, { }, {
"url": "index.html", "url": "index.html",
"revision": "0.fduoepfh2f" "revision": "0.1u96j36821"
}], {}); }], {});
workbox.cleanupOutdatedCaches(); workbox.cleanupOutdatedCaches();
workbox.registerRoute(new workbox.NavigationRoute(workbox.createHandlerBoundToURL("index.html"), { workbox.registerRoute(new workbox.NavigationRoute(workbox.createHandlerBoundToURL("index.html"), {

154
ui/package-lock.json generated
View file

@ -64,27 +64,21 @@
"@babel/plugin-syntax-dynamic-import": "^7.8.3", "@babel/plugin-syntax-dynamic-import": "^7.8.3",
"@tailwindcss/typography": "^0.5.15", "@tailwindcss/typography": "^0.5.15",
"@types/babel__standalone": "^7.1.9", "@types/babel__standalone": "^7.1.9",
"@types/d3-fetch": "^3.0.2",
"@types/d3-scale": "^4.0.3",
"@types/file-saver": "^2.0.7", "@types/file-saver": "^2.0.7",
"@types/lodash": "^4.14.191", "@types/lodash": "^4.14.191",
"@types/node": "^18.15.5", "@types/node": "^18.15.5",
"@types/qs": "^6.9.7",
"@types/react": "^18.3.18", "@types/react": "^18.3.18",
"@types/react-beautiful-dnd": "^13.1.4",
"@types/react-dom": "^18.3.5", "@types/react-dom": "^18.3.5",
"@types/react-helmet": "^6.1.9", "@types/react-helmet": "^6.1.9",
"@types/react-highlight-words": "^0.16.4", "@types/react-highlight-words": "^0.16.4",
"@types/react-modal": "^3.13.1", "@types/react-modal": "^3.13.1",
"@types/react-portal": "^4.0.4",
"@types/react-scroll": "^1.8.7",
"@types/react-simple-maps": "^3.0.6",
"@types/react-syntax-highlighter": "^15.5.6",
"@types/redux-state-sync": "^3.1.9", "@types/redux-state-sync": "^3.1.9",
"@typescript-eslint/eslint-plugin": "^6.15.0", "@typescript-eslint/eslint-plugin": "^6.15.0",
"@typescript-eslint/parser": "^6.15.0", "@typescript-eslint/parser": "^6.15.0",
"@vitejs/plugin-react": "^4.2.1", "@vitejs/plugin-react": "^4.2.1",
"autoprefixer": "^10.4.14", "autoprefixer": "^10.4.14",
"browserslist": "^4.25.2",
"caniuse-lite": "^1.0.30001734",
"cross-env": "^7.0.3", "cross-env": "^7.0.3",
"cssnano": "^6.0.1", "cssnano": "^6.0.1",
"dotenv": "^16.0.3", "dotenv": "^16.0.3",
@ -2458,67 +2452,6 @@
"@babel/types": "^7.20.7" "@babel/types": "^7.20.7"
} }
}, },
"node_modules/@types/d3-color": {
"version": "2.0.3",
"dev": true,
"license": "MIT"
},
"node_modules/@types/d3-dsv": {
"version": "3.0.1",
"dev": true,
"license": "MIT"
},
"node_modules/@types/d3-fetch": {
"version": "3.0.2",
"dev": true,
"license": "MIT",
"dependencies": {
"@types/d3-dsv": "*"
}
},
"node_modules/@types/d3-geo": {
"version": "2.0.4",
"dev": true,
"license": "MIT",
"dependencies": {
"@types/geojson": "*"
}
},
"node_modules/@types/d3-interpolate": {
"version": "2.0.2",
"dev": true,
"license": "MIT",
"dependencies": {
"@types/d3-color": "^2"
}
},
"node_modules/@types/d3-scale": {
"version": "4.0.3",
"dev": true,
"license": "MIT",
"dependencies": {
"@types/d3-time": "*"
}
},
"node_modules/@types/d3-selection": {
"version": "2.0.1",
"dev": true,
"license": "MIT"
},
"node_modules/@types/d3-time": {
"version": "3.0.0",
"dev": true,
"license": "MIT"
},
"node_modules/@types/d3-zoom": {
"version": "2.0.4",
"dev": true,
"license": "MIT",
"dependencies": {
"@types/d3-interpolate": "^2",
"@types/d3-selection": "^2"
}
},
"node_modules/@types/estree": { "node_modules/@types/estree": {
"version": "1.0.6", "version": "1.0.6",
"dev": true, "dev": true,
@ -2529,11 +2462,6 @@
"dev": true, "dev": true,
"license": "MIT" "license": "MIT"
}, },
"node_modules/@types/geojson": {
"version": "7946.0.10",
"dev": true,
"license": "MIT"
},
"node_modules/@types/hoist-non-react-statics": { "node_modules/@types/hoist-non-react-statics": {
"version": "3.3.1", "version": "3.3.1",
"license": "MIT", "license": "MIT",
@ -2570,11 +2498,6 @@
"version": "15.7.13", "version": "15.7.13",
"license": "MIT" "license": "MIT"
}, },
"node_modules/@types/qs": {
"version": "6.9.7",
"dev": true,
"license": "MIT"
},
"node_modules/@types/quill": { "node_modules/@types/quill": {
"version": "1.3.10", "version": "1.3.10",
"license": "MIT", "license": "MIT",
@ -2599,14 +2522,6 @@
"csstype": "^3.0.2" "csstype": "^3.0.2"
} }
}, },
"node_modules/@types/react-beautiful-dnd": {
"version": "13.1.4",
"dev": true,
"license": "MIT",
"dependencies": {
"@types/react": "*"
}
},
"node_modules/@types/react-dom": { "node_modules/@types/react-dom": {
"version": "18.3.5", "version": "18.3.5",
"devOptional": true, "devOptional": true,
@ -2639,41 +2554,6 @@
"@types/react": "*" "@types/react": "*"
} }
}, },
"node_modules/@types/react-portal": {
"version": "4.0.4",
"dev": true,
"license": "MIT",
"dependencies": {
"@types/react": "*"
}
},
"node_modules/@types/react-scroll": {
"version": "1.8.7",
"dev": true,
"license": "MIT",
"dependencies": {
"@types/react": "*"
}
},
"node_modules/@types/react-simple-maps": {
"version": "3.0.6",
"dev": true,
"license": "MIT",
"dependencies": {
"@types/d3-geo": "^2",
"@types/d3-zoom": "^2",
"@types/geojson": "*",
"@types/react": "*"
}
},
"node_modules/@types/react-syntax-highlighter": {
"version": "15.5.7",
"dev": true,
"license": "MIT",
"dependencies": {
"@types/react": "*"
}
},
"node_modules/@types/react-transition-group": { "node_modules/@types/react-transition-group": {
"version": "4.4.11", "version": "4.4.11",
"license": "MIT", "license": "MIT",
@ -3465,7 +3345,9 @@
} }
}, },
"node_modules/browserslist": { "node_modules/browserslist": {
"version": "4.24.3", "version": "4.25.2",
"resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.25.2.tgz",
"integrity": "sha512-0si2SJK3ooGzIawRu61ZdPCO1IncZwS8IzuX73sPZsXW6EQ/w/DAfPyKI8l1ETTCr2MnvqWitmlCUxgdul45jA==",
"funding": [ "funding": [
{ {
"type": "opencollective", "type": "opencollective",
@ -3480,12 +3362,11 @@
"url": "https://github.com/sponsors/ai" "url": "https://github.com/sponsors/ai"
} }
], ],
"license": "MIT",
"dependencies": { "dependencies": {
"caniuse-lite": "^1.0.30001688", "caniuse-lite": "^1.0.30001733",
"electron-to-chromium": "^1.5.73", "electron-to-chromium": "^1.5.199",
"node-releases": "^2.0.19", "node-releases": "^2.0.19",
"update-browserslist-db": "^1.1.1" "update-browserslist-db": "^1.1.3"
}, },
"bin": { "bin": {
"browserslist": "cli.js" "browserslist": "cli.js"
@ -3604,7 +3485,9 @@
} }
}, },
"node_modules/caniuse-lite": { "node_modules/caniuse-lite": {
"version": "1.0.30001690", "version": "1.0.30001734",
"resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001734.tgz",
"integrity": "sha512-uhE1Ye5vgqju6OI71HTQqcBCZrvHugk0MjLak7Q+HfoBgoq5Bi+5YnwjP4fjDgrtYr/l8MVRBvzz9dPD4KyK0A==",
"funding": [ "funding": [
{ {
"type": "opencollective", "type": "opencollective",
@ -3618,8 +3501,7 @@
"type": "github", "type": "github",
"url": "https://github.com/sponsors/ai" "url": "https://github.com/sponsors/ai"
} }
], ]
"license": "CC-BY-4.0"
}, },
"node_modules/canvg": { "node_modules/canvg": {
"version": "3.0.11", "version": "3.0.11",
@ -4501,8 +4383,9 @@
} }
}, },
"node_modules/electron-to-chromium": { "node_modules/electron-to-chromium": {
"version": "1.5.76", "version": "1.5.200",
"license": "ISC" "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.200.tgz",
"integrity": "sha512-rFCxROw7aOe4uPTfIAx+rXv9cEcGx+buAF4npnhtTqCJk5KDFRnh3+KYj7rdVh6lsFt5/aPs+Irj9rZ33WMA7w=="
}, },
"node_modules/emoji-regex": { "node_modules/emoji-regex": {
"version": "9.2.2", "version": "9.2.2",
@ -11004,7 +10887,9 @@
} }
}, },
"node_modules/update-browserslist-db": { "node_modules/update-browserslist-db": {
"version": "1.1.1", "version": "1.1.3",
"resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.1.3.tgz",
"integrity": "sha512-UxhIZQ+QInVdunkDAaiazvvT/+fXL5Osr0JZlJulepYu6Jd7qJtDZjlur0emRlT71EN3ScPoE7gvsuIKKNavKw==",
"funding": [ "funding": [
{ {
"type": "opencollective", "type": "opencollective",
@ -11019,10 +10904,9 @@
"url": "https://github.com/sponsors/ai" "url": "https://github.com/sponsors/ai"
} }
], ],
"license": "MIT",
"dependencies": { "dependencies": {
"escalade": "^3.2.0", "escalade": "^3.2.0",
"picocolors": "^1.1.0" "picocolors": "^1.1.1"
}, },
"bin": { "bin": {
"update-browserslist-db": "cli.js" "update-browserslist-db": "cli.js"

View file

@ -20,7 +20,6 @@
"@babel/standalone": "^7.28.0", "@babel/standalone": "^7.28.0",
"@babel/traverse": "^7.28.0", "@babel/traverse": "^7.28.0",
"@babel/types": "^7.28.0", "@babel/types": "^7.28.0",
"@monaco-editor/react": "^4.6.0",
"@dnd-kit/core": "^6.1.0", "@dnd-kit/core": "^6.1.0",
"@dnd-kit/sortable": "^8.0.0", "@dnd-kit/sortable": "^8.0.0",
"@dnd-kit/utilities": "^3.2.2", "@dnd-kit/utilities": "^3.2.2",
@ -30,6 +29,7 @@
"@fullcalendar/react": "^6.1.8", "@fullcalendar/react": "^6.1.8",
"@fullcalendar/timegrid": "^6.1.8", "@fullcalendar/timegrid": "^6.1.8",
"@marsidev/react-turnstile": "^0.2.1", "@marsidev/react-turnstile": "^0.2.1",
"@monaco-editor/react": "^4.6.0",
"@tanstack/react-query": "^4.29.19", "@tanstack/react-query": "^4.29.19",
"@tanstack/react-table": "^8.8.5", "@tanstack/react-table": "^8.8.5",
"axios": "^1.7.9", "axios": "^1.7.9",
@ -68,30 +68,24 @@
"yup": "^1.6.1" "yup": "^1.6.1"
}, },
"devDependencies": { "devDependencies": {
"@types/babel__standalone": "^7.1.9",
"@babel/plugin-syntax-dynamic-import": "^7.8.3", "@babel/plugin-syntax-dynamic-import": "^7.8.3",
"@tailwindcss/typography": "^0.5.15", "@tailwindcss/typography": "^0.5.15",
"@types/d3-fetch": "^3.0.2", "@types/babel__standalone": "^7.1.9",
"@types/d3-scale": "^4.0.3",
"@types/file-saver": "^2.0.7", "@types/file-saver": "^2.0.7",
"@types/lodash": "^4.14.191", "@types/lodash": "^4.14.191",
"@types/node": "^18.15.5", "@types/node": "^18.15.5",
"@types/qs": "^6.9.7",
"@types/react": "^18.3.18", "@types/react": "^18.3.18",
"@types/react-beautiful-dnd": "^13.1.4",
"@types/react-dom": "^18.3.5", "@types/react-dom": "^18.3.5",
"@types/react-helmet": "^6.1.9", "@types/react-helmet": "^6.1.9",
"@types/react-highlight-words": "^0.16.4", "@types/react-highlight-words": "^0.16.4",
"@types/react-modal": "^3.13.1", "@types/react-modal": "^3.13.1",
"@types/react-portal": "^4.0.4",
"@types/react-scroll": "^1.8.7",
"@types/react-simple-maps": "^3.0.6",
"@types/react-syntax-highlighter": "^15.5.6",
"@types/redux-state-sync": "^3.1.9", "@types/redux-state-sync": "^3.1.9",
"@typescript-eslint/eslint-plugin": "^6.15.0", "@typescript-eslint/eslint-plugin": "^6.15.0",
"@typescript-eslint/parser": "^6.15.0", "@typescript-eslint/parser": "^6.15.0",
"@vitejs/plugin-react": "^4.2.1", "@vitejs/plugin-react": "^4.2.1",
"autoprefixer": "^10.4.14", "autoprefixer": "^10.4.14",
"browserslist": "^4.25.2",
"caniuse-lite": "^1.0.30001734",
"cross-env": "^7.0.3", "cross-env": "^7.0.3",
"cssnano": "^6.0.1", "cssnano": "^6.0.1",
"dotenv": "^16.0.3", "dotenv": "^16.0.3",

View file

@ -1,8 +1,8 @@
import React, { useState, useEffect, useRef } from 'react' import React, { useState, useEffect, useRef } from 'react'
import Editor from '@monaco-editor/react' import Editor from '@monaco-editor/react'
import * as Icons from 'lucide-react'
import { ComponentDefinition } from '../../@types/componentInfo' import { ComponentDefinition } from '../../@types/componentInfo'
import { generateSingleComponentJSX, generateUniqueId } from '@/utils/codeParser' import { generateSingleComponentJSX, generateUniqueId } from '@/utils/codeParser'
import { Check, Code, Loader, MousePointer, Save, Settings, X } from 'lucide-react'
interface CodeEditorProps { interface CodeEditorProps {
code: string code: string
@ -427,9 +427,9 @@ export const CodeEditor: React.FC<CodeEditorProps> = ({
className="px-3 py-2 bg-gray-700 text-gray-300 rounded-lg text-xs font-medium hover:bg-gray-600 transition-colors flex items-center gap-2 disabled:opacity-50" className="px-3 py-2 bg-gray-700 text-gray-300 rounded-lg text-xs font-medium hover:bg-gray-600 transition-colors flex items-center gap-2 disabled:opacity-50"
> >
{isFormatting ? ( {isFormatting ? (
<Icons.Loader className="w-4 h-4 animate-spin" /> <Loader className="w-4 h-4 animate-spin" />
) : ( ) : (
<Icons.Code className="w-4 h-4" /> <Code className="w-4 h-4" />
)} )}
Formatla Formatla
</button> </button>
@ -442,7 +442,7 @@ export const CodeEditor: React.FC<CodeEditorProps> = ({
: 'bg-gray-700 text-gray-300 hover:bg-gray-600' : 'bg-gray-700 text-gray-300 hover:bg-gray-600'
}`} }`}
> >
<Icons.Settings className="w-4 h-4" /> <Settings className="w-4 h-4" />
Ayarlar Ayarlar
</button> </button>
@ -450,7 +450,7 @@ export const CodeEditor: React.FC<CodeEditorProps> = ({
onClick={handleResetChanges} onClick={handleResetChanges}
className="px-3 py-2 bg-red-600 text-white rounded-lg text-xs font-medium hover:bg-red-700 transition-colors flex items-center gap-2" className="px-3 py-2 bg-red-600 text-white rounded-lg text-xs font-medium hover:bg-red-700 transition-colors flex items-center gap-2"
> >
<Icons.X className="w-4 h-4" /> <X className="w-4 h-4" />
Sıfırla Sıfırla
</button> </button>
@ -458,7 +458,7 @@ export const CodeEditor: React.FC<CodeEditorProps> = ({
onClick={handleApplyChanges} onClick={handleApplyChanges}
className="px-3 py-2 bg-green-600 text-white rounded-lg text-xs font-medium hover:bg-green-700 transition-colors flex items-center gap-2" className="px-3 py-2 bg-green-600 text-white rounded-lg text-xs font-medium hover:bg-green-700 transition-colors flex items-center gap-2"
> >
<Icons.Check className="w-4 h-4" /> <Check className="w-4 h-4" />
Uygula Uygula
</button> </button>
</div> </div>
@ -467,7 +467,7 @@ export const CodeEditor: React.FC<CodeEditorProps> = ({
onClick={onComponentSave} onClick={onComponentSave}
className="flex items-center gap-2 bg-yellow-600 text-white px-4 py-2 rounded-lg hover:bg-yellow-700 transition-colors disabled:opacity-50 disabled:cursor-not-allowed shadow-sm" className="flex items-center gap-2 bg-yellow-600 text-white px-4 py-2 rounded-lg hover:bg-yellow-700 transition-colors disabled:opacity-50 disabled:cursor-not-allowed shadow-sm"
> >
<Icons.Save className="w-4 h-4" /> <Save className="w-4 h-4" />
Kaydet Kaydet
</button> </button>
</div> </div>
@ -622,12 +622,12 @@ export const CodeEditor: React.FC<CodeEditorProps> = ({
{hasChanges && <span className="text-orange-400"> Kaydedilmemiş değişiklikler</span>} {hasChanges && <span className="text-orange-400"> Kaydedilmemiş değişiklikler</span>}
{showSuccessMessage && ( {showSuccessMessage && (
<span className="text-green-400 flex items-center gap-1"> <span className="text-green-400 flex items-center gap-1">
<Icons.Check className="w-4 h-4" /> <Check className="w-4 h-4" />
</span> </span>
)} )}
{isDragOver && ( {isDragOver && (
<span className="text-blue-400 flex items-center gap-1"> <span className="text-blue-400 flex items-center gap-1">
<Icons.MousePointer className="w-4 h-4" /> <MousePointer className="w-4 h-4" />
Bileşeni bırakmaya hazır Bileşeni bırakmaya hazır
</span> </span>
)} )}

View file

@ -1,5 +1,5 @@
import React, { useMemo, useState } from "react"; import React, { useMemo, useState } from "react";
import { Search } from "lucide-react"; import { Search, Square } from "lucide-react";
import * as Icons from "lucide-react"; import * as Icons from "lucide-react";
import { ComponentDefinition, HookInfo, PropertyInfo } from "../../@types/componentInfo"; import { ComponentDefinition, HookInfo, PropertyInfo } from "../../@types/componentInfo";
import { getAllComponentDefinitions } from "./data/componentDefinitions"; import { getAllComponentDefinitions } from "./data/componentDefinitions";
@ -88,7 +88,7 @@ export const ComponentLibrary: React.FC<ComponentLibraryProps> = ({
const getIcon = (iconName: string) => { const getIcon = (iconName: string) => {
const IconComponent = (Icons as any)[iconName]; const IconComponent = (Icons as any)[iconName];
return IconComponent || Icons.Square; return IconComponent || Square;
}; };
return ( return (

View file

@ -12,7 +12,7 @@ const AccessDenied = () => {
return ( return (
<Container className="h-full"> <Container className="h-full">
<div className="h-full flex flex-col items-center justify-center"> <div className="h-full flex flex-col items-center justify-center p-24">
<DoubleSidedImage <DoubleSidedImage
src="/img/others/img-2.png" src="/img/others/img-2.png"
darkModeSrc="/img/others/img-2-dark.png" darkModeSrc="/img/others/img-2-dark.png"

View file

@ -1,7 +1,6 @@
import React, { useEffect, useState } from 'react' import React, { useEffect, useState } from 'react'
import { useSortable } from '@dnd-kit/sortable' import { useSortable } from '@dnd-kit/sortable'
import { CSS } from '@dnd-kit/utilities' import { CSS } from '@dnd-kit/utilities'
import * as Icons from 'lucide-react'
import { MenuItem } from '@/@types/menu' import { MenuItem } from '@/@types/menu'
import { useLocalization } from '@/utils/hooks/useLocalization' import { useLocalization } from '@/utils/hooks/useLocalization'
import { MenuService } from '@/services/menu.service' import { MenuService } from '@/services/menu.service'
@ -24,6 +23,7 @@ import { SelectBoxOption } from '@/shared/types'
import { getPermissionsList } from '@/proxy/admin/identity.service' import { getPermissionsList } from '@/proxy/admin/identity.service'
import { PermissionDefinitionRecord } from '@/proxy/admin' import { PermissionDefinitionRecord } from '@/proxy/admin'
import * as Yup from 'yup' import * as Yup from 'yup'
import { ExternalLink, FileText, Plus, Trash2 } from 'lucide-react'
interface MenuItemComponentProps { interface MenuItemComponentProps {
item: MenuItem item: MenuItem
@ -72,11 +72,6 @@ export const MenuItemComponent: React.FC<MenuItemComponentProps> = ({
opacity: isDragging ? 0.5 : 1, opacity: isDragging ? 0.5 : 1,
} }
const getIcon = (iconName: string) => {
const IconComponent = (Icons as any)[iconName]
return IconComponent ? <IconComponent size={16} /> : <Icons.FileText size={16} />
}
const [isExpanded, setIsExpanded] = useState(true) const [isExpanded, setIsExpanded] = useState(true)
const [isModalOpen, setIsModalOpen] = useState(false) const [isModalOpen, setIsModalOpen] = useState(false)
const [formData, setFormData] = useState<Partial<MenuDto>>({ const [formData, setFormData] = useState<Partial<MenuDto>>({
@ -147,10 +142,10 @@ export const MenuItemComponent: React.FC<MenuItemComponentProps> = ({
{isDesignMode && ( {isDesignMode && (
<div className="flex gap-2 items-center mr-2"> <div className="flex gap-2 items-center mr-2">
<button onClick={() => setIsModalOpen(true)} title="New Item"> <button onClick={() => setIsModalOpen(true)} title="New Item">
<Icons.Plus size={16} className="text-green-600 hover:text-green-800" /> <Plus size={16} className="text-green-600 hover:text-green-800" />
</button> </button>
<button onClick={handleDelete} title="Delete Item"> <button onClick={handleDelete} title="Delete Item">
<Icons.Trash2 size={16} className="text-red-600 hover:text-red-800" /> <Trash2 size={16} className="text-red-600 hover:text-red-800" />
</button> </button>
</div> </div>
)} )}
@ -169,7 +164,7 @@ export const MenuItemComponent: React.FC<MenuItemComponentProps> = ({
{translate('::' + item.displayName)} {translate('::' + item.displayName)}
</span> </span>
{item.url && <Icons.ExternalLink size={12} className="flex-shrink-0 text-gray-400" />} {item.url && <ExternalLink size={12} className="flex-shrink-0 text-gray-400" />}
</div> </div>
<div className="flex items-center gap-2 flex-shrink-0"> <div className="flex items-center gap-2 flex-shrink-0">

View file

@ -1,8 +1,8 @@
import React, { useState } from 'react' import React, { useState } from 'react'
import * as Icons from 'lucide-react'
import { SortableMenuTree } from './SortableMenuTree' import { SortableMenuTree } from './SortableMenuTree'
import { MenuItem } from '@/@types/menu' import { MenuItem } from '@/@types/menu'
import { useMenuData } from '@/utils/hooks/useMenuData' import { useMenuData } from '@/utils/hooks/useMenuData'
import { AlertCircle, Loader2, Menu, Save } from 'lucide-react'
export const MenuManager = () => { export const MenuManager = () => {
const { menuItems, setMenuItems, loading, error, refetch, saveMenuData } = useMenuData() const { menuItems, setMenuItems, loading, error, refetch, saveMenuData } = useMenuData()
@ -48,7 +48,7 @@ export const MenuManager = () => {
return ( return (
<div className="min-h-screen bg-gray-50 flex items-center justify-center"> <div className="min-h-screen bg-gray-50 flex items-center justify-center">
<div className="flex items-center gap-3 text-gray-600"> <div className="flex items-center gap-3 text-gray-600">
<Icons.Loader2 size={24} className="animate-spin" /> <Loader2 size={24} className="animate-spin" />
<span className="text-lg">Loading menu configuration...</span> <span className="text-lg">Loading menu configuration...</span>
</div> </div>
</div> </div>
@ -60,7 +60,7 @@ export const MenuManager = () => {
<div className="min-h-screen bg-gray-50 flex items-center justify-center"> <div className="min-h-screen bg-gray-50 flex items-center justify-center">
<div className="bg-white p-8 rounded-lg shadow-md max-w-md w-full mx-4"> <div className="bg-white p-8 rounded-lg shadow-md max-w-md w-full mx-4">
<div className="flex items-center gap-3 text-red-600 mb-4"> <div className="flex items-center gap-3 text-red-600 mb-4">
<Icons.AlertCircle size={24} /> <AlertCircle size={24} />
<h2 className="text-lg font-semibold">Error Loading Menu</h2> <h2 className="text-lg font-semibold">Error Loading Menu</h2>
</div> </div>
<p className="text-gray-600 mb-6">{error}</p> <p className="text-gray-600 mb-6">{error}</p>
@ -82,7 +82,7 @@ export const MenuManager = () => {
<div className="flex items-center justify-between mb-6 flex-wrap gap-4"> <div className="flex items-center justify-between mb-6 flex-wrap gap-4">
{/* Sol kısım: Başlık */} {/* Sol kısım: Başlık */}
<div className="flex items-center gap-2"> <div className="flex items-center gap-2">
<Icons.Menu size={20} className="text-gray-600" /> <Menu size={20} className="text-gray-600" />
<h2 className="text-lg font-semibold text-gray-900">Menu Manager</h2> <h2 className="text-lg font-semibold text-gray-900">Menu Manager</h2>
<span className="text-sm text-gray-500">({menuItems.length} root items)</span> <span className="text-sm text-gray-500">({menuItems.length} root items)</span>
</div> </div>
@ -123,12 +123,12 @@ export const MenuManager = () => {
> >
{isSaving ? ( {isSaving ? (
<> <>
<Icons.Loader2 size={16} className="animate-spin" /> <Loader2 size={16} className="animate-spin" />
Saving... Saving...
</> </>
) : ( ) : (
<> <>
<Icons.Save size={16} /> <Save size={16} />
Save Changes Save Changes
</> </>
)} )}
@ -146,7 +146,7 @@ export const MenuManager = () => {
/> />
) : ( ) : (
<div className="text-center py-12 text-gray-500"> <div className="text-center py-12 text-gray-500">
<Icons.Menu size={24} className="mx-auto mb-4 text-gray-300" /> <Menu size={24} className="mx-auto mb-4 text-gray-300" />
<p className="text-lg">No menu items found</p> <p className="text-lg">No menu items found</p>
<p className="text-sm">Try refreshing the page or contact your administrator</p> <p className="text-sm">Try refreshing the page or contact your administrator</p>
</div> </div>

View file

@ -19,7 +19,7 @@ export default defineConfig({
enabled: true, enabled: true,
}, },
workbox: { workbox: {
maximumFileSizeToCacheInBytes: 10000000, maximumFileSizeToCacheInBytes: 10 * 1024 * 1024, // 10 MB sınır
}, },
manifest: { manifest: {
name: 'Platform', name: 'Platform',
@ -61,7 +61,7 @@ export default defineConfig({
host: '0.0.0.0', host: '0.0.0.0',
port: 80, port: 80,
open: false, open: false,
allowedHosts: ['dev.sozsoft.com', 'sozsoft.com', 'localhost', 'demo.sozsoft.com'], allowedHosts: ['localhost', 'sozsoft.com', 'dev.sozsoft.com', 'demo.sozsoft.com'],
}, },
define: { define: {
'process.env': {}, 'process.env': {},