#89 removing ssh and remote updates (untested)
This commit is contained in:
parent
2501e7cc4e
commit
52ed01caff
@ -562,32 +562,6 @@ namespace RMuseum.Controllers
|
||||
return BadRequest(res.ExceptionString);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// retry publish unpublished narrations
|
||||
/// </summary>
|
||||
/// <returns></returns>
|
||||
[HttpPost]
|
||||
[Route("retrypublish")]
|
||||
[Authorize(Policy = RMuseumSecurableItem.AudioRecitationEntityShortName + ":" + RMuseumSecurableItem.PublishOperationShortName)]
|
||||
[ProducesResponseType((int)HttpStatusCode.OK, Type = typeof(bool))]
|
||||
[ProducesResponseType((int)HttpStatusCode.BadRequest, Type = typeof(string))]
|
||||
public async Task<IActionResult> RetryPublish()
|
||||
{
|
||||
try
|
||||
{
|
||||
if (!_audioService.UploadEnabled)
|
||||
return BadRequest("این قابلیت به دلیل تغییرات فنی سایت موقتاً غیرفعال است.");
|
||||
|
||||
await _audioService.RetryPublish();
|
||||
return Ok();
|
||||
}
|
||||
catch(Exception exp)
|
||||
{
|
||||
return BadRequest(exp.ToString());
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Get User Profiles
|
||||
/// </summary>
|
||||
|
||||
@ -22,7 +22,6 @@
|
||||
</PackageReference>
|
||||
<PackageReference Include="MySql.Data" Version="8.0.21" />
|
||||
<PackageReference Include="NAudio" Version="1.10.0" />
|
||||
<PackageReference Include="SSH.NET" Version="2020.0.0-beta1" />
|
||||
<PackageReference Include="Swashbuckle.AspNetCore" Version="5.2.1" />
|
||||
<PackageReference Include="Swashbuckle.AspNetCore.Annotations" Version="5.2.1" />
|
||||
<PackageReference Include="Swashbuckle.AspNetCore.Filters" Version="5.0.2" />
|
||||
|
||||
@ -1069,12 +1069,6 @@
|
||||
</summary>
|
||||
<returns></returns>
|
||||
</member>
|
||||
<member name="M:RMuseum.Controllers.RecitationController.RetryPublish">
|
||||
<summary>
|
||||
retry publish unpublished narrations
|
||||
</summary>
|
||||
<returns></returns>
|
||||
</member>
|
||||
<member name="M:RMuseum.Controllers.RecitationController.GetUserNarrationProfiles(System.String)">
|
||||
<summary>
|
||||
Get User Profiles
|
||||
@ -7704,11 +7698,6 @@
|
||||
<param name="model"></param>
|
||||
<returns></returns>
|
||||
</member>
|
||||
<member name="M:RMuseum.Services.Implementationa.RecitationService.RetryPublish">
|
||||
<summary>
|
||||
retry publish unpublished narrations
|
||||
</summary>
|
||||
</member>
|
||||
<member name="M:RMuseum.Services.Implementationa.RecitationService.GetUploadSession(System.Guid)">
|
||||
<summary>
|
||||
Get Upload Session (including files)
|
||||
@ -8106,11 +8095,6 @@
|
||||
<param name="userId">if userId is empty all user uploads would be returned</param>
|
||||
<returns></returns>
|
||||
</member>
|
||||
<member name="M:RMuseum.Services.IRecitationService.RetryPublish">
|
||||
<summary>
|
||||
retry publish unpublished narrations
|
||||
</summary>
|
||||
</member>
|
||||
<member name="M:RMuseum.Services.IRecitationService.GetPublishingQueueStatus(RSecurityBackend.Models.Generic.PagingParameterModel,System.Boolean,System.Guid)">
|
||||
<summary>
|
||||
publishing tracker data
|
||||
|
||||
@ -176,11 +176,6 @@ namespace RMuseum.Services
|
||||
/// <returns></returns>
|
||||
Task<RServiceResult<(PaginationMetadata PagingMeta, UploadedItemViewModel[] Items)>> GetUploads(PagingParameterModel paging, Guid userId);
|
||||
|
||||
/// <summary>
|
||||
/// retry publish unpublished narrations
|
||||
/// </summary>
|
||||
Task RetryPublish();
|
||||
|
||||
/// <summary>
|
||||
/// publishing tracker data
|
||||
/// </summary>
|
||||
|
||||
@ -1,11 +1,9 @@
|
||||
using Dapper;
|
||||
using DNTPersianUtils.Core;
|
||||
using DNTPersianUtils.Core;
|
||||
using ganjoor;
|
||||
using Microsoft.AspNetCore.Http;
|
||||
using Microsoft.EntityFrameworkCore;
|
||||
using Microsoft.Extensions.Configuration;
|
||||
using MySql.Data.MySqlClient;
|
||||
using Renci.SshNet;
|
||||
using RMuseum.DbContext;
|
||||
using RMuseum.Models.Auth.Memory;
|
||||
using RMuseum.Models.Ganjoor;
|
||||
@ -1154,28 +1152,7 @@ namespace RMuseum.Services.Implementationa
|
||||
}
|
||||
}
|
||||
|
||||
private SftpClient _client = null;
|
||||
|
||||
private void _ensureSftpClientConnection()
|
||||
{
|
||||
if (_client == null)
|
||||
{
|
||||
_client = new SftpClient
|
||||
(
|
||||
Configuration.GetSection("AudioSFPServer")["Host"],
|
||||
int.Parse(Configuration.GetSection("AudioSFPServer")["Port"]),
|
||||
Configuration.GetSection("AudioSFPServer")["Username"],
|
||||
Configuration.GetSection("AudioSFPServer")["Password"]
|
||||
);
|
||||
_client.Connect();
|
||||
}
|
||||
else
|
||||
if(!_client.IsConnected)
|
||||
{
|
||||
_client.Connect();
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
#region Remote Update
|
||||
private async Task _PublishNarration(Recitation narration, RecitationPublishingTracker tracker, RMuseumDbContext context)
|
||||
{
|
||||
@ -1184,18 +1161,12 @@ namespace RMuseum.Services.Implementationa
|
||||
{
|
||||
bool replace = narration.AudioSyncStatus == AudioSyncStatus.SoundOrXMLFilesChanged;
|
||||
|
||||
_ensureSftpClientConnection();
|
||||
|
||||
using var x = File.OpenRead(narration.LocalXmlFilePath);
|
||||
_client.UploadFile(x, $"{Configuration.GetSection("AudioSFPServer")["RootPath"]}{narration.RemoteXMLFilePath}", true);
|
||||
|
||||
tracker.XmlFileCopied = true;
|
||||
context.RecitationPublishingTrackers.Update(tracker);
|
||||
await context.SaveChangesAsync();
|
||||
|
||||
using var s = File.OpenRead(narration.LocalMp3FilePath);
|
||||
_client.UploadFile(s, $"{Configuration.GetSection("AudioSFPServer")["RootPath"]}{narration.RemoteMp3FilePath}", true);
|
||||
|
||||
tracker.Mp3FileCopied = true;
|
||||
context.RecitationPublishingTrackers.Update(tracker);
|
||||
await context.SaveChangesAsync();
|
||||
@ -1203,70 +1174,10 @@ namespace RMuseum.Services.Implementationa
|
||||
|
||||
if (!replace)
|
||||
{
|
||||
string sql = $"INSERT INTO ganja_gaudio (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) VALUES " +
|
||||
$"({narration.GanjoorPostId},{narration.AudioOrder},'{narration.RemoteXMLFilePath}', '', '{narration.Mp3Url}', '{narration.AudioTitle}', '{narration.AudioArtist}', " +
|
||||
$"'{narration.AudioArtistUrl}', '{narration.AudioSrc}', '{narration.AudioSrcUrl}', '{narration.LegacyAudioGuid}', '{narration.Mp3FileCheckSum}', {narration.Mp3SizeInBytes}, 0, NOW())";
|
||||
|
||||
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"
|
||||
))
|
||||
{
|
||||
await connection.OpenAsync();
|
||||
|
||||
using (MySqlDataAdapter src = new MySqlDataAdapter(
|
||||
$"SELECT * FROM ganja_gaudio WHERE audio_post_ID = {narration.GanjoorPostId} AND audio_guid = '{narration.LegacyAudioGuid}'",
|
||||
connection
|
||||
))
|
||||
{
|
||||
using (DataTable srcData = new DataTable())
|
||||
{
|
||||
await src.FillAsync(srcData);
|
||||
if(srcData.Rows.Count == 0)//prevent duplicated insertions (this process might have caused an exception previously and caused the record to become existing prior)
|
||||
{
|
||||
using (MySqlCommand cmd = new MySqlCommand(sql, connection))
|
||||
{
|
||||
await cmd.ExecuteNonQueryAsync();
|
||||
int AudioId = (int)cmd.LastInsertedId;
|
||||
narration.GanjoorAudioId = AudioId;
|
||||
context.Recitations.Update(narration);
|
||||
await context.SaveChangesAsync();
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
tracker.FirstDbUpdated = true;
|
||||
context.RecitationPublishingTrackers.Update(tracker);
|
||||
await context.SaveChangesAsync();
|
||||
|
||||
//We are using two database for different purposes on the remote
|
||||
using (MySqlConnection connection = new MySqlConnection
|
||||
(
|
||||
$"server={Configuration.GetSection("AudioMySqlServer")["Server"]};uid={Configuration.GetSection("AudioMySqlServer")["2ndUsername"]};pwd={Configuration.GetSection("AudioMySqlServer")["2ndPassword"]};database={Configuration.GetSection("AudioMySqlServer")["2ndDatabase"]};charset=utf8"
|
||||
))
|
||||
{
|
||||
await connection.OpenAsync();
|
||||
|
||||
using (MySqlDataAdapter src = new MySqlDataAdapter(
|
||||
$"SELECT * FROM ganja_gaudio WHERE audio_post_ID = {narration.GanjoorPostId} AND audio_guid = '{narration.LegacyAudioGuid}'",
|
||||
connection
|
||||
))
|
||||
{
|
||||
using (DataTable srcData = new DataTable())
|
||||
{
|
||||
await src.FillAsync(srcData);
|
||||
if (srcData.Rows.Count == 0)//prevent duplicated insertions
|
||||
{
|
||||
await connection.ExecuteAsync(sql);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
tracker.SecondDbUpdated = true;
|
||||
context.RecitationPublishingTrackers.Update(tracker);
|
||||
await context.SaveChangesAsync();
|
||||
@ -1336,38 +1247,6 @@ namespace RMuseum.Services.Implementationa
|
||||
|
||||
try
|
||||
{
|
||||
_ensureSftpClientConnection();
|
||||
if(_client.Exists($"{Configuration.GetSection("AudioSFPServer")["RootPath"]}{narration.RemoteXMLFilePath}"))
|
||||
{
|
||||
_client.DeleteFile($"{Configuration.GetSection("AudioSFPServer")["RootPath"]}{narration.RemoteXMLFilePath}");
|
||||
}
|
||||
|
||||
if(_client.Exists($"{Configuration.GetSection("AudioSFPServer")["RootPath"]}{narration.RemoteMp3FilePath}"))
|
||||
{
|
||||
_client.DeleteFile($"{Configuration.GetSection("AudioSFPServer")["RootPath"]}{narration.RemoteMp3FilePath}");
|
||||
}
|
||||
|
||||
string sql = $"DELETE FROM ganja_gaudio WHERE audio_post_ID = {narration.GanjoorPostId} AND audio_guid = '{narration.LegacyAudioGuid}'";
|
||||
|
||||
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"
|
||||
))
|
||||
{
|
||||
await connection.OpenAsync();
|
||||
await connection.ExecuteAsync(sql);
|
||||
}
|
||||
|
||||
//We are using two database for different purposes on the remote
|
||||
using (MySqlConnection connection = new MySqlConnection
|
||||
(
|
||||
$"server={Configuration.GetSection("AudioMySqlServer")["Server"]};uid={Configuration.GetSection("AudioMySqlServer")["2ndUsername"]};pwd={Configuration.GetSection("AudioMySqlServer")["2ndPassword"]};database={Configuration.GetSection("AudioMySqlServer")["2ndDatabase"]};charset=utf8"
|
||||
))
|
||||
{
|
||||
await connection.OpenAsync();
|
||||
await connection.ExecuteAsync(sql);
|
||||
}
|
||||
|
||||
string audioTitle = narration.AudioTitle;
|
||||
int GanjoorPostId = narration.GanjoorPostId;
|
||||
Guid userId = narration.OwnerId;
|
||||
@ -1428,31 +1307,6 @@ namespace RMuseum.Services.Implementationa
|
||||
|
||||
try
|
||||
{
|
||||
string sql = $"UPDATE ganja_gaudio SET audio_title = '{narration.AudioTitle}',audio_artist = '{narration.AudioArtist}', " +
|
||||
$"audio_artist_url = '{narration.AudioArtistUrl}',audio_src = '{narration.AudioSrc}',audio_src_url = '{narration.AudioSrcUrl}', audio_order = {narration.AudioOrder} " +
|
||||
$" WHERE audio_post_ID = {narration.GanjoorPostId} AND audio_guid = '{narration.LegacyAudioGuid}'";
|
||||
|
||||
|
||||
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"
|
||||
))
|
||||
{
|
||||
await connection.OpenAsync();
|
||||
await connection.ExecuteAsync(sql);
|
||||
}
|
||||
|
||||
//We are using two database for different purposes on the remote
|
||||
using (MySqlConnection connection = new MySqlConnection
|
||||
(
|
||||
$"server={Configuration.GetSection("AudioMySqlServer")["Server"]};uid={Configuration.GetSection("AudioMySqlServer")["2ndUsername"]};pwd={Configuration.GetSection("AudioMySqlServer")["2ndPassword"]};database={Configuration.GetSection("AudioMySqlServer")["2ndDatabase"]};charset=utf8"
|
||||
))
|
||||
{
|
||||
await connection.OpenAsync();
|
||||
await connection.ExecuteAsync(sql);
|
||||
}
|
||||
|
||||
|
||||
narration.AudioSyncStatus = AudioSyncStatus.SynchronizedOrRejected;
|
||||
context.Recitations.Update(narration);
|
||||
await context.SaveChangesAsync();
|
||||
@ -1515,66 +1369,6 @@ namespace RMuseum.Services.Implementationa
|
||||
|
||||
#endregion
|
||||
|
||||
|
||||
|
||||
/// <summary>
|
||||
/// retry publish unpublished narrations
|
||||
/// </summary>
|
||||
public async Task RetryPublish()
|
||||
{
|
||||
if (_backgroundTaskQueue.Count > 0)
|
||||
return;
|
||||
|
||||
var unpublishedQueue = await _context.RecitationPublishingTrackers.ToArrayAsync();
|
||||
if (unpublishedQueue.Length > 0)
|
||||
{
|
||||
_context.RecitationPublishingTrackers.RemoveRange(unpublishedQueue);
|
||||
await _context.SaveChangesAsync();
|
||||
}
|
||||
|
||||
_backgroundTaskQueue.QueueBackgroundWorkItem
|
||||
(
|
||||
async token =>
|
||||
{
|
||||
using (RMuseumDbContext context = new RMuseumDbContext(Configuration)) //this is long running job, so _context might be already been freed/collected by GC
|
||||
{
|
||||
var list = await context.Recitations.Where(a => a.ReviewStatus == AudioReviewStatus.Approved && a.AudioSyncStatus != AudioSyncStatus.SynchronizedOrRejected).ToListAsync();
|
||||
foreach (Recitation narration in list)
|
||||
{
|
||||
RecitationPublishingTracker tracker = new RecitationPublishingTracker()
|
||||
{
|
||||
PoemNarrationId = narration.Id,
|
||||
StartDate = DateTime.Now,
|
||||
XmlFileCopied = false,
|
||||
Mp3FileCopied = false,
|
||||
FirstDbUpdated = false,
|
||||
SecondDbUpdated = false,
|
||||
};
|
||||
context.RecitationPublishingTrackers.Add(tracker);
|
||||
await context.SaveChangesAsync();
|
||||
switch (narration.AudioSyncStatus)
|
||||
{
|
||||
case AudioSyncStatus.NewItem:
|
||||
case AudioSyncStatus.SoundOrXMLFilesChanged:
|
||||
{
|
||||
|
||||
await _PublishNarration(narration, tracker, context);
|
||||
}
|
||||
break;
|
||||
case AudioSyncStatus.MetadataChanged:
|
||||
await _UpdateRemoteRecitations(narration, tracker, context, true);//this might send unexpected notications for users not expecting it in case of reordering recitations
|
||||
break;
|
||||
case AudioSyncStatus.Deleted:
|
||||
await _DeleteNarrationFromRemote(narration, tracker, context);
|
||||
break;
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
|
||||
/// <summary>
|
||||
/// Get Upload Session (including files)
|
||||
/// </summary>
|
||||
|
||||
Loading…
Reference in New Issue
Block a user