Overview
The FolderService manages folder organization for vault items. Folders provide a way to categorize and organize ciphers within a user’s personal vault.
Source: libs/common/src/vault/services/folder/folder.service.ts
Key Features
- Create, read, update, and delete folders
- Encrypt and decrypt folder data
- Observable-based folder state management
- Automatic “None” folder for unorganized items
- Key rotation support
Observables
folders$
Observable that emits encrypted folders for a user.
Parameters:
userId: UserId - The user ID to get folders for
Returns: Observable of encrypted folder domain objects
Example:
folderViews$
Observable that emits decrypted folder views for a user.
Parameters:
userId: UserId - The user ID to get folder views for
Returns: Observable of decrypted folder views, includes automatic “None” folder
Example:
getDecrypted$
Observable for a single decrypted folder by ID.
Parameters:
id: string - The folder ID
userId: UserId - The user ID
Returns: Observable that emits the folder view or undefined if not found
Core Methods
encrypt
Encrypts a folder view for storage.
Parameters:
model: FolderView - The folder view to encrypt
key: SymmetricCryptoKey - The encryption key (typically user key)
Returns: Promise resolving to encrypted folder
Example:
get
Retrieves a single encrypted folder by ID.
Parameters:
id: string - The folder ID
userId: UserId - The user ID
Returns: Promise resolving to the folder, or undefined if not found
getAllFromState
Retrieves all folders from state.
Parameters:
userId: UserId - The user ID
Returns: Promise resolving to array of all folders
getAllDecryptedFromState
Retrieves all decrypted folders from state.
Parameters:
userId: UserId - The user ID
Returns: Promise resolving to array of decrypted folder views
This method is deprecated and only recommended for CLI usage. Use folderViews$ observable instead for reactive updates.
CRUD Operations
upsert
Inserts or updates folder data in storage.
Parameters:
folderData: FolderData | FolderData[] - Single folder or array of folders to upsert
userId: UserId - The user ID
Example:
replace
Replaces all folders for a user.
Parameters:
folders: { [id: string]: FolderData } - Object mapping folder IDs to folder data
userId: UserId - The user ID
Note: This is typically used during sync operations to replace all local folder data.
delete
Deletes one or more folders.
Parameters:
id: string | string[] - Folder ID or array of folder IDs to delete
userId: UserId - The user ID
Behavior:
- Deletes the folder from storage
- Automatically reassigns ciphers in the deleted folder to “No Folder”
- Updates cipher data to set
folderId to null
Example:
clear
Clears all folder data for a user.
Parameters:
userId: UserId - The user ID
Note: This is typically called during logout or account switching.
Key Rotation
getRotatedData
Generates re-encrypted folder data for key rotation.
Parameters:
originalUserKey: UserKey - The original user key (not currently used in implementation)
newUserKey: UserKey - The new user key to encrypt with
userId: UserId - The user ID
Returns: Promise resolving to array of re-encrypted folders for server update
Example:
Cache Management
clearDecryptedFolderState
Clears the decrypted folder cache.
Parameters:
userId: UserId - The user ID
Note: This forces folders to be decrypted again on next access. Called automatically during upsert operations.
Folder Structure
FolderView
Decrypted folder view object.
Properties:
id: string - Unique folder identifier
name: string - Decrypted folder name
revisionDate: Date - Last modification date
Folder
Encrypted folder domain object.
Properties:
id: string - Unique folder identifier
name: EncString - Encrypted folder name
revisionDate: Date - Last modification date
FolderData
Raw folder data for storage.
Special Folders
None Folder
The service automatically adds a “None” folder to the folder list:
Characteristics:
- No ID (used for ciphers with
folderId === null)
- Localized name from i18n service
- Always appears in folder lists
- Cannot be deleted or modified
- Represents unorganized items
Usage Examples
Creating a New Folder
Listing All Folders
Moving Cipher to Folder
Deleting a Folder
Implementation Notes
Observable Caching
The service maintains a cache of folder view observables to prevent duplicate decryption:
Force Emission
The service uses subjects to force emission of empty arrays during cleanup:
This ensures that subscribers receive updates when folder data is cleared.
- Cipher Service - Manages vault items that can be organized in folders
- Key Service - Provides encryption keys for folder encryption
See Also