158 lines
4.1 KiB
JavaScript
158 lines
4.1 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);
|
|
}
|
|
};
|