Browse Source

Services improved and news service.

pull/347/head
Sebastian Stehle 7 years ago
parent
commit
3de5e269ce
  1. 2
      src/Squidex/Areas/Api/Controllers/Languages/LanguagesController.cs
  2. 26
      src/Squidex/Areas/Api/Controllers/News/Models/FeatureDto.cs
  3. 26
      src/Squidex/Areas/Api/Controllers/News/Models/FeaturesDto.cs
  4. 48
      src/Squidex/Areas/Api/Controllers/News/NewsController.cs
  5. 50
      src/Squidex/Areas/Api/Controllers/News/Service/FeaturesService.cs
  6. 15
      src/Squidex/app/features/administration/services/event-consumers.service.ts
  7. 37
      src/Squidex/app/features/administration/services/users.service.ts
  8. 1
      src/Squidex/app/shared/internal.ts
  9. 2
      src/Squidex/app/shared/module.ts
  10. 4
      src/Squidex/app/shared/services/assets.service.ts
  11. 20
      src/Squidex/app/shared/services/backups.service.ts
  12. 7
      src/Squidex/app/shared/services/comments.service.ts
  13. 7
      src/Squidex/app/shared/services/help.service.ts
  14. 9
      src/Squidex/app/shared/services/history.service.ts
  15. 6
      src/Squidex/app/shared/services/languages.service.ts
  16. 66
      src/Squidex/app/shared/services/news.service.spec.ts
  17. 64
      src/Squidex/app/shared/services/news.service.ts
  18. 29
      src/Squidex/app/shared/services/usages.service.ts
  19. 22
      src/Squidex/app/shared/services/users.service.ts

2
src/Squidex/Areas/Api/Controllers/Languages/LanguagesController.cs

