Skip to main content
Version: Next

Settings Domain Design

Document Type: Domain Design (Tier 2) Domain: SETTINGS (SITE, CLIENTCFG, USERSET) Domain Character: Configuration-heavy SRS References: site.md, client-config.md, user-settings.md Status: Draft Last Updated: 2026-01-25


1. Overview

1.1 Purpose

The Settings domain provides centralized management of organizational, client-level, and user-level configuration across the PCR Analysis System. It implements a three-tier settings hierarchy with distinct ownership, precedence, and scoping rules:

TierEntityScopeManaged By
SiteOrganizational unitStorage paths, multi-site modeAdmin, Super Admin
Client ConfigurationSystem behaviorFeature toggles, data handlingSuper User
User SettingsDisplay preferencesTimezone, date/time format, display nameAuthenticated user

This domain is characterized by:

  • CRUD-heavy operations with validation at each tier
  • Precedence hierarchy: Site → Client → User (higher tiers constrain lower)
  • Multi-site data isolation via site-scoped queries
  • Import/export functionality for client configuration bulk transfer
  • Immediate application of settings upon save (no restart required)

1.2 Requirements Covered

REQ IDTitleTier
REQ-SITE-001Provision Storage on Site CreationSite
REQ-SITE-002Configure S3 Structure PreservationSite
REQ-SITE-003Specify Custom S3 Folder NameSite
REQ-SITE-004Modify Custom S3 Folder NameSite
REQ-SITE-005Enforce Multi-site Mode RestrictionsSite
REQ-CLIENTCFG-001View and Edit Client Configuration SettingsClient
REQ-CLIENTCFG-002Export Client ConfigurationClient
REQ-CLIENTCFG-003Import Client ConfigurationClient
REQ-USERSET-001Manage User Display PreferencesUser
REQ-USERSET-002Validate Display Name UniquenessUser

1.3 Constraints

Tier 2 Constraint: This document describes ownership, patterns, and design rationale. It links to reference docs for full schemas. It does not duplicate validation rules documented in the SRS acceptance criteria.

1.4 Dependencies

DirectionDomain/ComponentPurpose
Provides toFILEIMPORTSite-scoped storage paths
LIMS ExportS3 folder structure for exports
ANALYTICSFeature toggles, analysis options
REPORTSDisplay options, export preferences
Global UIUser timezone, date/time format, feature visibility
ConsumesAmazon S3Storage folder creation
AWS CognitoUser identity for preferences

2. Component Architecture

2.1 Component Diagram

2.2 Component Responsibilities

ComponentTypeResponsibilityREQ Trace
SitesControllerControllerSite CRUD operationsREQ-SITE-001, 003, 004
SitesEnableControllerControllerEnable siteREQ-SITE-005
SitesDisableControllerControllerDisable siteREQ-SITE-005
PreserveS3StructureForFirstSiteControllerControllerToggle S3 preservationREQ-SITE-002
UseMultipleSitesFeatureControllerControllerToggle multi-site modeREQ-SITE-005
StoreSiteActionActionCreate site with storageREQ-SITE-001, 003
UpdateSiteActionActionUpdate site propertiesREQ-SITE-004
CreateStorageForSiteActionActionProvision S3 foldersREQ-SITE-001, 003, 004
ClientConfigurationsControllerControllerConfiguration CRUDREQ-CLIENTCFG-001
ConfigDataControllerControllerImport/export orchestrationREQ-CLIENTCFG-002, 003
GetClientConfigurationsActionActionRetrieve with computed disabled stateREQ-CLIENTCFG-001
UpdateClientConfigurationActionActionUpdate with cascade handlingREQ-CLIENTCFG-001
ClientConfigurationEnableStateCheckerActionRuntime dependency evaluationREQ-CLIENTCFG-001
AuthUserControllerControllerUser profile and settingsREQ-USERSET-001
UpdateAuthUserActionActionPersist user preferencesREQ-USERSET-001, 002

2.3 Architectural Patterns

Pattern: Three-Tier Settings Hierarchy

Settings cascade from site to client to user level with clear precedence:

Site Settings (organizational boundaries)
├── Multi-site mode enabled/disabled
├── S3 storage paths
└── Site enable/disable state


Client Configuration (system behavior)
├── Feature toggles (affect all users)
├── Data handling rules
└── Export preferences


User Settings (personal preferences)
├── Timezone
├── Date/time format
└── Display name

Pattern: Site-Scoped Queries

All configuration queries are scoped by site for multi-site clients:

// Client configurations are site-scoped
ClientConfiguration::where('site_id', $currentSite->id)->get();

// Features are site-scoped
Feature::where('site_id', $currentSite->id)->get();

