Skip to content

Commit

Permalink
Merge pull request #1651 from serlo/delete-courses-without-pages
Browse files Browse the repository at this point in the history
feat(db-migrations): Delete courses without pages
  • Loading branch information
hugotiburtino authored Jul 10, 2024
2 parents 42e2f51 + 926f966 commit 460918a
Show file tree
Hide file tree
Showing 3 changed files with 53 additions and 17 deletions.
2 changes: 1 addition & 1 deletion packages/db-migrations/package.json
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
{
"name": "@serlo/db-migrations",
"version": "1.2.0",
"version": "1.2.0-staging.0",
"private": true,
"license": "Apache-2.0",
"type": "module",
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,39 @@
import {
ApiCache,
Database,
SlackLogger,
deleteUuids,
toSqlTuple,
} from './utils'

export async function up(db: Database) {
const apiCache = new ApiCache()
const logger = new SlackLogger(
'20240703115600-remove-courses-without-any-pages',
)

const liveRevisions = await db.runSql<{ id: number; entityId: number }[]>(`
SELECT entity_revision.id, entity.id AS entityId
FROM entity_revision
JOIN entity ON entity.id = repository_id
WHERE content LIKE '%"pages":[]%'
AND entity.current_revision_id = entity_revision.id
`)

const oldRevisions = await db.runSql<{ id: number }[]>(`
SELECT id
FROM entity_revision
WHERE content LIKE '%"pages":[]%'
AND id NOT IN ${toSqlTuple(liveRevisions.map((revision) => revision.id))}
`)

const uuids = liveRevisions.flatMap((revision) => {
return [revision.id, revision.entityId]
})
uuids.concat(oldRevisions.map((revision) => revision.id))

await deleteUuids(db, apiCache, uuids)

await logger.closeAndSend()
await apiCache.deleteKeysAndQuit()
}
29 changes: 13 additions & 16 deletions packages/db-migrations/src/utils/delete-utils.ts
Original file line number Diff line number Diff line change
Expand Up @@ -5,29 +5,26 @@ import { toSqlTuple } from './sql-utils'
export async function deleteUuids(
db: Database,
apiCache: ApiCache,
uuidsToDelete: { id: number }[],
uuidsToDelete: number[],
) {
if (uuidsToDelete.length > 0) {
const uuids = uuidsToDelete.map((uuid) => uuid.id)

const eventLogsToDelete: { id: number }[] = await db.runSql(`
select distinct event_log.id as id
from event_log
left join event_parameter on event_parameter.log_id = event_log.id
left join event_parameter_uuid on event_parameter_uuid.event_parameter_id = event_parameter.id
where
event_log.uuid_id in ${toSqlTuple(uuids)}
or event_parameter_uuid.uuid_id in ${toSqlTuple(uuids)}
const uuids = toSqlTuple(uuidsToDelete)
const eventsToDelete: { id: number }[] = await db.runSql(`
SELECT distinct event.id AS id
FROM event
WHERE
event.uuid_id IN ${uuids}
OR uuid_parameter IN ${uuids}
OR uuid_parameter2 IN ${uuids}
`)

await db.runSql(`DELETE FROM uuid WHERE id IN ${toSqlTuple(uuids)}`)
await db.runSql(`DELETE FROM uuid WHERE id IN ${uuids}`)

for (const id of uuids) {
for (const id of uuidsToDelete) {
apiCache.markUuid(id)
}

// Make sure that events are also deleted from DB and ApiCache
await deleteEventLogs(db, apiCache, eventLogsToDelete)
await deleteEventLogs(db, apiCache, eventsToDelete)
}
}

Expand All @@ -39,7 +36,7 @@ export async function deleteEventLogs(
if (event_logs.length > 0) {
const ids = event_logs.map((event_log) => event_log.id)

await db.runSql(`DELETE FROM event_log WHERE id IN ${toSqlTuple(ids)}`)
await db.runSql(`DELETE FROM event WHERE id IN ${toSqlTuple(ids)}`)

for (const eventId of ids) {
apiCache.markEvent(eventId)
Expand Down

0 comments on commit 460918a

Please sign in to comment.