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 <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 <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 <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<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); }