Service Application Service

This commit is contained in:
Sedat ÖZTÜRK 2025-08-20 10:31:56 +03:00
parent d891ae3f85
commit 7e3809f7bb
14 changed files with 7192 additions and 381 deletions

View file

@ -0,0 +1,20 @@
using System;
using System.Collections.Generic;
using Volo.Abp.Application.Dtos;
namespace Kurs.Platform.Services;
public class ServiceDto : FullAuditedEntityDto<Guid>
{
public string? Icon { get; set; }
public string Title { get; set; }
public string? Description { get; set; }
public string Type { get; set; }
public List<ServiceFeatureDto> Features { get; set; } = new();
}
public class ServiceFeatureDto : EntityDto<Guid>
{
public string Name { get; set; }
}

View file

@ -17,5 +17,4 @@ public class DataSourceAppService : CrudAppService<
public DataSourceAppService(IRepository<DataSource, Guid> repo) : base(repo) public DataSourceAppService(IRepository<DataSource, Guid> repo) : base(repo)
{ {
} }
} }

View file

@ -0,0 +1,26 @@
using System;
using System.Collections.Generic;
using System.Threading.Tasks;
using Kurs.Platform.Entities;
using Kurs.Platform.Services;
using Volo.Abp.Domain.Repositories;
namespace Kurs.Platform.Dashboard;
public class ServiceAppService : PlatformAppService
{
private readonly IRepository<Service, Guid> serviceRepository;
public ServiceAppService(
IRepository<Service, Guid> serviceRepository)
{
this.serviceRepository = serviceRepository;
}
public async Task<List<ServiceDto>> GetListAsync()
{
var entity = await serviceRepository.GetListAsync();
return ObjectMapper.Map<List<Service>, List<ServiceDto>>(entity);
}
}

View file

@ -0,0 +1,14 @@
using AutoMapper;
using Kurs.Platform.Entities;
using Kurs.Platform.Services;
namespace Kurs.Platform;
public class ServiceAutoMapperProfile : Profile
{
public ServiceAutoMapperProfile()
{
CreateMap<Service, ServiceDto>();
CreateMap<ServiceFeature, ServiceFeatureDto>();
}
}

View file

@ -278,34 +278,41 @@ public class PlatformDataSeeder : IDataSeedContributor, ITransientDependency
foreach (var item in items.LanguageTexts) foreach (var item in items.LanguageTexts)
{ {
if (!keys.Any(a => a.Key == item.Key)) try
{ {
await _languageKey.InsertAsync(new() if (!keys.Any(a => a.Key == item.Key))
{ {
Key = item.Key, await _languageKey.InsertAsync(new()
ResourceName = item.ResourceName, {
}); Key = item.Key,
} ResourceName = item.ResourceName,
if (!texts.Any(a => a.CultureName == "en" && a.Key == item.Key)) });
{ }
await _languagesText.InsertAsync(new() if (!texts.Any(a => a.CultureName == "en" && a.Key == item.Key))
{
await _languagesText.InsertAsync(new()
{
CultureName = "en",
Key = item.Key,
Value = item.En,
ResourceName = item.ResourceName,
});
}
if (!texts.Any(a => a.CultureName == "tr" && a.Key == item.Key))
{ {
CultureName = "en",
Key = item.Key,
Value = item.En,
ResourceName = item.ResourceName,
});
}
if (!texts.Any(a => a.CultureName == "tr" && a.Key == item.Key))
{
await _languagesText.InsertAsync(new() await _languagesText.InsertAsync(new()
{ {
CultureName = "tr", CultureName = "tr",
Key = item.Key, Key = item.Key,
Value = item.Tr, Value = item.Tr,
ResourceName = item.ResourceName, ResourceName = item.ResourceName,
}); });
}
}
catch (Exception ex)
{
throw new Exception($"Hata veren Kod:' ResourceName='{item.ResourceName}', Key='{item.Key}'.");
} }
} }

View file

