1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
// This file is part of Anagolay Foundation.
// Copyright (C) 2019-2022 Anagolay Foundation.
// SPDX-License-Identifier: GPL-3.0-or-later WITH Classpath-exception-2.0

// This program is free software: you can redistribute it and/or modify
// it under the terms of the GNU General Public License as published by
// the Free Software Foundation, either version 3 of the License, or
// (at your option) any later version.

// This program is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
// GNU General Public License for more details.

// You should have received a copy of the GNU General Public License
// along with this program. If not, see <https://www.gnu.org/licenses/>.

//! Business logic is located here.
//!
//! Each pallet must have this file.

use super::*;
use crate::types::{Operation, OperationRecord, OperationVersion, OperationVersionRecord};
use sp_std::borrow::ToOwned;

impl<T: Config> Pallet<T> {
  /// Inserts the Operation into the `OperationsByOperationIdAndAccountId` storage
  /// Increases the `Total` Operation count
  ///
  /// Does no checks.
  ///
  /// # Arguments
  ///  * operation - The Operation to insert
  ///  * account_id - The owner of the Operation
  ///  * block_number - Current block
  pub fn do_create_operation(operation: &Operation, account_id: &T::AccountId, block_number: T::BlockNumber) {
    let record = OperationRecord::<T> {
      record: operation.clone(),
      account_id: account_id.clone(),
      block_number,
    };

    OperationByOperationIdAndAccountId::<T>::insert(operation.id.clone(), account_id.clone(), record);

    Total::<T>::put(Self::total().saturating_add(1));
  }

  /// Inserts the Operation Version into the `VersionsByOperationId` and
  /// `Versions` storages Insert each package cid in the `PackageCid` storage
  ///
  /// Does no checks.
  ///
  /// # Arguments
  ///  * operation_version - The Operation Version to insert
  ///  * account_id - The owner of the Operation
  ///  * block_number - Current block
  pub fn do_create_operation_version(
    operation_version: &OperationVersion,
    account_id: &T::AccountId,
    block_number: T::BlockNumber,
  ) {
    let record = OperationVersionRecord::<T> {
      record: operation_version.clone(),
      account_id: account_id.clone(),
      block_number,
    };

    let operation_id = &operation_version.data.entity_id.as_ref().unwrap();
    let operation_version_id = operation_version.id.to_owned();

    VersionByVersionId::<T>::insert(&operation_version_id, record);

    VersionIdsByOperationId::<T>::mutate(operation_id, |versions| {
      versions.push(operation_version_id.clone());
    });

    anagolay_support::Pallet::<T>::store_artifacts(&operation_version.data.artifacts);
  }
}