fix Category and SubCategory Referencing and Providers ...

This commit is contained in:
2026-07-24 01:13:38 +03:30
parent 234f39876b
commit a8e073901f
9 changed files with 543 additions and 11 deletions
+173
View File
@@ -295,6 +295,179 @@ namespace xCategoryService.Providers
return result;
}
/// <summary>
/// Add Category by It's Locales ...
/// </summary>
/// <param name="item"></param>
/// <param name="connectionId"></param>
/// <param name="userInfo"></param>
/// <param name="cancellationToken"></param>
/// <returns></returns>
public async Task<XCategoryResourceDto> AddResource(
XCategoryResourceDto item,
string connectionId = null,
XUserClaimsInfoDto userInfo = null,
CancellationToken cancellationToken = default
)
{
//
// Validate ...
var isValid =
!item.IsNullOrDefault() &&
!item.Titles.IsNullOrDefault() &&
item.Titles.Locales.HasChild() &&
!item.Titles.Locales.Any(il =>
il.Language.IsNullOrEmpty() ||
il.Value.IsNullOrEmpty());
if (!isValid)
{
XException.InvalidArgs.Throw();
}
//
// Normalize ...
if (item.Item.IsNullOrDefault())
{
item.Item = new XCategoryDto();
}
//
// Check Permission ...
isValid = HasPermision(userInfo);
if (!isValid)
{
XException.NotAllowed.Throw();
}
//
var id = -1;
try
{
//
// Add Category for ID Generation ...
item.Item = await base.Add(
item: item.Item,
userInfo: userInfo,
connectionId: null, // Since here We dont want notification ...
cancellationToken: cancellationToken
);
isValid = !item.Item.IsNullOrDefault();
if (!isValid)
{
XException.ActionFailed.Throw();
}
id = item.Item.Id;
//
foreach (var il in item.Titles.Locales)
{
//
var title = il.Value;
var language = il.Language;
//
var descriptionItem =
item.Descriptions.IsNullOrDefault() ||
!item.Descriptions.Locales.HasChild()
? null
: item.Descriptions.Locales
.FirstOrDefault(ides =>
ides.Language
.Equals(
language,
StringComparison.InvariantCultureIgnoreCase));
var description =
descriptionItem.IsNullOrDefault()
? string.Empty
: descriptionItem.Value;
//
// Try to Add Resources ...
var titleResource = await titleResourceProvider
.AddOrUpdateLocale(
identifier: id,
locale: new XLocaleResourceDto
{
Value = title,
Language = language
},
connectionId: connectionId,
cancellationToken: cancellationToken
);
var descriptionResource = await descriptionResourceProvider
.AddOrUpdateLocale(
identifier: id,
locale: new XLocaleResourceDto
{
Value = description,
Language = language
},
connectionId: connectionId,
cancellationToken: cancellationToken
);
//
// Update Category Dto if not ...
if (item.Item.Title.IsNullOrEmpty() ||
!item.Item.Title
.Equals(
titleResource.Resource,
StringComparison.InvariantCultureIgnoreCase)
)
{
//
item.Item.Title = titleResource.Resource;
item.Item.Description = descriptionResource.Resource;
item.Item = await base.Update(
id: id,
item: item.Item,
userInfo: userInfo,
connectionId: null,
cancellationToken: cancellationToken
);
}
}
}
catch
{
XException.InvalidArgs.Throw();
}
//
// Validate Id ...
isValid = id.IsValidIntId();
if (!isValid)
{
XException.ActionFailed.Throw();
}
//
// Retrieve Category Resourv=ce ...
var result = await GetResource(
id: id,
cancellationToken: cancellationToken
);
//
// Sending Push Notification ...
isValid =
isValid &&
!result.IsNullOrDefault();
if (isValid)
{
//
await provider.SendPush(
connectionId: connectionId,
cancellationToken: cancellationToken,
payLoad: result.ToJSON(camelCase: true),
action: XBaseEntityHubAction.Add.GetStringValue()
);
}
//
return result;
}
/// <summary>
/// Remove Item for Specified Language ...
/// </summary>