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:
96
server/models/Group.ts
Normal file
96
server/models/Group.ts
Normal file
@@ -0,0 +1,96 @@
|
||||
import { CollectionGroup, GroupUser } from "@server/models";
|
||||
import { Op, DataTypes, sequelize } from "../sequelize";
|
||||
|
||||
const Group = sequelize.define(
|
||||
"group",
|
||||
{
|
||||
id: {
|
||||
type: DataTypes.UUID,
|
||||
defaultValue: DataTypes.UUIDV4,
|
||||
primaryKey: true,
|
||||
},
|
||||
teamId: {
|
||||
type: DataTypes.UUID,
|
||||
defaultValue: DataTypes.UUIDV4,
|
||||
},
|
||||
name: {
|
||||
type: DataTypes.STRING,
|
||||
allowNull: false,
|
||||
},
|
||||
},
|
||||
{
|
||||
timestamps: true,
|
||||
paranoid: true,
|
||||
validate: {
|
||||
isUniqueNameInTeam: async function () {
|
||||
const foundItem = await Group.findOne({
|
||||
where: {
|
||||
teamId: this.teamId,
|
||||
name: {
|
||||
[Op.iLike]: this.name,
|
||||
},
|
||||
id: {
|
||||
[Op.not]: this.id,
|
||||
},
|
||||
},
|
||||
});
|
||||
|
||||
if (foundItem) {
|
||||
throw new Error("The name of this group is already in use");
|
||||
}
|
||||
},
|
||||
},
|
||||
}
|
||||
);
|
||||
|
||||
// @ts-expect-error ts-migrate(7006) FIXME: Parameter 'models' implicitly has an 'any' type.
|
||||
Group.associate = (models) => {
|
||||
Group.hasMany(models.GroupUser, {
|
||||
as: "groupMemberships",
|
||||
foreignKey: "groupId",
|
||||
});
|
||||
Group.hasMany(models.CollectionGroup, {
|
||||
as: "collectionGroupMemberships",
|
||||
foreignKey: "groupId",
|
||||
});
|
||||
Group.belongsTo(models.Team, {
|
||||
as: "team",
|
||||
foreignKey: "teamId",
|
||||
});
|
||||
Group.belongsTo(models.User, {
|
||||
as: "createdBy",
|
||||
foreignKey: "createdById",
|
||||
});
|
||||
Group.belongsToMany(models.User, {
|
||||
as: "users",
|
||||
through: models.GroupUser,
|
||||
foreignKey: "groupId",
|
||||
});
|
||||
Group.addScope("defaultScope", {
|
||||
include: [
|
||||
{
|
||||
association: "groupMemberships",
|
||||
required: false,
|
||||
},
|
||||
],
|
||||
order: [["name", "ASC"]],
|
||||
});
|
||||
};
|
||||
|
||||
// Cascade deletes to group and collection relations
|
||||
// @ts-expect-error ts-migrate(7006) FIXME: Parameter 'group' implicitly has an 'any' type.
|
||||
Group.addHook("afterDestroy", async (group, options) => {
|
||||
if (!group.deletedAt) return;
|
||||
await GroupUser.destroy({
|
||||
where: {
|
||||
groupId: group.id,
|
||||
},
|
||||
});
|
||||
await CollectionGroup.destroy({
|
||||
where: {
|
||||
groupId: group.id,
|
||||
},
|
||||
});
|
||||
});
|
||||
|
||||
export default Group;
|
||||
Reference in New Issue
Block a user