Codeunit 1738 OData Initializer, source in 29

Source29

src/Layers/W1/BaseApp/System/OData/ODataInitializer.Codeunit.al78 lines, Copyright (c) Microsoft Corporation. MIT

namespace System.Integration;

using System.Environment;
using System.Environment.Configuration;
using System.Utilities;

codeunit 1738 "OData Initializer"
{
    Access = Internal;

    var
        EnvironmentInfo: Codeunit "Environment Information";
        CategoryTxt: Label 'AL OData Initialization', Locked = true;
        MetadataEndpointCallFailedTxt: Label 'Metadata endpoint call failed.', Locked = true;

    trigger OnRun()
    begin
        CallMetadataEndpoint();
    end;

    local procedure CallMetadataEndpoint()
    var
        ODataUtility: Codeunit ODataUtility;
        HttpWebRequestMgt: Codeunit "Http Web Request Mgt.";
        TempBlob: Codeunit "Temp Blob";
        ResponseInStream: InStream;
    begin
        TempBlob.CreateInStream(ResponseInStream);

        if ODataUtility.CreateMetadataWebRequest(HttpWebRequestMgt) then begin
            HttpWebRequestMgt.SetUserAgent('BusinessCentral-Warmup'); // Overwrite user agent
            if HttpWebRequestMgt.GetResponseStream(ResponseInStream) then
                exit;
        end;

        Session.LogMessage('0000E52', MetadataEndpointCallFailedTxt, Verbosity::Normal, DataClassification::SystemMetadata, TelemetryScope::ExtensionPublisher, 'Category', CategoryTxt);
    end;

    [EventSubscriber(ObjectType::Codeunit, Codeunit::"System Initialization", 'OnAfterLogin', '', false, false)]
    local procedure OnAfterLogin()
    begin
        if not EnvironmentInfo.IsSaaS() then
            exit;

        if not TaskScheduler.CanCreateTask() then
            exit;

        if not UpdateODataInitializedStatus() then
            exit;

        TaskScheduler.CreateTask(Codeunit::"OData Initializer", 0, true, CompanyName(), CurrentDateTime() + 60 * 1000); // Run codeunit in 1 minute
    end;

    local procedure UpdateODataInitializedStatus(): Boolean
    var
        ODataInitializedStatus: Record "OData Initialized Status";
        [SecurityFiltering(SecurityFilter::Ignored)]
        ODataInitializedStatus2: Record "OData Initialized Status";
        moduleInfo: ModuleInfo;
    begin
        if not NavApp.GetCurrentModuleInfo(moduleInfo) then
            exit(false);

        if not (ODataInitializedStatus.ReadPermission() and ODataInitializedStatus2.WritePermission()) then
            exit(false);

        if ODataInitializedStatus.FindFirst() and (ODataInitializedStatus."Initialized version" = Format(moduleInfo.AppVersion())) then
            exit(false);

        // Make sure we only call this initialization once
        ODataInitializedStatus."Initialized version" := Format(moduleInfo.AppVersion());
        if ODataInitializedStatus.IsEmpty() then
            exit(ODataInitializedStatus.Insert())
        else
            exit(ODataInitializedStatus.Modify());
    end;
}