diff --git a/RMuseum/Controllers/AudioNarrationController.cs b/RMuseum/Controllers/AudioNarrationController.cs new file mode 100644 index 00000000..ca3448c8 --- /dev/null +++ b/RMuseum/Controllers/AudioNarrationController.cs @@ -0,0 +1,61 @@ +using Microsoft.AspNetCore.Authorization; +using Microsoft.AspNetCore.Mvc; +using RMuseum.Models.Auth.Memory; +using RMuseum.Services; +using RSecurityBackend.Models.Generic; +using RSecurityBackend.Services; +using System; +using System.Linq; +using System.Net; +using System.Threading.Tasks; + +namespace RMuseum.Controllers +{ + [Produces("application/json")] + [Route("api/audio")] + public class AudioNarrationController : Controller + { + + /// + /// imports data from ganjoor MySql database + /// + /// + [HttpPost] + [Route("mysqlonetimeimport")] + [Authorize(Policy = RMuseumSecurableItem.AudioNarrationEntityShortName + ":" + RMuseumSecurableItem.ImportOperationShortName)] + [ProducesResponseType((int)HttpStatusCode.OK, Type = typeof(bool))] + [ProducesResponseType((int)HttpStatusCode.BadRequest, Type = typeof(string))] + public async Task MysqlonetimeImport() + { + Guid loggedOnUserId = new Guid(User.Claims.FirstOrDefault(c => c.Type == "UserId").Value); + RServiceResult res = + await _audioService.OneTimeImport(loggedOnUserId); + if (res.Result) + return Ok(); + return BadRequest(res.ExceptionString); + } + + + /// + /// constructor + /// + /// + /// + /// + public AudioNarrationController(IAudioNarrationService audioService, IUserPermissionChecker userPermissionChecker) + { + _audioService = audioService; + _userPermissionChecker = userPermissionChecker; + } + + /// + /// Artifact Service + /// + protected readonly IAudioNarrationService _audioService; + + /// + /// IUserPermissionChecker instance + /// + protected IUserPermissionChecker _userPermissionChecker; + } +} diff --git a/RMuseum/RMuseum.xml b/RMuseum/RMuseum.xml index d26bd044..2a51a003 100644 --- a/RMuseum/RMuseum.xml +++ b/RMuseum/RMuseum.xml @@ -620,6 +620,30 @@ Captcha service + + + imports data from ganjoor MySql database + + + + + + constructor + + + + + + + + Artifact Service + + + + + IUserPermissionChecker instance + + Audit Log Controller Base @@ -3000,6 +3024,18 @@ + + + Audio Narration Service + + + + + imports data from ganjoor MySql database + + User Id which becomes owner of imported data + + IArtifactService implementation @@ -3708,6 +3744,34 @@ + + + Audio Narration Service Implementation + + + + + imports data from ganjoor MySql database + + User Id which becomes owner of imported data + + + + Configuration + + + + + Database Contetxt + + + + + constructor + + + + British Library Tile Downloader And Mixer diff --git a/RMuseum/Services/IAudioNarrationService.cs b/RMuseum/Services/IAudioNarrationService.cs new file mode 100644 index 00000000..86286ee1 --- /dev/null +++ b/RMuseum/Services/IAudioNarrationService.cs @@ -0,0 +1,19 @@ +using RSecurityBackend.Models.Generic; +using System; +using System.Threading.Tasks; + +namespace RMuseum.Services +{ + /// + /// Audio Narration Service + /// + public interface IAudioNarrationService + { + /// + /// imports data from ganjoor MySql database + /// + /// User Id which becomes owner of imported data + /// + Task> OneTimeImport(Guid OwnrRAppUserId); + } +} diff --git a/RMuseum/Services/Implementation/AudioNarrationService.cs b/RMuseum/Services/Implementation/AudioNarrationService.cs new file mode 100644 index 00000000..6172bc66 --- /dev/null +++ b/RMuseum/Services/Implementation/AudioNarrationService.cs @@ -0,0 +1,118 @@ +using Microsoft.EntityFrameworkCore; +using Microsoft.Extensions.Configuration; +using MySql.Data.MySqlClient; +using RMuseum.DbContext; +using RMuseum.Models.GanjoorAudio; +using RSecurityBackend.Models.Generic; +using System; +using System.Data; +using System.IO; +using System.Linq; +using System.Security.Policy; +using System.Threading.Tasks; + +namespace RMuseum.Services.Implementation +{ + /// + /// Audio Narration Service Implementation + /// + public class AudioNarrationService : IAudioNarrationService + { + /// + /// 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; + } + } +} diff --git a/RMuseum/Startup.cs b/RMuseum/Startup.cs index 3618d8de..ea96692b 100644 --- a/RMuseum/Startup.cs +++ b/RMuseum/Startup.cs @@ -248,6 +248,9 @@ namespace RMuseum //artifact service services.AddTransient(); + //audio service + services.AddTransient(); + services.AddHostedService(); services.AddSingleton(); diff --git a/RMuseum/appsettings.json b/RMuseum/appsettings.json index 5405574b..4d648158 100644 --- a/RMuseum/appsettings.json +++ b/RMuseum/appsettings.json @@ -33,6 +33,11 @@ "Password": "password", "From": "test@gmail.com" }, - + "AudioMySqlServer": { + "Server": "localhost", + "Username": "root", + "Password": "", + "Database": "adab" + }, "AllowedHosts": "*" }