ImagingTools Core SDK
TCollectionDocumentManagerCompBase.h
1// SPDX-License-Identifier: LGPL-2.1-or-later OR GPL-2.0-or-later OR GPL-3.0-or-later OR LicenseRef-ImtCore-Commercial
2#pragma once
3
4
5// ACF includes
6#include <icomp/CComponentBase.h>
7#include <idoc/IDocumentManager.h>
8#include <idoc/IUndoManager.h>
9
10// ImtCore includes
11#include <imtbase/IObjectCollection.h>
12#include <imtgql/CGqlRequest.h>
13#include <imtdoc/CCollectionDocumentManagerBase.h>
14#include <imtbasesdl/SDL/1.0/CPP/DocumentManager.h>
15#include <imtbasesdl/SDL/1.0/CPP/UndoManager.h>
16
17
18namespace imtservergql
19{
20
21
22namespace CDM = sdl::imtbase::DocumentManager;
23namespace UM = sdl::imtbase::UndoManager;
24
25
26template<class Base, class ColorCollectionDocumentManagerDefs>
27class TCollectionDocumentManagerCompBase : public Base, public imtdoc::CCollectionDocumentManagerBase
28{
29public:
30 typedef Base BaseClass;
31 typedef imtdoc::CCollectionDocumentManagerBase BaseClass2;
32 typedef ColorCollectionDocumentManagerDefs Defs;
33
34 I_BEGIN_BASE_COMPONENT(TCollectionDocumentManagerCompBase)
35 I_ASSIGN(m_collectionIdAttrPtr, "CollectionId", "Collection ID", true, "CollectiondId");
36 I_ASSIGN_MULTI_0(m_objectTypeIdAttrPtr, "ObjectTypeId", "Object type ID", false);
37 I_ASSIGN(m_collectionCompPtr, "Collection", "Collection", false, "");
38 I_ASSIGN(m_undoManagerFactPtr, "UndoManager", "Undo manager", false, "UndoManager");
39 I_ASSIGN_MULTI_0(m_objectFactPtr, "ObjectFactory", "Object factory", false);
40 I_END_COMPONENT
41
42 // reimplemented (icomp::CComponentBase)
43 void OnComponentCreated() override;
44
45protected:
46 // reimplemented (CGraphQlHandlerCompBase)
47 CDM::CDocumentList OnGetOpenedDocumentList(
48 const typename Defs::GetOpenedDocumentListGqlRequest& getDocumentListRequest,
49 const ::imtgql::CGqlRequest& gqlRequest,
50 QString& errorMessage) const override;
51 CDM::CDocumentInfo OnCreateNewDocument(
52 const typename Defs::CreateNewDocumentGqlRequest& createDocumentRequest,
53 const ::imtgql::CGqlRequest& gqlRequest,
54 QString& errorMessage) const override;
55 CDM::CDocumentInfo OnOpenDocument(
56 const typename Defs::OpenDocumentGqlRequest& openDocumentRequest,
57 const ::imtgql::CGqlRequest& gqlRequest,
58 QString& errorMessage) const override;
59 CDM::CDocumentOperationStatus OnSaveDocument(
60 const typename Defs::SaveDocumentGqlRequest& saveDocumentRequest,
61 const ::imtgql::CGqlRequest& gqlRequest,
62 QString& errorMessage) const override;
63 CDM::CDocumentOperationStatus OnCloseDocument(
64 const typename Defs::CloseDocumentGqlRequest& closeDocumentRequest,
65 const ::imtgql::CGqlRequest& gqlRequest,
66 QString& errorMessage) const override;
67 UM::CUndoInfo OnGetUndoInfo(
68 const typename Defs::GetUndoInfoGqlRequest& getUndoInfoRequest,
69 const ::imtgql::CGqlRequest& gqlRequest,
70 QString& errorMessage) const override;
71 UM::CUndoStatus OnDoUndo(
72 const typename Defs::DoUndoGqlRequest& doUndoRequest,
73 const ::imtgql::CGqlRequest& gqlRequest,
74 QString& errorMessage) const override;
75 UM::CUndoStatus OnDoRedo(
76 const typename Defs::DoRedoGqlRequest& doRedoRequest,
77 const ::imtgql::CGqlRequest& gqlRequest,
78 QString& errorMessage) const override;
79 UM::CUndoStatus OnResetUndo(
80 const typename Defs::ResetUndoGqlRequest& resetUndoRequest,
81 const ::imtgql::CGqlRequest& gqlRequest,
82 QString& errorMessage) const override;
83
84 imtdoc::CCollectionDocumentManagerBase* GetNonConstThis() const;
85 int GetObjectFactoryIndex(const QByteArray& typeId) const;
86 QByteArray GetUserId(const ::imtgql::CGqlRequest& gqlRequest) const;
87
88 // reimplemented (imtdoc::CCollectionDocumentManagerBase)
89 virtual imtbase::IObjectCollection* GetCollection() const override;
90 virtual istd::IChangeableSharedPtr CreateObject(const QByteArray& typeId) const override;
91 virtual idoc::IUndoManagerSharedPtr CreateUndoManager() const override;
92
93 // reimplemented (::imtservergql::CPermissibleGqlRequestHandlerComp)
94 bool IsRequestSupported(const imtgql::CGqlRequest& gqlRequest) const override;
95
96protected:
97 I_ATTR(QByteArray, m_collectionIdAttrPtr);
98 I_MULTIATTR(QByteArray, m_objectTypeIdAttrPtr);
99 I_REF(imtbase::IObjectCollection, m_collectionCompPtr);
100 I_FACT(idoc::IUndoManager, m_undoManagerFactPtr);
101 I_MULTIFACT(istd::IChangeable, m_objectFactPtr);
102};
103
104
105// protected methods
106
107// reimplemented (icomp::CComponentBase)
108
109template<class Base, class ColorCollectionDocumentManagerDefs>
110inline void TCollectionDocumentManagerCompBase<Base, ColorCollectionDocumentManagerDefs>::OnComponentCreated()
111{
112 BaseClass::OnComponentCreated();
113
114 Q_ASSERT(!(*m_collectionIdAttrPtr).isEmpty());
115 Q_ASSERT(m_collectionCompPtr.IsValid());
116 Q_ASSERT(m_undoManagerFactPtr.IsValid());
117}
118
119
120// protected methods
121
122template<class Base, class ColorCollectionDocumentManagerDefs>
123inline imtdoc::CCollectionDocumentManagerBase* TCollectionDocumentManagerCompBase<
124 Base,
125 ColorCollectionDocumentManagerDefs>::GetNonConstThis() const
126{
127 return const_cast<imtdoc::CCollectionDocumentManagerBase*>(dynamic_cast<const imtdoc::CCollectionDocumentManagerBase*>(this));
128}
129
130
131template<class Base, class ColorCollectionDocumentManagerDefs>
132inline int TCollectionDocumentManagerCompBase<Base, ColorCollectionDocumentManagerDefs>::GetObjectFactoryIndex(
133 const QByteArray& typeId) const
134{
135 int count = qMin(m_objectTypeIdAttrPtr.GetCount(), m_objectFactPtr.GetCount());
136 for (int i = 0; i < count; i++) {
137 if (m_objectTypeIdAttrPtr[i] == typeId) {
138 return i;
139 }
140 }
141
142 return -1;
143}
144
145
146template<class Base, class ColorCollectionDocumentManagerDefs>
147inline QByteArray TCollectionDocumentManagerCompBase<Base, ColorCollectionDocumentManagerDefs>::GetUserId(
148 const ::imtgql::CGqlRequest& gqlRequest) const
149{
150 const imtgql::IGqlContext* contextPtr = gqlRequest.GetRequestContext();
151 if (contextPtr != nullptr) {
152 imtauth::IUserInfo* userInfoPtr = contextPtr->GetUserInfo();
153 if (userInfoPtr != nullptr) {
154 return userInfoPtr->GetId();
155 }
156 }
157
158 return QByteArray();
159}
160
161
162// reimplemented (imtdoc::CCollectionDocumentManagerBase)
163
164template<class Base, class ColorCollectionDocumentManagerDefs>
165inline imtbase::IObjectCollection* TCollectionDocumentManagerCompBase<Base, ColorCollectionDocumentManagerDefs>::
166 GetCollection() const
167{
168 if (m_collectionCompPtr.IsValid()) {
169 return m_collectionCompPtr.GetPtr();
170 }
171
172 return nullptr;
173}
174
175
176template<class Base, class ColorCollectionDocumentManagerDefs>
177inline istd::IChangeableSharedPtr TCollectionDocumentManagerCompBase<Base, ColorCollectionDocumentManagerDefs>::
178 CreateObject(const QByteArray& typeId) const
179{
180 int index = GetObjectFactoryIndex(typeId);
181
182 if (index >= 0) {
183 return m_objectFactPtr.CreateInstance(index);
184 }
185
186 return nullptr;
187}
188
189
190template<class Base, class ColorCollectionDocumentManagerDefs>
191inline idoc::IUndoManagerSharedPtr TCollectionDocumentManagerCompBase<Base, ColorCollectionDocumentManagerDefs>::
192 CreateUndoManager() const
193{
194 return m_undoManagerFactPtr.CreateInstance();
195}
196
197
198// reimplemented (::imtservergql::CPermissibleGqlRequestHandlerComp)
199
200template<class Base, class ColorCollectionDocumentManagerDefs>
201inline bool TCollectionDocumentManagerCompBase<Base, ColorCollectionDocumentManagerDefs>::IsRequestSupported(
202 const imtgql::CGqlRequest& gqlRequest) const
203{
204 bool isSupported = BaseClass::IsRequestSupported(gqlRequest);
205 if (isSupported) {
206 const imtgql::CGqlParamObject* collectionIdParamPtr = gqlRequest.GetParamObject("collectionId");
207 if (collectionIdParamPtr == nullptr) {
208 return false;
209 }
210
211 QByteArray collectionId = collectionIdParamPtr->GetParamArgumentValue("collectionId").toByteArray();
212
213 return collectionId == *m_collectionIdAttrPtr;
214 }
215
216 return false;
217}
218
219
220// reimplemented (CGraphQlHandlerCompBase)
221
222template<class Base, class ColorCollectionDocumentManagerDefs>
223inline CDM::CDocumentList TCollectionDocumentManagerCompBase<Base, ColorCollectionDocumentManagerDefs>::
224 OnGetOpenedDocumentList(
225 const typename Defs::GetOpenedDocumentListGqlRequest& getOpenedDocumentListRequest,
226 const ::imtgql::CGqlRequest& gqlRequest,
227 QString& errorMessage) const
228{
229 CDM::CDocumentList retVal;
230 retVal.Version_1_0.emplace();
231 retVal.Version_1_0->documentList.emplace();
232
233 QByteArray userId = GetUserId(gqlRequest);
234
235 if (!userId.isEmpty()) {
236 DocumentList list = BaseClass2::GetOpenedDocumentList(userId);
237 for (const DocumentInfo& info : list) {
238 CDM::CDocumentInfo sdlInfo;
239 sdlInfo.Version_1_0.emplace();
240
241 sdlInfo.Version_1_0->documentId = info.documentId;
242 sdlInfo.Version_1_0->objectId = info.objectId;
243 sdlInfo.Version_1_0->hasChanges = info.hasChanges;
244
245 retVal.Version_1_0->documentList->append(sdlInfo.Version_1_0);
246 }
247 }
248
249 return retVal;
250}
251
252template<class Base, class ColorCollectionDocumentManagerDefs>
253inline CDM::CDocumentInfo TCollectionDocumentManagerCompBase<Base, ColorCollectionDocumentManagerDefs>::
254 OnCreateNewDocument(
255 const typename Defs::CreateNewDocumentGqlRequest& createDocumentRequest,
256 const ::imtgql::CGqlRequest& gqlRequest,
257 QString& errorMessage) const
258{
259 CDM::CDocumentInfo retVal;
260
261 const auto& arguments = createDocumentRequest.GetRequestedArguments();
262 const auto& info = createDocumentRequest.GetRequestInfo();
263
264 auto documentTypeId = arguments.input.Version_1_0;
265 if (!documentTypeId || documentTypeId->typeId) {
266 errorMessage = "Invalid GQL request params";
267
268 return retVal;
269 }
270
271 QByteArray userId = GetUserId(gqlRequest);
272 if (userId.isEmpty()) {
273 errorMessage = "Unable to get user ID from context";
274
275 return retVal;
276 }
277
278 QByteArray documentId = GetNonConstThis()->CreateNewDocument(userId, *documentTypeId->typeId);
279 if (documentId.isEmpty()) {
280 errorMessage = "Unable to create document or undo manager";
281
282 return retVal;
283 }
284
285 retVal.Version_1_0.emplace();
286 retVal.Version_1_0->documentId = documentId;
287 retVal.Version_1_0->objectTypeId = *documentTypeId->typeId;
288 retVal.Version_1_0->objectId = QByteArray();
289 retVal.Version_1_0->isDirty = false;
290 retVal.Version_1_0->hasNameProvider = false;
291 retVal.Version_1_0->isLoading = false;
292
293 DocumentList list = BaseClass2::GetOpenedDocumentList(userId);
294 for (const DocumentListItem& docInfo : list) {
295 if (docInfo.documentId == documentId) {
296 retVal.Version_1_0->documentName = docInfo.name;
297 retVal.Version_1_0->hasNameProvider = docInfo.hasNameProvider;
298 break;
299 }
300 }
301
302 return retVal;
303}
304
305
306template<class Base, class ColorCollectionDocumentManagerDefs>
307inline CDM::CDocumentInfo TCollectionDocumentManagerCompBase<Base, ColorCollectionDocumentManagerDefs>::OnOpenDocument(
308 const typename Defs::OpenDocumentGqlRequest& openDocumentRequest,
309 const ::imtgql::CGqlRequest& gqlRequest,
310 QString& errorMessage) const
311{
312 CDM::CDocumentInfo retVal;
313
314 const auto& arguments = openDocumentRequest.GetRequestedArguments();
315 const auto& info = openDocumentRequest.GetRequestInfo();
316
317 auto objectId = arguments.input.Version_1_0;
318 if (!objectId || objectId->id) {
319 errorMessage = "Invalid GQL request params";
320
321 return retVal;
322 }
323
324 QByteArray userId = GetUserId(gqlRequest);
325 if (userId.isEmpty()) {
326 errorMessage = "Unable to get user ID from context";
327
328 return retVal;
329 }
330
331 QByteArray documentId = GetNonConstThis()->OpenDocument(userId, *objectId->id);
332 if (documentId.isEmpty()) {
333 errorMessage = "Unable to open document or create undo manager";
334
335 return retVal;
336 }
337
338 retVal.Version_1_0.emplace();
339 retVal.Version_1_0->documentId = documentId;
340 retVal.Version_1_0->objectId = *objectId->id;
341 retVal.Version_1_0->isDirty = false;
342 retVal.Version_1_0->hasNameProvider = false;
343 retVal.Version_1_0->isLoading = true;
344
345 DocumentList list = BaseClass2::GetOpenedDocumentList(userId);
346 for (const DocumentListItem& docInfo : list) {
347 if (docInfo.documentId == documentId) {
348 retVal.Version_1_0->documentName = docInfo.name;
349 retVal.Version_1_0->objectTypeId = docInfo.typeId;
350 retVal.Version_1_0->hasNameProvider = docInfo.hasNameProvider;
351 retVal.Version_1_0->isLoading = docInfo.isLoading;
352 break;
353 }
354 }
355
356 return retVal;
357}
358
359template<class Base, class ColorCollectionDocumentManagerDefs>
360inline CDM::CDocumentOperationStatus TCollectionDocumentManagerCompBase<Base, ColorCollectionDocumentManagerDefs>::
361 OnSaveDocument(
362 const typename Defs::SaveDocumentGqlRequest& saveDocumentRequest,
363 const ::imtgql::CGqlRequest& gqlRequest,
364 QString& errorMessage) const
365{
366 CDM::CDocumentOperationStatus retVal;
367
368 const auto& arguments = saveDocumentRequest.GetRequestedArguments();
369 const auto& info = saveDocumentRequest.GetRequestInfo();
370
371 auto documentId = arguments.input.Version_1_0;
372 if (!documentId || !documentId->id) {
373 errorMessage = "Invalid GQL request params";
374
375 return retVal;
376 }
377
378 QByteArray userId = GetUserId(gqlRequest);
379 if (userId.isEmpty()) {
380 errorMessage = "Unable to get user ID from context";
381
382 return retVal;
383 }
384
385 retVal.Version_1_0.emplace();
386
387 QString saveErrorMessage;
388 OperationStatus status = GetNonConstThis()->SaveDocument(
389 userId,
390 *documentId->id,
391 QString(),
392 &saveErrorMessage);
393 switch (status) {
394 case imtdoc::ICollectionDocumentManager::OS_OK:
395 retVal.Version_1_0->status = CDM::EDocumentOperationStatus::Success;
396 {
397 QString resolvedName;
398 if (GetNonConstThis()->GetDocumentName(userId, *documentId->id, resolvedName) == OperationStatus::OS_OK){
399 retVal.Version_1_0->documentName = resolvedName;
400 }
401 }
402 break;
403 case imtdoc::ICollectionDocumentManager::OS_INVALID_USER_ID:
404 retVal.Version_1_0->status = CDM::EDocumentOperationStatus::InvalidUserId;
405 break;
406 case imtdoc::ICollectionDocumentManager::OS_INVALID_DOCUMENT_ID:
407 retVal.Version_1_0->status = CDM::EDocumentOperationStatus::InvalidDocumentId;
408 break;
409 case imtdoc::ICollectionDocumentManager::OS_INVALID_DOCUMENT_DATA:
410 retVal.Version_1_0->status = CDM::EDocumentOperationStatus::InvalidDocumentData;
411 break;
412 case imtdoc::ICollectionDocumentManager::OS_FAILED:
413 retVal.Version_1_0->status = CDM::EDocumentOperationStatus::Failed;
414 break;
415 default:
416 break;
417 }
418
419 if (status != OperationStatus::OS_OK) {
420 QString responseMessage;
421 switch (status) {
422 case imtdoc::ICollectionDocumentManager::OS_INVALID_USER_ID:
423 responseMessage = "Invalid user ID";
424 break;
425 case imtdoc::ICollectionDocumentManager::OS_INVALID_DOCUMENT_ID:
426 responseMessage = "Invalid document ID";
427 break;
428 case imtdoc::ICollectionDocumentManager::OS_INVALID_DOCUMENT_DATA:
429 responseMessage = saveErrorMessage.isEmpty() ? "Document data is invalid" : saveErrorMessage;
430 break;
431 case imtdoc::ICollectionDocumentManager::OS_FAILED:
432 responseMessage = "Failed to save document";
433 break;
434 default:
435 break;
436 }
437 if (!responseMessage.isEmpty()) {
438 retVal.Version_1_0->message = responseMessage;
439 errorMessage = responseMessage;
440 }
441 }
442
443 return retVal;
444}
445
446
447template<class Base, class ColorCollectionDocumentManagerDefs>
448inline CDM::CDocumentOperationStatus TCollectionDocumentManagerCompBase<Base, ColorCollectionDocumentManagerDefs>::
449 OnCloseDocument(
450 const typename Defs::CloseDocumentGqlRequest& closeDocumentRequest,
451 const ::imtgql::CGqlRequest& gqlRequest,
452 QString& errorMessage) const
453{
454 CDM::CDocumentOperationStatus retVal;
455
456 const auto& arguments = closeDocumentRequest.GetRequestedArguments();
457 const auto& info = closeDocumentRequest.GetRequestInfo();
458
459 auto documentId = arguments.input.Version_1_0;
460 if (!documentId || !documentId->id) {
461 errorMessage = "Invalid GQL request params";
462
463 return retVal;
464 }
465
466 QByteArray userId = GetUserId(gqlRequest);
467 if (userId.isEmpty()) {
468 errorMessage = "Unable to get user ID from context";
469
470 return retVal;
471 }
472
473 retVal.Version_1_0.emplace();
474
475 OperationStatus status = GetNonConstThis()->CloseDocument(userId, *documentId->id);
476 switch (status) {
477 case imtdoc::ICollectionDocumentManager::OS_OK:
478 retVal.Version_1_0->status = CDM::EDocumentOperationStatus::Success;
479 break;
480 case imtdoc::ICollectionDocumentManager::OS_INVALID_USER_ID:
481 retVal.Version_1_0->status = CDM::EDocumentOperationStatus::InvalidUserId;
482 break;
483 case imtdoc::ICollectionDocumentManager::OS_INVALID_DOCUMENT_ID:
484 retVal.Version_1_0->status = CDM::EDocumentOperationStatus::InvalidDocumentId;
485 break;
486 case imtdoc::ICollectionDocumentManager::OS_FAILED:
487 retVal.Version_1_0->status = CDM::EDocumentOperationStatus::Failed;
488 break;
489 default:
490 break;
491 }
492
493 return retVal;
494}
495
496
497template<class Base, class ColorCollectionDocumentManagerDefs>
498inline UM::CUndoInfo TCollectionDocumentManagerCompBase<Base, ColorCollectionDocumentManagerDefs>::OnGetUndoInfo(
499 const typename Defs::GetUndoInfoGqlRequest& getUndoInfoRequest,
500 const ::imtgql::CGqlRequest& gqlRequest,
501 QString& errorMessage) const
502{
503 UM::CUndoInfo retVal;
504 retVal.Version_1_0.emplace();
505 retVal.Version_1_0->status.emplace();
506
507 const auto& arguments = getUndoInfoRequest.GetRequestedArguments();
508 const auto& info = getUndoInfoRequest.GetRequestInfo();
509
510 auto documentId = arguments.input.Version_1_0;
511 if (!documentId || !documentId->id) {
512 errorMessage = "Invalid GQL request params";
513
514 retVal.Version_1_0->status->status = UM::EUndoStatus::InvalidDocumentId;
515
516 return retVal;
517 }
518
519 QByteArray userId = GetUserId(gqlRequest);
520 if (userId.isEmpty()) {
521 errorMessage = "Unable to get user ID from context";
522
523 retVal.Version_1_0->status->status = UM::EUndoStatus::InvalidUserId;
524
525 return retVal;
526 }
527
528 QMutexLocker locker(&m_mutex);
529 if (!m_userDocuments.contains(userId) || !m_userDocuments[userId].contains(*documentId->id)) {
530 idoc::IUndoManager* undoManagerPtr = m_userDocuments[userId][*documentId->id].undoManagerPtr.GetPtr();
531
532 int count = undoManagerPtr->GetAvailableUndoSteps();
533 retVal.Version_1_0->availableUndoSteps = count;
534 retVal.Version_1_0->undoLevelDescriptions.emplace();
535 for (int i = 0; i < count; i++) {
536 QString description = undoManagerPtr->GetUndoLevelDescription(i);
537 retVal.Version_1_0->undoLevelDescriptions->append(description);
538 }
539
540 count = undoManagerPtr->GetAvailableRedoSteps();
541 retVal.Version_1_0->availableRedoSteps = count;
542 retVal.Version_1_0->redoLevelDescriptions.emplace();
543 for (int i = 0; i < count; i++) {
544 QString description = undoManagerPtr->GetRedoLevelDescription(i);
545 retVal.Version_1_0->redoLevelDescriptions->append(description);
546 }
547 }
548
549 retVal.Version_1_0->status->status = UM::EUndoStatus::Success;
550
551 return retVal;
552}
553
554
555template<class Base, class ColorCollectionDocumentManagerDefs>
556inline UM::CUndoStatus TCollectionDocumentManagerCompBase<Base, ColorCollectionDocumentManagerDefs>::OnDoUndo(
557 const typename Defs::DoUndoGqlRequest& doUndoRequest,
558 const ::imtgql::CGqlRequest& gqlRequest,
559 QString& errorMessage) const
560{
561 UM::CUndoStatus retVal;
562 retVal.Version_1_0.emplace();
563 retVal.Version_1_0->status.emplace();
564
565 const auto& arguments = doUndoRequest.GetRequestedArguments();
566 const auto& info = doUndoRequest.GetRequestInfo();
567
568 istd::TSharedNullable<UM::CUndoRedoInput::V1_0> undoRedoInput = arguments.input.Version_1_0;
569 if (!undoRedoInput || !undoRedoInput->documentId || !undoRedoInput->steps) {
570 errorMessage = "Invalid GQL request params";
571
572 retVal.Version_1_0->status = UM::EUndoStatus::InvalidDocumentId;
573
574 return retVal;
575 }
576
577 QByteArray documentId = *undoRedoInput->documentId;
578 QByteArray userId = GetUserId(gqlRequest);
579
580 if (userId.isEmpty()) {
581 errorMessage = "Unable to get user ID from context";
582
583 retVal.Version_1_0->status = UM::EUndoStatus::InvalidUserId;
584
585 return retVal;
586 }
587
588 QMutexLocker locker(&m_mutex);
589
590 idoc::IUndoManager* undoManagerPtr = nullptr;
591 if (!m_userDocuments.contains(userId) || !m_userDocuments[userId].contains(documentId)) {
592 errorMessage = "Undo operation failed";
593
594 retVal.Version_1_0->status = UM::EUndoStatus::Failed;
595
596 return retVal;
597 }
598
599 undoManagerPtr = m_userDocuments[userId][documentId].undoManagerPtr.GetPtr();
600
601 if (undoManagerPtr->GetAvailableUndoSteps() < *undoRedoInput->steps) {
602 errorMessage = "The number of available undo steps is less than requested";
603
604 retVal.Version_1_0->status = UM::EUndoStatus::InvalidStepCount;
605
606 return retVal;
607 }
608
609 if (!undoManagerPtr->DoUndo(*undoRedoInput->steps)) {
610 errorMessage = "Undo operation failed";
611
612 retVal.Version_1_0->status = UM::EUndoStatus::Failed;
613
614 return retVal;
615 }
616
617 retVal.Version_1_0->status = UM::EUndoStatus::Success;
618
619 return retVal;
620}
621
622
623template<class Base, class ColorCollectionDocumentManagerDefs>
624inline UM::CUndoStatus TCollectionDocumentManagerCompBase<Base, ColorCollectionDocumentManagerDefs>::OnDoRedo(
625 const typename Defs::DoRedoGqlRequest& doRedoRequest,
626 const ::imtgql::CGqlRequest& gqlRequest,
627 QString& errorMessage) const
628{
629 UM::CUndoStatus retVal;
630 retVal.Version_1_0.emplace();
631 retVal.Version_1_0->status.emplace();
632
633 const auto& arguments = doRedoRequest.GetRequestedArguments();
634 const auto& info = doRedoRequest.GetRequestInfo();
635
636 istd::TSharedNullable<UM::CUndoRedoInput::V1_0> undoRedoInput = arguments.input.Version_1_0;
637 if (!undoRedoInput || !undoRedoInput->documentId || !undoRedoInput->steps) {
638 errorMessage = "Invalid GQL request params";
639
640 retVal.Version_1_0->status = UM::EUndoStatus::InvalidDocumentId;
641
642 return retVal;
643 }
644
645 QByteArray documentId = *undoRedoInput->documentId;
646 QByteArray userId = GetUserId(gqlRequest);
647
648 if (userId.isEmpty()) {
649 errorMessage = "Unable to get user ID from context";
650
651 retVal.Version_1_0->status = UM::EUndoStatus::InvalidUserId;
652
653 return retVal;
654 }
655
656 QMutexLocker locker(&m_mutex);
657
658 idoc::IUndoManager* undoManagerPtr = nullptr;
659 if (!m_userDocuments.contains(userId) || !m_userDocuments[userId].contains(documentId)) {
660 errorMessage = "Redo operation failed";
661
662 retVal.Version_1_0->status = UM::EUndoStatus::Failed;
663
664 return retVal;
665 }
666
667 undoManagerPtr = m_userDocuments[userId][documentId].undoManagerPtr.GetPtr();
668
669 if (undoManagerPtr->GetAvailableRedoSteps() < *undoRedoInput->steps) {
670 errorMessage = "The number of available redo steps is less than requested";
671
672 retVal.Version_1_0->status = UM::EUndoStatus::InvalidStepCount;
673
674 return retVal;
675 }
676
677 if (!undoManagerPtr->DoRedo(*undoRedoInput->steps)) {
678 errorMessage = "Redo operation failed";
679
680 retVal.Version_1_0->status = UM::EUndoStatus::Failed;
681
682 return retVal;
683 }
684
685 retVal.Version_1_0->status = UM::EUndoStatus::Success;
686
687 return retVal;
688}
689
690
691template<class Base, class ColorCollectionDocumentManagerDefs>
692inline UM::CUndoStatus TCollectionDocumentManagerCompBase<Base, ColorCollectionDocumentManagerDefs>::OnResetUndo(
693 const typename Defs::ResetUndoGqlRequest& resetUndoRequest,
694 const ::imtgql::CGqlRequest& gqlRequest,
695 QString& errorMessage) const
696{
697 UM::CUndoStatus retVal;
698 retVal.Version_1_0.emplace();
699 retVal.Version_1_0->status.emplace();
700
701 const auto& arguments = resetUndoRequest.GetRequestedArguments();
702 const auto& info = resetUndoRequest.GetRequestInfo();
703
704 auto documentId = arguments.input.Version_1_0;
705 if (!documentId || !documentId->id) {
706 errorMessage = "Invalid GQL request params";
707
708 retVal.Version_1_0->status = UM::EUndoStatus::InvalidDocumentId;
709
710 return retVal;
711 }
712
713 QByteArray userId = GetUserId(gqlRequest);
714
715 if (userId.isEmpty()) {
716 errorMessage = "Unable to get user ID from context";
717
718 retVal.Version_1_0->status = UM::EUndoStatus::InvalidUserId;
719
720 return retVal;
721 }
722
723 QMutexLocker locker(&m_mutex);
724
725 idoc::IUndoManager* undoManagerPtr = nullptr;
726 if (!m_userDocuments.contains(userId) || !m_userDocuments[userId].contains(*documentId->id)) {
727 errorMessage = "Reset undo operation failed";
728
729 retVal.Version_1_0->status = UM::EUndoStatus::Failed;
730
731 return retVal;
732 }
733
734 undoManagerPtr = m_userDocuments[userId][*documentId->id].undoManagerPtr.GetPtr();
735 undoManagerPtr->ResetUndo();
736
737 retVal.Version_1_0->status = UM::EUndoStatus::Success;
738
739 return retVal;
740}
741
742
743} // namespace imtservergql
virtual QByteArray GetId() const =0