namespace Yes.Application.Admins.Themes { public record DeleteThemeCommand(string ThemeName) : IRequest; public record DeleteThemeCommandResponse(); public class DeleteThemeCommandHandler( IWebHostEnvironment env, BlogDbContext db, IIdentityContext identity, IOptionsMonitor options) : IRequestHandler { private readonly IWebHostEnvironment _env = env; private readonly BlogSettings _settings = options.CurrentValue; private readonly BlogDbContext _db = db; private readonly IIdentityContext _identity = identity; public async Task Handle(DeleteThemeCommand request, CancellationToken cancellationToken) { var identityUser = await _db.Users.FindAsync(_identity.Id); if (identityUser == null) { throw new UserNotExistsException(_identity.Id); } if (!identityUser.IsSystemUser()) { throw new AccessDeniedException(); } try { var themeName = request.ThemeName; if (_settings.Theme == themeName) { throw new ThemeInUseException(); } var targetDirectory = Path.Combine(_env.ContentRootPath, "files", "themes", themeName); if (Directory.Exists(targetDirectory)) Directory.Delete(targetDirectory, recursive: true); return new DeleteThemeCommandResponse(); } catch (Exception ex) when (ex is OverflowException) { throw new FileOverflowException(); } catch (Exception ex) when (ex is InvalidDataException) { throw new FileNotSupportedException(ex.Message); } } } }