-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathrsss.js
More file actions
198 lines (181 loc) · 5.13 KB
/
rsss.js
File metadata and controls
198 lines (181 loc) · 5.13 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
/*
Pull in deps.
*/
var express = require('express'),
connect = require('connect'),
redis = require("redis"),
client = redis.createClient(),
User = require('./models/User.js'),
Feed = require('./models/Feed.js'),
Item = require('./models/Item.js');
/*
Configuration
*/
var app = express.createServer();
app.configure(function(){
app.use(connect.bodyDecoder());
app.use(connect.methodOverride());
app.use(app.router);
});
app.configure('development', function(){
app.use(connect.errorHandler({ dumpExceptions: true, showStack: true }));
});
app.configure('production', function(){
app.use(connect.errorHandler());
});
function checkUser(req, res, next){
var user = new User({'key':req.param('key')});
user.exists(function(exists){
if(exists){
req.user = user;
next();
}else{
res.send(403);
}
});
}
/*
Basic request to make sure server is running.
*/
app.get('/', function(req, res){
res.send('Welcome to the party! We\'ve been waiting.');
});
/*
GET new User (returns a new random string)
@return {Dictionary} user JSON-encoded dictionary containing new user key.
*/
app.get('/newUser.:format?', function(req, res){
var user = new User();
user.save(function(success){
if(success){
res.send(JSON.stringify(user));
}else{
res.send(JSON.stringify({"error":"failed to create user"}));
}
});
});
/*
Get check (returns YES if the supplied user key exists)
@param {String} key User-specify key provided by newUser request.
*/
app.get('/check.:format?', function(req, res){
var user = new User({'key':req.param('key')});
user.exists(function(exists){
res.send(exists.toString());
});
});
/*
GET subscription list
@param {String} format Specify return format as OPML or JSON
@param {String} key User-specify key provided by newUser request.
*/
app.get('/feedlist.:format', checkUser, function(req, res){
var user = req.user;
var modifiedSince = req.header('If-Modified-Since');
client.get(user.key+":feedModified", function(err, value){
var sendFeedList = function(){
var d = new Date();
var dateString = value === null ? d.toString() : value.toString();
user.feeds(function(array){
if(req.param('format') == 'json'){res.send(JSON.stringify(array), { 'Last-Modified': dateString });} // I heart JSON.stringify
if(req.param('format') == 'opml'){res.send(Feed.opml(array), { 'Last-Modified': dateString });}
});
};
if(modifiedSince !== undefined && value !== null){
var dateA = new Date(value.toString());
var dateB = new Date(modifiedSince);
if(dateA < dateB){
sendFeedList();
}else{
res.send(304);
}
}else{
sendFeedList();
}
});
});
/*
POST feed (create)
@param {String} key User-specify key provided by newUser request.
@param {String} uid The new feed's uid
@param {String} title The new feed's title
@param {String} rssURL The new feed's rss url
@param {String} htmlURL The new feed's homepage url
@param {String} tags A JSON-encoded array of any Folders/Tags this feed belongs to.
*/
app.post('/feed.:format?', checkUser, function(req, res){
var user = req.user;
user.addFeed(req.body, function(success, feed){
if(success){
res.send(JSON.stringify(feed));
}else{
res.send("DNE", 403);
}
});
});
/*
PUT feeds (update)
@param {String} key User-specify key provided by newUser request.
@param {String} uid The uid of the feed you wish to update.
@param {String} title (Optional) The feed's new title
@param {String} rssURL (Optional) The feed's new rss url
@param {String} htmlURL (Optional) The feed's new homepage url
@param {String} tags (Optional) A JSON-encoded array of any Folders/Tags this feed belongs to.
*/
app.put('/feed.:format?', checkUser, function(req, res){
var user = req.user;
Feed.find(req.body.uid, function(err, feed){
feed.update(req.body);
feed.userID = user.key;
feed.save(function(success){
if(exists){
res.send("Updated JSON string: " + JSON.stringify(feed));
}else{
res.send("Failed to save!");
}
});
});
});
/*
DESTROY feeds
@param {String} key User-specify key provided by newUser request.
@pararm {String} uid The uid of the feed you wish to delete.
*/
app.del('/feed/:uid', checkUser, function(req, res){
Feed.find(req.param('uid'), function(err, feed){
if(feed !== undefined){
feed.destroy(function(){
res.send('OK');
});
}else{
res.send('DNE', 403);
}
});
});
/*
GET status changes since date
@param {String} key User-specify key provided by newUser request.
@param {String} dateTime The earliest date you wish to retrieve status updates for.
*/
app.get('/status.:format?', checkUser, function(req, res){
var user = req.user;
var d= new Date(req.param('dateTime'));
user.statusUpdatesSince(d, function(results){
res.send(JSON.stringify(results));
});
});
/*
POST update status (input JSON/XML)
@param {String} key User-specify key provided by newUser request.
@param {Array} data A JSON-encoded array of status update hashes like {'uid':'peterpiperpickspepers', 'status':'read'}
*/
app.post('/status.:format?', function(req, res){
var arrayOfDicts = req.body['data'];
Item.updateStatuses(arrayOfDicts, function(success){
res.send(success.toString());
});
});
/*
Start server now.
*/
if (!module.parent) {app.listen(8080);}