Extract all the content

This commit is contained in:
Pablo Martinez Garcia
2021-09-14 09:41:41 +02:00
parent d2910ab078
commit 970806fb20
28 changed files with 1363 additions and 682 deletions

View File

@@ -29,7 +29,9 @@ import {
DebugAppConfigService, DebugAppConfigService,
CoreModule, CoreModule,
CoreAutomationService, CoreAutomationService,
AuthBearerInterceptor AuthBearerInterceptor,
registerContentServiceProvider,
AcsContentService
} from '@alfresco/adf-core'; } from '@alfresco/adf-core';
import { ExtensionsModule } from '@alfresco/adf-extensions'; import { ExtensionsModule } from '@alfresco/adf-extensions';
import { AppComponent } from './app.component'; import { AppComponent } from './app.component';
@@ -236,7 +238,8 @@ registerLocaleData(localeSv);
useFactory: setupAppNotifications, useFactory: setupAppNotifications,
deps: [AppNotificationsService], deps: [AppNotificationsService],
multi: true multi: true
} },
registerContentServiceProvider(AcsContentService, true)
], ],
bootstrap: [AppComponent] bootstrap: [AppComponent]
}) })

View File

@@ -18,13 +18,13 @@
import { Component, Input, OnChanges, OnInit, ViewChild, OnDestroy } from '@angular/core'; import { Component, Input, OnChanges, OnInit, ViewChild, OnDestroy } from '@angular/core';
import { ProcessInstance, ProcessService , import { ProcessInstance, ProcessService ,
ProcessAttachmentListComponent, ProcessUploadService } from '@alfresco/adf-process-services'; ProcessAttachmentListComponent, ProcessUploadService } from '@alfresco/adf-process-services';
import { UploadService, AlfrescoApiService, AppConfigService, DiscoveryApiService } from '@alfresco/adf-core'; import { UploadService, AlfrescoApiService, AppConfigService, DiscoveryApiService, ContentService, AcsContentService } from '@alfresco/adf-core';
import { PreviewService } from '../../services/preview.service'; import { PreviewService } from '../../services/preview.service';
import { Subject } from 'rxjs'; import { Subject } from 'rxjs';
import { takeUntil } from 'rxjs/operators'; import { takeUntil } from 'rxjs/operators';
export function processUploadServiceFactory(api: AlfrescoApiService, config: AppConfigService, discoveryApiService: DiscoveryApiService) { export function processUploadServiceFactory(contentService: ContentService, api: AlfrescoApiService, config: AppConfigService, discoveryApiService: DiscoveryApiService) {
return new ProcessUploadService(api, config, discoveryApiService); return new ProcessUploadService(contentService, api, config, discoveryApiService);
} }
@Component({ @Component({
@@ -35,7 +35,7 @@ export function processUploadServiceFactory(api: AlfrescoApiService, config: App
{ {
provide: UploadService, provide: UploadService,
useFactory: (processUploadServiceFactory), useFactory: (processUploadServiceFactory),
deps: [AlfrescoApiService, AppConfigService, DiscoveryApiService] deps: [AcsContentService, AlfrescoApiService, AppConfigService, DiscoveryApiService]
} }
] ]
}) })

View File

@@ -22,13 +22,13 @@ import {
TaskUploadService, TaskUploadService,
TaskDetailsModel TaskDetailsModel
} from '@alfresco/adf-process-services'; } from '@alfresco/adf-process-services';
import { UploadService, AlfrescoApiService, AppConfigService, DiscoveryApiService } from '@alfresco/adf-core'; import { UploadService, AlfrescoApiService, AppConfigService, DiscoveryApiService, ContentService, AcsContentService } from '@alfresco/adf-core';
import { PreviewService } from '../../services/preview.service'; import { PreviewService } from '../../services/preview.service';
import { Subject } from 'rxjs'; import { Subject } from 'rxjs';
import { takeUntil } from 'rxjs/operators'; import { takeUntil } from 'rxjs/operators';
export function taskUploadServiceFactory(api: AlfrescoApiService, config: AppConfigService, discoveryApiService: DiscoveryApiService) { export function taskUploadServiceFactory(contentService: ContentService, api: AlfrescoApiService, config: AppConfigService, discoveryApiService: DiscoveryApiService) {
return new TaskUploadService(api, config, discoveryApiService); return new TaskUploadService(contentService, api, config, discoveryApiService);
} }
@Component({ @Component({
@@ -39,7 +39,7 @@ export function taskUploadServiceFactory(api: AlfrescoApiService, config: AppCon
{ {
provide: UploadService, provide: UploadService,
useFactory: (taskUploadServiceFactory), useFactory: (taskUploadServiceFactory),
deps: [AlfrescoApiService, AppConfigService, DiscoveryApiService] deps: [AcsContentService, AlfrescoApiService, AppConfigService, DiscoveryApiService]
} }
] ]
}) })

View File

