173 lines
4.3 KiB
JavaScript
173 lines
4.3 KiB
JavaScript
/* jslint node: true */
|
|
'use strict';
|
|
|
|
const UserProps = require('./user_property.js');
|
|
|
|
// deps
|
|
const _ = require('lodash');
|
|
const { v4: UUIDv4 } = require('uuid');
|
|
|
|
module.exports = class FileBaseFilters {
|
|
constructor(client) {
|
|
this.client = client;
|
|
|
|
this.load();
|
|
}
|
|
|
|
static get OrderByValues() {
|
|
return ['descending', 'ascending'];
|
|
}
|
|
|
|
static get SortByValues() {
|
|
return [
|
|
'upload_timestamp',
|
|
'upload_by_username',
|
|
'dl_count',
|
|
'user_rating',
|
|
'est_release_year',
|
|
'byte_size',
|
|
'file_name',
|
|
];
|
|
}
|
|
|
|
toArray() {
|
|
return _.map(this.filters, (filter, uuid) => {
|
|
return Object.assign({ uuid: uuid }, filter);
|
|
});
|
|
}
|
|
|
|
get(filterUuid) {
|
|
return this.filters[filterUuid];
|
|
}
|
|
|
|
add(filterInfo) {
|
|
const filterUuid = UUIDv4();
|
|
|
|
filterInfo.tags = this.cleanTags(filterInfo.tags);
|
|
|
|
this.filters[filterUuid] = filterInfo;
|
|
|
|
return filterUuid;
|
|
}
|
|
|
|
replace(filterUuid, filterInfo) {
|
|
const filter = this.get(filterUuid);
|
|
if (!filter) {
|
|
return false;
|
|
}
|
|
|
|
filterInfo.tags = this.cleanTags(filterInfo.tags);
|
|
this.filters[filterUuid] = filterInfo;
|
|
return true;
|
|
}
|
|
|
|
remove(filterUuid) {
|
|
delete this.filters[filterUuid];
|
|
}
|
|
|
|
load() {
|
|
let filtersProperty = this.client.user.properties[UserProps.FileBaseFilters];
|
|
let defaulted;
|
|
if (!filtersProperty) {
|
|
filtersProperty = JSON.stringify(FileBaseFilters.getBuiltInSystemFilters());
|
|
defaulted = true;
|
|
}
|
|
|
|
try {
|
|
this.filters = JSON.parse(filtersProperty);
|
|
} catch (e) {
|
|
this.filters = FileBaseFilters.getBuiltInSystemFilters(); // something bad happened; reset everything back to defaults :(
|
|
defaulted = true;
|
|
this.client.log.error(
|
|
{ error: e.message, property: filtersProperty },
|
|
'Failed parsing file base filters property'
|
|
);
|
|
}
|
|
|
|
if (defaulted) {
|
|
this.persist(err => {
|
|
if (!err) {
|
|
const defaultActiveUuid = this.toArray()[0].uuid;
|
|
this.setActive(defaultActiveUuid);
|
|
}
|
|
});
|
|
}
|
|
}
|
|
|
|
persist(cb) {
|
|
return this.client.user.persistProperty(
|
|
UserProps.FileBaseFilters,
|
|
JSON.stringify(this.filters),
|
|
cb
|
|
);
|
|
}
|
|
|
|
cleanTags(tags) {
|
|
return tags
|
|
.toLowerCase()
|
|
.replace(/,?\s+|,/g, ' ')
|
|
.trim();
|
|
}
|
|
|
|
setActive(filterUuid) {
|
|
const activeFilter = this.get(filterUuid);
|
|
|
|
if (activeFilter) {
|
|
this.activeFilter = activeFilter;
|
|
this.client.user.persistProperty(
|
|
UserProps.FileBaseFilterActiveUuid,
|
|
filterUuid
|
|
);
|
|
return true;
|
|
}
|
|
|
|
return false;
|
|
}
|
|
|
|
static getBuiltInSystemFilters() {
|
|
const U_LATEST = '7458b09d-40ab-4f9b-a0d7-0cf866646329';
|
|
|
|
const filters = {
|
|
[U_LATEST]: {
|
|
name: 'By Date Added',
|
|
areaTag: '', // all
|
|
terms: '', // *
|
|
tags: '', // *
|
|
order: 'descending',
|
|
sort: 'upload_timestamp',
|
|
uuid: U_LATEST,
|
|
system: true,
|
|
},
|
|
};
|
|
|
|
return filters;
|
|
}
|
|
|
|
static getActiveFilter(client) {
|
|
return new FileBaseFilters(client).get(
|
|
client.user.properties[UserProps.FileBaseFilterActiveUuid]
|
|
);
|
|
}
|
|
|
|
static getFileBaseLastViewedFileIdByUser(user) {
|
|
return parseInt(user.properties[UserProps.FileBaseLastViewedId] || 0);
|
|
}
|
|
|
|
static setFileBaseLastViewedFileIdForUser(user, fileId, allowOlder, cb) {
|
|
if (!cb && _.isFunction(allowOlder)) {
|
|
cb = allowOlder;
|
|
allowOlder = false;
|
|
}
|
|
|
|
const current = FileBaseFilters.getFileBaseLastViewedFileIdByUser(user);
|
|
if (!allowOlder && fileId < current) {
|
|
if (cb) {
|
|
cb(null);
|
|
}
|
|
return;
|
|
}
|
|
|
|
return user.persistProperty(UserProps.FileBaseLastViewedId, fileId, cb);
|
|
}
|
|
};
|