@ -15,7 +15,7 @@ using Squidex.Pipeline;
namespace Squidex.Areas.Api.Controllers.Languages namespace Squidex.Areas.Api.Controllers.Languages
{ {
/// <summary> /// <summary>
/// Readonly API to the supported langauges. /// Readonly API for supported languages.
/// </summary> /// </summary>
[ApiExplorerSettings(GroupName = nameof(Languages))] [ApiExplorerSettings(GroupName = nameof(Languages))]
public sealed class LanguagesController : ApiController public sealed class LanguagesController : ApiController

26
src/Squidex/Areas/Api/Controllers/News/Models/FeatureDto.cs

@ -0,0 +1,26 @@
// ==========================================================================
// Squidex Headless CMS
// ==========================================================================
// Copyright (c) Squidex UG (haftungsbeschraenkt)
// All rights reserved. Licensed under the MIT license.
// ==========================================================================
using System.ComponentModel.DataAnnotations;
namespace Squidex.Areas.Api.Controllers.News.Models
{
public sealed class FeatureDto
{
/// <summary>
/// The name of the feature.
/// </summary>
[Required]
public string Name { get; set; }
/// <summary>
/// The description text.
/// </summary>
[Required]
public string Description { get; set; }
}
}

26
src/Squidex/Areas/Api/Controllers/News/Models/FeaturesDto.cs

@ -0,0 +1,26 @@
// ==========================================================================
// Squidex Headless CMS
// ==========================================================================
// Copyright (c) Squidex UG (haftungsbeschraenkt)
// All rights reserved. Licensed under the MIT license.
// ==========================================================================
using System.Collections.Generic;
using System.ComponentModel.DataAnnotations;
namespace Squidex.Areas.Api.Controllers.News.Models
{
public class FeaturesDto
{
/// <summary>
/// The latest features.
/// </summary>
[Required]
public List<FeatureDto> Features { get; set; }
/// <summary>
/// The recent version.
/// </summary>
public int Version { get; set; }
}
}

48
src/Squidex/Areas/Api/Controllers/News/NewsController.cs

@ -0,0 +1,48 @@
// ==========================================================================
// Squidex Headless CMS
// ==========================================================================
// Copyright (c) Squidex UG (haftungsbeschraenkt)
// All rights reserved. Licensed under the MIT license.
// ==========================================================================
using System.Threading.Tasks;
using Microsoft.AspNetCore.Mvc;
using Squidex.Areas.Api.Controllers.News.Models;
using Squidex.Areas.Api.Controllers.News.Service;
using Squidex.Infrastructure.Commands;
using Squidex.Pipeline;
namespace Squidex.Areas.Api.Controllers.News
{
/// <summary>
/// Readonly API for news items.
/// </summary>
[ApiExplorerSettings(GroupName = nameof(Languages))]
public sealed class NewsController : ApiController
{
private readonly FeaturesService featuresService = new FeaturesService();
public NewsController(ICommandBus commandBus)
: base(commandBus)
{
}
/// <summary>
/// Get all features since latest version.
/// </summary>
/// <param name="version">The latest received version.</param>
/// <returns>
/// 200 => Latest features returned.
/// </returns>
[HttpGet]
[Route("news/features/")]
[ProducesResponseType(typeof(FeaturesDto), 200)]
[ApiPermission]
public async Task<IActionResult> GetLanguages([FromQuery] int version = 0)
{
var features = await featuresService.GetFeaturesAsync(version);
return Ok(features);
}
}
}

50
src/Squidex/Areas/Api/Controllers/News/Service/FeaturesService.cs

@ -0,0 +1,50 @@
// ==========================================================================
// Squidex Headless CMS
// ==========================================================================
// Copyright (c) Squidex UG (haftungsbeschraenkt)
// All rights reserved. Licensed under the MIT license.
// ==========================================================================
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
using Squidex.Areas.Api.Controllers.News.Models;
using Squidex.ClientLibrary;
namespace Squidex.Areas.Api.Controllers.News.Service
{
public sealed class FeaturesService
{
private const string AppName = "squidex-website";
private const string ClientId = "squidex-website:default";
private const string ClientSecret = "QGgqxd7bDHBTEkpC6fj8sbdPWgZrPrPfr3xzb3LKoec=";
private const int FeatureVersion = 1;
private static readonly QueryContext Flatten = QueryContext.Default.Flatten();
private readonly SquidexClient<NewsEntity, FeatureDto> client;
public sealed class NewsEntity : SquidexEntityBase<FeatureDto>
{
}
public FeaturesService()
{
var clientManager = new SquidexClientManager("https://cloud.squidex.io", AppName, ClientId, ClientSecret);
client = clientManager.GetClient<NewsEntity, FeatureDto>("feature-news");
}
public async Task<FeaturesDto> GetFeaturesAsync(int version = 0)
{
var result = new FeaturesDto { Features = new List<FeatureDto>(), Version = FeatureVersion };
if (version < FeatureVersion)
{
var entities = await client.GetAsync(filter: $"data/version/iv ge ${version}", context: Flatten);
result.Features.AddRange(entities.Items.Select(x => x.Data));
}
return result;
}
}
}

15
src/Squidex/app/features/administration/services/event-consumers.service.ts

@ -12,7 +12,6 @@ import { map } from 'rxjs/operators';
import { import {
ApiUrlConfig, ApiUrlConfig,
HTTP,
Model, Model,
pretifyError pretifyError
} from '@app/shared'; } from '@app/shared';
@ -44,13 +43,9 @@ export class EventConsumersService {
public getEventConsumers(): Observable<EventConsumerDto[]> { public getEventConsumers(): Observable<EventConsumerDto[]> {
const url = this.apiUrl.buildUrl('/api/event-consumers'); const url = this.apiUrl.buildUrl('/api/event-consumers');
return HTTP.getVersioned<any>(this.http, url).pipe( return this.http.get<any[]>(url).pipe(
map(response => { map(response => {
const body = response.payload.body; return response.map(item => {
const items: any[] = body;
return items.map(item => {
return new EventConsumerDto( return new EventConsumerDto(
item.name, item.name,
item.isStopped, item.isStopped,
@ -65,21 +60,21 @@ export class EventConsumersService {
public putStart(name: string): Observable<any> { public putStart(name: string): Observable<any> {
const url = this.apiUrl.buildUrl(`api/event-consumers/${name}/start`); const url = this.apiUrl.buildUrl(`api/event-consumers/${name}/start`);
return HTTP.putVersioned(this.http, url, {}).pipe( return this.http.put(url, {}).pipe(
pretifyError('Failed to start event consumer. Please reload.')); pretifyError('Failed to start event consumer. Please reload.'));
} }
public putStop(name: string): Observable<any> { public putStop(name: string): Observable<any> {
const url = this.apiUrl.buildUrl(`api/event-consumers/${name}/stop`); const url = this.apiUrl.buildUrl(`api/event-consumers/${name}/stop`);
return HTTP.putVersioned(this.http, url, {}).pipe( return this.http.put(url, {}).pipe(
pretifyError('Failed to stop event consumer. Please reload.')); pretifyError('Failed to stop event consumer. Please reload.'));
} }
public putReset(name: string): Observable<any> { public putReset(name: string): Observable<any> {
const url = this.apiUrl.buildUrl(`api/event-consumers/${name}/reset`); const url = this.apiUrl.buildUrl(`api/event-consumers/${name}/reset`);
return HTTP.putVersioned(this.http, url, {}).pipe( return this.http.put(url, {}).pipe(
pretifyError('Failed to reset event consumer. Please reload.')); pretifyError('Failed to reset event consumer. Please reload.'));
} }
} }

37
src/Squidex/app/features/administration/services/users.service.ts

@ -12,7 +12,6 @@ import { map } from 'rxjs/operators';
import { import {
ApiUrlConfig, ApiUrlConfig,
HTTP,
Model, Model,
pretifyError pretifyError
} from '@app/shared'; } from '@app/shared';
@ -73,13 +72,9 @@ export class UsersService {
public getUsers(take: number, skip: number, query?: string): Observable<UsersDto> { public getUsers(take: number, skip: number, query?: string): Observable<UsersDto> {
const url = this.apiUrl.buildUrl(`api/user-management?take=${take}&skip=${skip}&query=${query || ''}`); const url = this.apiUrl.buildUrl(`api/user-management?take=${take}&skip=${skip}&query=${query || ''}`);
return HTTP.getVersioned<any>(this.http, url).pipe( return this.http.get<{ total: number, items: any[] }>(url).pipe(
map(response => { map(response => {
const body = response.payload.body; const users = response.items.map(item => {
const items: any[] = body.items;
const users = items.map(item => {
return new UserDto( return new UserDto(
item.id, item.id,
item.email, item.email,
@ -88,7 +83,7 @@ export class UsersService {
item.isLocked); item.isLocked);
}); });
return new UsersDto(body.total, users); return new UsersDto(response.total, users);
}), }),
pretifyError('Failed to load users. Please reload.')); pretifyError('Failed to load users. Please reload.'));
} }
@ -96,16 +91,14 @@ export class UsersService {
public getUser(id: string): Observable<UserDto> { public getUser(id: string): Observable<UserDto> {
const url = this.apiUrl.buildUrl(`api/user-management/${id}`); const url = this.apiUrl.buildUrl(`api/user-management/${id}`);
return HTTP.getVersioned<any>(this.http, url).pipe( return this.http.get<any>(url).pipe(
map(response => { map(response => {
const body = response.payload.body;
return new UserDto( return new UserDto(
body.id, response.id,
body.email, response.email,
body.displayName, response.displayName,
body.permissions, response.permissions,
body.isLocked); response.isLocked);
}), }),
pretifyError('Failed to load user. Please reload.')); pretifyError('Failed to load user. Please reload.'));
} }
@ -113,12 +106,10 @@ export class UsersService {
public postUser(dto: CreateUserDto): Observable<UserDto> { public postUser(dto: CreateUserDto): Observable<UserDto> {
const url = this.apiUrl.buildUrl('api/user-management'); const url = this.apiUrl.buildUrl('api/user-management');
return HTTP.postVersioned<any>(this.http, url, dto).pipe( return this.http.post<any>(url, dto).pipe(
map(response => { map(response => {
const body = response.payload.body;
return new UserDto( return new UserDto(
body.id, response.id,
dto.email, dto.email,
dto.displayName, dto.displayName,
dto.permissions, dto.permissions,
@ -130,21 +121,21 @@ export class UsersService {
public putUser(id: string, dto: UpdateUserDto): Observable<any> { public putUser(id: string, dto: UpdateUserDto): Observable<any> {
const url = this.apiUrl.buildUrl(`api/user-management/${id}`); const url = this.apiUrl.buildUrl(`api/user-management/${id}`);
return HTTP.putVersioned(this.http, url, dto).pipe( return this.http.put(url, dto).pipe(
pretifyError('Failed to update user. Please reload.')); pretifyError('Failed to update user. Please reload.'));
} }
public lockUser(id: string): Observable<any> { public lockUser(id: string): Observable<any> {
const url = this.apiUrl.buildUrl(`api/user-management/${id}/lock`); const url = this.apiUrl.buildUrl(`api/user-management/${id}/lock`);
return HTTP.putVersioned(this.http, url, {}).pipe( return this.http.put(url, {}).pipe(
pretifyError('Failed to load users. Please retry.')); pretifyError('Failed to load users. Please retry.'));
} }
public unlockUser(id: string): Observable<any> { public unlockUser(id: string): Observable<any> {
const url = this.apiUrl.buildUrl(`api/user-management/${id}/unlock`); const url = this.apiUrl.buildUrl(`api/user-management/${id}/unlock`);
return HTTP.putVersioned(this.http, url, {}).pipe( return this.http.put(url, {}).pipe(
pretifyError('Failed to load users. Please retry.')); pretifyError('Failed to load users. Please retry.'));
} }
} }

1
src/Squidex/app/shared/internal.ts

@ -34,6 +34,7 @@ export * from './services/graphql.service';
export * from './services/help.service'; export * from './services/help.service';
export * from './services/history.service'; export * from './services/history.service';
export * from './services/languages.service'; export * from './services/languages.service';
export * from './services/news.service';
export * from './services/plans.service'; export * from './services/plans.service';
export * from './services/rules.service'; export * from './services/rules.service';
export * from './services/schemas.service'; export * from './services/schemas.service';

2
src/Squidex/app/shared/module.ts

@ -60,6 +60,7 @@ import {
MarkdownEditorComponent, MarkdownEditorComponent,
MustBeAuthenticatedGuard, MustBeAuthenticatedGuard,
MustBeNotAuthenticatedGuard, MustBeNotAuthenticatedGuard,
NewsService,
PatternsState, PatternsState,
PermissionDirective, PermissionDirective,
PlansService, PlansService,
@ -192,6 +193,7 @@ export class SqxSharedModule {
LoadLanguagesGuard, LoadLanguagesGuard,
MustBeAuthenticatedGuard, MustBeAuthenticatedGuard,
MustBeNotAuthenticatedGuard, MustBeNotAuthenticatedGuard,
NewsService,
PatternsState, PatternsState,
PlansService, PlansService,
PlansState, PlansState,

4
src/Squidex/app/shared/services/assets.service.ts

@ -128,8 +128,8 @@ export class AssetsService {
public getTags(appName: string): Observable<{ [name: string]: number }> { public getTags(appName: string): Observable<{ [name: string]: number }> {
const url = this.apiUrl.buildUrl(`api/apps/${appName}/assets/tags`); const url = this.apiUrl.buildUrl(`api/apps/${appName}/assets/tags`);
return this.http.get(url).pipe( return HTTP.getVersioned(this.http, url).pipe(
map(response => <any>response)); map(response => <any>response.payload.body));
} }
public getAssets(appName: string, take: number, skip: number, query?: string, tags?: string[], ids?: string[]): Observable<AssetsDto> { public getAssets(appName: string, take: number, skip: number, query?: string, tags?: string[], ids?: string[]): Observable<AssetsDto> {

20
src/Squidex/app/shared/services/backups.service.ts

@ -63,11 +63,9 @@ export class BackupsService {
public getBackups(appName: string): Observable<BackupDto[]> { public getBackups(appName: string): Observable<BackupDto[]> {
const url = this.apiUrl.buildUrl(`api/apps/${appName}/backups`); const url = this.apiUrl.buildUrl(`api/apps/${appName}/backups`);
return this.http.get(url).pipe( return this.http.get<any[]>(url).pipe(
map(response => { map(response => {
const items: any[] = <any>response; return response.map(item => {
return items.map(item => {
return new BackupDto( return new BackupDto(
item.id, item.id,
DateTime.parseISO_UTC(item.started), DateTime.parseISO_UTC(item.started),
@ -83,16 +81,14 @@ export class BackupsService {
public getRestore(): Observable<RestoreDto | null> { public getRestore(): Observable<RestoreDto | null> {
const url = this.apiUrl.buildUrl(`api/apps/restore`); const url = this.apiUrl.buildUrl(`api/apps/restore`);
return this.http.get(url).pipe( return this.http.get<any>(url).pipe(
map(response => { map(response => {
const body: any = response;
return new RestoreDto( return new RestoreDto(
body.url, response.url,
DateTime.parseISO_UTC(body.started), DateTime.parseISO_UTC(response.started),
body.stopped ? DateTime.parseISO_UTC(body.stopped) : null, response.stopped ? DateTime.parseISO_UTC(response.stopped) : null,
body.status, response.status,
body.log); response.log);
}), }),
catchError(error => { catchError(error => {
if (Types.is(error, HttpErrorResponse) && error.status === 404) { if (Types.is(error, HttpErrorResponse) && error.status === 404) {

7
src/Squidex/app/shared/services/comments.service.ts

@ -15,7 +15,8 @@ import {
DateTime, DateTime,
Model, Model,
pretifyError, pretifyError,
Version Version,
HTTP
} from '@app/framework'; } from '@app/framework';
export class CommentsDto extends Model { export class CommentsDto extends Model {
@ -62,9 +63,9 @@ export class CommentsService {
public getComments(appName: string, commentsId: string, version: Version): Observable<CommentsDto> { public getComments(appName: string, commentsId: string, version: Version): Observable<CommentsDto> {
const url = this.apiUrl.buildUrl(`api/apps/${appName}/comments/${commentsId}?version=${version.value}`); const url = this.apiUrl.buildUrl(`api/apps/${appName}/comments/${commentsId}?version=${version.value}`);
return this.http.get(url).pipe( return HTTP.getVersioned(this.http, url).pipe(
map(response => { map(response => {
const body: any = response; const body: any = response.payload.body;
return new CommentsDto( return new CommentsDto(
body.createdComments.map((item: any) => { body.createdComments.map((item: any) => {

7
src/Squidex/app/shared/services/help.service.ts

@ -8,7 +8,7 @@
import { HttpClient } from '@angular/common/http'; import { HttpClient } from '@angular/common/http';
import { Injectable } from '@angular/core'; import { Injectable } from '@angular/core';
import { Observable, of } from 'rxjs'; import { Observable, of } from 'rxjs';
import { catchError, map } from 'rxjs/operators'; import { catchError } from 'rxjs/operators';
@Injectable() @Injectable()
export class HelpService { export class HelpService {
@ -21,9 +21,6 @@ export class HelpService {
const url = `https://raw.githubusercontent.com/Squidex/squidex-docs/master/${helpPage}.md`; const url = `https://raw.githubusercontent.com/Squidex/squidex-docs/master/${helpPage}.md`;
return this.http.get(url, { responseType: 'text' }).pipe( return this.http.get(url, { responseType: 'text' }).pipe(
map((response: any) => { catchError(_ => of('')));
return <string>response;
}),
catchError(error => of('')));
} }
} }

9
src/Squidex/app/shared/services/history.service.ts

@ -15,7 +15,6 @@ import { UsersProviderService } from './users-provider.service';
import { import {
ApiUrlConfig, ApiUrlConfig,
DateTime, DateTime,
HTTP,
pretifyError pretifyError
} from '@app/framework'; } from '@app/framework';
@ -82,13 +81,9 @@ export class HistoryService {
public getHistory(appName: string, channel: string): Observable<HistoryEventDto[]> { public getHistory(appName: string, channel: string): Observable<HistoryEventDto[]> {
const url = this.apiUrl.buildUrl(`api/apps/${appName}/history?channel=${channel}`); const url = this.apiUrl.buildUrl(`api/apps/${appName}/history?channel=${channel}`);
return HTTP.getVersioned<any>(this.http, url).pipe( return this.http.get<any[]>(url).pipe(
map(response => { map(response => {
const body = response.payload.body; return response.map(item => {
const items: any[] = body;
return items.map(item => {
return new HistoryEventDto( return new HistoryEventDto(
item.eventId, item.eventId,
item.actor, item.actor,

6
src/Squidex/app/shared/services/languages.service.ts

@ -35,11 +35,9 @@ export class LanguagesService {
public getLanguages(): Observable<LanguageDto[]> { public getLanguages(): Observable<LanguageDto[]> {
const url = this.apiUrl.buildUrl('api/languages'); const url = this.apiUrl.buildUrl('api/languages');
return HTTP.getVersioned<any>(this.http, url).pipe( return HTTP.getVersioned(this.http, url).pipe(
map(response => { map(response => {
const body = response.payload.body; const items: any[] = <any>response.payload.body;
const items: any[] = body;
return items.map(item => { return items.map(item => {
return new LanguageDto( return new LanguageDto(

66
src/Squidex/app/shared/services/news.service.spec.ts

@ -0,0 +1,66 @@
/*
* Squidex Headless CMS
*
* @license
* Copyright (c) Squidex UG (haftungsbeschränkt). All rights reserved.
*/
import { HttpClientTestingModule, HttpTestingController } from '@angular/common/http/testing';
import { inject, TestBed } from '@angular/core/testing';
import {
ApiUrlConfig,
FeatureDto,
FeaturesDto,
NewsService
} from './../';
describe('NewsService', () => {
beforeEach(() => {
TestBed.configureTestingModule({
imports: [
HttpClientTestingModule
],
providers: [
NewsService,
{ provide: ApiUrlConfig, useValue: new ApiUrlConfig('http://service/p/') }
]
});
});
afterEach(inject([HttpTestingController], (httpMock: HttpTestingController) => {
httpMock.verify();
}));
it('should make get request to get features',
inject([NewsService, HttpTestingController], (newsService: NewsService, httpMock: HttpTestingController) => {
let features: FeaturesDto;
newsService.getFeatures().subscribe(result => {
features = result;
});
const req = httpMock.expectOne('http://service/p/api/news/features');
expect(req.request.method).toEqual('GET');
expect(req.request.headers.get('If-Match')).toBeNull();
req.flush({
version: 13,
features: [{
name: 'Feature1',
text: 'Feature Text1'
}, {
name: 'Feature2',
text: 'Feature Text2'
}]
});
expect(features!).toEqual(
new FeaturesDto([
new FeatureDto('Feature1', 'Feature Text1'),
new FeatureDto('Feature2', 'Feature Text2')
], 13));
}));
});

64
src/Squidex/app/shared/services/news.service.ts

@ -0,0 +1,64 @@
/*
* Squidex Headless CMS
*
* @license
* Copyright (c) Squidex UG (haftungsbeschränkt). All rights reserved.
*/
import { HttpClient } from '@angular/common/http';
import { Injectable } from '@angular/core';
import { Observable } from 'rxjs';
import { map } from 'rxjs/operators';
import {
ApiUrlConfig,
HTTP,
pretifyError
} from '@app/framework';
export class FeatureDto {
constructor(
public readonly name: string,
public readonly text: string
) {
}
}
export class FeaturesDto {
constructor(
public readonly features: FeatureDto[],
public readonly version: number
) {
}
}
@Injectable()
export class NewsService {
constructor(
private readonly http: HttpClient,
private readonly apiUrl: ApiUrlConfig
) {
}
public getFeatures(): Observable<FeaturesDto> {
const url = this.apiUrl.buildUrl('api/news/features');
return HTTP.getVersioned<any>(this.http, url).pipe(
map(response => {
const body = response.payload.body;
const items: any[] = body.features;
return new FeaturesDto(
items.map(item => {
return new FeatureDto(
item.name,
item.text
);
}),
body.version
);
}),
pretifyError('Failed to load features. Please reload.'));
}
}

29
src/Squidex/app/shared/services/usages.service.ts

@ -13,7 +13,6 @@ import { map } from 'rxjs/operators';
import { import {
ApiUrlConfig, ApiUrlConfig,
DateTime, DateTime,
HTTP,
pretifyError pretifyError
} from '@app/framework'; } from '@app/framework';
@ -72,11 +71,9 @@ export class UsagesService {
public getMonthCalls(app: string): Observable<CurrentCallsDto> { public getMonthCalls(app: string): Observable<CurrentCallsDto> {
const url = this.apiUrl.buildUrl(`api/apps/${app}/usages/calls/month`); const url = this.apiUrl.buildUrl(`api/apps/${app}/usages/calls/month`);
return HTTP.getVersioned<any>(this.http, url).pipe( return this.http.get<any>(url).pipe(
map(response => { map(response => {
const body = response.payload.body; return new CurrentCallsDto(response.count, response.maxAllowed);
return new CurrentCallsDto(body.count, body.maxAllowed);
}), }),
pretifyError('Failed to load monthly api calls. Please reload.')); pretifyError('Failed to load monthly api calls. Please reload.'));
} }
@ -84,11 +81,9 @@ export class UsagesService {
public getTodayStorage(app: string): Observable<CurrentStorageDto> { public getTodayStorage(app: string): Observable<CurrentStorageDto> {
const url = this.apiUrl.buildUrl(`api/apps/${app}/usages/storage/today`); const url = this.apiUrl.buildUrl(`api/apps/${app}/usages/storage/today`);
return HTTP.getVersioned<any>(this.http, url).pipe( return this.http.get<any>(url).pipe(
map(response => { map(response => {
const body = response.payload.body; return new CurrentStorageDto(response.size, response.maxAllowed);
return new CurrentStorageDto(body.size, body.maxAllowed);
}), }),
pretifyError('Failed to load todays storage size. Please reload.')); pretifyError('Failed to load todays storage size. Please reload.'));
} }
@ -96,14 +91,12 @@ export class UsagesService {
public getCallsUsages(app: string, fromDate: DateTime, toDate: DateTime): Observable<{ [category: string]: CallsUsageDto[] }> { public getCallsUsages(app: string, fromDate: DateTime, toDate: DateTime): Observable<{ [category: string]: CallsUsageDto[] }> {
const url = this.apiUrl.buildUrl(`api/apps/${app}/usages/calls/${fromDate.toUTCStringFormat('YYYY-MM-DD')}/${toDate.toUTCStringFormat('YYYY-MM-DD')}`); const url = this.apiUrl.buildUrl(`api/apps/${app}/usages/calls/${fromDate.toUTCStringFormat('YYYY-MM-DD')}/${toDate.toUTCStringFormat('YYYY-MM-DD')}`);
return HTTP.getVersioned<any>(this.http, url).pipe( return this.http.get<any>(url).pipe(
map(response => { map(response => {
const body = response.payload.body;
const result: { [category: string]: CallsUsageDto[] } = {}; const result: { [category: string]: CallsUsageDto[] } = {};
for (let category of Object.keys(body)) { for (let category of Object.keys(response)) {
result[category] = body[category].map((item: any) => { result[category] = response[category].map((item: any) => {
return new CallsUsageDto( return new CallsUsageDto(
DateTime.parseISO_UTC(item.date), DateTime.parseISO_UTC(item.date),
item.count, item.count,
@ -118,13 +111,9 @@ export class UsagesService {
public getStorageUsages(app: string, fromDate: DateTime, toDate: DateTime): Observable<StorageUsageDto[]> { public getStorageUsages(app: string, fromDate: DateTime, toDate: DateTime): Observable<StorageUsageDto[]> {
const url = this.apiUrl.buildUrl(`api/apps/${app}/usages/storage/${fromDate.toUTCStringFormat('YYYY-MM-DD')}/${toDate.toUTCStringFormat('YYYY-MM-DD')}`); const url = this.apiUrl.buildUrl(`api/apps/${app}/usages/storage/${fromDate.toUTCStringFormat('YYYY-MM-DD')}/${toDate.toUTCStringFormat('YYYY-MM-DD')}`);
return HTTP.getVersioned<any>(this.http, url).pipe( return this.http.get<any[]>(url).pipe(
map(response => { map(response => {
const body = response.payload.body; return response.map(item => {
const items: any[] = body;
return items.map(item => {
return new StorageUsageDto( return new StorageUsageDto(
DateTime.parseISO_UTC(item.date), DateTime.parseISO_UTC(item.date),
item.count, item.count,

22
src/Squidex/app/shared/services/users.service.ts

@ -10,11 +10,7 @@ import { Injectable } from '@angular/core';
import { Observable } from 'rxjs'; import { Observable } from 'rxjs';
import { map } from 'rxjs/operators'; import { map } from 'rxjs/operators';
import { import { ApiUrlConfig, pretifyError } from '@app/framework';
ApiUrlConfig,
HTTP,
pretifyError
} from '@app/framework';
export class UserDto { export class UserDto {
constructor( constructor(
@ -35,13 +31,9 @@ export class UsersService {
public getUsers(query?: string): Observable<UserDto[]> { public getUsers(query?: string): Observable<UserDto[]> {
const url = this.apiUrl.buildUrl(`api/users?query=${query || ''}`); const url = this.apiUrl.buildUrl(`api/users?query=${query || ''}`);
return HTTP.getVersioned<any>(this.http, url).pipe( return this.http.get<any[]>(url).pipe(
map(response => { map(response => {
const body = response.payload.body; return response.map(item => {
const items: any[] = body;
return items.map(item => {
return new UserDto( return new UserDto(
item.id, item.id,
item.displayName); item.displayName);
@ -53,13 +45,11 @@ export class UsersService {
public getUser(id: string): Observable<UserDto> { public getUser(id: string): Observable<UserDto> {
const url = this.apiUrl.buildUrl(`api/users/${id}`); const url = this.apiUrl.buildUrl(`api/users/${id}`);
return HTTP.getVersioned<any>(this.http, url).pipe( return this.http.get<any>(url).pipe(
map(response => { map(response => {
const body = response.payload.body;
return new UserDto( return new UserDto(
body.id, response.id,
body.displayName); response.displayName);
}), }),
pretifyError('Failed to load user. Please reload.')); pretifyError('Failed to load user. Please reload.'));
} }

Loading…
Cancel
Save