diff --git a/src/Squidex/Areas/Api/Controllers/Assets/AssetContentController.cs b/src/Squidex/Areas/Api/Controllers/Assets/AssetContentController.cs index f2a68ba7a..2fb760fc8 100644 --- a/src/Squidex/Areas/Api/Controllers/Assets/AssetContentController.cs +++ b/src/Squidex/Areas/Api/Controllers/Assets/AssetContentController.cs @@ -10,6 +10,7 @@ using System.IO; using System.Threading.Tasks; using Microsoft.AspNetCore.Mvc; using Squidex.Domain.Apps.Entities.Assets.Repositories; +using Squidex.Infrastructure; using Squidex.Infrastructure.Assets; using Squidex.Infrastructure.Commands; using Squidex.Pipeline; @@ -58,7 +59,7 @@ namespace Squidex.Areas.Api.Controllers.Assets [Route("assets/{id}/")] [ProducesResponseType(200)] [ApiCosts(0.5)] - public async Task GetAssetContent(Guid id, [FromQuery] int version = -1, [FromQuery] int? width = null, [FromQuery] int? height = null, [FromQuery] string mode = null) + public async Task GetAssetContent(Guid id, [FromQuery] long version = EtagVersion.Any, [FromQuery] int? width = null, [FromQuery] int? height = null, [FromQuery] string mode = null) { var entity = await assetRepository.FindAssetAsync(id); @@ -67,7 +68,7 @@ namespace Squidex.Areas.Api.Controllers.Assets return NotFound(); } - Response.Headers["ETag"] = $"{entity.FileVersion};{width};{height};{mode}"; + Response.Headers["ETag"] = entity.FileVersion.ToString(); return new FileCallbackResult(entity.MimeType, entity.FileName, async bodyStream => { diff --git a/src/Squidex/Areas/Api/Controllers/Comments/CommentsController.cs b/src/Squidex/Areas/Api/Controllers/Comments/CommentsController.cs index 186d32eb4..3353d4d6e 100644 --- a/src/Squidex/Areas/Api/Controllers/Comments/CommentsController.cs +++ b/src/Squidex/Areas/Api/Controllers/Comments/CommentsController.cs @@ -40,6 +40,10 @@ namespace Squidex.Areas.Api.Controllers.Comments /// /// The name of the app. /// The id of the comments. + /// The current version. + /// + /// When passing in a version you can retrieve all updates since then. + /// /// /// 200 => All comments returned. /// 404 => App not found. @@ -48,13 +52,8 @@ namespace Squidex.Areas.Api.Controllers.Comments [Route("apps/{app}/comments/{commentsId}")] [ProducesResponseType(typeof(CommentsDto), 200)] [ApiCosts(0)] - public async Task GetComments(string app, Guid commentsId) + public async Task GetComments(string app, Guid commentsId, [FromQuery] long version = EtagVersion.Any) { - if (!long.TryParse(Request.Headers["If-None-Match"], out var version)) - { - version = EtagVersion.Any; - } - var result = await grainFactory.GetGrain(commentsId).GetCommentsAsync(version); var response = CommentsDto.FromResult(result); diff --git a/src/Squidex/app/shared/services/comments.service.spec.ts b/src/Squidex/app/shared/services/comments.service.spec.ts index 19d1f6b95..87689b95d 100644 --- a/src/Squidex/app/shared/services/comments.service.spec.ts +++ b/src/Squidex/app/shared/services/comments.service.spec.ts @@ -46,10 +46,10 @@ describe('CommentsService', () => { comments = result; }); - const req = httpMock.expectOne('http://service/p/api/apps/my-app/comments/my-comments'); + const req = httpMock.expectOne('http://service/p/api/apps/my-app/comments/my-comments?version=123'); expect(req.request.method).toEqual('GET'); - expect(req.request.headers.get('If-None-Match')).toBe('123'); + expect(req.request.headers.get('If-Match')).toBeNull(); req.flush({ createdComments: [{ @@ -81,25 +81,6 @@ describe('CommentsService', () => { ); })); - it('should make get request to get comments and return empty result for 304', - inject([CommentsService, HttpTestingController], (commentsService: CommentsService, httpMock: HttpTestingController) => { - - let comments: CommentsDto; - - commentsService.getComments('my-app', 'my-comments', new Version('123')).subscribe(result => { - comments = result; - }); - - const req = httpMock.expectOne('http://service/p/api/apps/my-app/comments/my-comments'); - - expect(req.request.method).toEqual('GET'); - expect(req.request.headers.get('If-None-Match')).toBe('123'); - - req.flush({}, { status: 304, statusText: 'NotModified' }); - - expect(comments!).toEqual(new CommentsDto([], [], [], new Version('123'))); - })); - it('should make post request to create comment', inject([CommentsService, HttpTestingController], (commentsService: CommentsService, httpMock: HttpTestingController) => { diff --git a/src/Squidex/app/shared/services/comments.service.ts b/src/Squidex/app/shared/services/comments.service.ts index 4a4f3a991..ca93570f6 100644 --- a/src/Squidex/app/shared/services/comments.service.ts +++ b/src/Squidex/app/shared/services/comments.service.ts @@ -5,17 +5,16 @@ * Copyright (c) Squidex UG (haftungsbeschränkt). All rights reserved. */ -import { HttpClient, HttpHeaders } from '@angular/common/http'; +import { HttpClient } from '@angular/common/http'; import { Injectable } from '@angular/core'; -import { Observable, of, throwError } from 'rxjs'; -import { catchError, map } from 'rxjs/operators'; +import { Observable } from 'rxjs'; +import { map } from 'rxjs/operators'; import { ApiUrlConfig, DateTime, Model, pretifyError, - Types, Version } from '@app/framework'; @@ -61,25 +60,10 @@ export class CommentsService { } public getComments(appName: string, commentsId: string, version: Version): Observable { - const url = this.apiUrl.buildUrl(`api/apps/${appName}/comments/${commentsId}`); - - const options = { - headers: new HttpHeaders().set('If-None-Match', version.value) - }; - - return this.http.get(url, options).pipe( - catchError(err => { - if (err.status === 304) { - return of(new CommentsDto([], [], [], version)); - } + const url = this.apiUrl.buildUrl(`api/apps/${appName}/comments/${commentsId}?version=${version.value}`); - return throwError(err); - }), + return this.http.get(url).pipe( map(response => { - if (Types.is(response, CommentsDto)) { - return response; - } - const body: any = response; return new CommentsDto(