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:
CosmosClientas 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:
| Method | Description |
|---|---|
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
| Method | Description |
|---|---|
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
| Method | Description |
|---|---|
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
| Method | Description |
|---|---|
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
| Method | Description |
|---|---|
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
| Method | Description |
|---|---|
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:
| Property | Type | Description |
|---|---|---|
DeviceIds | List<string> | Camera device IDs associated with the event |
EventIds | List<string> | Accumulated camera event IDs |
Name | string? | Event name |
StartDate | DateTimeOffset? | Event start time |
Status | CondorCameraEventStatus | Active/Resolved status (stored as string) |
EventCategories | List<CondorCameraEventCategory> | Fire/Smoke categories |
LastUpdatedDate | DateTimeOffset | Last update timestamp |
Ttl | int | Time-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);
}
}