TradeRepository   A
last analyzed

Complexity

Total Complexity 28

Size/Duplication

Total Lines 149
Duplicated Lines 0 %

Importance

Changes 0
Metric Value
wmc 28
eloc 76
dl 0
loc 149
rs 10
c 0
b 0
f 0

6 Methods

Rating   Name   Duplication   Size   Complexity  
A __construct() 0 2 1
C GetAssets() 0 35 12
A SaveTrade() 0 14 2
A SaveAssets() 0 23 3
A DeleteAllTrades() 0 33 6
A GetTrades() 0 29 4
1
<?php
2
namespace PhpDraft\Domain\Repositories;
3
4
use Silex\Application;
5
use PhpDraft\Domain\Entities\Trade;
6
use PhpDraft\Domain\Entities\TradeAsset;
7
use PhpDraft\Domain\Entities\Manager;
8
9
class TradeRepository {
10
  private $app;
11
12
  public function __construct(Application $app) {
13
    $this->app = $app;
14
  }
15
16
  public function GetTrades($draft_id) {
17
    $trades = array();
18
19
    $stmt = $this->app['db']->prepare("SELECT * FROM trades WHERE draft_id = ? ORDER BY trade_time");
20
    $stmt->bindParam(1, $draft_id);
21
22
    $stmt->setFetchMode(\PDO::FETCH_CLASS, '\PhpDraft\Domain\Entities\Trade');
23
24
    if (!$stmt->execute()) {
25
      throw new \Exception("Unable to load trades.");
26
    }
27
28
    //For each trade pass the manager object in so we dont thrash when loading assets from DB
29
    while ($trade = $stmt->fetch()) {
30
      try {
31
        $trade->manager1 = $this->app['phpdraft.ManagerRepository']->Load($trade->manager1_id);
32
        $trade->manager2 = $this->app['phpdraft.ManagerRepository']->Load($trade->manager2_id);
33
        $trade->trade_assets = $this->GetAssets($trade, $trade->manager1, $trade->manager2);
34
      } catch (\Exception $e) {
35
        throw new \Exception("Unable to load managers or trade assets: " . $e->getMessage());
36
      }
37
38
      //To help display of UTC times on client, append UTC to the end of the string
39
      $trade->trade_time = $this->app['phpdraft.UtilityService']->ConvertTimeForClientDisplay($trade->trade_time);
40
41
      $trades[] = $trade;
42
    }
43
44
    return $trades;
45
  }
46
47
  public function GetAssets(Trade $trade, Manager $manager1, Manager $manager2) {
48
    $assets = array();
49
50
    $stmt = $this->app['db']->prepare("SELECT * FROM trade_assets WHERE trade_id = ?");
51
    $stmt->bindParam(1, $trade->trade_id);
52
    $stmt->setFetchMode(\PDO::FETCH_CLASS, '\PhpDraft\Domain\Entities\TradeAsset');
53
54
    if (!$stmt->execute()) {
55
      throw new \Exception($stmt->errorInfo());
56
    }
57
58
    while ($asset = $stmt->fetch()) {
59
      /* @var $asset trade_asset_object */
60
      //We must use the protected $newmanager_id and $oldmanager_id because we have just pulled from DB, objs aren't automatic:
61
      if ($asset->newmanager_id != $manager1->manager_id && $asset->newmanager_id != $manager2->manager_id) {
62
              throw new \Exception('Invalid manager ID for asset: ' . $asset->newmanager_id);
63
      }
64
65
      if ($asset->oldmanager_id != $manager1->manager_id && $asset->oldmanager_id != $manager2->manager_id) {
66
              throw new \Exception('Invalid manager ID for asset: ' . $asset->oldmanager_id);
67
      }
68
69
      //Use passed in manager_objects to prevent unneccessary SELECTs to the db:
70
      $asset->player = $this->app['phpdraft.PickRepository']->Load($asset->player_id);
71
      $asset->newmanager = $asset->newmanager_id == $manager1->manager_id ? $manager1 : $manager2;
72
      $asset->oldmanager = $asset->oldmanager_id == $manager1->manager_id ? $manager1 : $manager2;
73
74
      if ($asset->player == false || $asset->newmanager == false || $asset->oldmanager == false) {
75
              throw new \Exception('Invalid asset loaded.');
76
      }
77
78
      $assets[] = $asset;
79
    }
80
81
    return $assets;
82
  }
83
84
  public function DeleteAllTrades($draft_id) {
85
    $draft_trade_stmt = $this->app['db']->prepare("SELECT * FROM trades WHERE draft_id = ?");
86
    $draft_trade_stmt->bindParam(1, $draft_id);
87
    $draft_trade_stmt->setFetchMode(\PDO::FETCH_CLASS, '\PhpDraft\Domain\Entities\Trade');
88
89
    if (!$draft_trade_stmt->execute()) {
90
      throw new \Exception("Unable to delete trades for draft $draft_id");
91
    }
92
93
    $trades = array();
94
95
    while ($trade = $draft_trade_stmt->fetch()) {
96
          $trades[] = $trade;
97
    }
98
99
    $delete_assets_stmt = $this->app['db']->prepare("DELETE FROM trade_assets WHERE trade_id = :trade_id");
100
    $delete_trade_stmt = $this->app['db']->prepare("DELETE FROM trades WHERE trade_id = :trade_id");
101
102
    foreach ($trades as $trade) {
103
      $delete_assets_stmt->bindValue(":trade_id", $trade->trade_id);
104
105
      if (!$delete_assets_stmt->execute()) {
106
              throw new \Exception("Unable to delete trade assets for $draft_id.");
107
      }
108
109
      $delete_trade_stmt->bindValue(":trade_id", $trade->trade_id);
110
111
      if (!$delete_trade_stmt->execute()) {
112
              throw new \Exception("Unable to delete trade assets for $draft_id.");
113
      }
114
    }
115
116
    return;
117
  }
118
119
  public function SaveTrade(Trade $trade) {
120
    $stmt = $this->app['db']->prepare("INSERT INTO trades (draft_id, manager1_id, manager2_id, trade_round, trade_time) VALUES (?, ?, ?, ?, UTC_TIMESTAMP())");
121
    $stmt->bindParam(1, $trade->draft_id);
122
    $stmt->bindParam(2, $trade->manager1->manager_id);
123
    $stmt->bindParam(3, $trade->manager2->manager_id);
124
    $stmt->bindParam(4, $trade->trade_round);
0 ignored issues
show
Bug introduced by
The property trade_round does not exist on PhpDraft\Domain\Entities\Trade. Did you mean trade_id?
Loading history...
125
126
    if (!$stmt->execute()) {
127
      throw new Exception("Unable to save trade.");
0 ignored issues
show
Bug introduced by
The type PhpDraft\Domain\Repositories\Exception was not found. Did you mean Exception? If so, make sure to prefix the type with \.
Loading history...
128
    }
129
130
    $trade->trade_id = (int)$this->app['db']->lastInsertId();
131
132
    return $trade;
133
  }
134
135
  public function SaveAssets(Trade $trade) {
136
    $stmt = $this->app['db']->prepare("INSERT INTO trade_assets
137
      (trade_id, player_id, oldmanager_id, newmanager_id, was_drafted)
138
      VALUES
139
      (:trade_id, :player_id, :oldmanager_id, :newmanager_id, :was_drafted)");
140
141
    $stmt->bindParam(':trade_id', $trade->trade_id);
142
143
    foreach ($trade->trade_assets as &$asset) {
144
      $stmt->bindParam(':player_id', $asset->player->player_id);
145
      $stmt->bindParam(':oldmanager_id', $asset->oldmanager->manager_id);
146
      $stmt->bindParam(':newmanager_id', $asset->newmanager->manager_id);
147
      $stmt->bindParam(':was_drafted', $asset->was_drafted);
148
149
      if (!$stmt->execute()) {
150
        throw new Exception("Unable to save trade asset #$asset->player_id");
151
      }
152
153
      $asset->trade_id = $trade->trade_id;
154
      $asset->trade_asset_id = $this->app['db']->lastInsertId();
155
    }
156
157
    return $trade;
158
  }
159
}
160