Codeunit 6349 PBI Deploy. Upload Tracker, source in 29

Source29

src/Layers/W1/BaseApp/Modules/System/PowerBI/APIs/ReportDeployments/PBIDeployUploadTracker.Codeunit.al153 lines, Copyright (c) Microsoft Corporation. MIT

namespace System.Integration.PowerBI;

/// <summary>
/// Implements the Power BI Upload Tracker interface backed by the Power BI Deployment
/// and Power BI Deployment State tables. Used for enum-based deployable reports.
/// The current upload status is derived from the state records, not stored on the deployment table.
/// </summary>
codeunit 6349 "PBI Deploy. Upload Tracker" implements "Power BI Upload Tracker"
{
    Access = Internal;

    var
        PowerBIDeployment: Record "Power BI Deployment";
        PowerBIServiceMgt: Codeunit "Power BI Service Mgt.";
        CurrentReportId: Enum "Power BI Deployable Report";
        CurrentStatus: Enum "Power BI Upload Status";
        IncomingVersion: Integer;
        InvalidDeployableReportKeyErr: Label 'Deployable report was configured with an incorrect ReportKey';
        NoProgressOnDeploymentTelemetryMsg: Label 'Deployment was not modified.', Locked = true;
        TransitionToFailStateWithoutUsingFailMsg: Label 'Transition to a failed state directly, without calling the Fail procedure.', Locked = true;

    procedure Load(ReportKey: Text[100])
    var
        DeployableReport: Interface "Power BI Deployable Report";
    begin
        if not GetDeployableReportFromReportKey(ReportKey, CurrentReportId) then
            Error(InvalidDeployableReportKeyErr); // Only possible if a deployable report was scheduled and at the time of running the JQ the deployable is no longer available (extension uninstalled)

        DeployableReport := CurrentReportId;
        IncomingVersion := DeployableReport.GetVersion();

        Clear(PowerBIDeployment);
        // The deployment record is created to signal that a deployment is required; it must already exist at this point.
        PowerBIDeployment.Get(CurrentReportId);
        CurrentStatus := PowerBIDeployment.GetUploadStatus();
    end;

    procedure Reset()
    var
        PowerBIDeploymentState: Record "Power BI Deployment State";
    begin
        Clear(PowerBIDeployment."Retry After");
        // If re-uploading a completed or failed report (e.g. version upgrade), reset for new cycle
        if CurrentStatus in [
            Enum::"Power BI Upload Status"::Completed,
            Enum::"Power BI Upload Status"::Failed]
        then begin
            PowerBIDeploymentState.SetRange("Report Id", CurrentReportId);
            PowerBIDeploymentState.DeleteAll();
            CurrentStatus := Enum::"Power BI Upload Status"::NotStarted;
        end;
    end;

    procedure GetStatus(): Enum "Power BI Upload Status"
    begin
        exit(CurrentStatus);
    end;

    procedure TransitionTo(NewStatus: Enum "Power BI Upload Status")
    begin
        if NewStatus = Enum::"Power BI Upload Status"::Failed then begin
            Session.LogMessage('0000SEQ', TransitionToFailStateWithoutUsingFailMsg, Verbosity::Normal, DataClassification::OrganizationIdentifiableInformation, TelemetryScope::ExtensionPublisher, 'Category', PowerBIServiceMgt.GetPowerBiTelemetryCategory());
            Fail('', '');
            exit;
        end;

        PowerBIDeployment.RecordStep(NewStatus);
        CurrentStatus := NewStatus;
    end;

    procedure Fail(ErrorMessage: Text; ErrorCallStack: Text)
    begin
        PowerBIDeployment.FailCurrentStep(ErrorMessage, ErrorCallStack);
        CurrentStatus := Enum::"Power BI Upload Status"::Failed;
    end;

    procedure SetImportId(ImportId: Guid)
    begin
        PowerBIDeployment."Import ID" := ImportId;
    end;

    procedure GetImportId(): Guid
    begin
        exit(PowerBIDeployment."Import ID");
    end;

    procedure SetImportResult(UploadedReportId: Guid; EmbedUrl: Text[2048]; DatasetId: Text)
    begin
        PowerBIDeployment."Uploaded Report ID" := UploadedReportId;
        PowerBIDeployment."Report Embed Url" := EmbedUrl;
        PowerBIDeployment."Dataset Id" := CopyStr(DatasetId, 1, MaxStrLen(PowerBIDeployment."Dataset Id"));
    end;

    procedure SetUploadedReportName(ReportName: Text)
    begin
        PowerBIDeployment."Uploaded Report Name" := CopyStr(ReportName, 1, MaxStrLen(PowerBIDeployment."Uploaded Report Name"));
    end;

    procedure GetUploadedReportName(): Text
    begin
        exit(PowerBIDeployment."Uploaded Report Name");
    end;

    procedure GetUploadedReportId(): Guid
    begin
        exit(PowerBIDeployment."Uploaded Report ID");
    end;

    procedure GetEmbedUrl(): Text[2048]
    begin
        exit(PowerBIDeployment."Report Embed Url");
    end;

    procedure GetDatasetId(): Text
    begin
        exit(PowerBIDeployment."Dataset Id");
    end;

    procedure ShouldOverwrite(IncomingReportVersion: Integer): Boolean
    begin
        exit(IncomingReportVersion > PowerBIDeployment."Deployed Version");
    end;

    procedure ScheduleRetry(RetryAfter: DateTime)
    begin
        PowerBIDeployment.Validate("Retry After", RetryAfter);
    end;

    procedure HasScheduledRetry(): Boolean
    begin
        exit(PowerBIDeployment."Retry After" <> 0DT);
    end;

    procedure Save()
    begin
        if CurrentStatus = Enum::"Power BI Upload Status"::Completed then
            PowerBIDeployment."Deployed Version" := IncomingVersion;

        if not PowerBIDeployment.Modify(true) then
            Session.LogMessage('0000SER', NoProgressOnDeploymentTelemetryMsg, Verbosity::Normal,
                DataClassification::SystemMetadata, TelemetryScope::ExtensionPublisher, 'Category', PowerBIServiceMgt.GetPowerBiTelemetryCategory());
    end;

    [TryFunction]
    internal procedure GetDeployableReportFromReportKey(ReportKey: Text[100]; var DeployableReportType: Enum "Power BI Deployable Report")
    var
        OrdinalValue: Integer;
    begin
        Evaluate(OrdinalValue, ReportKey);
        DeployableReportType := Enum::"Power BI Deployable Report".FromInteger(OrdinalValue);
    end;
}