Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions daemon/application.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -182,6 +182,7 @@ void setup_controllers(drogon::HttpAppFramework& app, kgr::container& container)
.registerController(container.service<UserController>())
.registerController(container.service<LogController>())
.registerController(container.service<SectionController>())
.registerController(container.service<MaintenanceController>())
.registerController(container.service<bxt::di::Infrastructure::WSController>())
.registerFilter(container.service<JwtFilter>());
}
Expand Down
37 changes: 37 additions & 0 deletions daemon/core/application/services/MaintenanceService.cpp
Original file line number Diff line number Diff line change
@@ -0,0 +1,37 @@
/* === This file is part of bxt ===
*
* SPDX-FileCopyrightText: 2024 Artem Grinev <agrinev@manjaro.org>
* SPDX-License-Identifier: AGPL-3.0-or-later
*
*/
#include "MaintenanceService.h"

#include "core/application/dtos/PackageSectionDTO.h"

coro::task<void> bxt::Core::Application::MaintenanceService::export_database(
std::set<PackageSectionDTO> const& sections) {
auto available_sections = co_await m_section_service.get_sections();

if (!available_sections.has_value()) {
co_return;
}

std::set<PackageSectionDTO> sections_to_export;

if (sections.empty()) {
sections_to_export = *available_sections | std::ranges::to<std::set>();
} else {
for (auto const& section : sections) {
if (std::find(available_sections->begin(), available_sections->end(), section)
!= available_sections->end()) {
co_return;
}
}
}

m_exporter.add_dirty_sections(std::move(sections_to_export));

co_await m_exporter.export_to_disk();

co_return;
}
37 changes: 37 additions & 0 deletions daemon/core/application/services/MaintenanceService.h
Original file line number Diff line number Diff line change
@@ -0,0 +1,37 @@
/* === This file is part of bxt ===
*
* SPDX-FileCopyrightText: 2024 Artem Grinev <agrinev@manjaro.org>
* SPDX-License-Identifier: AGPL-3.0-or-later
*
*/
#pragma once

#include "core/application/dtos/PackageSectionDTO.h"
#include "core/application/errors/CrudError.h"
#include "core/application/services/SectionService.h"
#include "infrastructure/PackageService.h"
#include "persistence/box/export/AlpmDBExporter.h"
#include "persistence/box/export/ExporterBase.h"
#include "utilities/errors/Macro.h"

#include <coro/task.hpp>

namespace bxt::Core::Application {
class MaintenanceService {
public:
BXT_DECLARE_RESULT(CrudError)

MaintenanceService(Persistence::Box::ExporterBase& exporter,
Application::SectionService& section_service)
: m_exporter(exporter)
, m_section_service(section_service) {
}

coro::task<void> export_database(std::set<PackageSectionDTO> const& sections = {});

private:
Persistence::Box::ExporterBase& m_exporter;
Application::SectionService& m_section_service;
};

} // namespace bxt::Core::Application
14 changes: 14 additions & 0 deletions daemon/di.h
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,7 @@

#include "core/application/services/AuthService.h"
#include "core/application/services/CompareService.h"
#include "core/application/services/MaintenanceService.h"
#include "core/application/services/PackageService.h"
#include "core/application/services/PermissionService.h"
#include "core/application/services/SectionService.h"
Expand Down Expand Up @@ -45,6 +46,7 @@
#include "presentation/web-controllers/AuthController.h"
#include "presentation/web-controllers/CompareController.h"
#include "presentation/web-controllers/LogController.h"
#include "presentation/web-controllers/MaintenanceController.h"
#include "presentation/web-controllers/PackageController.h"
#include "presentation/web-controllers/SectionController.h"
#include "presentation/web-controllers/UserController.h"
Expand Down Expand Up @@ -294,6 +296,13 @@ namespace Persistence {
} // namespace Box
} // namespace Persistence

namespace Core::Application {
struct MaintenanceService
: kgr::single_service<bxt::Core::Application::MaintenanceService,
kgr::dependency<di::Persistence::Box::ExporterBase,
di::Core::Application::SectionService>> {};
} // namespace Core::Application

