Browse Source

add subscription request detail page

master
Aaron Parecki 9 years ago
parent
commit
2da201978e
7 changed files with 300 additions and 1 deletions
  1. +34
    -0
      controllers/controllers.php
  2. +4
    -1
      lib/PushTask.php
  3. +4
    -0
      lib/db_helpers.php
  4. +130
    -0
      public/css/style.css
  5. +27
    -0
      views/index.php
  6. +65
    -0
      views/layout.php
  7. +36
    -0
      views/subscription-status.php

+ 34
- 0
controllers/controllers.php View File

@ -0,0 +1,34 @@
<?php
$app->get('/', function() use($app) {
$res = $app->response();
ob_start();
render('index', array(
'title' => 'Switchboard',
'meta' => ''
));
$html = ob_get_clean();
$res->body($html);
});
$app->get('/subscription/:hash', function($hash) use($app) {
$res = $app->response();
$subscription = db\get_by_col('subscriptions', 'hash', $hash);
$feed = db\get_by_id('feeds', $subscription->feed_id);
if(!$subscription) {
$app->response()->status(404);
} else {
ob_start();
render('subscription-status', array(
'title' => 'Switchboard',
'meta' => '',
'subscription' => $subscription,
'feed' => $feed
));
$html = ob_get_clean();
$res->body($html);
}
});

+ 4
- 1
lib/PushTask.php View File

@ -33,6 +33,8 @@ class PushTask {
$response = request\get_url($url, true); $response = request\get_url($url, true);
$subscription->challenge_response = $response['headers']."\n\n".$response['body'];
if(request\response_is($response['status'], 2) && $response['body'] == $subscription->challenge) { if(request\response_is($response['status'], 2) && $response['body'] == $subscription->challenge) {
// The subscriber replied with a 2xx status code and confirmed the challenge string. // The subscriber replied with a 2xx status code and confirmed the challenge string.
// The subscription is confirmed and active. // The subscription is confirmed and active.
@ -41,13 +43,14 @@ class PushTask {
$subscription->date_expires = $exp_date; $subscription->date_expires = $exp_date;
db\set_updated($subscription); db\set_updated($subscription);
$subscription->active = 1; $subscription->active = 1;
$subscription->save();
} else { } else {
// The subscriber did not confirm the subscription, so reject it // The subscriber did not confirm the subscription, so reject it
} }
$subscription->save();
print_r($response); print_r($response);
} }

+ 4
- 0
lib/db_helpers.php View File

