Skip to content

Commit 8b78cb7

Browse files
committed
Create endpoint for updating servers via jenkins
1 parent 9a0f6e5 commit 8b78cb7

File tree

6 files changed

+215
-0
lines changed

6 files changed

+215
-0
lines changed

etc/config.sample.json

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@
1111
"BNETDocs has to take a brief moment to do some system maintenance. We'll be back shortly."
1212
],
1313
"mobile_site_enabled": true,
14+
"server_update_job_token": null,
1415
"user_login_disabled": false,
1516
"user_password_pepper": "bnetdocs-INSERTRANDOMVALUEHERE",
1617
"user_register_disabled": false,

src/controllers/Server/UpdateJob.php

Lines changed: 94 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,94 @@
1+
<?php
2+
3+
namespace BNETDocs\Controllers\Server;
4+
5+
use \BNETDocs\Libraries\Exceptions\ServerNotFoundException;
6+
use \BNETDocs\Libraries\Server;
7+
8+
use \BNETDocs\Models\Server\UpdateJob as UpdateJobModel;
9+
10+
use \CarlBennett\MVC\Libraries\Common;
11+
use \CarlBennett\MVC\Libraries\Controller;
12+
use \CarlBennett\MVC\Libraries\Router;
13+
use \CarlBennett\MVC\Libraries\View as ViewLib;
14+
15+
use \DateTime;
16+
use \DateTimeZone;
17+
18+
class UpdateJob extends Controller {
19+
20+
public function &run( Router &$router, ViewLib &$view, array &$args ) {
21+
22+
$model = new UpdateJobModel();
23+
$action = $router->getRequestMethod();
24+
25+
if ( $action !== 'POST' ) {
26+
27+
$model->_responseCode = 405;
28+
$model->_responseHeaders[ 'Allow' ] = 'POST';
29+
30+
} else {
31+
32+
$query = $router->getRequestQueryArray();
33+
34+
$server_id = ( isset( $query[ 'id' ]) ? $query[ 'id' ] : null );
35+
36+
$job_token = (
37+
isset( $query[ 'job_token' ]) ? $query[ 'job_token' ] : null
38+
);
39+
40+
$status = (
41+
isset( $query[ 'status' ]) ? $query[ 'status' ] : null
42+
);
43+
44+
if ( !is_null( $server_id )) $server_id = (int) $server_id;
45+
if ( !is_null( $status )) $status = (int) $status;
46+
47+
$authenticated = (
48+
$job_token === Common::$config->bnetdocs->server_update_job_token
49+
);
50+
51+
if ( !( is_int( $server_id ) && is_int( $status ))) {
52+
53+
$model->_responseCode = 400;
54+
55+
} else if ( !$authenticated ) {
56+
57+
$model->_responseCode = 403;
58+
59+
} else {
60+
61+
try {
62+
$model->server = new Server( $server_id );
63+
} catch ( ServerNotFoundException $e ) {
64+
$model->server = null;
65+
}
66+
67+
if ( !$model->server ) {
68+
69+
$model->_responseCode = 404;
70+
71+
} else {
72+
73+
$model->old_status_bitmask = $model->server->getStatusBitmask();
74+
75+
$model->server->setStatusBitmask( $status );
76+
77+
if ( $model->server->save() ) {
78+
$model->_responseCode = 200;
79+
}
80+
81+
}
82+
}
83+
}
84+
85+
$view->render( $model );
86+
87+
$model->_responseHeaders[ 'Content-Type' ] = $view->getMimeType();
88+
$model->_responseTTL = 0;
89+
90+
return $model;
91+
92+
}
93+
94+
}

src/libraries/Server.php

Lines changed: 79 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -290,4 +290,83 @@ public function refresh() {
290290
return false;
291291
}
292292

