Add tool to delete old families

This commit is contained in:
Jonas Lochmann 2019-10-14 00:00:00 +00:00
parent 196afe8ed1
commit e6bc3c9a75
No known key found for this signature in database
GPG key ID: 8B8C9AEE10FA5B36
6 changed files with 304 additions and 0 deletions

View file

@ -11,6 +11,9 @@
"build": "npm run build:json && npm run build:ts && npm run lint",
"build:json": "node ./scripts/build-schemas.js",
"build:ts": "tsc",
"tool:find-old-families": "node build/cli/find-old-families.js",
"tool:delete-old-families": "node build/cli/delete-old-families.js",
"tool:count-families": "node build/cli/count-families.js",
"watch": "nodemon ./build/index.js"
},
"repository": {

27
src/cli/count-families.ts Normal file
View file

@ -0,0 +1,27 @@
/*
* 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 { defaultDatabase } from '../database'
const database = defaultDatabase
database.family.count()
.then((res) => console.log(JSON.stringify(res)))
.catch((ex) => {
console.warn(ex)
process.exit(1)
})

View file

@ -0,0 +1,28 @@
/*
* 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 { defaultDatabase } from '../database'
import { deleteOldFamilies } from '../function/cleanup/delete-old-families'
const database = defaultDatabase
deleteOldFamilies(database)
.then(() => console.log('done'))
.catch((ex) => {
console.warn(ex)
process.exit(1)
})

View file

@ -0,0 +1,28 @@
/*
* 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 { defaultDatabase } from '../database'
import { findOldFamilyIds } from '../function/cleanup/delete-old-families'
const database = defaultDatabase
findOldFamilyIds(database)
.then((res) => console.log(JSON.stringify(res)))
.catch((ex) => {
console.warn(ex)
process.exit(1)
})

View file

@ -0,0 +1,149 @@
/*
* 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 async function deleteFamilies ({ database, familiyIds }: {
database: Database
familiyIds: Array<string>
}) {
if (familiyIds.length === 0) {
return
}
await database.transaction(async (transaction) => {
// app
await database.app.destroy({
where: {
familyId: {
[Sequelize.Op.in]: familiyIds
}
},
transaction
})
// app activity
await database.appActivity.destroy({
where: {
familyId: {
[Sequelize.Op.in]: familiyIds
}
},
transaction
})
// category
await database.category.destroy({
where: {
familyId: {
[Sequelize.Op.in]: familiyIds
}
},
transaction
})
// categoryapp
await database.categoryApp.destroy({
where: {
familyId: {
[Sequelize.Op.in]: familiyIds
}
},
transaction
})
// purchase
await database.purchase.destroy({
where: {
familyId: {
[Sequelize.Op.in]: familiyIds
}
},
transaction
})
// timelimitrule
await database.timelimitRule.destroy({
where: {
familyId: {
[Sequelize.Op.in]: familiyIds
}
},
transaction
})
// usedtime
await database.usedTime.destroy({
where: {
familyId: {
[Sequelize.Op.in]: familiyIds
}
},
transaction
})
// user
await database.user.destroy({
where: {
familyId: {
[Sequelize.Op.in]: familiyIds
}
},
transaction
})
// device
const oldDeviceAuthTokens = await database.device.findAll({
where: {
familyId: {
[Sequelize.Op.in]: familiyIds
}
},
attributes: ['deviceAuthToken'],
transaction
}).map((item) => item.deviceAuthToken)
await database.device.destroy({
where: {
familyId: {
[Sequelize.Op.in]: familiyIds
}
},
transaction
})
// olddevice
if (oldDeviceAuthTokens.length > 0) {
await database.oldDevice.bulkCreate(
oldDeviceAuthTokens.map((item) => ({
deviceAuthToken: item
}))
)
}
// family
await database.family.destroy({
where: {
familyId: {
[Sequelize.Op.in]: familiyIds
}
},
transaction
})
})
}

View file

@ -0,0 +1,69 @@
/*
* 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 { difference } from 'lodash'
import * as Sequelize from 'sequelize'
import { Database } from '../../database'
import { deleteFamilies } from './delete-families'
export async function deleteOldFamilies (database: Database) {
console.log('deleteOldFamilies()')
const oldFamilyIds = await findOldFamilyIds(database)
console.log('oldFamilyIds: ' + JSON.stringify(oldFamilyIds))
if (oldFamilyIds.length > 0) {
const familyIdsToDelete = oldFamilyIds.slice(0, 16) /* limit to 16 families per execution */
console.log('familyIdsToDelete: ' + JSON.stringify(familyIdsToDelete))
await deleteFamilies({
database,
familiyIds: familyIdsToDelete
})
}
}
export async function findOldFamilyIds (database: Database) {
const familyIdsWithExpiredLicenses = await database.family.findAll({
where: {
fullVersionUntil: {
[Sequelize.Op.lt]: (Date.now() - 1000 * 60 * 60 * 24 * 90 /* 90 days */).toString(10)
}
},
attributes: ['familyId']
}).map((item) => item.familyId)
if (familyIdsWithExpiredLicenses.length === 0) {
return []
}
const recentlyUsedFamilyIds = await database.device.findAll({
where: {
familyId: {
[Sequelize.Op.in]: familyIdsWithExpiredLicenses
},
lastConnectivity: {
[Sequelize.Op.lt]: (Date.now() - 1000 * 60 * 60 * 24 * 90 /* 90 days */).toString(10)
}
},
attributes: ['familyId']
}).map((item) => item.familyId)
return difference(familyIdsWithExpiredLicenses, recentlyUsedFamilyIds)
}