forked from aaronmars/martian
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathpageBase.js
99 lines (98 loc) · 4.55 KB
/
pageBase.js
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
import { ProgressPlug } from 'mindtouch-http.js/progressPlug.js';
import { utility } from './lib/utility.js';
import { modelParser } from './lib/modelParser.js';
import { pageModel } from './models/page.model.js';
import { pageContentsModel } from './models/pageContents.model.js';
import { pageTagsModel } from './models/pageTags.model.js';
import { pageFilesModel } from './models/pageFiles.model.js';
import { pageEditModel } from './models/pageEdit.model.js';
import { relatedPagesModel } from './models/relatedPages.model.js';
import { fileModel } from './models/file.model.js';
import { pageOverviewModel } from './models/pageOverview.model.js';
function _handleVirtualPage(error) {
if(error.status === 404 && error.responseText) {
let responseJson = JSON.parse(error.responseText);
if(responseJson['@virtual'] === 'true') {
let pageModelParser = modelParser.createParser(pageModel);
return Promise.resolve(pageModelParser(responseJson));
}
}
throw error;
}
function _getSaveXML(data) {
let template = '';
if(Array.isArray(data)) {
data.forEach((tag) => {
template = `${template}<tag value="${utility.escapeHTML(tag)}" />`;
});
}
template = `<tags>${template}</tags>`;
return template;
}
export class PageBase {
constructor(id) {
if(this.constructor.name === 'PageBase') {
throw new TypeError('PageBase must not be constructed directly. Use one of Page() or Draft()');
}
this._id = utility.getResourceId(id, 'home');
}
getFullInfo(params = {}) {
let pageModelParser = modelParser.createParser(pageModel);
return this._plug.withParams(params).get().then((r) => r.json()).then(pageModelParser).catch(_handleVirtualPage);
}
getContents(params) {
let pageContentsModelParser = modelParser.createParser(pageContentsModel);
return this._plug.at('contents').withParams(params).get().then((r) => r.json()).then(pageContentsModelParser);
}
setContents(contents, params = {}) {
if(typeof contents !== 'string') {
return Promise.reject(new Error('Contents should be string.'));
}
let contentsParams = {
edittime: 'now'
};
Object.keys(params).forEach((key) => {
contentsParams[key] = params[key];
});
let pageEditModelParser = modelParser.createParser(pageEditModel);
return this._plug.at('contents').withParams(contentsParams).post(contents, utility.textRequestType).then((r) => r.json()).then(pageEditModelParser);
}
getFiles(params = {}) {
let pageFilesModelParser = modelParser.createParser(pageFilesModel);
return this._plug.at('files').withParams(params).get().then((r) => r.json()).then(pageFilesModelParser);
}
attachFile(file, { name = file.name, size = file.size, type = file.type, progress = null } = {}) {
if(progress !== null) {
const progressPlug = new ProgressPlug(this._plug.url, this._settings.plugConfig);
const progressInfo = { callback: progress, size };
return progressPlug.at('files', name).put(file, type, progressInfo).then((r) => JSON.parse(r.responseText)).then(modelParser.createParser(fileModel));
}
return this._plug.withHeader('Content-Length', size).at('files', name).put(file, type).then((r) => r.json());
}
getOverview() {
return this._plug.at('overview').get().then((r) => r.json()).then(modelParser.createParser(pageOverviewModel));
}
setOverview(options = {}) {
if(!('body' in options)) {
return Promise.reject(new Error('No overview body was supplied'));
}
let request = `<overview>${utility.escapeHTML(options.body)}</overview>`;
return this._plug.at('overview').put(request, utility.xmlRequestType);
}
getTags() {
let pageTagsModelParser = modelParser.createParser(pageTagsModel);
return this._plug.at('tags').get().then((r) => r.json()).then(pageTagsModelParser);
}
setTags(params = {}) {
const XMLData = _getSaveXML(params);
const pageTagsModelParser = modelParser.createParser(pageTagsModel);
return this._plug.at('tags').put(XMLData, 'application/xml').then((r) => r.json()).then(pageTagsModelParser);
}
getDiff() {
throw new Error('Page.getDiff() is not implemented');
}
getRelated() {
let relatedPagesModelParser = modelParser.createParser(relatedPagesModel);
return this._plug.at('related').get().then((r) => r.json()).then(relatedPagesModelParser);
}
}