Passed
Branch master (182172)
by Matthew
04:03 queued 01:23
created

TradeRepository::SaveAssets()   A

Complexity

Conditions 3
Paths 3

Size

Total Lines 23
Code Lines 12

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
dl 0
loc 23
rs 9.0856
c 0
b 0
f 0
cc 3
eloc 12
nc 3
nop 1
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
      if ($asset->oldmanager_id != $manager1->manager_id && $asset->oldmanager_id != $manager2->manager_id)
65
        throw new \Exception('Invalid manager ID for asset: ' . $asset->oldmanager_id);
66
67
      //Use passed in manager_objects to prevent unneccessary SELECTs to the db:
68
      $asset->player = $this->app['phpdraft.PickRepository']->Load($asset->player_id);
69
      $asset->newmanager = $asset->newmanager_id == $manager1->manager_id ? $manager1 : $manager2;
70
      $asset->oldmanager = $asset->oldmanager_id == $manager1->manager_id ? $manager1 : $manager2;
71
72
      if ($asset->player == false || $asset->newmanager == false || $asset->oldmanager == false)
73
        throw new \Exception('Invalid asset loaded.');
74
75
      $assets[] = $asset;
76
    }
77
78
    return $assets;
79
  }
80
81
  public function DeleteAllTrades($draft_id) {
82
    $draft_trade_stmt = $this->app['db']->prepare("SELECT * FROM trades WHERE draft_id = ?");
83
    $draft_trade_stmt->bindParam(1, $draft_id);
84
    $draft_trade_stmt->setFetchMode(\PDO::FETCH_CLASS, '\PhpDraft\Domain\Entities\Trade');
85
86
    if(!$draft_trade_stmt->execute()) {
87
      throw new \Exception("Unable to delete trades for draft $draft_id");
88
    }
89
90
    $trades = array();
91
92
    while ($trade = $draft_trade_stmt->fetch())
93
      $trades[] = $trade;
94
95
    $delete_assets_stmt = $this->app['db']->prepare("DELETE FROM trade_assets WHERE trade_id = :trade_id");
96
    $delete_trade_stmt = $this->app['db']->prepare("DELETE FROM trades WHERE trade_id = :trade_id");
97
98
    foreach ($trades as $trade) {
99
      $delete_assets_stmt->bindValue(":trade_id", $trade->trade_id);
100
101
      if (!$delete_assets_stmt->execute())
102
        throw new \Exception("Unable to delete trade assets for $draft_id.");
103
104
      $delete_trade_stmt->bindValue(":trade_id", $trade->trade_id);
105
106
      if (!$delete_trade_stmt->execute())
107
        throw new \Exception("Unable to delete trade assets for $draft_id.");
108
    }
109
110
    return;
111
  }
112
113
  public function SaveTrade(Trade $trade) {
114
    $stmt = $this->app['db']->prepare("INSERT INTO trades (draft_id, manager1_id, manager2_id, trade_round, trade_time) VALUES (?, ?, ?, ?, UTC_TIMESTAMP())");
115
    $stmt->bindParam(1, $trade->draft_id);
116
    $stmt->bindParam(2, $trade->manager1->manager_id);
117
    $stmt->bindParam(3, $trade->manager2->manager_id);
118
    $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...
119
120
    if (!$stmt->execute()) {
121
      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...
122
    }
123
124
    $trade->trade_id = (int)$this->app['db']->lastInsertId();
125
126
    return $trade;
127
  }
128
129
  public function SaveAssets(Trade $trade) {
130
    $stmt = $this->app['db']->prepare("INSERT INTO trade_assets
131
      (trade_id, player_id, oldmanager_id, newmanager_id, was_drafted)
132
      VALUES
133
      (:trade_id, :player_id, :oldmanager_id, :newmanager_id, :was_drafted)");
134
135
    $stmt->bindParam(':trade_id', $trade->trade_id);
136
137
    foreach($trade->trade_assets as &$asset) {
138
      $stmt->bindParam(':player_id', $asset->player->player_id);
139
      $stmt->bindParam(':oldmanager_id', $asset->oldmanager->manager_id);
140
      $stmt->bindParam(':newmanager_id', $asset->newmanager->manager_id);
141
      $stmt->bindParam(':was_drafted', $asset->was_drafted);
142
143
      if(!$stmt->execute()) {
144
        throw new Exception("Unable to save trade asset #$asset->player_id");
145
      }
146
147
      $asset->trade_id = $trade->trade_id;
148
      $asset->trade_asset_id = $this->app['db']->lastInsertId();
149
    }
150
151
    return $trade;
152
  }
153
}