Как преобразовать данные из MongoDB, чтобы вписаться в ngrx entityCache? - PullRequest
0 голосов
/ 26 октября 2019

Как мне перейти к преобразованию данных из MongoDB, чтобы они соответствовали объекту DataCache данных ngrx? Сейчас данные есть, но форматирование отключено, поскольку объекты, вложенные в свойство entity, не определены.

group-data.service:

import { Injectable } from '@angular/core';
import { DefaultDataService, HttpUrlGenerator, QueryParams } from '@ngrx/data';
import { Group } from 'src/app/models/group.model';
import { HttpClient } from '@angular/common/http';
import { Observable } from 'rxjs';
import { map, tap } from 'rxjs/operators';

interface GroupData {
    count: number;
    groups: Group[];
}

@Injectable()
export class GroupDataService extends DefaultDataService<Group> {
    constructor(http: HttpClient, httpUrl: HttpUrlGenerator) {
        super('Group', http, httpUrl);
    }
    getWithQuery(params: QueryParams): Observable<any> {
        return this.http.get<GroupData>('http://localhost:3000/api/groups?' + params)
            .pipe(
                tap(data => console.log(data)),
                map(data => data.groups)
            );
    }
}

преобразователь:

import { Injectable } from '@angular/core';
import { Resolve, ActivatedRouteSnapshot, RouterStateSnapshot } from '@angular/router';
import { Observable, of } from 'rxjs';
import { tap, filter, first, map } from 'rxjs/operators';
import { GroupEntityService } from './group-entity.service';


@Injectable()
export class GroupResolver implements Resolve<boolean> {

    constructor(private groupService: GroupEntityService) { }

    resolve(route: ActivatedRouteSnapshot, state: RouterStateSnapshot): Observable<boolean> {
        const topic = route.queryParams.topic;
        return this.groupService.loaded$
            .pipe(
                tap(loaded => {
                    if (!loaded) {
                        this.groupService.getWithQuery(`topic=${topic.toLowerCase()}&PageSize=2&currentPage=1`);
                    }
                }),
                filter(loaded => !!loaded),
                first()
            );
    }
}


group-entity.service:

import { Injectable } from '@angular/core';
import { EntityCollectionServiceBase, EntityCollectionServiceElementsFactory } from '@ngrx/data';
import { Group } from 'src/app/models/group.model';


@Injectable()
export class GroupEntityService extends EntityCollectionServiceBase<Group> {
    constructor(serviceElFac: EntityCollectionServiceElementsFactory) {
        super('Group', serviceElFac);
    }
}

1 Ответ

0 голосов
/ 29 октября 2019

Так что, как выясняется, нет необходимости настраивать редуктор для рассматриваемого объекта. Мне просто нужно было переписать свойство _id с id вместо этого в data.service, где я настроил метод getWithQuery, а также слегка переформатировать данные.

import { Injectable } from '@angular/core';
import { DefaultDataService, HttpUrlGenerator, QueryParams } from '@ngrx/data';
import { Group } from 'src/app/models/group.model';
import { HttpClient } from '@angular/common/http';
import { Observable } from 'rxjs';
import { map, tap } from 'rxjs/operators';


@Injectable()
export class GroupDataService extends DefaultDataService<Group> {
    constructor(http: HttpClient, httpUrl: HttpUrlGenerator) {
        super('Group', http, httpUrl);
    }
    getWithQuery(params: QueryParams): Observable<any> {
        return this.http.get<Group[]>('http://localhost:3000/api/groups?' + params)
            .pipe(
                map(data => {
                    const obj = {};
                    data.map(g => {
                        obj[g._id] = {
                            id: g._id,
                            name: g.name,
                            swearingAllowed: g.swearingAllowed,
                            creator: g.admin,
                            topic: g.topic
                        }
                    });
                    return Object.values(obj);
                })
            );
    }
};
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...