Skip to content
Merged
Original file line number Diff line number Diff line change
@@ -0,0 +1,96 @@
import { DataType } from "sequelize-typescript";

import { Migration } from "../umzug";
import {
CommunityPositionTitles,
Department,
DesignPositionTitles,
EngineeringPositionTitles,
PositionTitles,
ProductPositionTitles,
} from "../types";

const ADMIN_TABLE_NAME = "admins";
const POSITION_TABLE_NAME = "positions";
const USER_TABLE_NAME = "users";

const ADMIN_SEEDED_DATA = [
{
userId: "1",
authorizedDepartments: [Department.Engineering, Department.Product],
},
{
userId: "2",
authorizedDepartments: [Department.Design, Department.Community],
},
];
const POSITION_SEEDED_DATA = [
...EngineeringPositionTitles.map((title) => ({
title,
department: Department.Engineering,
})),
...DesignPositionTitles.map((title) => ({
title,
department: Department.Design,
})),
...ProductPositionTitles.map((title) => ({
title,
department: Department.Product,
})),
...CommunityPositionTitles.map((title) => ({
title,
department: Department.Community,
})),
];

export const up: Migration = async ({ context: sequelize }) => {
await sequelize.getQueryInterface().createTable(POSITION_TABLE_NAME, {
title: {
type: DataType.ENUM(...PositionTitles),
allowNull: false,
primaryKey: true,
},
department: {
type: DataType.ENUM(...Object.values(Department)),
allowNull: false,
},
});
await sequelize
.getQueryInterface()
.bulkInsert(POSITION_TABLE_NAME, POSITION_SEEDED_DATA);

await sequelize.getQueryInterface().addColumn(USER_TABLE_NAME, "position", {
type: "enum_positions_title",
references: {
model: POSITION_TABLE_NAME,
key: "title",
},
});

await sequelize.getQueryInterface().createTable(ADMIN_TABLE_NAME, {
userId: {
type: DataType.INTEGER,
allowNull: false,
primaryKey: true,
references: {
model: USER_TABLE_NAME,
key: "id",
},
},
authorizedDepartments: {
type: DataType.ARRAY(DataType.STRING),
allowNull: false,
},
});
await sequelize
.getQueryInterface()
.bulkInsert(ADMIN_TABLE_NAME, ADMIN_SEEDED_DATA);
};

export const down: Migration = async ({ context: sequelize }) => {
await sequelize.getQueryInterface().removeColumn(USER_TABLE_NAME, "position");
await sequelize.getQueryInterface().dropTable(ADMIN_TABLE_NAME);
await sequelize.getQueryInterface().dropTable(POSITION_TABLE_NAME);
await sequelize.query('DROP TYPE IF EXISTS "enum_positions_title";');
await sequelize.query('DROP TYPE IF EXISTS "enum_positions_department";');
};
19 changes: 19 additions & 0 deletions backend/typescript/models/admin.model.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
import {
Column,

Check warning on line 2 in backend/typescript/models/admin.model.ts

View workflow job for this annotation

GitHub Actions / run-lint

'Column' is defined but never used
DataType,

Check warning on line 3 in backend/typescript/models/admin.model.ts

View workflow job for this annotation

GitHub Actions / run-lint

'DataType' is defined but never used
ForeignKey,

Check warning on line 4 in backend/typescript/models/admin.model.ts

View workflow job for this annotation

GitHub Actions / run-lint

'ForeignKey' is defined but never used
Model,
Table,

Check warning on line 6 in backend/typescript/models/admin.model.ts

View workflow job for this annotation

GitHub Actions / run-lint

'Table' is defined but never used
} from "sequelize-typescript";
import User from "./user.model";

Check warning on line 8 in backend/typescript/models/admin.model.ts

View workflow job for this annotation

GitHub Actions / run-lint

'User' is defined but never used
import { Department } from "../types";

@Table({ tableName: "admins" })
export default class Admin extends Model {

Check warning on line 12 in backend/typescript/models/admin.model.ts

View workflow job for this annotation

GitHub Actions / run-lint

'Admin' is defined but never used
@ForeignKey(() => User)
@Column({ type: DataType.INTEGER, primaryKey: true })
userId!: number;

@Column({ type: DataType.ARRAY(DataType.ENUM(...Object.values(Department))) })
authorizedDepartments!: Department[];
}
11 changes: 11 additions & 0 deletions backend/typescript/models/position.model.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
import { Column, DataType, Model, Table } from "sequelize-typescript";
import { Department, PositionTitle, PositionTitles } from "../types";

@Table({ tableName: "positions" })
export default class Position extends Model {
@Column({ type: DataType.ENUM(...PositionTitles), primaryKey: true })
title!: PositionTitle;

@Column({ type: DataType.ENUM(...Object.values(Department)) })
department!: Department;
}
16 changes: 14 additions & 2 deletions backend/typescript/models/user.model.ts
Original file line number Diff line number Diff line change
@@ -1,8 +1,16 @@
/* eslint import/no-cycle: 0 */

import { Column, DataType, HasMany, Model, Table } from "sequelize-typescript";
import { Role } from "../types";
import {
Column,
DataType,
ForeignKey,
HasMany,
Model,
Table,
} from "sequelize-typescript";
import { PositionTitle, PositionTitles, Role } from "../types";
import ApplicationDashboardTable from "./applicationDashboard.model";
import Position from "./position.model";

@Table({ tableName: "users" })
export default class User extends Model {
Expand All @@ -24,6 +32,10 @@ export default class User extends Model {
@Column({ type: DataType.ENUM("User", "Admin") })
role!: Role;

@ForeignKey(() => Position)
@Column({ type: DataType.ENUM(...Object.values(PositionTitles)) })
position?: PositionTitle;

@HasMany(() => ApplicationDashboardTable)
applicationDashboards?: ApplicationDashboardTable[];
}
41 changes: 41 additions & 0 deletions backend/typescript/types.ts
Original file line number Diff line number Diff line change
Expand Up @@ -125,3 +125,44 @@ export enum ApplicantRole {
uxr = "user researcher", // design tab
dev = "project developer", // eng tab
}

export enum Department {
Engineering = "Engineering",
Design = "Design",
Product = "Product",
Community = "Community",
}

export const EngineeringPositionTitles = [
"Project Lead",
"Developer",
"VP Engineering",
] as const;
export const DesignPositionTitles = ["Designer", "VP Design"] as const;
export const ProductPositionTitles = ["Product Manager", "VP Product"] as const;
export const CommunityPositionTitles = [
"President",
"VP Scoping",
"VP Talent",
"VP Finance",
"Director Lead",
"Internal Director",
"External Director",
"Content Strategist",
"Graphic Designer",
] as const;

export const PositionTitles = [
...EngineeringPositionTitles,
...DesignPositionTitles,
...ProductPositionTitles,
...CommunityPositionTitles,
] as const;

// Union types
export type EngineeringPositionTitle =
(typeof EngineeringPositionTitles)[number];
export type DesignPositionTitle = (typeof DesignPositionTitles)[number];
export type ProductPositionTitle = (typeof ProductPositionTitles)[number];
export type CommunityPositionTitle = (typeof CommunityPositionTitles)[number];
export type PositionTitle = (typeof PositionTitles)[number];
Loading