using Microsoft.EntityFrameworkCore; using Microsoft.Extensions.Configuration; using MySql.Data.MySqlClient; using RMuseum.DbContext; using RMuseum.Models.GanjoorAudio; using RMuseum.Models.GanjoorAudio.ViewModels; using RSecurityBackend.Models.Generic; using RSecurityBackend.Services.Implementation; using System; using System.Collections.Generic; using System.Data; using System.IO; using System.Linq; using System.Threading.Tasks; namespace RMuseum.Services.Implementation { /// /// Audio Narration Service Implementation /// public class AudioNarrationService : IAudioNarrationService { /// /// returns list of narrations /// /// /// send Guid.Empty if you want all narrations /// /// public async Task> GetAll(PagingParameterModel paging, Guid filteredUserId, AudioReviewStatus status) { try { var source = _context.AudioFiles .Include(a => a.Owner) .Where(a => (filteredUserId == Guid.Empty || a.OwnerId == filteredUserId) && (status == AudioReviewStatus.All || a.ReviewStatus == status) ) .OrderBy(a => a.UploadDate) .AsQueryable(); (PaginationMetadata PagingMeta, PoemNarration[] Items) paginatedResult = await QueryablePaginator.Paginate(source, paging); List res = new List(); foreach(PoemNarration audio in paginatedResult.Items) { res.Add(new PoemNarrationViewModel(audio)); } return new RServiceResult<(PaginationMetadata PagingMeta, PoemNarrationViewModel[] Items)>((paginatedResult.PagingMeta, res.ToArray())); } catch (Exception exp) { return new RServiceResult<(PaginationMetadata PagingMeta, PoemNarrationViewModel[] Items)>((PagingMeta: null, Items: null), exp.ToString()); } } /// /// imports data from ganjoor MySql database /// /// User Id which becomes owner of imported data public async Task> OneTimeImport(Guid OwnrRAppUserId) { try { PoemNarration sampleCheck = await _context.AudioFiles.FirstOrDefaultAsync(); if(sampleCheck != null) { return new RServiceResult(false, "OneTimeImport is a one time operation and cannot be called multiple times."); } using (MySqlConnection connection = new MySqlConnection ( $"server={Configuration.GetSection("AudioMySqlServer")["Server"]};uid={Configuration.GetSection("AudioMySqlServer")["Username"]};pwd={Configuration.GetSection("AudioMySqlServer")["Password"]};database={Configuration.GetSection("AudioMySqlServer")["Database"]};charset=utf8" )) { connection.Open(); using(MySqlDataAdapter src = new MySqlDataAdapter( "SELECT audio_ID, audio_post_ID, audio_order, audio_xml, audio_ogg, audio_mp3, " + "audio_title, audio_artist, audio_artist_url, audio_src, audio_src_url, audio_guid, " + "audio_fchecksum, audio_mp3bsize, audio_oggbsize, audio_date " + "FROM adab.ganja_gaudio ORDER BY audio_ID", connection )) { using(DataTable srcData = new DataTable()) { await src.FillAsync(srcData); int audioSyncStatus = (int)AudioSyncStatus.SynchronizedOrRejected; foreach (DataRow row in srcData.Rows) { PoemNarration newRecord = new PoemNarration() { OwnerId = OwnrRAppUserId, GanjoorAudioId = int.Parse(row["audio_ID"].ToString()), GanjoorPostId = (int)row["audio_post_ID"], AudioOrder = (int)row["audio_order"], AudioTitle = row["audio_title"].ToString(), AudioArtist = row["audio_artist"].ToString(), AudioArtistUrl = row["audio_artist_url"].ToString(), AudioSrc = row["audio_src"].ToString(), AudioSrcUrl = row["audio_src_url"].ToString(), LegacyAudioGuid = new Guid(row["audio_guid"].ToString()), Mp3FileCheckSum = row["audio_fchecksum"].ToString(), Mp3SizeInBytes = (int)row["audio_mp3bsize"], OggSizeInBytes = (int)row["audio_oggbsize"], UploadDate = (DateTime)row["audio_date"], AudioSyncStatus = audioSyncStatus, ReviewStatus = AudioReviewStatus.Approved }; newRecord.ReviewDate = newRecord.UploadDate; string audio_xml = row["audio_xml"].ToString(); //sample audio_xml value: /i/a/x/11876-Simorgh.xml audio_xml = audio_xml.Substring("/i/".Length); // /i/a/x/11876-Simorgh.xml -> a/x/11876-Simorgh.xml newRecord.SoundFilesFolder = audio_xml.Substring(0, audio_xml.IndexOf('/')); //(a) newRecord.FileNameWithoutExtension = Path.GetFileNameWithoutExtension(audio_xml.Substring(audio_xml.LastIndexOf('/') + 1)); //(11876-Simorgh) _context.AudioFiles.Add(newRecord); } } await _context.SaveChangesAsync(); } } return new RServiceResult(true); } catch(Exception exp) { return new RServiceResult(false, exp.ToString()); } } /// /// Configuration /// protected IConfiguration Configuration { get; } /// /// Database Contetxt /// protected readonly RMuseumDbContext _context; /// /// constructor /// /// /// public AudioNarrationService(RMuseumDbContext context, IConfiguration configuration) { _context = context; Configuration = configuration; } } }