Data Subject Rights (DSR)

Description

Data Subject Requests (DSRs) are formal requests from individuals exercising their rights under data protection laws. The Compliance module provides a complete, structured DSR workflow: submission, assignment, review, processing, and closure — with a full append-only audit trail and SLA tracking.

Request Types

The system supports five DSR types as defined by GDPR and CCPA regulations:

Request TypeDescriptionGDPR Reference
AccessRight of Access (Article 15). Subject requests a list of processing purposes, categories of personal data, and recipients.Article 15
ExportRight to Data Portability (Article 20). Subject requests a machine-readable copy of their personal data.Article 20
ErasureRight to Erasure / Right to be Forgotten (Article 17). Subject requests permanent deletion or anonymization of their PII.Article 17
RectificationRight to Rectification (Article 16). Subject requests correction of inaccurate or incomplete personal data.Article 16
RestrictionRight to Restriction of Processing (Article 18). Subject requests suspension of data processing while maintaining data storage.Article 18

Request Lifecycle

DSR tickets are modeled as state transitions with a review cycle and safety confirmation gates to prevent accidental and irreversible deletions:

1. Submit Request — Subject submits DSR via SubmitDsrCommand. Status is set to Pending and SLA deadline is calculated.
Assigns and moves to InReview
2. Admin Review — Admin reviews request via ReviewDsrCommand, transitioning state to Approved or Rejected.
Required for Erasure
3. Confirm Erasure — Erasure requests require manual confirmation via ConfirmErasureCommand, setting ErasureConfirmed = true.
Status: Rejected — Request is rejected by admin during review. Resolution notes are saved.
Status: Cancelled — Pending, InReview, or Approved requests can be manually cancelled at any time.
4. DSR Execution Job — DsrExecutionJob running every 5 min picks up confirmed/approved requests in batches of 50.
All modules succeed
5. Status: Completed — Successfully executed across all modules, storing completion timestamp.
6. Partially Completed — If any module provider fails, DSR transitions to PartiallyCompleted and increments RetryCount (max 3).

DSR Anonymization Execution Flow

Erasure request execution anonymizes personal data asynchronously across modules via fanned-out provider implementations:

DsrExecutionJob Trigger — Runs every 5 minutes and retrieves approved requests ready for erasure.
fetches batch
Safety Check Gate — Verifies that ErasureConfirmed = true and ErasureExecuteAfter grace period has passed.
if safety gates passed
Generate Anonymization Token — Generates secure SHA-256 anonymization token based on Subject ID.
builds token
Module Fan-Out — Iterates through all registered compliance providers implementing IUserDataAnonymizer.
invokes anonymizers
Zero-Allocation Execution — Executes database updates via EF Core's ExecuteUpdateAsync to wipe PII fields.
gathers statuses
Evaluate Results — Checks module execution records for successful completions.
if all succeeded
Set Status: Completed — DSR ticket is marked Completed and CompletedAt timestamp is stored.
Set Status: PartiallyCompleted — Logs error, increments RetryCount, and queues failed modules for retry (max 3).

SLA Tracking & Deadline Calculations

Compliance regulations dictate strict response timelines. SCRIPE automatically calculates and tracks SLA metrics on the admin dashboard:

Escalation Engine & Alerts

The DsrEscalationJob runs daily at 08:00 UTC to evaluate SLA consumption and escalate overdue tickets:

Extensible Provider Architecture

To maintain loose coupling, the Compliance module communicates with other modules using the IUserDataProvider and IUserDataAnonymizer abstractions:

Entity Reference

The core DSR domain aggregate stores request metadata, current status, verified subject identifiers, and execution timestamps.

FieldTypeDescription
IdGuidUnique identifier for the DSR request.
TenantIdGuidForeign key referencing the tenant context.
SubjectEmailStringData subject email address (anonymized upon erasure).
RequestTypeEnumType of DSR (Access, Export, Erasure, Rectification, Restriction).
StatusEnumCurrent lifecycle status of the request.
DeadlineDateTimeCalculated SLA response deadline.
ErasureConfirmedBooleanBoolean flag unlocking Erasure requests for background jobs.
ErasureExecuteAfterDateTime?Execution threshold enforcing the adaptive grace period.
ExportFileUrlStringURL to download fanned-out exported data zip.
AssignedToGuid?Foreign key referencing the assigned admin user.
RetryCountIntegerCurrent retry attempt count for failed module executions.
CompletedAtDateTime?Timestamp indicating when the DSR was completed.

CQRS Handlers & Domain Events

DSR processing leverages CQRS commands and queries, emitting domain events across module boundaries to invoke registered data anonymizers.

SubmitDsrCommandHandler.csC#
public class SubmitDsrCommandHandler : ICommandHandler<SubmitDsrCommand, Guid>
{
    public async Task<Result<Guid>> Handle(SubmitDsrCommand request, CancellationToken ct)
    {
        // 1. Calculate SLA deadline based on regulation profile
        var regulation = await _regulationRepo.GetByCodeAsync(request.RegulationCode, ct);
        var deadline = DateTime.UtcNow.AddDays(regulation.ResponseSlaDays);
        
        // 2. Create the entity
        var dsr = new DataSubjectRequest
        {
            TenantId = _tenantContext.TenantId,
            SubjectEmail = request.SubjectEmail,
            RequestType = request.RequestType,
            RegulationCode = request.RegulationCode,
            Status = DsrStatus.Pending,
            Deadline = deadline
        };
        
        await _repository.AddAsync(dsr, ct);
        await _unitOfWork.SaveChangesAsync(ct);
        
        // 3. Domain event triggers webhook
        dsr.AddDomainEvent(new DsrSubmittedEvent(dsr.Id));
        
        return Result<Guid>.Success(dsr.Id);
    }
}

API Endpoints

MethodEndpointDescriptionAuth
POST/api/v1/compliance/dsrSubmit a new Data Subject Request ticket (Access, Rectification, Erasure).🔒 Required
GET/api/v1/compliance/dsrList submitted Data Subject Requests with status and SLA indicators.🔒 Required
GET/api/v1/compliance/dsr/{id}Retrieve complete lifecycle status, discovery logs, and artifacts for a DSR ticket.🔒 Required
POST/api/v1/compliance/dsr/{id}/reviewTransition a DSR ticket to in-review and record compliance officer notes.🔒 Required
POST/api/v1/compliance/dsr/{id}/confirmExecute automated fulfillment actions and confirm DSR ticket completion.🔒 Required
POST/api/v1/compliance/dsr/{id}/assignAssign a DSR ticket to a designated compliance handler or DPO.🔒 Required

Quick Start Guide

  1. Seed Compliance Profiles

    Run the development seeder to populate GDPR and CCPA regulation profiles with SLA days.
  2. Submit a Data Subject Request

    Use the POST endpoint to log a new request. The system validates input constraints and calculates the response deadline.
    JSON
    POST /api/v1/compliance/dsr
    {
      "requestType": "Export",
      "regulationCode": "GDPR",
      "subjectEmail": "user@example.com"
    }
  3. Review and Approve

    The assigned compliance officer reviews the ticket. Approving an Erasure DSR sets the grace period and awaits final nuclear confirmation.