@ -3461,18 +3461,14 @@
"path": "/admin/menuManager", "path": "/admin/menuManager",
"componentPath": "@/views/menu/MenuManager", "componentPath": "@/views/menu/MenuManager",
"routeType": "protected", "routeType": "protected",
"authority": [ "authority": ["App.Menus.Manager"]
"App.Menus.Manager"
]
}, },
{ {
"key": "admin.listFormManagement.wizard", "key": "admin.listFormManagement.wizard",
"path": "/admin/listform/wizard", "path": "/admin/listform/wizard",
"componentPath": "@/views/admin/listForm/Wizard", "componentPath": "@/views/admin/listForm/Wizard",
"routeType": "protected", "routeType": "protected",
"authority": [ "authority": ["App.Listforms.Wizard"]
"App.Listforms.Wizard"
]
}, },
{ {
"key": "admin.listFormManagement.edit", "key": "admin.listFormManagement.edit",
@ -3493,18 +3489,14 @@
"path": "/admin/forumManagement", "path": "/admin/forumManagement",
"componentPath": "@/views/forum/Management", "componentPath": "@/views/forum/Management",
"routeType": "protected", "routeType": "protected",
"authority": [ "authority": ["App.ForumManagement"]
"App.ForumManagement"
]
}, },
{ {
"key": "admin.ai", "key": "admin.ai",
"path": "/admin/ai", "path": "/admin/ai",
"componentPath": "@/views/ai/Assistant", "componentPath": "@/views/ai/Assistant",
"routeType": "protected", "routeType": "protected",
"authority": [ "authority": ["Abp.Identity.Ai"]
"Abp.Identity.Ai"
]
}, },
{ {
"key": "admin.profile.general", "key": "admin.profile.general",
@ -3546,36 +3538,28 @@
"path": "/admin/settings", "path": "/admin/settings",
"componentPath": "@/views/settings/Settings", "componentPath": "@/views/settings/Settings",
"routeType": "protected", "routeType": "protected",
"authority": [ "authority": ["App.Setting"]
"App.Setting"
]
}, },
{ {
"key": "admin.identity.user.detail", "key": "admin.identity.user.detail",
"path": "/admin/users/detail/:userId", "path": "/admin/users/detail/:userId",
"componentPath": "@/views/admin/user-management/Details", "componentPath": "@/views/admin/user-management/Details",
"routeType": "protected", "routeType": "protected",
"authority": [ "authority": ["AbpIdentity.Users.Update"]
"AbpIdentity.Users.Update"
]
}, },
{ {
"key": "admin.identity.ous", "key": "admin.identity.ous",
"path": "/admin/ous", "path": "/admin/ous",
"componentPath": "@/views/admin/organization-unit/OrganizationUnits", "componentPath": "@/views/admin/organization-unit/OrganizationUnits",
"routeType": "protected", "routeType": "protected",
"authority": [ "authority": ["Abp.Identity.OrganizationUnits"]
"Abp.Identity.OrganizationUnits"
]
}, },
{ {
"key": "admin.forum", "key": "admin.forum",
"path": "/admin/forum", "path": "/admin/forum",
"componentPath": "@/views/forum/Forum", "componentPath": "@/views/forum/Forum",
"routeType": "protected", "routeType": "protected",
"authority": [ "authority": ["App.ForumManagement.Publish"]
"App.ForumManagement.Publish"
]
}, },
{ {
"key": "admin.list", "key": "admin.list",
@ -3624,108 +3608,84 @@
"path": "/admin/developerkit", "path": "/admin/developerkit",
"componentPath": "@/views/developerKit/DashboardPage", "componentPath": "@/views/developerKit/DashboardPage",
"routeType": "protected", "routeType": "protected",
"authority": [ "authority": ["App.DeveloperKit"]
"App.DeveloperKit"
]
}, },
{ {
"key": "admin.developerkit.entities", "key": "admin.developerkit.entities",
"path": "/admin/developerkit/entities", "path": "/admin/developerkit/entities",
"componentPath": "@/views/developerKit/EntityPage", "componentPath": "@/views/developerKit/EntityPage",
"routeType": "protected", "routeType": "protected",
"authority": [ "authority": ["App.DeveloperKit.Entity"]
"App.DeveloperKit.Entity"
]
}, },
{ {
"key": "admin.developerkit.entities.new", "key": "admin.developerkit.entities.new",
"path": "/admin/developerkit/entities/new", "path": "/admin/developerkit/entities/new",
"componentPath": "@/views/developerKit/EntityDetailPage", "componentPath": "@/views/developerKit/EntityDetailPage",
"routeType": "protected", "routeType": "protected",
"authority": [ "authority": ["App.DeveloperKit.Entity"]
"App.DeveloperKit.Entity"
]
}, },
{ {
"key": "admin.developerkit.entities.edit", "key": "admin.developerkit.entities.edit",
"path": "/admin/developerkit/entities/edit/:id", "path": "/admin/developerkit/entities/edit/:id",
"componentPath": "@/views/developerKit/EntityDetailPage", "componentPath": "@/views/developerKit/EntityDetailPage",
"routeType": "protected", "routeType": "protected",
"authority": [ "authority": ["App.DeveloperKit.Entity"]
"App.DeveloperKit.Entity"
]
}, },
{ {
"key": "admin.developerkit.migrations", "key": "admin.developerkit.migrations",
"path": "/admin/developerkit/migrations", "path": "/admin/developerkit/migrations",
"componentPath": "@/views/developerKit/MigrationPage", "componentPath": "@/views/developerKit/MigrationPage",
"routeType": "protected", "routeType": "protected",
"authority": [ "authority": ["App.DeveloperKit.Migrations"]
"App.DeveloperKit.Migrations"
]
}, },
{ {
"key": "admin.developerkit.endpoints", "key": "admin.developerkit.endpoints",
"path": "/admin/developerkit/endpoints", "path": "/admin/developerkit/endpoints",
"componentPath": "@/views/developerKit/EndpointPage", "componentPath": "@/views/developerKit/EndpointPage",
"routeType": "protected", "routeType": "protected",
"authority": [ "authority": ["App.DeveloperKit.Endpoints"]
"App.DeveloperKit.Endpoints"
]
}, },
{ {
"key": "admin.developerkit.components", "key": "admin.developerkit.components",
"path": "/admin/developerkit/components", "path": "/admin/developerkit/components",
"componentPath": "@/views/developerKit/ComponentPage", "componentPath": "@/views/developerKit/ComponentPage",
"routeType": "protected", "routeType": "protected",
"authority": [ "authority": ["App.DeveloperKit.Components"]
"App.DeveloperKit.Components"
]
}, },
{ {
"key": "admin.developerkit.components.new", "key": "admin.developerkit.components.new",
"path": "/admin/developerkit/components/new", "path": "/admin/developerkit/components/new",
"componentPath": "@/views/developerKit/ComponentDetailPage", "componentPath": "@/views/developerKit/ComponentDetailPage",
"routeType": "protected", "routeType": "protected",
"authority": [ "authority": ["App.DeveloperKit.Components"]
"App.DeveloperKit.Components"
]
}, },
{ {
"key": "admin.developerkit.components.view", "key": "admin.developerkit.components.view",
"path": "/admin/developerkit/components/view/:id", "path": "/admin/developerkit/components/view/:id",
"componentPath": "@/views/developerKit/ComponentDetailPage", "componentPath": "@/views/developerKit/ComponentDetailPage",
"routeType": "protected", "routeType": "protected",
"authority": [ "authority": ["App.DeveloperKit.Components"]
"App.DeveloperKit.Components"
]
}, },
{ {
"key": "admin.developerkit.components.edit", "key": "admin.developerkit.components.edit",
"path": "/admin/developerkit/components/edit/:id", "path": "/admin/developerkit/components/edit/:id",
"componentPath": "@/views/developerKit/CodePage", "componentPath": "@/views/developerKit/CodePage",
"routeType": "protected", "routeType": "protected",
"authority": [ "authority": ["App.DeveloperKit.Components"]
"App.DeveloperKit.Components"
]
}, },
{ {
"key": "admin.reportManagement", "key": "admin.reportManagement",
"path": "/admin/reports/management", "path": "/admin/reports/management",
"componentPath": "@/views/report/DashboardPage", "componentPath": "@/views/report/DashboardPage",
"routeType": "protected", "routeType": "protected",
"authority": [ "authority": ["App.Reports.Management"]
"App.Reports.Management"
]
}, },
{ {
"key": "admin.reports.view", "key": "admin.reports.view",
"path": "/admin/reports/:id", "path": "/admin/reports/:id",
"componentPath": "@/views/report/ReportViewerPage", "componentPath": "@/views/report/ReportViewerPage",
"routeType": "protected", "routeType": "protected",
"authority": [ "authority": ["App.Reports.Categories"]
"App.Reports.Categories"
]
} }
], ],
"Languages": [ "Languages": [
@ -9874,12 +9834,6 @@
"tr": "Ölçü Birimi Kategorileri", "tr": "Ölçü Birimi Kategorileri",
"en": "Units of Measure Categories" "en": "Units of Measure Categories"
}, },
{
"resourceName": "Platform",
"key": "App.Definitions.Uom",
"tr": "Ölçü Birimi",
"en": "Units of Measure"
},
{ {
"resourceName": "Platform", "resourceName": "Platform",
"key": "App.Definitions.Uom", "key": "App.Definitions.Uom",
@ -13944,10 +13898,7 @@
"descriptionKey": "Abp.Localization.DefaultLanguage.Description", "descriptionKey": "Abp.Localization.DefaultLanguage.Description",
"defaultValue": "en", "defaultValue": "en",
"isVisibleToClients": false, "isVisibleToClients": false,
"providers": [ "providers": ["G", "D"],
"G",
"D"
],
"isInherited": false, "isInherited": false,
"isEncrypted": false, "isEncrypted": false,
"mainGroupKey": "App.SiteManagement", "mainGroupKey": "App.SiteManagement",
@ -13981,10 +13932,7 @@
"descriptionKey": "Abp.Localization.Timezone.Description", "descriptionKey": "Abp.Localization.Timezone.Description",
"defaultValue": "UTC", "defaultValue": "UTC",
"isVisibleToClients": false, "isVisibleToClients": false,
"providers": [ "providers": ["G", "D"],
"G",
"D"
],
"isInherited": false, "isInherited": false,
"isEncrypted": false, "isEncrypted": false,
"mainGroupKey": "App.SiteManagement", "mainGroupKey": "App.SiteManagement",
@ -14140,11 +14088,7 @@
"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": [ "providers": ["U", "G", "D"],
"U",
"G",
"D"
],
"isInherited": false, "isInherited": false,
"isEncrypted": false, "isEncrypted": false,
"mainGroupKey": "App.SiteManagement", "mainGroupKey": "App.SiteManagement",
@ -14192,10 +14136,7 @@
"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": [ "providers": ["G", "D"],
"G",
"D"
],
"isInherited": false, "isInherited": false,
"isEncrypted": false, "isEncrypted": false,
"mainGroupKey": "App.SiteManagement", "mainGroupKey": "App.SiteManagement",
@ -14211,10 +14152,7 @@
"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": [ "providers": ["G", "D"],
"G",
"D"
],
"isInherited": false, "isInherited": false,
"isEncrypted": false, "isEncrypted": false,
"mainGroupKey": "App.SiteManagement", "mainGroupKey": "App.SiteManagement",
@ -14230,11 +14168,7 @@
"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": [ "providers": ["T", "G", "D"],
"T",
"G",
"D"
],
"isInherited": false, "isInherited": false,
"isEncrypted": false, "isEncrypted": false,
"mainGroupKey": "App.Sender", "mainGroupKey": "App.Sender",
@ -14250,11 +14184,7 @@
"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": [ "providers": ["T", "G", "D"],
"T",
"G",
"D"
],
"isInherited": false, "isInherited": false,
"isEncrypted": true, "isEncrypted": true,
"mainGroupKey": "App.Sender", "mainGroupKey": "App.Sender",
@ -14270,11 +14200,7 @@
"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": [ "providers": ["T", "G", "D"],
"T",
"G",
"D"
],
"isInherited": false, "isInherited": false,
"isEncrypted": true, "isEncrypted": true,
"mainGroupKey": "App.Sender", "mainGroupKey": "App.Sender",
@ -14290,11 +14216,7 @@
"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": [ "providers": ["T", "G", "D"],
"T",
"G",
"D"
],
"isInherited": false, "isInherited": false,
"isEncrypted": false, "isEncrypted": false,
"mainGroupKey": "App.Sender", "mainGroupKey": "App.Sender",
@ -14310,11 +14232,7 @@
"descriptionKey": "App.Sender.WhatsApp.PhoneNumberId.Description", "descriptionKey": "App.Sender.WhatsApp.PhoneNumberId.Description",
"defaultValue": "442035112335974", "defaultValue": "442035112335974",
"isVisibleToClients": false, "isVisibleToClients": false,
"providers": [ "providers": ["T", "G", "D"],
"T",
"G",
"D"
],
"isInherited": false, "isInherited": false,
"isEncrypted": false, "isEncrypted": false,
"mainGroupKey": "App.Sender", "mainGroupKey": "App.Sender",
@ -14330,11 +14248,7 @@
"descriptionKey": "App.Sender.WhatsApp.Token.Description", "descriptionKey": "App.Sender.WhatsApp.Token.Description",
"defaultValue": "EAANoftqZAJ64BO5oPwXPqniUtNGF70u8TKvQVzGZBaYQh5UY8fYrgQkcXP9UbQUqT9PWRah1L7TzcBIiWQMacT8AkmZB33AP1begLoywIZCsQSdBSUz21GQaCowfVosYgBoXSyqH8irSBPQDLIjxxVxrC2n76SD9X6zPXeHgOqIPY92DqJXplstWrlhtZCAZDZD", "defaultValue": "EAANoftqZAJ64BO5oPwXPqniUtNGF70u8TKvQVzGZBaYQh5UY8fYrgQkcXP9UbQUqT9PWRah1L7TzcBIiWQMacT8AkmZB33AP1begLoywIZCsQSdBSUz21GQaCowfVosYgBoXSyqH8irSBPQDLIjxxVxrC2n76SD9X6zPXeHgOqIPY92DqJXplstWrlhtZCAZDZD",
"isVisibleToClients": false, "isVisibleToClients": false,
"providers": [ "providers": ["T", "G", "D"],
"T",
"G",
"D"
],
"isInherited": false, "isInherited": false,
"isEncrypted": false, "isEncrypted": false,
"mainGroupKey": "App.Sender", "mainGroupKey": "App.Sender",
@ -14350,11 +14264,7 @@
"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": [ "providers": ["T", "G", "D"],
"T",
"G",
"D"
],
"isInherited": false, "isInherited": false,
"isEncrypted": false, "isEncrypted": false,
"mainGroupKey": "App.Sender", "mainGroupKey": "App.Sender",
@ -14370,10 +14280,7 @@
"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": [ "providers": ["G", "D"],
"G",
"D"
],
"isInherited": false, "isInherited": false,
"isEncrypted": false, "isEncrypted": false,
"mainGroupKey": "App.Sender", "mainGroupKey": "App.Sender",
@ -14389,10 +14296,7 @@
"descriptionKey": "App.Sender.Rocket.UserId.Description", "descriptionKey": "App.Sender.Rocket.UserId.Description",
"defaultValue": "LfpzPjzag4QJXm84N", "defaultValue": "LfpzPjzag4QJXm84N",
"isVisibleToClients": false, "isVisibleToClients": false,
"providers": [ "providers": ["G", "D"],
"G",
"D"
],
"isInherited": false, "isInherited": false,
"isEncrypted": false, "isEncrypted": false,
"mainGroupKey": "App.Sender", "mainGroupKey": "App.Sender",
@ -14408,10 +14312,7 @@
"descriptionKey": "App.Sender.Rocket.Token.Description", "descriptionKey": "App.Sender.Rocket.Token.Description",
"defaultValue": "jvqALawvXn0Q7c6FfHJV3h58DCHDfQLgFF5y7oIc7oc", "defaultValue": "jvqALawvXn0Q7c6FfHJV3h58DCHDfQLgFF5y7oIc7oc",
"isVisibleToClients": false, "isVisibleToClients": false,
"providers": [ "providers": ["G", "D"],
"G",
"D"
],
"isInherited": false, "isInherited": false,
"isEncrypted": false, "isEncrypted": false,
"mainGroupKey": "App.Sender", "mainGroupKey": "App.Sender",
@ -14427,11 +14328,7 @@
"descriptionKey": "Abp.Mailing.DefaultFromDisplayName.Description", "descriptionKey": "Abp.Mailing.DefaultFromDisplayName.Description",
"defaultValue": "Kurs", "defaultValue": "Kurs",
"isVisibleToClients": false, "isVisibleToClients": false,
"providers": [ "providers": ["T", "G", "D"],
"T",
"G",
"D"
],
"isInherited": false, "isInherited": false,
"isEncrypted": false, "isEncrypted": false,
"mainGroupKey": "Abp.Mailing", "mainGroupKey": "Abp.Mailing",
@ -14447,11 +14344,7 @@
"descriptionKey": "Abp.Mailing.DefaultFromAddress.Description", "descriptionKey": "Abp.Mailing.DefaultFromAddress.Description",
"defaultValue": "system@sozsoft.com", "defaultValue": "system@sozsoft.com",
"isVisibleToClients": false, "isVisibleToClients": false,
"providers": [ "providers": ["T", "G", "D"],
"T",
"G",
"D"
],
"isInherited": false, "isInherited": false,
"isEncrypted": false, "isEncrypted": false,
"mainGroupKey": "Abp.Mailing", "mainGroupKey": "Abp.Mailing",
@ -14467,11 +14360,7 @@
"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": [ "providers": ["T", "G", "D"],
"T",
"G",
"D"
],
"isInherited": false, "isInherited": false,
"isEncrypted": false, "isEncrypted": false,
"mainGroupKey": "Abp.Mailing", "mainGroupKey": "Abp.Mailing",
@ -14487,11 +14376,7 @@
"descriptionKey": "Abp.Mailing.Smtp.Password.Description", "descriptionKey": "Abp.Mailing.Smtp.Password.Description",
"defaultValue": "QT9L7BCl1CT/1Hq19HoSlQ==", "defaultValue": "QT9L7BCl1CT/1Hq19HoSlQ==",
"isVisibleToClients": false, "isVisibleToClients": false,
"providers": [ "providers": ["T", "G", "D"],
"T",
"G",
"D"
],
"isInherited": false, "isInherited": false,
"isEncrypted": true, "isEncrypted": true,
"mainGroupKey": "Abp.Mailing", "mainGroupKey": "Abp.Mailing",
@ -14507,11 +14392,7 @@
"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": [ "providers": ["T", "G", "D"],
"T",
"G",
"D"
],
"isInherited": false, "isInherited": false,
"isEncrypted": false, "isEncrypted": false,
"mainGroupKey": "Abp.Mailing", "mainGroupKey": "Abp.Mailing",
@ -14527,11 +14408,7 @@
"descriptionKey": "Abp.Mailing.Smtp.Port.Description", "descriptionKey": "Abp.Mailing.Smtp.Port.Description",
"defaultValue": "25", "defaultValue": "25",
"isVisibleToClients": false, "isVisibleToClients": false,
"providers": [ "providers": ["T", "G", "D"],
"T",
"G",
"D"
],
"isInherited": false, "isInherited": false,
"isEncrypted": false, "isEncrypted": false,
"mainGroupKey": "Abp.Mailing", "mainGroupKey": "Abp.Mailing",
@ -14547,11 +14424,7 @@
"descriptionKey": "Abp.Mailing.Smtp.Domain.Description", "descriptionKey": "Abp.Mailing.Smtp.Domain.Description",
"defaultValue": "sozsoft.com", "defaultValue": "sozsoft.com",
"isVisibleToClients": false, "isVisibleToClients": false,
"providers": [ "providers": ["T", "G", "D"],
"T",
"G",
"D"
],
"isInherited": false, "isInherited": false,
"isEncrypted": false, "isEncrypted": false,
"mainGroupKey": "Abp.Mailing", "mainGroupKey": "Abp.Mailing",
@ -14567,11 +14440,7 @@
"descriptionKey": "Abp.Mailing.Smtp.EnableSsl.Description", "descriptionKey": "Abp.Mailing.Smtp.EnableSsl.Description",
"defaultValue": "True", "defaultValue": "True",
"isVisibleToClients": false, "isVisibleToClients": false,
"providers": [ "providers": ["T", "G", "D"],
"T",
"G",
"D"
],
"isInherited": false, "isInherited": false,
"isEncrypted": false, "isEncrypted": false,
"mainGroupKey": "Abp.Mailing", "mainGroupKey": "Abp.Mailing",
@ -14587,11 +14456,7 @@
"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": [ "providers": ["T", "G", "D"],
"T",
"G",
"D"
],
"isInherited": false, "isInherited": false,
"isEncrypted": false, "isEncrypted": false,
"mainGroupKey": "Abp.Mailing", "mainGroupKey": "Abp.Mailing",
@ -14607,11 +14472,7 @@
"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": [ "providers": ["T", "G", "D"],
"T",
"G",
"D"
],
"isInherited": false, "isInherited": false,
"isEncrypted": false, "isEncrypted": false,
"mainGroupKey": "Abp.Mailing", "mainGroupKey": "Abp.Mailing",
@ -14627,11 +14488,7 @@
"descriptionKey": "Abp.Mailing.AWS.AccessKey.Description", "descriptionKey": "Abp.Mailing.AWS.AccessKey.Description",
"defaultValue": "aXW8L21rP6dPO6Txj76Be2FCpWRBa25EMrSAVL76", "defaultValue": "aXW8L21rP6dPO6Txj76Be2FCpWRBa25EMrSAVL76",
"isVisibleToClients": false, "isVisibleToClients": false,
"providers": [ "providers": ["T", "G", "D"],
"T",
"G",
"D"
],
"isInherited": false, "isInherited": false,
"isEncrypted": false, "isEncrypted": false,
"mainGroupKey": "Abp.Mailing", "mainGroupKey": "Abp.Mailing",
@ -14647,11 +14504,7 @@
"descriptionKey": "Abp.Mailing.AWS.AccessKeyId.Description", "descriptionKey": "Abp.Mailing.AWS.AccessKeyId.Description",
"defaultValue": "AKIATULUYBLX4IY3S2P1", "defaultValue": "AKIATULUYBLX4IY3S2P1",
"isVisibleToClients": false, "isVisibleToClients": false,
"providers": [ "providers": ["T", "G", "D"],
"T",
"G",
"D"
],
"isInherited": false, "isInherited": false,
"isEncrypted": false, "isEncrypted": false,
"mainGroupKey": "Abp.Mailing", "mainGroupKey": "Abp.Mailing",
@ -14667,10 +14520,7 @@
"descriptionKey": "Abp.Account.IsSelfRegistrationEnabled.Description", "descriptionKey": "Abp.Account.IsSelfRegistrationEnabled.Description",
"defaultValue": "True", "defaultValue": "True",
"isVisibleToClients": false, "isVisibleToClients": false,
"providers": [ "providers": ["G", "D"],
"G",
"D"
],
"isInherited": false, "isInherited": false,
"isEncrypted": false, "isEncrypted": false,
"mainGroupKey": "Abp.Account", "mainGroupKey": "Abp.Account",
@ -14686,10 +14536,7 @@
"descriptionKey": "Abp.Account.EnableLocalLogin.Description", "descriptionKey": "Abp.Account.EnableLocalLogin.Description",
"defaultValue": "True", "defaultValue": "True",
"isVisibleToClients": false, "isVisibleToClients": false,
"providers": [ "providers": ["G", "D"],
"G",
"D"
],
"isInherited": false, "isInherited": false,
"isEncrypted": false, "isEncrypted": false,
"mainGroupKey": "Abp.Account", "mainGroupKey": "Abp.Account",
@ -14705,11 +14552,7 @@
"descriptionKey": "Abp.Account.TwoFactor.Enabled.Description", "descriptionKey": "Abp.Account.TwoFactor.Enabled.Description",
"defaultValue": "True", "defaultValue": "True",
"isVisibleToClients": false, "isVisibleToClients": false,
"providers": [ "providers": ["T", "G", "D"],
"T",
"G",
"D"
],
"isInherited": false, "isInherited": false,
"isEncrypted": false, "isEncrypted": false,
"mainGroupKey": "Abp.Account", "mainGroupKey": "Abp.Account",
@ -14725,10 +14568,7 @@
"descriptionKey": "Abp.Account.Captcha.MaxFailedAccessAttempts.Description", "descriptionKey": "Abp.Account.Captcha.MaxFailedAccessAttempts.Description",
"defaultValue": "3", "defaultValue": "3",
"isVisibleToClients": false, "isVisibleToClients": false,
"providers": [ "providers": ["G", "D"],
"G",
"D"
],
"isInherited": false, "isInherited": false,
"isEncrypted": false, "isEncrypted": false,
"mainGroupKey": "Abp.Account", "mainGroupKey": "Abp.Account",
@ -14744,10 +14584,7 @@
"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": [ "providers": ["G", "D"],
"G",
"D"
],
"isInherited": false, "isInherited": false,
"isEncrypted": false, "isEncrypted": false,
"mainGroupKey": "Abp.Account", "mainGroupKey": "Abp.Account",
@ -14763,10 +14600,7 @@
"descriptionKey": "Abp.Account.Captcha.SiteKey.Description", "descriptionKey": "Abp.Account.Captcha.SiteKey.Description",
"defaultValue": "0x4AAAAAAAGadwQME-GSYuJU", "defaultValue": "0x4AAAAAAAGadwQME-GSYuJU",
"isVisibleToClients": false, "isVisibleToClients": false,
"providers": [ "providers": ["G", "D"],
"G",
"D"
],
"isInherited": false, "isInherited": false,
"isEncrypted": false, "isEncrypted": false,
"mainGroupKey": "Abp.Account", "mainGroupKey": "Abp.Account",
@ -14782,10 +14616,7 @@
"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": [ "providers": ["G", "D"],
"G",
"D"
],
"isInherited": false, "isInherited": false,
"isEncrypted": false, "isEncrypted": false,
"mainGroupKey": "Abp.Account", "mainGroupKey": "Abp.Account",
@ -14801,11 +14632,7 @@
"descriptionKey": "Abp.Identity.Profile.General.RequireVerifiedAccount.Description", "descriptionKey": "Abp.Identity.Profile.General.RequireVerifiedAccount.Description",
"defaultValue": "True", "defaultValue": "True",
"isVisibleToClients": false, "isVisibleToClients": false,
"providers": [ "providers": ["T", "G", "D"],
"T",
"G",
"D"
],
"isInherited": false, "isInherited": false,
"isEncrypted": false, "isEncrypted": false,
"mainGroupKey": "Abp.Identity", "mainGroupKey": "Abp.Identity",
@ -14821,11 +14648,7 @@
"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": [ "providers": ["T", "G", "D"],
"T",
"G",
"D"
],
"isInherited": false, "isInherited": false,
"isEncrypted": false, "isEncrypted": false,
"mainGroupKey": "Abp.Identity", "mainGroupKey": "Abp.Identity",
@ -14841,11 +14664,7 @@
"descriptionKey": "Abp.Identity.Password.ForceUsersToPeriodicallyChangePassword.Description", "descriptionKey": "Abp.Identity.Password.ForceUsersToPeriodicallyChangePassword.Description",
"defaultValue": "True", "defaultValue": "True",
"isVisibleToClients": false, "isVisibleToClients": false,
"providers": [ "providers": ["T", "G", "D"],
"T",
"G",
"D"
],
"isInherited": false, "isInherited": false,
"isEncrypted": false, "isEncrypted": false,
"mainGroupKey": "Abp.Identity", "mainGroupKey": "Abp.Identity",
@ -14861,11 +14680,7 @@
"descriptionKey": "Abp.Identity.Password.PasswordChangePeriodDays.Description", "descriptionKey": "Abp.Identity.Password.PasswordChangePeriodDays.Description",
"defaultValue": "0", "defaultValue": "0",
"isVisibleToClients": false, "isVisibleToClients": false,
"providers": [ "providers": ["T", "G", "D"],
"T",
"G",
"D"
],
"isInherited": false, "isInherited": false,
"isEncrypted": false, "isEncrypted": false,
"mainGroupKey": "Abp.Identity", "mainGroupKey": "Abp.Identity",
@ -14881,11 +14696,7 @@
"descriptionKey": "Abp.Identity.Password.RequiredLength.Description", "descriptionKey": "Abp.Identity.Password.RequiredLength.Description",
"defaultValue": "6", "defaultValue": "6",
"isVisibleToClients": false, "isVisibleToClients": false,
"providers": [ "providers": ["T", "G", "D"],
"T",
"G",
"D"
],
"isInherited": false, "isInherited": false,
"isEncrypted": false, "isEncrypted": false,
"mainGroupKey": "Abp.Identity", "mainGroupKey": "Abp.Identity",
@ -14901,11 +14712,7 @@
"descriptionKey": "Abp.Identity.Password.RequiredUniqueChars.Description", "descriptionKey": "Abp.Identity.Password.RequiredUniqueChars.Description",
"defaultValue": "1", "defaultValue": "1",
"isVisibleToClients": false, "isVisibleToClients": false,
"providers": [ "providers": ["T", "G", "D"],
"T",
"G",
"D"
],
"isInherited": false, "isInherited": false,
"isEncrypted": false, "isEncrypted": false,
"mainGroupKey": "Abp.Identity", "mainGroupKey": "Abp.Identity",
@ -14921,11 +14728,7 @@
"descriptionKey": "Abp.Identity.Password.RequireNonAlphanumeric.Description", "descriptionKey": "Abp.Identity.Password.RequireNonAlphanumeric.Description",
"defaultValue": "True", "defaultValue": "True",
"isVisibleToClients": false, "isVisibleToClients": false,
"providers": [ "providers": ["T", "G", "D"],
"T",
"G",
"D"
],
"isInherited": false, "isInherited": false,
"isEncrypted": false, "isEncrypted": false,
"mainGroupKey": "Abp.Identity", "mainGroupKey": "Abp.Identity",
@ -14941,11 +14744,7 @@
"descriptionKey": "Abp.Identity.Password.RequireLowercase.Description", "descriptionKey": "Abp.Identity.Password.RequireLowercase.Description",
"defaultValue": "True", "defaultValue": "True",
"isVisibleToClients": false, "isVisibleToClients": false,
"providers": [ "providers": ["T", "G", "D"],
"T",
"G",
"D"
],
"isInherited": false, "isInherited": false,
"isEncrypted": false, "isEncrypted": false,
"mainGroupKey": "Abp.Identity", "mainGroupKey": "Abp.Identity",
@ -14961,11 +14760,7 @@
"descriptionKey": "Abp.Identity.Password.RequireUppercase.Description", "descriptionKey": "Abp.Identity.Password.RequireUppercase.Description",
"defaultValue": "True", "defaultValue": "True",
"isVisibleToClients": false, "isVisibleToClients": false,
"providers": [ "providers": ["T", "G", "D"],
"T",
"G",
"D"
],
"isInherited": false, "isInherited": false,
"isEncrypted": false, "isEncrypted": false,
"mainGroupKey": "Abp.Identity", "mainGroupKey": "Abp.Identity",
@ -14981,11 +14776,7 @@
"descriptionKey": "Abp.Identity.Password.RequireDigit.Description", "descriptionKey": "Abp.Identity.Password.RequireDigit.Description",
"defaultValue": "True", "defaultValue": "True",
"isVisibleToClients": false, "isVisibleToClients": false,
"providers": [ "providers": ["T", "G", "D"],
"T",
"G",
"D"
],
"isInherited": false, "isInherited": false,
"isEncrypted": false, "isEncrypted": false,
"mainGroupKey": "Abp.Identity", "mainGroupKey": "Abp.Identity",
@ -15001,11 +14792,7 @@
"descriptionKey": "Abp.Identity.Lockout.AllowedForNewUsers.Description", "descriptionKey": "Abp.Identity.Lockout.AllowedForNewUsers.Description",
"defaultValue": "True", "defaultValue": "True",
"isVisibleToClients": false, "isVisibleToClients": false,
"providers": [ "providers": ["T", "G", "D"],
"T",
"G",
"D"
],
"isInherited": false, "isInherited": false,
"isEncrypted": false, "isEncrypted": false,
"mainGroupKey": "Abp.Identity", "mainGroupKey": "Abp.Identity",
@ -15021,11 +14808,7 @@
"descriptionKey": "Abp.Identity.Lockout.LockoutDuration.Description", "descriptionKey": "Abp.Identity.Lockout.LockoutDuration.Description",
"defaultValue": "300", "defaultValue": "300",
"isVisibleToClients": false, "isVisibleToClients": false,
"providers": [ "providers": ["T", "G", "D"],
"T",
"G",
"D"
],
"isInherited": false, "isInherited": false,
"isEncrypted": false, "isEncrypted": false,
"mainGroupKey": "Abp.Identity", "mainGroupKey": "Abp.Identity",
@ -15041,11 +14824,7 @@
"descriptionKey": "Abp.Identity.Lockout.MaxFailedAccessAttempts.Description", "descriptionKey": "Abp.Identity.Lockout.MaxFailedAccessAttempts.Description",
"defaultValue": "5", "defaultValue": "5",
"isVisibleToClients": false, "isVisibleToClients": false,
"providers": [ "providers": ["T", "G", "D"],
"T",
"G",
"D"
],
"isInherited": false, "isInherited": false,
"isEncrypted": false, "isEncrypted": false,
"mainGroupKey": "Abp.Identity", "mainGroupKey": "Abp.Identity",
@ -15061,10 +14840,7 @@
"descriptionKey": "Abp.Identity.SignIn.RequireConfirmedEmail.Description", "descriptionKey": "Abp.Identity.SignIn.RequireConfirmedEmail.Description",
"defaultValue": "True", "defaultValue": "True",
"isVisibleToClients": false, "isVisibleToClients": false,
"providers": [ "providers": ["G", "D"],
"G",
"D"
],
"isInherited": false, "isInherited": false,
"isEncrypted": false, "isEncrypted": false,
"mainGroupKey": "Abp.Identity", "mainGroupKey": "Abp.Identity",
@ -15080,10 +14856,7 @@
"descriptionKey": "Abp.Identity.SignIn.RequireConfirmedPhoneNumber.Description", "descriptionKey": "Abp.Identity.SignIn.RequireConfirmedPhoneNumber.Description",
"defaultValue": "False", "defaultValue": "False",
"isVisibleToClients": false, "isVisibleToClients": false,
"providers": [ "providers": ["G", "D"],
"G",
"D"
],
"isInherited": false, "isInherited": false,
"isEncrypted": false, "isEncrypted": false,
"mainGroupKey": "Abp.Identity", "mainGroupKey": "Abp.Identity",
@ -15099,10 +14872,7 @@
"descriptionKey": "Abp.Identity.User.IsUserNameUpdateEnabled.Description", "descriptionKey": "Abp.Identity.User.IsUserNameUpdateEnabled.Description",
"defaultValue": "True", "defaultValue": "True",
"isVisibleToClients": false, "isVisibleToClients": false,
"providers": [ "providers": ["G", "D"],
"G",
"D"
],
"isInherited": false, "isInherited": false,
"isEncrypted": false, "isEncrypted": false,
"mainGroupKey": "Abp.Identity", "mainGroupKey": "Abp.Identity",
@ -15118,10 +14888,7 @@
"descriptionKey": "Abp.Identity.User.IsEmailUpdateEnabled.Description", "descriptionKey": "Abp.Identity.User.IsEmailUpdateEnabled.Description",
"defaultValue": "True", "defaultValue": "True",
"isVisibleToClients": false, "isVisibleToClients": false,
"providers": [ "providers": ["G", "D"],
"G",
"D"
],
"isInherited": false, "isInherited": false,
"isEncrypted": false, "isEncrypted": false,
"mainGroupKey": "Abp.Identity", "mainGroupKey": "Abp.Identity",
@ -17408,9 +17175,7 @@
"props": null, "props": null,
"description": null, "description": null,
"isActive": true, "isActive": true,
"dependencies": [ "dependencies": ["AxiosListComponent"]
"AxiosListComponent"
]
} }
], ],
"ReportCategories": [ "ReportCategories": [
@ -17433,4 +17198,4 @@
"icon": "📜" "icon": "📜"
} }
] ]
} }

