szurubooru/client/js/models/user.js

132 lines
4.5 KiB
JavaScript
Raw Normal View History

'use strict';
const api = require('../api.js');
const uri = require('../util/uri.js');
const events = require('../events.js');
class User extends events.EventTarget {
constructor() {
super();
this._orig = {};
this._updateFromResponse({});
}
get name() { return this._name; }
get rank() { return this._rank; }
get email() { return this._email; }
get avatarStyle() { return this._avatarStyle; }
get avatarUrl() { return this._avatarUrl; }
get creationTime() { return this._creationTime; }
get lastLoginTime() { return this._lastLoginTime; }
get commentCount() { return this._commentCount; }
get favoritePostCount() { return this._favoritePostCount; }
get uploadedPostCount() { return this._uploadedPostCount; }
get likedPostCount() { return this._likedPostCount; }
get dislikedPostCount() { return this._dislikedPostCount; }
get rankName() { return api.rankNames.get(this.rank); }
get avatarContent() { throw 'Invalid operation'; }
get password() { throw 'Invalid operation'; }
set name(value) { this._name = value; }
set rank(value) { this._rank = value; }
set email(value) { this._email = value || null; }
set avatarStyle(value) { this._avatarStyle = value; }
set avatarContent(value) { this._avatarContent = value; }
set password(value) { this._password = value; }
static fromResponse(response) {
const ret = new User();
ret._updateFromResponse(response);
return ret;
}
static get(name) {
return api.get(uri.formatApiLink('user', name))
.then(response => {
return Promise.resolve(User.fromResponse(response));
});
}
save() {
const files = [];
const detail = {version: this._version};
const transient = this._orig._name;
if (this._name !== this._orig._name) {
detail.name = this._name;
}
if (this._email !== this._orig._email) {
detail.email = this._email;
}
if (this._rank !== this._orig._rank) {
detail.rank = this._rank;
}
if (this._avatarStyle !== this._orig._avatarStyle) {
detail.avatarStyle = this._avatarStyle;
}
if (this._avatarContent) {
2016-08-13 11:50:39 +02:00
detail.avatarStyle = this._avatarStyle;
files.avatar = this._avatarContent;
}
if (this._password) {
detail.password = this._password;
}
let promise = this._orig._name ?
api.put(
uri.formatApiLink('user', this._orig._name), detail, files) :
api.post(uri.formatApiLink('users'), detail, files);
return promise
.then(response => {
this._updateFromResponse(response);
this.dispatchEvent(new CustomEvent('change', {
detail: {
user: this,
},
}));
return Promise.resolve();
});
}
delete() {
return api.delete(
uri.formatApiLink('user', this._orig._name),
{version: this._version})
.then(response => {
this.dispatchEvent(new CustomEvent('delete', {
detail: {
user: this,
},
}));
return Promise.resolve();
});
}
_updateFromResponse(response) {
const map = {
_version: response.version,
_name: response.name,
_rank: response.rank,
_email: response.email,
_avatarStyle: response.avatarStyle,
_avatarUrl: response.avatarUrl,
_creationTime: response.creationTime,
_lastLoginTime: response.lastLoginTime,
_commentCount: response.commentCount,
_favoritePostCount: response.favoritePostCount,
_uploadedPostCount: response.uploadedPostCount,
_likedPostCount: response.likedPostCount,
_dislikedPostCount: response.dislikedPostCount,
};
Object.assign(this, map);
Object.assign(this._orig, map);
this._password = null;
this._avatarContent = null;
}
};
module.exports = User;