szurubooru/client/js/models/comment.js
rr- d2a5e1056d client/models: discard field declarations
This has important side effect that matters when we check for data
changes using _orig dictionary. Previously, _orig was empty (so its
members fields were undefiend) whereas the real fields were declared as
nulls. This meant that for new entities, the conditions were always
true, which is unintended. Now both _orig and the class itself are
initially populated with _updateFromResponse which syncs the state
between them, removing the problem.
2016-07-26 23:15:05 +02:00

106 lines
3.1 KiB
JavaScript

'use strict';
const api = require('../api.js');
const events = require('../events.js');
class Comment extends events.EventTarget {
constructor() {
super();
this._updateFromResponse({});
}
static create(postId) {
const comment = new Comment();
comment._postId = postId;
return comment;
}
static fromResponse(response) {
const comment = new Comment();
comment._updateFromResponse(response);
return comment;
}
get id() { return this._id; }
get postId() { return this._postId; }
get text() { return this._text; }
get user() { return this._user; }
get creationTime() { return this._creationTime; }
get lastEditTime() { return this._lastEditTime; }
get score() { return this._score; }
get ownScore() { return this._ownScore; }
set text(value) { this._text = value; }
save() {
let promise = null;
if (this._id) {
promise = api.put(
'/comment/' + this._id,
{
text: this._text,
});
} else {
promise = api.post(
'/comments',
{
text: this._text,
postId: this._postId,
});
}
return promise.then(response => {
this._updateFromResponse(response);
this.dispatchEvent(new CustomEvent('change', {
detail: {
comment: this,
},
}));
return Promise.resolve();
}, response => {
return Promise.reject(response.description);
});
}
delete() {
return api.delete('/comment/' + this._id)
.then(response => {
this.dispatchEvent(new CustomEvent('delete', {
detail: {
comment: this,
},
}));
return Promise.resolve();
}, response => {
return Promise.reject(response.description);
});
}
setScore(score) {
return api.put('/comment/' + this._id + '/score', {score: score})
.then(response => {
this._updateFromResponse(response);
this.dispatchEvent(new CustomEvent('changeScore', {
detail: {
comment: this,
},
}));
return Promise.resolve();
}, response => {
return Promise.reject(response.description);
});
}
_updateFromResponse(response) {
this._id = response.id;
this._postId = response.postId;
this._text = response.text;
this._user = response.user;
this._creationTime = response.creationTime;
this._lastEditTime = response.lastEditTime;
this._score = parseInt(response.score);
this._ownScore = parseInt(response.ownScore);
}
}
module.exports = Comment;