feat : add phase A permissions to controller
parent
a6ebce4b8f
commit
d72bf848b5
|
@ -56,6 +56,7 @@
|
|||
<ItemGroup>
|
||||
<Using Include="Autofac" />
|
||||
<Using Include="Autofac.Extensions.DependencyInjection" />
|
||||
<Using Include="Brizco.Common.Models.Claims" />
|
||||
<Using Include="Brizco.Common.Models.Entity" />
|
||||
<Using Include="Brizco.Common.Models.Exception" />
|
||||
<Using Include="Brizco.Common.Models.Mapper" />
|
||||
|
|
|
@ -1,4 +1,6 @@
|
|||
namespace Brizco.Api.Controllers;
|
||||
using Brizco.Common.Models.Claims;
|
||||
|
||||
namespace Brizco.Api.Controllers;
|
||||
|
||||
public class ActivityController : ICarterModule
|
||||
{
|
||||
|
@ -11,22 +13,27 @@ public class ActivityController : ICarterModule
|
|||
|
||||
group.MapGet("", GetAllAsync)
|
||||
.WithDisplayName("GetActivities")
|
||||
.RequireAuthorization(builder=>builder.RequireClaim(CustomClaimType.Permission,ApplicationPermission.ViewActivities, ApplicationPermission.ManageActivities))
|
||||
.HasApiVersion(1.0);
|
||||
|
||||
group.MapGet("{id:guid}", GetAsync)
|
||||
.WithDisplayName("GetActivity")
|
||||
.RequireAuthorization(builder => builder.RequireClaim(CustomClaimType.Permission, ApplicationPermission.ViewActivities, ApplicationPermission.ManageActivities))
|
||||
.HasApiVersion(1.0);
|
||||
|
||||
group.MapPost("done/{id:guid}", DoneActivityAsync)
|
||||
.WithDisplayName("DoneActivity")
|
||||
.RequireAuthorization(builder => builder.RequireClaim(CustomClaimType.Permission, ApplicationPermission.ChangeActivityStatus))
|
||||
.HasApiVersion(1.0);
|
||||
|
||||
group.MapPost("complete", CompleteActivityAsync)
|
||||
.WithDisplayName("DoneActivity")
|
||||
.RequireAuthorization(builder => builder.RequireClaim(CustomClaimType.Permission, ApplicationPermission.ChangeActivityStatus))
|
||||
.HasApiVersion(1.0);
|
||||
|
||||
group.MapPost("undone/{id:guid}", UnDoneActivityAsync)
|
||||
.WithDisplayName("UnDoneActivity")
|
||||
.RequireAuthorization(builder => builder.RequireClaim(CustomClaimType.Permission, ApplicationPermission.ChangeActivityStatus))
|
||||
.HasApiVersion(1.0);
|
||||
|
||||
//group.MapPost("", Post)
|
||||
|
|
|
@ -11,19 +11,24 @@ public class ComplexController : ICarterModule
|
|||
|
||||
group.MapGet("", GetAllAsync)
|
||||
.WithDisplayName("GetAllComplex")
|
||||
.RequireAuthorization(builder => builder.RequireClaim(CustomClaimType.Permission, ApplicationPermission.ViewComplexes, ApplicationPermission.ManageComplexes))
|
||||
.HasApiVersion(1.0);
|
||||
|
||||
group.MapGet("{id}", GetAsync)
|
||||
.WithDisplayName("GetOneComplex")
|
||||
.RequireAuthorization(builder => builder.RequireClaim(CustomClaimType.Permission, ApplicationPermission.ViewComplexes, ApplicationPermission.ManageComplexes))
|
||||
.HasApiVersion(1.0);
|
||||
|
||||
group.MapPost("", Post)
|
||||
.RequireAuthorization(builder => builder.RequireClaim(CustomClaimType.Permission, ApplicationPermission.ManageComplexes))
|
||||
.HasApiVersion(1.0);
|
||||
|
||||
group.MapPut("", Put)
|
||||
.RequireAuthorization(builder => builder.RequireClaim(CustomClaimType.Permission, ApplicationPermission.ManageComplexes))
|
||||
.HasApiVersion(1.0);
|
||||
|
||||
group.MapDelete("{id}", Delete)
|
||||
.RequireAuthorization(builder => builder.RequireClaim(CustomClaimType.Permission, ApplicationPermission.ManageComplexes))
|
||||
.HasApiVersion(1.0);
|
||||
}
|
||||
|
||||
|
|
|
@ -11,19 +11,24 @@ public class PositionController : ICarterModule
|
|||
|
||||
group.MapGet("", GetAllAsync)
|
||||
.WithDisplayName("GetAllPositions")
|
||||
.RequireAuthorization(builder => builder.RequireClaim(CustomClaimType.Permission, ApplicationPermission.ViewPositions,ApplicationPermission.ManagePositions))
|
||||
.HasApiVersion(1.0);
|
||||
|
||||
group.MapGet("{id}", GetAsync)
|
||||
.WithDisplayName("GetPosition")
|
||||
.RequireAuthorization(builder => builder.RequireClaim(CustomClaimType.Permission, ApplicationPermission.ViewPositions, ApplicationPermission.ManagePositions))
|
||||
.HasApiVersion(1.0);
|
||||
|
||||
group.MapPost("", Post)
|
||||
.RequireAuthorization(builder => builder.RequireClaim(CustomClaimType.Permission, ApplicationPermission.ManagePositions))
|
||||
.HasApiVersion(1.0);
|
||||
|
||||
group.MapPut("", Put)
|
||||
.RequireAuthorization(builder => builder.RequireClaim(CustomClaimType.Permission, ApplicationPermission.ManagePositions))
|
||||
.HasApiVersion(1.0);
|
||||
|
||||
group.MapDelete("{id}", Delete)
|
||||
.RequireAuthorization(builder => builder.RequireClaim(CustomClaimType.Permission, ApplicationPermission.ManagePositions))
|
||||
.HasApiVersion(1.0);
|
||||
}
|
||||
|
||||
|
|
|
@ -12,10 +12,12 @@ public class ReportController : ICarterModule
|
|||
|
||||
group.MapGet("task", GetTasksReportAsync)
|
||||
.WithDisplayName("Get Tasks Report")
|
||||
.RequireAuthorization(builder => builder.RequireClaim(CustomClaimType.Permission, ApplicationPermission.ManageReports))
|
||||
.HasApiVersion(1.0);
|
||||
|
||||
group.MapGet("shift/plan/{shiftPLanId}", GetShiftPlanReportAsync)
|
||||
.WithDisplayName("Get ShiftPlan Report")
|
||||
.RequireAuthorization(builder => builder.RequireClaim(CustomClaimType.Permission, ApplicationPermission.ManageReports))
|
||||
.HasApiVersion(1.0);
|
||||
}
|
||||
|
||||
|
|
|
@ -15,14 +15,17 @@ public class RoleController : ICarterModule
|
|||
|
||||
group.MapGet("/permission", GetPermissions)
|
||||
.WithDisplayName("Permissions")
|
||||
.RequireAuthorization(builder => builder.RequireClaim(CustomClaimType.Permission, ApplicationPermission.ManageRoles))
|
||||
.HasApiVersion(1.0);
|
||||
|
||||
group.MapGet("", GetAllAsync)
|
||||
.WithDisplayName("GetAllRoles")
|
||||
.RequireAuthorization(builder => builder.RequireClaim(CustomClaimType.Permission, ApplicationPermission.ManageRoles))
|
||||
.HasApiVersion(1.0);
|
||||
|
||||
group.MapGet("{id}", GetAsync)
|
||||
.WithDisplayName("GetOneRole")
|
||||
.RequireAuthorization(builder => builder.RequireClaim(CustomClaimType.Permission, ApplicationPermission.ManageRoles))
|
||||
.HasApiVersion(1.0);
|
||||
|
||||
//group.MapPost("", Post)
|
||||
|
|
|
@ -10,23 +10,29 @@ public class RoutineController : ICarterModule
|
|||
|
||||
group.MapGet("", GetAllAsync)
|
||||
.WithDisplayName("GetAllRoutines")
|
||||
.RequireAuthorization(builder => builder.RequireClaim(CustomClaimType.Permission, ApplicationPermission.ManageRoutines,ApplicationPermission.ViewRoutines))
|
||||
.HasApiVersion(1.0);
|
||||
|
||||
group.MapGet("{id}/shift", GetShiftsAsync)
|
||||
.WithDisplayName("GetRoutineShifts")
|
||||
.RequireAuthorization(builder => builder.RequireClaim(CustomClaimType.Permission, ApplicationPermission.ManageRoutines, ApplicationPermission.ViewRoutines))
|
||||
.HasApiVersion(1.0);
|
||||
|
||||
group.MapGet("{id}", GetAsync)
|
||||
.WithDisplayName("GetRoutine")
|
||||
.RequireAuthorization(builder => builder.RequireClaim(CustomClaimType.Permission, ApplicationPermission.ManageRoutines))
|
||||
.HasApiVersion(1.0);
|
||||
|
||||
group.MapPost("", Post)
|
||||
.RequireAuthorization(builder => builder.RequireClaim(CustomClaimType.Permission, ApplicationPermission.ManageRoutines))
|
||||
.HasApiVersion(1.0);
|
||||
|
||||
group.MapPut("", Put)
|
||||
.RequireAuthorization(builder => builder.RequireClaim(CustomClaimType.Permission, ApplicationPermission.ManageRoutines))
|
||||
.HasApiVersion(1.0);
|
||||
|
||||
group.MapDelete("{id}", Delete)
|
||||
.RequireAuthorization(builder => builder.RequireClaim(CustomClaimType.Permission, ApplicationPermission.ManageRoutines))
|
||||
.HasApiVersion(1.0);
|
||||
}
|
||||
|
||||
|
|
|
@ -11,19 +11,24 @@ public class SectionController : ICarterModule
|
|||
|
||||
group.MapGet("", GetAllAsync)
|
||||
.WithDisplayName("GetAllSections")
|
||||
.RequireAuthorization(builder => builder.RequireClaim(CustomClaimType.Permission, ApplicationPermission.ManageSections, ApplicationPermission.ViewSections))
|
||||
.HasApiVersion(1.0);
|
||||
|
||||
group.MapGet("{id}", GetAsync)
|
||||
.WithDisplayName("GetSection")
|
||||
.RequireAuthorization(builder => builder.RequireClaim(CustomClaimType.Permission, ApplicationPermission.ManageSections, ApplicationPermission.ViewSections))
|
||||
.HasApiVersion(1.0);
|
||||
|
||||
group.MapPost("", Post)
|
||||
.RequireAuthorization(builder => builder.RequireClaim(CustomClaimType.Permission, ApplicationPermission.ManageSections))
|
||||
.HasApiVersion(1.0);
|
||||
|
||||
group.MapPut("", Put)
|
||||
.RequireAuthorization(builder => builder.RequireClaim(CustomClaimType.Permission, ApplicationPermission.ManageSections))
|
||||
.HasApiVersion(1.0);
|
||||
|
||||
group.MapDelete("{id}", Delete)
|
||||
.RequireAuthorization(builder => builder.RequireClaim(CustomClaimType.Permission, ApplicationPermission.ManageSections))
|
||||
.HasApiVersion(1.0);
|
||||
}
|
||||
|
||||
|
|
|
@ -12,19 +12,24 @@ public class ShiftController : ICarterModule
|
|||
|
||||
group.MapGet("", GetAllAsync)
|
||||
.WithDisplayName("GetAllShift")
|
||||
.RequireAuthorization(builder => builder.RequireClaim(CustomClaimType.Permission, ApplicationPermission.ManageShifts, ApplicationPermission.ViewShifts))
|
||||
.HasApiVersion(1.0);
|
||||
|
||||
group.MapGet("{id}", GetAsync)
|
||||
.WithDisplayName("GetOneShift")
|
||||
.RequireAuthorization(builder => builder.RequireClaim(CustomClaimType.Permission, ApplicationPermission.ManageShifts, ApplicationPermission.ViewShifts))
|
||||
.HasApiVersion(1.0);
|
||||
|
||||
group.MapPost("", Post)
|
||||
.RequireAuthorization(builder => builder.RequireClaim(CustomClaimType.Permission, ApplicationPermission.ManageShifts))
|
||||
.HasApiVersion(1.0);
|
||||
|
||||
group.MapPut("", Put)
|
||||
.RequireAuthorization(builder => builder.RequireClaim(CustomClaimType.Permission, ApplicationPermission.ManageShifts))
|
||||
.HasApiVersion(1.0);
|
||||
|
||||
group.MapDelete("{id}", Delete)
|
||||
.RequireAuthorization(builder => builder.RequireClaim(CustomClaimType.Permission, ApplicationPermission.ManageShifts))
|
||||
.HasApiVersion(1.0);
|
||||
}
|
||||
|
||||
|
|
|
@ -13,20 +13,25 @@ public class ShiftPlanController : ICarterModule
|
|||
|
||||
group.MapGet("", GetAllAsync)
|
||||
.WithDisplayName("GetShiftPlans")
|
||||
.RequireAuthorization(builder => builder.RequireClaim(CustomClaimType.Permission, ApplicationPermission.ManageShiftPlans, ApplicationPermission.ViewShiftPlans))
|
||||
.HasApiVersion(1.0);
|
||||
|
||||
group.MapGet("{id:guid}", GetAsync)
|
||||
.WithDisplayName("GetShiftPlan")
|
||||
.RequireAuthorization(builder => builder.RequireClaim(CustomClaimType.Permission, ApplicationPermission.ManageShiftPlans, ApplicationPermission.ViewShiftPlans))
|
||||
.HasApiVersion(1.0);
|
||||
|
||||
group.MapPost("{id:guid}/complete", CompletePlanAsync)
|
||||
.WithDisplayName("DoneActivity")
|
||||
.RequireAuthorization(builder => builder.RequireClaim(CustomClaimType.Permission, ApplicationPermission.ManageShiftPlans))
|
||||
.HasApiVersion(1.0);
|
||||
|
||||
group.MapPost("", Post)
|
||||
.RequireAuthorization(builder => builder.RequireClaim(CustomClaimType.Permission, ApplicationPermission.ManageShiftPlans))
|
||||
.HasApiVersion(1.0);
|
||||
|
||||
group.MapPut("", Put)
|
||||
.RequireAuthorization(builder => builder.RequireClaim(CustomClaimType.Permission, ApplicationPermission.ManageShiftPlans))
|
||||
.HasApiVersion(1.0);
|
||||
|
||||
group.MapDelete("{id:guid}", Delete)
|
||||
|
|
|
@ -13,19 +13,24 @@ public class TaskController : ICarterModule
|
|||
|
||||
group.MapGet("", GetAllAsync)
|
||||
.WithDisplayName("GetAllTask")
|
||||
.RequireAuthorization(builder => builder.RequireClaim(CustomClaimType.Permission, ApplicationPermission.ManageTasks,ApplicationPermission.ViewTasks))
|
||||
.HasApiVersion(1.0);
|
||||
|
||||
group.MapGet("{id}", GetAsync)
|
||||
.WithDisplayName("GetOneTask")
|
||||
.RequireAuthorization(builder => builder.RequireClaim(CustomClaimType.Permission, ApplicationPermission.ManageTasks,ApplicationPermission.ViewTasks))
|
||||
.HasApiVersion(1.0);
|
||||
|
||||
group.MapPost("", Post)
|
||||
.RequireAuthorization(builder => builder.RequireClaim(CustomClaimType.Permission, ApplicationPermission.ManageTasks))
|
||||
.HasApiVersion(1.0);
|
||||
|
||||
group.MapPut("", Put)
|
||||
.RequireAuthorization(builder => builder.RequireClaim(CustomClaimType.Permission, ApplicationPermission.ManageTasks))
|
||||
.HasApiVersion(1.0);
|
||||
|
||||
group.MapDelete("{id}", Delete)
|
||||
.RequireAuthorization(builder => builder.RequireClaim(CustomClaimType.Permission, ApplicationPermission.ManageTasks))
|
||||
.HasApiVersion(1.0);
|
||||
}
|
||||
|
||||
|
|
|
@ -13,10 +13,12 @@ public class UserController : ICarterModule
|
|||
|
||||
group.MapGet("", GetAllAsync)
|
||||
.WithDisplayName("GetAllUser")
|
||||
.RequireAuthorization(builder => builder.RequireClaim(CustomClaimType.Permission, ApplicationPermission.ViewUsers,ApplicationPermission.ManageUsers))
|
||||
.HasApiVersion(1.0);
|
||||
|
||||
group.MapGet("{id}", GetAsync)
|
||||
.WithDisplayName("GetOneUser")
|
||||
.RequireAuthorization(builder => builder.RequireClaim(CustomClaimType.Permission, ApplicationPermission.ViewUsers, ApplicationPermission.ManageUsers))
|
||||
.HasApiVersion(1.0);
|
||||
|
||||
group.MapGet("/profile", GetUserProfileAsync)
|
||||
|
@ -25,15 +27,19 @@ public class UserController : ICarterModule
|
|||
|
||||
group.MapPost("/role/change/{roleId}", ChangeUserRoleAsync)
|
||||
.WithDisplayName("GetUserProfile")
|
||||
.RequireAuthorization(builder => builder.RequireClaim(CustomClaimType.Permission, ApplicationPermission.ManageUsers))
|
||||
.HasApiVersion(1.0);
|
||||
|
||||
group.MapPost("", Post)
|
||||
.RequireAuthorization(builder => builder.RequireClaim(CustomClaimType.Permission, ApplicationPermission.ManageUsers))
|
||||
.HasApiVersion(1.0);
|
||||
|
||||
group.MapPut("", Put)
|
||||
.RequireAuthorization(builder => builder.RequireClaim(CustomClaimType.Permission, ApplicationPermission.ManageUsers))
|
||||
.HasApiVersion(1.0);
|
||||
|
||||
group.MapDelete("{id}", Delete)
|
||||
.RequireAuthorization(builder => builder.RequireClaim(CustomClaimType.Permission, ApplicationPermission.ManageUsers))
|
||||
.HasApiVersion(1.0);
|
||||
}
|
||||
|
||||
|
|
|
@ -83,6 +83,13 @@ public static class ApplicationClaims
|
|||
Title = "دسترسی کامل به فعالیت ها",
|
||||
Detail = "دسترسی به افزودن و مدیریت فعالیت ها فروشگاه شما"
|
||||
};
|
||||
public static ClaimDto ChangeActivityStatus { get; } = new ClaimDto
|
||||
{
|
||||
Type = CustomClaimType.Permission,
|
||||
Value = ApplicationPermission.ChangeActivityStatus,
|
||||
Title = "تغییر وضعیت به فعالیت ",
|
||||
Detail = "دسترسی به افزودن و مدیریت فعالیت ها فروشگاه شما"
|
||||
};
|
||||
public static ClaimDto ViewActivities { get; } = new ClaimDto
|
||||
{
|
||||
Type = CustomClaimType.Permission,
|
||||
|
@ -155,17 +162,49 @@ public static class ApplicationClaims
|
|||
Title = "مشاهده تنظیمات ها",
|
||||
Detail = "دسترسی به مشاهده تنظیمات ها فروشگاه شما"
|
||||
};
|
||||
public static ClaimDto ManageReports { get; } = new ClaimDto
|
||||
{
|
||||
Type = CustomClaimType.Permission,
|
||||
Value = ApplicationPermission.ManageReports,
|
||||
Title = "مشاهده گزارشات",
|
||||
Detail = "دسترسی به مشاهده گزارشات"
|
||||
};
|
||||
public static ClaimDto ManageRoles { get; } = new ClaimDto
|
||||
{
|
||||
Type = CustomClaimType.Permission,
|
||||
Value = ApplicationPermission.ManageRoles,
|
||||
Title = "مشاهده گزارشات",
|
||||
Detail = "دسترسی به مشاهده گزارشات"
|
||||
};
|
||||
public static ClaimDto ManageUsers { get; } = new ClaimDto
|
||||
{
|
||||
Type = CustomClaimType.Permission,
|
||||
Value = ApplicationPermission.ManageUsers,
|
||||
Title = "تغییر کاربران",
|
||||
Detail = "دسترسی و تغییر در کاربران"
|
||||
};
|
||||
public static ClaimDto ViewUsers { get; } = new ClaimDto
|
||||
{
|
||||
Type = CustomClaimType.Permission,
|
||||
Value = ApplicationPermission.ViewUsers,
|
||||
Title = "مشاهده کاربران",
|
||||
Detail = "دسترسی و تغییر در کاربران"
|
||||
};
|
||||
|
||||
public static List<ClaimDto> AllClaimDtos = new List<ClaimDto>
|
||||
{
|
||||
ManageActivities,
|
||||
ViewTasks,
|
||||
ManageTasks,
|
||||
|
||||
ManageReports,
|
||||
ManageRoles,
|
||||
ManageShiftPlans,
|
||||
ViewShifts,
|
||||
ManageShifts,
|
||||
|
||||
ManageUsers,
|
||||
ViewUsers
|
||||
|
||||
ViewComplexes,
|
||||
ManageComplexes,
|
||||
|
||||
|
@ -188,6 +227,11 @@ public static class ApplicationClaims
|
|||
{
|
||||
ManageStaffs.GetClaim,
|
||||
ViewStaffs.GetClaim,
|
||||
ManageReports.GetClaim,
|
||||
ManageRoles.GetClaim,
|
||||
|
||||
ViewUsers.GetClaim,
|
||||
ManageUsers.GetClaim,
|
||||
|
||||
ViewTasks.GetClaim,
|
||||
ManageTasks.GetClaim,
|
||||
|
@ -219,10 +263,14 @@ public static class ApplicationClaims
|
|||
{
|
||||
ManageStaffs.GetClaim,
|
||||
ViewStaffs.GetClaim,
|
||||
ManageReports.GetClaim,
|
||||
|
||||
ManageActivities.GetClaim,
|
||||
ViewActivities.GetClaim,
|
||||
|
||||
ViewUsers.GetClaim,
|
||||
ManageUsers.GetClaim,
|
||||
|
||||
ViewTasks.GetClaim,
|
||||
ManageTasks.GetClaim,
|
||||
|
||||
|
@ -264,13 +312,18 @@ public static class ApplicationClaims
|
|||
ViewSections.GetClaim,
|
||||
|
||||
ViewDashboard.GetClaim,
|
||||
|
||||
ViewUsers.GetClaim,
|
||||
|
||||
ViewComplexSettings.GetClaim
|
||||
};
|
||||
|
||||
public static List<Claim> SuperVisorClaims = new List<Claim>
|
||||
{
|
||||
ManageActivities.GetClaim,
|
||||
ChangeActivityStatus.GetClaim,
|
||||
ViewActivities.GetClaim,
|
||||
ManageReports.GetClaim,
|
||||
|
||||
ViewTasks.GetClaim,
|
||||
ManageTasks.GetClaim,
|
||||
|
@ -286,7 +339,7 @@ public static class ApplicationClaims
|
|||
|
||||
public static List<Claim> StaffClaims = new List<Claim>
|
||||
{
|
||||
ManageActivities.GetClaim,
|
||||
ChangeActivityStatus.GetClaim,
|
||||
ViewActivities.GetClaim,
|
||||
|
||||
ViewTasks.GetClaim,
|
||||
|
|
|
@ -1,6 +1,12 @@
|
|||
namespace Brizco.Common.Models.Claims;
|
||||
public static class ApplicationPermission
|
||||
{
|
||||
public const string ManageReports = nameof(ManageReports);
|
||||
public const string ManageRoles = nameof(ManageRoles);
|
||||
|
||||
public const string ManageUsers = nameof(ManageUsers);
|
||||
public const string ViewUsers = nameof(ViewUsers);
|
||||
|
||||
public const string ManageComplexes = nameof(ManageComplexes);
|
||||
public const string ViewComplexes = nameof(ViewComplexes);
|
||||
|
||||
|
@ -18,6 +24,7 @@ public static class ApplicationPermission
|
|||
public const string ViewTasks = nameof(ViewTasks);
|
||||
|
||||
public const string ManageActivities = nameof(ManageActivities);
|
||||
public const string ChangeActivityStatus = nameof(ChangeActivityStatus);
|
||||
public const string ViewActivities = nameof(ViewActivities);
|
||||
|
||||
public const string ManageRoutines = nameof(ManageRoutines);
|
||||
|
|
|
@ -189,6 +189,10 @@ public class TaskReportCommandHandler : IRequestHandler<TaskReportCommand , byte
|
|||
style.WrapText = true;
|
||||
style.FillForegroundColor = NPOI.HSSF.Util.HSSFColor.Gold.Index;
|
||||
style.FillPattern = FillPattern.SolidForeground;
|
||||
|
||||
style.BorderTop = BorderStyle.Dashed;
|
||||
style.TopBorderColor = NPOI.HSSF.Util.HSSFColor.BlueGrey.Index;
|
||||
|
||||
style.SetFont(font);
|
||||
if (lastRow > startRow)
|
||||
{
|
||||
|
|
Loading…
Reference in New Issue