ORE Studio 0.0.4
Loading...
Searching...
No Matches
SystemProvisionerWizard.hpp
1/* -*- mode: c++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*-
2 *
3 * Copyright (C) 2025 Marco Craveiro <marco.craveiro@gmail.com>
4 *
5 * This program is free software; you can redistribute it and/or modify it under
6 * the terms of the GNU General Public License as published by the Free Software
7 * Foundation; either version 3 of the License, or (at your option) any later
8 * version.
9 *
10 * This program is distributed in the hope that it will be useful, but WITHOUT
11 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
12 * FOR A PARTICULAR PURPOSE. See the GNU General Public License for more
13 * details.
14 *
15 * You should have received a copy of the GNU General Public License along with
16 * this program; if not, write to the Free Software Foundation, Inc., 51
17 * Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
18 *
19 */
20#ifndef ORES_QT_SYSTEM_PROVISIONER_WIZARD_HPP
21#define ORES_QT_SYSTEM_PROVISIONER_WIZARD_HPP
22
23#include <QWizard>
24#include <QWizardPage>
25#include <QLineEdit>
26#include <QLabel>
27#include <QCheckBox>
28#include <QComboBox>
29#include <QRadioButton>
30#include <QProgressBar>
31#include <QTextEdit>
32#include <boost/uuid/uuid.hpp>
33#include "ores.logging/make_logger.hpp"
34#include "ores.qt/ClientManager.hpp"
35
36namespace ores::qt {
37
53class SystemProvisionerWizard final : public QWizard {
54 Q_OBJECT
55
56private:
57 inline static std::string_view logger_name = "ores.qt.system_provisioner_wizard";
58
59 [[nodiscard]] static auto& lg() {
60 using namespace ores::logging;
61 static auto instance = make_logger(logger_name);
62 return instance;
63 }
64
65public:
66signals:
74 void provisioningCompleted(const QString& username);
75
81 void provisioningFailed(const QString& errorMessage);
82
83public:
84 enum PageId {
85 Page_Welcome,
86 Page_AdminAccount,
87 Page_SetupMode,
88 Page_TenantDetails,
89 Page_TenantAdmin,
90 Page_Apply,
91 Page_Complete
92 };
93
95 ClientManager* clientManager,
96 QWidget* parent = nullptr);
97
98 ~SystemProvisionerWizard() override = default;
99
100 ClientManager* clientManager() const { return clientManager_; }
101
102 // Admin account accessors
103 QString adminUsername() const { return adminUsername_; }
104 QString adminEmail() const { return adminEmail_; }
105 QString adminPassword() const { return adminPassword_; }
106 void setAdminCredentials(const QString& username, const QString& email,
107 const QString& password);
108
109 std::string adminAccountId() const { return adminAccountId_; }
110 void setAdminAccountId(const std::string& id) { adminAccountId_ = id; }
111
112 // Setup mode accessors
113 bool isMultiTenantMode() const { return multiTenantMode_; }
114 void setMultiTenantMode(bool multi) { multiTenantMode_ = multi; }
115
116 // Tenant details accessors
117 QString tenantCode() const { return tenantCode_; }
118 void setTenantCode(const QString& code) { tenantCode_ = code; }
119
120 QString tenantName() const { return tenantName_; }
121 void setTenantName(const QString& name) { tenantName_ = name; }
122
123 QString tenantType() const { return tenantType_; }
124 void setTenantType(const QString& type) { tenantType_ = type; }
125
126 QString tenantHostname() const { return tenantHostname_; }
127 void setTenantHostname(const QString& hostname) { tenantHostname_ = hostname; }
128
129 QString tenantDescription() const { return tenantDescription_; }
130 void setTenantDescription(const QString& desc) { tenantDescription_ = desc; }
131
132 // Tenant admin accessors
133 QString tenantAdminUsername() const { return tenantAdminUsername_; }
134 void setTenantAdminUsername(const QString& u) { tenantAdminUsername_ = u; }
135
136 QString tenantAdminPassword() const { return tenantAdminPassword_; }
137 void setTenantAdminPassword(const QString& p) { tenantAdminPassword_ = p; }
138
139 QString tenantAdminEmail() const { return tenantAdminEmail_; }
140 void setTenantAdminEmail(const QString& e) { tenantAdminEmail_ = e; }
141
142 QString provisionedTenantId() const { return provisionedTenantId_; }
143 void setProvisionedTenantId(const QString& id) { provisionedTenantId_ = id; }
144
145private:
146 void setupPages();
147
148 ClientManager* clientManager_;
149 QString adminUsername_;
150 QString adminEmail_;
151 QString adminPassword_;
152 std::string adminAccountId_;
153 bool multiTenantMode_ = false;
154 QString tenantCode_;
155 QString tenantName_;
156 QString tenantType_ = QStringLiteral("evaluation");
157 QString tenantHostname_;
158 QString tenantDescription_;
159 QString tenantAdminUsername_;
160 QString tenantAdminPassword_;
161 QString tenantAdminEmail_;
162 QString provisionedTenantId_;
163};
164
165// Forward declarations of page classes
166class WelcomePage;
167class AdminAccountPage;
168class SetupModePage;
169class ProvisionerTenantDetailsPage;
170class ProvisionerTenantAdminPage;
171class ProvisionerApplyPage;
172class ProvisionerCompletePage;
173
177class WelcomePage final : public QWizardPage {
178 Q_OBJECT
179
180public:
181 explicit WelcomePage(SystemProvisionerWizard* wizard);
182
183private:
184 void setupUI();
185
187};
188
192class AdminAccountPage final : public QWizardPage {
193 Q_OBJECT
194
195private:
196 inline static std::string_view logger_name =
197 "ores.qt.admin_account_page";
198
199 [[nodiscard]] static auto& lg() {
200 using namespace ores::logging;
201 static auto instance = make_logger(logger_name);
202 return instance;
203 }
204
205public:
207 void initializePage() override;
208 bool validatePage() override;
209 int nextId() const override;
210
211private slots:
212 void onShowPasswordToggled(bool checked);
213
214private:
215 void setupUI();
216
218 QLineEdit* usernameEdit_;
219 QLineEdit* emailEdit_;
220 QLineEdit* passwordEdit_;
221 QLineEdit* confirmPasswordEdit_;
222 QCheckBox* showPasswordCheckbox_;
223 QLabel* validationLabel_;
224 bool accountCreated_ = false;
225};
226
230class SetupModePage final : public QWizardPage {
231 Q_OBJECT
232
233public:
234 explicit SetupModePage(SystemProvisionerWizard* wizard);
235 void initializePage() override;
236 bool validatePage() override;
237
238private:
239 void setupUI();
240
242 QRadioButton* singleTenantRadio_;
243 QRadioButton* multiTenantRadio_;
244};
245
249class ProvisionerTenantDetailsPage final : public QWizardPage {
250 Q_OBJECT
251
252public:
254 void initializePage() override;
255 bool validatePage() override;
256
257private slots:
258 void onCodeChanged(const QString& text);
259
260private:
261 void setupUI();
262
264 QLineEdit* codeEdit_;
265 QLineEdit* nameEdit_;
266 QComboBox* typeCombo_;
267 QLineEdit* hostnameEdit_;
268 QLineEdit* descriptionEdit_;
269 QLabel* validationLabel_;
270 bool hostnameManuallyEdited_ = false;
271};
272
276class ProvisionerTenantAdminPage final : public QWizardPage {
277 Q_OBJECT
278
279public:
281 void initializePage() override;
282 bool validatePage() override;
283
284private slots:
285 void onShowPasswordToggled(bool checked);
286
287private:
288 void setupUI();
289
291 QLineEdit* usernameEdit_;
292 QLineEdit* emailEdit_;
293 QLineEdit* passwordEdit_;
294 QLineEdit* confirmPasswordEdit_;
295 QCheckBox* showPasswordCheck_;
296 QLabel* validationLabel_;
297};
298
302class ProvisionerApplyPage final : public QWizardPage {
303 Q_OBJECT
304
305private:
306 inline static std::string_view logger_name =
307 "ores.qt.provisioner_apply_page";
308
309 [[nodiscard]] static auto& lg() {
310 using namespace ores::logging;
311 static auto instance = make_logger(logger_name);
312 return instance;
313 }
314
315public:
317 void initializePage() override;
318 bool isComplete() const override;
319
320private:
321 void startProvisioning();
322 void appendLog(const QString& message);
323
325 QLabel* statusLabel_;
326 QProgressBar* progressBar_;
327 QTextEdit* logOutput_;
328 bool provisioningComplete_ = false;
329 bool provisioningSuccess_ = false;
330};
331
335class ProvisionerCompletePage final : public QWizardPage {
336 Q_OBJECT
337
338public:
340 void initializePage() override;
341
342private:
343 void setupUI();
344
346 QLabel* summaryLabel_;
347 QLabel* nextStepsLabel_ = nullptr;
348};
349
350}
351
352#endif
Implements logging infrastructure for ORE Studio.
Definition boost_severity.hpp:28
Qt-based graphical user interface for ORE Studio.
Definition AboutDialog.hpp:29
Manages the lifecycle of the NATS client and login state.
Definition ClientManager.hpp:109
Wizard for initial system bootstrap and first tenant creation.
Definition SystemProvisionerWizard.hpp:53
void provisioningFailed(const QString &errorMessage)
Emitted when provisioning fails.
void provisioningCompleted(const QString &username)
Emitted when provisioning is successfully completed.
Welcome page explaining bootstrap mode and system initialization.
Definition SystemProvisionerWizard.hpp:177
Page for creating the initial administrator account.
Definition SystemProvisionerWizard.hpp:192
Page for choosing single-tenant or multi-tenant setup mode.
Definition SystemProvisionerWizard.hpp:230
Page for configuring the first tenant's details.
Definition SystemProvisionerWizard.hpp:249
Page for creating the first tenant's admin account.
Definition SystemProvisionerWizard.hpp:276
Page for async tenant provisioning execution.
Definition SystemProvisionerWizard.hpp:302
Final page showing bootstrap completion summary.
Definition SystemProvisionerWizard.hpp:335