|
1 | 1 | #include "HostReadExecutor.h" |
2 | 2 |
|
3 | 3 | #include "../../repositories/StorageLocationRepository.h" |
| 4 | +#include "../../repositories/StorageLocationTypeRepository.h" |
4 | 5 | #include "../../repositories/PartRepository.h" |
5 | 6 | #include "../../repositories/ColorRepository.h" |
6 | 7 | #include "../../repositories/PartCategoryRepository.h" |
7 | 8 | #include "../parts/PartReferenceManifest.h" |
8 | 9 |
|
9 | 10 | #include <QElapsedTimer> |
| 11 | +#include <QHash> |
10 | 12 | #include <QDateTime> |
11 | 13 | #include <QPointer> |
12 | 14 | #include <QSqlError> |
13 | 15 | #include <QSqlQuery> |
| 16 | +#include <QSet> |
| 17 | +#include <QStringList> |
14 | 18 | #include <QUuid> |
15 | 19 |
|
16 | 20 | class HostReadExecutor::Worker : public QObject |
@@ -166,6 +170,28 @@ void HostReadExecutor::getWorkspace(int id, QObject* context, |
166 | 170 | void HostReadExecutor::listStorage(int workspaceId, QObject* context, |
167 | 171 | std::function<void(const QList<StorageLocation>&)> completion, ErrorCallback failure) |
168 | 172 | { HOST_READ_METHOD_BODY("storage.list", StorageLocationRepository(database).getByWorkspace(workspaceId), QList<StorageLocation>); } |
| 173 | +void HostReadExecutor::listStoragePortable(int workspaceId, bool includeInactive, QObject* context, |
| 174 | + std::function<void(const std::optional<QList<RemoteReadDto::StorageSummary>>&)> completion, |
| 175 | + ErrorCallback failure) |
| 176 | +{ |
| 177 | + QPointer<QObject> guard(context); |
| 178 | + enqueue(QStringLiteral("storage.list"), [=, completion=std::move(completion)] |
| 179 | + (ApplicationServices& services, const QSqlDatabase& database) mutable { |
| 180 | + if (!services.workspaces().exists(workspaceId)) { |
| 181 | + if (guard) QMetaObject::invokeMethod(guard, [guard,completion]() { if(guard) completion(std::nullopt); }, Qt::QueuedConnection); |
| 182 | + return; |
| 183 | + } |
| 184 | + StorageLocationRepository locations(database); StorageLocationTypeRepository types(database); |
| 185 | + const auto rows = includeInactive ? locations.getByWorkspaceIncludingInactive(workspaceId) |
| 186 | + : locations.getByWorkspace(workspaceId); |
| 187 | + QHash<int,QString> typeNames; for (const auto& type : types.getAll()) typeNames.insert(type.id(),type.name()); |
| 188 | + QHash<int,StorageLocation> byId; for(const auto& row:rows) byId.insert(row.id(),row); |
| 189 | + QList<RemoteReadDto::StorageSummary> result; |
| 190 | + for(const auto& row:rows){QStringList names;QSet<int>seen;int id=row.id();while(id>0&&byId.contains(id)&&!seen.contains(id)){seen.insert(id);names.prepend(byId[id].name());id=byId[id].parentLocationId();} |
| 191 | + result.append({row.id(),row.parentLocationId(),row.name(),names.join(QStringLiteral(" / ")),typeNames.value(row.locationTypeId()),row.sortOrder(),row.isActive(),row.allowsInventory(),row.allowsCollection()});} |
| 192 | + if(guard)QMetaObject::invokeMethod(guard,[guard,completion,result=std::move(result)]()mutable{if(guard)completion(result);},Qt::QueuedConnection); |
| 193 | + }, context, std::move(failure)); |
| 194 | +} |
169 | 195 | void HostReadExecutor::searchInventory(const InventorySearchCriteria& criteria, QObject* context, |
170 | 196 | std::function<void(const InventoryApplicationService::Page&)> completion, ErrorCallback failure) |
171 | 197 | { HOST_READ_METHOD_BODY("inventory.search", services.inventory().search(criteria), InventoryApplicationService::Page); } |
|
0 commit comments