@@ -17,11 +17,11 @@
import { Directive, Input, HostListener, OnChanges, NgZone, OnDestroy } from '@angular/core'; import { Directive, Input, HostListener, OnChanges, NgZone, OnDestroy } from '@angular/core';
import { MatDialog } from '@angular/material/dialog'; import { MatDialog } from '@angular/material/dialog';
import { NodeEntry, NodesApi } from '@alfresco/js-api'; import { NodeEntry } from '@alfresco/js-api';
import { ShareDialogComponent } from './content-node-share.dialog'; import { ShareDialogComponent } from './content-node-share.dialog';
import { Observable, from, Subject } from 'rxjs'; import { Observable, Subject } from 'rxjs';
import { AlfrescoApiService } from '@alfresco/adf-core'; import { ContentService } from '@alfresco/adf-core';
import { takeUntil } from 'rxjs/operators'; import { takeUntil } from 'rxjs/operators';
@Directive({ @Directive({
@@ -44,16 +44,10 @@ export class NodeSharedDirective implements OnChanges, OnDestroy {
private onDestroy$ = new Subject<boolean>(); private onDestroy$ = new Subject<boolean>();
_nodesApi: NodesApi;
get nodesApi(): NodesApi {
this._nodesApi = this._nodesApi ?? new NodesApi(this.alfrescoApiService.getInstance());
return this._nodesApi;
}
constructor( constructor(
private dialog: MatDialog, private dialog: MatDialog,
private zone: NgZone, private zone: NgZone,
private alfrescoApiService: AlfrescoApiService) { private contentService: ContentService) {
} }
ngOnDestroy() { ngOnDestroy() {
@@ -81,7 +75,7 @@ export class NodeSharedDirective implements OnChanges, OnDestroy {
include: ['allowableOperations'] include: ['allowableOperations']
}; };
return from(this.nodesApi.getNode(nodeId, options)); return this.contentService.getNode(nodeId, options);
} }
private openShareLinkDialog(node: NodeEntry) { private openShareLinkDialog(node: NodeEntry) {

View File

@@ -21,8 +21,8 @@ import { Component, Inject, OnInit, Optional, ViewEncapsulation } from '@angular
import { MAT_DIALOG_DATA, MatDialogRef } from '@angular/material/dialog'; import { MAT_DIALOG_DATA, MatDialogRef } from '@angular/material/dialog';
import { FormBuilder, FormGroup } from '@angular/forms'; import { FormBuilder, FormGroup } from '@angular/forms';
import { NodeBodyLock, Node, NodeEntry, NodesApi } from '@alfresco/js-api'; import { NodeBodyLock, Node, NodeEntry } from '@alfresco/js-api';
import { AlfrescoApiService } from '@alfresco/adf-core'; import { ContentService } from '@alfresco/adf-core';
@Component({ @Component({
selector: 'adf-node-lock', selector: 'adf-node-lock',
@@ -35,16 +35,10 @@ export class NodeLockDialogComponent implements OnInit {
node: Node = null; node: Node = null;
nodeName: string; nodeName: string;
_nodesApi: NodesApi;
get nodesApi(): NodesApi {
this._nodesApi = this._nodesApi ?? new NodesApi(this.alfrescoApi.getInstance());
return this._nodesApi;
}
constructor( constructor(
private formBuilder: FormBuilder, private formBuilder: FormBuilder,
public dialog: MatDialogRef<NodeLockDialogComponent>, public dialog: MatDialogRef<NodeLockDialogComponent>,
private alfrescoApi: AlfrescoApiService, private contentService: ContentService,
@Optional() @Optional()
@Inject(MAT_DIALOG_DATA) @Inject(MAT_DIALOG_DATA)
public data: any public data: any
@@ -84,10 +78,10 @@ export class NodeLockDialogComponent implements OnInit {
const { data: { node } } = this; const { data: { node } } = this;
if (this.form.value.isLocked) { if (this.form.value.isLocked) {
return this.nodesApi.lockNode(node.id, this.nodeBodyLock); return this.contentService.lockNode(node.id, this.nodeBodyLock);
} }
return this.nodesApi.unlockNode(node.id); return this.contentService.unlockNode(node.id);
} }
submit(): void { submit(): void {

View File

@@ -42,13 +42,12 @@ import {
CustomNoPermissionTemplateDirective, CustomNoPermissionTemplateDirective,
CustomEmptyContentTemplateDirective, CustomEmptyContentTemplateDirective,
RequestPaginationModel, RequestPaginationModel,
AlfrescoApiService,
UserPreferenceValues, UserPreferenceValues,
LockService, LockService,
DataRow DataRow
} from '@alfresco/adf-core'; } from '@alfresco/adf-core';
import { Node, NodeEntry, NodePaging, NodesApi, Pagination } from '@alfresco/js-api'; import { Node, NodeEntry, NodePaging, Pagination } from '@alfresco/js-api';
import { Subject, BehaviorSubject, of } from 'rxjs'; import { Subject, BehaviorSubject, of } from 'rxjs';
import { ShareDataRow } from './../data/share-data-row.model'; import { ShareDataRow } from './../data/share-data-row.model';
import { ShareDataTableAdapter } from './../data/share-datatable-adapter'; import { ShareDataTableAdapter } from './../data/share-datatable-adapter';
@@ -343,12 +342,6 @@ export class DocumentListComponent implements OnInit, OnChanges, OnDestroy, Afte
private loadingTimeout; private loadingTimeout;
private onDestroy$ = new Subject<boolean>(); private onDestroy$ = new Subject<boolean>();
_nodesApi: NodesApi;
get nodesApi(): NodesApi {
this._nodesApi = this._nodesApi ?? new NodesApi(this.alfrescoApiService.getInstance());
return this._nodesApi;
}
constructor(private documentListService: DocumentListService, constructor(private documentListService: DocumentListService,
private ngZone: NgZone, private ngZone: NgZone,
private elementRef: ElementRef, private elementRef: ElementRef,
@@ -356,7 +349,6 @@ export class DocumentListComponent implements OnInit, OnChanges, OnDestroy, Afte
private userPreferencesService: UserPreferencesService, private userPreferencesService: UserPreferencesService,
private contentService: ContentService, private contentService: ContentService,
private thumbnailService: ThumbnailService, private thumbnailService: ThumbnailService,
private alfrescoApiService: AlfrescoApiService,
private lockService: LockService) { private lockService: LockService) {
this.userPreferencesService this.userPreferencesService
.select(UserPreferenceValues.PaginationSize) .select(UserPreferenceValues.PaginationSize)
@@ -807,8 +799,8 @@ export class DocumentListComponent implements OnInit, OnChanges, OnDestroy, Afte
include: this.includeFields include: this.includeFields
}; };
this.nodesApi.getNode(nodeEntry.entry['guid'], options) this.contentService.getNode(nodeEntry.entry['guid'], options).subscribe(
.then((node: NodeEntry) => { (node: NodeEntry) => {
this.navigateTo(node.entry); this.navigateTo(node.entry);
}); });
} }

View File

@@ -15,75 +15,27 @@
* limitations under the License. * limitations under the License.
*/ */
import { AlfrescoApiService, LogService, PaginationModel } from '@alfresco/adf-core'; import { ContentService, LogService, PaginationModel } from '@alfresco/adf-core';
import { import {
NodePaging, NodePaging,
DeletedNodesPaging, DeletedNodesPaging,
SearchRequest,
SharedLinkPaging, SharedLinkPaging,
FavoritePaging, SiteMemberPaging
SiteMemberPaging,
SiteRolePaging,
PeopleApi,
SitesApi,
SearchApi,
FavoritesApi,
SharedlinksApi,
TrashcanApi,
NodesApi
} from '@alfresco/js-api'; } from '@alfresco/js-api';
import { Injectable } from '@angular/core'; import { Injectable } from '@angular/core';
import { Observable, from, of, throwError } from 'rxjs'; import { Observable, of, throwError } from 'rxjs';
import { catchError, map } from 'rxjs/operators'; import { catchError, map } from 'rxjs/operators';
@Injectable({ providedIn: 'root' }) @Injectable({ providedIn: 'root' })
export class CustomResourcesService { export class CustomResourcesService {
private CREATE_PERMISSION = 'create'; constructor(private contentService: ContentService, private logService: LogService) {
_peopleApi: PeopleApi;
get peopleApi(): PeopleApi {
this._peopleApi = this._peopleApi ?? new PeopleApi(this.apiService.getInstance());
return this._peopleApi;
} }
_sitesApi: SitesApi; private getAsNodePaging(nodes: { list?: any }): NodePaging {
get sitesApi(): SitesApi { const result = new NodePaging();
this._sitesApi = this._sitesApi ?? new SitesApi(this.apiService.getInstance()); result.list = nodes.list;
return this._sitesApi; return result;
}
_trashcanApi: TrashcanApi;
get trashcanApi(): TrashcanApi {
this._trashcanApi = this._trashcanApi ?? new TrashcanApi(this.apiService.getInstance());
return this._trashcanApi;
}
_searchApi: SearchApi;
get searchApi(): SearchApi {
this._searchApi = this._searchApi ?? new SearchApi(this.apiService.getInstance());
return this._searchApi;
}
_sharedLinksApi: SharedlinksApi;
get sharedLinksApi(): SharedlinksApi {
this._sharedLinksApi = this._sharedLinksApi ?? new SharedlinksApi(this.apiService.getInstance());
return this._sharedLinksApi;
}
_favoritesApi: FavoritesApi;
get favoritesApi(): FavoritesApi {
this._favoritesApi = this._favoritesApi ?? new FavoritesApi(this.apiService.getInstance());
return this._favoritesApi;
}
_nodesApi: NodesApi;
get nodesApi(): NodesApi {
this._nodesApi = this._nodesApi ?? new NodesApi(this.apiService.getInstance());
return this._nodesApi;
}
constructor(private apiService: AlfrescoApiService, private logService: LogService) {
} }
/** /**
@@ -94,77 +46,7 @@ export class CustomResourcesService {
* @returns List of nodes for the recently used files * @returns List of nodes for the recently used files
*/ */
getRecentFiles(personId: string, pagination: PaginationModel, filters?: string[]): Observable<NodePaging> { getRecentFiles(personId: string, pagination: PaginationModel, filters?: string[]): Observable<NodePaging> {
const defaultFilter = [ return this.contentService.getRecentFiles(personId, pagination, filters).pipe(map(nodes => this.getAsNodePaging(nodes)), catchError((err) => this.handleError(err)));
'TYPE:"content"',
'-PNAME:"0/wiki"',
'-TYPE:"app:filelink"',
'-TYPE:"cm:thumbnail"',
'-TYPE:"cm:failedThumbnail"',
'-TYPE:"cm:rating"',
'-TYPE:"dl:dataList"',
'-TYPE:"dl:todoList"',
'-TYPE:"dl:issue"',
'-TYPE:"dl:contact"',
'-TYPE:"dl:eventAgenda"',
'-TYPE:"dl:event"',
'-TYPE:"dl:task"',
'-TYPE:"dl:simpletask"',
'-TYPE:"dl:meetingAgenda"',
'-TYPE:"dl:location"',
'-TYPE:"fm:topic"',
'-TYPE:"fm:post"',
'-TYPE:"ia:calendarEvent"',
'-TYPE:"lnk:link"'
];
return new Observable((observer) => {
this.peopleApi.getPerson(personId)
.then((person) => {
const username = person.entry.id;
const filterQueries = [
{ query: `cm:modified:[NOW/DAY-30DAYS TO NOW/DAY+1DAY]` },
{ query: `cm:modifier:${username} OR cm:creator:${username}` },
{ query: defaultFilter.join(' AND ') }
];
if (filters && filters.length > 0) {
filterQueries.push({
query: filters.join()
});
}
const query = new SearchRequest({
query: {
query: '*',
language: 'afts'
},
filterQueries,
include: ['path', 'properties', 'allowableOperations'],
sort: [{
type: 'FIELD',
field: 'cm:modified',
ascending: false
}],
paging: {
maxItems: pagination.maxItems,
skipCount: pagination.skipCount
}
});
return this.searchApi.search(query)
.then((searchResult) => {
observer.next(searchResult);
observer.complete();
},
(err) => {
observer.error(err);
observer.complete();
});
},
(err) => {
observer.error(err);
observer.complete();
});
}).pipe(catchError((err) => this.handleError(err)));
} }
/** /**
@@ -175,48 +57,7 @@ export class CustomResourcesService {
* @returns List of favorite files * @returns List of favorite files
*/ */
loadFavorites(pagination: PaginationModel, includeFields: string[] = [], where?: string): Observable<NodePaging> { loadFavorites(pagination: PaginationModel, includeFields: string[] = [], where?: string): Observable<NodePaging> {
const includeFieldsRequest = this.getIncludesFields(includeFields); return this.contentService.loadFavorites(pagination, includeFields, where).pipe(map(nodes => this.getAsNodePaging(nodes)), catchError((err) => this.handleError(err)));
const defaultPredicate = '(EXISTS(target/file) OR EXISTS(target/folder))';
const options = {
maxItems: pagination.maxItems,
skipCount: pagination.skipCount,
where: where ? `${where} AND ${defaultPredicate}` : defaultPredicate,
include: includeFieldsRequest
};
return new Observable((observer) => {
this.favoritesApi.listFavorites('-me-', options)
.then((result: FavoritePaging) => {
const page: FavoritePaging = {
list: {
entries: result.list.entries
.map(({ entry }: any) => {
const target = entry.target.file || entry.target.folder;
target.properties = {
...(target.properties || {
'cm:title': entry.title || target.title,
'cm:description': entry.description || target.description
}),
...(entry.properties || {})
};
return {
entry: target
};
}),
pagination: result.list.pagination
}
};
observer.next(page);
observer.complete();
},
(err) => {
observer.error(err);
observer.complete();
});
}).pipe(catchError((err) => this.handleError(err)));
} }
/** /**
@@ -226,38 +67,7 @@ export class CustomResourcesService {
* @returns List of sites * @returns List of sites
*/ */
loadMemberSites(pagination: PaginationModel, where?: string): Observable<SiteMemberPaging> { loadMemberSites(pagination: PaginationModel, where?: string): Observable<SiteMemberPaging> {
const options = { return this.contentService.loadMemberSites(pagination, where).pipe(catchError((err) => this.handleError(err)));
include: ['properties'],
maxItems: pagination.maxItems,
skipCount: pagination.skipCount,
where
};
return new Observable((observer) => {
this.sitesApi.listSiteMembershipsForPerson('-me-', options)
.then((result: SiteRolePaging) => {
const page: SiteMemberPaging = new SiteMemberPaging({
list: {
entries: result.list.entries
.map(({ entry: { site } }: any) => {
site.allowableOperations = site.allowableOperations ? site.allowableOperations : [this.CREATE_PERMISSION];
site.name = site.name || site.title;
return {
entry: site
};
}),
pagination: result.list.pagination
}
});
observer.next(page);
observer.complete();
},
(err) => {
observer.error(err);
observer.complete();
});
}).pipe(catchError((err) => this.handleError(err)));
} }
/** /**
@@ -267,32 +77,7 @@ export class CustomResourcesService {
* @returns List of sites * @returns List of sites
*/ */
loadSites(pagination: PaginationModel, where?: string): Observable<NodePaging> { loadSites(pagination: PaginationModel, where?: string): Observable<NodePaging> {
const options = { return this.contentService.loadSites(pagination, where).pipe(map(nodes => this.getAsNodePaging(nodes)), catchError((err) => this.handleError(err)));
include: ['properties', 'aspectNames'],
maxItems: pagination.maxItems,
skipCount: pagination.skipCount,
where
};
return new Observable((observer) => {
this.sitesApi
.listSites(options)
.then(
(page) => {
page.list.entries.map(
({ entry }: any) => {
entry.name = entry.name || entry.title;
return { entry };
}
);
observer.next(page);
observer.complete();
},
(err) => {
observer.error(err);
observer.complete();
});
}).pipe(catchError((err) => this.handleError(err)));
} }
/** /**
@@ -302,16 +87,7 @@ export class CustomResourcesService {
* @returns List of deleted items * @returns List of deleted items
*/ */
loadTrashcan(pagination: PaginationModel, includeFields: string[] = []): Observable<DeletedNodesPaging> { loadTrashcan(pagination: PaginationModel, includeFields: string[] = []): Observable<DeletedNodesPaging> {
const includeFieldsRequest = this.getIncludesFields(includeFields); return this.contentService.loadTrashcan(pagination, includeFields).pipe(catchError((err) => this.handleError(err)));
const options = {
include: includeFieldsRequest,
maxItems: pagination.maxItems,
skipCount: pagination.skipCount
};
return from(this.trashcanApi.listDeletedNodes(options))
.pipe(catchError((err) => this.handleError(err)));
} }
@@ -323,17 +99,7 @@ export class CustomResourcesService {
* @returns List of shared links * @returns List of shared links
*/ */
loadSharedLinks(pagination: PaginationModel, includeFields: string[] = [], where?: string): Observable<SharedLinkPaging> { loadSharedLinks(pagination: PaginationModel, includeFields: string[] = [], where?: string): Observable<SharedLinkPaging> {
const includeFieldsRequest = this.getIncludesFields(includeFields); return this.contentService.loadSharedLinks(pagination, includeFields, where).pipe(catchError((err) => this.handleError(err)));
const options = {
include: includeFieldsRequest,
maxItems: pagination.maxItems,
skipCount: pagination.skipCount,
where
};
return from(this.sharedLinksApi.listSharedLinks(options))
.pipe(catchError((err) => this.handleError(err)));
} }
/** /**
@@ -410,31 +176,12 @@ export class CustomResourcesService {
} else if (nodeId) { } else if (nodeId) {
// cases when nodeId is '-my-', '-root-' or '-shared-' // cases when nodeId is '-my-', '-root-' or '-shared-'
return from(this.nodesApi.getNode(nodeId) return this.contentService.getNode(nodeId).pipe(map((node) => [node.entry.id]));
.then((node) => [node.entry.id]));
} }
return of([]); return of([]);
} }
/**
* Chooses the correct ID for a node entry.
* @param node Node object
* @param nodeId ID of the node object
* @returns ID value
*/
getIdFromEntry(node: any, nodeId: string): string {
if (nodeId === '-sharedlinks-') {
return node.entry.nodeId;
} else if (nodeId === '-sites-' || nodeId === '-mysites-') {
return node.entry.guid;
} else if (nodeId === '-favorites-') {
return node.entry.targetGuid;
} else {
return node.entry.id;
}
}
/** /**
* Does the well-known alias have a corresponding node ID? * Does the well-known alias have a corresponding node ID?
* @param nodeId Node to check * @param nodeId Node to check
@@ -444,9 +191,16 @@ export class CustomResourcesService {
return this.isCustomSource(nodeId) || this.isSupportedSource(nodeId); return this.isCustomSource(nodeId) || this.isSupportedSource(nodeId);
} }
private getIncludesFields(includeFields: string[]): string[] { private getIdFromEntry(node: any, nodeId: string): string {
return ['path', 'properties', 'allowableOperations', 'permissions', 'aspectNames', ...includeFields] if (nodeId === '-sharedlinks-') {
.filter((element, index, array) => index === array.indexOf(element)); return node.entry.nodeId;
} else if (nodeId === '-sites-' || nodeId === '-mysites-') {
return node.entry.guid;
} else if (nodeId === '-favorites-') {
return node.entry.targetGuid;
} else {
return node.entry.id;
}
} }
private handleError(error: Response) { private handleError(error: Response) {

View File

@@ -16,11 +16,11 @@
*/ */
import { import {
AlfrescoApiService, ContentService, LogService, PaginationModel ContentService, LogService, PaginationModel
} from '@alfresco/adf-core'; } from '@alfresco/adf-core';
import { Injectable } from '@angular/core'; import { Injectable } from '@angular/core';
import { NodeEntry, NodePaging, NodesApi } from '@alfresco/js-api'; import { NodeEntry, NodePaging } from '@alfresco/js-api';
import { DocumentLoaderNode } from '../models/document-folder.model'; import { DocumentLoaderNode } from '../models/document-folder.model';
import { Observable, from, throwError, forkJoin } from 'rxjs'; import { Observable, from, throwError, forkJoin } from 'rxjs';
import { catchError, map } from 'rxjs/operators'; import { catchError, map } from 'rxjs/operators';
@@ -34,14 +34,7 @@ export class DocumentListService implements DocumentListLoader {
static ROOT_ID = '-root-'; static ROOT_ID = '-root-';
_nodesApi: NodesApi;
get nodes(): NodesApi {
this._nodesApi = this._nodesApi ?? new NodesApi(this.apiService.getInstance());
return this._nodesApi;
}
constructor(private contentService: ContentService, constructor(private contentService: ContentService,
private apiService: AlfrescoApiService,
private logService: LogService, private logService: LogService,
private customResourcesService: CustomResourcesService) { private customResourcesService: CustomResourcesService) {
} }
@@ -52,7 +45,7 @@ export class DocumentListService implements DocumentListLoader {
* @returns Empty response when the operation is complete * @returns Empty response when the operation is complete
*/ */
deleteNode(nodeId: string): Observable<any> { deleteNode(nodeId: string): Observable<any> {
return from(this.nodes.deleteNode(nodeId)); return from(this.contentService.deleteNode(nodeId));
} }
/** /**
@@ -63,7 +56,7 @@ export class DocumentListService implements DocumentListLoader {
* @returns NodeEntry for the copied node * @returns NodeEntry for the copied node
*/ */
copyNode(nodeId: string, targetParentId: string): Observable<NodeEntry> { copyNode(nodeId: string, targetParentId: string): Observable<NodeEntry> {
return from(this.nodes.copyNode(nodeId, { targetParentId })).pipe( return from(this.contentService.copyNode(nodeId, { targetParentId })).pipe(
catchError((err) => this.handleError(err)) catchError((err) => this.handleError(err))
); );
} }
@@ -76,7 +69,7 @@ export class DocumentListService implements DocumentListLoader {
* @returns NodeEntry for the moved node * @returns NodeEntry for the moved node
*/ */
moveNode(nodeId: string, targetParentId: string): Observable<NodeEntry> { moveNode(nodeId: string, targetParentId: string): Observable<NodeEntry> {
return from(this.nodes.moveNode(nodeId, { targetParentId })).pipe( return from(this.contentService.moveNode(nodeId, { targetParentId })).pipe(
catchError((err) => this.handleError(err)) catchError((err) => this.handleError(err))
); );
} }
@@ -121,7 +114,7 @@ export class DocumentListService implements DocumentListLoader {
} }
} }
return from(this.nodes.listNodeChildren(rootNodeId, params)).pipe( return from(this.contentService.listNodeChildren(rootNodeId, params)).pipe(
catchError((err) => this.handleError(err)) catchError((err) => this.handleError(err))
); );
} }
@@ -159,7 +152,7 @@ export class DocumentListService implements DocumentListLoader {
include: includeFieldsRequest include: includeFieldsRequest
}; };
return from(this.nodes.getNode(nodeId, opts)).pipe( return this.contentService.getNode(nodeId, opts).pipe(
catchError((err) => this.handleError(err)) catchError((err) => this.handleError(err))
); );
} }

View File

@@ -18,7 +18,7 @@
import { Injectable, Output, EventEmitter } from '@angular/core'; import { Injectable, Output, EventEmitter } from '@angular/core';
import { Node, NodeEntry } from '@alfresco/js-api'; import { Node, NodeEntry } from '@alfresco/js-api';
import { Subject } from 'rxjs'; import { Subject } from 'rxjs';
import { AlfrescoApiService, ContentService, NodeDownloadDirective, DownloadService } from '@alfresco/adf-core'; import { ContentService, NodeDownloadDirective, DownloadService } from '@alfresco/adf-core';
import { MatDialog } from '@angular/material/dialog'; import { MatDialog } from '@angular/material/dialog';
import { DocumentListService } from './document-list.service'; import { DocumentListService } from './document-list.service';
@@ -36,14 +36,13 @@ export class NodeActionsService {
constructor(private contentDialogService: ContentNodeDialogService, constructor(private contentDialogService: ContentNodeDialogService,
public dialogRef: MatDialog, public dialogRef: MatDialog,
public content: ContentService, public contentService: ContentService,
private documentListService?: DocumentListService, private documentListService?: DocumentListService,
private apiService?: AlfrescoApiService,
private dialog?: MatDialog, private dialog?: MatDialog,
private downloadService?: DownloadService) {} private downloadService?: DownloadService) {}
downloadNode(node: NodeEntry) { downloadNode(node: NodeEntry) {
new NodeDownloadDirective(this.apiService, this.downloadService, this.dialog) new NodeDownloadDirective(this.contentService, this.downloadService, this.dialog)
.downloadNode(node); .downloadNode(node);
} }

View File

@@ -15,9 +15,9 @@
* limitations under the License. * limitations under the License.
*/ */
import { AlfrescoApiService, ContentService } from '@alfresco/adf-core'; import { ContentService } from '@alfresco/adf-core';
import { Component, Input, OnChanges, ViewEncapsulation, EventEmitter, Output } from '@angular/core'; import { Component, Input, OnChanges, ViewEncapsulation, EventEmitter, Output } from '@angular/core';
import { VersionsApi, Node, VersionEntry, VersionPaging, NodesApi, NodeEntry, ContentApi } from '@alfresco/js-api'; import { Node, VersionEntry, VersionPaging, NodeEntry } from '@alfresco/js-api';
import { MatDialog } from '@angular/material/dialog'; import { MatDialog } from '@angular/material/dialog';
import { ConfirmDialogComponent } from '../dialogs/confirm.dialog'; import { ConfirmDialogComponent } from '../dialogs/confirm.dialog';
@@ -32,24 +32,6 @@ import { ConfirmDialogComponent } from '../dialogs/confirm.dialog';
}) })
export class VersionListComponent implements OnChanges { export class VersionListComponent implements OnChanges {
_contentApi: ContentApi;
get contentApi(): ContentApi {
this._contentApi = this._contentApi ?? new ContentApi(this.alfrescoApi.getInstance());
return this._contentApi;
}
_versionsApi: VersionsApi;
get versionsApi(): VersionsApi {
this._versionsApi = this._versionsApi ?? new VersionsApi(this.alfrescoApi.getInstance());
return this._versionsApi;
}
_nodesApi: NodesApi;
get nodesApi(): NodesApi {
this._nodesApi = this._nodesApi ?? new NodesApi(this.alfrescoApi.getInstance());
return this._nodesApi;
}
versions: VersionEntry[] = []; versions: VersionEntry[] = [];
isLoading = true; isLoading = true;
@@ -85,8 +67,7 @@ export class VersionListComponent implements OnChanges {
@Output() @Output()
viewVersion: EventEmitter<string> = new EventEmitter<string>(); viewVersion: EventEmitter<string> = new EventEmitter<string>();
constructor(private alfrescoApi: AlfrescoApiService, constructor(private contentService: ContentService,
private contentService: ContentService,
private dialog: MatDialog) { private dialog: MatDialog) {
} }
@@ -104,15 +85,14 @@ export class VersionListComponent implements OnChanges {
restore(versionId) { restore(versionId) {
if (this.canUpdate()) { if (this.canUpdate()) {
this.versionsApi this.contentService
.revertVersion(this.node.id, versionId, { majorVersion: true, comment: '' }) .revertVersion(this.node.id, versionId, { majorVersion: true, comment: '' })
.then(() => .then(() =>
this.nodesApi.getNode( this.contentService.getNode(
this.node.id, this.node.id,
{ include: ['permissions', 'path', 'isFavorite', 'allowableOperations'] } { include: ['permissions', 'path', 'isFavorite', 'allowableOperations'] }
) ).subscribe((node) => this.onVersionRestored(node))
) );
.then((node) => this.onVersionRestored(node));
} }
} }
@@ -122,7 +102,7 @@ export class VersionListComponent implements OnChanges {
loadVersionHistory() { loadVersionHistory() {
this.isLoading = true; this.isLoading = true;
this.versionsApi.listVersionHistory(this.node.id).then((versionPaging: VersionPaging) => { this.contentService.listVersionHistory(this.node.id).then((versionPaging: VersionPaging) => {
this.versions = versionPaging.list.entries; this.versions = versionPaging.list.entries;
this.isLoading = false; this.isLoading = false;
}); });
@@ -149,7 +129,7 @@ export class VersionListComponent implements OnChanges {
dialogRef.afterClosed().subscribe((result) => { dialogRef.afterClosed().subscribe((result) => {
if (result === true) { if (result === true) {
this.versionsApi this.contentService
.deleteVersion(this.node.id, versionId) .deleteVersion(this.node.id, versionId)
.then(() => this.onVersionDeleted(this.node)); .then(() => this.onVersionDeleted(this.node));
} }
@@ -168,7 +148,7 @@ export class VersionListComponent implements OnChanges {
} }
private getVersionContentUrl(nodeId: string, versionId: string, attachment?: boolean) { private getVersionContentUrl(nodeId: string, versionId: string, attachment?: boolean) {
const nodeDownloadUrl = this.contentApi.getContentUrl(nodeId, attachment); const nodeDownloadUrl = this.contentService.getContentUrl(nodeId, attachment);
return nodeDownloadUrl.replace('/content', '/versions/' + versionId + '/content'); return nodeDownloadUrl.replace('/content', '/versions/' + versionId + '/content');
} }

View File

@@ -18,11 +18,11 @@
/* tslint:disable:no-input-rename */ /* tslint:disable:no-input-rename */
import { Directive, ElementRef, EventEmitter, HostListener, Input, OnChanges, Output } from '@angular/core'; import { Directive, ElementRef, EventEmitter, HostListener, Input, OnChanges, Output } from '@angular/core';
import { NodeEntry, Node, DeletedNodeEntity, DeletedNode, TrashcanApi, NodesApi } from '@alfresco/js-api'; import { NodeEntry, Node, DeletedNodeEntity, DeletedNode } from '@alfresco/js-api';
import { Observable, forkJoin, from, of } from 'rxjs'; import { Observable, forkJoin, from, of } from 'rxjs';
import { AlfrescoApiService } from '../services/alfresco-api.service';
import { TranslationService } from '../services/translation.service'; import { TranslationService } from '../services/translation.service';
import { map, catchError, retry } from 'rxjs/operators'; import { map, catchError, retry } from 'rxjs/operators';
import { ContentService } from '../services/content.service';
interface ProcessedNodeData { interface ProcessedNodeData {
entry: Node | DeletedNode; entry: Node | DeletedNode;
@@ -62,24 +62,12 @@ export class NodeDeleteDirective implements OnChanges {
@Output() @Output()
delete: EventEmitter<any> = new EventEmitter(); delete: EventEmitter<any> = new EventEmitter();
_trashcanApi: TrashcanApi;
get trashcanApi(): TrashcanApi {
this._trashcanApi = this._trashcanApi ?? new TrashcanApi(this.alfrescoApiService.getInstance());
return this._trashcanApi;
}
_nodesApi: NodesApi;
get nodesApi(): NodesApi {
this._nodesApi = this._nodesApi ?? new NodesApi(this.alfrescoApiService.getInstance());
return this._nodesApi;
}
@HostListener('click') @HostListener('click')
onClick() { onClick() {
this.process(this.selection); this.process(this.selection);
} }
constructor(private alfrescoApiService: AlfrescoApiService, constructor(private contentService: ContentService,
private translation: TranslationService, private translation: TranslationService,
private elementRef: ElementRef) { private elementRef: ElementRef) {
} }
@@ -125,9 +113,9 @@ export class NodeDeleteDirective implements OnChanges {
let promise: Promise<any>; let promise: Promise<any>;
if (node.entry.hasOwnProperty('archivedAt') && node.entry['archivedAt']) { if (node.entry.hasOwnProperty('archivedAt') && node.entry['archivedAt']) {
promise = this.trashcanApi.deleteDeletedNode(id); promise = this.contentService.deleteDeletedNode(id);
} else { } else {
promise = this.nodesApi.deleteNode(id, { permanent: this.permanent }); promise = this.contentService.deleteNode(id, { permanent: this.permanent });
} }
return from(promise).pipe( return from(promise).pipe(

View File

@@ -17,10 +17,10 @@
import { Directive, Input, HostListener } from '@angular/core'; import { Directive, Input, HostListener } from '@angular/core';
import { MatDialog } from '@angular/material/dialog'; import { MatDialog } from '@angular/material/dialog';
import { AlfrescoApiService } from '../services/alfresco-api.service';
import { DownloadZipDialogComponent } from '../dialogs/download-zip/download-zip.dialog'; import { DownloadZipDialogComponent } from '../dialogs/download-zip/download-zip.dialog';
import { ContentApi, NodeEntry, VersionEntry } from '@alfresco/js-api'; import { NodeEntry, VersionEntry } from '@alfresco/js-api';
import { DownloadService } from '../services/download.service'; import { DownloadService } from '../services/download.service';
import { ContentService } from '../services/content.service';
/** /**
* Directive selectors without adf- prefix will be deprecated on 3.0.0 * Directive selectors without adf- prefix will be deprecated on 3.0.0
@@ -31,12 +31,6 @@ import { DownloadService } from '../services/download.service';
}) })
export class NodeDownloadDirective { export class NodeDownloadDirective {
_contentApi: ContentApi;
get contentApi(): ContentApi {
this._contentApi = this._contentApi ?? new ContentApi(this.apiService.getInstance());
return this._contentApi;
}
/** Nodes to download. */ /** Nodes to download. */
@Input('adfNodeDownload') @Input('adfNodeDownload')
nodes: NodeEntry | NodeEntry[]; nodes: NodeEntry | NodeEntry[];
@@ -51,7 +45,7 @@ export class NodeDownloadDirective {
} }
constructor( constructor(
private apiService: AlfrescoApiService, private contentService: ContentService,
private downloadService: DownloadService, private downloadService: DownloadService,
private dialog: MatDialog) { private dialog: MatDialog) {
} }
@@ -112,10 +106,10 @@ export class NodeDownloadDirective {
let url, fileName; let url, fileName;
if (this.version) { if (this.version) {
url = this.contentApi.getVersionContentUrl(id, this.version.entry.id, true); url = this.contentService.getVersionContentUrl(id, this.version.entry.id, true);
fileName = this.version.entry.name; fileName = this.version.entry.name;
} else { } else {
url = this.contentApi.getContentUrl(id, true); url = this.contentService.getContentUrl(id, true);
fileName = node.entry.name; fileName = node.entry.name;
} }

View File

@@ -0,0 +1,576 @@
/*!
* @license
* Copyright 2019 Alfresco Software, Ltd.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
import { Injectable } from '@angular/core';
import {
ContentApi,
DeletedNodesPaging,
DiscoveryApi,
DiscoveryEntry,
FavoriteBodyCreate,
FavoriteEntry,
FavoritePaging,
FavoritesApi,
NodeBodyCopy,
NodeBodyCreate,
NodeBodyLock,
NodeBodyMove,
NodeBodyUpdate,
NodeChildAssociationPaging,
NodeEntry,
NodesApi,
PeopleApi,
PersonEntry,
RenditionBodyCreate,
RenditionEntry,
RenditionPaging,
RenditionsApi,
ResultSetPaging,
RevertBody,
SearchApi,
SearchRequest,
SharedLinkEntry,
SharedLinkPaging,
SharedlinksApi,
SiteBody,
SiteEntry,
SiteMemberPaging,
SitePaging,
SiteRolePaging,
SitesApi,
TrashcanApi,
UploadApi,
VersionEntry,
VersionPaging,
VersionsApi
} from '@alfresco/js-api';
import { Observable, from } from 'rxjs';
import { AlfrescoApiService } from './alfresco-api.service';
import { ContentServiceProvider } from './content-provider.service';
import { PaginationModel } from '../models/pagination.model';
@Injectable({
providedIn: 'root'
})
export class AcsContentService implements ContentServiceProvider {
private CREATE_PERMISSION = 'create';
_contentApi: ContentApi;
get contentApi(): ContentApi {
this._contentApi = this._contentApi ?? new ContentApi(this.apiService.getInstance());
return this._contentApi;
}
_nodesApi: NodesApi;
get nodesApi(): NodesApi {
this._nodesApi = this._nodesApi ?? new NodesApi(this.apiService.getInstance());
return this._nodesApi;
}
_versionsApi: VersionsApi;
get versionsApi(): VersionsApi {
this._versionsApi = this._versionsApi ?? new VersionsApi(this.apiService.getInstance());
return this._versionsApi;
}
_trashcanApi: TrashcanApi;
get trashcanApi(): TrashcanApi {
this._trashcanApi = this._trashcanApi ?? new TrashcanApi(this.apiService.getInstance());
return this._trashcanApi;
}
_sharedLinksApi: SharedlinksApi;
get sharedLinksApi(): SharedlinksApi {
this._sharedLinksApi = this._sharedLinksApi ?? new SharedlinksApi(this.apiService.getInstance());
return this._sharedLinksApi;
}
_uploadApi: UploadApi;
get uploadApi(): UploadApi {
this._uploadApi = this._uploadApi ?? new UploadApi(this.apiService.getInstance());
return this._uploadApi;
}
_renditionsApi: RenditionsApi;
get renditionsApi(): RenditionsApi {
this._renditionsApi = this._renditionsApi ?? new RenditionsApi(this.apiService.getInstance());
return this._renditionsApi;
}
_peopleApi: PeopleApi;
get peopleApi(): PeopleApi {
this._peopleApi = this._peopleApi ?? new PeopleApi(this.apiService.getInstance());
return this._peopleApi;
}
_sitesApi: SitesApi;
get sitesApi(): SitesApi {
this._sitesApi = this._sitesApi ?? new SitesApi(this.apiService.getInstance());
return this._sitesApi;
}
_searchApi: SearchApi;
get searchApi(): SearchApi {
this._searchApi = this._searchApi ?? new SearchApi(this.apiService.getInstance());
return this._searchApi;
}
_favoritesApi: FavoritesApi;
get favoritesApi(): FavoritesApi {
this._favoritesApi = this._favoritesApi ?? new FavoritesApi(this.apiService.getInstance());
return this._favoritesApi;
}
_discoveryApi: DiscoveryApi;
get discoveryApi(): DiscoveryApi {
this._discoveryApi = this._discoveryApi ?? new DiscoveryApi(this.apiService.getInstance());
return this._discoveryApi;
}
constructor(public apiService: AlfrescoApiService) {
}
getNodePrefix() {
return 'alfresco://';
}
getContentUrl(node: NodeEntry | string, attachment?: boolean, ticket?: string): string {
if (node) {
let nodeId: string;
if (typeof node === 'string') {
nodeId = node;
} else if (node.entry) {
nodeId = node.entry.id;
}
return this.contentApi.getContentUrl(nodeId, attachment, ticket);
}
return null;
}
getDocumentThumbnailUrl(nodeId: string, attachment?: boolean, ticket?: string): string {
return this.contentApi.getDocumentThumbnailUrl(nodeId, attachment, ticket);
}
getVersionContentUrl(nodeId: string, versionId: string, attachment?: boolean, ticket?: string): string {
return this.contentApi.getVersionContentUrl(nodeId, versionId, attachment, ticket);
}
getSharedLinkContentUrl(linkId: string, attachment?: boolean): string {
return this.contentApi.getSharedLinkContentUrl(linkId, attachment);
}
getSharedLinkRenditionUrl(sharedId: string, renditionId: string, attachment?: boolean): string {
return this.contentApi.getSharedLinkRenditionUrl(sharedId, renditionId, attachment);
}
getRenditionUrl(nodeId: string, encoding: string, attachment?: boolean, ticket?: string): string {
return this.contentApi.getRenditionUrl(nodeId, encoding, attachment, ticket);
}
getVersionRenditionUrl(nodeId: string, versionId: string, encoding: string, attachment?: boolean, ticket?: string): string {
return this.contentApi.getVersionRenditionUrl(nodeId, versionId, encoding, attachment, ticket);
}
getNodeContent(nodeId: string): Promise<any> {
return this.nodesApi.getNodeContent(nodeId);
}
getNode(nodeId: string, opts?: any): Promise<NodeEntry> {
return this.nodesApi.getNode(nodeId, opts);
}
lockNode(nodeId: string, nodeBodyLock: NodeBodyLock, opts?: any): Promise<NodeEntry> {
return this.nodesApi.lockNode(nodeId, nodeBodyLock, opts);
}
unlockNode(nodeId: string, opts?: any): Promise<NodeEntry> {
return this.nodesApi.unlockNode(nodeId, opts);
}
deleteNode(nodeId: string, opts?: any): Promise<any> {
return this.nodesApi.deleteNode(nodeId, opts);
}
copyNode(nodeId: string, nodeBodyCopy: NodeBodyCopy, opts?: any): Promise<NodeEntry> {
return this.nodesApi.copyNode(nodeId, nodeBodyCopy, opts);
}
moveNode(nodeId: string, nodeBodyMove: NodeBodyMove, opts?: any): Promise<NodeEntry> {
return this.nodesApi.moveNode(nodeId, nodeBodyMove, opts);
}
listNodeChildren(nodeId: string, opts?: any): Promise<NodeChildAssociationPaging> {
return this.nodesApi.listNodeChildren(nodeId, opts);
}
createNode(nodeId: string, nodeBodyCreate: NodeBodyCreate, opts?: any, formParams?: any): Promise<NodeEntry | any> {
return this.nodesApi.createNode(nodeId, nodeBodyCreate, opts, formParams);
}
updateNode(nodeId: string, nodeBodyUpdate: NodeBodyUpdate, opts?: any): Promise<NodeEntry> {
return this.nodesApi.updateNode(nodeId, nodeBodyUpdate, opts);
}
updateNodeContent(nodeId: string, contentBodyUpdate: string, opts?: any): Promise<NodeEntry> {
return this.nodesApi.updateNodeContent(nodeId, contentBodyUpdate, opts);
}
revertVersion(nodeId: string, versionId: string, revertBody: RevertBody, opts?: any): Promise<VersionEntry> {
return this.versionsApi.revertVersion(nodeId, versionId, revertBody, opts);
}
deleteVersion(nodeId: string, versionId: string): Promise<any> {
return this.versionsApi.deleteVersion(nodeId, versionId);
}
listVersionHistory(nodeId: string, opts?: any): Promise<VersionPaging> {
return this.versionsApi.listVersionHistory(nodeId, opts);
}
getVersion(nodeId: string, versionId: string): Promise<VersionEntry> {
return this.versionsApi.getVersion(nodeId, versionId);
}
listVersionRenditions(nodeId: string, versionId: string, opts?: any): Promise<RenditionPaging> {
return this.versionsApi.listVersionRenditions(nodeId, versionId, opts);
}
createVersionRendition(nodeId: string, versionId: string, renditionBodyCreate: RenditionBodyCreate): Promise<any> {
return this.versionsApi.createVersionRendition(nodeId, versionId, renditionBodyCreate);
}
getVersionRendition(nodeId: string, versionId: string, renditionId: string): Promise<RenditionEntry> {
return this.versionsApi.getVersionRendition(nodeId, versionId, renditionId);
}
getNodeVersions(nodeId: string, opts?: any) {
return from(this.versionsApi.listVersionHistory(nodeId, opts));
}
deleteDeletedNode(nodeId: string): Promise<any> {
return this.trashcanApi.deleteDeletedNode(nodeId);
}
listDeletedNodes(opts?: any): Promise<DeletedNodesPaging> {
return this.trashcanApi.listDeletedNodes(opts);
}
restoreDeletedNode(nodeId: string, opts?: any): Promise<NodeEntry> {
return this.trashcanApi.restoreDeletedNode(nodeId, opts);
}
getSharedLink(sharedId: string, opts?: any): Promise<SharedLinkEntry> {
return this.sharedLinksApi.getSharedLink(sharedId, opts);
}
getSharedLinkRendition(sharedId: string, renditionId: string): Promise<RenditionEntry> {
return this.sharedLinksApi.getSharedLinkRendition(sharedId, renditionId);
}
listSharedLinks(opts?: any): Promise<SharedLinkPaging> {
return this.sharedLinksApi.listSharedLinks(opts);
}
deleteSharedLink(sharedId: string): Promise<any> {
return this.sharedLinksApi.deleteSharedLink(sharedId);
}
uploadFile(fileDefinition: any, relativePath: string, rootFolderId: string, nodeBody: any, opts?: any): Promise<any> {
return this.uploadApi.uploadFile(fileDefinition, relativePath, rootFolderId, nodeBody, opts);
}
listRenditions(nodeId: string, opts?: any): Promise<RenditionPaging> {
return this.renditionsApi.listRenditions(nodeId, opts);
}
createRendition(nodeId: string, renditionBodyCreate: RenditionBodyCreate): Promise<any> {
return this.renditionsApi.createRendition(nodeId, renditionBodyCreate);
}
getRendition(nodeId: string, renditionId: string): Promise<RenditionEntry> {
return this.renditionsApi.getRendition(nodeId, renditionId);
}
getPerson(personId: string, opts?: any): Promise<PersonEntry> {
return this.peopleApi.getPerson(personId, opts);
}
getRepositoryInformation(): Promise<DiscoveryEntry> {
return this.discoveryApi.getRepositoryInformation();
}
listFavorites(personId: string, opts?: any): Promise<FavoritePaging> {
return this.favoritesApi.listFavorites(personId, opts);
}
createFavorite(personId: string, favoriteBodyCreate: FavoriteBodyCreate, opts?: any): Promise<FavoriteEntry> {
return this.favoritesApi.createFavorite(personId, favoriteBodyCreate, opts);
}
deleteFavorite(personId: string, favoriteId: string): Promise<any> {
return this.favoritesApi.deleteFavorite(personId, favoriteId);
}
search(request: SearchRequest): Promise<ResultSetPaging> {
return this.searchApi.search(request);
}
deleteSite(siteId?: string, opts?: { permanent?: boolean }): Promise<any> {
return this.sitesApi.deleteSite(siteId, opts);
}
deleteSiteMembership(siteId: string, personId: string): Promise<any> {
return this.sitesApi.deleteSiteMembership(siteId, personId);
}
createSite(
siteBody: SiteBody,
opts?: {
fields?: Array<string>;
skipConfiguration?: boolean;
skipAddToFavorites?: boolean;
}
): Promise<SiteEntry> {
return this.sitesApi.createSite(siteBody, opts);
}
getSite(siteId?: string, opts?: { relations?: Array<string>; fields?: Array<string> }): Promise<SiteEntry> {
return this.sitesApi.getSite(siteId, opts);
}
updateSite(siteId: string, siteBody: SiteBody): Promise<SiteEntry> {
return this.sitesApi.updateSite(siteId, siteBody);
}
getRecentFiles(personId: string, pagination: PaginationModel, filters?: string[]): Observable<ResultSetPaging> {
const defaultFilter = [
'TYPE:"content"',
'-PNAME:"0/wiki"',
'-TYPE:"app:filelink"',
'-TYPE:"cm:thumbnail"',
'-TYPE:"cm:failedThumbnail"',
'-TYPE:"cm:rating"',
'-TYPE:"dl:dataList"',
'-TYPE:"dl:todoList"',
'-TYPE:"dl:issue"',
'-TYPE:"dl:contact"',
'-TYPE:"dl:eventAgenda"',
'-TYPE:"dl:event"',
'-TYPE:"dl:task"',
'-TYPE:"dl:simpletask"',
'-TYPE:"dl:meetingAgenda"',
'-TYPE:"dl:location"',
'-TYPE:"fm:topic"',
'-TYPE:"fm:post"',
'-TYPE:"ia:calendarEvent"',
'-TYPE:"lnk:link"'
];
return new Observable((observer) => {
this.peopleApi.getPerson(personId)
.then((person) => {
const username = person.entry.id;
const filterQueries = [
{ query: `cm:modified:[NOW/DAY-30DAYS TO NOW/DAY+1DAY]` },
{ query: `cm:modifier:${username} OR cm:creator:${username}` },
{ query: defaultFilter.join(' AND ') }
];
if (filters && filters.length > 0) {
filterQueries.push({
query: filters.join()
});
}
const query = new SearchRequest({
query: {
query: '*',
language: 'afts'
},
filterQueries,
include: ['path', 'properties', 'allowableOperations'],
sort: [{
type: 'FIELD',
field: 'cm:modified',
ascending: false
}],
paging: {
maxItems: pagination.maxItems,
skipCount: pagination.skipCount
}
});
return this.searchApi.search(query)
.then((searchResult) => {
observer.next(searchResult);
observer.complete();
},
(err) => {
observer.error(err);
observer.complete();
});
},
(err) => {
observer.error(err);
observer.complete();
});
});
}
loadFavorites(pagination: PaginationModel, includeFields: string[] = [], where?: string): Observable<FavoritePaging> {
const includeFieldsRequest = this.getIncludesFields(includeFields);
const defaultPredicate = '(EXISTS(target/file) OR EXISTS(target/folder))';
const options = {
maxItems: pagination.maxItems,
skipCount: pagination.skipCount,
where: where ? `${where} AND ${defaultPredicate}` : defaultPredicate,
include: includeFieldsRequest
};
return new Observable((observer) => {
this.favoritesApi.listFavorites('-me-', options)
.then((result: FavoritePaging) => {
const page: FavoritePaging = {
list: {
entries: result.list.entries
.map(({ entry }: any) => {
const target = entry.target.file || entry.target.folder;
target.properties = {
...(target.properties || {
'cm:title': entry.title || target.title,
'cm:description': entry.description || target.description
}),
...(entry.properties || {})
};
return {
entry: target
};
}),
pagination: result.list.pagination
}
};
observer.next(page);
observer.complete();
},
(err) => {
observer.error(err);
observer.complete();
});
});
}
loadMemberSites(pagination: PaginationModel, where?: string): Observable<SiteMemberPaging> {
const options = {
include: ['properties'],
maxItems: pagination.maxItems,
skipCount: pagination.skipCount,
where
};
return new Observable((observer) => {
this.sitesApi.listSiteMembershipsForPerson('-me-', options)
.then((result: SiteRolePaging) => {
const page: SiteMemberPaging = new SiteMemberPaging({
list: {
entries: result.list.entries
.map(({ entry: { site } }: any) => {
site.allowableOperations = site.allowableOperations ? site.allowableOperations : [this.CREATE_PERMISSION];
site.name = site.name || site.title;
return {
entry: site
};
}),
pagination: result.list.pagination
}
});
observer.next(page);
observer.complete();
},
(err) => {
observer.error(err);
observer.complete();
});
});
}
loadSites(pagination: PaginationModel, where?: string): Observable<SitePaging> {
const options = {
include: ['properties', 'aspectNames'],
maxItems: pagination.maxItems,
skipCount: pagination.skipCount,
where
};
return new Observable((observer) => {
this.sitesApi
.listSites(options)
.then(
(page) => {
page.list.entries.map(
({ entry }: any) => {
entry.name = entry.name || entry.title;
return { entry };
}
);
observer.next(page);
observer.complete();
},
(err) => {
observer.error(err);
observer.complete();
});
});
}
loadTrashcan(pagination: PaginationModel, includeFields: string[] = []): Observable<DeletedNodesPaging> {
const includeFieldsRequest = this.getIncludesFields(includeFields);
const options = {
include: includeFieldsRequest,
maxItems: pagination.maxItems,
skipCount: pagination.skipCount
};
return from(this.trashcanApi.listDeletedNodes(options));
}
loadSharedLinks(pagination: PaginationModel, includeFields: string[] = [], where?: string): Observable<SharedLinkPaging> {
const includeFieldsRequest = this.getIncludesFields(includeFields);
const options = {
include: includeFieldsRequest,
maxItems: pagination.maxItems,
skipCount: pagination.skipCount,
where
};
return from(this.sharedLinksApi.listSharedLinks(options));
}
private getIncludesFields(includeFields: string[]): string[] {
return ['path', 'properties', 'allowableOperations', 'permissions', 'aspectNames', ...includeFields]
.filter((element, index, array) => index === array.indexOf(element));
}
}

View File

@@ -0,0 +1,191 @@
/*!
* @license
* Copyright 2019 Alfresco Software, Ltd.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
import {
DeletedNodesPaging,
DiscoveryEntry,
FavoriteBodyCreate,
FavoriteEntry,
FavoritePaging,
NodeBodyCopy,
NodeBodyCreate,
NodeBodyLock,
NodeBodyMove,
NodeBodyUpdate,
NodeChildAssociationPaging,
NodeEntry,
PersonEntry,
RenditionBodyCreate,
RenditionEntry,
RenditionPaging,
ResultSetPaging,
RevertBody,
SearchRequest,
SharedLinkEntry,
SharedLinkPaging,
SiteBody,
SiteEntry,
SiteMemberPaging,
SitePaging,
VersionEntry,
VersionPaging
} from '@alfresco/js-api';
import { InjectionToken, Provider, Type } from '@angular/core';
import { Observable } from 'rxjs';
import { PaginationModel } from '../models/pagination.model';
export const CONTENT_SERVICES_PROVIDERS = new InjectionToken<ContentServiceProvider[]>('content-services-providers');
export const DEFAULT_CONTENT_SERVICES_PROVIDER = new InjectionToken<ContentServiceProvider>('default-content-services-provider');
export function registerContentServiceProvider(implementationClass: Type<ContentServiceProvider>, defaultProvider: boolean): Provider[] {
const providers = [{
provide: CONTENT_SERVICES_PROVIDERS,
multi: true,
useExisting: implementationClass
}];
if (defaultProvider) {
providers.push({
provide: DEFAULT_CONTENT_SERVICES_PROVIDER,
multi: false,
useExisting: implementationClass
});
}
return providers;
}
export interface ContentServiceProvider {
getNodePrefix();
getContentUrl(node: NodeEntry | string, attachment?: boolean, ticket?: string);
getDocumentThumbnailUrl(nodeId: string, attachment?: boolean, ticket?: string);
getVersionContentUrl(nodeId: string, versionId: string, attachment?: boolean, ticket?: string);
getSharedLinkContentUrl(linkId: string, attachment?: boolean);
getSharedLinkRenditionUrl(sharedId: string, renditionId: string, attachment?: boolean);
getRenditionUrl(nodeId: string, encoding: string, attachment?: boolean, ticket?: string);
getVersionRenditionUrl(nodeId: string, versionId: string, encoding: string, attachment?: boolean, ticket?: string): string;
getNodeContent(nodeId: string): Promise<any>;
getNode(nodeId: string, opts?: any): Promise<NodeEntry>;
lockNode(nodeId: string, nodeBodyLock: NodeBodyLock, opts?: any): Promise<NodeEntry>;
unlockNode(nodeId: string, opts?: any): Promise<NodeEntry>;
deleteNode(nodeId: string, opts?: any): Promise<any>;
copyNode(nodeId: string, nodeBodyCopy: NodeBodyCopy, opts?: any): Promise<NodeEntry>;
moveNode(nodeId: string, nodeBodyMove: NodeBodyMove, opts?: any): Promise<NodeEntry>;
listNodeChildren(nodeId: string, opts?: any): Promise<NodeChildAssociationPaging>;
createNode(nodeId: string, nodeBodyCreate: NodeBodyCreate, opts?: any, formParams?: any): Promise<NodeEntry | any>;
updateNode(nodeId: string, nodeBodyUpdate: NodeBodyUpdate, opts?: any): Promise<NodeEntry>;
updateNodeContent(nodeId: string, contentBodyUpdate: string, opts?: any): Promise<NodeEntry>;
revertVersion(nodeId: string, versionId: string, revertBody: RevertBody, opts?: any): Promise<VersionEntry>;
deleteVersion(nodeId: string, versionId: string): Promise<any>;
listVersionHistory(nodeId: string, opts?: any): Promise<VersionPaging>;
getVersion(nodeId: string, versionId: string): Promise<VersionEntry>;
listVersionRenditions(nodeId: string, versionId: string, opts?: any): Promise<RenditionPaging>;
createVersionRendition(nodeId: string, versionId: string, renditionBodyCreate: RenditionBodyCreate): Promise<any>;
getVersionRendition(nodeId: string, versionId: string, renditionId: string): Promise<RenditionEntry>;
getNodeVersions(nodeId: string, opts?: any);
deleteDeletedNode(nodeId: string): Promise<any>;
listDeletedNodes(opts?: any): Promise<DeletedNodesPaging>;
restoreDeletedNode(nodeId: string, opts?: any): Promise<NodeEntry>;
getSharedLink(sharedId: string, opts?: any): Promise<SharedLinkEntry>;
getSharedLinkRendition(sharedId: string, renditionId: string): Promise<RenditionEntry>;
listSharedLinks(opts?: any): Promise<SharedLinkPaging>;
deleteSharedLink(sharedId: string): Promise<any>;
uploadFile(fileDefinition: any, relativePath: string, rootFolderId: string, nodeBody: any, opts?: any): Promise<any>;
listRenditions(nodeId: string, opts?: any): Promise<RenditionPaging>;
createRendition(nodeId: string, renditionBodyCreate: RenditionBodyCreate): Promise<any>;
getRendition(nodeId: string, renditionId: string): Promise<RenditionEntry>;
getPerson(personId: string, opts?: any): Promise<PersonEntry>;
getRepositoryInformation(): Promise<DiscoveryEntry>;
listFavorites(personId: string, opts?: any): Promise<FavoritePaging>;
createFavorite(personId: string, favoriteBodyCreate: FavoriteBodyCreate, opts?: any): Promise<FavoriteEntry>;
deleteFavorite(personId: string, favoriteId: string): Promise<any>;
search(request: SearchRequest): Promise<ResultSetPaging>;
deleteSite(siteId?: string, opts?: { permanent?: boolean }): Promise<any>;
deleteSiteMembership(siteId: string, personId: string): Promise<any>;
createSite(
siteBody: SiteBody,
opts?: {
fields?: Array<string>;
skipConfiguration?: boolean;
skipAddToFavorites?: boolean;
}
): Promise<SiteEntry>;
getSite(siteId?: string, opts?: { relations?: Array<string>; fields?: Array<string> }): Promise<SiteEntry>;
updateSite(siteId: string, siteBody: SiteBody): Promise<SiteEntry>;
getRecentFiles(personId: string, pagination: PaginationModel, filters?: string[]): Observable<ResultSetPaging>;
loadFavorites(pagination: PaginationModel, includeFields: string[], where?: string): Observable<FavoritePaging> ;
loadMemberSites(pagination: PaginationModel, where?: string): Observable<SiteMemberPaging>;
loadSites(pagination: PaginationModel, where?: string): Observable<SitePaging>;
loadTrashcan(pagination: PaginationModel, includeFields: string[]): Observable<DeletedNodesPaging>;
loadSharedLinks(pagination: PaginationModel, includeFields: string[], where?: string): Observable<SharedLinkPaging>;
}

View File

@@ -15,47 +15,96 @@
* limitations under the License. * limitations under the License.
*/ */
import { Injectable } from '@angular/core'; import { Inject, Injectable } from '@angular/core';
import { DomSanitizer } from '@angular/platform-browser'; import { DomSanitizer } from '@angular/platform-browser';
import { ContentApi, MinimalNode, Node, NodeEntry, NodesApi } from '@alfresco/js-api'; import {
import { Observable, Subject, from, throwError } from 'rxjs'; DeletedNodesPaging,
DeletedNodesPagingList,
DiscoveryEntry,
FavoriteBodyCreate,
FavoriteEntry,
FavoritePaging,
FavoritePagingList,
MinimalNode,
Node,
NodeBodyCopy,
NodeBodyCreate,
NodeBodyLock,
NodeBodyMove,
NodeBodyUpdate,
NodeChildAssociationPaging,
NodeEntry,
PersonEntry,
RenditionBodyCreate,
RenditionEntry,
RenditionPaging,
ResultSetPaging,
ResultSetPagingList,
RevertBody,
SearchRequest,
SharedLinkEntry,
SharedLinkPaging,
SharedLinkPagingList,
SiteBody,
SiteEntry,
SiteMemberPaging,
SiteMemberPagingList,
SitePaging,
SitePagingList,
VersionEntry,
VersionPaging
} from '@alfresco/js-api';
import { Observable, Subject, throwError, forkJoin, from } from 'rxjs';
import { FolderCreatedEvent } from '../events/folder-created.event'; import { FolderCreatedEvent } from '../events/folder-created.event';
import { AlfrescoApiService } from './alfresco-api.service';
import { AuthenticationService } from './authentication.service'; import { AuthenticationService } from './authentication.service';
import { LogService } from './log.service'; import { LogService } from './log.service';
import { catchError } from 'rxjs/operators'; import { catchError, map } from 'rxjs/operators';
import { PermissionsEnum } from '../models/permissions.enum'; import { PermissionsEnum } from '../models/permissions.enum';
import { AllowableOperationsEnum } from '../models/allowable-operations.enum'; import { AllowableOperationsEnum } from '../models/allowable-operations.enum';
import { DownloadService } from './download.service'; import { DownloadService } from './download.service';
import { ThumbnailService } from './thumbnail.service'; import { ContentServiceProvider, CONTENT_SERVICES_PROVIDERS, DEFAULT_CONTENT_SERVICES_PROVIDER } from './content-provider.service';
import { AlfrescoApiService } from './alfresco-api.service';
import { AcsContentService } from './acs-content.service';
import { PaginationModel } from '../models/pagination.model';
@Injectable({ @Injectable({
providedIn: 'root' providedIn: 'root'
}) })
export class ContentService { export class ContentService {
private defaultProvider: ContentServiceProvider;
folderCreated: Subject<FolderCreatedEvent> = new Subject<FolderCreatedEvent>(); folderCreated: Subject<FolderCreatedEvent> = new Subject<FolderCreatedEvent>();
folderCreate: Subject<MinimalNode> = new Subject<MinimalNode>(); folderCreate: Subject<MinimalNode> = new Subject<MinimalNode>();
folderEdit: Subject<MinimalNode> = new Subject<MinimalNode>(); folderEdit: Subject<MinimalNode> = new Subject<MinimalNode>();
_contentApi: ContentApi; constructor(
get contentApi(): ContentApi { public authService: AuthenticationService,
this._contentApi = this._contentApi ?? new ContentApi(this.apiService.getInstance());
return this._contentApi;
}
_nodesApi: NodesApi;
get nodesApi(): NodesApi {
this._nodesApi = this._nodesApi ?? new NodesApi(this.apiService.getInstance());
return this._nodesApi;
}
constructor(public authService: AuthenticationService,
public apiService: AlfrescoApiService,
private logService: LogService, private logService: LogService,
private sanitizer: DomSanitizer, private sanitizer: DomSanitizer,
private downloadService: DownloadService, private downloadService: DownloadService,
private thumbnailService: ThumbnailService) { private apiService: AlfrescoApiService,
@Inject(CONTENT_SERVICES_PROVIDERS) private providers: ContentServiceProvider[] = [],
@Inject(DEFAULT_CONTENT_SERVICES_PROVIDER) private defaultContentServiceProvider: ContentServiceProvider = null) {
switch (providers.length) {
case 0:
this.defaultProvider = new AcsContentService(this.apiService);
this.providers = [this.defaultProvider];
break;
case 1:
this.defaultProvider = providers[0];
break;
default:
this.defaultProvider = defaultContentServiceProvider ? this.defaultContentServiceProvider : providers[0];
break;
}
}
private getProviderFromId(id: string): ContentServiceProvider {
if (this.providers.length > 1) {
return this.providers.find(provider => id.startsWith(provider.getNodePrefix())) || this.defaultProvider;
} else {
return this.defaultProvider;
}
} }
/** /**
@@ -79,63 +128,6 @@ export class ContentService {
return <string> this.sanitizer.bypassSecurityTrustUrl(url); return <string> this.sanitizer.bypassSecurityTrustUrl(url);
} }
/**
* @deprecated in 3.2.0, use ThumbnailService instead.
* Gets a thumbnail URL for the given document node.
* @param node Node or Node ID to get URL for.
* @param attachment Toggles whether to retrieve content as an attachment for download
* @param ticket Custom ticket to use for authentication
* @returns URL string
*/
getDocumentThumbnailUrl(node: NodeEntry | string, attachment?: boolean, ticket?: string): string {
return this.thumbnailService.getDocumentThumbnailUrl(node, attachment, ticket);
}
/**
* Gets a content URL for the given node.
* @param node Node or Node ID to get URL for.
* @param attachment Toggles whether to retrieve content as an attachment for download
* @param ticket Custom ticket to use for authentication
* @returns URL string or `null`
*/
getContentUrl(node: NodeEntry | string, attachment?: boolean, ticket?: string): string {
if (node) {
let nodeId: string;
if (typeof node === 'string') {
nodeId = node;
} else if (node.entry) {
nodeId = node.entry.id;
}
return this.contentApi.getContentUrl(nodeId, attachment, ticket);
}
return null;
}
/**
* Gets content for the given node.
* @param nodeId ID of the target node
* @returns Content data
*/
getNodeContent(nodeId: string): Observable<any> {
return from(this.nodesApi.getNodeContent(nodeId))
.pipe(
catchError((err: any) => this.handleError(err))
);
}
/**
* Gets a Node via its node ID.
* @param nodeId ID of the target node
* @param opts Options supported by JS-API
* @returns Details of the folder
*/
getNode(nodeId: string, opts?: any): Observable<NodeEntry> {
return from(this.nodesApi.getNode(nodeId, opts));
}
/** /**
* Checks if the user has permission on that node * Checks if the user has permission on that node
* @param node Node to check permissions * @param node Node to check permissions
@@ -211,4 +203,336 @@ export class ContentService {
this.logService.error(error); this.logService.error(error);
return throwError(error || 'Server error'); return throwError(error || 'Server error');
} }
getDocumentThumbnailUrl(nodeId: string, attachment?: boolean, ticket?: string): string {
return this.getProviderFromId(nodeId).getDocumentThumbnailUrl(nodeId, attachment, ticket);
}
/**
* Gets a content URL for the given node.
* @param node Node or Node ID to get URL for.
* @param attachment Toggles whether to retrieve content as an attachment for download
* @param ticket Custom ticket to use for authentication
* @returns URL string or `null`
*/
getContentUrl(node: NodeEntry | string, attachment?: boolean, ticket?: string): string {
if (node) {
let nodeId: string;
if (typeof node === 'string') {
nodeId = node;
} else if (node.entry) {
nodeId = node.entry.id;
}
return this.getProviderFromId(nodeId).getContentUrl(nodeId, attachment, ticket);
}
return null;
}
getVersionContentUrl(nodeId: string, versionId: string, attachment?: boolean, ticket?: string): string {
return this.getProviderFromId(nodeId).getVersionContentUrl(nodeId, versionId, attachment, ticket);
}
getSharedLinkContentUrl(linkId: string, attachment?: boolean): string {
return this.getProviderFromId(linkId).getSharedLinkContentUrl(linkId, attachment);
}
getSharedLinkRenditionUrl(sharedId: string, renditionId: string, attachment?: boolean): string {
return this.getProviderFromId(sharedId).getSharedLinkRenditionUrl(sharedId, renditionId, attachment);
}
getRenditionUrl(nodeId: string, encoding: string, attachment?: boolean, ticket?: string): string {
return this.getProviderFromId(nodeId).getRenditionUrl(nodeId, encoding, attachment, ticket);
}
getVersionRenditionUrl(nodeId: string, versionId: string, encoding: string, attachment?: boolean, ticket?: string): string {
return this.getProviderFromId(nodeId).getVersionRenditionUrl(nodeId, versionId, encoding, attachment, ticket);
}
/**
* Gets content for the given node.
* @param nodeId ID of the target node
* @returns Content data
*/
getNodeContent(nodeId: string): Observable<any> {
return from(this.getProviderFromId(nodeId).getNodeContent(nodeId))
.pipe(
catchError((err: any) => this.handleError(err)));
}
/**
* Gets a Node via its node ID.
* @param nodeId ID of the target node
* @param opts Options supported by JS-API
* @returns Details of the folder
*/
getNode(nodeId: string, opts?: any): Observable<NodeEntry> {
return from(this.getProviderFromId(nodeId).getNode(nodeId, opts));
}
lockNode(nodeId: string, nodeBodyLock: NodeBodyLock, opts?: any): Promise<NodeEntry> {
return this.getProviderFromId(nodeId).lockNode(nodeId, nodeBodyLock, opts);
}
unlockNode(nodeId: string, opts?: any): Promise<NodeEntry> {
return this.getProviderFromId(nodeId).unlockNode(nodeId, opts);
}
deleteNode(nodeId: string, opts?: any): Promise<any> {
return this.getProviderFromId(nodeId).deleteNode(nodeId, opts);
}
copyNode(nodeId: string, nodeBodyCopy: NodeBodyCopy, opts?: any): Promise<NodeEntry> {
return this.getProviderFromId(nodeId).copyNode(nodeId, nodeBodyCopy, opts);
}
moveNode(nodeId: string, nodeBodyMove: NodeBodyMove, opts?: any): Promise<NodeEntry> {
return this.getProviderFromId(nodeId).moveNode(nodeId, nodeBodyMove, opts);
}
listNodeChildren(nodeId: string, opts?: any): Promise<NodeChildAssociationPaging> {
return this.getProviderFromId(nodeId).listNodeChildren(nodeId, opts);
}
createNode(nodeId: string, nodeBodyCreate: NodeBodyCreate, opts?: any, formParams?: any): Promise<NodeEntry | any> {
return this.getProviderFromId(nodeId).createNode(nodeId, nodeBodyCreate, opts, formParams);
}
updateNode(nodeId: string, nodeBodyUpdate: NodeBodyUpdate, opts?: any): Promise<NodeEntry> {
return this.getProviderFromId(nodeId).updateNode(nodeId, nodeBodyUpdate, opts);
}
updateNodeContent(nodeId: string, contentBodyUpdate: string, opts?: any): Promise<NodeEntry> {
return this.getProviderFromId(nodeId).updateNodeContent(nodeId, contentBodyUpdate, opts);
}
revertVersion(nodeId: string, versionId: string, revertBody: RevertBody, opts?: any): Promise<VersionEntry> {
return this.getProviderFromId(nodeId).revertVersion(nodeId, versionId, revertBody, opts);
}
deleteVersion(nodeId: string, versionId: string): Promise<any> {
return this.getProviderFromId(nodeId).deleteVersion(nodeId, versionId);
}
listVersionHistory(nodeId: string, opts?: any): Promise<VersionPaging> {
return this.getProviderFromId(nodeId).listVersionHistory(nodeId, opts);
}
getVersion(nodeId: string, versionId: string): Promise<VersionEntry> {
return this.getProviderFromId(nodeId).getVersion(nodeId, versionId);
}
listVersionRenditions(nodeId: string, versionId: string, opts?: any): Promise<RenditionPaging> {
return this.getProviderFromId(nodeId).listVersionRenditions(nodeId, versionId, opts);
}
createVersionRendition(nodeId: string, versionId: string, renditionBodyCreate: RenditionBodyCreate): Promise<any> {
return this.getProviderFromId(nodeId).createVersionRendition(nodeId, versionId, renditionBodyCreate);
}
getVersionRendition(nodeId: string, versionId: string, renditionId: string): Promise<RenditionEntry> {
return this.getProviderFromId(nodeId).getVersionRendition(nodeId, versionId, renditionId);
}
deleteDeletedNode(nodeId: string): Promise<any> {
return this.getProviderFromId(nodeId).deleteDeletedNode(nodeId);
}
listDeletedNodes(opts?: any): Promise<DeletedNodesPaging> {
const deletedNodes: Promise<DeletedNodesPaging>[] = [];
this.providers.map(provider => deletedNodes.push(provider.listDeletedNodes(opts)));
return Promise.all(deletedNodes).then(nodes => this.mergeDeletedNodesPaging(nodes));
}
restoreDeletedNode(nodeId: string, opts?: any): Promise<NodeEntry> {
return this.getProviderFromId(nodeId).restoreDeletedNode(nodeId, opts);
}
getSharedLink(sharedId: string, opts?: any): Promise<SharedLinkEntry> {
return this.getProviderFromId(sharedId).getSharedLink(sharedId, opts);
}
getSharedLinkRendition(sharedId: string, renditionId: string): Promise<RenditionEntry> {
return this.getProviderFromId(sharedId).getSharedLinkRendition(sharedId, renditionId);
}
listSharedLinks(opts?: any): Promise<SharedLinkPaging> {
const paging: Promise<SharedLinkPaging>[] = [];
this.providers.map(provider => paging.push(provider.listSharedLinks(opts)));
return Promise.all(paging).then(nodes => this.mergeSharedLinkPaging(nodes));
}
deleteSharedLink(sharedId: string): Promise<any> {
return this.getProviderFromId(sharedId).deleteSharedLink(sharedId);
}
uploadFile(fileDefinition: any, relativePath: string, rootFolderId: string, nodeBody: any, opts?: any): Promise<any> {
return this.getProviderFromId(rootFolderId).uploadFile(fileDefinition, relativePath, rootFolderId, nodeBody, opts);
}
listRenditions(nodeId: string, opts?: any): Promise<RenditionPaging> {
return this.getProviderFromId(nodeId).listRenditions(nodeId, opts);
}
createRendition(nodeId: string, renditionBodyCreate: RenditionBodyCreate): Promise<any> {
return this.getProviderFromId(nodeId).createRendition(nodeId, renditionBodyCreate);
}
getRendition(nodeId: string, renditionId: string): Promise<RenditionEntry> {
return this.getProviderFromId(nodeId).getRendition(nodeId, renditionId);
}
getPerson(personId: string, opts?: any): Promise<PersonEntry> {
return this.defaultProvider.getPerson(personId, opts);
}
getRepositoryInformation(): Promise<DiscoveryEntry> {
return this.defaultProvider.getRepositoryInformation();
}
listFavorites(personId: string, opts?: any): Promise<FavoritePaging> {
return this.defaultProvider.listFavorites(personId, opts);
}
createFavorite(personId: string, favoriteBodyCreate: FavoriteBodyCreate, opts?: any): Promise<FavoriteEntry> {
return this.defaultProvider.createFavorite(personId, favoriteBodyCreate, opts);
}
deleteFavorite(personId: string, favoriteId: string): Promise<any> {
return this.getProviderFromId(favoriteId).deleteFavorite(personId, favoriteId);
}
search(request: SearchRequest): Promise<ResultSetPaging> {
const searchResultNodes: Promise<ResultSetPaging>[] = [];
this.providers.map(provider => searchResultNodes.push(provider.search(request)));
return Promise.all(searchResultNodes).then(nodes => this.mergeResultSetPaging(nodes));
}
deleteSite(siteId?: string, opts?: { permanent?: boolean }): Promise<any> {
return this.getProviderFromId(siteId).deleteSite(siteId, opts);
}
leaveSite(siteId?: string, personId?: string): Promise<any> {
return this.getProviderFromId(siteId).deleteSiteMembership(siteId, personId);
}
createSite(
siteBody: SiteBody,
opts?: {
fields?: Array<string>;
skipConfiguration?: boolean;
skipAddToFavorites?: boolean;
}
): Promise<SiteEntry> {
return this.getProviderFromId(siteBody.id).createSite(siteBody, opts);
}
getSite(siteId?: string, opts?: { relations?: Array<string>; fields?: Array<string> }): Promise<SiteEntry> {
return this.getProviderFromId(siteId).getSite(siteId, opts);
}
updateSite(siteId: string, siteBody: SiteBody): Promise<SiteEntry> {
return this.getProviderFromId(siteId).updateSite(siteId, siteBody);
}
getRecentFiles(personId: string, pagination: PaginationModel, filters?: string[]): Observable<ResultSetPaging> {
const resultSetPaging: Observable<ResultSetPaging>[] = [];
this.providers.map(provider => resultSetPaging.push(provider.getRecentFiles(personId, pagination, filters)));
return forkJoin(resultSetPaging).pipe(map(nodes => this.mergeResultSetPaging(nodes)));
}
loadFavorites(pagination: PaginationModel, includeFields: string[], where?: string): Observable<FavoritePaging> {
const paging: Observable<FavoritePaging>[] = [];
this.providers.map(provider => paging.push(provider.loadFavorites(pagination, includeFields, where)));
return forkJoin(paging).pipe(map(nodes => this.mergeFavoritePaging(nodes)));
}
loadMemberSites(pagination: PaginationModel, where?: string): Observable<SiteMemberPaging> {
const paging: Observable<SiteMemberPaging>[] = [];
this.providers.map(provider => paging.push(provider.loadMemberSites(pagination, where)));
return forkJoin(paging).pipe(map(nodes => this.mergeSiteMemberPaging(nodes)));
}
loadSites(pagination: PaginationModel, where?: string): Observable<SitePaging> {
const paging: Observable<SitePaging>[] = [];
this.providers.map(provider => paging.push(provider.loadSites(pagination, where)));
return forkJoin(paging).pipe(map(nodes => this.mergeSitePaging(nodes)));
}
loadTrashcan(pagination: PaginationModel, includeFields: string[]): Observable<DeletedNodesPaging> {
const paging: Observable<DeletedNodesPaging>[] = [];
this.providers.map(provider => paging.push(provider.loadTrashcan(pagination, includeFields)));
return forkJoin(paging).pipe(map(nodes => this.mergeDeletedNodesPaging(nodes)));
}
loadSharedLinks(pagination: PaginationModel, includeFields: string[], where?: string): Observable<SharedLinkPaging> {
const paging: Observable<SharedLinkPaging>[] = [];
this.providers.map(provider => paging.push(provider.loadSharedLinks(pagination, includeFields, where)));
return forkJoin(paging).pipe(map(nodes => this.mergeSharedLinkPaging(nodes)));
}
private mergeDeletedNodesPaging(nodes: DeletedNodesPaging[]): DeletedNodesPaging {
const result = new DeletedNodesPaging();
result.list = new DeletedNodesPagingList();
result.list.pagination = nodes[0].list.pagination;
result.list.entries = [];
nodes.map(node => result.list.entries = result.list.entries.concat(node.list.entries));
return result;
}
private mergeResultSetPaging(nodes: ResultSetPaging[]): ResultSetPaging {
const result = new ResultSetPaging();
result.list = new ResultSetPagingList();
result.list.pagination = nodes[0].list.pagination;
result.list.entries = [];
nodes.map(node => result.list.entries = result.list.entries.concat(node.list.entries));
return result;
}
private mergeFavoritePaging(nodes: FavoritePaging[]): FavoritePaging {
const result = new FavoritePaging();
result.list = new FavoritePagingList();
result.list.pagination = nodes[0].list.pagination;
result.list.entries = [];
nodes.map(node => result.list.entries = result.list.entries.concat(node.list.entries));
return result;
}
private mergeSiteMemberPaging(nodes: SiteMemberPaging[]): SiteMemberPaging {
const result = new SiteMemberPaging();
result.list = new SiteMemberPagingList();
result.list.pagination = nodes[0].list.pagination;
result.list.entries = [];
nodes.map(node => result.list.entries = result.list.entries.concat(node.list.entries));
return result;
}
private mergeSitePaging(nodes: SitePaging[]): SitePaging {
const result = new SitePaging();
result.list = new SitePagingList();
result.list.pagination = nodes[0].list.pagination;
result.list.entries = [];
nodes.map(node => result.list.entries = result.list.entries.concat(node.list.entries));
return result;
}
private mergeSharedLinkPaging(nodes: SharedLinkPaging[]): SharedLinkPaging {
const result = new SharedLinkPaging();
result.list = new SharedLinkPagingList();
result.list.pagination = nodes[0].list.pagination;
result.list.entries = [];
nodes.map(node => result.list.entries = result.list.entries.concat(node.list.entries));
return result;
}
} }

View File

@@ -18,30 +18,18 @@
import { Injectable } from '@angular/core'; import { Injectable } from '@angular/core';
import { Observable, from, of } from 'rxjs'; import { Observable, from, of } from 'rxjs';
import { NodePaging, NodesApi, TrashcanApi } from '@alfresco/js-api'; import { NodePaging } from '@alfresco/js-api';
import { AlfrescoApiService } from './alfresco-api.service';
import { UserPreferencesService } from './user-preferences.service'; import { UserPreferencesService } from './user-preferences.service';
import { catchError } from 'rxjs/operators'; import { catchError } from 'rxjs/operators';
import { ContentService } from './content.service';
@Injectable({ @Injectable({
providedIn: 'root' providedIn: 'root'
}) })
export class DeletedNodesApiService { export class DeletedNodesApiService {
_nodesApi: NodesApi;
get nodesApi(): NodesApi {
this._nodesApi = this._nodesApi ?? new NodesApi(this.apiService.getInstance());
return this._nodesApi;
}
_trashcanApi: TrashcanApi;
get trashcanApi(): TrashcanApi {
this._trashcanApi = this._trashcanApi ?? new TrashcanApi(this.apiService.getInstance());
return this._trashcanApi;
}
constructor( constructor(
private apiService: AlfrescoApiService, private contentService: ContentService,
private preferences: UserPreferencesService private preferences: UserPreferencesService
) { ) {
} }
@@ -58,7 +46,7 @@ export class DeletedNodesApiService {
skipCount: 0 skipCount: 0
}; };
const queryOptions = Object.assign(defaultOptions, options); const queryOptions = Object.assign(defaultOptions, options);
const promise = this.trashcanApi.listDeletedNodes(queryOptions); const promise = this.contentService.listDeletedNodes(queryOptions);
return from(promise).pipe( return from(promise).pipe(
catchError((err) => of(err)) catchError((err) => of(err))

View File

@@ -16,31 +16,19 @@
*/ */
import { Injectable } from '@angular/core'; import { Injectable } from '@angular/core';
import { MinimalNode, NodeEntry, NodePaging, NodesApi, TrashcanApi } from '@alfresco/js-api'; import { MinimalNode, NodeEntry, NodePaging } from '@alfresco/js-api';
import { from, Observable, throwError } from 'rxjs'; import { from, Observable, throwError } from 'rxjs';
import { AlfrescoApiService } from './alfresco-api.service';
import { UserPreferencesService } from './user-preferences.service'; import { UserPreferencesService } from './user-preferences.service';
import { catchError, map } from 'rxjs/operators'; import { catchError, map } from 'rxjs/operators';
import { NodeMetadata } from '../models/node-metadata.model'; import { NodeMetadata } from '../models/node-metadata.model';
import { ContentService } from './content.service';
@Injectable({ @Injectable({
providedIn: 'root' providedIn: 'root'
}) })
export class NodesApiService { export class NodesApiService {
_trashcanApi: TrashcanApi; constructor(private contentService: ContentService,
get trashcanApi(): TrashcanApi {
this._trashcanApi = this._trashcanApi ?? new TrashcanApi(this.apiService.getInstance());
return this._trashcanApi;
}
_nodesApi: NodesApi;
get nodesApi(): NodesApi {
this._nodesApi = this._nodesApi ?? new NodesApi(this.apiService.getInstance());
return this._nodesApi;
}
constructor(private apiService: AlfrescoApiService,
private preferences: UserPreferencesService) { private preferences: UserPreferencesService) {
} }
@@ -60,7 +48,7 @@ export class NodesApiService {
}; };
const queryOptions = Object.assign(defaults, options); const queryOptions = Object.assign(defaults, options);
return from(this.nodesApi.getNode(nodeId, queryOptions)).pipe( return this.contentService.getNode(nodeId, queryOptions).pipe(
map(this.getEntryFromEntity), map(this.getEntryFromEntity),
catchError((err) => throwError(err)) catchError((err) => throwError(err))
); );
@@ -80,7 +68,7 @@ export class NodesApiService {
}; };
const queryOptions = Object.assign(defaults, options); const queryOptions = Object.assign(defaults, options);
return from(this.nodesApi.listNodeChildren(nodeId, queryOptions)).pipe( return from(this.contentService.listNodeChildren(nodeId, queryOptions)).pipe(
catchError((err) => throwError(err)) catchError((err) => throwError(err))
); );
} }
@@ -93,7 +81,7 @@ export class NodesApiService {
* @returns Details of the new node * @returns Details of the new node
*/ */
createNode(parentNodeId: string, nodeBody: any, options: any = {}): Observable<MinimalNode> { createNode(parentNodeId: string, nodeBody: any, options: any = {}): Observable<MinimalNode> {
return from(this.nodesApi.createNode(parentNodeId, nodeBody, options)).pipe( return from(this.contentService.createNode(parentNodeId, nodeBody, options)).pipe(
map(this.getEntryFromEntity), map(this.getEntryFromEntity),
catchError((err) => throwError(err)) catchError((err) => throwError(err))
); );
@@ -124,7 +112,7 @@ export class NodesApiService {
}; };
const queryOptions = Object.assign(defaults, options); const queryOptions = Object.assign(defaults, options);
return from(this.nodesApi.updateNode(nodeId, nodeBody, queryOptions)).pipe( return from(this.contentService.updateNode(nodeId, nodeBody, queryOptions)).pipe(
map(this.getEntryFromEntity), map(this.getEntryFromEntity),
catchError((err) => throwError(err)) catchError((err) => throwError(err))
); );
@@ -137,7 +125,7 @@ export class NodesApiService {
* @returns Empty result that notifies when the deletion is complete * @returns Empty result that notifies when the deletion is complete
*/ */
deleteNode(nodeId: string, options: any = {}): Observable<any> { deleteNode(nodeId: string, options: any = {}): Observable<any> {
return from(this.nodesApi.deleteNode(nodeId, options)).pipe( return from(this.contentService.deleteNode(nodeId, options)).pipe(
catchError((err) => throwError(err)) catchError((err) => throwError(err))
); );
} }
@@ -148,7 +136,7 @@ export class NodesApiService {
* @returns Details of the restored node * @returns Details of the restored node
*/ */
restoreNode(nodeId: string): Observable<MinimalNode> { restoreNode(nodeId: string): Observable<MinimalNode> {
return from(this.trashcanApi.restoreDeletedNode(nodeId)).pipe( return from(this.contentService.restoreDeletedNode(nodeId)).pipe(
map(this.getEntryFromEntity), map(this.getEntryFromEntity),
catchError((err) => throwError(err)) catchError((err) => throwError(err))
); );
@@ -160,7 +148,7 @@ export class NodesApiService {
* @returns Node metadata * @returns Node metadata
*/ */
public getNodeMetadata(nodeId: string): Observable<NodeMetadata> { public getNodeMetadata(nodeId: string): Observable<NodeMetadata> {
return from(this.nodesApi.getNode(nodeId)) return this.contentService.getNode(nodeId)
.pipe(map(this.cleanMetadataFromSemicolon)); .pipe(map(this.cleanMetadataFromSemicolon));
} }
@@ -199,7 +187,7 @@ export class NodesApiService {
properties: properties, properties: properties,
relativePath: path relativePath: path
}; };
return from(this.nodesApi.createNode('-root-', body, {})); return from(this.contentService.createNode('-root-', body, {}));
} }
private generateUuid() { private generateUuid() {

View File

@@ -65,3 +65,5 @@ export * from './version-compatibility.service';
export * from './auth-bearer.interceptor'; export * from './auth-bearer.interceptor';
export * from './oauth2.service'; export * from './oauth2.service';
export * from './language.service'; export * from './language.service';
export * from './acs-content.service';
export * from './content-provider.service';

View File

@@ -16,29 +16,17 @@
*/ */
import { Injectable } from '@angular/core'; import { Injectable } from '@angular/core';
import { RenditionEntry, RenditionPaging, RenditionsApi, ContentApi } from '@alfresco/js-api'; import { RenditionEntry, RenditionPaging } from '@alfresco/js-api';
import { Observable, from, interval, empty } from 'rxjs'; import { Observable, from, interval, empty } from 'rxjs';
import { AlfrescoApiService } from './alfresco-api.service';
import { concatMap, switchMap, takeWhile, map } from 'rxjs/operators'; import { concatMap, switchMap, takeWhile, map } from 'rxjs/operators';
import { ContentService } from './content.service';
@Injectable({ @Injectable({
providedIn: 'root' providedIn: 'root'
}) })
export class RenditionsService { export class RenditionsService {
_renditionsApi: RenditionsApi; constructor(private contentService: ContentService) {
get renditionsApi(): RenditionsApi {
this._renditionsApi = this._renditionsApi ?? new RenditionsApi(this.apiService.getInstance());
return this._renditionsApi;
}
_contentApi: ContentApi;
get contentApi(): ContentApi {
this._contentApi = this._contentApi ?? new ContentApi(this.apiService.getInstance());
return this._contentApi;
}
constructor(private apiService: AlfrescoApiService) {
} }
/** /**
@@ -47,7 +35,7 @@ export class RenditionsService {
* @returns Information object for the rendition * @returns Information object for the rendition
*/ */
getAvailableRenditionForNode(nodeId: string): Observable<RenditionEntry> { getAvailableRenditionForNode(nodeId: string): Observable<RenditionEntry> {
return from(this.renditionsApi.listRenditions(nodeId)).pipe( return from(this.contentService.listRenditions(nodeId)).pipe(
map((availableRenditions: RenditionPaging) => { map((availableRenditions: RenditionPaging) => {
const renditionsAvailable: RenditionEntry[] = availableRenditions.list.entries.filter( const renditionsAvailable: RenditionEntry[] = availableRenditions.list.entries.filter(
(rendition) => (rendition.entry.id === 'pdf' || rendition.entry.id === 'imgpreview')); (rendition) => (rendition.entry.id === 'pdf' || rendition.entry.id === 'imgpreview'));
@@ -65,7 +53,7 @@ export class RenditionsService {
return this.getAvailableRenditionForNode(nodeId).pipe( return this.getAvailableRenditionForNode(nodeId).pipe(
map((rendition: RenditionEntry) => { map((rendition: RenditionEntry) => {
if (rendition.entry.status !== 'CREATED') { if (rendition.entry.status !== 'CREATED') {
return from(this.renditionsApi.createRendition(nodeId, { id: rendition.entry.id })); return from(this.contentService.createRendition(nodeId, { id: rendition.entry.id }));
} else { } else {
return empty(); return empty();
} }
@@ -126,7 +114,7 @@ export class RenditionsService {
* @returns URL string * @returns URL string
*/ */
getRenditionUrl(nodeId: string, encoding: string): string { getRenditionUrl(nodeId: string, encoding: string): string {
return this.contentApi.getRenditionUrl(nodeId, encoding); return this.contentService.getRenditionUrl(nodeId, encoding);
} }
/** /**
@@ -136,7 +124,7 @@ export class RenditionsService {
* @returns Information object about the rendition * @returns Information object about the rendition
*/ */
getRendition(nodeId: string, encoding: string): Observable<RenditionEntry> { getRendition(nodeId: string, encoding: string): Observable<RenditionEntry> {
return from(this.renditionsApi.getRendition(nodeId, encoding)); return from(this.contentService.getRendition(nodeId, encoding));
} }
/** /**
@@ -145,7 +133,7 @@ export class RenditionsService {
* @returns Paged list of rendition details * @returns Paged list of rendition details
*/ */
getRenditionsListByNodeId(nodeId: string): Observable<RenditionPaging> { getRenditionsListByNodeId(nodeId: string): Observable<RenditionPaging> {
return from(this.renditionsApi.listRenditions(nodeId)); return from(this.contentService.listRenditions(nodeId));
} }
/** /**
@@ -155,7 +143,7 @@ export class RenditionsService {
* @returns Null response to indicate completion * @returns Null response to indicate completion
*/ */
createRendition(nodeId: string, encoding: string): Observable<{}> { createRendition(nodeId: string, encoding: string): Observable<{}> {
return from(this.renditionsApi.createRendition(nodeId, { id: encoding })); return from(this.contentService.createRendition(nodeId, { id: encoding }));
} }
/** /**

View File

@@ -19,8 +19,8 @@
import { Injectable } from '@angular/core'; import { Injectable } from '@angular/core';
import { MatIconRegistry } from '@angular/material/icon'; import { MatIconRegistry } from '@angular/material/icon';
import { DomSanitizer } from '@angular/platform-browser'; import { DomSanitizer } from '@angular/platform-browser';
import { AlfrescoApiService } from './alfresco-api.service'; import { NodeEntry } from '@alfresco/js-api';
import { ContentApi, NodeEntry } from '@alfresco/js-api'; import { ContentService } from './content.service';
@Injectable({ @Injectable({
providedIn: 'root' providedIn: 'root'
@@ -164,13 +164,7 @@ export class ThumbnailService {
'task': './assets/images/task.svg' 'task': './assets/images/task.svg'
}; };
_contentApi: ContentApi; constructor(private contentService: ContentService, matIconRegistry: MatIconRegistry, sanitizer: DomSanitizer) {
get contentApi(): ContentApi {
this._contentApi = this._contentApi ?? new ContentApi(this.apiService.getInstance());
return this._contentApi;
}
constructor(protected apiService: AlfrescoApiService, matIconRegistry: MatIconRegistry, sanitizer: DomSanitizer) {
Object.keys(this.mimeTypeIcons).forEach((key) => { Object.keys(this.mimeTypeIcons).forEach((key) => {
const url = sanitizer.bypassSecurityTrustResourceUrl(this.mimeTypeIcons[key]); const url = sanitizer.bypassSecurityTrustResourceUrl(this.mimeTypeIcons[key]);
@@ -198,7 +192,7 @@ export class ThumbnailService {
nodeId = node.entry.id; nodeId = node.entry.id;
} }
resultUrl = this.contentApi.getDocumentThumbnailUrl(nodeId, attachment, ticket); resultUrl = this.contentService.getDocumentThumbnailUrl(nodeId, attachment, ticket);
} }
return resultUrl || this.DEFAULT_ICON; return resultUrl || this.DEFAULT_ICON;

View File

@@ -26,10 +26,9 @@ import {
FileUploadEvent FileUploadEvent
} from '../events/file.event'; } from '../events/file.event';
import { FileModel, FileUploadProgress, FileUploadStatus } from '../models/file.model'; import { FileModel, FileUploadProgress, FileUploadStatus } from '../models/file.model';
import { AlfrescoApiService } from './alfresco-api.service';
import { DiscoveryApiService } from './discovery-api.service'; import { DiscoveryApiService } from './discovery-api.service';
import { filter } from 'rxjs/operators'; import { filter } from 'rxjs/operators';
import { NodesApi, UploadApi, VersionsApi } from '@alfresco/js-api'; import { ContentService } from './content.service';
const MIN_CANCELLABLE_FILE_SIZE = 1000000; const MIN_CANCELLABLE_FILE_SIZE = 1000000;
const MAX_CANCELLABLE_FILE_PERCENTAGE = 50; const MAX_CANCELLABLE_FILE_PERCENTAGE = 50;
@@ -63,26 +62,8 @@ export class UploadService {
fileUploadDeleted: Subject<FileUploadDeleteEvent> = new Subject<FileUploadDeleteEvent>(); fileUploadDeleted: Subject<FileUploadDeleteEvent> = new Subject<FileUploadDeleteEvent>();
fileDeleted: Subject<string> = new Subject<string>(); fileDeleted: Subject<string> = new Subject<string>();
_uploadApi: UploadApi;
get uploadApi(): UploadApi {
this._uploadApi = this._uploadApi ?? new UploadApi(this.apiService.getInstance());
return this._uploadApi;
}
_nodesApi: NodesApi;
get nodesApi(): NodesApi {
this._nodesApi = this._nodesApi ?? new NodesApi(this.apiService.getInstance());
return this._nodesApi;
}
_versionsApi: VersionsApi;
get versionsApi(): VersionsApi {
this._versionsApi = this._versionsApi ?? new VersionsApi(this.apiService.getInstance());
return this._versionsApi;
}
constructor( constructor(
protected apiService: AlfrescoApiService, private contentService: ContentService,
private appConfigService: AppConfigService, private appConfigService: AppConfigService,
private discoveryApiService: DiscoveryApiService) { private discoveryApiService: DiscoveryApiService) {
@@ -260,9 +241,9 @@ export class UploadService {
} }
if (file.id) { if (file.id) {
return this.nodesApi.updateNodeContent(file.id, <any> file.file, opts); return this.contentService.updateNodeContent(file.id, <any> file.file, opts);
} else { } else {
return this.uploadApi.uploadFile( return this.contentService.uploadFile(
file.file, file.file,
file.options.path, file.options.path,
file.options.parentId, file.options.parentId,
@@ -422,12 +403,12 @@ export class UploadService {
} }
private deleteAbortedNode(nodeId: string) { private deleteAbortedNode(nodeId: string) {
this.nodesApi.deleteNode(nodeId, { permanent: true }) this.contentService.deleteNode(nodeId, { permanent: true })
.then(() => (this.abortedFile = undefined)); .then(() => (this.abortedFile = undefined));
} }
private deleteAbortedNodeVersion(nodeId: string, versionId: string) { private deleteAbortedNodeVersion(nodeId: string, versionId: string) {
this.versionsApi.deleteVersion(nodeId, versionId) this.contentService.deleteVersion(nodeId, versionId)
.then(() => (this.abortedFile = undefined)); .then(() => (this.abortedFile = undefined));
} }

View File

@@ -26,8 +26,7 @@ import {
Version, Version,
RenditionEntry, RenditionEntry,
NodeEntry, NodeEntry,
VersionEntry, VersionEntry
SharedlinksApi, VersionsApi, NodesApi, ContentApi
} from '@alfresco/js-api'; } from '@alfresco/js-api';
import { BaseEvent } from '../../events'; import { BaseEvent } from '../../events';
import { AlfrescoApiService } from '../../services/alfresco-api.service'; import { AlfrescoApiService } from '../../services/alfresco-api.service';
@@ -257,31 +256,8 @@ export class ViewerComponent implements OnChanges, OnInit, OnDestroy {
private shouldCloseViewer = true; private shouldCloseViewer = true;
private keyDown$ = fromEvent<KeyboardEvent>(document, 'keydown'); private keyDown$ = fromEvent<KeyboardEvent>(document, 'keydown');
_sharedLinksApi: SharedlinksApi; constructor(
get sharedLinksApi(): SharedlinksApi { private apiService: AlfrescoApiService,
this._sharedLinksApi = this._sharedLinksApi ?? new SharedlinksApi(this.apiService.getInstance());
return this._sharedLinksApi;
}
_versionsApi: VersionsApi;
get versionsApi(): VersionsApi {
this._versionsApi = this._versionsApi ?? new VersionsApi(this.apiService.getInstance());
return this._versionsApi;
}
_nodesApi: NodesApi;
get nodesApi(): NodesApi {
this._nodesApi = this._nodesApi ?? new NodesApi(this.apiService.getInstance());
return this._nodesApi;
}
_contentApi: ContentApi;
get contentApi(): ContentApi {
this._contentApi = this._contentApi ?? new ContentApi(this.apiService.getInstance());
return this._contentApi;
}
constructor(private apiService: AlfrescoApiService,
private viewUtilService: ViewUtilService, private viewUtilService: ViewUtilService,
private logService: LogService, private logService: LogService,
private extensionService: AppExtensionService, private extensionService: AppExtensionService,
@@ -371,7 +347,7 @@ export class ViewerComponent implements OnChanges, OnInit, OnDestroy {
private setupSharedLink() { private setupSharedLink() {
this.allowGoBack = false; this.allowGoBack = false;
this.sharedLinksApi.getSharedLink(this.sharedLinkId).then( this.contentService.getSharedLink(this.sharedLinkId).then(
(sharedLinkEntry: SharedLinkEntry) => { (sharedLinkEntry: SharedLinkEntry) => {
this.setUpSharedLinkFile(sharedLinkEntry); this.setUpSharedLinkFile(sharedLinkEntry);
this.isLoading = false; this.isLoading = false;
@@ -384,11 +360,11 @@ export class ViewerComponent implements OnChanges, OnInit, OnDestroy {
} }
private setupNode() { private setupNode() {
this.nodesApi.getNode(this.nodeId, { include: ['allowableOperations'] }).then( this.contentService.getNode(this.nodeId, { include: ['allowableOperations'] }).subscribe(
(node: NodeEntry) => { (node: NodeEntry) => {
this.nodeEntry = node; this.nodeEntry = node;
if (this.versionId) { if (this.versionId) {
this.versionsApi.getVersion(this.nodeId, this.versionId).then( this.contentService.getVersion(this.nodeId, this.versionId).then(
(version: VersionEntry) => { (version: VersionEntry) => {
this.versionEntry = version; this.versionEntry = version;
this.setUpNodeFile(node.entry, version.entry).then(() => { this.setUpNodeFile(node.entry, version.entry).then(() => {
@@ -454,8 +430,8 @@ export class ViewerComponent implements OnChanges, OnInit, OnDestroy {
const currentFileVersion = this.nodeEntry?.entry?.properties && this.nodeEntry.entry.properties['cm:versionLabel'] ? const currentFileVersion = this.nodeEntry?.entry?.properties && this.nodeEntry.entry.properties['cm:versionLabel'] ?
encodeURI(this.nodeEntry?.entry?.properties['cm:versionLabel']) : encodeURI('1.0'); encodeURI(this.nodeEntry?.entry?.properties['cm:versionLabel']) : encodeURI('1.0');
this.urlFileContent = versionData ? this.contentApi.getVersionContentUrl(this.nodeId, versionData.id) : this.urlFileContent = versionData ? this.contentService.getVersionContentUrl(this.nodeId, versionData.id) :
this.contentApi.getContentUrl(this.nodeId); this.contentService.getContentUrl(this.nodeId);
this.urlFileContent = this.cacheBusterNumber ? this.urlFileContent + '&' + currentFileVersion + '&' + this.cacheBusterNumber : this.urlFileContent = this.cacheBusterNumber ? this.urlFileContent + '&' + currentFileVersion + '&' + this.cacheBusterNumber :
this.urlFileContent + '&' + currentFileVersion; this.urlFileContent + '&' + currentFileVersion;
@@ -490,7 +466,7 @@ export class ViewerComponent implements OnChanges, OnInit, OnDestroy {
this.extension = this.getFileExtension(details.entry.name); this.extension = this.getFileExtension(details.entry.name);
this.fileName = details.entry.name; this.fileName = details.entry.name;
this.urlFileContent = this.contentApi.getSharedLinkContentUrl(this.sharedLinkId, false); this.urlFileContent = this.contentService.getSharedLinkContentUrl(this.sharedLinkId, false);
this.viewerType = this.getViewerTypeByMimeType(this.mimeType); this.viewerType = this.getViewerTypeByMimeType(this.mimeType);
if (this.viewerType === 'unknown') { if (this.viewerType === 'unknown') {
@@ -507,8 +483,8 @@ export class ViewerComponent implements OnChanges, OnInit, OnDestroy {
toggleSidebar() { toggleSidebar() {
this.showRightSidebar = !this.showRightSidebar; this.showRightSidebar = !this.showRightSidebar;
if (this.showRightSidebar && this.nodeId) { if (this.showRightSidebar && this.nodeId) {
this.nodesApi.getNode(this.nodeId, { include: ['allowableOperations'] }) this.contentService.getNode(this.nodeId, { include: ['allowableOperations'] })
.then((nodeEntry: NodeEntry) => { .subscribe((nodeEntry: NodeEntry) => {
this.sidebarRightTemplateContext.node = nodeEntry.entry; this.sidebarRightTemplateContext.node = nodeEntry.entry;
}); });
} }
@@ -517,8 +493,8 @@ export class ViewerComponent implements OnChanges, OnInit, OnDestroy {
toggleLeftSidebar() { toggleLeftSidebar() {
this.showLeftSidebar = !this.showLeftSidebar; this.showLeftSidebar = !this.showLeftSidebar;
if (this.showRightSidebar && this.nodeId) { if (this.showRightSidebar && this.nodeId) {
this.nodesApi.getNode(this.nodeId, { include: ['allowableOperations'] }) this.contentService.getNode(this.nodeId, { include: ['allowableOperations'] })
.then((nodeEntry: NodeEntry) => { .subscribe((nodeEntry: NodeEntry) => {
this.sidebarLeftTemplateContext.node = nodeEntry.entry; this.sidebarLeftTemplateContext.node = nodeEntry.entry;
}); });
} }
@@ -702,18 +678,18 @@ export class ViewerComponent implements OnChanges, OnInit, OnDestroy {
private async displaySharedLinkRendition(sharedId: string) { private async displaySharedLinkRendition(sharedId: string) {
try { try {
const rendition: RenditionEntry = await this.sharedLinksApi.getSharedLinkRendition(sharedId, 'pdf'); const rendition: RenditionEntry = await this.contentService.getSharedLinkRendition(sharedId, 'pdf');
if (rendition.entry.status.toString() === 'CREATED') { if (rendition.entry.status.toString() === 'CREATED') {
this.viewerType = 'pdf'; this.viewerType = 'pdf';
this.urlFileContent = this.contentApi.getSharedLinkRenditionUrl(sharedId, 'pdf'); this.urlFileContent = this.contentService.getSharedLinkRenditionUrl(sharedId, 'pdf');
} }
} catch (error) { } catch (error) {
this.logService.error(error); this.logService.error(error);
try { try {
const rendition: RenditionEntry = await this.sharedLinksApi.getSharedLinkRendition(sharedId, 'imgpreview'); const rendition: RenditionEntry = await this.contentService.getSharedLinkRendition(sharedId, 'imgpreview');
if (rendition.entry.status.toString() === 'CREATED') { if (rendition.entry.status.toString() === 'CREATED') {
this.viewerType = 'image'; this.viewerType = 'image';
this.urlFileContent = this.contentApi.getSharedLinkRenditionUrl(sharedId, 'imgpreview'); this.urlFileContent = this.contentService.getSharedLinkRenditionUrl(sharedId, 'imgpreview');
} }
} catch (error) { } catch (error) {
this.logService.error(error); this.logService.error(error);

View File

@@ -16,12 +16,12 @@
*/ */
import { Injectable } from '@angular/core'; import { Injectable } from '@angular/core';
import { ContentApi, RenditionEntry, RenditionPaging, RenditionsApi, VersionsApi } from '@alfresco/js-api'; import { RenditionEntry, RenditionPaging } from '@alfresco/js-api';
import { AlfrescoApiService } from '../../services/alfresco-api.service';
import { LogService } from '../../services/log.service'; import { LogService } from '../../services/log.service';
import { Subject } from 'rxjs'; import { Subject } from 'rxjs';
import { Track } from '../models/viewer.model'; import { Track } from '../models/viewer.model';
import { TranslationService } from '../../services/translation.service'; import { TranslationService } from '../../services/translation.service';
import { ContentService } from '../../services/content.service';
@Injectable({ @Injectable({
providedIn: 'root' providedIn: 'root'
@@ -74,25 +74,7 @@ export class ViewUtilService {
viewerTypeChange: Subject<string> = new Subject<string>(); viewerTypeChange: Subject<string> = new Subject<string>();
urlFileContentChange: Subject<string> = new Subject<string>(); urlFileContentChange: Subject<string> = new Subject<string>();
_renditionsApi: RenditionsApi; constructor(private contentService: ContentService,
get renditionsApi(): RenditionsApi {
this._renditionsApi = this._renditionsApi ?? new RenditionsApi(this.apiService.getInstance());
return this._renditionsApi;
}
_contentApi: ContentApi;
get contentApi(): ContentApi {
this._contentApi = this._contentApi ?? new ContentApi(this.apiService.getInstance());
return this._contentApi;
}
_versionsApi: VersionsApi;
get versionsApi(): VersionsApi {
this._versionsApi = this._versionsApi ?? new VersionsApi(this.apiService.getInstance());
return this._versionsApi;
}
constructor(private apiService: AlfrescoApiService,
private logService: LogService, private logService: LogService,
private translateService: TranslationService) { private translateService: TranslationService) {
} }
@@ -147,12 +129,12 @@ export class ViewUtilService {
getRenditionUrl(nodeId: string, type: string, renditionExists: boolean): string { getRenditionUrl(nodeId: string, type: string, renditionExists: boolean): string {
return (renditionExists && type !== ViewUtilService.ContentGroup.IMAGE) ? return (renditionExists && type !== ViewUtilService.ContentGroup.IMAGE) ?
this.contentApi.getRenditionUrl(nodeId, ViewUtilService.ContentGroup.PDF) : this.contentService.getRenditionUrl(nodeId, ViewUtilService.ContentGroup.PDF) :
this.contentApi.getContentUrl(nodeId, false); this.contentService.getContentUrl(nodeId, false);
} }
private async waitRendition(nodeId: string, renditionId: string, retries: number): Promise<RenditionEntry> { private async waitRendition(nodeId: string, renditionId: string, retries: number): Promise<RenditionEntry> {
const rendition = await this.renditionsApi.getRendition(nodeId, renditionId); const rendition = await this.contentService.getRendition(nodeId, renditionId);
if (this.maxRetries < retries) { if (this.maxRetries < retries) {
const status = rendition.entry.status.toString(); const status = rendition.entry.status.toString();
@@ -188,7 +170,7 @@ export class ViewUtilService {
} }
async getRendition(nodeId: string, renditionId: string): Promise<RenditionEntry> { async getRendition(nodeId: string, renditionId: string): Promise<RenditionEntry> {
const renditionPaging: RenditionPaging = await this.renditionsApi.listRenditions(nodeId); const renditionPaging: RenditionPaging = await this.contentService.listRenditions(nodeId);
let rendition: RenditionEntry = renditionPaging.list.entries.find((renditionEntry: RenditionEntry) => renditionEntry.entry.id.toLowerCase() === renditionId); let rendition: RenditionEntry = renditionPaging.list.entries.find((renditionEntry: RenditionEntry) => renditionEntry.entry.id.toLowerCase() === renditionId);
if (rendition) { if (rendition) {
@@ -196,7 +178,7 @@ export class ViewUtilService {
if (status === 'NOT_CREATED') { if (status === 'NOT_CREATED') {
try { try {
await this.renditionsApi.createRendition(nodeId, { id: renditionId }); await this.contentService.createRendition(nodeId, { id: renditionId });
rendition = await this.waitRendition(nodeId, renditionId, 0); rendition = await this.waitRendition(nodeId, renditionId, 0);
} catch (err) { } catch (err) {
this.logService.error(err); this.logService.error(err);
@@ -219,8 +201,8 @@ export class ViewUtilService {
this.viewerTypeChange.next('image'); this.viewerTypeChange.next('image');
} }
const urlFileContent = versionId ? this.contentApi.getVersionRenditionUrl(nodeId, versionId, renditionId) : const urlFileContent = versionId ? this.contentService.getVersionRenditionUrl(nodeId, versionId, renditionId) :
this.contentApi.getRenditionUrl(nodeId, renditionId); this.contentService.getRenditionUrl(nodeId, renditionId);
this.urlFileContentChange.next(urlFileContent); this.urlFileContentChange.next(urlFileContent);
} }
} catch (err) { } catch (err) {
@@ -231,8 +213,8 @@ export class ViewUtilService {
private async resolveNodeRendition(nodeId: string, renditionId: string, versionId?: string): Promise<RenditionEntry> { private async resolveNodeRendition(nodeId: string, renditionId: string, versionId?: string): Promise<RenditionEntry> {
renditionId = renditionId.toLowerCase(); renditionId = renditionId.toLowerCase();
const supportedRendition: RenditionPaging = versionId ? await this.versionsApi.listVersionRenditions(nodeId, versionId) : const supportedRendition: RenditionPaging = versionId ? await this.contentService.listVersionRenditions(nodeId, versionId) :
await this.renditionsApi.listRenditions(nodeId); await this.contentService.listRenditions(nodeId);
let rendition: RenditionEntry = supportedRendition.list.entries.find((renditionEntry: RenditionEntry) => renditionEntry.entry.id.toLowerCase() === renditionId); let rendition: RenditionEntry = supportedRendition.list.entries.find((renditionEntry: RenditionEntry) => renditionEntry.entry.id.toLowerCase() === renditionId);
if (!rendition) { if (!rendition) {
@@ -246,11 +228,11 @@ export class ViewUtilService {
if (status === 'NOT_CREATED') { if (status === 'NOT_CREATED') {
try { try {
if (versionId) { if (versionId) {
await this.versionsApi.createVersionRendition(nodeId, versionId, { id: renditionId }).then(() => { await this.contentService.createVersionRendition(nodeId, versionId, { id: renditionId }).then(() => {
this.viewerTypeChange.next('in_creation'); this.viewerTypeChange.next('in_creation');
}); });
} else { } else {
await this.renditionsApi.createRendition(nodeId, { id: renditionId }).then(() => { await this.contentService.createRendition(nodeId, { id: renditionId }).then(() => {
this.viewerTypeChange.next('in_creation'); this.viewerTypeChange.next('in_creation');
}); });
} }
@@ -277,7 +259,7 @@ export class ViewUtilService {
currentRetry++; currentRetry++;
if (this.maxRetries >= currentRetry) { if (this.maxRetries >= currentRetry) {
if (versionId) { if (versionId) {
this.versionsApi.getVersionRendition(nodeId, versionId, renditionId).then((rendition: RenditionEntry) => { this.contentService.getVersionRendition(nodeId, versionId, renditionId).then((rendition: RenditionEntry) => {
const status: string = rendition.entry.status.toString(); const status: string = rendition.entry.status.toString();
if (status === 'CREATED') { if (status === 'CREATED') {
@@ -289,7 +271,7 @@ export class ViewUtilService {
return reject(); return reject();
}); });
} else { } else {
this.renditionsApi.getRendition(nodeId, renditionId).then((rendition: RenditionEntry) => { this.contentService.getRendition(nodeId, renditionId).then((rendition: RenditionEntry) => {
const status: string = rendition.entry.status.toString(); const status: string = rendition.entry.status.toString();
if (status === 'CREATED') { if (status === 'CREATED') {
@@ -316,8 +298,8 @@ export class ViewUtilService {
this.viewerTypeChange.next('image'); this.viewerTypeChange.next('image');
} }
const urlFileContent = versionId ? this.contentApi.getVersionRenditionUrl(nodeId, versionId, renditionId) : const urlFileContent = versionId ? this.contentService.getVersionRenditionUrl(nodeId, versionId, renditionId) :
this.contentApi.getRenditionUrl(nodeId, renditionId); this.contentService.getRenditionUrl(nodeId, renditionId);
this.urlFileContentChange.next(urlFileContent); this.urlFileContentChange.next(urlFileContent);
} }
@@ -328,7 +310,7 @@ export class ViewUtilService {
if (value) { if (value) {
tracks.push({ tracks.push({
kind: 'subtitles', kind: 'subtitles',
src: this.contentApi.getRenditionUrl(nodeId, ViewUtilService.SUBTITLES_RENDITION_NAME), src: this.contentService.getRenditionUrl(nodeId, ViewUtilService.SUBTITLES_RENDITION_NAME),
label: this.translateService.instant('ADF_VIEWER.SUBTITLES') label: this.translateService.instant('ADF_VIEWER.SUBTITLES')
}); });
} }
@@ -342,7 +324,7 @@ export class ViewUtilService {
} }
private async isRenditionAvailable(nodeId: string, renditionId: string): Promise<boolean> { private async isRenditionAvailable(nodeId: string, renditionId: string): Promise<boolean> {
const renditionPaging: RenditionPaging = await this.renditionsApi.listRenditions(nodeId); const renditionPaging: RenditionPaging = await this.contentService.listRenditions(nodeId);
const rendition: RenditionEntry = renditionPaging.list.entries.find((renditionEntry: RenditionEntry) => renditionEntry.entry.id.toLowerCase() === renditionId); const rendition: RenditionEntry = renditionPaging.list.entries.find((renditionEntry: RenditionEntry) => renditionEntry.entry.id.toLowerCase() === renditionId);
return rendition?.entry?.status?.toString() === 'CREATED' || false; return rendition?.entry?.status?.toString() === 'CREATED' || false;

View File

@@ -26,10 +26,10 @@ import {
FormValues, FormValues,
ContentLinkModel, ContentLinkModel,
AppConfigService, AppConfigService,
AlfrescoApiService, UploadWidgetContentLinkModel,
UploadWidgetContentLinkModel ContentService
} from '@alfresco/adf-core'; } from '@alfresco/adf-core';
import { Node, NodesApi, RelatedContentRepresentation } from '@alfresco/js-api'; import { Node, RelatedContentRepresentation } from '@alfresco/js-api';
import { ContentCloudNodeSelectorService } from '../../../services/content-cloud-node-selector.service'; import { ContentCloudNodeSelectorService } from '../../../services/content-cloud-node-selector.service';
import { ProcessCloudContentService } from '../../../services/process-cloud-content.service'; import { ProcessCloudContentService } from '../../../services/process-cloud-content.service';
import { UploadCloudWidgetComponent } from './upload-cloud.widget'; import { UploadCloudWidgetComponent } from './upload-cloud.widget';
@@ -67,12 +67,6 @@ export class AttachFileCloudWidgetComponent extends UploadCloudWidgetComponent i
rootNodeId = AttachFileCloudWidgetComponent.ALIAS_USER_FOLDER; rootNodeId = AttachFileCloudWidgetComponent.ALIAS_USER_FOLDER;
selectedNode: Node; selectedNode: Node;
_nodesApi: NodesApi;
get nodesApi(): NodesApi {
this._nodesApi = this._nodesApi ?? new NodesApi(this.apiService.getInstance());
return this._nodesApi;
}
constructor( constructor(
formService: FormService, formService: FormService,
logger: LogService, logger: LogService,
@@ -81,7 +75,7 @@ export class AttachFileCloudWidgetComponent extends UploadCloudWidgetComponent i
notificationService: NotificationService, notificationService: NotificationService,
private contentNodeSelectorService: ContentCloudNodeSelectorService, private contentNodeSelectorService: ContentCloudNodeSelectorService,
private appConfigService: AppConfigService, private appConfigService: AppConfigService,
private apiService: AlfrescoApiService, private contentService: ContentService,
private contentNodeSelectorPanelService: ContentNodeSelectorPanelService private contentNodeSelectorPanelService: ContentNodeSelectorPanelService
) { ) {
super(formService, thumbnails, processCloudContentService, notificationService, logger); super(formService, thumbnails, processCloudContentService, notificationService, logger);
@@ -228,7 +222,7 @@ export class AttachFileCloudWidgetComponent extends UploadCloudWidgetComponent i
contentModelFormFileHandler(file?: any) { contentModelFormFileHandler(file?: any) {
if (file?.id && this.isRetrieveMetadataOptionEnabled()) { if (file?.id && this.isRetrieveMetadataOptionEnabled()) {
const values: FormValues = {}; const values: FormValues = {};
this.nodesApi.getNode(file.id).then(acsNode => { this.contentService.getNode(file.id).subscribe(acsNode => {
const metadata = acsNode?.entry?.properties; const metadata = acsNode?.entry?.properties;
if (metadata) { if (metadata) {
const keys = Object.keys(metadata); const keys = Object.keys(metadata);

View File

@@ -16,14 +16,14 @@
*/ */
import { Injectable } from '@angular/core'; import { Injectable } from '@angular/core';
import { AlfrescoApiService, NotificationService } from '@alfresco/adf-core'; import { ContentService, NotificationService } from '@alfresco/adf-core';
import { MatDialog } from '@angular/material/dialog'; import { MatDialog } from '@angular/material/dialog';
import { import {
ContentNodeSelectorComponent, ContentNodeSelectorComponent,
ContentNodeSelectorComponentData, ContentNodeSelectorComponentData,
NodeAction NodeAction
} from '@alfresco/adf-content-services'; } from '@alfresco/adf-content-services';
import { Node, NodesApi } from '@alfresco/js-api'; import { Node } from '@alfresco/js-api';
import { Observable, Subject, throwError } from 'rxjs'; import { Observable, Subject, throwError } from 'rxjs';
@Injectable({ @Injectable({
@@ -31,16 +31,10 @@ import { Observable, Subject, throwError } from 'rxjs';
}) })
export class ContentCloudNodeSelectorService { export class ContentCloudNodeSelectorService {
_nodesApi: NodesApi;
get nodesApi(): NodesApi {
this._nodesApi = this._nodesApi ?? new NodesApi(this.apiService.getInstance());
return this._nodesApi;
}
sourceNodeNotFound = false; sourceNodeNotFound = false;
constructor( constructor(
private apiService: AlfrescoApiService, private contentService: ContentService,
private notificationService: NotificationService, private notificationService: NotificationService,
private dialog: MatDialog) { private dialog: MatDialog) {
} }
@@ -65,8 +59,9 @@ export class ContentCloudNodeSelectorService {
} }
async fetchNodeIdFromRelativePath(alias: string, opts: { relativePath: string }): Promise<string> { async fetchNodeIdFromRelativePath(alias: string, opts: { relativePath: string }): Promise<string> {
const relativePathNodeEntry: any = await this.nodesApi const relativePathNodeEntry: any = await this.contentService
.getNode(alias, opts) .getNode(alias, opts)
.toPromise()
.catch((err) => { .catch((err) => {
this.sourceNodeNotFound = true; this.sourceNodeNotFound = true;
return this.handleError(err); return this.handleError(err);
@@ -75,8 +70,9 @@ export class ContentCloudNodeSelectorService {
} }
async fetchAliasNodeId(alias: string): Promise<string> { async fetchAliasNodeId(alias: string): Promise<string> {
const aliasNodeEntry: any = await this.nodesApi const aliasNodeEntry: any = await this.contentService
.getNode(alias) .getNode(alias)
.toPromise()
.catch((err) => this.handleError(err)); .catch((err) => this.handleError(err));
return aliasNodeEntry?.entry?.id; return aliasNodeEntry?.entry?.id;
} }

View File

@@ -15,7 +15,7 @@
* limitations under the License. * limitations under the License.
*/ */
import { AlfrescoApiService, AppConfigService, DiscoveryApiService, UploadService } from '@alfresco/adf-core'; import { AlfrescoApiService, AppConfigService, ContentService, DiscoveryApiService, UploadService } from '@alfresco/adf-core';
import { ActivitiContentApi } from '@alfresco/js-api'; import { ActivitiContentApi } from '@alfresco/js-api';
import { Injectable } from '@angular/core'; import { Injectable } from '@angular/core';
import { throwError } from 'rxjs'; import { throwError } from 'rxjs';
@@ -31,8 +31,13 @@ export class ProcessUploadService extends UploadService {
return this._contentApi; return this._contentApi;
} }
constructor(protected apiService: AlfrescoApiService, appConfigService: AppConfigService, discoveryApiService: DiscoveryApiService) { constructor(
super(apiService, appConfigService, discoveryApiService); contentService: ContentService,
protected apiService: AlfrescoApiService,
appConfigService: AppConfigService,
discoveryApiService: DiscoveryApiService
) {
super(contentService, appConfigService, discoveryApiService);
} }
getUploadPromise(file: any): any { getUploadPromise(file: any): any {

View File

@@ -15,7 +15,7 @@
* limitations under the License. * limitations under the License.
*/ */
import { AlfrescoApiService, AppConfigService, DiscoveryApiService, UploadService } from '@alfresco/adf-core'; import { AlfrescoApiService, AppConfigService, ContentService, DiscoveryApiService, UploadService } from '@alfresco/adf-core';
import { Injectable } from '@angular/core'; import { Injectable } from '@angular/core';
import { throwError } from 'rxjs'; import { throwError } from 'rxjs';
import { ActivitiContentApi } from '@alfresco/js-api'; import { ActivitiContentApi } from '@alfresco/js-api';
@@ -31,8 +31,13 @@ export class TaskUploadService extends UploadService {
return this._contentApi; return this._contentApi;
} }
constructor(protected apiService: AlfrescoApiService, appConfigService: AppConfigService, discoveryApiService: DiscoveryApiService) { constructor(
super(apiService, appConfigService, discoveryApiService); contentService: ContentService,
protected apiService: AlfrescoApiService,
appConfigService: AppConfigService,
discoveryApiService: DiscoveryApiService
) {
super(contentService, appConfigService, discoveryApiService);
} }
getUploadPromise(file: any): any { getUploadPromise(file: any): any {