Skip to main content

Azure Cosmos DB

Azure Cosmos DB is used as the primary NoSQL data store for real-time camera state, user preferences, device configuration, shared view data, and Condor AI event state. The Infrastructure package provides a generic repository base class and 9 specialized repositories.

Registration

services.AddAlertCACosmosDbServices(configuration);

This registers:

  • CosmosClient as a singleton with retry policies (3 retries, 60s max wait)
  • All 9 Cosmos repositories as scoped services

Configuration

{
"CosmosDbOptions": {
"CosmosDbUrl": "",
"DatabaseName": "",
"CameraContainerName": "",
"CameraConfigContainerName": "",
"AcquisitionDeviceContainerName": "",
"UserContainerName": "",
"UserSubscriptionContainerName": "",
"SharedViewContainerName": "",
"PulsePointContainerName": ""
},
"CondorEventContainerName": "condorEvent",
// Note: The CondorEvent container name is hardcoded in the repository
"EnvironmentOptions": {
"Environment": "dev"
}
}

Architecture

Note that CameraStaticRepository and CameraOperationalRepository share the same container but use a DataType partition key discriminator to filter between static and operational documents.

Base Class: CosmosRepository<T>

All Cosmos repositories inherit from CosmosRepository<T> where T : BaseCosmosEntity, which provides generic CRUD operations:

MethodDescription
AddAsync(T entity)Creates a new document
UpdateAsync(T entity, string? partitionKey)Upserts a document
PatchAsync(string id, List<PatchOperation> operations, string? partitionKey)Partial update using Cosmos patch operations
DeleteAsync(T entity, string? partitionKey)Deletes a document
GetByIdAsync(string id, string? partitionKey)Retrieves a single document by ID
GetByQueryAsync(Expression<Func<T, bool>> predicate)Queries with LINQ expressions
GetAllAsync()Retrieves all documents

The BaseCosmosEntity base class provides the Id property (mapped to Cosmos "id").

Repositories

CameraStaticRepository

Manages static camera configuration — names, capabilities, locations, and public visibility settings.

Interface: ICameraStaticRepository

MethodDescription
GetCamerasByCameraIds(List<string> cameraIds)Retrieve multiple cameras by ID
GetPublicEntitiesAsync()Get cameras filtered by environment and IsAlertCaPublic flag
SetDevicesToDev/Uat/Prod(IEnumerable<string> cameraIds)Set environment designation

Overrides the base GetByIdAsync, UpdateAsync, DeleteAsync, PatchAsync, and GetAllAsync to filter by CameraEntityDataTypes.Static.

CameraOperationalRepository

Manages real-time camera operational state — PTZ position, focus, brightness, and movement expiration.

Interface: ICameraOperationalRepository

MethodDescription
GetCamerasByCameraIds(List<string> cameraIds)Get operational state for multiple cameras
GetCamerasByCameraIds(List<string> cameraIds, DateTimeOffset since)Get cameras modified since timestamp
PatchPtz(string id, double pan, double tilt, int? zoom, DateTimeOffset? lastMovementDatetime)Update pan/tilt/zoom position
PatchPtzFocusBrightness(string id, double pan, double tilt, int? zoom, bool? autoFocus, int? focus, int? brightness, DateTimeOffset? lastMovementDatetime, DateTimeOffset? moveExpirationDate)Comprehensive PTZ update including focus, brightness, and expiration
PatchFocus(string id, int focus, bool autofocus, DateTimeOffset lastMovementDate, DateTimeOffset? moveExpirationDate)Update focus settings
PatchBrightness(string id, int brightness, DateTimeOffset lastMovementDate, DateTimeOffset? moveExpirationDate)Update brightness settings
EndMovementExpirationDate(string cameraId)End camera movement session
ExtendMovementExpirationDate(string cameraId, int minutes)Extend movement session
PatchMovementExpirationDate(string cameraId, DateTimeOffset date)Set specific expiration

Uses CameraEntityDataTypes.Operational partition key filtering, same container as static data.

AcquisitionDeviceRepository

Manages acquisition device orchestration configuration and mode control.

Interface: IAcquisitionDeviceRepository

MethodDescription
ActivateLeaseMode(string id)Enable LEASED orchestration mode
ActivateAcquisitionMode(string id)Enable SINGLE and PANO orchestrations
ActivateTurboMode(string id)Enable TURBO orchestration mode
SetAcquisitionDevicesToDev/Uat/Prod(List<string> deviceIds)Set environment
SetAlertCAEnabled(List<string> deviceIds, bool isEnabled)Enable/disable AlertCA by device IDs
SetAlertCAEnabled(List<int> sequenceIds, bool isEnabled)Enable/disable AlertCA by sequence IDs

UserRepository

Manages user preferences, UI settings, and activity log state.

Interface: IUserRepository

MethodDescription
GetByIdAsync(string entraUserId)Get user by Entra ID
UpsertUserAsync(UserEntity userEntity)Create or update user
PatchActivityLogLastReadDateTime(string entraUserId, DateTimeOffset? lastRead)Update activity log read time
PatchCameraOptions(string entraUserId, CameraOptions options)Update camera UI options
PatchLayerVisibility(string entraUserId, IEnumerable<LayerVisibility> layers)Update map layer visibility
PatchPinnedAndHiddenCameras(string entraUserId, IEnumerable<string> pinned, IEnumerable<string> hidden)Update camera pin/hide lists

Uses UserId as the partition key.

CameraConfigRepository

Stores camera configuration data. Inherits only base CosmosRepository<T> methods — no additional custom operations.

Interface: ICameraConfigRepository

SharedViewRepository

Manages shared map view configurations between users.

Interface: ISharedViewRepository

MethodDescription
GetSharedViewsByUserId(string entraUserId)Get all views shared with a user

UserSubscriptionRepository

Manages user subscription entries. Inherits base CosmosRepository<T> methods.

Interface: IUserSubscriptionRepository

PulsePointRepository

Manages PulsePoint emergency incident data. Inherits base CosmosRepository<T> methods.

Interface: IPulsePointRepository

CondorEventRepository

Manages Condor AI detection event state in Cosmos DB. Stores real-time event data with a TTL for automatic expiration. The container name is hardcoded as "condorEvent" rather than configured via CosmosDbOptions.

Interface: ICondorEventRepository

Inherits all base CosmosRepository<CondorEventEntity> methods (Add, Update, Patch, Delete, GetById, GetByQuery, GetAll). No additional custom operations.

Entity: CondorEventEntity extends BaseCosmosEntity:

PropertyTypeDescription
DeviceIdsList<string>Camera device IDs associated with the event
EventIdsList<string>Accumulated camera event IDs
Namestring?Event name
StartDateDateTimeOffset?Event start time
StatusCondorCameraEventStatusActive/Resolved status (stored as string)
EventCategoriesList<CondorCameraEventCategory>Fire/Smoke categories
LastUpdatedDateDateTimeOffsetLast update timestamp
TtlintTime-to-live in seconds for automatic expiration

Usage Example

using Alert.CA.Infrastructure.Repositories.CosmosRepositories.Interfaces;

public class CameraService(
ICameraStaticRepository cameraStaticRepo,
ICameraOperationalRepository cameraOperationalRepo)
{
public async Task<CameraStaticEntity?> GetCamera(string id)
{
return await cameraStaticRepo.GetByIdAsync(id);
}

public async Task UpdatePtz(string cameraId, double pan, double tilt, int zoom)
{
await cameraOperationalRepo.PatchPtz(cameraId, pan, tilt, zoom, DateTimeOffset.UtcNow);
}
}