184 lines
5.4 KiB
JavaScript
184 lines
5.4 KiB
JavaScript
import { isDesktopApplication, dictToArray } from '@/utils';
|
|
import {
|
|
SNPredicate,
|
|
ContentTypes,
|
|
CreateMaxPayloadFromAnyObject,
|
|
ApplicationService
|
|
} from 'snjs';
|
|
|
|
const STREAM_ITEMS_PERMISSION = 'stream-items';
|
|
|
|
/** A class for handling installation of system extensions */
|
|
export class NativeExtManager extends ApplicationService {
|
|
/* @ngInject */
|
|
constructor(application) {
|
|
super(application);
|
|
this.extManagerId = 'org.standardnotes.extensions-manager';
|
|
this.batchManagerId = 'org.standardnotes.batch-manager';
|
|
}
|
|
|
|
/** @override */
|
|
onAppLaunch() {
|
|
super.onAppLaunch();
|
|
this.reload();
|
|
}
|
|
|
|
get extManagerPred() {
|
|
const extManagerId = 'org.standardnotes.extensions-manager';
|
|
return SNPredicate.CompoundPredicate([
|
|
new SNPredicate('content_type', '=', ContentTypes.Component),
|
|
new SNPredicate('package_info.identifier', '=', extManagerId)
|
|
]);
|
|
}
|
|
|
|
get batchManagerPred() {
|
|
const batchMgrId = 'org.standardnotes.batch-manager';
|
|
return SNPredicate.CompoundPredicate([
|
|
new SNPredicate('content_type', '=', ContentTypes.Component),
|
|
new SNPredicate('package_info.identifier', '=', batchMgrId)
|
|
]);
|
|
}
|
|
|
|
reload() {
|
|
this.application.singletonManager.registerPredicate(this.extManagerPred);
|
|
this.application.singletonManager.registerPredicate(this.batchManagerPred);
|
|
this.resolveExtensionsManager();
|
|
this.resolveBatchManager();
|
|
}
|
|
|
|
async resolveExtensionsManager() {
|
|
const extensionsManager = await this.application.singletonManager.findOrCreateSingleton({
|
|
predicate: this.extManagerPred,
|
|
createPayload: this.extensionsManagerTemplatePayload()
|
|
});
|
|
let needsSync = false;
|
|
if (isDesktopApplication()) {
|
|
if (!extensionsManager.local_url) {
|
|
extensionsManager.local_url = window._extensions_manager_location;
|
|
needsSync = true;
|
|
}
|
|
} else {
|
|
if (!extensionsManager.hosted_url) {
|
|
extensionsManager.hosted_url = window._extensions_manager_location;
|
|
needsSync = true;
|
|
}
|
|
}
|
|
// Handle addition of SN|ExtensionRepo permission
|
|
const permission = extensionsManager.content.permissions.find((p) => p.name === STREAM_ITEMS_PERMISSION);
|
|
if (!permission.content_types.includes(ContentTypes.ExtensionRepo)) {
|
|
permission.content_types.push(ContentTypes.ExtensionRepo);
|
|
needsSync = true;
|
|
}
|
|
if (needsSync) {
|
|
this.application.saveItem({ item: extensionsManager });
|
|
}
|
|
}
|
|
|
|
extensionsManagerTemplatePayload() {
|
|
const url = window._extensions_manager_location;
|
|
if (!url) {
|
|
console.error('window._extensions_manager_location must be set.');
|
|
return;
|
|
}
|
|
const packageInfo = {
|
|
name: 'Extensions',
|
|
identifier: this.extManagerId
|
|
};
|
|
const content = {
|
|
name: packageInfo.name,
|
|
area: 'rooms',
|
|
package_info: packageInfo,
|
|
permissions: [
|
|
{
|
|
name: STREAM_ITEMS_PERMISSION,
|
|
content_types: [
|
|
ContentTypes.Component,
|
|
ContentTypes.Theme,
|
|
ContentTypes.ServerExtension,
|
|
ContentTypes.ActionsExtension,
|
|
ContentTypes.Mfa,
|
|
ContentTypes.Editor,
|
|
ContentTypes.ExtensionRepo
|
|
]
|
|
}
|
|
]
|
|
};
|
|
if (isDesktopApplication()) {
|
|
content.local_url = window._extensions_manager_location;
|
|
} else {
|
|
content.hosted_url = window._extensions_manager_location;
|
|
}
|
|
const payload = CreateMaxPayloadFromAnyObject({
|
|
object: {
|
|
content_type: ContentTypes.Component,
|
|
content: content
|
|
}
|
|
});
|
|
return payload;
|
|
}
|
|
|
|
batchManagerTemplatePayload() {
|
|
const url = window._batch_manager_location;
|
|
if (!url) {
|
|
console.error('window._batch_manager_location must be set.');
|
|
return;
|
|
}
|
|
const packageInfo = {
|
|
name: 'Batch Manager',
|
|
identifier: this.batchManagerId
|
|
};
|
|
const allContentTypes = dictToArray(ContentTypes);
|
|
const content = {
|
|
name: packageInfo.name,
|
|
area: 'modal',
|
|
package_info: packageInfo,
|
|
permissions: [
|
|
{
|
|
name: STREAM_ITEMS_PERMISSION,
|
|
content_types: allContentTypes
|
|
}
|
|
]
|
|
};
|
|
if (isDesktopApplication()) {
|
|
content.local_url = window._batch_manager_location;
|
|
} else {
|
|
content.hosted_url = window._batch_manager_location;
|
|
}
|
|
const payload = CreateMaxPayloadFromAnyObject({
|
|
object: {
|
|
content_type: ContentTypes.Component,
|
|
content: content
|
|
}
|
|
});
|
|
return payload;
|
|
}
|
|
|
|
async resolveBatchManager() {
|
|
const batchManager = await this.application.singletonManager.findOrCreateSingleton({
|
|
predicate: this.batchManagerPred,
|
|
createPayload: this.batchManagerTemplatePayload()
|
|
});
|
|
let needsSync = false;
|
|
if (isDesktopApplication()) {
|
|
if (!batchManager.local_url) {
|
|
batchManager.local_url = window._batch_manager_location;
|
|
needsSync = true;
|
|
}
|
|
} else {
|
|
if (!batchManager.hosted_url) {
|
|
batchManager.hosted_url = window._batch_manager_location;
|
|
needsSync = true;
|
|
}
|
|
}
|
|
// Handle addition of SN|ExtensionRepo permission
|
|
const permission = batchManager.content.permissions.find((p) => p.name === STREAM_ITEMS_PERMISSION);
|
|
if (!permission.content_types.includes(ContentTypes.ExtensionRepo)) {
|
|
permission.content_types.push(ContentTypes.ExtensionRepo);
|
|
needsSync = true;
|
|
}
|
|
if (needsSync) {
|
|
this.application.saveItem({ item: batchManager });
|
|
}
|
|
}
|
|
}
|