Fix adding time when not using sqlite

This commit is contained in:
Jonas Lochmann
2020-08-31 02:00:00 +02:00
parent a6723430ca
commit 6518159069
3 changed files with 11 additions and 3 deletions
+3 -1
View File
@@ -56,6 +56,7 @@ export interface Database {
user: UserModelStatic user: UserModelStatic
userLimitLoginCategory: UserLimitLoginCategoryModelStatic userLimitLoginCategory: UserLimitLoginCategoryModelStatic
transaction: <T> (autoCallback: (t: Sequelize.Transaction) => Promise<T>) => Promise<T> transaction: <T> (autoCallback: (t: Sequelize.Transaction) => Promise<T>) => Promise<T>
dialect: string
} }
const createDatabase = (sequelize: Sequelize.Sequelize): Database => ({ const createDatabase = (sequelize: Sequelize.Sequelize): Database => ({
@@ -79,7 +80,8 @@ const createDatabase = (sequelize: Sequelize.Sequelize): Database => ({
userLimitLoginCategory: createUserLimitLoginCategoryModel(sequelize), userLimitLoginCategory: createUserLimitLoginCategoryModel(sequelize),
transaction: <T> (autoCallback: (transaction: Sequelize.Transaction) => Promise<T>) => (sequelize.transaction({ transaction: <T> (autoCallback: (transaction: Sequelize.Transaction) => Promise<T>) => (sequelize.transaction({
isolationLevel: Sequelize.Transaction.ISOLATION_LEVELS.READ_COMMITTED isolationLevel: Sequelize.Transaction.ISOLATION_LEVELS.READ_COMMITTED
}, autoCallback) as any) as Promise<T> }, autoCallback) as any) as Promise<T>,
dialect: sequelize.getDialect()
}) })
export const sequelize = new Sequelize.Sequelize(process.env.DATABASE_URL || 'sqlite://test.db', { export const sequelize = new Sequelize.Sequelize(process.env.DATABASE_URL || 'sqlite://test.db', {
@@ -64,9 +64,12 @@ export async function dispatchAddUsedTime ({ deviceId, action, cache }: {
currentExtraTime: number currentExtraTime: number
}) => { }) => {
if (action.timeToAdd !== 0) { if (action.timeToAdd !== 0) {
const maxOperator = cache.database.dialect === 'sqlite' ? 'MAX' : 'GREATEST'
const minOperator = cache.database.dialect === 'sqlite' ? 'MIN' : 'LEAST'
// try to update first // try to update first
const [updatedRows] = await cache.database.usedTime.update({ const [updatedRows] = await cache.database.usedTime.update({
usedTime: Sequelize.literal(`MAX(0, MIN(usedTime + ${action.timeToAdd}, ${dayLengthInMs}))`) as any, usedTime: Sequelize.literal(`${maxOperator}(0, ${minOperator}(usedTime + ${action.timeToAdd}, ${dayLengthInMs}))`) as any,
lastUpdate: roundedTimestamp lastUpdate: roundedTimestamp
}, { }, {
where: { where: {
@@ -67,9 +67,12 @@ export async function dispatchAddUsedTimeVersion2 ({ deviceId, action, cache }:
const lengthInMinutes = (end - start) + 1 const lengthInMinutes = (end - start) + 1
const lengthInMs = lengthInMinutes * 1000 * 60 const lengthInMs = lengthInMinutes * 1000 * 60
const maxOperator = cache.database.dialect === 'sqlite' ? 'MAX' : 'GREATEST'
const minOperator = cache.database.dialect === 'sqlite' ? 'MIN' : 'LEAST'
// try to update first // try to update first
const [updatedRows] = await cache.database.usedTime.update({ const [updatedRows] = await cache.database.usedTime.update({
usedTime: Sequelize.literal(`MAX(0, MIN(usedTime + ${item.timeToAdd}, ${lengthInMs}))`) as any, usedTime: Sequelize.literal(`${maxOperator}(0, ${minOperator}(usedTime + ${item.timeToAdd}, ${lengthInMs}))`) as any,
lastUpdate: roundedTimestampForUsedTime lastUpdate: roundedTimestampForUsedTime
}, { }, {
where: { where: {