#34 delete recitation (untested)
This commit is contained in:
parent
1321455283
commit
dbe2cdc16c
@ -258,6 +258,27 @@ namespace RMuseum.Controllers
|
|||||||
return Ok(res.Result);
|
return Ok(res.Result);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Delete a recitation
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="id"></param>
|
||||||
|
/// <returns></returns>
|
||||||
|
[HttpDelete("{id}")]
|
||||||
|
[Authorize]
|
||||||
|
[ProducesResponseType((int)HttpStatusCode.OK, Type = typeof(bool))]
|
||||||
|
[ProducesResponseType((int)HttpStatusCode.BadRequest, Type = typeof(string))]
|
||||||
|
[ProducesResponseType((int)HttpStatusCode.Forbidden)]
|
||||||
|
public async Task<IActionResult> DeleteRecitation(int id)
|
||||||
|
{
|
||||||
|
Guid loggedOnUserId = new Guid(User.Claims.FirstOrDefault(c => c.Type == "UserId").Value);
|
||||||
|
RServiceResult<bool> res = await _audioService.Delete(id, loggedOnUserId);
|
||||||
|
if (!string.IsNullOrEmpty(res.ExceptionString))
|
||||||
|
{
|
||||||
|
return BadRequest(res.ExceptionString);
|
||||||
|
}
|
||||||
|
return Ok(res.Result);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
@ -319,7 +340,7 @@ namespace RMuseum.Controllers
|
|||||||
[ProducesResponseType((int)HttpStatusCode.BadRequest, Type = typeof(string))]
|
[ProducesResponseType((int)HttpStatusCode.BadRequest, Type = typeof(string))]
|
||||||
[ProducesResponseType((int)HttpStatusCode.Unauthorized)]
|
[ProducesResponseType((int)HttpStatusCode.Unauthorized)]
|
||||||
[ProducesResponseType((int)HttpStatusCode.Forbidden, Type = typeof(string))]
|
[ProducesResponseType((int)HttpStatusCode.Forbidden, Type = typeof(string))]
|
||||||
public async Task<IActionResult> ReciationNarrations(bool replace = false)
|
public async Task<IActionResult> UploadReciation(bool replace = false)
|
||||||
{
|
{
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
@ -469,6 +490,7 @@ namespace RMuseum.Controllers
|
|||||||
/// <returns></returns>
|
/// <returns></returns>
|
||||||
|
|
||||||
[HttpDelete("profile/{id}")]
|
[HttpDelete("profile/{id}")]
|
||||||
|
[Authorize]
|
||||||
[ProducesResponseType((int)HttpStatusCode.OK, Type = typeof(bool))]
|
[ProducesResponseType((int)HttpStatusCode.OK, Type = typeof(bool))]
|
||||||
[ProducesResponseType((int)HttpStatusCode.BadRequest, Type = typeof(string))]
|
[ProducesResponseType((int)HttpStatusCode.BadRequest, Type = typeof(string))]
|
||||||
[ProducesResponseType((int)HttpStatusCode.Forbidden)]
|
[ProducesResponseType((int)HttpStatusCode.Forbidden)]
|
||||||
|
|||||||
@ -753,6 +753,13 @@
|
|||||||
<param name="model"></param>
|
<param name="model"></param>
|
||||||
<returns></returns>
|
<returns></returns>
|
||||||
</member>
|
</member>
|
||||||
|
<member name="M:RMuseum.Controllers.RecitationController.DeleteRecitation(System.Int32)">
|
||||||
|
<summary>
|
||||||
|
Delete a recitation
|
||||||
|
</summary>
|
||||||
|
<param name="id"></param>
|
||||||
|
<returns></returns>
|
||||||
|
</member>
|
||||||
<member name="M:RMuseum.Controllers.RecitationController.GetUploads(RSecurityBackend.Models.Generic.PagingParameterModel,System.Boolean)">
|
<member name="M:RMuseum.Controllers.RecitationController.GetUploads(RSecurityBackend.Models.Generic.PagingParameterModel,System.Boolean)">
|
||||||
<summary>
|
<summary>
|
||||||
Get User Uploads
|
Get User Uploads
|
||||||
@ -761,7 +768,7 @@
|
|||||||
<param name="allUsers">default: false, user must have narration::moderate permission to be able to see all users uploads</param>
|
<param name="allUsers">default: false, user must have narration::moderate permission to be able to see all users uploads</param>
|
||||||
<returns></returns>
|
<returns></returns>
|
||||||
</member>
|
</member>
|
||||||
<member name="M:RMuseum.Controllers.RecitationController.ReciationNarrations(System.Boolean)">
|
<member name="M:RMuseum.Controllers.RecitationController.UploadReciation(System.Boolean)">
|
||||||
<summary>
|
<summary>
|
||||||
Reciation Upload
|
Reciation Upload
|
||||||
</summary>
|
</summary>
|
||||||
@ -4973,6 +4980,14 @@
|
|||||||
<param name="id"></param>
|
<param name="id"></param>
|
||||||
<returns></returns>
|
<returns></returns>
|
||||||
</member>
|
</member>
|
||||||
|
<member name="M:RMuseum.Services.Implementation.RecitationService.Delete(System.Int32,System.Guid)">
|
||||||
|
<summary>
|
||||||
|
Delete recitation
|
||||||
|
</summary>
|
||||||
|
<param name="id"></param>
|
||||||
|
<param name="userId"></param>
|
||||||
|
<returns></returns>
|
||||||
|
</member>
|
||||||
<member name="M:RMuseum.Services.Implementation.RecitationService.GetPoemNarrationVerseSyncArray(System.Int32)">
|
<member name="M:RMuseum.Services.Implementation.RecitationService.GetPoemNarrationVerseSyncArray(System.Int32)">
|
||||||
<summary>
|
<summary>
|
||||||
Gets Verse Sync Range Information
|
Gets Verse Sync Range Information
|
||||||
@ -5299,6 +5314,14 @@
|
|||||||
<param name="id"></param>
|
<param name="id"></param>
|
||||||
<returns></returns>
|
<returns></returns>
|
||||||
</member>
|
</member>
|
||||||
|
<member name="M:RMuseum.Services.IRecitationService.Delete(System.Int32,System.Guid)">
|
||||||
|
<summary>
|
||||||
|
Delete recitation (recitation should belong to userId)
|
||||||
|
</summary>
|
||||||
|
<param name="id"></param>
|
||||||
|
<param name="userId"></param>
|
||||||
|
<returns></returns>
|
||||||
|
</member>
|
||||||
<member name="M:RMuseum.Services.IRecitationService.GetPoemNarrationVerseSyncArray(System.Int32)">
|
<member name="M:RMuseum.Services.IRecitationService.GetPoemNarrationVerseSyncArray(System.Int32)">
|
||||||
<summary>
|
<summary>
|
||||||
Gets Verse Sync Range Information
|
Gets Verse Sync Range Information
|
||||||
|
|||||||
@ -30,6 +30,14 @@ namespace RMuseum.Services
|
|||||||
/// <returns></returns>
|
/// <returns></returns>
|
||||||
Task<RServiceResult<RecitationViewModel>> Get(int id);
|
Task<RServiceResult<RecitationViewModel>> Get(int id);
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Delete recitation (recitation should belong to userId)
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="id"></param>
|
||||||
|
/// <param name="userId"></param>
|
||||||
|
/// <returns></returns>
|
||||||
|
Task<RServiceResult<bool>> Delete(int id, Guid userId);
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Gets Verse Sync Range Information
|
/// Gets Verse Sync Range Information
|
||||||
/// </summary>
|
/// </summary>
|
||||||
|
|||||||
@ -97,6 +97,77 @@ namespace RMuseum.Services.Implementation
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Delete recitation
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="id"></param>
|
||||||
|
/// <param name="userId"></param>
|
||||||
|
/// <returns></returns>
|
||||||
|
public async Task<RServiceResult<bool>> Delete(int id, Guid userId)
|
||||||
|
{
|
||||||
|
try
|
||||||
|
{
|
||||||
|
Recitation recitation = await _context.Recitations.Where(a => a.Id == id && a.OwnerId == userId).FirstOrDefaultAsync();
|
||||||
|
if(recitation == null)
|
||||||
|
{
|
||||||
|
return new RServiceResult<bool>(false, "404");
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
if (recitation.ReviewStatus == AudioReviewStatus.Approved)
|
||||||
|
{
|
||||||
|
recitation.AudioSyncStatus = (int)AudioSyncStatus.Deleted;
|
||||||
|
_context.Recitations.Update(recitation);
|
||||||
|
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
|
||||||
|
{
|
||||||
|
await _DeleteNarrationFromRemote(recitation, context);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
});
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
await _FinalizeDelete(_context, recitation);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
return new RServiceResult<bool>(true);
|
||||||
|
}
|
||||||
|
catch (Exception exp)
|
||||||
|
{
|
||||||
|
return new RServiceResult<bool>(false, exp.ToString());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private async Task<string> _FinalizeDelete(RMuseumDbContext context, Recitation recitation)
|
||||||
|
{
|
||||||
|
try
|
||||||
|
{
|
||||||
|
string mp3 = recitation.LocalMp3FilePath;
|
||||||
|
string xml = recitation.LocalXmlFilePath;
|
||||||
|
context.Recitations.Remove(recitation);
|
||||||
|
await context.SaveChangesAsync();
|
||||||
|
|
||||||
|
File.Delete(mp3);
|
||||||
|
File.Delete(xml);
|
||||||
|
|
||||||
|
return "";
|
||||||
|
}
|
||||||
|
catch(Exception exp)
|
||||||
|
{
|
||||||
|
return exp.ToString();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Gets Verse Sync Range Information
|
/// Gets Verse Sync Range Information
|
||||||
/// </summary>
|
/// </summary>
|
||||||
@ -945,6 +1016,58 @@ namespace RMuseum.Services.Implementation
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private async Task _DeleteNarrationFromRemote(Recitation narration, RMuseumDbContext context)
|
||||||
|
{
|
||||||
|
using var client = new SftpClient
|
||||||
|
(
|
||||||
|
Configuration.GetSection("AudioSFPServer")["Host"],
|
||||||
|
int.Parse(Configuration.GetSection("AudioSFPServer")["Port"]),
|
||||||
|
Configuration.GetSection("AudioSFPServer")["Username"],
|
||||||
|
Configuration.GetSection("AudioSFPServer")["Password"]
|
||||||
|
);
|
||||||
|
try
|
||||||
|
{
|
||||||
|
client.Connect();
|
||||||
|
client.DeleteFile($"{Configuration.GetSection("AudioSFPServer")["RootPath"]}{narration.RemoteXMLFilePath}");
|
||||||
|
client.DeleteFile($"{Configuration.GetSection("AudioSFPServer")["RootPath"]}{narration.RemoteMp3FilePath}");
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
string sql = $"DELETE FROM ganja_gaudio WHERE audio_post_ID = {narration.GanjoorPostId} AND audio_order = {narration.AudioOrder} 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);
|
||||||
|
}
|
||||||
|
|
||||||
|
await _FinalizeDelete(context, narration);
|
||||||
|
|
||||||
|
|
||||||
|
}
|
||||||
|
catch
|
||||||
|
{
|
||||||
|
//if an error occurs, narration.AudioSyncStatus is not updated and narration can be idetified later to do "retrypublish" attempts
|
||||||
|
}
|
||||||
|
finally
|
||||||
|
{
|
||||||
|
client.Disconnect();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// retry publish unpublished narrations
|
/// retry publish unpublished narrations
|
||||||
/// </summary>
|
/// </summary>
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user