Lock.php
[Pman.Core] / Lock.php
1 <?php
2
3
4
5 /**
6  * 
7  * Locking theory
8  * 
9  * 
10  * This page is locked by XXXXXXX.. 
11  * Do you to prevent them saving and lock it yourself..
12  * 
13  * 
14  * 
15  * 
16  * 
17  * -- interacts with Roo and _lock = id..
18  * 
19  * 
20  * call : 
21  * try and lock it..
22  * baseURL + /Core/Lock/lock?on_id=...&on_table=...
23  * - returns id or an array of who has the locks.
24  * 
25  * Force an unlock after a warning..
26  * baseURL + /Core/Lock/lock?on_id=...&on_table=...&force=1
27  * - returns id..
28  * 
29  * Unlock - call when window is closed..
30  * baseURL + /Core/Lock/unlock?on_id=...&on_table=...&force=1
31  * - returns jerr or jok
32  */
33
34 require_once 'Pman.php';
35
36 class Pman_Core_Lock extends Pman
37 {
38     
39     function getAuth()
40     {
41          $au = $this->getAuthUser();
42         if (!$au) {
43              $this->jerr("Not authenticated", array('authFailure' => true));
44         }
45         $this->authUser = $au;
46         // check that it's a supplier!!!! 
47         
48         return true; 
49     }
50     
51     function get($action)
52     {
53         
54         // default action is to attempt to lock..
55         $action = empty($action) ? 'lock' : 'unlock';
56         $this->$action($curlock);
57         
58        
59         
60         
61     }
62     
63     function unlock($curlock)
64     {
65     
66         if (empty($_REQUEST['id'])) {
67             $this->jerr("No lock id");
68         }
69         $curlock = DB_DataObject::factory('Core_locking');
70         if (!$curlock->get($_REQUEST['id'])) {
71             $this->jerr("No lock exists");
72         }
73         
74         if ($curlock->person_id != $this->authUser->id) {
75             $this->jerr("Lock id is invalid");
76         }
77         
78         $curlock->delete();
79         
80         $this->jok('unlocked');
81     }
82     function lock()
83     {
84         
85         if (empty($_REQUEST['on_id']) || empty($_REQUEST['on_table'])) {
86             $this->jerr("Missing table or id");
87         }
88        
89         $tab = str_replace('/', '',$_REQUEST['on_table']); // basic protection??
90         $x = DB_DataObject::factory($tab);
91         if (!$x->get($_REQUEST['on_id'])) {
92             $this->jerr("Item does not exist");
93         }
94         // is there a current lock on the item..
95         
96         $curlock = DB_DataObject::factory('Core_locking');
97         $curlock->setFrom(array(
98             'on_id' => $_REQUEST['on_id'],
99             'on_table' => $_REQUEST['on_table']
100         ));
101         
102         
103         $nlocks = $curlock->count() 
104         if ($nlocks && empty($_REQUEST['force'])) {
105             $curlock->selectAdd();
106             $curlock->selectAdd('distinct(person_id), created');
107             
108             
109             $ar = $curlock->fetchAll('person_id', 'created');
110             $p = DB_DataObject::factory('Person');
111             $p->whereAddIn('id', $ar, 'int');
112             $p->find();
113             while ($p->fetch()) {
114                 $ret[$p->id] = $p->toRooArray();
115                 $ret[$p->id]->lock_created = $ar[$p->id];
116             }
117             $this->jok($ret);
118             
119         }
120         if ($nlocks) {
121             // trash all the locks..
122             $curlock->find();
123             while($curlock->fetch()) {
124                 $cc =clone($curlock);
125                 $cc->delete();
126             }
127         }
128         
129         // make a lock..
130         
131         $curlock = DB_DataObject::factory('Core_locking');
132         $curlock->setFrom(array(
133             'on_id' => $_REQUEST['on_id'],
134             'on_table' => $_REQUEST['on_table'],
135             'created' => date('Y-m-d H:i:s'),
136             'person_id' => $this->authUser->id,
137         ));
138         $id = $curlock->insert();
139         $this->jok($id);
140         
141     }
142      
143     
144         
145     
146 }