aboutsummaryrefslogtreecommitdiff
path: root/client/js
diff options
context:
space:
mode:
authorrr-2016-08-06 22:44:04 +0200
committerrr-2016-08-07 09:55:51 +0200
commit79b3973f9ec2681d33e67ab360526bf47e6c53c3 (patch)
treedde8f96f60e6e579ef6e90bb37ef7b000ceb54ef /client/js
parent8d04df38fdb985447a48182739b06cd996be4d7d (diff)
client/general: use resource versioning
Diffstat (limited to 'client/js')
-rw-r--r--client/js/api.js4
-rw-r--r--client/js/models/comment.js28
-rw-r--r--client/js/models/post.js7
-rw-r--r--client/js/models/tag.js19
-rw-r--r--client/js/models/tag_category.js18
-rw-r--r--client/js/models/user.js7
6 files changed, 49 insertions, 34 deletions
diff --git a/client/js/api.js b/client/js/api.js
index 08daafd..016d82b 100644
--- a/client/js/api.js
+++ b/client/js/api.js
@@ -56,9 +56,9 @@ class Api extends events.EventTarget {
return this._process(url, request.put, data, files, options);
}
- delete(url, options) {
+ delete(url, data, options) {
this.cache = {};
- return this._process(url, request.delete, {}, {}, options);
+ return this._process(url, request.delete, data, {}, options);
}
_process(url, requestFactory, data, files, options) {
diff --git a/client/js/models/comment.js b/client/js/models/comment.js
index 702370c..2ddc334 100644
--- a/client/js/models/comment.js
+++ b/client/js/models/comment.js
@@ -33,21 +33,14 @@ class Comment extends events.EventTarget {
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,
- });
- }
+ const detail = {
+ version: this._version,
+ text: this._text,
+ };
+ let promise = this._id ?
+ api.put('/comment/' + this._id, detail) :
+ api.post(
+ '/comments', Object.assign({postId: this._postId}, detail));
return promise.then(response => {
this._updateFromResponse(response);
@@ -63,7 +56,9 @@ class Comment extends events.EventTarget {
}
delete() {
- return api.delete('/comment/' + this._id)
+ return api.delete(
+ '/comment/' + this._id,
+ {version: this._version})
.then(response => {
this.dispatchEvent(new CustomEvent('delete', {
detail: {
@@ -92,6 +87,7 @@ class Comment extends events.EventTarget {
}
_updateFromResponse(response) {
+ this._version = response.version;
this._id = response.id;
this._postId = response.postId;
this._text = response.text;
diff --git a/client/js/models/post.js b/client/js/models/post.js
index 609cabe..ffe8048 100644
--- a/client/js/models/post.js
+++ b/client/js/models/post.js
@@ -85,7 +85,7 @@ class Post extends events.EventTarget {
save() {
const files = [];
- const detail = {};
+ const detail = {version: this._version};
// send only changed fields to avoid user privilege violation
if (this._safety !== this._orig._safety) {
@@ -206,7 +206,9 @@ class Post extends events.EventTarget {
}
removeFromFavorites() {
- return api.delete('/post/' + this.id + '/favorite')
+ return api.delete(
+ '/post/' + this.id + '/favorite',
+ {version: this._version})
.then(response => {
const prevScore = this._ownScore;
this._updateFromResponse(response);
@@ -237,6 +239,7 @@ class Post extends events.EventTarget {
_updateFromResponse(response) {
const map = () => ({
+ _version: response.version,
_id: response.id,
_type: response.type,
_mimeType: response.mimeType,
diff --git a/client/js/models/tag.js b/client/js/models/tag.js
index c07f495..78890aa 100644
--- a/client/js/models/tag.js
+++ b/client/js/models/tag.js
@@ -42,7 +42,7 @@ class Tag extends events.EventTarget {
}
save() {
- const detail = {};
+ const detail = {version: this._version};
// send only changed fields to avoid user privilege violation
if (misc.arraysDiffer(this._names, this._orig._names)) {
@@ -79,9 +79,15 @@ class Tag extends events.EventTarget {
}
merge(targetName) {
- return api.post('/tag-merge/', {
- remove: this._origName,
- mergeTo: targetName,
+ return api.get('/tag/' + targetName).then(response => {
+ return api.post('/tag-merge/', {
+ removeVersion: this._version,
+ remove: this._origName,
+ mergeToVersion: response.version,
+ mergeTo: targetName,
+ });
+ }, response => {
+ return Promise.reject(response);
}).then(response => {
this._updateFromResponse(response);
this.dispatchEvent(new CustomEvent('change', {
@@ -96,7 +102,9 @@ class Tag extends events.EventTarget {
}
delete() {
- return api.delete('/tag/' + this._origName)
+ return api.delete(
+ '/tag/' + this._origName,
+ {version: this._version})
.then(response => {
this.dispatchEvent(new CustomEvent('delete', {
detail: {
@@ -111,6 +119,7 @@ class Tag extends events.EventTarget {
_updateFromResponse(response) {
const map = {
+ _version: response.version,
_origName: response.names ? response.names[0] : null,
_names: response.names,
_category: response.category,
diff --git a/client/js/models/tag_category.js b/client/js/models/tag_category.js
index 0f5216e..da881e5 100644
--- a/client/js/models/tag_category.js
+++ b/client/js/models/tag_category.js
@@ -30,21 +30,22 @@ class TagCategory extends events.EventTarget {
}
save() {
- const data = {};
+ const detail = {version: this._version};
+
if (this.name !== this._origName) {
- data.name = this.name;
+ detail.name = this.name;
}
if (this.color !== this._origColor) {
- data.color = this.color;
+ detail.color = this.color;
}
- if (!Object.keys(data).length) {
+ if (!Object.keys(detail).length) {
return Promise.resolve();
}
let promise = this._origName ?
- api.put('/tag-category/' + this._origName, data) :
- api.post('/tag-categories', data);
+ api.put('/tag-category/' + this._origName, detail) :
+ api.post('/tag-categories', detail);
return promise
.then(response => {
@@ -61,7 +62,9 @@ class TagCategory extends events.EventTarget {
}
delete() {
- return api.delete('/tag-category/' + this._origName)
+ return api.delete(
+ '/tag-category/' + this._origName,
+ {version: this._version})
.then(response => {
this.dispatchEvent(new CustomEvent('delete', {
detail: {
@@ -75,6 +78,7 @@ class TagCategory extends events.EventTarget {
}
_updateFromResponse(response) {
+ this._version = response.version;
this._name = response.name;
this._color = response.color;
this._isDefault = response.default;
diff --git a/client/js/models/user.js b/client/js/models/user.js
index 5317563..9768e17 100644
--- a/client/js/models/user.js
+++ b/client/js/models/user.js
@@ -50,7 +50,7 @@ class User extends events.EventTarget {
save() {
const files = [];
- const detail = {};
+ const detail = {version: this._version};
const transient = this._orig._name;
if (this._name !== this._orig._name) {
@@ -91,7 +91,9 @@ class User extends events.EventTarget {
}
delete() {
- return api.delete('/user/' + this._orig._name)
+ return api.delete(
+ '/user/' + this._orig._name,
+ {version: this._version})
.then(response => {
this.dispatchEvent(new CustomEvent('delete', {
detail: {
@@ -106,6 +108,7 @@ class User extends events.EventTarget {
_updateFromResponse(response) {
const map = {
+ _version: response.version,
_name: response.name,
_rank: response.rank,
_email: response.email,

© 2015 - 2026 Jakob L. Kreuze