3 var Newslash = function (options) {
4 options = options || {};
5 this.baseUrl = options.baseUrl || '/api/v1';
8 function _initNewslash() {
9 // fake Promise for old browser
10 function FakePromise(f) {
11 this.then = function(resolve, reject) {
16 Newslash.prototype.fail = function fail(param) {
17 return new FakePromise(function (resolve, reject) {
22 Newslash.prototype.urlParse = function (url) {
23 var parser = document.createElement('a');
29 Newslash.prototype.pathFromDate = function (year, month, day) {
32 month = String(month);
35 catch (e) { return ""; }
36 if (!year || !month || !day) { return ""; }
38 path += year.length > 2 ? year.substring(2) : year;
39 path += month.length > 1 ? ("/" + month) : ("/0" + month);
40 path += day.length > 1 ? ("/" + day) : ("/0" + day);
44 /* CSRF securiry token */
45 Newslash.getCsrfToken = function getCsrfToken(resourceID) {
46 if (!resourceID) { return this.fail(); }
47 var url = "/api/v1/token?rc=" + resourceID;
51 /* base get.post API */
52 Newslash.prototype.get = function (path) {
53 var url = this.baseUrl + path;
54 return new FakePromise(function (resolve, reject) {
55 var req = new XMLHttpRequest();
57 req.responseType = "json";
58 req.onreadystatechange = function onReadyStateChange () {
59 if (req.readyState == XMLHttpRequest.DONE) {
60 // hack for IE/Edge support (req.responseType == "json" is not supported)
61 var respType = req.responseType;
62 var resp = req.response;
64 if (respType === "") {
66 resp = JSON.parse(req.response);
69 console.log("Newslash.post: cannot parse JSON");
74 if (req.status == 200 && respType == "json") {
79 if (respType == "json") {
86 req.ontimeout = function onTimeout () {
93 Newslash.prototype.post = function (path, data) {
94 var url = this.baseUrl + path;
96 return new FakePromise((resolve, reject) => {
97 _doPost(path, data, 0, resolve, reject);
100 function _doPost(path, data, retryCount, resolve, reject) {
101 var req = new XMLHttpRequest();
102 req.open('POST', url);
103 req.responseType = "json";
104 req.onreadystatechange = () => {
105 if (req.readyState == XMLHttpRequest.DONE) {
106 // hack for IE/Edge support (req.responseType == "json" is not supported)
107 var respType = req.responseType;
108 var resp = req.response;
110 if (respType === "") {
112 resp = JSON.parse(req.response);
115 console.log("Newslash.post: cannot parse JSON");
120 if (req.status == 200 && respType == "json") {
121 return resolve(resp);
125 if (respType == "json") {
126 if (resp && resp.reason == "invalid_csrf_token") {
127 if (retryCount >= 3) {
128 return reject({error: 1, reason: "exceeded retry count"});
130 var newToken = resp.csrf_token;
132 data.csrf_token = newToken;
133 // retry with new token
134 _doPost(path, data, retryCount + 1, resolve, reject);
144 req.ontimeout = function onTimeout () {
147 req.setRequestHeader("Content-Type", "application/json");
148 req.send(JSON.stringify(data));
153 Newslash.prototype.login = function (username, password) {
155 var data = {nickname: username, password: password};
156 return this.post(url, data);
160 Newslash.prototype.validateNewUser = function (username, email) {
161 var url = "/newuser/validate";
162 var data = {nickname: username, email: email};
163 return this.post(url, data);
166 Newslash.prototype.createNewUser = function (username, email, options) {
167 options = options || {};
168 var url = "/newuser/create";
169 var data = { nickname: username,
173 return this.post(url, data);
176 /* user related API */
177 Newslash.prototype.updatePasswordByToken = function (username, token, password, options) {
178 options = options || {};
179 var url = "/newuser/password";
180 var data = { nickname: username,
185 return this.post(url, data);
188 Newslash.prototype.requestEmailChange = function (newAddress, options) {
189 options = options || {};
191 var data = { type: "email", address: newAddress, };
192 return this.post("/user", data);
195 Newslash.prototype.updatePassword = function (oldPassword, newPassword, options) {
196 options = options || {};
198 var data = { type: "password",
199 current_password: oldPassword,
200 new_password: newPassword };
201 return this.post("/user", data);
204 Newslash.prototype.resetPassword = function (email) {
206 var data = { type: "reset_password",
208 return this.post(url, data);
211 Newslash.prototype.getMessageSettings = function getMessageSettings () {
212 return this.get("/user?type=message_config");
215 Newslash.prototype.updateSettings = function updateSettings (settings) {
216 if (!settings) return this.fail();
217 var data = { type: "config", config: settings };
218 return this.post("/user", data);
221 Newslash.prototype.updateMessageSettings = function updateMessageSettings (items) {
222 if (!items) return this.fail();
223 var data = { type: "message", items: items };
224 return this.post("/user", data);
228 Newslash.prototype.getComments = function getComments (discussionID, parentID) {
229 if (!discussionID) return this.fail();
231 var url = "/comment?discussion_id=" + discussionID;
233 url = url + "&parent_id=" + parentID;
235 return this.get(url);
238 Newslash.prototype.getJournal = function getJournal (journalID) {
239 if (!journalID) return this.fail();
241 var url = "/journal?id=" + journalID;
242 return this.get(url);
245 Newslash.prototype.postJournal = function createJournal (data) {
246 data.action = "post";
247 return this.post("/journal", data);
250 Newslash.prototype.previewJournal = function previewJournal (data) {
251 data.action = "preview";
252 return this.post("/journal", data);
255 /* timeline related API */
256 Newslash.prototype.getTimeline = function getTimeline (target, options) {
257 if (!target) { target = "all"; }
258 options = options || {};
260 var url = "/timeline?target=" + target;
261 if (options.threshold !== undefined) {
262 url = url + "&threshold=" + options.threshold;
265 if (options.dateRange && options.dateRange != "all") {
266 if (!/^(\d+)_([a-z]+)$/.exec(options.dateRange)) {
267 return this.fail("invalid_date_range");
269 var ret = options.dateRange.split("_");
273 url = url + "&" + range + "=" + term;
276 return this.get(url);
279 Newslash.prototype.vote = function vote (globjId, voteType) {
280 var url = "/tagmoderation";
281 if (voteType != "nod" && voteType != "nix") {
282 return this.fail("invalid_voteType");
284 var data = { action: "vote",
285 params: { name: voteType,
288 return this.post(url, data);
291 Newslash.prototype.cancelVote = function cancelvote (globjId, voteType) {
292 var url = "/tagmoderation";
293 if (voteType != "nod" && voteType != "nix") {
294 return this.fail("invalid_voteType");
296 var data = { action: "unset",
297 params: { name: voteType,
300 return this.post(url, data);
305 var newslash = new Newslash();