#208 bookmarking a verse

This commit is contained in:
Hamid Reza Mohammadi 2021-09-26 20:37:29 +03:30
parent 95ee23db2b
commit 4b753894a6
6 changed files with 104 additions and 50 deletions

View File

@ -649,14 +649,19 @@ namespace GanjooRazor.Pages
var comments = JArray.Parse(await response.Content.ReadAsStringAsync()).ToObject<List<GanjoorCommentSummaryViewModel>>();
bool isBookmarked = false;
if (!string.IsNullOrEmpty(Request.Cookies["UserId"]))
if (Guid.TryParse(Request.Cookies["UserId"], out Guid userId))
if (userId != Guid.Empty)
foreach (GanjoorCommentSummaryViewModel comment in comments)
{
comment.MyComment = comment.UserId == userId;
_markMyReplies(comment, userId);
if (Guid.TryParse(Request.Cookies["UserId"], out Guid userId))
if (userId != Guid.Empty)
foreach (GanjoorCommentSummaryViewModel comment in comments)
{
comment.MyComment = comment.UserId == userId;
_markMyReplies(comment, userId);
}
}
return new PartialViewResult()
@ -669,10 +674,33 @@ namespace GanjooRazor.Pages
PoemId = poemId,
CoupletIndex = coupletIndex,
LoggedIn = !string.IsNullOrEmpty(Request.Cookies["Token"]),
Comments = comments
Comments = comments,
IsBookmarked = isBookmarked
}
}
};
}
public async Task<IActionResult> OnPostSwitchBookmarkAsync(int poemId, int vOrder)
{
using (HttpClient secureClient = new HttpClient())
{
if (await GanjoorSessionChecker.PrepareClient(secureClient, Request, Response))
{
HttpResponseMessage response = await secureClient.PostAsync(
$"{APIRoot.Url}/api/ganjoor/bookmark/switch/{poemId}/{vOrder}", null);
if (!response.IsSuccessStatusCode)
{
return new BadRequestObjectResult(JsonConvert.DeserializeObject<string>(await response.Content.ReadAsStringAsync()));
}
var res = await response.Content.ReadAsStringAsync();
return new OkObjectResult(res != null);
}
else
{
return new BadRequestObjectResult("لطفا از گنجور خارج و مجددا به آن وارد شوید.");
}
}
}
}
}

View File

@ -402,6 +402,29 @@ function editCouplet(poemId, coupletIndex) {
}
function switchBookmark(poemId, coupletIndex) {
var vIndex = getVerseIndexFromCoupleIndex(coupletIndex);
var iconElementId = 'bookmark-icon-' + String(coupletIndex);
document.getElementById(iconElementId).innerHTML = (document.getElementById(iconElementId).innerHTML == 'star') ? 'star_border' : 'star';
document.getElementById(iconElementId).innerHTML = 'star_half';
var url = '/?handler=SwitchBookmark';
$.ajax({
type: "POST",
url: url,
data: {
poemId: poemId,
vOrder: (vIndex + 1)
},
error: function (err) {
alert(err)
},
success: function (isBookmarked) {
if (isBookmarked == true) {
document.getElementById(iconElementId).innerHTML = 'star';
}
else {
document.getElementById(iconElementId).innerHTML = 'star_border';
}
},
});
}

View File

