chore: Move to Typescript (#2783)

This PR moves the entire project to Typescript. Due to the ~1000 ignores this will lead to a messy codebase for a while, but the churn is worth it – all of those ignore comments are places that were never type-safe previously.

closes #1282
This commit is contained in:
Tom Moor
2021-11-29 06:40:55 -08:00
committed by GitHub
parent 25ccfb5d04
commit 15b1069bcc
1017 changed files with 17410 additions and 54942 deletions

View File

@@ -0,0 +1,206 @@
import Logger from "@server/logging/logger";
import {
ApiKey,
Attachment,
AuthenticationProvider,
Collection,
Document,
Event,
FileOperation,
Group,
Team,
NotificationSetting,
User,
UserAuthentication,
Integration,
IntegrationAuthentication,
SearchQuery,
Share,
} from "@server/models";
import { sequelize } from "../sequelize";
// @ts-expect-error ts-migrate(2749) FIXME: 'Team' refers to a value, but is being used as a t... Remove this comment to see the full error message
export default async function teamPermanentDeleter(team: Team) {
if (!team.deletedAt) {
throw new Error(
`Cannot permanently delete ${team.id} team. Please delete it and try again.`
);
}
Logger.info(
"commands",
`Permanently deleting team ${team.name} (${team.id})`
);
const teamId = team.id;
// @ts-expect-error ts-migrate(7034) FIXME: Variable 'transaction' implicitly has type 'any' i... Remove this comment to see the full error message
let transaction;
try {
transaction = await sequelize.transaction();
await Attachment.findAllInBatches(
{
where: {
teamId,
},
limit: 100,
offset: 0,
},
// @ts-expect-error ts-migrate(7006) FIXME: Parameter 'attachments' implicitly has an 'any' ty... Remove this comment to see the full error message
async (attachments, options) => {
Logger.info(
"commands",
`Deleting attachments ${options.offset} ${
options.offset + options.limit
}`
);
await Promise.all(
// @ts-expect-error ts-migrate(7006) FIXME: Parameter 'attachment' implicitly has an 'any' typ... Remove this comment to see the full error message
attachments.map((attachment) =>
attachment.destroy({
// @ts-expect-error ts-migrate(7005) FIXME: Variable 'transaction' implicitly has an 'any' typ... Remove this comment to see the full error message
transaction,
})
)
);
}
);
// Destroy user-relation models
await User.findAllInBatches(
{
attributes: ["id"],
where: {
teamId,
},
limit: 100,
offset: 0,
},
// @ts-expect-error ts-migrate(7006) FIXME: Parameter 'users' implicitly has an 'any' type.
async (users) => {
// @ts-expect-error ts-migrate(7006) FIXME: Parameter 'user' implicitly has an 'any' type.
const userIds = users.map((user) => user.id);
await UserAuthentication.destroy({
where: {
userId: userIds,
},
force: true,
// @ts-expect-error ts-migrate(7005) FIXME: Variable 'transaction' implicitly has an 'any' typ... Remove this comment to see the full error message
transaction,
});
await ApiKey.destroy({
where: {
userId: userIds,
},
force: true,
// @ts-expect-error ts-migrate(7005) FIXME: Variable 'transaction' implicitly has an 'any' typ... Remove this comment to see the full error message
transaction,
});
}
);
// Destory team-relation models
await AuthenticationProvider.destroy({
where: {
teamId,
},
force: true,
transaction,
});
// events must be first due to db constraints
await Event.destroy({
where: {
teamId,
},
force: true,
transaction,
});
await Collection.destroy({
where: {
teamId,
},
force: true,
transaction,
});
await Document.unscoped().destroy({
where: {
teamId,
},
force: true,
transaction,
});
await FileOperation.destroy({
where: {
teamId,
},
force: true,
transaction,
});
await Group.unscoped().destroy({
where: {
teamId,
},
force: true,
transaction,
});
await Integration.destroy({
where: {
teamId,
},
force: true,
transaction,
});
await IntegrationAuthentication.destroy({
where: {
teamId,
},
force: true,
transaction,
});
await NotificationSetting.destroy({
where: {
teamId,
},
force: true,
transaction,
});
await SearchQuery.destroy({
where: {
teamId,
},
force: true,
transaction,
});
await Share.destroy({
where: {
teamId,
},
force: true,
transaction,
});
await User.destroy({
where: {
teamId,
},
force: true,
transaction,
});
await team.destroy({
force: true,
transaction,
});
await Event.create(
{
name: "teams.destroy",
modelId: teamId,
},
{
transaction,
}
);
await transaction.commit();
} catch (err) {
if (transaction) {
await transaction.rollback();
}
throw err;
}
}