mirror of
				https://github.com/Kareadita/Kavita.git
				synced 2025-10-31 02:27:04 -04:00 
			
		
		
		
	* Refactored all files to have Interfaces within the same file. Started moving over to file-scoped namespaces. * Refactored common methods for getting underlying file's cover, pages, and extracting into 1 interface. * More refactoring around removing dependence on explicit filetype testing for getting information. * Code is buildable, tests are broken. Huge refactor (not completed) which makes most of DirectoryService testable with a mock filesystem (and thus the services that utilize it). * Finished porting DirectoryService to use mocked filesystem implementation. * Added a null check * Added a null check * Finished all unit tests for DirectoryService. * Some misc cleanup on the code * Fixed up some bugs from refactoring scan loop. * Implemented CleanupService testing and refactored more of DirectoryService to be non-static. Fixed a bug where cover file cleanup wasn't properly finding files due to a regex bug. * Fixed an issue in CleanupBackup() where we weren't properly selecting database files older than 30 days. Finished CleanupService Tests. * Refactored Flatten and RemoveNonImages to directory service to allow CacheService to be testable. * Finally have CacheService tested. Rewrote GetCachedPagePath() to be much more straightforward & performant. * Updated DefaultParserTests.cs to contain all existing tests and follow new test layout format. * All tests fixed up
		
			
				
	
	
		
			169 lines
		
	
	
		
			5.9 KiB
		
	
	
	
		
			C#
		
	
	
	
	
	
			
		
		
	
	
			169 lines
		
	
	
		
			5.9 KiB
		
	
	
	
		
			C#
		
	
	
	
	
	
| using System;
 | |
| using System.Collections.Generic;
 | |
| using System.IO;
 | |
| using System.IO.Abstractions;
 | |
| using System.Linq;
 | |
| using API.Services;
 | |
| using Kavita.Common;
 | |
| 
 | |
| namespace API.Data
 | |
