diff --git a/src/Squidex/app/framework/services/local-cache.service.spec.ts b/src/Squidex/app/framework/services/local-cache.service.spec.ts index 3040c49e6..f2380bf6d 100644 --- a/src/Squidex/app/framework/services/local-cache.service.spec.ts +++ b/src/Squidex/app/framework/services/local-cache.service.spec.ts @@ -30,7 +30,7 @@ describe('LocalCache', () => { expect(localCacheService.get('key')).toBe(value); }); - it('should get and store item in cache', () => { + it('should not retrieve item if cleared', () => { const localCacheService = new LocalCacheService(); const value = {}; @@ -41,6 +41,17 @@ describe('LocalCache', () => { expect(localCacheService.get('key')).toBeUndefined(); }); + it('should not retrieve item if removed', () => { + const localCacheService = new LocalCacheService(); + + const value = {}; + + localCacheService.set('key', value); + localCacheService.remove('key'); + + expect(localCacheService.get('key')).toBeUndefined(); + }); + it('should not retrieve item if expired', () => { const localCacheService = new LocalCacheService(); diff --git a/src/Squidex/app/framework/services/local-cache.service.ts b/src/Squidex/app/framework/services/local-cache.service.ts index f79e88102..1a1d08ac7 100644 --- a/src/Squidex/app/framework/services/local-cache.service.ts +++ b/src/Squidex/app/framework/services/local-cache.service.ts @@ -48,6 +48,10 @@ export class LocalCacheService { this.entries[key] = { value, expires: new Date().getTime() + expiresIn }; } + public remove(key: string) { + delete this.entries[key]; + } + private static isExpired(now: number, entry: Entry): boolean { return entry.expires < now; } diff --git a/src/Squidex/app/shared/services/assets.service.ts b/src/Squidex/app/shared/services/assets.service.ts index 016388641..bcba00158 100644 --- a/src/Squidex/app/shared/services/assets.service.ts +++ b/src/Squidex/app/shared/services/assets.service.ts @@ -236,25 +236,23 @@ export class AssetsService { } public replaceFile(appName: string, id: string, file: File, version?: Version): Observable { - return new Observable(subscriber => { - const url = this.apiUrl.buildUrl(`api/apps/${appName}/assets/${id}/content`); - - const req = new HttpRequest('PUT', url, getFormData(file), { - headers: new HttpHeaders({ - 'If-Match': version.value - }), - reportProgress: true - }); - - this.http.request(req) - .pretifyError('Failed to replace asset. Please reload.') - .subscribe(event => { + const url = this.apiUrl.buildUrl(`api/apps/${appName}/assets/${id}/content`); + + const req = new HttpRequest('PUT', url, getFormData(file), { + headers: new HttpHeaders({ + 'If-Match': version.value + }), + reportProgress: true + }); + + return this.http.request(req) + .map(event => { if (event.type === HttpEventType.UploadProgress) { const percentDone = Math.round(100 * event.loaded / event.total); - subscriber.next(percentDone); + return percentDone; } else if (event instanceof HttpResponse) { - const response = event.body; + const response: any = event.body; const dto = new AssetReplacedDto( response.fileSize, @@ -265,27 +263,26 @@ export class AssetsService { response.pixelHeight, new Version(response.version.toString())); - subscriber.next(dto); + return dto; } - }, err => { - subscriber.error(err); - }, () => { - subscriber.complete(); - }); - }); + }) + .pretifyError('Failed to replace asset. Please reload.'); } - public putAsset(appName: string, id: string, dto: UpdateAssetDto, version?: Version): Observable { + public deleteAsset(appName: string, id: string, version?: Version): Observable { const url = this.apiUrl.buildUrl(`api/apps/${appName}/assets/${id}`); - return HTTP.putVersioned(this.http, url, dto, version) + return HTTP.deleteVersioned(this.http, url, version) + .do(() => { + this.localCache.remove(`asset.${id}`); + }) .pretifyError('Failed to delete asset. Please reload.'); } - public deleteAsset(appName: string, id: string, version?: Version): Observable { + public putAsset(appName: string, id: string, dto: UpdateAssetDto, version?: Version): Observable { const url = this.apiUrl.buildUrl(`api/apps/${appName}/assets/${id}`); - return HTTP.deleteVersioned(this.http, url, version) + return HTTP.putVersioned(this.http, url, dto, version) .pretifyError('Failed to delete asset. Please reload.'); } } diff --git a/src/Squidex/app/shared/services/contents.service.ts b/src/Squidex/app/shared/services/contents.service.ts index 21460b736..17ce8db0b 100644 --- a/src/Squidex/app/shared/services/contents.service.ts +++ b/src/Squidex/app/shared/services/contents.service.ts @@ -182,9 +182,22 @@ export class ContentsService { const url = this.apiUrl.buildUrl(`/api/content/${appName}/${schemaName}/${id}`); return HTTP.putVersioned(this.http, url, dto, version) + .do(content => { + this.localCache.set(`content.${content.id}`, content, 5000); + }) .pretifyError('Failed to update content. Please reload.'); } + public deleteContent(appName: string, schemaName: string, id: string, version?: Version): Observable { + const url = this.apiUrl.buildUrl(`/api/content/${appName}/${schemaName}/${id}`); + + return HTTP.deleteVersioned(this.http, url, version) + .do(() => { + this.localCache.remove(`content.${id}`); + }) + .pretifyError('Failed to delete content. Please reload.'); + } + public publishContent(appName: string, schemaName: string, id: string, version?: Version): Observable { const url = this.apiUrl.buildUrl(`/api/content/${appName}/${schemaName}/${id}/publish`); @@ -198,11 +211,4 @@ export class ContentsService { return HTTP.putVersioned(this.http, url, {}, version) .pretifyError('Failed to unpublish content. Please reload.'); } - - public deleteContent(appName: string, schemaName: string, id: string, version?: Version): Observable { - const url = this.apiUrl.buildUrl(`/api/content/${appName}/${schemaName}/${id}`); - - return HTTP.deleteVersioned(this.http, url, version) - .pretifyError('Failed to delete content. Please reload.'); - } } \ No newline at end of file diff --git a/src/Squidex/app/shared/services/schemas.service.ts b/src/Squidex/app/shared/services/schemas.service.ts index 1c1307442..771c52ac9 100644 --- a/src/Squidex/app/shared/services/schemas.service.ts +++ b/src/Squidex/app/shared/services/schemas.service.ts @@ -733,6 +733,16 @@ export class SchemasService { .pretifyError('Failed to add field. Please reload.'); } + public deleteSchema(appName: string, schemaName: string, version?: Version): Observable { + const url = this.apiUrl.buildUrl(`api/apps/${appName}/schemas/${schemaName}`); + + return HTTP.deleteVersioned(this.http, url, version) + .do(() => { + this.localCache.remove(`service.${appName}.${schemaName}`); + }) + .pretifyError('Failed to delete schema. Please reload.'); + } + public putSchema(appName: string, schemaName: string, dto: UpdateSchemaDto, version?: Version): Observable { const url = this.apiUrl.buildUrl(`api/apps/${appName}/schemas/${schemaName}`); @@ -802,11 +812,4 @@ export class SchemasService { return HTTP.deleteVersioned(this.http, url, version) .pretifyError('Failed to delete field. Please reload.'); } - - public deleteSchema(appName: string, schemaName: string, version?: Version): Observable { - const url = this.apiUrl.buildUrl(`api/apps/${appName}/schemas/${schemaName}`); - - return HTTP.deleteVersioned(this.http, url, version) - .pretifyError('Failed to delete schema. Please reload.'); - } } \ No newline at end of file