@ -1887,17 +1887,17 @@ namespace RMuseum.Controllers
/// bookmark verse
/// </summary>
/// <param name="poemId"></param>
/// <param name="verseId"></param>
/// <param name="vOrder"></param>
/// <returns></returns>
[HttpPost]
[Route("bookmark/{poemId}/{verseId}")]
[Route("bookmark/{poemId}/{vOrder}")]
[Authorize]
[ProducesResponseType((int)HttpStatusCode.OK, Type = typeof(GanjoorUserBookmark))]
[ProducesResponseType((int)HttpStatusCode.BadRequest, Type = typeof(string))]
public async Task<IActionResult> BookmarkVerse(int poemId, int verseId)
public async Task<IActionResult> BookmarkVerse(int poemId, int vOrder)
{
Guid loggedOnUserId = new Guid(User.Claims.FirstOrDefault(c => c.Type == "UserId").Value);
RServiceResult<GanjoorUserBookmark> res = await _ganjoorService.BookmarkVerse(poemId, verseId, loggedOnUserId, RBookmarkType.Bookmark);
RServiceResult<GanjoorUserBookmark> res = await _ganjoorService.BookmarkVerse(poemId, vOrder, loggedOnUserId, RBookmarkType.Bookmark);
if (!string.IsNullOrEmpty(res.ExceptionString))
return BadRequest(res.ExceptionString);
return Ok(res.Result);
@ -1926,17 +1926,17 @@ namespace RMuseum.Controllers
/// switch bookmark
/// </summary>
/// <param name="poemId"></param>
/// <param name="verseId"></param>
/// <param name="vOrder"></param>
/// <returns></returns>
[HttpPost]
[Route("bookmark/switch/{poemId}/{verseId}")]
[Route("bookmark/switch/{poemId}/{vOrder}")]
[Authorize]
[ProducesResponseType((int)HttpStatusCode.OK, Type = typeof(GanjoorUserBookmark))]
[ProducesResponseType((int)HttpStatusCode.BadRequest, Type = typeof(string))]
public async Task<IActionResult> SwitchBookmark(int poemId, int verseId)
public async Task<IActionResult> SwitchBookmark(int poemId, int vOrder)
{
Guid loggedOnUserId = new Guid(User.Claims.FirstOrDefault(c => c.Type == "UserId").Value);
RServiceResult<GanjoorUserBookmark> res = await _ganjoorService.SwitchBookmarkVerse(poemId, verseId, loggedOnUserId, RBookmarkType.Bookmark);
RServiceResult<GanjoorUserBookmark> res = await _ganjoorService.SwitchBookmarkVerse(poemId, vOrder, loggedOnUserId, RBookmarkType.Bookmark);
if (!string.IsNullOrEmpty(res.ExceptionString))
return BadRequest(res.ExceptionString);
return Ok(res.Result);
@ -1946,17 +1946,17 @@ namespace RMuseum.Controllers
/// fav poem
/// </summary>
/// <param name="poemId"></param>
/// <param name="verseId"></param>
/// <param name="vOrder"></param>
/// <returns></returns>
[HttpPost]
[Route("fav/{poemId}/{verseId}")]
[Route("fav/{poemId}/{vOrder}")]
[Authorize]
[ProducesResponseType((int)HttpStatusCode.OK, Type = typeof(GanjoorUserBookmark))]
[ProducesResponseType((int)HttpStatusCode.BadRequest, Type = typeof(string))]
public async Task<IActionResult> FavArtifact(int poemId, int verseId)
public async Task<IActionResult> FavArtifact(int poemId, int vOrder)
{
Guid loggedOnUserId = new Guid(User.Claims.FirstOrDefault(c => c.Type == "UserId").Value);
RServiceResult<GanjoorUserBookmark> res = await _ganjoorService.BookmarkVerse(poemId, verseId, loggedOnUserId, RBookmarkType.Favorite);
RServiceResult<GanjoorUserBookmark> res = await _ganjoorService.BookmarkVerse(poemId, vOrder, loggedOnUserId, RBookmarkType.Favorite);
if (!string.IsNullOrEmpty(res.ExceptionString))
return BadRequest(res.ExceptionString);
return Ok(res.Result);
@ -2006,17 +2006,17 @@ namespace RMuseum.Controllers
/// item bookmarks info
/// </summary>
/// <param name="poemId"></param>
/// <param name="verseId"></param>
/// <param name="vOrder"></param>
/// <returns></returns>
[HttpGet]
[Route("bookmark/item/{itemId}")]
[Route("bookmark/{poemId}/{vOrder}")]
[Authorize]
[ProducesResponseType((int)HttpStatusCode.OK, Type = typeof(GanjoorUserBookmark[]))]
[ProducesResponseType((int)HttpStatusCode.BadRequest, Type = typeof(string))]
public async Task<IActionResult> GetVerseGanjoorUserBookmarks(int poemId, int verseId)
public async Task<IActionResult> GetVerseGanjoorUserBookmarks(int poemId, int vOrder)
{
Guid loggedOnUserId = new Guid(User.Claims.FirstOrDefault(c => c.Type == "UserId").Value);
RServiceResult<GanjoorUserBookmark[]> res = await _ganjoorService.GetVerseGanjoorUserBookmarks(poemId, verseId, loggedOnUserId);
RServiceResult<GanjoorUserBookmark[]> res = await _ganjoorService.GetVerseGanjoorUserBookmarks(poemId, vOrder, loggedOnUserId);
if (!string.IsNullOrEmpty(res.ExceptionString))
return BadRequest(res.ExceptionString);
return Ok(res.Result);

View File

@ -1215,7 +1215,7 @@
bookmark verse
</summary>
<param name="poemId"></param>
<param name="verseId"></param>
<param name="vOrder"></param>
<returns></returns>
</member>
<member name="M:RMuseum.Controllers.GanjoorController.DeleteBookmark(System.Guid)">
@ -1230,7 +1230,7 @@
switch bookmark
</summary>
<param name="poemId"></param>
<param name="verseId"></param>
<param name="vOrder"></param>
<returns></returns>
</member>
<member name="M:RMuseum.Controllers.GanjoorController.FavArtifact(System.Int32,System.Int32)">
@ -1238,7 +1238,7 @@
fav poem
</summary>
<param name="poemId"></param>
<param name="verseId"></param>
<param name="vOrder"></param>
<returns></returns>
</member>
<member name="M:RMuseum.Controllers.GanjoorController.GetPoemGanjoorUserBookmarks(System.Int32)">
@ -1260,7 +1260,7 @@
item bookmarks info
</summary>
<param name="poemId"></param>
<param name="verseId"></param>
<param name="vOrder"></param>
<returns></returns>
</member>
<member name="M:RMuseum.Controllers.GanjoorController.GetUserBookmarks(RSecurityBackend.Models.Generic.PagingParameterModel)">
@ -8662,7 +8662,7 @@
Bookmark Verse
</summary>
<param name="poemId"></param>
<param name="verseId"></param>
<param name="vOrder"></param>
<param name="userId"></param>
<param name="type"></param>
<returns></returns>
@ -8672,7 +8672,7 @@
Switch Bookmark Verse
</summary>
<param name="poemId"></param>
<param name="verseId"></param>
<param name="vOrder"></param>
<param name="userId"></param>
<param name="type"></param>
<returns></returns>
@ -8691,7 +8691,7 @@
get verse bookmarks
</summary>
<param name="poemId"></param>
<param name="verseId"></param>
<param name="vOrder"></param>
<param name="userId"></param>
<returns></returns>
</member>
@ -9759,7 +9759,7 @@
Bookmark Verse
</summary>
<param name="poemId"></param>
<param name="verseId"></param>
<param name="vOrder"></param>
<param name="userId"></param>
<param name="type"></param>
<returns></returns>
@ -9769,7 +9769,7 @@
Bookmark Verse
</summary>
<param name="poemId"></param>
<param name="verseId"></param>
<param name="vOrder"></param>
<param name="userId"></param>
<param name="type"></param>
<returns></returns>
@ -9788,7 +9788,7 @@
get verse bookmarks
</summary>
<param name="poemId"></param>
<param name="verseId"></param>
<param name="vOrder"></param>
<param name="userId"></param>
<returns></returns>
</member>

View File

@ -571,21 +571,21 @@ namespace RMuseum.Services
/// Bookmark Verse
/// </summary>
/// <param name="poemId"></param>
/// <param name="verseId"></param>
/// <param name="vOrder"></param>
/// <param name="userId"></param>
/// <param name="type"></param>
/// <returns></returns>
Task<RServiceResult<GanjoorUserBookmark>> BookmarkVerse(int poemId, int verseId, Guid userId, RBookmarkType type);
Task<RServiceResult<GanjoorUserBookmark>> BookmarkVerse(int poemId, int vOrder, Guid userId, RBookmarkType type);
/// <summary>
/// Switch Bookmark Verse
/// </summary>
/// <param name="poemId"></param>
/// <param name="verseId"></param>
/// <param name="vOrder"></param>
/// <param name="userId"></param>
/// <param name="type"></param>
/// <returns></returns>
Task<RServiceResult<GanjoorUserBookmark>> SwitchBookmarkVerse(int poemId, int verseId, Guid userId, RBookmarkType type);
Task<RServiceResult<GanjoorUserBookmark>> SwitchBookmarkVerse(int poemId, int vOrder, Guid userId, RBookmarkType type);
/// <summary>
/// get user ganjoor bookmarks
@ -600,10 +600,10 @@ namespace RMuseum.Services
/// get verse bookmarks
/// </summary>
/// <param name="poemId"></param>
/// <param name="verseId"></param>
/// <param name="vOrder"></param>
/// <param name="userId"></param>
/// <returns></returns>
Task<RServiceResult<GanjoorUserBookmark[]>> GetVerseGanjoorUserBookmarks(int poemId, int verseId, Guid userId);
Task<RServiceResult<GanjoorUserBookmark[]>> GetVerseGanjoorUserBookmarks(int poemId, int vOrder, Guid userId);
/// <summary>
/// delete user bookmark

View File

@ -20,13 +20,14 @@ namespace RMuseum.Services.Implementation
/// Bookmark Verse
/// </summary>
/// <param name="poemId"></param>
/// <param name="verseId"></param>
/// <param name="vOrder"></param>
/// <param name="userId"></param>
/// <param name="type"></param>
/// <returns></returns>
public async Task<RServiceResult<GanjoorUserBookmark>> SwitchBookmarkVerse(int poemId, int verseId, Guid userId, RBookmarkType type)
public async Task<RServiceResult<GanjoorUserBookmark>> SwitchBookmarkVerse(int poemId, int vOrder, Guid userId, RBookmarkType type)
{
var bookmark = await _context.GanjoorUserBookmarks.Where(b => b.UserId == userId && b.PoemId == poemId && b.VerseId == verseId && b.RBookmarkType == type).SingleOrDefaultAsync();
var verse = await _context.GanjoorVerses.Where(v => v.PoemId == poemId && v.VOrder == vOrder).SingleAsync();
var bookmark = await _context.GanjoorUserBookmarks.Where(b => b.UserId == userId && b.PoemId == poemId && b.VerseId == verse.Id && b.RBookmarkType == type).SingleOrDefaultAsync();
if (bookmark != null)
{
var res = await DeleteGanjoorBookmark(bookmark.Id, userId);
@ -37,7 +38,7 @@ namespace RMuseum.Services.Implementation
}
else
{
var res = await BookmarkVerse(poemId, verseId, userId, type);
var res = await BookmarkVerse(poemId, vOrder, userId, type);
if(!string.IsNullOrEmpty(res.ExceptionString))
return res;
bookmark = res.Result;
@ -50,13 +51,14 @@ namespace RMuseum.Services.Implementation
/// Bookmark Verse
/// </summary>
/// <param name="poemId"></param>
/// <param name="verseId"></param>
/// <param name="vOrder"></param>
/// <param name="userId"></param>
/// <param name="type"></param>
/// <returns></returns>
public async Task<RServiceResult<GanjoorUserBookmark>> BookmarkVerse(int poemId, int verseId, Guid userId, RBookmarkType type)
public async Task<RServiceResult<GanjoorUserBookmark>> BookmarkVerse(int poemId, int vOrder, Guid userId, RBookmarkType type)
{
if ((await _context.GanjoorUserBookmarks.Where(b => b.UserId == userId && b.PoemId == poemId && b.VerseId == verseId && b.RBookmarkType == type).SingleOrDefaultAsync()) != null)
var verse = await _context.GanjoorVerses.Where(v => v.PoemId == poemId && v.VOrder == vOrder).SingleAsync();
if ((await _context.GanjoorUserBookmarks.Where(b => b.UserId == userId && b.PoemId == poemId && b.VerseId == verse.Id && b.RBookmarkType == type).SingleOrDefaultAsync()) != null)
{
return new RServiceResult<GanjoorUserBookmark>(null, "Artifact is already bookmarked/faved.");
}
@ -66,7 +68,7 @@ namespace RMuseum.Services.Implementation
{
UserId = userId,
PoemId = poemId,
VerseId = verseId,
VerseId = verse.Id,
RBookmarkType = type,
DateTime = DateTime.Now,
Note = ""
@ -95,12 +97,13 @@ namespace RMuseum.Services.Implementation
/// get verse bookmarks
/// </summary>
/// <param name="poemId"></param>
/// <param name="verseId"></param>
/// <param name="vOrder"></param>
/// <param name="userId"></param>
/// <returns></returns>
public async Task<RServiceResult<GanjoorUserBookmark[]>> GetVerseGanjoorUserBookmarks(int poemId, int verseId, Guid userId)
public async Task<RServiceResult<GanjoorUserBookmark[]>> GetVerseGanjoorUserBookmarks(int poemId, int vOrder, Guid userId)
{
GanjoorUserBookmark[] bookmarks = await _context.GanjoorUserBookmarks.Where(b => b.PoemId == poemId && b.VerseId == verseId && b.UserId == userId).ToArrayAsync();
var verse = await _context.GanjoorVerses.Where(v => v.PoemId == poemId && v.VOrder == vOrder).SingleAsync();
GanjoorUserBookmark[] bookmarks = await _context.GanjoorUserBookmarks.Where(b => b.PoemId == poemId && b.VerseId == verse.Id && b.UserId == userId).ToArrayAsync();
return new RServiceResult<GanjoorUserBookmark[]>(bookmarks);
}