示例#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);
        }
示例#2
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);
        }
示例#3
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));
        }
示例#4
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);
        }
示例#5
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));
        }
示例#6
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);
        }
示例#7
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));
        }
示例#8
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);
        }
示例#9
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);
        }