| {
 | |
|     /// <summary>
 | |
|     /// A Migration to migrate config related files to the config/ directory for installs prior to v0.4.9.
 | |
|     /// </summary>
 | |
|     public static class MigrateConfigFiles
 | |
|     {
 | |
|         private static readonly List<string> LooseLeafFiles = new List<string>()
 | |
|         {
 | |
|             "appsettings.json",
 | |
|             "appsettings.Development.json",
 | |
|             "kavita.db",
 | |
|         };
 | |
| 
 | |
|         private static readonly List<string> AppFolders = new List<string>()
 | |
|         {
 | |
|             "covers",
 | |
|             "stats",
 | |
|             "logs",
 | |
|             "backups",
 | |
|             "cache",
 | |
|             "temp"
 | |
|         };
 | |
| 
 | |
| 
 | |
|         /// <summary>
 | |
|         /// In v0.4.8 we moved all config files to config/ to match with how docker was setup. This will move all config files from current directory
 | |
|         /// to config/
 | |
|         /// </summary>
 | |
|         public static void Migrate(bool isDocker, IDirectoryService directoryService)
 | |
|         {
 | |
|             Console.WriteLine("Checking if migration to config/ is needed");
 | |
| 
 | |
|             if (isDocker)
 | |
|             {
 | |
|                 if (Configuration.LogPath.Contains("config"))
 | |
|                 {
 | |
|                     Console.WriteLine("Migration to config/ not needed");
 | |
|                     return;
 | |
|                 }
 | |
| 
 | |
|                 Console.WriteLine(
 | |
|                     "Migrating files from pre-v0.4.8. All Kavita config files are now located in config/");
 | |
| 
 | |
|                 CopyAppFolders(directoryService);
 | |
|                 DeleteAppFolders(directoryService);
 | |
| 
 | |
|                 UpdateConfiguration();
 | |
| 
 | |
|                 Console.WriteLine("Migration complete. All config files are now in config/ directory");
 | |
|                 return;
 | |
|             }
 | |
| 
 | |
|             if (new FileInfo(Configuration.AppSettingsFilename).Exists)
 | |
|             {
 | |
|                 Console.WriteLine("Migration to config/ not needed");
 | |
|                 return;
 | |
|             }
 | |
| 
 | |
|             Console.WriteLine(
 | |
|                 "Migrating files from pre-v0.4.8. All Kavita config files are now located in config/");
 | |
| 
 | |
|             Console.WriteLine($"Creating {directoryService.ConfigDirectory}");
 | |
|             directoryService.ExistOrCreate(directoryService.ConfigDirectory);
 | |
| 
 | |
|             try
 | |
|             {
 | |
|                 CopyLooseLeafFiles(directoryService);
 | |
| 
 | |
|                 CopyAppFolders(directoryService);
 | |
| 
 | |
|                 // Then we need to update the config file to point to the new DB file
 | |
|                 UpdateConfiguration();
 | |
|             }
 | |
|             catch (Exception)
 | |
|             {
 | |
|                 Console.WriteLine("There was an exception during migration. Please move everything manually.");
 | |
|                 return;
 | |
|             }
 | |
| 
 | |
|             // Finally delete everything in the source directory
 | |
|             Console.WriteLine("Removing old files");
 | |
|             DeleteLooseFiles(directoryService);
 | |
|             DeleteAppFolders(directoryService);
 | |
|             Console.WriteLine("Removing old files...DONE");
 | |
| 
 | |
|             Console.WriteLine("Migration complete. All config files are now in config/ directory");
 | |
|         }
 | |
| 
 | |
|         private static void DeleteAppFolders(IDirectoryService directoryService)
 | |
|         {
 | |
|             foreach (var folderToDelete in AppFolders)
 | |
|             {
 | |
|                 if (!new DirectoryInfo(Path.Join(Directory.GetCurrentDirectory(), folderToDelete)).Exists) continue;
 | |
| 
 | |
|                 directoryService.ClearAndDeleteDirectory(Path.Join(Directory.GetCurrentDirectory(), folderToDelete));
 | |
|             }
 | |
|         }
 | |
| 
 | |
|         private static void DeleteLooseFiles(IDirectoryService directoryService)
 | |
|         {
 | |
|             var configFiles = LooseLeafFiles.Select(file => new FileInfo(Path.Join(Directory.GetCurrentDirectory(), file)))
 | |
|                 .Where(f => f.Exists);
 | |
|             directoryService.DeleteFiles(configFiles.Select(f => f.FullName));
 | |
|         }
 | |
| 
 | |
|         private static void CopyAppFolders(IDirectoryService directoryService)
 | |
|         {
 | |
|             Console.WriteLine("Moving folders to config");
 | |
| 
 | |
|                 foreach (var folderToMove in AppFolders)
 | |
|                 {
 | |
|                     if (new DirectoryInfo(Path.Join(directoryService.ConfigDirectory, folderToMove)).Exists) continue;
 | |
| 
 | |
|                     try
 | |
|                     {
 | |
|                         directoryService.CopyDirectoryToDirectory(
 | |
|                             Path.Join(directoryService.FileSystem.Directory.GetCurrentDirectory(), folderToMove),
 | |
|                             Path.Join(directoryService.ConfigDirectory, folderToMove));
 | |
|                     }
 | |
|                     catch (Exception)
 | |
|                     {
 | |
|                         /* Swallow Exception */
 | |
|                     }
 | |
|                 }
 | |
| 
 | |
| 
 | |
|             Console.WriteLine("Moving folders to config...DONE");
 | |
|         }
 | |
| 
 | |
|         private static void CopyLooseLeafFiles(IDirectoryService directoryService)
 | |
|         {
 | |
|             var configFiles = LooseLeafFiles.Select(file => new FileInfo(Path.Join(directoryService.FileSystem.Directory.GetCurrentDirectory(), file)))
 | |
|                 .Where(f => f.Exists);
 | |
|             // First step is to move all the files
 | |
|             Console.WriteLine("Moving files to config/");
 | |
|             foreach (var fileInfo in configFiles)
 | |
|             {
 | |
|                 try
 | |
|                 {
 | |
|                     fileInfo.CopyTo(Path.Join(directoryService.ConfigDirectory, fileInfo.Name));
 | |
|                 }
 | |
|                 catch (Exception)
 | |
|                 {
 | |
|                     /* Swallow exception when already exists */
 | |
|                 }
 | |
|             }
 | |
| 
 | |
|             Console.WriteLine("Moving files to config...DONE");
 | |
|         }
 | |
| 
 | |
|         private static void UpdateConfiguration()
 | |
|         {
 | |
|             Console.WriteLine("Updating appsettings.json to new paths");
 | |
|             Configuration.DatabasePath = "config//kavita.db";
 | |
|             Configuration.LogPath = "config//logs/kavita.log";
 | |
|             Console.WriteLine("Updating appsettings.json to new paths...DONE");
 | |
|         }
 | |
|     }
 | |
| }
 |