293+
public function save() {
294+
if (!isset(Common::$database)) {
295+
Common::$database = DatabaseDriver::getDatabaseObject();
296+
}
297+
298+
try {
299+
300+
$stmt = Common::$database->prepare('
301+
UPDATE
302+
`servers`
303+
SET
304+
`address` = :address,
305+
`created_datetime` = :created_dt,
306+
`label` = :label,
307+
`port` = :port,
308+
`status_bitmask` = :status,
309+
`type_id` = :type_id,
310+
`updated_datetime` = :updated_dt,
311+
`user_id` = :user_id
312+
WHERE
313+
`id` = :id
314+
LIMIT 1;
315+
');
316+
317+
$stmt->bindParam( ':address', $this->address, PDO::PARAM_STR );
318+
$stmt->bindParam(
319+
':created_dt', $this->created_datetime, PDO::PARAM_STR
320+
);
321+
$stmt->bindParam( ':label', $this->label, PDO::PARAM_STR );
322+
$stmt->bindParam( ':id', $this->id, PDO::PARAM_INT );
323+
$stmt->bindParam( ':port', $this->port, PDO::PARAM_INT );
324+
$stmt->bindParam( ':status', $this->status_bitmask, PDO::PARAM_INT );
325+
$stmt->bindParam( ':type_id', $this->type_id, PDO::PARAM_INT );
326+
if ( is_null( $this->updated_datetime )) {
327+
$stmt->bindParam( ':updated_dt', null, PDO::PARAM_NULL );
328+
} else {
329+
$stmt->bindParam(
330+
':updated_dt', $this->updated_datetime, PDO::PARAM_STR
331+
);
332+
}
333+
if ( is_null( $this->user_id )) {
334+
$stmt->bindParam( ':user_id', null, PDO::PARAM_NULL );
335+
} else {
336+
$stmt->bindParam( ':user_id', $this->user_id, PDO::PARAM_INT );
337+
}
338+
339+
if (!$stmt->execute()) {
340+
throw new QueryException( 'Cannot save server' );
341+
}
342+
$stmt->closeCursor();
343+
344+
$object = new StdClass();
345+
$object->address = $this->address;
346+
$object->created_datetime = $this->created_datetime;
347+
$object->id = $this->id;
348+
$object->label = $this->label;
349+
$object->port = $this->port;
350+
$object->status_bitmask = $this->status_bitmask;
351+
$object->type_id = $this->type_id;
352+
$object->updated_datetime = $this->updated_datetime;
353+
$object->user_id = $this->user_id;
354+
355+
$cache_key = 'bnetdocs-server-' . $this->id;
356+
Common::$cache->set( $cache_key, serialize( $object ), 300 );
357+
Common::$cache->delete( 'bnetdocs-servers' );
358+
359+
return true;
360+
361+
} catch ( PDOException $e ) {
362+
throw new QueryException( 'Cannot save server', $e );
363+
}
364+
365+
return false;
366+
}
367+
368+
public function setStatusBitmask( $status_bitmask ) {
369+
$this->status_bitmask = $status_bitmask;
370+
}
371+
293372
}

src/main.php

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -210,6 +210,9 @@ function main() {
210210
//$router->addRoute( // URL: /server/create
211211
// "#^/server/create/?$#", "Server\\Create", "Server\\CreateHtml"
212212
//);
213+
$router->addRoute( // URL: /server/updatejob.json
214+
"#^/server/updatejob.json$#", "Server\\UpdateJob", "Server\\UpdateJobJSON"
215+
);
213216
$router->addRoute( // URL: /servers
214217
"#^/servers/?$#", "Servers", "ServersHtml"
215218
);

src/models/Server/UpdateJob.php

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
<?php
2+
3+
namespace BNETDocs\Models\Server;
4+
5+
use \CarlBennett\MVC\Libraries\Model;
6+
7+
class UpdateJob extends Model {
8+
9+
public $old_status_bitmask;
10+
public $server;
11+
12+
}

src/views/Server/UpdateJobJSON.php

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
<?php
2+
3+
namespace BNETDocs\Views\Server;
4+
5+
use \BNETDocs\Models\Server\UpdateJob as UpdateJobModel;
6+
7+
use \CarlBennett\MVC\Libraries\Common;
8+
use \CarlBennett\MVC\Libraries\Exceptions\IncorrectModelException;
9+
use \CarlBennett\MVC\Libraries\Model;
10+
use \CarlBennett\MVC\Libraries\View;
11+
12+
class UpdateJobJSON extends View {
13+
14+
public function getMimeType() {
15+
return 'application/json;charset=utf-8';
16+
}
17+
18+
public function render( Model &$model ) {
19+
if ( !$model instanceof UpdateJobModel ) {
20+
throw new IncorrectModelException();
21+
}
22+
23+
echo json_encode( $model, Common::prettyJSONIfBrowser() );
24+
}
25+
26+
}

0 commit comments

Comments
 (0)