View file

@ -0,0 +1,46 @@
using System;
using System.Collections.Generic;
using Volo.Abp.Domain.Entities;
using Volo.Abp.Domain.Entities.Auditing;
namespace Kurs.Platform.Entities;
public class Service : FullAuditedAggregateRoot<Guid>
{
// Icon component adı (ör: "FaCode")
public string? Icon { get; set; }
public string Title { get; set; }
public string? Description { get; set; }
public string Type { get; set; }
public ICollection<ServiceFeature> Features { get; set; }
protected Service()
{
Features = [];
}
public Service(Guid id, string title, string type)
: base(id)
{
Title = title;
Type = type;
Features = [];
}
}
public class ServiceFeature : Entity<Guid>
{
public Guid ServiceItemId { get; set; }
public string Name { get; set; }
public ServiceFeature() { }
public ServiceFeature(Guid id, Guid serviceItemId, string name)
: base(id)
{
ServiceItemId = serviceItemId;
Name = name;
}
}

View file

@ -91,6 +91,8 @@ public class PlatformDbContext :
public DbSet<ReportGenerated> ReportGenerated { get; set; } public DbSet<ReportGenerated> ReportGenerated { get; set; }
public DbSet<ReportCategory> ReportCategories { get; set; } public DbSet<ReportCategory> ReportCategories { get; set; }
public DbSet<Demo> Demos { get; set; } public DbSet<Demo> Demos { get; set; }
public DbSet<Service> Services { get; set; }
public DbSet<ServiceFeature> ServiceFeatures { get; set; }
#region Entities from the modules #region Entities from the modules
@ -803,5 +805,33 @@ public class PlatformDbContext :
b.Property(x => x.NumberOfUsers).IsRequired(); b.Property(x => x.NumberOfUsers).IsRequired();
b.Property(x => x.Message).IsRequired().HasMaxLength(2000); b.Property(x => x.Message).IsRequired().HasMaxLength(2000);
}); });
builder.Entity<Service>(b =>
{
b.ToTable(PlatformConsts.DbTablePrefix + nameof(Service), PlatformConsts.DbSchema);
b.ConfigureByConvention();
b.Property(x => x.Title)
.IsRequired()
.HasMaxLength(128);
b.Property(x => x.Description).HasMaxLength(512);
b.Property(x => x.Icon).HasMaxLength(64);
// 1 - N ilişki
b.HasMany(x => x.Features)
.WithOne()
.HasForeignKey(f => f.ServiceItemId);
});
builder.Entity<ServiceFeature>(b =>
{
b.ToTable(PlatformConsts.DbTablePrefix + nameof(ServiceFeature), PlatformConsts.DbSchema);
b.ConfigureByConvention();
b.Property(x => x.Name)
.IsRequired()
.HasMaxLength(128);
});
} }
} }