Pattern: Configuration Dependency Cascade

Client configurations have dependencies that disable related settings:

Inherit Run Date = ENABLED
└── Westgard Second Priority Ordering = DISABLED (greyed out)

Prevent Drag/Drop Import = ENABLED
└── Upload Button Import = DISABLED

Pattern: Immediate Application

All settings take effect immediately upon save without requiring application restart.


3. Data Design

3.1 Entity Ownership

This domain owns the following entities:

EntityTablePurposeKey Relationships
SitesitesOrganizational unit→ client_configurations, features, users
ClientConfigurationclient_configurationsSystem settings→ site
FeaturefeaturesFeature toggles→ site
User.settingsusers (JSON column)User preferences→ user
User.display_nameusersUser identifier→ user

See Database Reference for full schema.

3.2 Entity Relationship Overview

3.3 Configuration Types

Client Configuration Types:

TypeValueDescriptionExample
BOOLEAN1Toggle switchfallback_shared_controls_enabled
TEXT2Text inputN/A (not currently used)
OPTIONS3Dropdown selectlims_export_location
MULTISELECT4Multi-selectallowed_characters_in_accessions

Configuration Groups:

GroupOrderExamples
Login/User Management Options1User type restrictions
Import/Data Options2Drag/drop, unknown mix handling
Export Options3LIMS location, CSV settings
Display Options4Comment count, hyperlinks
Edit/Manage Results Options5Role priority resolution
Westgard Options6Priority ordering

3.4 Setting Precedence

When multi-site mode is disabled, certain settings are constrained:

ConditionConstrained Settings
Multi-site mode disabledSite creation, site editing, S3 preservation toggle
Inherit Run Date enabledWestgard second priority ordering
Prevent drag/drop enabledUpload button import

4. Interface Design

4.1 APIs Provided

Site Management:

EndpointMethodPurposeREQ Trace
/api/sitesGET/POSTList/create sitesREQ-SITE-001, 003
/api/sites/{id}PUTUpdate siteREQ-SITE-004
/api/sites/{id}/enablePOSTEnable siteREQ-SITE-005
/api/sites/{id}/disablePOSTDisable siteREQ-SITE-005
/api/preserve-s3-structure-for-first-sitePUTToggle S3 preservationREQ-SITE-002
/api/use-multiple-sitesPUTToggle multi-site modeREQ-SITE-005
/api/auth-user/change-logged-in-sitePUTSwitch active siteREQ-SITE-005
/api/auth-user/visible-sitesGETList user's visible sitesREQ-SITE-005

Client Configuration:

EndpointMethodPurposeREQ Trace
/api/client-configurationsGETList all configurationsREQ-CLIENTCFG-001
/api/client-configurations/{id}PUTUpdate configurationREQ-CLIENTCFG-001
/api/client-configuration-settings/{name}GETGet setting by nameREQ-CLIENTCFG-001
/api/config-data/exportGETExport all configurationREQ-CLIENTCFG-002
/api/config-data/importPOSTImport configurationREQ-CLIENTCFG-003

User Settings:

EndpointMethodPurposeREQ Trace
/api/auth-userGETGet current user with settingsREQ-USERSET-001
/api/auth-userPUTUpdate user settingsREQ-USERSET-001, 002

4.2 Events Published

EventPayloadPurposeListener
SiteCreatedsite_id, user_idAudit trailLogIntoDatabase
SiteEnabledsite_id, user_idAudit trailLogIntoDatabase
SiteDisabledsite_id, user_idAudit trailLogIntoDatabase
ClientConfigurationUpdatedconfig_name, old_value, new_valueAudit trailLogIntoDatabase

5. Behavioral Design

5.1 Site Creation Flow

Algorithm: Create Site with Storage

Inputs:
- name: Site name
- custom_s3_folder_name: Optional custom folder name
- authUser: Authenticated user

Outputs:
- site: Created Site entity

Assumptions:
- Multi-site mode is enabled
- User has Admin role or higher
- S3 is accessible

Steps:
1. Begin database transaction
2. Create Site record:
a. Set name
b. Set custom_s3_folder_name (nullable)
3. Attach site to system user (for system operations)
4. Create storage for site (via CreateStorageForSiteAction):
a. Determine storage directory based on site settings
b. Create LIMS_Reports folder
c. Create Runs/Completed_files folder
5. Copy default client configurations from current site
6. Copy default features from current site
7. Commit transaction
8. Return created site

Notes:
- Transaction ensures atomicity
- Storage creation failure rolls back entire operation
- Default configurations inherited from user's current site

5.2 S3 Storage Path Resolution

Algorithm: Resolve Site Storage Directory

