diff --git a/api/server/services/UserService.js b/api/server/services/UserService.js index 6c736e4366..c8f8e966ce 100644 --- a/api/server/services/UserService.js +++ b/api/server/services/UserService.js @@ -93,7 +93,7 @@ const getUserKeyExpiry = async ({ userId, name }) => { if (!keyValue) { return { expiresAt: null }; } - return { expiresAt: keyValue.expiresAt }; + return { expiresAt: keyValue.expiresAt || 'never' }; }; /** @@ -108,18 +108,23 @@ const getUserKeyExpiry = async ({ userId, name }) => { * @description This function either updates an existing user key or inserts a new one into the database, * after encrypting the provided value. It sets the provided expiry date for the key. */ -const updateUserKey = async ({ userId, name, value, expiresAt }) => { +const updateUserKey = async ({ userId, name, value, expiresAt = null }) => { const encryptedValue = encrypt(value); - return await Key.findOneAndUpdate( - { userId, name }, - { - userId, - name, - value: encryptedValue, - expiresAt: new Date(expiresAt), - }, - { upsert: true, new: true }, - ).lean(); + let updateObject = { + userId, + name, + value: encryptedValue, + }; + + // Only add expiresAt to the update object if it's not null + if (expiresAt) { + updateObject.expiresAt = new Date(expiresAt); + } + + return await Key.findOneAndUpdate({ userId, name }, updateObject, { + upsert: true, + new: true, + }).lean(); }; /** diff --git a/client/src/components/Input/SetKeyDialog/SetKeyDialog.tsx b/client/src/components/Input/SetKeyDialog/SetKeyDialog.tsx index 0b748a02b7..cb5b0fd469 100644 --- a/client/src/components/Input/SetKeyDialog/SetKeyDialog.tsx +++ b/client/src/components/Input/SetKeyDialog/SetKeyDialog.tsx @@ -41,6 +41,7 @@ const EXPIRY = { ONE_DAY: { display: 'in 1 day', value: 24 * 60 * 60 * 1000 }, ONE_WEEK: { display: 'in 7 days', value: 7 * 24 * 60 * 60 * 1000 }, ONE_MONTH: { display: 'in 30 days', value: 30 * 24 * 60 * 60 * 1000 }, + NEVER: { display: 'never', value: 0 }, }; const SetKeyDialog = ({ @@ -84,7 +85,13 @@ const SetKeyDialog = ({ const submit = () => { const selectedOption = expirationOptions.find((option) => option.display === expiresAtLabel); - const expiresAt = Date.now() + (selectedOption ? selectedOption.value : 0); + let expiresAt; + + if (selectedOption?.value === 0) { + expiresAt = null; + } else { + expiresAt = Date.now() + (selectedOption ? selectedOption.value : 0); + } const saveKey = (key: string) => { saveUserKey(key, expiresAt); @@ -160,12 +167,12 @@ const SetKeyDialog = ({ main={
- {`${localize('com_endpoint_config_key_encryption')} ${ - !expiryTime - ? localize('com_endpoint_config_key_expiry') - : `${new Date(expiryTime).toLocaleString()}` - }`} - + {expiryTime === 'never' + ? localize('com_endpoint_config_key_never_expires') + : `${localize('com_endpoint_config_key_encryption')} ${new Date( + expiryTime, + ).toLocaleString()}`} + {' '} { const updateKey = useUpdateUserKeysMutation(); const checkUserKey = useUserKeyQuery(keyName); + const getExpiry = useCallback(() => { if (checkUserKey.data) { - return checkUserKey.data.expiresAt; + return checkUserKey.data?.expiresAt || 'never'; } }, [checkUserKey.data]); const checkExpiry = useCallback(() => { const expiresAt = getExpiry(); if (!expiresAt) { - return false; + return true; } const expiresAtDate = new Date(expiresAt); @@ -41,8 +42,8 @@ const useUserKey = (endpoint: string) => { }, [getExpiry]); const saveUserKey = useCallback( - (userKey: string, expiresAt: number) => { - const dateStr = new Date(expiresAt).toISOString(); + (userKey: string, expiresAt: number | null) => { + const dateStr = expiresAt ? new Date(expiresAt).toISOString() : ''; updateKey.mutate({ name: keyName, value: userKey, diff --git a/client/src/localization/languages/Eng.ts b/client/src/localization/languages/Eng.ts index 587660395e..f8ac6445c6 100644 --- a/client/src/localization/languages/Eng.ts +++ b/client/src/localization/languages/Eng.ts @@ -507,6 +507,7 @@ export default { com_endpoint_config_value: 'Enter value for', com_endpoint_config_key_name_placeholder: 'Set API key first', com_endpoint_config_key_encryption: 'Your key will be encrypted and deleted at', + com_endpoint_config_key_never_expires: 'Your key will never expire', com_endpoint_config_key_expiry: 'the expiry time', com_endpoint_config_click_here: 'Click Here', com_endpoint_config_google_service_key: 'Google Service Account Key',