File diff suppressed because it is too large Load diff

View file

@ -0,0 +1,73 @@
using System;
using Microsoft.EntityFrameworkCore.Migrations;
#nullable disable
namespace Kurs.Platform.Migrations
{
/// <inheritdoc />
public partial class Service : Migration
{
/// <inheritdoc />
protected override void Up(MigrationBuilder migrationBuilder)
{
migrationBuilder.CreateTable(
name: "PService",
columns: table => new
{
Id = table.Column<Guid>(type: "uniqueidentifier", nullable: false),
Icon = table.Column<string>(type: "nvarchar(64)", maxLength: 64, nullable: true),
Title = table.Column<string>(type: "nvarchar(128)", maxLength: 128, nullable: false),
Description = table.Column<string>(type: "nvarchar(512)", maxLength: 512, nullable: true),
Type = table.Column<string>(type: "nvarchar(max)", nullable: true),
ExtraProperties = table.Column<string>(type: "nvarchar(max)", nullable: false),
ConcurrencyStamp = table.Column<string>(type: "nvarchar(40)", maxLength: 40, nullable: false),
CreationTime = table.Column<DateTime>(type: "datetime2", nullable: false),
CreatorId = table.Column<Guid>(type: "uniqueidentifier", nullable: true),
LastModificationTime = table.Column<DateTime>(type: "datetime2", nullable: true),
LastModifierId = table.Column<Guid>(type: "uniqueidentifier", nullable: true),
IsDeleted = table.Column<bool>(type: "bit", nullable: false, defaultValue: false),
DeleterId = table.Column<Guid>(type: "uniqueidentifier", nullable: true),
DeletionTime = table.Column<DateTime>(type: "datetime2", nullable: true)
},
constraints: table =>
{
table.PrimaryKey("PK_PService", x => x.Id);
});
migrationBuilder.CreateTable(
name: "PServiceFeature",
columns: table => new
{
Id = table.Column<Guid>(type: "uniqueidentifier", nullable: false),
ServiceItemId = table.Column<Guid>(type: "uniqueidentifier", nullable: false),
Name = table.Column<string>(type: "nvarchar(128)", maxLength: 128, nullable: false)
},
constraints: table =>
{
table.PrimaryKey("PK_PServiceFeature", x => x.Id);
table.ForeignKey(
name: "FK_PServiceFeature_PService_ServiceItemId",
column: x => x.ServiceItemId,
principalTable: "PService",
principalColumn: "Id",
onDelete: ReferentialAction.Cascade);
});
migrationBuilder.CreateIndex(
name: "IX_PServiceFeature_ServiceItemId",
table: "PServiceFeature",
column: "ServiceItemId");
}
/// <inheritdoc />
protected override void Down(MigrationBuilder migrationBuilder)
{
migrationBuilder.DropTable(
name: "PServiceFeature");
migrationBuilder.DropTable(
name: "PService");
}
}
}

