root/src/apps/haikudepot/server/PopulatePkgChangelogFromServerProcess.cpp
/*
 * Copyright 2016-2025, Andrew Lindesay <apl@lindesay.co.nz>.
 * All rights reserved. Distributed under the terms of the MIT License.
 *
 * Note that this file included code earlier from `Model.cpp` and
 * copyrights have been latterly been carried across in 2024.
 */


#include "PopulatePkgChangelogFromServerProcess.h"

#include <Autolock.h>
#include <Catalog.h>

#include "Logger.h"
#include "ServerHelper.h"


#undef B_TRANSLATION_CONTEXT
#define B_TRANSLATION_CONTEXT "PopulatePkgChangelogFromServerProcess"


PopulatePkgChangelogFromServerProcess::PopulatePkgChangelogFromServerProcess(
        const BString& packageName, Model* model)
        :
        fModel(model),
        fPackageName(packageName)
{
}


PopulatePkgChangelogFromServerProcess::~PopulatePkgChangelogFromServerProcess()
{
}


const char*
PopulatePkgChangelogFromServerProcess::Name() const
{
        return "PopulatePkgChangelogFromServerProcess";
}


const char*
PopulatePkgChangelogFromServerProcess::Description() const
{
        return B_TRANSLATE("Fetching changelog for package");
}


status_t
PopulatePkgChangelogFromServerProcess::RunInternal()
{
        if (!ServerHelper::IsNetworkAvailable()) {
                HDINFO("no network so will not populate changelog");
                return B_OK;
        }

        // TODO; use API spec to code generation techniques instead of this manually written client.

        BMessage responsePayload;
        status_t result;

        result = fModel->WebApp()->GetChangelog(fPackageName, responsePayload);

        if (result == B_OK) {
                BMessage resultMessage;
                BString content;

                result = responsePayload.FindMessage("result", &resultMessage);

                if (result == B_OK) {
                        if (resultMessage.FindString("content", &content) == B_OK) {
                                content.Trim();
                                result = _UpdateChangelog(content);
                                HDDEBUG("changelog populated for [%s] (length %" B_PRIi32 ")",
                                        fPackageName.String(), content.Length());
                        } else {
                                HDDEBUG("no changelog present for [%s]", fPackageName.String());
                        }
                }
        } else {
                ServerHelper::NotifyTransportError(result);
        }

        return result;
}


status_t
PopulatePkgChangelogFromServerProcess::_UpdateChangelog(const BString& value)
{
        PackageInfoRef package = fModel->PackageForName(fPackageName);

        if (!package.IsSet()) {
                HDERROR("the package [%s] was not found", fPackageName.String());
                return B_ERROR;
        }

        PackageLocalizedTextRef localizedText
                = PackageLocalizedTextBuilder(package->LocalizedText()).WithChangelog(value).BuildRef();

        PackageInfoRef updatedPackage
                = PackageInfoBuilder(package).WithLocalizedText(localizedText).BuildRef();

        fModel->AddPackage(updatedPackage);

        return B_OK;
}