Skip to main content

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