Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion package.json
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
{
"version": "1.0.1",
"version": "1.0.2",
"keywords": [],
"type": "commonjs",
"exports": {
Expand Down
147 changes: 91 additions & 56 deletions server/src/services/settings.service.ts
Original file line number Diff line number Diff line change
Expand Up @@ -2,77 +2,112 @@ import { Core } from '@strapi/strapi';
import { PLUGIN_ID, Settings } from '../../../common';
import { clearImageKitClient } from './upload.service';

const DEFAULTS: Settings = {
enabled: false,
publicKey: '',
privateKey: '',
urlEndpoint: '',
useSignedUrls: false,
uploadEnabled: false,
expiry: 0,
uploadOptions: {
tags: [],
folder: '',
overwriteTags: false,
overwriteCustomMetadata: false,
checks: '',
isPrivateFile: false,
},
};

function isNonEmptyString(v: unknown): boolean {
return typeof v === 'string' && v.trim().length > 0;
}

function isConfigUsable(config: Partial<Settings> | undefined): boolean {
if (!config) return false;
return (
isNonEmptyString(config.publicKey) &&
isNonEmptyString(config.urlEndpoint) &&
isNonEmptyString(config.privateKey)
);
}

/** Shallow merge defaults with candidate, returning full Settings */
function fillWithDefaults(candidate: Partial<Settings> | undefined): Settings {
return {
...DEFAULTS,
...candidate,
uploadOptions: {
...DEFAULTS.uploadOptions,
...(candidate?.uploadOptions ?? {}),
},
};
}

const settingsService = ({ strapi }: { strapi: Core.Strapi }) => {
function getPluginStore() {
if (strapi.store) {
return strapi.store({ type: 'plugin', name: PLUGIN_ID });
}
return strapi.store
? strapi.store({ type: 'plugin', name: PLUGIN_ID })
: { get: async () => DEFAULTS, set: async () => {}, delete: async () => {} };
}

function getConfigFromFile(): Partial<Settings> {
const plugin = strapi.plugin(PLUGIN_ID);
return {
get: async () => {
return {
enabled: false,
publicKey: '',
privateKey: '',
urlEndpoint: '',
useSignedUrls: false,
uploadEnabled: false,
expiry: 0,
uploadOptions: {
tags: [],
folder: '',
overwriteTags: false,
overwriteCustomMetadata: false,
checks: '',
isPrivateFile: false,
},
useTransformUrls: false,
};
enabled: plugin.config<boolean>('enabled'),
publicKey: plugin.config<string>('publicKey'),
privateKey: plugin.config<string>('privateKey'),
urlEndpoint: plugin.config<string>('urlEndpoint'),
useSignedUrls: plugin.config<boolean>('useSignedUrls'),
uploadEnabled: plugin.config<boolean>('uploadEnabled'),
expiry: plugin.config<number>('expiry'),
uploadOptions: {
tags: plugin.config<string[]>('uploadOptions.tags'),
folder: plugin.config<string>('uploadOptions.folder'),
overwriteTags: plugin.config<boolean>('uploadOptions.overwriteTags'),
overwriteCustomMetadata: plugin.config<boolean>('uploadOptions.overwriteCustomMetadata'),
checks: plugin.config<string>('uploadOptions.checks'),
isPrivateFile: plugin.config<boolean>('uploadOptions.isPrivateFile'),
},
set: async () => {},
delete: async () => {},
};
}

async function getConfigFromDb(): Promise<Partial<Settings> | undefined> {
try {
return (await getPluginStore().get({ key: 'config' })) as Partial<Settings>;
} catch {
return undefined;
}
}

async function getSettings(): Promise<Settings> {
const pluginStore = getPluginStore();
const config = (await pluginStore.get({ key: 'config' })) as Settings;
return config;
const dbCfg = await getConfigFromDb();
if (isConfigUsable(dbCfg)) {
return fillWithDefaults(dbCfg);
}

const fileCfg = getConfigFromFile();
if (isConfigUsable(fileCfg)) {
return fillWithDefaults(fileCfg);
}

return DEFAULTS;
}

async function updateSettings(settings: Settings): Promise<Settings> {
const pluginStore = getPluginStore();
await pluginStore.set({ key: 'config', value: settings });
const store = getPluginStore();
await store.set({ key: 'config', value: settings });
clearImageKitClient();
return await getSettings();
}

function getLocalConfig(): Settings {
const plugin = strapi.plugin(PLUGIN_ID);
return {
enabled: plugin.config<boolean>('enabled', false),
publicKey: plugin.config<string>('publicKey', ''),
privateKey: plugin.config<string>('privateKey', ''),
urlEndpoint: plugin.config<string>('urlEndpoint', ''),
useSignedUrls: plugin.config<boolean>('useSignedUrls', false),
uploadEnabled: plugin.config<boolean>('uploadEnabled', false),
expiry: plugin.config<number>('expiry', 0),
uploadOptions: {
tags: plugin.config<string[]>('uploadOptions.tags', []),
folder: plugin.config<string>('uploadOptions.folder', ''),
overwriteTags: plugin.config<boolean>('uploadOptions.overwriteTags', false),
overwriteCustomMetadata: plugin.config<boolean>(
'uploadOptions.overwriteCustomMetadata',
false
),
checks: plugin.config<string>('uploadOptions.checks', ''),
isPrivateFile: plugin.config<boolean>('uploadOptions.isPrivateFile', false),
},
};
return getSettings();
}

async function restoreConfig(): Promise<Settings> {
await updateSettings(getLocalConfig());
return await getSettings();
const fileCfg = getConfigFromFile();
const store = getPluginStore();
await store.set({ key: 'config', value: fillWithDefaults(fileCfg) });
clearImageKitClient();
return getSettings();
}

return { getSettings, updateSettings, restoreConfig };
Expand Down