micro365/database-calls/db.mjs

101 lines
2.4 KiB
JavaScript
Raw Normal View History

2023-08-06 18:36:24 +00:00
import Knex from 'knex'
2023-08-12 10:05:24 +00:00
import logger from '../logger.mjs'
2023-08-12 10:41:36 +00:00
import { isoDate } from "../utilities.mjs"
2023-08-12 16:41:50 +00:00
import config from "../config.mjs"
2023-08-06 18:36:24 +00:00
export const db = Knex({
2023-08-12 10:41:36 +00:00
client: 'sqlite3', // or 'better-sqlite3'
connection: {
filename: "data/database"
},
useNullAsDefault: true
})
2023-08-12 16:41:50 +00:00
const blocklist = db.union([
db('bad_words').select('word'),
db('medical_dictionary').select('word'),
db('published').select('word')
])
export const getAcceptablePrompts = async (word) => {
logger.trace("getAcceptablePrompt called")
try {
return db('dictionary')
.select('*')
.where({
derivative: 0,
scientific: 0,
})
.modify(queryBuilder=>{
if(word){queryBuilder.andWhere('word',word)}
})
.andWhere('count', '<', config.maxCount)
.andWhere('count', '>', config.minCount)
.andWhere('word', 'not in', blocklist)
.whereRaw('length(word) > 3')
.whereNotNull('pronunciation')
.orderByRaw('count desc')
} catch (error) {
logger.error("getAcceptablePrompts failed!")
throw error
}
}
2023-08-06 18:36:24 +00:00
2023-08-12 10:41:36 +00:00
export const getWords = async () => {
2023-08-12 13:01:06 +00:00
logger.trace("getWords called")
2023-08-12 10:41:36 +00:00
return db
2023-08-06 18:36:24 +00:00
.select("word")
.from("dictionary")
2023-08-12 14:55:25 +00:00
.catch(error => { throw error })
2023-08-06 18:36:24 +00:00
}
2023-08-12 16:41:50 +00:00
export const valueExistsInColumn = async (table, column, value) => {
2023-08-12 14:55:25 +00:00
try {
const number = await db(table)
.count('* as count')
.where(column, value)
2023-08-12 16:41:50 +00:00
return number[0].count > 0
2023-08-12 14:55:25 +00:00
} catch (error) {
2023-08-12 16:41:50 +00:00
logger.error("valueExistsInColumn failed!")
2023-08-12 14:55:25 +00:00
throw error
}
2023-08-12 16:41:50 +00:00
2023-08-12 10:41:36 +00:00
}
export const todaysPromptAlreadyPublished = async () => {
2023-08-12 16:41:50 +00:00
return valueExistsInColumn('published', 'date', isoDate())
2023-08-12 10:41:36 +00:00
}
export const wordIsAlreadyInBuffer = async (word) => {
2023-08-12 16:41:50 +00:00
return valueExistsInColumn('buffer', 'word', word)
}
export const tableIsNotEmpty = async (table) => {
try {
const number = await db(table)
.count('* as count')
return number[0].count > 0
} catch (error) {
throw error
}
}
export const getPromptFromBuffer = async () => {
logger.trace("getting prompt from buffer")
const oldestWordInBuffer = await db('buffer').select('word').orderBy('timestamp', 'asc').limit(1)
logger.info(`oldest word in buffer: ${oldestWordInBuffer[0].word}`)
try {
const prompt = await getAcceptablePrompts(oldestWordInBuffer[0].word)
return prompt[0]
} catch (error) {
logger.error("getPromptFromBuffer failed!")
throw error
}
}