Skip to content

Commit 806789c

Browse files
committed
added feedparser endpoint for testing
1 parent 73fdda6 commit 806789c

File tree

5 files changed

+3474
-4
lines changed

5 files changed

+3474
-4
lines changed

.vscode/launch.json

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
{
2+
// Use IntelliSense to learn about possible Node.js debug attributes.
3+
// Hover to view descriptions of existing attributes.
4+
// For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387
5+
"version": "0.2.0",
6+
"configurations": [
7+
{
8+
"type": "node",
9+
"request": "launch",
10+
"name": "Gulp server",
11+
"program": "${workspaceRoot}/node_modules/gulp/bin/gulp.js",
12+
"args": [
13+
"serve"
14+
]
15+
},
16+
{
17+
"type": "node",
18+
"request": "launch",
19+
"name": "Launch Program",
20+
"program": "${file}"
21+
}
22+
]
23+
}

gulpfile.js

Lines changed: 96 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,11 @@ var jsReporter = require('jshint-stylish');
77
var annotateAdfPlugin = require('ng-annotate-adf-plugin');
88
var pkg = require('./package.json');
99

10+
var url = require('url');
11+
var queryString = require('query-string');
12+
var request = require('request');
13+
var FeedParser = require('feedparser');
14+
1015
var annotateOptions = {
1116
plugin: [
1217
annotateAdfPlugin
@@ -63,10 +68,100 @@ gulp.task('watch', function(){
6368
});
6469

6570
gulp.task('serve', ['watch', 'sample'], function(){
71+
var feed = function(req, resp, next) {
72+
var rawUrl = req.originalUrl;
73+
if (rawUrl.indexOf("/feed") === 0) {
74+
var parsedUrl = url.parse(rawUrl);
75+
var queryParams = queryString.parse(parsedUrl.query);
76+
77+
var feedUrl = queryParams.url;
78+
79+
var feedRequest = request(feedUrl);
80+
81+
var feedparser = new FeedParser();
82+
var feedEntries = [];
83+
var feedDescription = '';
84+
var feedTitle = '';
85+
var feedLink = '';
86+
var feedError;
87+
88+
89+
// error when server request failed
90+
feedRequest.on('error', function (error) {
91+
resp.writeHead(400, error.toString());
92+
resp.end();
93+
});
94+
95+
// open a stream after a valid server response
96+
feedRequest.on('response', function () {
97+
if (resp.statusCode !== 200) {
98+
this.emit('error', new Error('Bad status code'));
99+
}
100+
var stream = this; // `this` is `req`, which is a stream
101+
stream.pipe(feedparser);
102+
});
103+
104+
// error when feed url could not be parsed
105+
feedparser.on('error', function (error) {
106+
feedError = error;
107+
});
108+
109+
// read all feed information and save them
110+
feedparser.on('readable', function () {
111+
var stream = this; // `this` is `feedparser`, which is a stream
112+
var item;
113+
while (item = stream.read()) {
114+
feedDescription = item.meta.description;
115+
feedTitle = item.meta.title;
116+
feedLink = item.meta.link;
117+
feedEntries.push({
118+
title: item.title,
119+
link: item.link,
120+
contentSnippet: item.summary,
121+
author: item.author,
122+
pubDate: item.date
123+
});
124+
}
125+
});
126+
127+
// return feed information - number of Entries configured by request
128+
feedparser.on('end', function () {
129+
if (feedError) {
130+
resp.writeHead(400, error.toString());
131+
resp.end();
132+
} else {
133+
var numberOfEntries = queryParams.num;
134+
feedEntries = feedEntries.slice(0, numberOfEntries);
135+
136+
var feed = {feed: {entries: feedEntries, title: feedTitle, description: feedDescription, link: feedLink}};
137+
138+
var callbackName = queryParams.callback;
139+
if (!callbackName) {
140+
callbackName = 'jsonp_callback';
141+
}
142+
143+
resp.writeHead(200);
144+
resp.write('/**/ typeof ' + callbackName + ' === "function" && ');
145+
resp.write(callbackName + '(');
146+
resp.write(JSON.stringify(feed));
147+
resp.write(');');
148+
149+
resp.end();
150+
}
151+
});
152+
153+
} else {
154+
next();
155+
}
156+
};
157+
66158
connect.server({
67159
root: ['.tmp/dist', '.'],
68160
livereload: true,
69-
port: 9002
161+
port: 9002,
162+
middleware: function(connect, opt) {
163+
return [feed];
164+
}
70165
});
71166
});
72167

package.json

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,8 @@
1010
"description": "News widget for the angular-dashboard-framework",
1111
"dependencies": {},
1212
"devDependencies": {
13+
"del": "^1.1.1",
14+
"feedparser": "^2.2.1",
1315
"gulp": "^3.8.11",
1416
"gulp-angular-filesort": "^1.1.1",
1517
"gulp-angular-templatecache": "^1.6.0",
@@ -27,10 +29,10 @@
2729
"gulp-ng-annotate": "^0.5.2",
2830
"gulp-rename": "^1.2.0",
2931
"gulp-replace": "^0.5.3",
30-
"ng-annotate-adf-plugin": "^0.1.2",
3132
"gulp-uglify": "^1.1.0",
3233
"jshint-stylish": "^1.0.1",
33-
"wiredep": "~2.2.2",
34-
"del": "^1.1.1"
34+
"ng-annotate-adf-plugin": "^0.1.2",
35+
"query-string": "^5.0.0",
36+
"wiredep": "~2.2.2"
3537
}
3638
}

sample/index.html

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -51,6 +51,7 @@
5151
<script type="text/javascript">
5252
angular
5353
.module('adfWidgetSample', ['adf', 'adf.widget.news', 'LocalStorageModule'])
54+
.constant('newsServiceUrl', '/feed?callback=JSON_CALLBACK&url=')
5455
.config(function(dashboardProvider, localStorageServiceProvider){
5556
localStorageServiceProvider.setPrefix('adf.news');
5657
dashboardProvider.structure('4-8', {

0 commit comments

Comments
 (0)