/* 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); } };