@ -48,3 +48,7 @@ function feed_from_url($url) {
function get_by_id($table, $id) { function get_by_id($table, $id) {
return ORM::for_table($table)->where('id', $id)->find_one(); return ORM::for_table($table)->where('id', $id)->find_one();
} }
function get_by_col($table, $col, $val) {
return ORM::for_table($table)->where($col, $val)->find_one();
}

+ 130
- 0
public/css/style.css View File

@ -0,0 +1,130 @@
body {
padding-top: 10px;
background: #fff;
}
body.logged-out {
background: white;
}
.logged-out .jumbotron {
background-color: #fffbeb;
border: 1px #fff2bc solid;
}
.header {
font-family:; "Helvetica Neue",Helvetica,Arial,sans-serif;
font-size: 22px;
font-weight: 500;
color: #888;
border-bottom: 6px #ddd solid;
padding-bottom: 4px;
}
.narrow {
max-width: 700px;
margin-right: auto;
margin-left: auto;
}
.footer {
padding: 0;
margin-top: 20px;
text-align: center;
color: #999;
background-color: #f9f9f9;
border-top: 1px #e5e5e5 solid;
position: absolute;
bottom: 0;
width: 100%;
}
.footer .nav {
max-width: 700px;
margin-right: auto;
margin-left: auto;
}
.footer .credits {
padding: 20px;
font-size: 12px;
}
.jumbotron .tagline {
font-size: 23px;
}
.jumbotron p {
font-size: 18px;
}
/**
* Bootstrap callouts
*/
/* Base styles (regardless of theme) */
.bs-callout {
margin: 20px 0;
padding: 15px 30px 15px 15px;
border-left: 5px solid #eee;
}
.bs-callout h4 {
margin-top: 0;
}
.bs-callout p:last-child {
margin-bottom: 0;
}
.bs-callout code,
.bs-callout .highlight {
background-color: #fff;
}
/* Themes for different contexts */
.bs-callout-danger {
background-color: #fcf2f2;
border-color: #dFb5b4;
}
.bs-callout-warning {
background-color: #fefbed;
border-color: #f1e7bc;
}
.bs-callout-info {
background-color: #f0f7fd;
border-color: #d0e3f0;
}
.bs-callout-success {
background-color: #dff0d8;
border-color: #b5dca5;
}
.bs-callout-danger h4 {
color: #B94A48;
}
.bs-callout-warning h4 {
color: #C09853;
}
.bs-callout-info h4 {
color: #3A87AD;
}
.bs-callout-success h4 {
color: #3c763d;
}
.bs-callout.pre {
font-family: Menlo,Monaco,Consolas,"Courier New",monospace;
word-break: break-all;
word-wrap: break-word;
}
@-webkit-keyframes pulsate {
0% {-webkit-transform: scale(0.9, 0.9); opacity: 1.0;}
50% {opacity: 0.0;}
100% {-webkit-transform: scale(1.1, 1.1); opacity: 1.0;}
}

+ 27
- 0
views/index.php View File

@ -0,0 +1,27 @@
<div class="narrow">
<div class="jumbotron h-x-app">
<h1><img src="/images/icons/apple-icon-144x144.png" height="72" style="margin-bottom: 13px;" class="u-logo p-name" alt="Switchboard"> Switchboard</h1>
<p class="tagline p-summary">Switchboard is a PubSubHubbub 0.4 hub.</p>
<p>To publish content using Switchboard as your hub, add the following links to your home page:</p>
<p><pre>&lt;link rel="self" href="https://example.com/"&gt;
&lt;link rel="hub" href="https://switchboard.p3k.io/"&gt;</pre></p>
<p>Then, send a POST request to <code>https://switchboard.p3k.io/</code> with the following
parameters every time you add content to your home page:</p>
<p>
<ul>
<li><code>hub.mode=publish</code></li>
<li><code>hub.topic=https://example.com/</code></li>
</ul>
</p>
<p>Read more info about <a href="https://indiewebcamp.com/how-to-push">how to publish and consume using PubSubHubbub</a>.</p>
<a href="<?= Config::$base_url ?>/" class="u-url"></a>
</div>
</div>

+ 65
- 0
views/layout.php View File

@ -0,0 +1,65 @@
<!doctype html>
<html lang="en">
<head>
<title><?= $this->title ?></title>
<meta charset="utf-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
<meta name="apple-mobile-web-app-capable" content="yes" />
<!-- standard viewport tag to set the viewport to the device's width
, Android 2.3 devices need this so 100% width works properly and
doesn't allow children to blow up the viewport width-->
<meta name="viewport" content="initial-scale=1.0,user-scalable=no,maximum-scale=1,width=device-width" />
<!-- width=device-width causes the iPhone 5 to letterbox the app, so
we want to exclude it for iPhone 5 to allow full screen apps -->
<meta name="viewport" content="initial-scale=1.0,user-scalable=no,maximum-scale=1" media="(device-height: 568px)" />
<link rel="stylesheet" href="/bootstrap/css/bootstrap.min.css">
<link rel="stylesheet" href="/bootstrap/css/bootstrap-theme.min.css">
<link href="/font-awesome/css/font-awesome.min.css" rel="stylesheet" media="all">
<link rel="stylesheet" href="/openwebicons/css/openwebicons-bootstrap.css" />
<link rel="stylesheet" href="/css/style.css">
<!-- icon stuff from www.favicongenerator.org -->
<link rel="apple-touch-icon" sizes="57x57" href="/images/icons/apple-icon-57x57.png">
<link rel="apple-touch-icon" sizes="60x60" href="/images/icons/apple-icon-60x60.png">
<link rel="apple-touch-icon" sizes="72x72" href="/images/icons/apple-icon-72x72.png">
<link rel="apple-touch-icon" sizes="76x76" href="/images/icons/apple-icon-76x76.png">
<link rel="apple-touch-icon" sizes="114x114" href="/images/icons/apple-icon-114x114.png">
<link rel="apple-touch-icon" sizes="120x120" href="/images/icons/apple-icon-120x120.png">
<link rel="apple-touch-icon" sizes="144x144" href="/images/icons/apple-icon-144x144.png">
<link rel="apple-touch-icon" sizes="152x152" href="/images/icons/apple-icon-152x152.png">
<link rel="apple-touch-icon" sizes="180x180" href="/images/icons/apple-icon-180x180.png">
<link rel="icon" type="image/png" sizes="192x192" href="/images/icons/android-icon-192x192.png">
<link rel="icon" type="image/png" sizes="32x32" href="/images/icons/favicon-32x32.png">
<link rel="icon" type="image/png" sizes="96x96" href="/images/icons/favicon-96x96.png">
<link rel="icon" type="image/png" sizes="16x16" href="/images/icons/favicon-16x16.png">
<link rel="manifest" href="/images/icons/manifest.json">
<meta name="msapplication-TileColor" content="#ffffff">
<meta name="msapplication-TileImage" content="/images/icons/ms-icon-144x144.png">
<meta name="theme-color" content="#ffffff">
<link rel="icon" href="/favicon.ico" type="image/x-icon">
<script src="/js/jquery-1.7.1.min.js"></script>
</head>
<body role="document">
<div class="page">
<div class="container">
<?= $this->fetch($this->page . '.php') ?>
</div>
<div class="footer">
<p class="credits">
This code is <a href="https://github.com/aaronpk/Switchboard">open source</a>.
Feel free to send a pull request, or <a href="https://github.com/aaronpk/Switchboard/issues">file an issue</a>.
</p>
</div>
</div>
</body>
</html>

+ 36
- 0
views/subscription-status.php View File

@ -0,0 +1,36 @@
<? if($this->subscription->active): ?>
<div class="bs bs-callout bs-callout-success">This subscription is active!</div>
<? else: ?>
<div class="bs bs-callout bs-callout-danger">This subscription is not active</div>
<? endif; ?>
<table class="table">
<?php $tz = -7 * 3600; ?>
<tr>
<td>Feed URL (Topic)</td>
<td><?= $this->feed->feed_url ?></td>
</tr>
<tr>
<td>Callback URL</td>
<td><?= $this->subscription->callback_url ?></td>
</tr>
<tr>
<td>Date Subscription was Requested</td>
<td><?= $this->subscription->date_requested ? friendly_date($this->subscription->date_requested, $tz) : '' ?></td>
</tr>
<tr>
<td>Subscription Verification Response (from your server)</td>
<td><pre><?= htmlspecialchars($this->subscription->challenge_response) ?></pre></td>
</tr>
<tr>
<td>Date Subscription was Confirmed</td>
<td><?= $this->subscription->date_confirmed ? friendly_date($this->subscription->date_confirmed, $tz) : '' ?></td>
</tr>
<tr>
<td>Subscription Expiration</td>
<td><?= $this->subscription->date_expires ? friendly_date($this->subscription->date_expires, $tz) : '' ?></td>
</tr>
</table>

Loading…
Cancel
Save