You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
154 lines
4.5 KiB
JavaScript
154 lines
4.5 KiB
JavaScript
// Copyright (C) 2020 Intel Corporation
|
|
//
|
|
// SPDX-License-Identifier: MIT
|
|
|
|
const User = require('./user');
|
|
const { ArgumentError } = require('./exceptions');
|
|
const { negativeIDGenerator } = require('./common');
|
|
|
|
/**
|
|
* Class representing a single comment
|
|
* @memberof module:API.cvat.classes
|
|
* @hideconstructor
|
|
*/
|
|
class Comment {
|
|
constructor(initialData) {
|
|
const data = {
|
|
id: undefined,
|
|
message: undefined,
|
|
created_date: undefined,
|
|
updated_date: undefined,
|
|
removed: false,
|
|
author: undefined,
|
|
};
|
|
|
|
for (const property in data) {
|
|
if (Object.prototype.hasOwnProperty.call(data, property) && property in initialData) {
|
|
data[property] = initialData[property];
|
|
}
|
|
}
|
|
|
|
if (data.author && !(data.author instanceof User)) data.author = new User(data.author);
|
|
|
|
if (typeof id === 'undefined') {
|
|
data.id = negativeIDGenerator();
|
|
}
|
|
if (typeof data.created_date === 'undefined') {
|
|
data.created_date = new Date().toISOString();
|
|
}
|
|
|
|
Object.defineProperties(
|
|
this,
|
|
Object.freeze({
|
|
/**
|
|
* @name id
|
|
* @type {integer}
|
|
* @memberof module:API.cvat.classes.Comment
|
|
* @readonly
|
|
* @instance
|
|
*/
|
|
id: {
|
|
get: () => data.id,
|
|
},
|
|
/**
|
|
* @name message
|
|
* @type {string}
|
|
* @memberof module:API.cvat.classes.Comment
|
|
* @instance
|
|
* @throws {module:API.cvat.exceptions.ArgumentError}
|
|
*/
|
|
message: {
|
|
get: () => data.message,
|
|
set: (value) => {
|
|
if (!value.trim().length) {
|
|
throw new ArgumentError('Value must not be empty');
|
|
}
|
|
data.message = value;
|
|
},
|
|
},
|
|
/**
|
|
* @name createdDate
|
|
* @type {string}
|
|
* @memberof module:API.cvat.classes.Comment
|
|
* @readonly
|
|
* @instance
|
|
*/
|
|
createdDate: {
|
|
get: () => data.created_date,
|
|
},
|
|
/**
|
|
* @name updatedDate
|
|
* @type {string}
|
|
* @memberof module:API.cvat.classes.Comment
|
|
* @readonly
|
|
* @instance
|
|
*/
|
|
updatedDate: {
|
|
get: () => data.updated_date,
|
|
},
|
|
/**
|
|
* Instance of a user who has created the comment
|
|
* @name author
|
|
* @type {module:API.cvat.classes.User}
|
|
* @memberof module:API.cvat.classes.Comment
|
|
* @readonly
|
|
* @instance
|
|
*/
|
|
author: {
|
|
get: () => data.author,
|
|
},
|
|
/**
|
|
* @name removed
|
|
* @type {boolean}
|
|
* @memberof module:API.cvat.classes.Comment
|
|
* @instance
|
|
*/
|
|
removed: {
|
|
get: () => data.removed,
|
|
set: (value) => {
|
|
if (typeof value !== 'boolean') {
|
|
throw new ArgumentError('Value must be a boolean value');
|
|
}
|
|
data.removed = value;
|
|
},
|
|
},
|
|
__internal: {
|
|
get: () => data,
|
|
},
|
|
}),
|
|
);
|
|
}
|
|
|
|
serialize() {
|
|
const data = {
|
|
message: this.message,
|
|
};
|
|
|
|
if (this.id > 0) {
|
|
data.id = this.id;
|
|
}
|
|
if (this.createdDate) {
|
|
data.created_date = this.createdDate;
|
|
}
|
|
if (this.updatedDate) {
|
|
data.updated_date = this.updatedDate;
|
|
}
|
|
if (this.author) {
|
|
data.author = this.author.serialize();
|
|
}
|
|
|
|
return data;
|
|
}
|
|
|
|
toJSON() {
|
|
const data = this.serialize();
|
|
const { author, ...updated } = data;
|
|
return {
|
|
...updated,
|
|
author_id: author ? author.id : undefined,
|
|
};
|
|
}
|
|
}
|
|
|
|
module.exports = Comment;
|