namespace Presentation {

struct JwtOptions : kgr::single_service<bxt::Presentation::JwtOptions> {};
Expand Down Expand Up @@ -339,6 +348,11 @@ namespace Presentation {
kgr::dependency<di::Core::Application::SectionService,
di::Core::Application::PermissionService>> {};

struct MaintenanceController
: kgr::shared_service<bxt::Presentation::MaintenanceController,
kgr::dependency<di::Core::Application::MaintenanceService,
di::Core::Application::PermissionService>> {};

struct JwtFilter
: kgr::shared_service<
bxt::Presentation::JwtFilter,
Expand Down
20 changes: 20 additions & 0 deletions daemon/presentation/messages/MaintenanceMessages.h
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
/* === This file is part of bxt ===
*
* SPDX-FileCopyrightText: 2024 Artem Grinev <agrinev@manjaro.org>
* SPDX-License-Identifier: AGPL-3.0-or-later
*
*/

#pragma once

#include "presentation/messages/SectionMessages.h"

#include <vector>

namespace bxt::Presentation {

struct ExportDatabaseRequest {
std::vector<SectionRequest> sections;
};

} // namespace bxt::Presentation
33 changes: 33 additions & 0 deletions daemon/presentation/web-controllers/MaintenanceController.cpp
Original file line number Diff line number Diff line change
@@ -0,0 +1,33 @@
/* === This file is part of bxt ===
*
* SPDX-FileCopyrightText: 2024 Artem Grinev <agrinev@manjaro.org>
* SPDX-License-Identifier: AGPL-3.0-or-later
*
*/
#include "MaintenanceController.h"

#include "core/application/dtos/PackageSectionDTO.h"
#include "presentation/messages/MaintenanceMessages.h"
#include "utilities/drogon/Helpers.h"
#include "utilities/drogon/Macro.h"
namespace bxt::Presentation {

using namespace drogon;

Task<HttpResponsePtr> MaintenanceController::export_database(HttpRequestPtr req) {
BXT_JWT_CHECK_PERMISSIONS("maintenance.export", req);

auto request = drogon_helpers::get_request_json<ExportDatabaseRequest>(req);

co_await m_service.export_database(
request.value_or({{}}).sections | std::views::transform([](SectionRequest const& section) {
return PackageSectionDTO {.branch = section.branch,
.repository = section.repository,
.architecture = section.architecture};
})
| std::ranges::to<std::set>());

co_return {};
}

} // namespace bxt::Presentation
42 changes: 42 additions & 0 deletions daemon/presentation/web-controllers/MaintenanceController.h
Original file line number Diff line number Diff line change
@@ -0,0 +1,42 @@
/* === This file is part of bxt ===
*
* SPDX-FileCopyrightText: 2024 Artem Grinev <agrinev@manjaro.org>
* SPDX-License-Identifier: AGPL-3.0-or-later
*
*/
#pragma once

#include "core/application/services/MaintenanceService.h"
#include "core/application/services/PermissionService.h"
#include "utilities/drogon/Macro.h"

#include <drogon/HttpController.h>
#include <drogon/HttpResponse.h>
#include <drogon/HttpTypes.h>
#include <kangaru/service.hpp>

namespace bxt::Presentation {

class MaintenanceController : public drogon::HttpController<MaintenanceController, false> {
public:
explicit MaintenanceController(Core::Application::MaintenanceService& service,
Core::Application::PermissionService& permission_service)
: m_service(service)
, m_permission_service(permission_service) {
}

METHOD_LIST_BEGIN

BXT_JWT_ADD_METHOD_TO(MaintenanceController::export_database,
"/api/maintenance/export",
drogon::Get);
METHOD_LIST_END

drogon::Task<drogon::HttpResponsePtr> export_database(drogon::HttpRequestPtr req);

private:
Core::Application::MaintenanceService& m_service;
Core::Application::PermissionService& m_permission_service;
};

} // namespace bxt::Presentation