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

193 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({});
}
2020-06-04 18:09:35 +00:00
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 09:50:39 +00: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(
2020-06-04 18:09:35 +00:00
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 = {
2020-06-04 18:09:35 +00:00
_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,
2020-06-04 18:09:35 +00:00
_likedPostCount: response.likedPostCount,
_dislikedPostCount: response.dislikedPostCount,
};
Object.assign(this, map);
Object.assign(this._orig, map);
2020-06-04 18:09:35 +00:00
this._password = null;
this._avatarContent = null;
}
2020-06-04 18:09:35 +00:00
}
module.exports = User;