You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
potato-launcher/src/js/database/apps.js

210 lines
4.9 KiB

import DatabaseHandler from './databaseHandler.js'
import TagsDatabase from './tags.js'
/**
* apps
*
* @author Björn Hase
* @license hhttps://www.gnu.org/licenses/gpl-3.0.en.html GPL-3
* @link https://gitea.node001.net/HerrHase/tellme-bot.git
*
*/
class AppsDatabase extends DatabaseHandler {
constructor() {
super('apps')
// add index for apps to sort by name
this.createIndex([
'name'
], 'name-sort')
// add index for apps to sort by date_started
this.createIndex([
'date_started'
], 'date-started-sort')
}
/**
* create app
*
* @param {object} data
* @return {object}
*
*/
create(data) {
// default for date_started
data.date_started = 0
return this.db.post(data)
.then((response) => {
// if tags are in data update tags also in database
if (data.tags) {
const tagsDatabase = new TagsDatabase()
tagsDatabase.update(data.tags)
}
return this.findOneById(response._id)
}).catch((error) => {
// @TODO handle errors from pouchdb
console.error(error)
})
}
/**
* update app
*
* @param {object} data
* @return {object}
*
*/
update(data) {
return this.db.put(data)
.then((response) => {
return this.findOneById(response._id)
}).catch((error) => {
// @TODO handle errors from pouchdb
console.error(error)
})
}
/**
* remove app
*
* @param {object} document
* @return {object}
*
*/
remove(document) {
return this.db.remove(document)
.then(async (response) => {
// successfull remove document, check for tags that
// not longer used
if (response.ok === true) {
const tagsDatabase = new TagsDatabase()
await tagsDatabase.removeNotNeeded()
}
return response
}).catch((error) => {
// @TODO handle errors from pouchdb
console.error(error)
})
}
/**
* find one app by id
*
* @param {string} id
* @return {mixed}
*
*/
findOneById(id) {
const query = {
'fields': [
'_id',
'_rev',
'name',
'command',
'description',
'thumbnail',
'tags',
'date_started'
],
'selector': {
'_id' : id
}
}
return this.db.find(query).then((documents) => {
if (documents.docs.length === 0) {
return null
} else {
return documents.docs[0]
}
}).catch((error) => {
// @TODO handle errors from pouchdb
console.error(error)
})
}
/**
* find apps
*
* @return {mixed}
*
*/
find(parameters) {
const query = {
'selector': {
},
'fields': [
'_id',
'_rev',
'name',
'command',
'description',
'thumbnail',
'tags',
'date_started'
]
}
// adding sort from parameters
if (parameters.sort) {
query.sort = []
query.sort.push(parameters.sort)
// if sort is date_stared change 'date-started-sort'
if (parameters.sort === 'date_started') {
query.use_index = '_design/date-started-sort'
query.selector = {
'date_started': {
'$exists': true
}
}
// @TODO refactor this, change logic in filter
query.sort = [ {
'date_started': 'desc'
}]
// if sort is name change 'name-sort'
} else {
query.use_index = '_design/name-sort'
query.selector = {
'name': {
'$regex': ''
}
}
}
}
// adding tags from parameters
if (parameters.tags.length > 0) {
query.selector.tags = {
$in: parameters.tags
}
}
return this.db.find(query).then((documents) => {
return documents.docs
}).catch((error) => {
// @TODO handle errors from pouchdb
console.error(error)
})
}
}
export default AppsDatabase