Inputs:
- site: Site entity
- config: Configuration repository

Outputs:
- path: Storage directory path (may be empty for root-level)

Steps:
1. If site is NOT the default (first) site:
a. Return custom_s3_folder_name if set, else site name
2. If site IS the default site:
a. If multi-site feature disabled: Return "" (root-level)
b. If preserve_s3_structure enabled: Return "" (root-level)
c. Else: Return custom_s3_folder_name if set, else site name

Notes:
- Empty string means use root-level folders: <env>/LIMS_Export, <env>/Runs
- Non-empty means use site-specific: <env>/<path>/LIMS_Export, <env>/<path>/Runs
- Changing toggle does NOT migrate existing files

5.3 Client Configuration Update with Dependencies

Algorithm: Update Client Configuration

Inputs:
- configuration: ClientConfiguration entity
- value: New value

Outputs:
- void (side effects on configuration)

Assumptions:
- User has Super User role
- Value is valid for configuration type

Steps:
1. Cast value based on configuration type:
a. BOOLEAN: Convert to 'TRUE'/'FALSE' string
b. MULTISELECT: JSON encode array
c. OPTIONS/TEXT: Use as-is
2. Persist new value
3. Get affected configurations (if any):
a. Look up dependency chain from AffectedClientConfigurations
b. If parent config affects this one, mark as disabled in response
4. For cascade effects:
a. Inherit Run Date → disables Westgard second priority
b. Prevent drag/drop → disables upload button

Notes:
- Dependencies are enforced at UI level (disabled state)
- No automatic value changes on cascade
- All configurations site-scoped

5.4 User Settings Update

Algorithm: Update User Display Preferences

Inputs:
- user: Authenticated User entity
- details: Collection with settings, display_name

Outputs:
- user: Updated User entity

Assumptions:
- User is authenticated
- Display name (if provided) meets length constraint

Steps:
1. Extract settings array (timezone, date_format, time_format)
2. Extract display_name (optional)
3. Validate display_name:
a. Check max length (40 characters)
b. Check uniqueness (if implementing REQ-USERSET-002)
4. Force-fill user record:
a. settings = JSON of preferences
b. display_name = provided value
5. Save user
6. Return updated user

Notes:
- Settings are stored as JSON in user record
- Display name uniqueness validation gap in current implementation
- Timezone applied at frontend display time

6. Error Handling

ConditionDetectionResponseUser Impact
S3 folder creation failsStorage API exceptionRoll back site creationSite not created, error message
Configuration validation failsType/options mismatchReject updateSetting not saved, error shown
Display name too longValidation ruleReject updatePreference not saved, error shown
Display name duplicateUniqueness checkReject updatePreference not saved, error shown
Multi-site mode disabledFeature checkDisable site management UIActions blocked, tooltip explains
S3 folder name conflictPath collisionAllow (uses existing folder)No error, uses existing

7. Configuration

This domain manages configuration for other domains. Meta-configuration for its own behavior:

SettingLocationDefaultEffectREQ Trace
use_multiple_sitesFeature togglefalseEnables multi-site modeREQ-SITE-005
preserve_s3_structure_first_siteClient configurationtrueRoot-level folders for first siteREQ-SITE-002

User Settings Defaults:

SettingDefaultSource
timezoneAmerica/ChicagoUser::defaultSettings()
date_formatMM/DD/YYYYUser::defaultSettings()
time_format12-hourUser::defaultSettings()

See Configuration Reference for full list.


8. Implementation Mapping

8.1 Code Locations

Site Management:

ComponentTypePath
SiteModelapp/Site.php
SitesControllerControllerapp/Http/Controllers/SitesController.php
SitesEnableControllerControllerapp/Http/Controllers/SitesEnableController.php
SitesDisableControllerControllerapp/Http/Controllers/SitesDisableController.php
PreserveS3StructureForFirstSiteControllerControllerapp/Http/Controllers/PreserveS3StructureForFirstSiteController.php
UseMultipleSitesFeatureControllerControllerapp/Http/Controllers/UseMultipleSitesFeatureController.php
StoreSiteActionActionapp/Actions/Sites/StoreSiteAction.php
UpdateSiteActionActionapp/Actions/Sites/UpdateSiteAction.php
CreateStorageForSiteActionActionapp/Actions/Sites/CreateStorageForSiteAction.php
EnableSiteActionActionapp/Actions/Sites/EnableSiteAction.php
DisableSiteActionActionapp/Actions/Sites/DisableSiteAction.php
ToggleUseMultipleSitesFeatureActionActionapp/Actions/Sites/ToggleUseMultipleSitesFeatureAction.php
UpdatePreserveS3StructureForFirstSiteActionActionapp/Actions/Sites/UpdatePreserveS3StructureForFirstSiteAction.php

