diff --git a/src/app/core/cache/builders/bitstream-builder.ts b/src/app/core/cache/builders/bitstream-builder.ts new file mode 100644 index 0000000000..ce862d2ef2 --- /dev/null +++ b/src/app/core/cache/builders/bitstream-builder.ts @@ -0,0 +1,21 @@ +import { Bitstream } from "../../shared/bitstream.model"; +import { RequestService } from "../../data/request.service"; +import { hasValue } from "../../../shared/empty.util"; +import { NormalizedBitstream } from "../models/normalized-bitstream.model"; +import { RemoteDataBuildService } from "./remote-data-build.service"; +import { DomainModelBuilder } from "./domain-model-builder"; + +export class BitstreamBuilder extends DomainModelBuilder { + constructor( + private requestService: RequestService, + private rdbService: RemoteDataBuildService, + ) { + super(); + } + + build(): Bitstream { + let links: any = {}; + //TODO + return Object.assign(new Bitstream(), this.normalized, links); + } +} diff --git a/src/app/core/cache/builders/bundle-builder.ts b/src/app/core/cache/builders/bundle-builder.ts new file mode 100644 index 0000000000..1639163d4f --- /dev/null +++ b/src/app/core/cache/builders/bundle-builder.ts @@ -0,0 +1,34 @@ +import { Bundle } from "../../shared/bundle.model"; +import { RequestService } from "../../data/request.service"; +import { NormalizedBundle } from "../models/normalized-bundle.model"; +import { hasValue } from "../../../shared/empty.util"; +import { NormalizedBitstream } from "../models/normalized-bitstream.model"; +import { RemoteDataBuildService } from "./remote-data-build.service"; +import { DomainModelBuilder } from "./domain-model-builder"; +import { BitstreamBuilder } from "./bitstream-builder"; + +export class BundleBuilder extends DomainModelBuilder { + constructor( + private requestService: RequestService, + private rdbService: RemoteDataBuildService, + ) { + super(); + } + + build(): Bundle { + let links: any = {}; + + if (hasValue(this.normalized.bitstreams)) { + this.normalized.bitstreams.forEach((href: string) => { + setTimeout(() => { + this.requestService.configure(href, NormalizedBitstream); + },0); + }); + + links.bitstreams = this.normalized.bitstreams.map((href: string) => { + return this.rdbService.buildSingle(href, NormalizedBitstream, new BitstreamBuilder(this.requestService, this.rdbService)); + }); + } + return Object.assign(new Bundle(), this.normalized, links); + } +} diff --git a/src/app/core/cache/builders/collection-builder.ts b/src/app/core/cache/builders/collection-builder.ts new file mode 100644 index 0000000000..b142136175 --- /dev/null +++ b/src/app/core/cache/builders/collection-builder.ts @@ -0,0 +1,34 @@ +import { Collection } from "../../shared/collection.model"; +import { RequestService } from "../../data/request.service"; +import { NormalizedCollection } from "../models/normalized-collection.model"; +import { hasValue } from "../../../shared/empty.util"; +import { NormalizedItem } from "../models/normalized-item.model"; +import { RemoteDataBuildService } from "./remote-data-build.service"; +import { DomainModelBuilder } from "./domain-model-builder"; +import { ItemBuilder } from "./item-builder"; + +export class CollectionBuilder extends DomainModelBuilder { + constructor( + private requestService: RequestService, + private rdbService: RemoteDataBuildService, + ) { + super(); + } + + build(): Collection { + let links: any = {}; + + if (hasValue(this.normalized.items)) { + this.normalized.items.forEach((href: string) => { + setTimeout(() => { + this.requestService.configure(href, NormalizedItem) + },0); + }); + + links.items = this.normalized.items.map((href: string) => { + return this.rdbService.buildSingle(href, NormalizedItem, new ItemBuilder(this.requestService, this.rdbService)); + }); + } + return Object.assign(new Collection(), this.normalized, links); + } +} diff --git a/src/app/core/cache/builders/domain-model-builder.ts b/src/app/core/cache/builders/domain-model-builder.ts new file mode 100644 index 0000000000..788ac2a24e --- /dev/null +++ b/src/app/core/cache/builders/domain-model-builder.ts @@ -0,0 +1,21 @@ +import { CacheableObject } from "../object-cache.reducer"; + +export abstract class DomainModelBuilder { + protected href: string; + protected normalized: TNormalized; + + constructor() { + } + + setHref(href: string): DomainModelBuilder { + this.href = href; + return this; + } + + setNormalized(normalized: TNormalized): DomainModelBuilder { + this.normalized = normalized; + return this; + } + + abstract build(): TDomain; +} diff --git a/src/app/core/cache/builders/item-builder.ts b/src/app/core/cache/builders/item-builder.ts new file mode 100644 index 0000000000..d8778a0229 --- /dev/null +++ b/src/app/core/cache/builders/item-builder.ts @@ -0,0 +1,34 @@ +import { Item } from "../../shared/item.model"; +import { RequestService } from "../../data/request.service"; +import { NormalizedItem } from "../models/normalized-item.model"; +import { hasValue } from "../../../shared/empty.util"; +import { NormalizedBundle } from "../models/normalized-bundle.model"; +import { RemoteDataBuildService } from "./remote-data-build.service"; +import { DomainModelBuilder } from "./domain-model-builder"; +import { BundleBuilder } from "./bundle-builder"; + +export class ItemBuilder extends DomainModelBuilder { + constructor( + private requestService: RequestService, + private rdbService: RemoteDataBuildService, + ) { + super(); + } + + build(): Item { + let links: any = {}; + + if (hasValue(this.normalized.bundles)) { + this.normalized.bundles.forEach((href: string) => { + setTimeout(() => { + this.requestService.configure(href, NormalizedBundle) + },0); + }); + + links.bundles = this.normalized.bundles.map((href: string) => { + return this.rdbService.buildSingle(href, NormalizedBundle, new BundleBuilder(this.requestService, this.rdbService)); + }); + } + return Object.assign(new Item(), this.normalized, links); + } +} diff --git a/src/app/core/cache/models/remote-data-builder.ts b/src/app/core/cache/builders/remote-data-build.service.ts similarity index 70% rename from src/app/core/cache/models/remote-data-builder.ts rename to src/app/core/cache/builders/remote-data-build.service.ts index 28ea91ac54..3bfa49c144 100644 --- a/src/app/core/cache/models/remote-data-builder.ts +++ b/src/app/core/cache/builders/remote-data-build.service.ts @@ -1,38 +1,36 @@ -import { RemoteData } from "../../data/remote-data"; -import { Observable } from "rxjs/Observable"; -import { RequestEntry } from "../../data/request.reducer"; -import { ResponseCacheEntry } from "../response-cache.reducer"; -import { ErrorResponse, SuccessResponse } from "../response-cache.models"; -import { Store } from "@ngrx/store"; -import { CoreState } from "../../core.reducers"; -import { ResponseCacheService } from "../response-cache.service"; +import { Injectable } from "@angular/core"; +import { GenericConstructor } from "../../shared/generic-constructor"; +import { CacheableObject } from "../object-cache.reducer"; import { ObjectCacheService } from "../object-cache.service"; import { RequestService } from "../../data/request.service"; -import { CacheableObject } from "../object-cache.reducer"; -import { GenericConstructor } from "../../shared/generic-constructor"; +import { ResponseCacheService } from "../response-cache.service"; +import { Store } from "@ngrx/store"; +import { CoreState } from "../../core.reducers"; +import { RequestEntry } from "../../data/request.reducer"; import { hasValue, isNotEmpty } from "../../../shared/empty.util"; +import { ResponseCacheEntry } from "../response-cache.reducer"; +import { ErrorResponse, SuccessResponse } from "../response-cache.models"; +import { Observable } from "rxjs/Observable"; +import { RemoteData } from "../../data/remote-data"; +import { DomainModelBuilder } from "./domain-model-builder"; -export interface RemoteDataBuilder { - build(): RemoteData -} - -export abstract class SingleRemoteDataBuilder implements RemoteDataBuilder { - +@Injectable() +export class RemoteDataBuildService { constructor( protected objectCache: ObjectCacheService, protected responseCache: ResponseCacheService, protected requestService: RequestService, protected store: Store, - protected href: string, - protected normalizedType: GenericConstructor ) { } - protected abstract normalizedToDomain(normalized: TNormalized): TDomain; - - build(): RemoteData { - const requestObs = this.store.select('core', 'data', 'request', this.href); - const responseCacheObs = this.responseCache.get(this.href); + buildSingle( + href: string, + normalizedType: GenericConstructor, + builder: DomainModelBuilder + ): RemoteData { + const requestObs = this.store.select('core', 'data', 'request', href); + const responseCacheObs = this.responseCache.get(href); const requestPending = requestObs.map((entry: RequestEntry) => hasValue(entry) && entry.requestPending).distinctUntilChanged(); @@ -48,23 +46,27 @@ export abstract class SingleRemoteDataBuilder(this.href, this.normalizedType), + this.objectCache.getBySelfLink(href, normalizedType), responseCacheObs .filter((entry: ResponseCacheEntry) => hasValue(entry) && entry.response.isSuccessful) .map((entry: ResponseCacheEntry) => ( entry.response).resourceUUIDs) .flatMap((resourceUUIDs: Array) => { if (isNotEmpty(resourceUUIDs)) { - return this.objectCache.get(resourceUUIDs[0], this.normalizedType); + return this.objectCache.get(resourceUUIDs[0], normalizedType); } else { return Observable.of(undefined); } }) .distinctUntilChanged() - ).map((normalized: TNormalized) => this.normalizedToDomain(normalized)); + ).map((normalized: TNormalized) => builder + .setHref(href) + .setNormalized(normalized) + .build() + ); return new RemoteData( - this.href, + href, requestPending, responsePending, isSuccessFul, @@ -73,25 +75,13 @@ export abstract class SingleRemoteDataBuilder implements RemoteDataBuilder { - - constructor( - protected objectCache: ObjectCacheService, - protected responseCache: ResponseCacheService, - protected requestService: RequestService, - protected store: Store, - protected href: string, - protected normalizedType: GenericConstructor - ) { - } - - protected abstract normalizedToDomain(normalized: TNormalized): TDomain; - - build(): RemoteData { - const requestObs = this.store.select('core', 'data', 'request', this.href); - const responseCacheObs = this.responseCache.get(this.href); + buildList( + href: string, + normalizedType: GenericConstructor, + builder: DomainModelBuilder + ): RemoteData { + const requestObs = this.store.select('core', 'data', 'request', href); + const responseCacheObs = this.responseCache.get(href); const requestPending = requestObs.map((entry: RequestEntry) => hasValue(entry) && entry.requestPending).distinctUntilChanged(); @@ -109,17 +99,20 @@ export abstract class ListRemoteDataBuilder hasValue(entry) && entry.response.isSuccessful) .map((entry: ResponseCacheEntry) => ( entry.response).resourceUUIDs) .flatMap((resourceUUIDs: Array) => { - return this.objectCache.getList(resourceUUIDs, this.normalizedType) + return this.objectCache.getList(resourceUUIDs, normalizedType) .map((normList: TNormalized[]) => { return normList.map((normalized: TNormalized) => { - return this.normalizedToDomain(normalized); + return builder + .setHref(href) + .setNormalized(normalized) + .build(); }); }); }) .distinctUntilChanged(); return new RemoteData( - this.href, + href, requestPending, responsePending, isSuccessFul, @@ -127,5 +120,4 @@ export abstract class ListRemoteDataBuilder, - protected href: string, - protected normalized: NormalizedBitstream - ) { - } - - build(): Bitstream { - let links: any = {}; - //TODO - return Object.assign(new Bitstream(), this.normalized, links); - } -} - -export class BitstreamRDBuilder extends SingleRemoteDataBuilder { - - constructor( - objectCache: ObjectCacheService, - responseCache: ResponseCacheService, - requestService: RequestService, - store: Store, - href: string - ) { - super(objectCache, responseCache, requestService, store, href, NormalizedBitstream); - } - - protected normalizedToDomain(normalized: NormalizedBitstream): Bitstream { - return new BitstreamBuilder(this.objectCache, this.responseCache, this.requestService, this.store, this.href, normalized).build(); - } - -} - -export class BitstreamListRDBuilder extends ListRemoteDataBuilder { - constructor( - objectCache: ObjectCacheService, - responseCache: ResponseCacheService, - requestService: RequestService, - store: Store, - href: string - ) { - super(objectCache, responseCache, requestService, store, href, NormalizedBitstream); - } - - protected normalizedToDomain(normalized: NormalizedBitstream): Bitstream { - return new BitstreamBuilder(this.objectCache, this.responseCache, this.requestService, this.store, this.href, normalized).build(); - } - -} diff --git a/src/app/core/cache/models/bundle-builder.ts b/src/app/core/cache/models/bundle-builder.ts deleted file mode 100644 index b360c28f58..0000000000 --- a/src/app/core/cache/models/bundle-builder.ts +++ /dev/null @@ -1,93 +0,0 @@ -import { Bundle } from "../../shared/bundle.model"; -import { ObjectCacheService } from "../object-cache.service"; -import { ResponseCacheService } from "../response-cache.service"; -import { RequestService } from "../../data/request.service"; -import { Store } from "@ngrx/store"; -import { CoreState } from "../../core.reducers"; -import { NormalizedBundle } from "./normalized-bundle.model"; -import { ListRemoteDataBuilder, SingleRemoteDataBuilder } from "./remote-data-builder"; -import { Request } from "../../data/request.models"; -import { hasValue } from "../../../shared/empty.util"; -import { RequestConfigureAction, RequestExecuteAction } from "../../data/request.actions"; -import { BitstreamRDBuilder } from "./bitstream-builder"; -import { NormalizedBitstream } from "./normalized-bitstream.model"; - -export class BundleBuilder { - - constructor( - protected objectCache: ObjectCacheService, - protected responseCache: ResponseCacheService, - protected requestService: RequestService, - protected store: Store, - protected href: string, - protected normalized: NormalizedBundle - ) { - } - - build(): Bundle { - let links: any = {}; - - if (hasValue(this.normalized.bitstreams)) { - //for some reason the dispatches in the forEach don't - //fire without this timeout. A zone issue? - setTimeout(() => { - this.normalized.bitstreams.forEach((href: string) => { - const isCached = this.objectCache.hasBySelfLink(href); - const isPending = this.requestService.isPending(href); - - if (!(isCached || isPending)) { - const request = new Request(href, NormalizedBitstream); - this.store.dispatch(new RequestConfigureAction(request)); - this.store.dispatch(new RequestExecuteAction(href)); - } - }); - }, 0); - - links.bitstreams = this.normalized.bitstreams.map((href: string) => { - return new BitstreamRDBuilder( - this.objectCache, - this.responseCache, - this.requestService, - this.store, - href - ).build(); - }); - } - return Object.assign(new Bundle(), this.normalized, links); - } -} - -export class BundleRDBuilder extends SingleRemoteDataBuilder { - - constructor( - objectCache: ObjectCacheService, - responseCache: ResponseCacheService, - requestService: RequestService, - store: Store, - href: string - ) { - super(objectCache, responseCache, requestService, store, href, NormalizedBundle); - } - - protected normalizedToDomain(normalized: NormalizedBundle): Bundle { - return new BundleBuilder(this.objectCache, this.responseCache, this.requestService, this.store, this.href, normalized).build(); - } - -} - -export class BundleListRDBuilder extends ListRemoteDataBuilder { - constructor( - objectCache: ObjectCacheService, - responseCache: ResponseCacheService, - requestService: RequestService, - store: Store, - href: string - ) { - super(objectCache, responseCache, requestService, store, href, NormalizedBundle); - } - - protected normalizedToDomain(normalized: NormalizedBundle): Bundle { - return new BundleBuilder(this.objectCache, this.responseCache, this.requestService, this.store, this.href, normalized).build(); - } - -} diff --git a/src/app/core/cache/models/collection-builder.ts b/src/app/core/cache/models/collection-builder.ts deleted file mode 100644 index 3291d10518..0000000000 --- a/src/app/core/cache/models/collection-builder.ts +++ /dev/null @@ -1,92 +0,0 @@ -import { Collection } from "../../shared/collection.model"; -import { hasValue } from "../../../shared/empty.util"; -import { Item } from "../../shared/item.model"; -import { RequestConfigureAction, RequestExecuteAction } from "../../data/request.actions"; -import { ObjectCacheService } from "../object-cache.service"; -import { ResponseCacheService } from "../response-cache.service"; -import { RequestService } from "../../data/request.service"; -import { Store } from "@ngrx/store"; -import { CoreState } from "../../core.reducers"; -import { NormalizedCollection } from "./normalized-collection.model"; -import { Request } from "../../data/request.models"; -import { ListRemoteDataBuilder, SingleRemoteDataBuilder } from "./remote-data-builder"; -import { ItemRDBuilder } from "./item-builder"; -import { NormalizedItem } from "./normalized-item.model"; - -export class CollectionBuilder { - - constructor( - protected objectCache: ObjectCacheService, - protected responseCache: ResponseCacheService, - protected requestService: RequestService, - protected store: Store, - protected href: string, - protected normalized: NormalizedCollection - ) { - } - - build(): Collection { - let links: any = {}; - - if (hasValue(this.normalized.items)) { - this.normalized.items.forEach((href: string) => { - const isCached = this.objectCache.hasBySelfLink(href); - const isPending = this.requestService.isPending(href); - - if (!(isCached || isPending)) { - const request = new Request(href, NormalizedItem); - this.store.dispatch(new RequestConfigureAction(request)); - this.store.dispatch(new RequestExecuteAction(href)); - } - }); - - links.items = this.normalized.items.map((href: string) => { - return new ItemRDBuilder( - this.objectCache, - this.responseCache, - this.requestService, - this.store, - href - ).build(); - }); - } - - return Object.assign(new Collection(), this.normalized, links); - } -} - -export class CollectionRDBuilder extends SingleRemoteDataBuilder { - - constructor( - objectCache: ObjectCacheService, - responseCache: ResponseCacheService, - requestService: RequestService, - store: Store, - href: string - ) { - super(objectCache, responseCache, requestService, store, href, NormalizedCollection); - } - - protected normalizedToDomain(normalized: NormalizedCollection): Collection { - return new CollectionBuilder(this.objectCache, this.responseCache, this.requestService, this.store, this.href, normalized).build(); - } - -} - -export class CollectionListRDBuilder extends ListRemoteDataBuilder { - - constructor( - objectCache: ObjectCacheService, - responseCache: ResponseCacheService, - requestService: RequestService, - store: Store, - href: string - ) { - super(objectCache, responseCache, requestService, store, href, NormalizedCollection); - } - - protected normalizedToDomain(normalized: NormalizedCollection): Collection { - return new CollectionBuilder(this.objectCache, this.responseCache, this.requestService, this.store, this.href, normalized).build(); - } - -} diff --git a/src/app/core/cache/models/item-builder.ts b/src/app/core/cache/models/item-builder.ts deleted file mode 100644 index 6935741e38..0000000000 --- a/src/app/core/cache/models/item-builder.ts +++ /dev/null @@ -1,89 +0,0 @@ -import { Item } from "../../shared/item.model"; -import { ObjectCacheService } from "../object-cache.service"; -import { ResponseCacheService } from "../response-cache.service"; -import { RequestService } from "../../data/request.service"; -import { Store } from "@ngrx/store"; -import { CoreState } from "../../core.reducers"; -import { NormalizedItem } from "./normalized-item.model"; -import { ListRemoteDataBuilder, SingleRemoteDataBuilder } from "./remote-data-builder"; -import { Request } from "../../data/request.models"; -import { hasValue } from "../../../shared/empty.util"; -import { RequestConfigureAction, RequestExecuteAction } from "../../data/request.actions"; -import { BundleRDBuilder } from "./bundle-builder"; -import { NormalizedBundle } from "./normalized-bundle.model"; - -export class ItemBuilder { - - constructor( - protected objectCache: ObjectCacheService, - protected responseCache: ResponseCacheService, - protected requestService: RequestService, - protected store: Store, - protected href: string, - protected normalized: NormalizedItem - ) { - } - - build(): Item { - let links: any = {}; - - if (hasValue(this.normalized.bundles)) { - this.normalized.bundles.forEach((href: string) => { - const isCached = this.objectCache.hasBySelfLink(href); - const isPending = this.requestService.isPending(href); - - if (!(isCached || isPending)) { - const request = new Request(href, NormalizedBundle); - this.store.dispatch(new RequestConfigureAction(request)); - this.store.dispatch(new RequestExecuteAction(href)); - } - }); - - links.bundles = this.normalized.bundles.map((href: string) => { - return new BundleRDBuilder( - this.objectCache, - this.responseCache, - this.requestService, - this.store, - href - ).build(); - }); - } - return Object.assign(new Item(), this.normalized, links); - } -} - -export class ItemRDBuilder extends SingleRemoteDataBuilder { - - constructor( - objectCache: ObjectCacheService, - responseCache: ResponseCacheService, - requestService: RequestService, - store: Store, - href: string - ) { - super(objectCache, responseCache, requestService, store, href, NormalizedItem); - } - - protected normalizedToDomain(normalized: NormalizedItem): Item { - return new ItemBuilder(this.objectCache, this.responseCache, this.requestService, this.store, this.href, normalized).build(); - } - -} - -export class ItemListRDBuilder extends ListRemoteDataBuilder { - constructor( - objectCache: ObjectCacheService, - responseCache: ResponseCacheService, - requestService: RequestService, - store: Store, - href: string - ) { - super(objectCache, responseCache, requestService, store, href, NormalizedItem); - } - - protected normalizedToDomain(normalized: NormalizedItem): Item { - return new ItemBuilder(this.objectCache, this.responseCache, this.requestService, this.store, this.href, normalized).build(); - } - -} diff --git a/src/app/core/core.module.ts b/src/app/core/core.module.ts index 827cf9deb7..82e38bcb10 100644 --- a/src/app/core/core.module.ts +++ b/src/app/core/core.module.ts @@ -9,6 +9,7 @@ import { ResponseCacheService } from "./cache/response-cache.service"; import { CollectionDataService } from "./data/collection-data.service"; import { ItemDataService } from "./data/item-data.service"; import { RequestService } from "./data/request.service"; +import { RemoteDataBuildService } from "./cache/builders/remote-data-build.service"; const IMPORTS = [ CommonModule, @@ -29,7 +30,8 @@ const PROVIDERS = [ DSpaceRESTv2Service, ObjectCacheService, ResponseCacheService, - RequestService + RequestService, + RemoteDataBuildService ]; @NgModule({ diff --git a/src/app/core/data/collection-data.service.ts b/src/app/core/data/collection-data.service.ts index 4abffa909c..882f7db5a5 100644 --- a/src/app/core/data/collection-data.service.ts +++ b/src/app/core/data/collection-data.service.ts @@ -7,39 +7,25 @@ import { Store } from "@ngrx/store"; import { NormalizedCollection } from "../cache/models/normalized-collection.model"; import { CoreState } from "../core.reducers"; import { RequestService } from "./request.service"; -import { CollectionListRDBuilder, CollectionRDBuilder } from "../cache/models/collection-builder"; +import { RemoteDataBuildService } from "../cache/builders/remote-data-build.service"; +import { DomainModelBuilder } from "../cache/builders/domain-model-builder"; +import { CollectionBuilder } from "../cache/builders/collection-builder"; @Injectable() -export class CollectionDataService extends DataService { +export class CollectionDataService extends DataService { protected endpoint = '/collections'; constructor( protected objectCache: ObjectCacheService, protected responseCache: ResponseCacheService, protected requestService: RequestService, + protected rdbService: RemoteDataBuildService, protected store: Store ) { super(NormalizedCollection); } - protected getListDataBuilder(href: string): CollectionListRDBuilder { - return new CollectionListRDBuilder ( - this.objectCache, - this.responseCache, - this.requestService, - this.store, - href, - ); + protected getDomainModelBuilder(): CollectionBuilder { + return new CollectionBuilder(this.requestService, this.rdbService); } - - protected getSingleDataBuilder(href: string): CollectionRDBuilder { - return new CollectionRDBuilder ( - this.objectCache, - this.responseCache, - this.requestService, - this.store, - href, - ); - } - } diff --git a/src/app/core/data/data.service.ts b/src/app/core/data/data.service.ts index bcbd5fd599..5547bf8ebb 100644 --- a/src/app/core/data/data.service.ts +++ b/src/app/core/data/data.service.ts @@ -8,22 +8,23 @@ import { FindAllRequest, FindByIDRequest, Request } from "./request.models"; import { Store } from "@ngrx/store"; import { RequestConfigureAction, RequestExecuteAction } from "./request.actions"; import { CoreState } from "../core.reducers"; -import { RemoteDataBuilder } from "../cache/models/remote-data-builder"; +import { DomainModelBuilder } from "../cache/builders/domain-model-builder"; import { RequestService } from "./request.service"; +import { RemoteDataBuildService } from "../cache/builders/remote-data-build.service"; -export abstract class DataService { +export abstract class DataService { protected abstract objectCache: ObjectCacheService; protected abstract responseCache: ResponseCacheService; protected abstract requestService: RequestService; + protected abstract rdbService: RemoteDataBuildService; protected abstract store: Store; protected abstract endpoint: string; - constructor(private normalizedResourceType: GenericConstructor) { + constructor(private normalizedResourceType: GenericConstructor) { } - protected abstract getListDataBuilder(href: string): RemoteDataBuilder; - protected abstract getSingleDataBuilder(href: string): RemoteDataBuilder; + protected abstract getDomainModelBuilder(): DomainModelBuilder; protected getFindAllHref(scopeID?): string { let result = this.endpoint; @@ -33,37 +34,37 @@ export abstract class DataService { return result; } - findAll(scopeID?: string): RemoteData> { + findAll(scopeID?: string): RemoteData> { const href = this.getFindAllHref(scopeID); if (!this.responseCache.has(href) && !this.requestService.isPending(href)) { const request = new FindAllRequest(href, this.normalizedResourceType, scopeID); this.store.dispatch(new RequestConfigureAction(request)); this.store.dispatch(new RequestExecuteAction(href)); } - return this.getListDataBuilder(href).build(); + return this.rdbService.buildList(href, this.normalizedResourceType, this.getDomainModelBuilder()) } protected getFindByIDHref(resourceID): string { return `${this.endpoint}/${resourceID}`; } - findById(id: string): RemoteData { + findById(id: string): RemoteData { const href = this.getFindByIDHref(id); if (!this.objectCache.hasBySelfLink(href) && !this.requestService.isPending(href)) { const request = new FindByIDRequest(href, this.normalizedResourceType, id); this.store.dispatch(new RequestConfigureAction(request)); this.store.dispatch(new RequestExecuteAction(href)); } - return this.getSingleDataBuilder(href).build(); + return this.rdbService.buildSingle(href, this.normalizedResourceType, this.getDomainModelBuilder()) } - findByHref(href: string): RemoteData { + findByHref(href: string): RemoteData { if (!this.objectCache.hasBySelfLink(href) && !this.requestService.isPending(href)) { const request = new Request(href, this.normalizedResourceType); this.store.dispatch(new RequestConfigureAction(request)); this.store.dispatch(new RequestExecuteAction(href)); } - return this.getSingleDataBuilder(href).build(); + return this.rdbService.buildSingle(href, this.normalizedResourceType, this.getDomainModelBuilder()) } } diff --git a/src/app/core/data/item-data.service.ts b/src/app/core/data/item-data.service.ts index 777d75c53c..1e764f5bb4 100644 --- a/src/app/core/data/item-data.service.ts +++ b/src/app/core/data/item-data.service.ts @@ -7,38 +7,24 @@ import { Store } from "@ngrx/store"; import { CoreState } from "../core.reducers"; import { NormalizedItem } from "../cache/models/normalized-item.model"; import { RequestService } from "./request.service"; -import { ItemListRDBuilder, ItemRDBuilder } from "../cache/models/item-builder"; +import { RemoteDataBuildService } from "../cache/builders/remote-data-build.service"; +import { ItemBuilder } from "../cache/builders/item-builder"; @Injectable() -export class ItemDataService extends DataService { +export class ItemDataService extends DataService { protected endpoint = '/items'; constructor( protected objectCache: ObjectCacheService, protected responseCache: ResponseCacheService, protected requestService: RequestService, + protected rdbService: RemoteDataBuildService, protected store: Store ) { super(NormalizedItem); } - protected getListDataBuilder(href: string): ItemListRDBuilder { - return new ItemListRDBuilder( - this.objectCache, - this.responseCache, - this.requestService, - this.store, - href, - ); - } - - protected getSingleDataBuilder(href: string): ItemRDBuilder { - return new ItemRDBuilder( - this.objectCache, - this.responseCache, - this.requestService, - this.store, - href, - ); + protected getDomainModelBuilder(): ItemBuilder { + return new ItemBuilder(this.requestService, this.rdbService); } } diff --git a/src/app/core/data/request.service.ts b/src/app/core/data/request.service.ts index cd5b7b8a64..03b7f1ffd8 100644 --- a/src/app/core/data/request.service.ts +++ b/src/app/core/data/request.service.ts @@ -1,13 +1,23 @@ import { Injectable } from "@angular/core"; import { RequestEntry, RequestState } from "./request.reducer"; import { Store } from "@ngrx/store"; +import { Request } from "./request.models"; import { hasValue } from "../../shared/empty.util"; import { Observable } from "rxjs/Observable"; +import { RequestConfigureAction, RequestExecuteAction } from "./request.actions"; +import { GenericConstructor } from "../shared/generic-constructor"; +import { ResponseCacheService } from "../cache/response-cache.service"; +import { ObjectCacheService } from "../cache/object-cache.service"; +import { CacheableObject } from "../cache/object-cache.reducer"; @Injectable() export class RequestService { - constructor(private store: Store) { + constructor( + private objectCache: ObjectCacheService, + private responseCache: ResponseCacheService, + private store: Store + ) { } isPending(href: string): boolean { @@ -24,4 +34,15 @@ export class RequestService { get(href: string): Observable { return this.store.select('core', 'data', 'request', href); } + + configure(href: string, normalizedType: GenericConstructor): void { + const isCached = this.objectCache.hasBySelfLink(href); + const isPending = this.isPending(href); + + if (!(isCached || isPending)) { + const request = new Request(href, normalizedType); + this.store.dispatch(new RequestConfigureAction(request)); + this.store.dispatch(new RequestExecuteAction(href)); + } + } }