gallery.accords-library.com/client/js/models/post.js

306 lines
11 KiB
JavaScript
Raw Normal View History

'use strict';
const api = require('../api.js');
const uri = require('../util/uri.js');
2016-07-05 19:20:28 +00:00
const tags = require('../tags.js');
const events = require('../events.js');
2017-10-01 19:46:53 +00:00
const TagList = require('./tag_list.js');
2016-07-22 11:27:52 +00:00
const NoteList = require('./note_list.js');
const CommentList = require('./comment_list.js');
const misc = require('../util/misc.js');
2016-07-03 11:46:49 +00:00
class Post extends events.EventTarget {
constructor() {
super();
this._orig = {};
for (let obj of [this, this._orig]) {
2017-10-01 19:46:53 +00:00
obj._tags = new TagList();
obj._notes = new NoteList();
obj._comments = new CommentList();
}
this._updateFromResponse({});
}
2016-08-20 20:40:25 +00:00
get id() { return this._id; }
get type() { return this._type; }
get mimeType() { return this._mimeType; }
get creationTime() { return this._creationTime; }
get user() { return this._user; }
get safety() { return this._safety; }
get contentUrl() { return this._contentUrl; }
get thumbnailUrl() { return this._thumbnailUrl; }
get canvasWidth() { return this._canvasWidth || 800; }
get canvasHeight() { return this._canvasHeight || 450; }
get fileSize() { return this._fileSize || 0; }
get newContent() { throw 'Invalid operation'; }
get newThumbnail() { throw 'Invalid operation'; }
2016-07-03 11:46:49 +00:00
2016-08-20 20:40:25 +00:00
get flags() { return this._flags; }
get tags() { return this._tags; }
get tagNames() { return this._tags.map(tag => tag.names[0]); }
2016-08-20 20:40:25 +00:00
get notes() { return this._notes; }
get comments() { return this._comments; }
get relations() { return this._relations; }
2016-07-03 11:46:49 +00:00
2016-08-20 20:40:25 +00:00
get score() { return this._score; }
get commentCount() { return this._commentCount; }
get favoriteCount() { return this._favoriteCount; }
get ownFavorite() { return this._ownFavorite; }
get ownScore() { return this._ownScore; }
get hasCustomThumbnail() { return this._hasCustomThumbnail; }
2016-07-03 11:46:49 +00:00
2016-08-20 20:40:25 +00:00
set flags(value) { this._flags = value; }
set safety(value) { this._safety = value; }
set relations(value) { this._relations = value; }
set newContent(value) { this._newContent = value; }
set newThumbnail(value) { this._newThumbnail = value; }
static fromResponse(response) {
const ret = new Post();
ret._updateFromResponse(response);
return ret;
}
static reverseSearch(content) {
let apiPromise = api.post(
uri.formatApiLink('posts', 'reverse-search'),
{},
{content: content});
let returnedPromise = apiPromise
.then(response => {
if (response.exactPost) {
response.exactPost = Post.fromResponse(response.exactPost);
}
for (let item of response.similarPosts) {
item.post = Post.fromResponse(item.post);
}
return Promise.resolve(response);
});
2017-01-07 15:24:56 +00:00
returnedPromise.abort = () => apiPromise.abort();
return returnedPromise;
}
static get(id) {
return api.get(uri.formatApiLink('post', id))
.then(response => {
return Promise.resolve(Post.fromResponse(response));
});
}
2016-08-20 20:40:25 +00:00
save(anonymous) {
const files = {};
const detail = {version: this._version};
2016-07-03 11:46:49 +00:00
// send only changed fields to avoid user privilege violation
2016-08-20 20:40:25 +00:00
if (anonymous === true) {
detail.anonymous = true;
}
2016-07-03 11:46:49 +00:00
if (this._safety !== this._orig._safety) {
detail.safety = this._safety;
}
if (misc.arraysDiffer(this._flags, this._orig._flags)) {
detail.flags = this._flags;
}
if (misc.arraysDiffer(this._tags, this._orig._tags)) {
2017-10-01 19:46:53 +00:00
detail.tags = this._tags.map(tag => tag.names[0]);
2016-07-05 19:20:28 +00:00
}
if (misc.arraysDiffer(this._relations, this._orig._relations)) {
2016-07-03 11:46:49 +00:00
detail.relations = this._relations;
}
2016-07-22 11:27:52 +00:00
if (misc.arraysDiffer(this._notes, this._orig._notes)) {
2017-10-01 19:46:53 +00:00
detail.notes = this._notes.map(note => ({
polygon: note.polygon.map(point => [point.x, point.y]),
2016-07-22 11:27:52 +00:00
text: note.text,
}));
}
2016-08-20 20:40:25 +00:00
if (this._newContent) {
files.content = this._newContent;
2016-07-27 20:27:33 +00:00
}
2016-08-20 20:40:25 +00:00
if (this._newThumbnail !== undefined) {
files.thumbnail = this._newThumbnail;
}
2016-09-29 19:36:59 +00:00
let apiPromise = this._id ?
api.put(uri.formatApiLink('post', this.id), detail, files) :
api.post(uri.formatApiLink('posts'), detail, files);
2016-07-05 19:20:28 +00:00
2017-01-07 15:24:56 +00:00
return apiPromise.then(response => {
2016-07-05 19:20:28 +00:00
this._updateFromResponse(response);
this.dispatchEvent(
new CustomEvent('change', {detail: {post: this}}));
if (this._newContent) {
2016-07-27 20:27:33 +00:00
this.dispatchEvent(
new CustomEvent('changeContent', {detail: {post: this}}));
}
2016-08-20 20:40:25 +00:00
if (this._newThumbnail) {
this.dispatchEvent(
new CustomEvent('changeThumbnail', {detail: {post: this}}));
}
2016-07-05 19:20:28 +00:00
return Promise.resolve();
2017-01-08 01:12:38 +00:00
}, error => {
if (error.response &&
error.response.name === 'PostAlreadyUploadedError') {
error.message =
`Post already uploaded (@${error.response.otherPostId})`;
}
2017-01-08 01:12:38 +00:00
return Promise.reject(error);
2016-07-05 19:20:28 +00:00
});
}
2016-08-02 08:37:56 +00:00
feature() {
return api.post(
uri.formatApiLink('featured-post'),
{id: this._id})
2016-08-02 08:37:56 +00:00
.then(response => {
return Promise.resolve();
});
}
2016-08-02 09:05:40 +00:00
delete() {
return api.delete(
uri.formatApiLink('post', this.id),
{version: this._version})
2016-08-02 09:05:40 +00:00
.then(response => {
this.dispatchEvent(new CustomEvent('delete', {
detail: {
post: this,
},
}));
return Promise.resolve();
});
2016-10-22 08:03:38 +00:00
}
merge(targetId, useOldContent) {
return api.get(uri.formatApiLink('post', targetId))
2016-10-22 08:03:38 +00:00
.then(response => {
return api.post(uri.formatApiLink('post-merge'), {
2016-10-22 08:03:38 +00:00
removeVersion: this._version,
remove: this._id,
mergeToVersion: response.version,
mergeTo: targetId,
replaceContent: useOldContent,
});
}).then(response => {
this._updateFromResponse(response);
this.dispatchEvent(new CustomEvent('change', {
detail: {
post: this,
},
}));
return Promise.resolve();
});
2016-08-02 09:05:40 +00:00
}
setScore(score) {
return api.put(
uri.formatApiLink('post', this.id, 'score'),
{score: score})
.then(response => {
const prevFavorite = this._ownFavorite;
this._updateFromResponse(response);
if (this._ownFavorite !== prevFavorite) {
this.dispatchEvent(new CustomEvent('changeFavorite', {
detail: {
post: this,
},
}));
}
this.dispatchEvent(new CustomEvent('changeScore', {
detail: {
post: this,
},
}));
return Promise.resolve();
});
}
addToFavorites() {
return api.post(uri.formatApiLink('post', this.id, 'favorite'))
.then(response => {
const prevScore = this._ownScore;
this._updateFromResponse(response);
if (this._ownScore !== prevScore) {
this.dispatchEvent(new CustomEvent('changeScore', {
detail: {
post: this,
},
}));
}
this.dispatchEvent(new CustomEvent('changeFavorite', {
detail: {
post: this,
},
}));
return Promise.resolve();
});
}
removeFromFavorites() {
return api.delete(uri.formatApiLink('post', this.id, 'favorite'))
.then(response => {
const prevScore = this._ownScore;
this._updateFromResponse(response);
if (this._ownScore !== prevScore) {
this.dispatchEvent(new CustomEvent('changeScore', {
detail: {
post: this,
},
}));
}
this.dispatchEvent(new CustomEvent('changeFavorite', {
detail: {
post: this,
},
}));
return Promise.resolve();
});
}
2016-07-27 20:27:33 +00:00
mutateContentUrl() {
this._contentUrl =
this._orig._contentUrl +
'?bypass-cache=' +
2016-07-30 08:00:42 +00:00
Math.round(Math.random() * 1000);
2016-07-27 20:27:33 +00:00
}
_updateFromResponse(response) {
2016-07-22 11:27:52 +00:00
const map = () => ({
_version: response.version,
2016-07-03 11:46:49 +00:00
_id: response.id,
_type: response.type,
_mimeType: response.mimeType,
_creationTime: response.creationTime,
_user: response.user,
_safety: response.safety,
_contentUrl: response.contentUrl,
_thumbnailUrl: response.thumbnailUrl,
_canvasWidth: response.canvasWidth,
_canvasHeight: response.canvasHeight,
_fileSize: response.fileSize,
_flags: [...response.flags || []],
_relations: [...response.relations || []],
2016-07-03 11:46:49 +00:00
_score: response.score,
_commentCount: response.commentCount,
2016-07-03 11:46:49 +00:00
_favoriteCount: response.favoriteCount,
_ownScore: response.ownScore,
_ownFavorite: response.ownFavorite,
_hasCustomThumbnail: response.hasCustomThumbnail,
2016-07-22 11:27:52 +00:00
});
2016-07-03 11:46:49 +00:00
for (let obj of [this, this._orig]) {
2017-10-01 19:46:53 +00:00
obj._tags.sync(response.tags);
obj._notes.sync(response.notes);
obj._comments.sync(response.comments);
}
2016-07-22 11:27:52 +00:00
Object.assign(this, map());
Object.assign(this._orig, map());
}
};
module.exports = Post;