2025-05-06 06:45:49 +00:00
|
|
|
|
using System;
|
|
|
|
|
|
using System.Collections.Generic;
|
|
|
|
|
|
using System.Linq;
|
|
|
|
|
|
using System.Threading.Tasks;
|
|
|
|
|
|
using Kurs.Languages.Entities;
|
|
|
|
|
|
using Kurs.Platform.Entities;
|
2025-10-12 14:44:34 +00:00
|
|
|
|
using Kurs.Platform.Extensions;
|
2025-05-06 06:45:49 +00:00
|
|
|
|
using Microsoft.AspNetCore.Authorization;
|
|
|
|
|
|
using Microsoft.Extensions.Logging;
|
|
|
|
|
|
using Volo.Abp.Application.Dtos;
|
|
|
|
|
|
using Volo.Abp.Application.Services;
|
|
|
|
|
|
using Volo.Abp.Domain.Repositories;
|
2025-10-12 14:44:34 +00:00
|
|
|
|
using Volo.Abp.MultiTenancy;
|
|
|
|
|
|
using Volo.Abp.PermissionManagement;
|
|
|
|
|
|
using Volo.Abp.TenantManagement;
|
2025-06-26 14:59:53 +00:00
|
|
|
|
using static Kurs.Platform.Data.Seeds.SeedConsts;
|
2025-05-06 06:45:49 +00:00
|
|
|
|
|
|
|
|
|
|
namespace Kurs.Platform.Menus;
|
|
|
|
|
|
|
|
|
|
|
|
[Authorize]
|
|
|
|
|
|
public class MenuAppService : CrudAppService<
|
|
|
|
|
|
Menu,
|
|
|
|
|
|
MenuDto,
|
|
|
|
|
|
Guid,
|
|
|
|
|
|
PagedAndSortedResultRequestDto>
|
|
|
|
|
|
{
|
|
|
|
|
|
private readonly IRepository<Menu, Guid> _menuRepository;
|
|
|
|
|
|
private readonly IRepository<LanguageKey, Guid> _repositoryKey;
|
2025-10-12 14:44:34 +00:00
|
|
|
|
private readonly ITenantRepository _tenantRepository;
|
|
|
|
|
|
private readonly IPermissionDefinitionRecordRepository _permissionRepository;
|
2025-05-06 06:45:49 +00:00
|
|
|
|
|
|
|
|
|
|
public MenuAppService(
|
|
|
|
|
|
IRepository<Menu, Guid> menuRepository,
|
2025-10-12 14:44:34 +00:00
|
|
|
|
IRepository<LanguageKey, Guid> languageKeyRepository,
|
|
|
|
|
|
ITenantRepository tenantRepository,
|
|
|
|
|
|
IPermissionDefinitionRecordRepository permissionRepository
|
|
|
|
|
|
) : base(menuRepository)
|
2025-05-06 06:45:49 +00:00
|
|
|
|
{
|
|
|
|
|
|
_menuRepository = menuRepository;
|
|
|
|
|
|
_repositoryKey = languageKeyRepository;
|
2025-10-12 14:44:34 +00:00
|
|
|
|
_tenantRepository = tenantRepository;
|
|
|
|
|
|
_permissionRepository = permissionRepository;
|
2025-06-26 14:59:53 +00:00
|
|
|
|
|
|
|
|
|
|
CreatePolicyName = $"{AppCodes.Menus.Menu}.Create";
|
|
|
|
|
|
UpdatePolicyName = $"{AppCodes.Menus.Menu}.Update";
|
|
|
|
|
|
DeletePolicyName = $"{AppCodes.Menus.Menu}.Delete";
|
2025-05-06 06:45:49 +00:00
|
|
|
|
}
|
|
|
|
|
|
|
2025-10-12 14:44:34 +00:00
|
|
|
|
public override async Task<PagedResultDto<MenuDto>> GetListAsync(PagedAndSortedResultRequestDto input)
|
2025-05-06 06:45:49 +00:00
|
|
|
|
{
|
|
|
|
|
|
await CheckGetListPolicyAsync();
|
|
|
|
|
|
|
|
|
|
|
|
var query = await CreateFilteredQueryAsync(input);
|
|
|
|
|
|
query = query.Where(a => !a.IsDisabled);
|
2025-10-11 23:29:45 +00:00
|
|
|
|
|
2025-10-12 14:44:34 +00:00
|
|
|
|
//Tenant üzerinden MenuGrup bilgisi alınıp sadece o menüler listelenecek
|
|
|
|
|
|
if (CurrentTenant.IsAvailable)
|
2025-10-11 23:29:45 +00:00
|
|
|
|
{
|
2025-10-12 14:44:34 +00:00
|
|
|
|
var tenant = await _tenantRepository.FindAsync(CurrentTenant.Id.Value);
|
|
|
|
|
|
if (tenant != null)
|
|
|
|
|
|
{
|
|
|
|
|
|
var tenantMenuGroup = tenant.GetMenuGroup();
|
|
|
|
|
|
if (!tenantMenuGroup.IsNullOrWhiteSpace())
|
|
|
|
|
|
{
|
|
|
|
|
|
var permissionRecords = await _permissionRepository.GetListAsync();
|
|
|
|
|
|
var allowedPermissionNames = permissionRecords
|
|
|
|
|
|
.Where(p => p.GetMenuGroup().Contains(tenantMenuGroup))
|
|
|
|
|
|
.Select(p => p.Name)
|
|
|
|
|
|
.Distinct()
|
|
|
|
|
|
.ToList();
|
|
|
|
|
|
|
|
|
|
|
|
query = query.Where(menu =>
|
|
|
|
|
|
string.IsNullOrEmpty(menu.RequiredPermissionName) ||
|
|
|
|
|
|
allowedPermissionNames.Contains(menu.RequiredPermissionName));
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
}
|
2025-10-11 23:29:45 +00:00
|
|
|
|
}
|
|
|
|
|
|
|
2025-05-06 06:45:49 +00:00
|
|
|
|
var totalCount = await AsyncExecuter.CountAsync(query);
|
|
|
|
|
|
|
|
|
|
|
|
var entities = new List<Menu>();
|
|
|
|
|
|
var entityDtos = new List<MenuDto>();
|
|
|
|
|
|
|
|
|
|
|
|
if (totalCount > 0)
|
|
|
|
|
|
{
|
|
|
|
|
|
query = ApplySorting(query, input);
|
|
|
|
|
|
query = ApplyPaging(query, input);
|
|
|
|
|
|
|
|
|
|
|
|
var items = await AsyncExecuter.ToListAsync(query);
|
|
|
|
|
|
foreach (var item in items)
|
|
|
|
|
|
{
|
|
|
|
|
|
if (item.RequiredPermissionName.IsNullOrWhiteSpace())
|
|
|
|
|
|
{
|
|
|
|
|
|
entities.Add(item);
|
|
|
|
|
|
}
|
|
|
|
|
|
else
|
|
|
|
|
|
{
|
|
|
|
|
|
try
|
|
|
|
|
|
{
|
|
|
|
|
|
var result = await AuthorizationService.IsGrantedAsync(item.RequiredPermissionName);
|
|
|
|
|
|
if (result == true)
|
|
|
|
|
|
{
|
|
|
|
|
|
entities.Add(item);
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
catch (Exception ex)
|
|
|
|
|
|
{
|
|
|
|
|
|
Logger.LogError(ex, ex.Message);
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
entityDtos = await base.MapToGetListOutputDtosAsync(entities);
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
return new PagedResultDto<MenuDto>(
|
|
|
|
|
|
totalCount,
|
|
|
|
|
|
entityDtos
|
|
|
|
|
|
);
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
public override async Task<MenuDto> CreateAsync(MenuDto input)
|
|
|
|
|
|
{
|
2025-06-26 14:59:53 +00:00
|
|
|
|
await CheckCreatePolicyAsync();
|
|
|
|
|
|
|
2025-05-06 06:45:49 +00:00
|
|
|
|
var keyExists = await _repositoryKey.AnyAsync(
|
|
|
|
|
|
a => a.Key == input.DisplayName &&
|
|
|
|
|
|
a.ResourceName == PlatformConsts.AppName);
|
|
|
|
|
|
if (!keyExists)
|
|
|
|
|
|
{
|
|
|
|
|
|
await _repositoryKey.InsertAsync(new LanguageKey
|
|
|
|
|
|
{
|
|
|
|
|
|
Key = input.DisplayName,
|
|
|
|
|
|
ResourceName = PlatformConsts.AppName
|
|
|
|
|
|
});
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
return await base.CreateAsync(input);
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
public override async Task<MenuDto> UpdateAsync(Guid id, MenuDto input)
|
|
|
|
|
|
{
|
2025-06-26 14:59:53 +00:00
|
|
|
|
await CheckUpdatePolicyAsync();
|
|
|
|
|
|
|
2025-05-06 06:45:49 +00:00
|
|
|
|
var key = await _repositoryKey.FirstOrDefaultAsync(
|
|
|
|
|
|
a => a.Key == input.DisplayName &&
|
|
|
|
|
|
a.ResourceName == PlatformConsts.AppName);
|
|
|
|
|
|
|
|
|
|
|
|
if (key is null)
|
|
|
|
|
|
{
|
|
|
|
|
|
// Yeni Key'i olustur
|
|
|
|
|
|
await _repositoryKey.InsertAsync(new LanguageKey
|
|
|
|
|
|
{
|
|
|
|
|
|
Key = input.DisplayName,
|
|
|
|
|
|
ResourceName = PlatformConsts.AppName
|
|
|
|
|
|
});
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
return await base.UpdateAsync(id, input);
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2025-06-26 14:59:53 +00:00
|
|
|
|
public async Task<List<MenuDto>> UpdateAllAsync(List<MenuDto> inputs)
|
|
|
|
|
|
{
|
|
|
|
|
|
await CheckUpdatePolicyAsync();
|
|
|
|
|
|
|
|
|
|
|
|
var result = new List<MenuDto>();
|
|
|
|
|
|
|
|
|
|
|
|
foreach (var input in inputs)
|
|
|
|
|
|
{
|
|
|
|
|
|
if (input.Id == Guid.Empty)
|
|
|
|
|
|
{
|
|
|
|
|
|
throw new ArgumentException("MenuDto içinde geçerli bir Id bulunmalıdır.");
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
var key = await _repositoryKey.FirstOrDefaultAsync(
|
|
|
|
|
|
a => a.Key == input.DisplayName &&
|
|
|
|
|
|
a.ResourceName == PlatformConsts.AppName);
|
|
|
|
|
|
|
|
|
|
|
|
if (key is null)
|
|
|
|
|
|
{
|
|
|
|
|
|
await _repositoryKey.InsertAsync(new LanguageKey
|
|
|
|
|
|
{
|
|
|
|
|
|
Key = input.DisplayName,
|
|
|
|
|
|
ResourceName = PlatformConsts.AppName
|
|
|
|
|
|
});
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2025-10-11 23:29:45 +00:00
|
|
|
|
var updated = await base.UpdateAsync(input.Id, input);
|
2025-06-26 14:59:53 +00:00
|
|
|
|
result.Add(updated);
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
return result;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2025-05-06 06:45:49 +00:00
|
|
|
|
public override async Task DeleteAsync(Guid id)
|
|
|
|
|
|
{
|
2025-06-26 14:59:53 +00:00
|
|
|
|
await CheckDeletePolicyAsync();
|
|
|
|
|
|
|
2025-05-06 06:45:49 +00:00
|
|
|
|
var menu = await _menuRepository.GetAsync(id);
|
|
|
|
|
|
if (menu != null)
|
|
|
|
|
|
{
|
|
|
|
|
|
await _repositoryKey.DeleteAsync(
|
|
|
|
|
|
a => a.Key == menu.DisplayName &&
|
|
|
|
|
|
a.ResourceName == PlatformConsts.AppName);
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
await base.DeleteAsync(id);
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|