Initial commit

This commit is contained in:
Jonas L
2019-02-25 00:00:00 +00:00
commit 22c372e246
200 changed files with 27781 additions and 0 deletions
+85
View File
@@ -0,0 +1,85 @@
/*
* server component for the TimeLimit App
* Copyright (C) 2019 Jonas Lochmann
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU Affero General Public License as
* published by the Free Software Foundation, version 3 of the License.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Affero General Public License for more details.
*
* You should have received a copy of the GNU Affero General Public License
* along with this program. If not, see <https://www.gnu.org/licenses/>.
*/
import * as Sequelize from 'sequelize'
import { Database } from '../database'
import { notifyClientsAboutChanges } from '../function/websocket'
import { WebsocketApi } from '../websocket'
export function initDeleteDeprecatedPurchasesWorker ({ database, websocket }: {
database: Database
websocket: WebsocketApi
}) {
function doWorkSafe () {
deleteDeprecatedPurchases({ database, websocket }).catch((ex) => {
console.warn('error deleting deprecated purchases', ex)
})
}
setTimeout(() => {
doWorkSafe()
setInterval(() => {
doWorkSafe()
}, 1000 * 60 * 60 /* every hour */)
}, 1000 * 60 * 5 /* after 5 minutes */)
}
async function deleteDeprecatedPurchases ({ database, websocket }: {
database: Database
websocket: WebsocketApi
}) {
const { affectedFamilyIds } = await database.transaction(async (transaction) => {
const affectedFamilyIds = await database.family.findAll({
where: {
hasFullVersion: true,
fullVersionUntil: {
[Sequelize.Op.lt]: Date.now().toString(10)
}
},
attributes: ['familyId'],
transaction,
lock: Sequelize.Transaction.LOCK.UPDATE,
limit: 100
}).map((item) => item.familyId)
await database.family.update({
hasFullVersion: false
}, {
where: {
familyid: {
[Sequelize.Op.in]: affectedFamilyIds
}
},
transaction
})
return { affectedFamilyIds }
})
for (let i = 0; i < affectedFamilyIds.length; i++) {
const familyId = affectedFamilyIds[i]
await notifyClientsAboutChanges({
familyId,
sourceDeviceId: null,
database,
websocket,
isImportant: true
})
}
}
+70
View File
@@ -0,0 +1,70 @@
/*
* server component for the TimeLimit App
* Copyright (C) 2019 Jonas Lochmann
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU Affero General Public License as
* published by the Free Software Foundation, version 3 of the License.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Affero General Public License for more details.
*
* You should have received a copy of the GNU Affero General Public License
* along with this program. If not, see <https://www.gnu.org/licenses/>.
*/
import * as Sequelize from 'sequelize'
import { Database } from '../database'
export function initDeleteOldTokensWorker ({ database }: {
database: Database
}) {
function doWorkSafe () {
deleteOldTokens({ database }).catch((ex) => {
console.warn('error deleting old tokens', ex)
})
}
setTimeout(() => {
doWorkSafe()
setInterval(() => {
doWorkSafe()
}, 1000 * 60 * 60 /* every hour */)
}, 1000 * 60 * 7 /* after 7 minutes */)
}
async function deleteOldTokens ({ database }: {
database: Database
}) {
await database.transaction(async (transaction) => {
await database.authtoken.destroy({
where: {
createdAt: {
[Sequelize.Op.lt]: (Date.now() - 1000 * 60 * 60 * 3 /* 3 hours */).toString()
}
},
transaction
})
await database.addDeviceToken.destroy({
where: {
createdAt: {
[Sequelize.Op.lt]: (Date.now() - 1000 * 60 * 60 * 3 /* 3 hours */).toString()
}
},
transaction
})
await database.mailLoginToken.destroy({
where: {
createdAt: {
[Sequelize.Op.lt]: (Date.now() - 1000 * 60 * 60 * 3 /* 3 hours */).toString()
}
},
transaction
})
})
}
+94
View File
@@ -0,0 +1,94 @@
/*
* server component for the TimeLimit App
* Copyright (C) 2019 Jonas Lochmann
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU Affero General Public License as
* published by the Free Software Foundation, version 3 of the License.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Affero General Public License for more details.
*
* You should have received a copy of the GNU Affero General Public License
* along with this program. If not, see <https://www.gnu.org/licenses/>.
*/
import { uniqBy } from 'lodash'
import * as Sequelize from 'sequelize'
import { Database } from '../database'
import { generateVersionId } from '../util/token'
export function initDeleteOldUsedTimesWorker ({ database }: {
database: Database
}) {
function doWorkSafe () {
deleteOldUsedTimes({ database }).catch((ex) => {
console.warn('error deleting old used times', ex)
})
}
setTimeout(() => {
doWorkSafe()
setInterval(() => {
doWorkSafe()
}, 1000 * 60 * 30 /* every 30 minutes */)
}, 1000 * 60 * 13 /* after 13 minutes */)
}
async function deleteOldUsedTimes ({ database }: {
database: Database
}) {
const now = Date.now()
await database.transaction(async (transaction) => {
// get matching categories
const categoriesToCleanUp = await database.usedTime.findAll({
transaction,
where: {
lastUpdate: {
[Sequelize.Op.lt]: (now - 1000 * 60 * 60 * 24 * 10 /* 10 days */).toString()
}
},
attributes: [
'familyId',
'categoryId'
],
limit: 100
}).map((item) => ({
familyId: item.familyId,
categoryId: item.categoryId
}))
const distinctCategoriesToCleanUp = uniqBy(categoriesToCleanUp, (item) => item.familyId + '_' + item.categoryId)
if (distinctCategoriesToCleanUp.length > 0) {
// delete old items of matching categories
await database.usedTime.destroy({
transaction,
where: {
[Sequelize.Op.or]: (
distinctCategoriesToCleanUp
),
lastUpdate: {
[Sequelize.Op.lt]: (now - 1000 * 60 * 60 * 24 * 10 /* 10 days */).toString()
}
}
})
// invalidiate categories
await database.category.update({
usedTimesVersion: generateVersionId()
}, {
transaction,
where: {
[Sequelize.Op.or]: (
distinctCategoriesToCleanUp
)
}
})
}
})
}
+31
View File
@@ -0,0 +1,31 @@
/*
* server component for the TimeLimit App
* Copyright (C) 2019 Jonas Lochmann
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU Affero General Public License as
* published by the Free Software Foundation, version 3 of the License.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Affero General Public License for more details.
*
* You should have received a copy of the GNU Affero General Public License
* along with this program. If not, see <https://www.gnu.org/licenses/>.
*/
import { Database } from '../database'
import { WebsocketApi } from '../websocket'
import { initDeleteDeprecatedPurchasesWorker } from './delete-deprecated-purchases'
import { initDeleteOldTokensWorker } from './delete-old-tokens'
import { initDeleteOldUsedTimesWorker } from './delete-old-used-times'
export function initWorkers ({ database, websocket }: {
database: Database
websocket: WebsocketApi
}) {
initDeleteDeprecatedPurchasesWorker({ database, websocket })
initDeleteOldTokensWorker({ database })
initDeleteOldUsedTimesWorker({ database })
}