public MusicInfoMaintainerController(ILogger <MusicInfoMaintainerController> logger, MusicDbContext musicDbContext, IndexMaintainer indexMaintainer, MusicConfiguration musicConfiguration) { Logger = logger; MusicDbContext = musicDbContext; IndexMaintainer = indexMaintainer; MusicConfiguration = musicConfiguration; }
public async Task TestInitializeIndex() { var indexConfig = new IndexConfig { ExcludedExtensions = ".dll", SaveIntervalSeconds = 1, IndexName = "ABC", MonitorFolder = MonitorFolder }; var fileName1 = Path.Combine(MonitorFolder, "A.txt"); var fileName2 = Path.Combine(MonitorFolder, "B.txt"); File.AppendAllText(fileName1, "ABCD ABCD" + Environment.NewLine + "ABCD"); File.AppendAllText(fileName2, "ABCD EFGH"); using var maintainer = new IndexMaintainer(indexConfig, Config, Log); Assert.AreEqual(IndexStatus.Idle, maintainer.Status); await maintainer.InitializeIndex(false); Assert.AreEqual(IndexStatus.Initialized, maintainer.Status); var codeDocuments = maintainer.IndexBuilder.CodeIndexPool.Search(new MatchAllDocsQuery(), int.MaxValue); Assert.AreEqual(2, codeDocuments.Length); CollectionAssert.AreEquivalent(new[] { "ABCD ABCD" + Environment.NewLine + "ABCD", "ABCD EFGH" }, codeDocuments.Select(u => u.Get(nameof(CodeSource.Content)))); var hintDocuments = maintainer.IndexBuilder.HintIndexPool.Search(new MatchAllDocsQuery(), int.MaxValue); Assert.AreEqual(2, hintDocuments.Length); CollectionAssert.AreEquivalent(new[] { "ABCD", "EFGH" }, hintDocuments.Select(u => u.Get(nameof(CodeWord.Word)))); }
// This method gets called by the runtime. Use this method to configure the HTTP request pipeline. public void Configure(IApplicationBuilder app, IWebHostEnvironment env, IHostApplicationLifetime lifeTime, IndexMaintainer maintainer, MusicConfiguration musicConfiguration, ILogger <Startup> logger) { Logger = logger; if (env.IsDevelopment()) { app.UseDeveloperExceptionPage(); } else { app.UseExceptionHandler("/Home/Error"); // The default HSTS value is 30 days. You may want to change this for production scenarios, see https://aka.ms/aspnetcore-hsts. app.UseHsts(); } app.UseHttpsRedirection(); app.UseStaticFiles(); app.UseRouting(); // Register the Swagger generator and the Swagger UI middlewares app.UseOpenApi(); app.UseSwaggerUi3(); app.UseAuthentication(); app.UseAuthorization(); app.UseEndpoints(endpoints => { endpoints.MapControllerRoute( name: "default", pattern: "{controller=Home}/{action=Index}/{id?}"); }); // on exit // lifeTime.ApplicationStopping.Register(OnShutdown); AppDomain.CurrentDomain.ProcessExit += CurrentDomain_ProcessExit; Maintainer = maintainer; if (!Maintainer.IndexExist()) { Task.Run(async() => { await Maintainer.InitIndex(CancellationTokenSource.Token); }); } Task.Run(async() => { while (!CancellationTokenSource.Token.IsCancellationRequested) { Logger.LogInformation("Auto SaveResults start, will run after {AutoSaveIndexSeconds} seconds", musicConfiguration.AutoSaveIndexSeconds); await Task.Delay(musicConfiguration.AutoSaveIndexSeconds * 1000, CancellationTokenSource.Token); Logger.LogInformation("Auto SaveResults start"); await Maintainer.SaveResults(CancellationTokenSource.Token); Logger.LogInformation("Auto SaveResults finished"); } }, CancellationTokenSource.Token); }
public async Task <MaintainMusicInfoResult> SaveSongIndex() { await IndexMaintainer.SaveResults(CancellationToken.None); return(new MaintainMusicInfoResult { ResultCode = ResultCode.Successful }); }
public async Task <MaintainMusicInfoResult> RebuildAllIndex() { await IndexMaintainer.DeleteAllIndex(CancellationToken.None); await IndexMaintainer.InitIndex(CancellationToken.None); await IndexMaintainer.SaveResults(CancellationToken.None); return(new MaintainMusicInfoResult { ResultCode = ResultCode.Successful }); }
public async Task <MaintainMusicInfoResult> AddSong(SongRequest songRequest) { try { var song = new Song { Title = songRequest.Title, AKATitles = songRequest.AKATitles, Picture = songRequest.Picture, Seconds = songRequest.Seconds, SingerSongs = songRequest.Singers.Select(u => new SingerSong { Singer = new Singer { Name = u } }).ToList(), GenreSongs = songRequest.Genres.Select(u => new GenreSong { Genre = new Genre { Title = u } }).ToList(), Album = new Album { Title = songRequest.Album }, }; await MusicDbContext.Songs.AddAsync(song); await IndexMaintainer.AddIndex(song, CancellationToken.None); Logger.LogInformation("{AddSong} index successful", nameof(AddSong)); await MusicDbContext.SaveChangesAsync(); Logger.LogInformation("{AddSong} data successful", nameof(AddSong)); return(new MaintainMusicInfoResult { ResultCode = ResultCode.Successful }); } catch (Exception ex) { return(new MaintainMusicInfoResult { ResultCode = ResultCode.Exception, ExtraMessage = ex.Message }); } }
public async Task <MaintainMusicInfoResult> DeleteSong(Guid songPk) { var existSong = await MusicDbContext.Songs.FindAsync(songPk); if (existSong != null) { MusicDbContext.Songs.Remove(existSong); await IndexMaintainer.RemoveIndex(songPk, CancellationToken.None); Logger.LogInformation("{DeleteSong} index successful", nameof(DeleteSong)); await MusicDbContext.SaveChangesAsync(); Logger.LogInformation("{DeleteSong} data successful", nameof(DeleteSong)); } return(new MaintainMusicInfoResult { ResultCode = ResultCode.Successful }); }
public async Task TestInitializeIndex_ReInitialize() { var indexConfig = new IndexConfig { ExcludedExtensions = ".dll", SaveIntervalSeconds = 1, IndexName = "ABC", MonitorFolder = MonitorFolder }; var fileName1 = Path.Combine(MonitorFolder, "A.txt"); var fileName2 = Path.Combine(MonitorFolder, "B.txt"); var fileNameExcluded = Path.Combine(MonitorFolder, "B.dll"); File.AppendAllText(fileName1, "ABCD ABCD" + Environment.NewLine + "ABCD"); File.AppendAllText(fileName2, "ABCD"); File.AppendAllText(fileNameExcluded, "a excluded file"); using (var maintainer = new IndexMaintainer(indexConfig, Config, Log)) { await maintainer.InitializeIndex(false); Assert.IsTrue(Log.LogsContent.Contains("Add index for")); } Log.ClearLog(); using (var maintainer = new IndexMaintainer(indexConfig, Config, Log)) { await maintainer.InitializeIndex(false); Assert.IsFalse(Log.LogsContent.Contains("Delete All Index"), "Don't delete all indexes when not force rebuild"); Assert.IsFalse(Log.LogsContent.Contains("Add index for"), "Do not generate already up to date file"); var codeDocuments = maintainer.IndexBuilder.CodeIndexPool.Search(new MatchAllDocsQuery(), int.MaxValue); CollectionAssert.AreEquivalent(new[] { "ABCD ABCD" + Environment.NewLine + "ABCD", "ABCD" }, codeDocuments.Select(u => u.Get(nameof(CodeSource.Content)))); var hintDocuments = maintainer.IndexBuilder.HintIndexPool.Search(new MatchAllDocsQuery(), int.MaxValue); CollectionAssert.AreEquivalent(new[] { "ABCD" }, hintDocuments.Select(u => u.Get(nameof(CodeWord.Word)))); } Log.ClearLog(); var fileName3 = Path.Combine(MonitorFolder, "C.txt"); File.AppendAllText(fileName3, "File3"); // New File.Delete(fileName2); // Deleted File.AppendAllText(fileName1, " WOWOWO"); // Edit using (var maintainer = new IndexMaintainer(indexConfig, Config, Log)) { await maintainer.InitializeIndex(false); var codeDocuments = maintainer.IndexBuilder.CodeIndexPool.Search(new MatchAllDocsQuery(), int.MaxValue); CollectionAssert.AreEquivalent(new[] { "ABCD ABCD" + Environment.NewLine + "ABCD WOWOWO", "File3" }, codeDocuments.Select(u => u.Get(nameof(CodeSource.Content)))); var hintDocuments = maintainer.IndexBuilder.HintIndexPool.Search(new MatchAllDocsQuery(), int.MaxValue); CollectionAssert.AreEquivalent(new[] { "ABCD", "WOWOWO", "File3" }, hintDocuments.Select(u => u.Get(nameof(CodeWord.Word)))); } Log.ClearLog(); using (var maintainer = new IndexMaintainer(indexConfig, Config, Log)) { await maintainer.InitializeIndex(true); Assert.IsTrue(Log.LogsContent.Contains("Delete All Index"), "Delete existing indexes when force rebuild"); var codeDocuments = maintainer.IndexBuilder.CodeIndexPool.Search(new MatchAllDocsQuery(), int.MaxValue); CollectionAssert.AreEquivalent(new[] { "ABCD ABCD" + Environment.NewLine + "ABCD WOWOWO", "File3" }, codeDocuments.Select(u => u.Get(nameof(CodeSource.Content)))); var hintDocuments = maintainer.IndexBuilder.HintIndexPool.Search(new MatchAllDocsQuery(), int.MaxValue); CollectionAssert.AreEquivalent(new[] { "ABCD", "WOWOWO", "File3" }, hintDocuments.Select(u => u.Get(nameof(CodeWord.Word)))); } }