Client Configuration:

ComponentTypePath
ClientConfigurationModelapp/ClientConfiguration.php
ClientConfigurationsControllerControllerapp/Http/Controllers/ClientConfigurationsController.php
ClientConfigurationSettingsControllerControllerapp/Http/Controllers/ClientConfigurationSettingsController.php
ConfigDataControllerControllerapp/Http/Controllers/ConfigDataController.php
UpdateClientConfigurationActionActionapp/Actions/UpdateClientConfigurationAction.php
GetClientConfigurationsActionActionapp/Actions/ClientConfigurations/GetClientConfigurationsAction.php
ClientConfigurationEnableStateCheckerActionapp/Actions/ClientConfigurations/ClientConfigurationEnableStateChecker.php
AffectedClientConfigurationsServiceapp/ClientConfigurations/AffectedClientConfigurations.php
ClientConfigurationParentServiceServiceapp/ClientConfigurations/ClientConfigurationParentService.php
ClientConfigurationsExportExportapp/Exports/Config/ClientConfigurationsExport.php
ClientConfigurationsImportSheetImportapp/Imports/Sheets/ClientConfigurationsImportSheet.php
ClientConfigurationValidatorValidatorapp/Imports/Sheets/Support/Validators/ClientConfigurations/ClientConfigurationValidator.php

User Settings:

ComponentTypePath
AuthUserControllerControllerapp/Http/Controllers/AuthUserController.php
UpdateAuthUserActionActionapp/Actions/Users/UpdateAuthUserAction.php
UpdateAuthUserRequestRequestapp/Http/Requests/UpdateAuthUserRequest.php
ChangeLoggedInSiteControllerControllerapp/Http/Controllers/AuthUser/ChangeLoggedInSiteController.php
VisibleSitesControllerControllerapp/Http/Controllers/AuthUser/VisibleSitesController.php
UpdateAuthUserLoggedInSiteActionActionapp/Actions/AuthUser/UpdateAuthUserLoggedInSiteAction.php

8.2 Requirement Traceability

REQ IDDesign SectionPrimary Code
REQ-SITE-001§5.1, §5.2StoreSiteAction, CreateStorageForSiteAction
REQ-SITE-002§5.2Site::getStorageDirectory(), UpdatePreserveS3StructureForFirstSiteAction
REQ-SITE-003§5.1StoreSiteAction, CreateStorageForSiteAction
REQ-SITE-004§5.2UpdateSiteAction, CreateStorageForSiteAction
REQ-SITE-005§5.2ToggleUseMultipleSitesFeatureAction, EnableSiteAction, DisableSiteAction
REQ-CLIENTCFG-001§5.3ClientConfigurationsController, UpdateClientConfigurationAction
REQ-CLIENTCFG-002§4.1ConfigDataController, ClientConfigurationsExport
REQ-CLIENTCFG-003§4.1ConfigDataController, ClientConfigurationsImportSheet
REQ-USERSET-001§5.4AuthUserController, UpdateAuthUserAction
REQ-USERSET-002§5.4UpdateAuthUserRequest (gap: uniqueness not enforced)

9. Design Decisions

DecisionRationaleAlternatives Considered
Three-tier settings hierarchyClear ownership, precedence matches organizational structureFlat settings (rejected: no scoping), inheritance hierarchy (rejected: complexity)
Site-scoped configurationsMulti-tenant isolation without separate databasesSeparate databases (rejected: operational complexity)
Immediate applicationUser expects settings to take effect without restartQueued application (rejected: confusing UX)
JSON storage for user settingsFlexible schema, easy to extendSeparate columns (rejected: schema migration burden)
Excel import/export for client configCustomer familiarity, offline editingJSON/YAML (rejected: less accessible to lab staff)
S3 preservation toggle for first siteBackward compatibility for existing deploymentsForce migration (rejected: disruptive)
Configuration dependency cascade at UI levelClear feedback, no hidden value changesAutomatic value clearing (rejected: surprising)

10. Implementation Gaps

GapSRS RequirementCurrent StateRecommendation
Display name uniquenessREQ-USERSET-002Validation rule validates max:40 onlyAdd unique:users,display_name rule

DocumentRelevant Sections
SRS: site.mdSite management requirements
SRS: client-config.mdClient configuration requirements
SRS: user-settings.mdUser settings requirements
SDS: ArchitectureMulti-site architecture
SDS: Data ArchitectureEntity model
SDS: SecuritySite-based access control
SDS: CONFIGIO DomainImport/export patterns
Database ReferenceFull schema
Configuration ReferenceSetting details