public async Task <ActionResult> AddPassageAsync(int groupId, [FromBody] PassageReference passage) { if (passage.Chapter < 1 || passage.Verse < 1 || passage.Length < 1 || passage.StartOffset < 0 || passage.EndOffset < 0) { return(BadRequest()); } var currentUserId = HttpContext.GetCurrentUserId(); if (currentUserId is null) { return(Unauthorized()); } var role = await UserService.GetUserRoleAsync(currentUserId, groupId); if (role is null) { return(NotFound()); } else if (role > Roles.Admin) { return(Forbid()); } return(await GroupService.AddPassageAsync(groupId, passage) ? (ActionResult)Ok() : Conflict()); }
public async Task <bool> AddPassageAsync(int groupId, PassageReference passageReference) { if (passageReference is null) { throw new ArgumentNullException(nameof(passageReference)); } Logger.LogInformation("Adding passage {PassageReference} to group {GroupId}", passageReference, groupId); var group = await DbContext.Groups.FindAsync(groupId); if (group is null) { Logger.LogWarning("Could not add passage reference {PassageReference} to group {GroupId} because the group does not exist", passageReference, groupId); return(false); } await DbContext.Entry(group).Collection(g => g.PassageReferences).LoadAsync(); if (group.PassageReferences.Any(p => passageReference == p)) { Logger.LogInformation("Could not add passage reference {PassageReference} to group {GroupId} because the group already contains that reference", passageReference, groupId); return(false); } // Create a new reference since a specific passage reference instance should only belong to a single group. // This guards against a passage from another group being passed in and added. group.PassageReferences.Add(new PassageReference(passageReference)); DbContext.Groups.Update(group); await DbContext.SaveChangesAsync(); Logger.LogInformation("Added passage {PassageReference} to group {GroupId}", passageReference, groupId); return(true); }
public async Task <ActionResult <Passage> > GetPassageAsync(Books book, byte chapter, byte verse, [FromQuery] byte length = 1, [FromQuery] Translations translation = Translations.KJV) { if (chapter == 0 || verse == 0 || length == 0) { return(BadRequest()); } var passageRef = new PassageReference(book, chapter, verse, length, 0, 0); var verses = await VerseService.GetVersesAsync(passageRef.Verses, translation); return(Ok(verses)); }
private async Task <Passage> GetPassageAsync(PassageReference reference, Translations translation) { var referenceString = reference?.ToString(); if (reference == null || string.IsNullOrEmpty(referenceString)) { Logger.LogError("Could not resolve passage references. Invalid reference {@PassageReference}", reference); throw new ArgumentException("Invalid passage reference", nameof(reference)); } var passageVerses = await VerseService.GetVersesAsync(reference.Verses, translation); Logger.LogInformation("Retrieved {VerseCount} verses for {PassageReference}", passageVerses.Count(), reference); var text = string.Join(' ', passageVerses.Select(v => v.Text)); if (reference.StartOffset > 0 || reference.EndOffset > 0) { var tokens = text.Split(); text = string.Join(' ', tokens, reference.StartOffset, tokens.Length - (reference.StartOffset + reference.EndOffset)); } return(new Passage(reference.Id, referenceString, text, translation.ToString())); }