/*!
* @license
* Alfresco Example Content Application
*
* Copyright (C) 2005 - 2020 Alfresco Software Limited
*
* This file is part of the Alfresco Example Content Application.
* If the software was purchased under a paid Alfresco license, the terms of
* the paid license agreement will prevail. Otherwise, the software is
* provided under the following open source license terms:
*
* The Alfresco Example Content Application is free software: you can redistribute it and/or modify
* it under the terms of the GNU Lesser General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* The Alfresco Example Content Application is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public License
* along with Alfresco. If not, see .
*/
import { Injectable } from '@angular/core';
import { AlfrescoApiService, UserPreferencesService } from '@alfresco/adf-core';
import { Observable, from } from 'rxjs';
import {
MinimalNodeEntity,
NodePaging,
Node,
DeletedNodesPaging,
PersonEntry,
NodeEntry,
DiscoveryEntry,
FavoritePaging,
SharedLinkPaging,
SearchRequest,
ResultSetPaging,
SiteBody,
SiteEntry,
FavoriteBody,
FavoriteEntry
} from '@alfresco/js-api';
import { map } from 'rxjs/operators';
@Injectable({
providedIn: 'root'
})
export class ContentApiService {
constructor(private api: AlfrescoApiService, private preferences: UserPreferencesService) {}
/**
* Moves a node to the trashcan.
* @param nodeId ID of the target node
* @param options Optional parameters supported by JS-API
* @returns Empty result that notifies when the deletion is complete
*/
deleteNode(nodeId: string, options: { permanent?: boolean } = {}): Observable {
return from(this.api.nodesApi.deleteNode(nodeId, options));
}
/**
* Gets the stored information about a node.
* @param nodeId ID of the target node
* @param options Optional parameters supported by JS-API
* @returns Node information
*/
getNode(nodeId: string, options: any = {}): Observable {
const defaults = {
include: ['path', 'properties', 'allowableOperations', 'permissions', 'definition']
};
const queryOptions = Object.assign(defaults, options);
return from(this.api.nodesApi.getNode(nodeId, queryOptions));
}
getNodeInfo(nodeId: string, options?: any): Observable {
const defaults = {
include: ['isFavorite', 'allowableOperations', 'path', 'definition']
};
const queryOptions = Object.assign(defaults, options || {});
return from(this.api.nodesApi.getNodeInfo(nodeId, queryOptions));
}
/**
* Gets the items contained in a folder node.
* @param nodeId ID of the target node
* @param options Optional parameters supported by JS-API
* @returns List of child items from the folder
*/
getNodeChildren(nodeId: string, options: any = {}): Observable {
const defaults = {
maxItems: this.preferences.paginationSize,
skipCount: 0,
include: ['isLocked', 'path', 'properties', 'allowableOperations', 'permissions']
};
const queryOptions = Object.assign(defaults, options);
return from(this.api.nodesApi.getNodeChildren(nodeId, queryOptions));
}
deleteSharedLink(linkId: string): Observable {
return from(this.api.sharedLinksApi.deleteSharedLink(linkId));
}
getDeletedNodes(options: any = {}): Observable {
const defaults = {
include: ['path']
};
const queryOptions = Object.assign(defaults, options);
return from(this.api.nodesApi.getDeletedNodes(queryOptions));
}
restoreNode(nodeId: string): Observable {
return from(this.api.nodesApi.restoreNode(nodeId));
}
purgeDeletedNode(nodeId: string): Observable {
return from(this.api.nodesApi.purgeDeletedNode(nodeId));
}
/**
* Gets information about a user identified by their username.
* @param personId ID of the target user
* @returns User information
*/
getPerson(personId: string, options?: { fields?: Array }): Observable {
return from(this.api.peopleApi.getPerson(personId, options));
}
/**
* Copy a node to destination node
*
* @param nodeId The id of the node to be copied
* @param targetParentId The id of the folder-node where the node have to be copied to
* @param name The new name for the copy that would be added on the destination folder
*/
copyNode(nodeId: string, targetParentId: string, name?: string, opts?: { include?: Array; fields?: Array }): Observable {
return from(this.api.nodesApi.copyNode(nodeId, { targetParentId, name }, opts));
}
/**
* Gets product information for Content Services.
* @returns ProductVersionModel containing product details
*/
getRepositoryInformation(): Observable {
return from(this.api.getInstance().discovery.discoveryApi.getRepositoryInformation());
}
getFavorites(
personId: string,
opts?: {
skipCount?: number;
maxItems?: number;
where?: string;
fields?: Array;
}
): Observable {
return from(this.api.favoritesApi.getFavorites(personId, opts));
}
getFavoriteLibraries(personId: string = '-me-', opts?: any): Observable {
return this.getFavorites(personId, {
...opts,
where: '(EXISTS(target/site))'
}).pipe(
map((response: FavoritePaging) => {
return {
list: {
entries: response.list.entries.map(({ entry }: any) => {
entry.target.site.createdAt = entry.createdAt;
return {
entry: entry.target.site
};
}),
pagination: response.list.pagination
}
};
})
);
}
findSharedLinks(opts?: any): Observable {
return from(this.api.sharedLinksApi.findSharedLinks(opts));
}
getSharedLinkContent(sharedId: string, attachment?: boolean): string {
return this.api.contentApi.getSharedLinkContentUrl(sharedId, attachment);
}
search(request: SearchRequest): Observable {
return from(this.api.searchApi.search(request));
}
getContentUrl(nodeId: string, attachment?: boolean): string {
return this.api.contentApi.getContentUrl(nodeId, attachment);
}
getVersionContentUrl(nodeId: string, versionId: string, attachment?: boolean): string {
return this.api.contentApi.getVersionContentUrl(nodeId, versionId, attachment);
}
deleteSite(siteId?: string, opts?: { permanent?: boolean }): Observable {
return from(this.api.sitesApi.deleteSite(siteId, opts));
}
leaveSite(siteId?: string): Observable {
return from(this.api.sitesApi.removeSiteMember(siteId, '-me-'));
}
createSite(
siteBody: SiteBody,
opts?: {
fields?: Array;
skipConfiguration?: boolean;
skipAddToFavorites?: boolean;
}
): Observable {
return from(this.api.sitesApi.createSite(siteBody, opts));
}
getSite(siteId?: string, opts?: { relations?: Array; fields?: Array }): Observable {
return from(this.api.sitesApi.getSite(siteId, opts));
}
updateLibrary(siteId: string, siteBody: SiteBody): Observable {
return from(this.api.sitesApi.updateSite(siteId, siteBody));
}
addFavorite(nodes: Array): Observable {
const payload: FavoriteBody[] = nodes.map((node) => {
const { isFolder, nodeId, id } = node.entry as any;
const siteId = node.entry['guid'];
const type = siteId ? 'site' : isFolder ? 'folder' : 'file';
const guid = siteId || nodeId || id;
return {
target: {
[type]: {
guid
}
}
};
});
return from(this.api.favoritesApi.addFavorite('-me-', payload as any));
}
removeFavorite(nodes: Array): Observable {
return from(
Promise.all(
nodes.map((node: any) => {
const id = node.entry.nodeId || node.entry.id;
return this.api.favoritesApi.removeFavoriteSite('-me-', id);
})
)
);
}
unlockNode(nodeId: string, opts?: any) {
return this.api.nodesApi.unlockNode(nodeId, opts);
}
}