View file

@ -3446,6 +3446,94 @@ namespace Kurs.Platform.Migrations
b.ToTable("PSector", (string)null); b.ToTable("PSector", (string)null);
}); });
modelBuilder.Entity("Kurs.Platform.Entities.Service", b =>
{
b.Property<Guid>("Id")
.HasColumnType("uniqueidentifier");
b.Property<string>("ConcurrencyStamp")
.IsConcurrencyToken()
.IsRequired()
.HasMaxLength(40)
.HasColumnType("nvarchar(40)")
.HasColumnName("ConcurrencyStamp");
b.Property<DateTime>("CreationTime")
.HasColumnType("datetime2")
.HasColumnName("CreationTime");
b.Property<Guid?>("CreatorId")
.HasColumnType("uniqueidentifier")
.HasColumnName("CreatorId");
b.Property<Guid?>("DeleterId")
.HasColumnType("uniqueidentifier")
.HasColumnName("DeleterId");
b.Property<DateTime?>("DeletionTime")
.HasColumnType("datetime2")
.HasColumnName("DeletionTime");
b.Property<string>("Description")
.HasMaxLength(512)
.HasColumnType("nvarchar(512)");
b.Property<string>("ExtraProperties")
.IsRequired()
.HasColumnType("nvarchar(max)")
.HasColumnName("ExtraProperties");
b.Property<string>("Icon")
.HasMaxLength(64)
.HasColumnType("nvarchar(64)");
b.Property<bool>("IsDeleted")
.ValueGeneratedOnAdd()
.HasColumnType("bit")
.HasDefaultValue(false)
.HasColumnName("IsDeleted");
b.Property<DateTime?>("LastModificationTime")
.HasColumnType("datetime2")
.HasColumnName("LastModificationTime");
b.Property<Guid?>("LastModifierId")
.HasColumnType("uniqueidentifier")
.HasColumnName("LastModifierId");
b.Property<string>("Title")
.IsRequired()
.HasMaxLength(128)
.HasColumnType("nvarchar(128)");
b.Property<string>("Type")
.HasColumnType("nvarchar(max)");
b.HasKey("Id");
b.ToTable("PService", (string)null);
});
modelBuilder.Entity("Kurs.Platform.Entities.ServiceFeature", b =>
{
b.Property<Guid>("Id")
.HasColumnType("uniqueidentifier");
b.Property<string>("Name")
.IsRequired()
.HasMaxLength(128)
.HasColumnType("nvarchar(128)");
b.Property<Guid>("ServiceItemId")
.HasColumnType("uniqueidentifier");
b.HasKey("Id");
b.HasIndex("ServiceItemId");
b.ToTable("PServiceFeature", (string)null);
});
modelBuilder.Entity("Kurs.Platform.Entities.Uom", b => modelBuilder.Entity("Kurs.Platform.Entities.Uom", b =>
{ {
b.Property<Guid>("Id") b.Property<Guid>("Id")
@ -6246,6 +6334,15 @@ namespace Kurs.Platform.Migrations
b.Navigation("ReportCategory"); b.Navigation("ReportCategory");
}); });
modelBuilder.Entity("Kurs.Platform.Entities.ServiceFeature", b =>
{
b.HasOne("Kurs.Platform.Entities.Service", null)
.WithMany("Features")
.HasForeignKey("ServiceItemId")
.OnDelete(DeleteBehavior.Cascade)
.IsRequired();
});
modelBuilder.Entity("Kurs.Platform.Entities.Uom", b => modelBuilder.Entity("Kurs.Platform.Entities.Uom", b =>
{ {
b.HasOne("Kurs.Platform.Entities.UomCategory", "UomCategory") b.HasOne("Kurs.Platform.Entities.UomCategory", "UomCategory")
@ -6487,6 +6584,11 @@ namespace Kurs.Platform.Migrations
b.Navigation("Parameters"); b.Navigation("Parameters");
}); });
modelBuilder.Entity("Kurs.Platform.Entities.Service", b =>
{
b.Navigation("Features");
});
modelBuilder.Entity("Kurs.Platform.Entities.UomCategory", b => modelBuilder.Entity("Kurs.Platform.Entities.UomCategory", b =>
{ {
b.Navigation("Uoms"); b.Navigation("Uoms");

View file

@ -0,0 +1,22 @@
export type ItemType = 'service' | 'support'
export interface Service {
icon?: React.ReactNode
title: string
description?: string
type: ItemType
features: string[]
}
export interface ServiceFeature {
serviceItemId: string
name: string
}
export interface ServiceDto {
icon?: React.ReactNode
title: string
description?: string
type: ItemType
features: string[]
}

View file

@ -0,0 +1,16 @@
import { PagedAndSortedResultRequestDto, PagedResultDto } from '../proxy'
import apiService, { Config } from './api.service'
import { ServiceDto } from '@/proxy/services/models'
export class ServiceService {
apiName = 'Default'
getList = () =>
apiService.fetchData<ServiceDto[]>(
{
method: 'GET',
url: '/api/app/service',
},
{ apiName: this.apiName },
)
}

View file

@ -1,18 +1,28 @@
import React from 'react' import React from 'react'
import { FaCode, FaGlobe, FaServer, FaUsers, FaShieldAlt, FaCog, FaCheckCircle } from 'react-icons/fa'; import {
FaCode,
FaGlobe,
FaServer,
FaUsers,
FaShieldAlt,
FaCog,
FaCheckCircle,
} from 'react-icons/fa'
import { Link } from 'react-router-dom' import { Link } from 'react-router-dom'
import { useLocalization } from '@/utils/hooks/useLocalization' import { useLocalization } from '@/utils/hooks/useLocalization'
import { ROUTES_ENUM } from '@/routes/route.constant' import { ROUTES_ENUM } from '@/routes/route.constant'
import { Helmet } from 'react-helmet' import { Helmet } from 'react-helmet'
import { ServiceDto } from '@/proxy/services/models'
const Services: React.FC = () => { const Services: React.FC = () => {
const { translate } = useLocalization() const { translate } = useLocalization()
const services = [ const services: ServiceDto[] = [
{ {
icon: <FaCode className="w-12 h-12 text-blue-600" />, icon: <FaCode className="w-12 h-12 text-blue-600" />,
title: translate('::Public.services.software.title'), title: translate('::Public.services.software.title'),
description: translate('::Public.services.software.desc'), description: translate('::Public.services.software.desc'),
type: 'service',
features: [ features: [
translate('::Public.services.software.features.analysis'), translate('::Public.services.software.features.analysis'),
translate('::Public.services.software.features.design'), translate('::Public.services.software.features.design'),
@ -25,6 +35,7 @@ const Services: React.FC = () => {
icon: <FaUsers className="w-12 h-12 text-purple-600" />, icon: <FaUsers className="w-12 h-12 text-purple-600" />,
title: translate('::Public.services.web.title'), title: translate('::Public.services.web.title'),
description: translate('::Public.services.web.desc'), description: translate('::Public.services.web.desc'),
type: 'service',
features: [ features: [
translate('::Public.services.web.features.frontend'), translate('::Public.services.web.features.frontend'),
translate('::Public.services.web.features.backend'), translate('::Public.services.web.features.backend'),
@ -37,6 +48,7 @@ const Services: React.FC = () => {
icon: <FaShieldAlt className="w-12 h-12 text-green-600" />, icon: <FaShieldAlt className="w-12 h-12 text-green-600" />,
title: translate('::Public.services.mobile.title'), title: translate('::Public.services.mobile.title'),
description: translate('::Public.services.mobile.desc'), description: translate('::Public.services.mobile.desc'),
type: 'service',
features: [ features: [
translate('::Public.services.mobile.features.design'), translate('::Public.services.mobile.features.design'),
translate('::Public.services.mobile.features.native'), translate('::Public.services.mobile.features.native'),
@ -49,6 +61,7 @@ const Services: React.FC = () => {
icon: <FaServer className="w-12 h-12 text-red-600" />, icon: <FaServer className="w-12 h-12 text-red-600" />,
title: translate('::Public.services.database.title'), title: translate('::Public.services.database.title'),
description: translate('::Public.services.database.desc'), description: translate('::Public.services.database.desc'),
type: 'service',
features: [ features: [
translate('::Public.services.database.features.design'), translate('::Public.services.database.features.design'),
translate('::Public.services.database.features.optimization'), translate('::Public.services.database.features.optimization'),
@ -61,6 +74,7 @@ const Services: React.FC = () => {
icon: <FaGlobe className="w-12 h-12 text-yellow-600" />, icon: <FaGlobe className="w-12 h-12 text-yellow-600" />,
title: translate('::Public.services.integration.title'), title: translate('::Public.services.integration.title'),
description: translate('::Public.services.integration.desc'), description: translate('::Public.services.integration.desc'),
type: 'service',
features: [ features: [
translate('::Public.services.integration.features.api'), translate('::Public.services.integration.features.api'),
translate('::Public.services.integration.features.middleware'), translate('::Public.services.integration.features.middleware'),
@ -73,6 +87,7 @@ const Services: React.FC = () => {
icon: <FaCog className="w-12 h-12 text-indigo-600" />, icon: <FaCog className="w-12 h-12 text-indigo-600" />,
title: translate('::Public.services.consulting.title'), title: translate('::Public.services.consulting.title'),
description: translate('::Public.services.consulting.desc'), description: translate('::Public.services.consulting.desc'),
type: 'service',
features: [ features: [
translate('::Public.services.consulting.features.tech'), translate('::Public.services.consulting.features.tech'),
translate('::Public.services.consulting.features.project'), translate('::Public.services.consulting.features.project'),
@ -81,13 +96,11 @@ const Services: React.FC = () => {
translate('::Public.services.consulting.features.training'), translate('::Public.services.consulting.features.training'),
], ],
}, },
]
const supportPlans = [
{ {
icon: <FaUsers className="w-12 h-12 text-pink-600" />, // Remote Branch Support
title: translate('::Public.services.support.branchRemote.title'), title: translate('::Public.services.support.branchRemote.title'),
price: translate('::Public.services.support.branchRemote.price'), description: '',
period: translate('::Public.services.support.branchRemote.period'), type: 'support',
features: [ features: [
translate('::Public.services.support.branchRemote.features.priority'), translate('::Public.services.support.branchRemote.features.priority'),
translate('::Public.services.support.branchRemote.features.remote'), translate('::Public.services.support.branchRemote.features.remote'),
@ -97,9 +110,10 @@ const Services: React.FC = () => {
], ],
}, },
{ {
icon: <FaServer className="w-12 h-12 text-orange-600" />, // Backup Support
title: translate('::Public.services.support.backup.title'), title: translate('::Public.services.support.backup.title'),
price: translate('::Public.services.support.backup.price'), description: '',
period: translate('::Public.services.support.backup.period'), type: 'support',
features: [ features: [
translate('::Public.services.support.backup.features.daily'), translate('::Public.services.support.backup.features.daily'),
translate('::Public.services.support.backup.features.encrypted'), translate('::Public.services.support.backup.features.encrypted'),
@ -109,9 +123,10 @@ const Services: React.FC = () => {
], ],
}, },
{ {
icon: <FaGlobe className="w-12 h-12 text-cyan-600" />, // SMS Support
title: translate('::Public.services.support.sms.title'), title: translate('::Public.services.support.sms.title'),
price: translate('::Public.services.support.sms.price'), description: '',
period: translate('::Public.services.support.sms.period'), type: 'support',
features: [ features: [
translate('::Public.services.support.sms.features.packages'), translate('::Public.services.support.sms.features.packages'),
translate('::Public.services.support.sms.features.bulk'), translate('::Public.services.support.sms.features.bulk'),
@ -153,24 +168,26 @@ const Services: React.FC = () => {
<div className="py-16"> <div className="py-16">
<div className="container mx-auto px-4"> <div className="container mx-auto px-4">
<div className="grid grid-cols-1 md:grid-cols-2 lg:grid-cols-3 gap-8"> <div className="grid grid-cols-1 md:grid-cols-2 lg:grid-cols-3 gap-8">
{services.map((service, index) => ( {services
<div .filter((a) => a.type === 'service')
key={index} .map((service, index) => (
className="bg-white rounded-xl shadow-lg p-8 hover:shadow-xl transition-shadow" <div
> key={index}
<div className="mb-6">{service.icon}</div> className="bg-white rounded-xl shadow-lg p-8 hover:shadow-xl transition-shadow"
<h3 className="text-2xl font-bold text-gray-900 mb-4">{service.title}</h3> >
<p className="text-gray-600 mb-6">{service.description}</p> <div className="mb-6">{service.icon}</div>
<ul className="space-y-2"> <h3 className="text-2xl font-bold text-gray-900 mb-4">{service.title}</h3>
{service.features.map((feature, fIndex) => ( <p className="text-gray-600 mb-6">{service.description}</p>
<li key={fIndex} className="flex items-center text-gray-700"> <ul className="space-y-2">
<span className="w-2 h-2 bg-blue-600 rounded-full mr-2"></span> {service.features.map((feature, fIndex) => (
{feature} <li key={fIndex} className="flex items-center text-gray-700">
</li> <span className="w-2 h-2 bg-blue-600 rounded-full mr-2"></span>
))} {feature}
</ul> </li>
</div> ))}
))} </ul>
</div>
))}
</div> </div>
</div> </div>
</div> </div>
@ -182,26 +199,31 @@ const Services: React.FC = () => {
{translate('::Public.services.support.title')} {translate('::Public.services.support.title')}
</h2> </h2>
<div className="grid grid-cols-1 md:grid-cols-3 gap-8"> <div className="grid grid-cols-1 md:grid-cols-3 gap-8">
{supportPlans.map((plan, index) => ( {services
<div key={index} className="bg-white rounded-xl shadow-lg p-8 border border-gray-200"> .filter((a) => a.type === 'support')
<h3 className="text-xl font-bold mb-4">{plan.title}</h3> .map((plan, index) => (
<div
<ul className="space-y-3 mb-8"> key={index}
{plan.features.map((feature, fIndex) => ( className="bg-white rounded-xl shadow-lg p-8 border border-gray-200"
<li key={fIndex} className="flex items-center space-x-2 text-gray-700">
<FaCheckCircle className="w-5 h-5 text-green-500 flex-shrink-0" />
<span>{feature}</span>
</li>
))}
</ul>
<Link
to={ROUTES_ENUM.public.contact}
className="block text-center bg-blue-600 text-white px-6 py-3 rounded-lg hover:bg-blue-700 transition-colors"
> >
{translate('::Public.services.support.contactButton')} <div className="mb-6">{plan.icon}</div>
</Link> <h3 className="text-xl font-bold mb-4">{plan.title}</h3>
</div> <ul className="space-y-3 mb-8">
))} {plan.features.map((feature, fIndex) => (
<li key={fIndex} className="flex items-center space-x-2 text-gray-700">
<FaCheckCircle className="w-5 h-5 text-green-500 flex-shrink-0" />
<span>{feature}</span>
</li>
))}
</ul>
<Link
to={ROUTES_ENUM.public.contact}
className="block text-center bg-blue-600 text-white px-6 py-3 rounded-lg hover:bg-blue-700 transition-colors"
>
{translate('::Public.services.support.contactButton')}
</Link>
</div>
))}
</div> </div>
</div> </div>
</div> </div>