public async Task <TagUse> RenameTagUseAsync(RenameTagUseRequest request) { SystemContract.RequireNotNullOrWhiteSpace(request.NewName, "request.NewName"); SystemContract.RequireNotNullOrWhiteSpace(request.OldName, "request.OldName"); /// NewNameの使用確認 var newNameTagUseQuery = _refsContext.TagUses.Include("Owner").AsNoTracking(). Where(u => u.OwnerId == request.OwnerId && u.Name == request.NewName); /// collationをcase insensitiveにしているので大文字小文字が異なるTagUseも取得される var newNameTagUses = await newNameTagUseQuery.ToArrayAsync(); var isNewNameTagUseExists = newNameTagUses.Any(u => u.Name == request.NewName); BusinessContract.Require(!isNewNameTagUseExists, Errors.TagUseNameAlreadyExists, request.NewName); var oldNameTagUseQuery = _refsContext.TagUses.Include("Owner"). Where(t => t.OwnerId == request.OwnerId && t.Name == request.OldName); /// collationをcase insensitiveにしているので大文字小文字が異なるTagUseも取得される var storedTagUses = await oldNameTagUseQuery.ToArrayAsync(); var storedTagUse = storedTagUses.Single(u => u.Name == request.OldName); BusinessContract.ValidateWritePermission(request.OwnerId); BusinessContract.ValidateRowVersion(request.TagUseIdentity.RowVersion, storedTagUse.RowVersion); var tag = await EnsureTagAsync(request.NewName); storedTagUse.TagId = tag.Id; storedTagUse.Name = request.NewName; _refsContext.MarkAsModified(storedTagUse); await _refsContext.SaveChangesAsync(); return(storedTagUse); }
public async Task RemoveFavoriteUserAsync(long ownerId, long userId) { var query = _refsContext.Favorites.Where( f => f.OwnerId == ownerId && f.UserId == userId && f.Kind == FavoriteKind.User ); var storedFav = query.SingleOrDefault(); SystemContract.Require( storedFav != null, "未登録のお気に入りユーザ, ownerId: {0}, userId: {1}", ownerId.ToString(), userId.ToString() ); /// update statistics data //{ // var statisticsQuery = _refsContext.RefListStatistics.Where(s => s.RefListId == userId); // var storedRefListStatistics = await statisticsQuery.SingleAsync(); // var favCountQuery = _refsContext.Favorites.AsNoTracking(); // var favCount = await favCountQuery.CountAsync(s => s.RefListId == userId); // storedRefListStatistics.FavoriteCount = favCount - 1; //} _refsContext.Favorites.Remove(storedFav); await _refsContext.SaveChangesAsync(); }
public async Task <TagUse> EnsureTagUseAsync(long ownerId, string name) { SystemContract.RequireNotNullOrWhiteSpace(name, "name"); var query = _refsContext.TagUses.Include("Statistics"). Where(t => t.OwnerId == ownerId && t.Name == name); /// collationをcase insensitiveにしているので大文字小文字が異なるTagUseも取得される var storedTagUses = await query.ToArrayAsync(); var storedTagUse = storedTagUses.SingleOrDefault(u => u.Name == name); if (storedTagUse == null) { var tag = await EnsureTagAsync(name); var tagUse = TagUseFactory.Create(name, tag.Id, ownerId); _refsContext.TagUses.Add(tagUse); await _refsContext.SaveChangesAsync(); storedTagUse = tagUse; } return(storedTagUse); }
public async Task <ActionResult> AddByBookmarklet(string url) { /// bindするとvalidateで「<」とか「>」とかがだめになる var title = Request.Unvalidated.QueryString["title"]; SystemContract.RequireNotNullOrWhiteSpace(url, "url"); BusinessContract.Require(url.Length <= WebConsts.MaxRefLinkUrlLength, Errors.UrlTooLong); if (!string.IsNullOrWhiteSpace(title) && title.Length > WebConsts.MaxRefLinkTitleLength) { title = title.Substring(0, WebConsts.MaxRefLinkTitleLength); } var model = new AddByBookmarkletPageViewModel() { Uri = url, Title = title, }; var user = GetUser(); var req = new GetRefListsRequest( user.Id, null, null, null, "", null, PublishingStatusConditionKind.All, 0, 500, RefListSortKind.UpdatedDateDescending ); var resp = await _refListHandler.GetRefListsAsync(req); model.RefLists = Mapper.Map <ICollection <RefListViewModel> >(resp.RefLists); return(View(model)); }
public async Task AddFavoriteUserAsync(long ownerId, long userId) { var exists = await ExistsFavoriteUserAsync(ownerId, userId); SystemContract.Require( !exists, "登録済みのお気に入りユーザ, ownerId: {0}, userId: {1}", ownerId.ToString(), userId.ToString() ); /// update statistics data //{ // var statisticsQuery = _refsContext.RefListStatistics.Where(s => s.RefListId == userId); // var storedRefListStatistics = await statisticsQuery.SingleAsync(); // var favCountQuery = _refsContext.Favorites.AsNoTracking(); // var favCount = await favCountQuery.CountAsync(s => s.RefListId == userId); // storedRefListStatistics.FavoriteCount = favCount + 1; //} var fav = FavoriteFactory.CreateForUser(ownerId, userId); _refsContext.Favorites.Add(fav); await _refsContext.SaveChangesAsync(); }
public async Task <ActionResult> RemoveTagUse(long?id, byte[] rowVersion) { SystemContract.RequireNotNull(id, "id"); SystemContract.RequireNotNull(rowVersion, "rowVersion"); await _tagHandler.RemoveTagUsesAsync(new EntityIdentity(id.Value, rowVersion)); return(JsonNet(true)); }
public async Task <Tag> GetTagAsync(string name) { SystemContract.RequireNotNullOrWhiteSpace(name, "name"); var query = _refsContext.Tags.Include("Statistics").AsNoTracking(). Where(t => t.Name == name); var storedTag = await query.SingleOrDefaultAsync(); return(storedTag); }
public async Task <ActionResult> AddTagUse(string name) { SystemContract.RequireNotNullOrWhiteSpace(name, "name"); var user = GetUser(); var result = await _tagHandler.EnsureTagUseAsync(user.Id, name); var tagUses = await _tagHandler.GetAllTagUsesAsync(user.Id); var ret = Mapper.Map <ICollection <TagUseViewModel> >(tagUses); return(JsonNet(ret)); }
public async Task <TagUse> GetTagUseAsync(long ownerId, string name) { SystemContract.RequireNotNullOrWhiteSpace(name, "name"); var query = _refsContext.TagUses.Include("Statistics").AsNoTracking(). Where(t => t.OwnerId == ownerId && t.Name == name); /// collationをcase insensitiveにしているので大文字小文字が異なるTagUseも取得される var storedTagUses = await query.ToArrayAsync(); var storedTagUse = storedTagUses.SingleOrDefault(u => u.Name == name); return(storedTagUse); }
public async Task RemoveTagUsesAsync(EntityIdentity identity) { SystemContract.RequireEntityIdentity(identity); var query = _refsContext.TagUses.Include("RefLists"). Where(t => t.Id == identity.Id); var storedTagUse = await query.SingleAsync(); BusinessContract.ValidateRowVersion(storedTagUse.RowVersion, identity.RowVersion); BusinessContract.ValidateWritePermission(storedTagUse.OwnerId); storedTagUse.RefLists.Clear(); _refsContext.TagUses.Remove(storedTagUse); await _refsContext.SaveChangesAsync(); }
public async Task <ActionResult> RenameTagUse(long?id, byte[] rowVersion, string oldName, string newName) { SystemContract.RequireNotNull(id, "id"); SystemContract.RequireNotNullOrWhiteSpace(oldName, "oldName"); SystemContract.RequireNotNullOrWhiteSpace(newName, "newName"); var user = GetUser(); var request = new RenameTagUseRequest() { TagUseIdentity = new EntityIdentity(id.Value, rowVersion), OwnerId = user.Id, OldName = oldName, NewName = newName, }; var result = await _tagHandler.RenameTagUseAsync(request); var ret = Mapper.Map <TagUseViewModel>(result); return(JsonNet(ret)); }
public async Task <Tag> EnsureTagAsync(string name) { // todo: special charsを含んでいる場合もはじく SystemContract.RequireNotNullOrWhiteSpace(name, "name"); var query = _refsContext.Tags.Include("Statistics"). Where(t => t.Name == name); var storedTag = await query.SingleOrDefaultAsync(); if (storedTag == null) { var tag = TagFactory.Create(name); _refsContext.Tags.Add(tag); await _refsContext.SaveChangesAsync(); storedTag = tag; } return(storedTag); }
public async Task <ActionResult> NarrowDetail( string tag, string titleSearch = "", int pageIndex = 1, RefListSortKind sort = RefListSortKind.PublishedDateDescending ) { SystemContract.RequireNotNull(tag, "tag"); SystemContract.Require(tag != CoreConsts.UnsetTagName, "$unsetが指定されました"); /// 非公開設定の確認のため本人でもPublishしか見れないようにする。 var req = new GetRefListsRequest( null, null, null, tag, titleSearch, null, PublishingStatusConditionKind.PublishOnly, pageIndex - 1, WebConsts.RefListsPageSize, sort ); var result = await _refListHandler.GetRefListsAsync(req); var vm = new PagedRefListsViewModel() { PageIndex = result.PageIndex + 1, PageCount = result.PageCount, RefLists = Mapper.Map <ICollection <RefListViewModel> >(result.RefLists), }; return(JsonNet(vm, JsonRequestBehavior.AllowGet)); }
public async Task <ActionResult> NarrowDetail( long?id, string titleSearch = "", string tag = null, int pageIndex = 1, RefListSortKind sort = RefListSortKind.PublishedDateDescending ) { SystemContract.RequireNotNull(id, "id"); //var isPublishOnly = !IsCurrentUserId(id.Value); /// Author以外のユーザーの場合、Publishなリストだけを対象にする /// 非公開設定の確認のため本人でもPublishしか見れないようにする。 var req = new GetRefListsRequest( id.Value, null, null, tag, titleSearch, null, PublishingStatusConditionKind.PublishOnly, pageIndex - 1, WebConsts.RefListsPageSize, sort ); var result = await _refListHandler.GetRefListsAsync(req); var vm = new PagedRefListsViewModel() { PageIndex = result.PageIndex + 1, PageCount = result.PageCount, RefLists = Mapper.Map <ICollection <RefListViewModel> >(result.RefLists), }; return(JsonNet(vm, JsonRequestBehavior.AllowGet)); }
//public async Task<RefList> GetUnfiledRefListAsync(long authorId) //{ // var query = // from l in _refsContext.RefLists.Include("Author").Include("Refs").AsNoTracking() // where l.Kind == RefListKind.Unfiled && l.Author.Id == authorId // select l; // var storedRefLists = await query.SingleAsync(); // storedRefLists.Refs = storedRefLists.Refs.OrderBy(r => r.DisplayOrder).ToArray(); // return storedRefLists; //} public async Task <SearchRefListsResponse> SearchRefListsAsync(string searchText, int start = 0, int count = 20) { SystemContract.RequireNotNullOrWhiteSpace(searchText, "searchText"); var max = 100; count = count > max ? max : count; var searchResult = _searchEngine.SearchRefList(searchText, max); var ids = searchResult.Skip(start).Take(count).ToArray(); var query = _refsContext.RefLists.Include("Author").Include("TagUses.Tag").Include("Statistics").AsNoTracking(). Where(l => ids.Contains(l.Id)); var storedRefLists = await query.ToArrayAsync(); var ret = new SearchRefListsResponse() { WholeCount = searchResult.Count(), RefLists = storedRefLists, }; return(ret); }
public async Task <EntityIdentity> MoveRefToAsync( EntityIdentity fromListIdentity, EntityIdentity toListIdentity, int fromRefIndex, int toRefIndex = -1 ) { using (var tran = _refsContext.BeginTransaction()) { try { SystemContract.Require( fromRefIndex > -1, () => new ArgumentOutOfRangeException("fromRefIndex: " + fromRefIndex) ); var fromQuery = _refsContext.RefLists.Include("Refs"). Where(l => l.Id == fromListIdentity.Id); var fromStoredRefList = await fromQuery.SingleAsync(); SystemContract.Require( fromRefIndex < fromStoredRefList.Refs.Count, () => new ArgumentOutOfRangeException("fromRefIndex: " + fromRefIndex) ); BusinessContract.ValidateWritePermission(fromStoredRefList.AuthorId); BusinessContract.ValidateRowVersion(fromStoredRefList.RowVersion, fromListIdentity.RowVersion); var toQuery = _refsContext.RefLists.Include("Refs"). Where(l => l.Id == toListIdentity.Id); var toStoredRefList = await toQuery.SingleAsync(); BusinessContract.ValidateWritePermission(toStoredRefList.AuthorId); BusinessContract.ValidateRowVersion(toStoredRefList.RowVersion, toListIdentity.RowVersion); /// fromから削除 var fromRefs = fromStoredRefList.Refs.OrderBy(r => r.DisplayOrder).ToList(); var moving = fromRefs[fromRefIndex]; fromRefs.RemoveAt(fromRefIndex); for (int i = 0; i < fromRefs.Count; ++i) { fromRefs[i].DisplayOrder = i; } fromStoredRefList.Refs.Remove(moving); /// toに追加 var toRefs = toStoredRefList.Refs.OrderBy(r => r.DisplayOrder).ToList(); if (toRefIndex < 0) { toRefs.Add(moving); } else { toRefs.Insert(toRefIndex, moving); } for (int i = 0; i < toRefs.Count; ++i) { toRefs[i].DisplayOrder = i; } toStoredRefList.Refs.Add(moving); _refsContext.MarkAsModified(fromStoredRefList); await _refsContext.SaveChangesAsync(); // toのUpdatedDateをfromより後にするため早めに書き込む /// update statistics if (moving.Kind == RefKind.Link) { var fromStatQuery = _refsContext.RefListStatistics.Where(s => s.RefListId == fromListIdentity.Id); var storedFromStat = await fromStatQuery.SingleAsync(); storedFromStat.LinkCount = fromStoredRefList.Refs.Count(r => r.Kind == RefKind.Link); var toStatQuery = _refsContext.RefListStatistics.Where(s => s.RefListId == toListIdentity.Id); var storedToStat = await toStatQuery.SingleAsync(); storedToStat.LinkCount = toStoredRefList.Refs.Count(r => r.Kind == RefKind.Link); } _refsContext.MarkAsModified(toStoredRefList); await _refsContext.SaveChangesAsync(); // toのUpdatedDateをfromより後にするため遅めに書き込む SendRefListUpdated(fromListIdentity.Id); SendRefListUpdated(toListIdentity.Id); fromListIdentity.RowVersion = fromStoredRefList.RowVersion; tran.Commit(); return(fromListIdentity); } catch (Exception) { tran.Rollback(); throw; } } }