Esempio n. 1
0
        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);
        }
Esempio n. 2
0
        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();
        }
Esempio n. 3
0
        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);
        }
Esempio n. 4
0
        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));
        }
Esempio n. 5
0
        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();
        }
Esempio n. 6
0
        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));
        }
Esempio n. 7
0
        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);
        }
Esempio n. 8
0
        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));
        }
Esempio n. 9
0
        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);
        }
Esempio n. 10
0
        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();
        }
Esempio n. 11
0
        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));
        }
Esempio n. 12
0
        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);
        }
Esempio n. 13
0
        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));
        }
Esempio n. 14
0
        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));
        }
Esempio n. 15
0
        //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);
        }
Esempio n. 16
0
        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;
                }
            }
        }